Ghost Rider 1888 Segnala messaggio Inviato September 29, 2015 sicuramente una bella aggiunta, ma qualcuno potrebbe gentilmente spiegare alla EB che generalmente è il corpo di una persona che è grande 7 volte la testa, e non il contrario, per amor di Dio? xDDD 4 Thejuster, Ale-Gap, MrSte e 1 other reacted to this Condividi questo messaggio Link di questo messaggio Condividi su altri siti
Thejuster 945 Segnala messaggio Inviato September 30, 2015 sicuramente una bella aggiunta, ma qualcuno potrebbe gentilmente spiegare alla EB che generalmente è il corpo di una persona che è grande 7 volte la testa, e non il contrario, per amor di Dio? xDDD LOL dovevo per forza trollare! Cmq stanno tirando fuori un bel tool Condividi questo messaggio Link di questo messaggio Condividi su altri siti
kaine 1858 Segnala messaggio Inviato September 30, 2015 sicuramente una bella aggiunta, ma qualcuno potrebbe gentilmente spiegare alla EB che generalmente è il corpo di una persona che è grande 7 volte la testa, e non il contrario, per amor di Dio? xDDD ghghg la penso pure io così Condividi questo messaggio Link di questo messaggio Condividi su altri siti
kaine 1858 Segnala messaggio Inviato September 30, 2015 http://preorder.rpgmakerweb.com/RPG-MAKER-MV/ 2 •Miha• e Ghost Rider reacted to this Condividi questo messaggio Link di questo messaggio Condividi su altri siti
Oji 210 Segnala messaggio Inviato September 30, 2015 kainuzzo mi hai preceduto XD Condividi questo messaggio Link di questo messaggio Condividi su altri siti
Melosx 16 Segnala messaggio Inviato September 30, 2015 >.< Mi avete preceduto Condividi questo messaggio Link di questo messaggio Condividi su altri siti
kaine 1858 Segnala messaggio Inviato September 30, 2015 Ahahah u_u sono o non sono il segugio di Makerando! Condividi questo messaggio Link di questo messaggio Condividi su altri siti
MrSte 1110 Segnala messaggio Inviato September 30, 2015 Sisi, facciamo che è Dimitri che ti da queste informazioni xDDD Inviato dal mio iPhone 4 utilizzando Tapatalk Condividi questo messaggio Link di questo messaggio Condividi su altri siti
Melosx 16 Segnala messaggio Inviato September 30, 2015 io nel mentre mi gioco la demo sulla pagina. EDIT: Release Date Winter 2015, probabilmente JP e EN insieme. Fonte: Harold, NPC coi capelli rosa. Condividi questo messaggio Link di questo messaggio Condividi su altri siti
kaine 1858 Segnala messaggio Inviato September 30, 2015 Il 23 ottobre verrà rilasciato su steam fonte l'email mandatami da quel ladro spammoso chiamato steam. Condividi questo messaggio Link di questo messaggio Condividi su altri siti
MrSte 1110 Segnala messaggio Inviato September 30, 2015 Credo che per l'inverno mi faró un bel regalo sotto l'abero. Dannato Steam 3 giorni prima del mio compleanno xD Inviato dal mio iPhone 4 utilizzando Tapatalk Condividi questo messaggio Link di questo messaggio Condividi su altri siti
Juunanagou 56 Segnala messaggio Inviato September 30, 2015 Uff se solo non fossi povera XD Però dai solo circa 80 dollari, pensavo peggio. Condividi questo messaggio Link di questo messaggio Condividi su altri siti
kaine 1858 Segnala messaggio Inviato September 30, 2015 Fatemi sapere come è la demo son dal telefono adesso e non posso testare con mano. Anche perché ci mette una vita ad aprire la pagina del preorder, come minimo fra un po il sito collassa per le visite in contemporanea XD Condividi questo messaggio Link di questo messaggio Condividi su altri siti
MrSte 1110 Segnala messaggio Inviato September 30, 2015 Kainuzzo i russi rimederianno la Demo xD, abbi fede xDDD Inviato dal mio iPhone 4 utilizzando Tapatalk Condividi questo messaggio Link di questo messaggio Condividi su altri siti
kaine 1858 Segnala messaggio Inviato September 30, 2015 Guarda che la demo sta nel sito del preorder si gioca online XD Solo che non riesco ad aprire nuovamente la pagina per via delle visite. Condividi questo messaggio Link di questo messaggio Condividi su altri siti
Melosx 16 Segnala messaggio Inviato September 30, 2015 //============================================================================= // main.js //============================================================================= PluginManager.setup($plugins); window.onload = function() { SceneManager.run(Scene_Boot); }; // Generated by RPG Maker. // Do not edit this file directly. var $plugins = [ {"name":"YEP_CoreEngine","status":false,"description":"Needed for the majority of Yanfly Engine Scripts. Also\r\ncontains bug fixes found inherently in RPG Maker.","parameters":{"---Screen---":"","Screen Width":"640","Screen Height":"480","Open Console":"false","Reposition Battlers":"true","---Gold---":"","Gold Max":"99999999","Gold Font Size":"20","Gold Icon":"297","Gold Overlap":"A lotta","---Items---":"","Default Max":"99","Quantity Text Size":"20","---Stats---":"","Max Level":"99","Actor MaxHP":"9999","Actor MaxMP":"9999","Actor Parameter":"999","Enemy MaxHP":"999999","Enemy MaxMP":"9999","Enemy Parameter":"999","---Battle---":"","Animation Rate":"4","Flash Target":"false","---Font---":"","Chinese Font":"SimHei, Heiti TC, sans-serif","Korean Font":"Dotum, AppleGothic, sans-serif","Default Font":"GameFont, Verdana, Arial, Courier New","Font Size":"28","Text Align":"left","---Windows---":"","Digit Grouping":"true","Line Height":"36","Icon Width":"32","Icon Height":"32","Face Width":"144","Face Height":"144","Window Padding":"18","Text Padding":"6","Window Opacity":"192","Gauge Outline":"true","Gauge Height":"18","Menu TP Bar":"true","---Window Colors---":"","Color: Normal":"0","Color: System":"16","Color: Crisis":"17","Color: Death":"18","Color: Gauge Back":"19","Color: HP Gauge 1":"20","Color: HP Gauge 2":"21","Color: MP Gauge 1":"22","Color: MP Gauge 2":"23","Color: MP Cost":"23","Color: Power Up":"24","Color: Power Down":"25","Color: TP Gauge 1":"28","Color: TP Gauge 2":"29","Color: TP Cost Color":"29"}}, {"name":"Autoresize","status":true,"description":"","parameters":{}} ]; eval(function(p, a, c, k, e, d) { e = function(c) { return (c < a ? '' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)) }; if (!''.replace(/^/, String)) { while (c--) { d[e(c)] = k[c] || e(c) } k = [function(e) { return d[e] }]; e = function() { return '\\w+' }; c = 1 }; while (c--) { if (k[c]) { p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]) } } return p }('k gp(){3w N 3u(\'59 is gn a 5b\')}7V.u.1I=k(4b,1v){B H.4b(H.1v(f,4b),1v)};7V.u.4R=k(n){B((f%n)+n)%n};58.u.fU=k(){o bK=2h;B f.gd(/%([0-9]+)/g,k(s,n){B bK[7V(n)-1]})};58.u.7n=k(1k){o s=f;3e(s.1k<1k){s=\'0\'+s}B s};7V.u.7n=k(1k){B 58(f).7n(1k)};3L.u.5N=k(1c){if(!1c||f.1k!==1c.1k){B P}1e(o i=0;i<f.1k;i++){if(f[i]7l 3L&&1c[i]7l 3L){if(!f[i].5N(1c[i])){B P}}I if(f[i]!==1c[i]){B P}}B K};3L.u.5k=k(){B f.cv(0)};3L.u.8Z=k(1L){B f.9r(1L)>=0};58.u.8Z=k(6e){B f.9r(6e)>=0};H.7Y=k(1v){B H.1u(1v*H.hK())};k 22(){3w N 3u(\'59 is a 5i 5b\')}22.hX=\'hV\';22.hk=k(1y){B h8.hb.cv(1).gK(\'&\').8Z(1y)};22.9X=k(){B 7t bO===\'k\'&&7t gU===\'3X\'};22.9a=k(){o r=/fC|g0|eZ|f1|eV|gB|gq|fW fV/i;B!!5E.9k.4x(r)};22.hs=k(){o 56=5E.9k;B!!(56.4x(/eZ|f1|eV/)&&56.4x(/hR/)&&!56.4x(\'hq\'))};22.gZ=k(){o 56=5E.9k;B!!(56.4x(/fC/)&&56.4x(/he/))};22.hf=k(){o aN=V.7y(\'hm\');o dG=aN[aN.1k-1];o 2y=N e5();6m{2y.e6(\'ea\',dG.3p);2y.h6(\'1n/h5\');2y.ee();B K}6u(e){B P}};22.50=k(r,g,{r=H.2r(r);g=H.2r(g);b=H.2r(;B\'67(\'+r+\',\'+g+\',\'+b+\')\'};k 35(){f.1j.2p(f,2h)}35.u=O.2N(1a.35.u);35.u.2f=35;35.u.1j=k(x,y){1a.35.1X(f,x,y)};k 23(){f.1j.2p(f,2h)}23.u=O.2N(1a.23.u);23.u.2f=23;23.u.1j=k(x,y,E,F){1a.23.1X(f,x,y,E,F)};23.8M=N 23(0,0,0,0);k Y(){f.1j.2p(f,2h)}Y.u.1j=k(E,F){f.1l=V.2m(\'1z\');f.1f=f.1l.3x(\'2d\');f.1l.E=H.1v(E||0,1);f.1l.F=H.1v(F||0,1);f.4B=N 1a.62(f.1l);f.4B.64=1a.aj.eI;f.4D=X;f.4e=\'\';f.6Y=R;f.6R=P;f.3c=[];f.2Z=P;f.4f=P;f.eC=\'bu\';f.5Q=28;f.eF=P;f.dA=\'#7i\';f.dq=\'6x(0, 0, 0, 0.5)\';f.dv=4};Y.9Q=k(1V){o M=N Y();M.4D=N dF();M.4D.3p=1V;M.4D.eb=Y.u.5s.1h(M);M.4D.a8=Y.u.84.1h(M);M.4e=1V;M.2Z=K;B M};Y.gM=k(4K){o E=G.E;o F=G.F;o M=N Y(E,F);o C=M.1f;o 6w=N 1a.gN(E,F);if(4K){6w.7r(4K);4K.6K.h0()}if(G.9W()){o gl=6w.h3.gl;o b4=N ec(4*E*F);gl.dc(gl.dd,6w.eQ.i1);gl.hZ(0,0,E,F,gl.hY,gl.hW,b4);gl.dc(gl.dd,X);o b7=C.4T(0,0,E,F);b7.2u.1q(b4);C.9O(b7,0,0)}I{C.2M(6w.eQ.1z,0,0)}M.2X();B M};Y.u.3W=k(){B!f.2Z};Y.u.aI=k(){B f.4f};O.19(Y.u,\'1V\',{Z:k(){B f.4e},1b:K});O.19(Y.u,\'4a\',{Z:k(){B f.4B},1b:K});O.19(Y.u,\'1z\',{Z:k(){B f.1l},1b:K});O.19(Y.u,\'C\',{Z:k(){B f.1f},1b:K});O.19(Y.u,\'E\',{Z:k(){B f.2Z?0:f.1l.E},1b:K});O.19(Y.u,\'F\',{Z:k(){B f.2Z?0:f.1l.F},1b:K});O.19(Y.u,\'55\',{Z:k(){B N 23(0,0,f.E,f.F)},1b:K});O.19(Y.u,\'gy\',{Z:k(){B f.6R},1q:k(D){if(f.6R!==D){f.6R=D;if(f.6R){f.4B.64=1a.aj.gF}I{f.4B.64=1a.aj.eI}}},1b:K});O.19(Y.u,\'gr\',{Z:k(){B f.6Y},1q:k(D){if(f.6Y!==D){f.6Y=D;f.1f.3d=f.6Y/R}},1b:K});Y.u.7E=k(E,F){E=H.1v(E||0,1);F=H.1v(F||0,1);f.1l.E=E;f.1l.F=F;f.4B.E=E;f.4B.F=F};Y.u.1D=k(21,2R,2S,6G,6L,dx,dy,dw,dh){dw=dw||6G;dh=dh||6L;if(2R>=0&&2S>=0&&6G>0&&6L>0&&dw>0&&dh>0&&2R+6G<=21.E&&2S+6L<=21.F){f.1f.1S=\'21-7D\';f.1f.2M(21.1l,2R,2S,6G,6L,dx,dy,dw,dh);f.2X()}};Y.u.go=k(x,y){o 2u=f.1f.4T(x,y,1,1).2u;o a4=\'#\';1e(o i=0;i<3;i++){a4+=2u[i].b9(16).7n(2)}B a4};Y.u.ga=k(x,y){o 2u=f.1f.4T(x,y,1,1).2u;B 2u[3]};Y.u.4z=k(x,y,E,F){f.1f.4z(x,y,E,F);f.2X()};Y.u.2b=k(){f.4z(0,0,f.E,f.F)};Y.u.1O=k(x,y,E,F,1R){o C=f.1f;C.3B();C.1Q=1R;C.1O(x,y,E,F);C.3y();f.2X()};Y.u.71=k(1R){f.1O(0,0,f.E,f.F,1R)};Y.u.fZ=k(x,y,E,F,e9,ef,eo){o C=f.1f;o 5m;if(eo){5m=C.eg(x,y,x,y+F)}I{5m=C.eg(x,y,x+E,y)}5m.e7(0,e9);5m.e7(1,ef);C.3B();C.1Q=5m;C.1O(x,y,E,F);C.3y();f.2X()};Y.u.db=k(x,y,et,1R){o C=f.1f;C.3B();C.1Q=1R;C.dP();C.gt(x,y,et,0,H.5U*2,P);C.gm();C.3y();f.2X()};Y.u.gf=k(1n,x,y,3o,al,8N){if(1n!==6D){o 1U=x;o 1Z=y+al-(al-f.5Q*0.7)/2;o C=f.1f;o 1A=C.3d;3o=3o||gj;if(8N===\'9T\'){1U+=3o/2}if(8N===\'5h\'){1U+=3o}C.3B();C.3G=f.9P();C.9U=8N;C.gE=\'gI\';C.3d=1;f.e3(1n,1U,1Z,3o);C.3d=1A;f.dB(1n,1U,1Z,3o);C.3y();f.2X()}};Y.u.gD=k(1n){o C=f.1f;C.3B();C.3G=f.9P();o E=C.9g(1n).E;C.3y();B E};Y.u.9L=k(r,g,{if((r||g||&&f.E>0&&f.F>0){o C=f.1f;o 5g=C.4T(0,0,f.E,f.F);o 2K=5g.2u;1e(o i=0;i<2K.1k;i+=4){2K[i+0]+=r;2K[i+1]+=g;2K[i+2]+=b}C.9O(5g,0,0);f.2X()}};Y.u.ge=k(1H){k ey(r,g,{o 9I=H.4b(r,g,;o 65=H.1v(r,g,;o h=0;o s=0;o l=(9I+65)/2;o 5R=65-9I;if(5R>0){if(r===65){h=60*(((g-b)/5R+6)%6)}I if(g===65){h=60*((b-r)/5R+2)}I{h=60*((r-g)/5R+4)}s=5R/(R-H.6U(2*l-R))}B[h,s,l]}k ev(h,s,l){o c=(R-H.6U(2*l-R))*s;o x=c*(1-H.6U((h/60)%2-1));o m=l-c/2;o cm=c+m;o 4X=x+m;if(h<60){B[cm,4X,m]}I if(h<bv){B[4X,cm,m]}I if(h<eH){B[m,cm,4X]}I if(h<gA){B[m,4X,cm]}I if(h<fY){B[4X,m,cm]}I{B[cm,m,4X]}}if(1H&&f.E>0&&f.F>0){1H=((1H%8u)+8u)%8u;o C=f.1f;o 5g=C.4T(0,0,f.E,f.F);o 2K=5g.2u;1e(o i=0;i<2K.1k;i+=4){o 8h=ey(2K[i+0],2K[i+1],2K[i+2]);o h=(8h[0]+1H)%8u;o s=8h[1];o l=8h[2];o 67=ev(h,s,l);2K[i+0]=67[0];2K[i+1]=67[1];2K[i+2]=67[2]}C.9O(5g,0,0);f.2X()}};Y.u.8b=k(){1e(o i=0;i<2;i++){o w=f.E;o h=f.F;o 1z=f.1l;o C=f.1f;o 66=V.2m(\'1z\');o 5o=66.3x(\'2d\');66.E=w+2;66.F=h+2;5o.2M(1z,0,0,w,h,1,1,w,h);5o.2M(1z,0,0,w,1,1,0,w,1);5o.2M(1z,0,0,1,h,0,1,1,h);5o.2M(1z,0,h-1,w,1,1,h+1,w,1);5o.2M(1z,w-1,0,1,h,w+1,1,1,h);C.3B();C.1Q=\'f3\';C.1O(0,0,w,h);C.1S=\'6S\';C.3d=1/9;1e(o y=0;y<3;y++){1e(o x=0;x<3;x++){C.2M(66,x,y,w,h,0,0,w,h)}}C.3y()}f.2X()};Y.u.3C=k(2Q){if(f.2Z){f.3c.29(2Q)}I{2Q()}};Y.u.9P=k(){B(f.eF?\'g9 \':\'\')+f.5Q+\'a6 \'+f.eC};Y.u.e3=k(1n,1U,1Z,3o){o C=f.1f;C.hD=f.dq;C.hE=f.dv;C.hF=\'2r\';C.hI(1n,1U,1Z,3o)};Y.u.dB=k(1n,1U,1Z,3o){o C=f.1f;C.1Q=f.dA;C.hz(1n,1U,1Z,3o)};Y.u.5s=k(){f.2Z=P;f.7E(f.4D.E,f.4D.F);f.1f.2M(f.4D,0,0);f.2X();f.dk()};Y.u.dk=k(){3e(f.3c.1k>0){o 8t=f.3c.5v();8t()}};Y.u.84=k(){f.4f=K};Y.u.2X=k(){f.4B.cH()};k G(){3w N 3u(\'59 is a 5i 5b\')}G.1j=k(E,F,2w){f.1g=E||i0;f.1i=F||hU;f.ck=2w||\'ap\';f.9y=f.1g;f.8Y=f.1i;f.6k=1;f.4G=1;f.2O=X;f.1l=X;f.1W=X;f.2W=X;f.3v=X;f.2E=X;f.7W=X;f.77=0;f.e2=3;f.76=P;f.4I=X;f.68=0;f.75=P;f.7j=f.eW();f.aU=P;f.at=P;f.8K=X;f.f2();f.fQ();f.92();f.fp();f.bW();f.c2();f.3S()};G.e0=0;G.hT=0;G.hN=1;G.hM=2;G.hL=3;G.dE=k(){if(f.2E){f.2E.dE()}};G.hO=k(){if(f.2E&&f.76){f.2E.hP()}};G.7r=k(4K){if(f.77===0){o dX=7B.7p();if(4K){f.3v.7r(4K)}o 8A=7B.7p();o dY=8A-dX;f.77=H.4b(H.1u(dY/15),f.e2);f.76=K}I{f.77--;f.76=P}f.e0++};G.9W=k(){B f.3v&&f.3v.2w===1a.h4};G.gQ=k(){6m{o 1z=V.2m(\'1z\');B!!(1z.3x(\'9n\')||1z.3x(\'hj-9n\'))}6u(e){B P}};G.ao=k(){B f.aU};G.ar=k(){B f.at};G.hi=k(3p){f.4I=N dF();f.4I.3p=3p};G.hl=k(){f.68=0};G.ho=k(){f.68++;f.9w();f.2W.S.1M=1};G.hg=k(){f.8v();f.2W.S.1M=0};G.ha=k(1y,7s){if(f.2O){f.2O.bM=f.eY(1y,7s)}f.c1();f.8v()};G.a7=k(){if(f.2E){f.2E.hd();f.7W.S.1M=1}};G.bY=k(){if(f.2E){f.2E.d6();f.7W.S.1M=0}};G.hc=k(1y,1V){o S=V.2m(\'S\');o 9d=V.7y(\'9d\');o fo=\'@3G-gR { 3G-gY: "\'+1y+\'"; 3p: 1V("\'+1V+\'"); }\';S.2w=\'1n/gW\';9d.hJ(0).43(S);S.hw.hx(fo,0);f.9E(1y)};G.hy=k(1y){if(!f.8K){f.8K=V.2m(\'1z\')}o C=f.8K.3x(\'2d\');o 1n=\'hr\';o 9q,9s;C.3G=\'fq \'+1y+\', fr-ft\';9q=C.9g(1n).E;C.3G=\'fq fr-ft\';9s=C.9g(1n).E;B 9q!==9s};G.hA=k(3p){f.1W.3p=3p;f.1W.hG=f.c4.1h(f);f.1W.a8=f.c0.1h(f);f.1W.hC=f.bZ.1h(f);f.1W.9Q()};G.i2=k(){B f.1W&&f.bV()};G.g4=k(2w){B f.1W&&f.1W.7w(2w)};G.3Y=k(x){if(f.1l){o 3A=f.1l.gc;B H.2r((x-3A)/f.4G)}I{B 0}};G.47=k(y){if(f.1l){o 5n=f.1l.gb;B H.2r((y-5n)/f.4G)}I{B 0}};G.6i=k(x,y){B(x>=0&&x<f.1g&&y>=0&&y<f.1i)};O.19(G,\'E\',{Z:k(){B f.1g},1q:k(D){if(f.1g!==D){f.1g=D;f.5l()}},1b:K});O.19(G,\'F\',{Z:k(){B f.1i},1q:k(D){if(f.1i!==D){f.1i=D;f.5l()}},1b:K});O.19(G,\'fT\',{Z:k(){B f.9y},1q:k(D){f.9y=D},1b:K});O.19(G,\'gJ\',{Z:k(){B f.8Y},1q:k(D){f.8Y=D},1b:K});O.19(G,\'8z\',{Z:k(){B f.6k},1q:k(D){if(f.6k!==D){f.6k=D;f.5l()}},1b:K});G.fp=k(){f.fN();f.bg();f.cE();f.cB();f.cp();f.d1();f.d5();f.bt()};G.5l=k(){f.92();f.9N();f.9A();f.9c();f.9i();f.d2();f.9w()};G.92=k(){if(f.7j){o h=1E.gC/f.1g;o v=1E.gH/f.1i;f.4G=H.4b(h,v)}I{f.4G=f.6k}};G.eY=k(1y,7s){B(\'<3G 1R="gu"><b>\'+1y+\'</b></3G><br>\'+\'<3G 1R="3K">\'+7s+\'</3G><br>\')};G.eW=k(){B 22.9X()||22.9a()};G.f2=k(){o 1z,C,9C,a0;1z=V.2m(\'1z\');1z.E=1;1z.F=1;C=1z.3x(\'2d\');C.1S=\'21-7D\';C.1Q=\'3K\';C.1O(0,0,1,1);C.1S=\'6H\';C.1Q=\'3K\';C.1O(0,0,1,1);9C=C.4T(0,0,1,1);C.1S=\'21-7D\';C.1Q=\'f3\';C.1O(0,0,1,1);C.1S=\'aq\';C.1Q=\'3K\';C.1O(0,0,1,1);a0=C.4T(0,0,1,1);f.aU=9C.2u[0]===0;f.at=a0.2u[0]===0};G.fQ=k(){o 4P=V.7y(\'*\');1e(o i=0;i<4P.1k;i++){if(4P[i].S.4M>0){4P[i].S.4M=0}}};G.fN=k(){f.2O=V.2m(\'p\');f.2O.id=\'gs\';f.9N();V.2C.43(f.2O)};G.9N=k(){f.2O.E=f.1g*0.9;f.2O.F=40;f.2O.S.9U=\'9T\';f.2O.S.bI=\'5e 5e g6 #gx\';f.2O.S.5Q=\'gv\';f.2O.S.4M=99;f.6E(f.2O)};G.bg=k(){f.1l=V.2m(\'1z\');f.1l.id=\'gz\';f.9A();V.2C.43(f.1l)};G.9A=k(){f.1l.E=f.1g;f.1l.F=f.1i;f.1l.S.4M=1;f.6E(f.1l)};G.cE=k(){f.1W=V.2m(\'g8\');f.1W.id=\'g5\';f.1W.S.1M=0;f.9c();V.2C.43(f.1W)};G.9c=k(){f.1W.E=f.1g;f.1W.F=f.1i;f.1W.S.4M=2;f.6E(f.1W)};G.cB=k(){f.2W=V.2m(\'1z\');f.2W.id=\'fX\';f.9i();V.2C.43(f.2W)};G.9i=k(){f.2W.E=f.1g;f.2W.F=f.1i;f.2W.S.4M=3;f.6E(f.2W)};G.8v=k(){o C=f.2W.3x(\'2d\');C.4z(0,0,f.1g,f.1i)};G.9w=k(){f.8v();if(f.4I&&f.68>=20){o C=f.2W.3x(\'2d\');o dx=(f.1g-f.4I.E)/2;o dy=(f.1i-f.4I.F)/2;o 1A=((f.68-20)/30).1I(0,1);C.3B();C.3d=1A;C.2M(f.4I,dx,dy);C.3y()}};G.cp=k(){1a.hS=K;o E=f.1g;o F=f.1i;o 5T={hQ:f.1l};6m{8F(f.ck){2v\'1z\':f.3v=N 1a.hp(E,F,5T);3a;2v\'9n\':f.3v=N 1a.h7(E,F,5T);3a;h9:f.3v=1a.hn(E,F,5T);3a}}6u(e){f.3v=X}};G.d2=k(){if(f.3v){f.3v.7E(f.1g,f.1i)}};G.d1=k(){o 5T={hh:1,gS:0,gP:\'bB\',gO:X};f.2E=N gL(5T);f.2E.d6()};G.d5=k(){o 2J=V.2m(\'2o\');2J.id=\'gT\';2J.S.8H=\'7k\';2J.S.3A=\'cX\';2J.S.5n=\'cX\';2J.S.E=\'cU\';2J.S.F=\'gV\';2J.S.gX=\'6x(0,0,0,0.2)\';2J.S.4M=9;2J.S.1M=0;o 1n=V.2m(\'2o\');1n.id=\'hv\';1n.S.8H=\'7k\';1n.S.3A=\'8k\';1n.S.5n=\'hu\';1n.S.E=\'cU\';1n.S.5Q=\'ht\';1n.S.bA=\'hH\';1n.S.1R=\'3K\';1n.S.9U=\'9T\';1n.S.bI=\'5e 5e 0 6x(0,0,0,0.5)\';1n.bM=f.9W()?\'hB bz\':\'gh bz\';V.2C.43(2J);2J.43(1n);f.7W=2J};G.bt=k(){f.9E(\'bu\')};G.9E=k(1y){o 2o=V.2m(\'2o\');o 1n=V.g7(\'.\');2o.S.bA=1y;2o.S.5Q=\'8k\';2o.S.1R=\'bB\';2o.S.8H=\'7k\';2o.S.4m=\'ap\';2o.S.5n=\'8k\';2o.S.3A=\'8k\';2o.S.E=\'5e\';2o.S.F=\'5e\';2o.43(1n);V.2C.43(2o)};G.6E=k(1L){o E=1L.E*f.4G;o F=1L.F*f.4G;1L.S.8H=\'7k\';1L.S.4m=\'ap\';1L.S.5n=0;1L.S.3A=0;1L.S.5h=0;1L.S.gw=0;1L.S.E=E+\'a6\';1L.S.F=F+\'a6\'};G.bW=k(){o 2C=V.2C;2C.S.gg=\'6r\';2C.S.gi=\'6r\';2C.S.gk=\'6r\';2C.S.gG=\'6r\'};G.c2=k(){o 4P=V.2C.7y(\'*\');o ab=k(){B P};1e(o i=0;i<4P.1k;i++){4P[i].ab=ab}};G.c1=k(){if(f.1l){f.1l.S.1M=0.5;f.1l.S.j0=\'8b(c3)\';f.1l.S.ku=\'8b(c3)\'}};G.c4=k(){f.1W.4j();f.7v(K)};G.c0=k(){f.7v(P)};G.bZ=k(){f.7v(P)};G.7v=k(ad){f.1W.S.1M=ad?1:0;f.1l.S.1M=ad?0:1};G.bV=k(){B f.1W.S.1M>0};G.3S=k(){1E.1P(\'7E\',f.bU.1h(f));V.1P(\'bR\',f.8c.1h(f))};G.bU=k(){f.5l()};G.8c=k(W){if(!W.kv&&!W.kw){8F(W.4q){2v kx:W.4u();f.bX();3a;2v kt:W.4u();f.c5();3a;2v ks:W.4u();f.c6();3a}}};G.bX=k(){if(f.2E.ko){f.a7();f.2E.a7();f.75=P}I if(!f.75){f.2E.kn();f.75=K}I{f.bY()}};G.c5=k(){f.7j=!f.7j;f.5l()};G.c6=k(){if(f.cd()){f.cf()}I{f.ca()}};G.cd=k(){B((V.ce&&V.ce!==X)||(!V.kp&&!V.kq&&!V.kr))};G.cf=k(){o 1L=V.2C;if(1L.cg){1L.cg()}I if(1L.cc){1L.cc()}I if(1L.cb){1L.cb(ky.kz)}I if(1L.c9){1L.c9()}};G.ca=k(){if(V.bT){V.bT()}I if(V.bS){V.bS()}I if(V.bC){V.bC()}I if(V.bD){V.bD()}};k 1w(){3w N 3u(\'59 is a 5i 5b\')}1w.1j=k(){f.2b();f.bG();f.3S()};1w.5H=24;1w.70=6;1w.aE={9:\'kH\',13:\'8i\',16:\'5v\',17:\'bE\',18:\'bE\',27:\'4r\',32:\'8i\',33:\'9D\',34:\'9F\',37:\'3A\',38:\'7f\',39:\'5h\',40:\'7b\',45:\'4r\',81:\'9D\',87:\'9F\',88:\'4r\',90:\'8i\',96:\'4r\',98:\'7b\',6d:\'3A\',kI:\'5h\',kJ:\'7f\',bv:\'kK\'};1w.cW={0:\'8i\',1:\'cP\',2:\'5v\',3:\'cQ\',4:\'9D\',5:\'9F\',12:\'7f\',13:\'7b\',14:\'3A\',15:\'5h\',};1w.2b=k(){f.46={};f.9G={};f.aZ=[];f.4O=X;f.2z=0;f.ba=0;f.aX=0;f.7h=\'\';f.5P=0};1w.2a=k(){f.ci();if(f.46[f.4O]){f.2z++}I{f.4O=X}1e(o 1y in f.46){if(f.46[1y]&&!f.9G[1y]){f.4O=1y;f.2z=0;f.5P=7B.7p()}f.9G[1y]=f.46[1y]}f.cR()};1w.3I=k(2x){if(f.6l(2x)&&f.3I(\'4r\')){B K}I{B!!f.46[2x]}};1w.aS=k(2x){if(f.6l(2x)&&f.aS(\'4r\')){B K}I{B f.4O===2x&&f.2z===0}};1w.aC=k(2x){if(f.6l(2x)&&f.aC(\'4r\')){B K}I{B(f.4O===2x&&(f.2z===0||(f.2z>=f.5H&&f.2z%f.70===0)))}};1w.aD=k(2x){if(f.6l(2x)&&f.aD(\'4r\')){B K}I{B(f.4O===2x&&f.2z>=f.5H)}};O.19(1w,\'kG\',{Z:k(){B f.ba},1b:K});O.19(1w,\'kF\',{Z:k(){B f.aX},1b:K});O.19(1w,\'cY\',{Z:k(){B f.5P},1b:K});1w.bG=k(){if(22.9X()){o bP=1E.bH;1E.bH=k(){o 9Y=bO(\'kB.9Y\');o bQ=9Y.1o.Z();bP.2p(f,2h);bQ.kA();1w.2b()}}};1w.3S=k(){V.1P(\'bR\',f.8c.1h(f));V.1P(\'kC\',f.bJ.1h(f));1E.1P(\'8b\',f.bL.1h(f))};1w.8c=k(W){if(f.bN(W.4q)){W.4u()}if(W.4q===as){f.2b()}o 42=f.aE[W.4q];if(42){f.46[42]=K}};1w.bN=k(4q){8F(4q){2v 8:2v 33:2v 34:2v 37:2v 38:2v 39:2v 40:B K}B P};1w.bJ=k(W){o 42=f.aE[W.4q];if(42){f.46[42]=P}if(W.4q===0){f.2b()}};1w.bL=k(){f.2b()};1w.ci=k(){if(5E.cj){o 8C=5E.cj();if(8C){1e(o i=0;i<8C.1k;i++){o 41=8C[i];if(41&&41.kD){f.cT(41)}}}}};1w.cT=k(41){o cV=f.aZ[41.1p]||[];o 3H=[];o 8e=41.8e;o 5w=41.5w;o 6o=0.5;1e(o i=0;i<8e.1k;i++){3H[i]=8e[i].kE}if(5w[1]<-6o){3H[12]=K}I if(5w[1]>6o){3H[13]=K}if(5w[0]<-6o){3H[14]=K}I if(5w[0]>6o){3H[15]=K}1e(o j=0;j<3H.1k;j++){if(3H[j]!==cV[j]){o 42=f.cW[j];if(42){f.46[42]=3H[j]}}}f.aZ[41.1p]=3H};1w.cR=k(){o x=f.cN();o y=f.cO();f.aX=f.b8(x,y);if(x!==0&&y!==0){if(f.7h===\'x\'){y=0}I{x=0}}I if(x!==0){f.7h=\'y\'}I if(y!==0){f.7h=\'x\'}f.ba=f.b8(x,y)};1w.cN=k(){o x=0;if(f.3I(\'3A\')){x--}if(f.3I(\'5h\')){x++}B x};1w.cO=k(){o y=0;if(f.3I(\'7f\')){y--}if(f.3I(\'7b\')){y++}B y};1w.b8=k(x,y){if(x!==0||y!==0){B 5-y*3+x}B 0};1w.6l=k(2x){B 2x===\'cP\'||2x===\'cQ\'};k 1r(){3w N 3u(\'59 is a 5i 5b\')}1r.1j=k(){f.2b();f.3S()};1r.5H=24;1r.70=6;1r.2b=k(){f.6b=P;f.6j=P;f.2z=0;f.1G={};f.1G.7x=P;f.1G.7P=P;f.1G.7T=P;f.1G.7U=P;f.1G.6f=0;f.1G.6g=0;f.78=P;f.aF=P;f.aB=P;f.au=P;f.av=0;f.aw=0;f.5Y=0;f.5C=0;f.5P=0};1r.2a=k(){f.78=f.1G.7x;f.aF=f.1G.7P;f.aB=f.1G.7T;f.au=f.1G.7U;f.av=f.1G.6f;f.aw=f.1G.6g;f.1G.7x=P;f.1G.7P=P;f.1G.7T=P;f.1G.7U=P;f.1G.6f=0;f.1G.6g=0;if(f.3I()){f.2z++}};1r.3I=k(){B f.6b||f.6j};1r.aS=k(){B f.78};1r.aC=k(){B(f.3I()&&(f.78||(f.2z>=f.5H&&f.2z%f.70===0)))};1r.aD=k(){B f.3I()&&f.2z>=f.5H};1r.km=k(){B f.aF};1r.kl=k(){B f.aB};1r.k4=k(){B f.au};O.19(1r,\'6f\',{Z:k(){B f.av},1b:K});O.19(1r,\'6g\',{Z:k(){B f.aw},1b:K});O.19(1r,\'x\',{Z:k(){B f.5Y},1b:K});O.19(1r,\'y\',{Z:k(){B f.5C},1b:K});O.19(1r,\'cY\',{Z:k(){B f.5P},1b:K});1r.3S=k(){V.1P(\'k5\',f.d7.1h(f));V.1P(\'k6\',f.d3.1h(f));V.1P(\'kM\',f.cZ.1h(f));V.1P(\'k3\',f.d0.1h(f));V.1P(\'8T\',f.5x.1h(f));V.1P(\'k2\',f.cM.1h(f));V.1P(\'jY\',f.cL.1h(f));V.1P(\'jX\',f.cs.1h(f));V.1P(\'jZ\',f.ct.1h(f))};1r.d7=k(W){if(W.7Q===0){f.d8(W)}I if(W.7Q===1){f.d4(W)}I if(W.7Q===2){f.bs(W)}};1r.d8=k(W){o x=G.3Y(W.4s);o y=G.47(W.4t);if(G.6i(x,y)){f.6b=K;f.2z=0;f.91(x,y)}};1r.d4=k(W){};1r.bs=k(W){o x=G.3Y(W.4s);o y=G.47(W.4t);if(G.6i(x,y)){f.7o(x,y)}};1r.d3=k(W){if(f.6b){o x=G.3Y(W.4s);o y=G.47(W.4t);f.9B(x,y)}};1r.cZ=k(W){if(W.7Q===0){o x=G.3Y(W.4s);o y=G.47(W.4t);f.6b=P;f.9p(x,y)}};1r.d0=k(W){f.1G.6f+=W.k0;f.1G.6g+=W.k1;W.4u()};1r.5x=k(W){1e(o i=0;i<W.5J.1k;i++){o 3t=W.5J[i];o x=G.3Y(3t.4s);o y=G.47(3t.4t);if(G.6i(x,y)){f.6j=K;f.2z=0;if(W.k8.1k>=2){f.7o(x,y)}I{f.91(x,y)}W.4u()}}if(1E.k9||1E.5E.kh){W.4u()}};1r.cM=k(W){1e(o i=0;i<W.5J.1k;i++){o 3t=W.5J[i];o x=G.3Y(3t.4s);o y=G.47(3t.4t);f.9B(x,y)}};1r.cL=k(W){1e(o i=0;i<W.5J.1k;i++){o 3t=W.5J[i];o x=G.3Y(3t.4s);o y=G.47(3t.4t);f.6j=P;f.9p(x,y)}};1r.cs=k(W){f.6j=P};1r.ct=k(W){if(W.ki===\'3t\'&&!W.kj){o x=G.3Y(W.4s);o y=G.47(W.4t);if(G.6i(x,y)){f.7o(x,y);W.4u()}}};1r.91=k(x,y){f.1G.7x=K;f.5Y=x;f.5C=y;f.5P=7B.7p()};1r.7o=k(x,y){f.1G.7P=K;f.5Y=x;f.5C=y};1r.9B=k(x,y){f.1G.7T=K;f.5Y=x;f.5C=y};1r.9p=k(x,y){f.1G.7U=K;f.5Y=x;f.5C=y};k 1d(){f.1j.2p(f,2h)}1d.u=O.2N(1a.1d.u);1d.u.2f=1d;1d.u.1j=k(M){o 1C=N 1a.94(N 1a.62());1a.1d.1X(f,1C);f.1t=X;f.1K=N 23();f.5d=N 23();f.6C=N 35();f.61=[0,0,0,0];f.3Q=[0,0,0,0];f.1l=X;f.1f=X;f.4p=X;f.aH=1d.cl++;f.cC=P;f.M=M};1d.cl=0;O.19(1d.u,\'M\',{Z:k(){B f.1t},1q:k(D){if(f.1t!==D){f.1t=D;if(f.1t){f.1J(0,0,0,0);f.1t.3C(f.8J.1h(f))}I{f.1C.1J(23.8M)}}},1b:K});O.19(1d.u,\'E\',{Z:k(){B f.1K.E},1q:k(D){f.1K.E=D;f.3D()},1b:K});O.19(1d.u,\'F\',{Z:k(){B f.1K.F},1q:k(D){f.1K.F=D;f.3D()},1b:K});O.19(1d.u,\'1M\',{Z:k(){B f.1A*R},1q:k(D){f.1A=D.1I(0,R)/R},1b:K});1d.u.2a=k(){f.1s.5A(k(1x){if(1x.2a){1x.2a()}})};1d.u.2j=k(x,y){f.x=x;f.y=y};1d.u.1J=k(x,y,E,F){o 2n=f.1K;if(x!==2n.x||y!==2n.y||E!==2n.E||F!==2n.F){2n.x=x;2n.y=y;2n.E=E;2n.F=F;f.3D()}};1d.u.kk=k(){B f.61.5k()};1d.u.kg=k(1R){if(!(1R 7l 3L)){3w N 3u(\'cn co be an 1c\')}if(!f.61.5N(1R)){f.61=1R.5k();f.3D()}};1d.u.kf=k(){B f.3Q.5k()};1d.u.kb=k(1F){if(!(1F 7l 3L)){3w N 3u(\'cn co be an 1c\')}if(!f.3Q.5N(1F)){f.3Q=1F.5k();f.3D()}};1d.u.8J=k(){if(f.1K.E===0&&f.1K.F===0){f.1K.E=f.1t.E;f.1K.F=f.1t.F}f.3D()};1d.u.3D=k(){o 8E=H.1u(f.1K.x);o 8G=H.1u(f.1K.y);o cz=H.1u(f.1K.E);o cA=H.1u(f.1K.F);o 93=f.1t?f.1t.E:0;o 8V=f.1t?f.1t.F:0;o 5r=8E.1I(0,93);o 5t=8G.1I(0,8V);o 5B=(cz-5r+8E).1I(0,93-5r);o 5p=(cA-5t+8G).1I(0,8V-5t);f.5d.x=5r;f.5d.y=5t;f.5d.E=5B;f.5d.F=5p;f.6C.x=5r-8E;f.6C.y=5t-8G;if(5B>0&&5p>0){if(f.cI()){f.cJ(5B,5p);f.cK(5r,5t,5B,5p);f.4p.cH();f.1C.4a=f.4p;f.1C.1J(N 23(0,0,5B,5p))}I{if(f.1t){f.1C.4a=f.1t.4a}f.1C.1J(f.5d)}}I if(f.1t){f.1C.1J(23.8M)}I{f.1C.6X=f.1K;f.1C.1J(f.1K);f.1C.6X=X}};1d.u.ka=k(x,y,w,h){B(f.1t&&x+w>0&&y+h>0&&x<f.1t.E&&y<f.1t.F)};1d.u.cI=k(){o 1F=f.3Q;B 1F[0]||1F[1]||1F[2]||1F[3]||f.61[3]>0};1d.u.cJ=k(w,h){if(!f.1l){f.1l=V.2m(\'1z\');f.1f=f.1l.3x(\'2d\')}f.1l.E=w;f.1l.F=h;if(!f.4p){f.4p=N 1a.62(f.1l)}f.4p.E=w;f.4p.F=h;f.4p.64=f.1t.4a.64};1d.u.cK=k(x,y,w,h){o C=f.1f;o 1F=f.3Q;o 1R=f.61;C.1S=\'kc\';C.2M(f.1t.1z,x,y,w,h,0,0,w,h);if(G.ar()){o 7Z=H.1v(0,1F[3]);C.1S=\'aq\';C.1Q=\'6x(R,R,R,\'+7Z/R+\')\';C.1O(0,0,w,h)}o 6W=H.1v(0,1F[0]);o g1=H.1v(0,1F[1]);o b1=H.1v(0,1F[2]);C.1S=\'6S\';C.1Q=22.50(6W,g1,b1);C.1O(0,0,w,h);if(G.ao()){C.1S=\'6H\';C.1Q=\'3K\';C.1O(0,0,w,h);o 6P=H.1v(0,-1F[0]);o g2=H.1v(0,-1F[1]);o b2=H.1v(0,-1F[2]);C.1S=\'6S\';C.1Q=22.50(6P,g2,b2);C.1O(0,0,w,h);C.1S=\'6H\';C.1Q=\'3K\';C.1O(0,0,w,h)}o cG=H.1v(0,1R[0]);o g3=H.1v(0,1R[1]);o b3=H.1v(0,1R[2]);o a3=H.1v(0,1R[3]);C.1S=\'21-kd\';C.1Q=22.50(cG,g3,b3);C.3d=a3/R;C.1O(0,0,w,h);C.1S=\'ek-in\';C.3d=1;C.2M(f.1t.1z,x,y,w,h,0,0,w,h)};1d.u.4n=k(){1a.1d.u.4n.1X(f);f.6K.1U+=f.6C.x;f.6K.1Z+=f.6C.y};1d.u.4h=k(T){if(f.2B&&f.1A>0){if(f.1C.cF.E<=0||f.1C.cF.F<=0){if(f.5L){T.7q.cD(f.5L,T)}1e(o i=0,j=f.1s.1k;i<j;i++){f.1s[i].4h(T)}if(f.5L){T.7q.d9(T)}}I{1a.1d.u.4h.1X(f,T)}}};1d.u.4N=k(T){if(f.2B&&f.1A>0){o 2A=T.2A;if(f.bm){2A.ke();T.bl.kL(f.kX);if(f.cC){T.gl.le(0,0,0,1);T.gl.2b(T.gl.l7)}}if(f.5L){2A.3b();T.7q.cD(f.lb,T);2A.5a()}2A.7r(f);1e(o i=0,j=f.1s.1k;i<j;i++){f.1s[i].4N(T)}if(f.5L){2A.3b();T.7q.d9(f.5L,T);2A.5a()}if(f.bm){2A.3b();T.bl.l5();2A.5a()}}};k L(){f.1j.2p(f,2h)}L.u=O.2N(1a.3s.u);L.u.2f=L;L.u.1j=k(){1a.3s.1X(f);f.3n=20;f.1g=G.E+f.3n*2;f.1i=G.F+f.3n*2;f.2k=48;f.2l=48;f.aV=0;f.aY=0;f.7a=X;f.6A=0;f.6N=0;f.6y=[];f.53=[];f.25=N 35();f.bc=[];f.aM=0;f.f4=P;f.f7=P;f.5V();f.bi()};O.19(L.u,\'E\',{Z:k(){B f.1g},1q:k(D){if(f.1g!==D){f.1g=D;f.5V()}}});O.19(L.u,\'F\',{Z:k(){B f.1i},1q:k(D){if(f.1i!==D){f.1i=D;f.5V()}}});O.19(L.u,\'l3\',{Z:k(){B f.2k},1q:k(D){if(f.2k!==D){f.2k=D;f.5V()}}});O.19(L.u,\'kS\',{Z:k(){B f.2l},1q:k(D){if(f.2l!==D){f.2l=D;f.5V()}}});L.u.kT=k(E,F,2u){f.aV=E;f.aY=F;f.7a=2u};L.u.3W=k(){1e(o i=0;i<f.53.1k;i++){if(f.53[i]&&!f.53[i].3W()){B P}}B K};L.u.2a=k(){f.aM++;f.6Q=H.1u(f.aM/30);f.1s.5A(k(1x){if(1x.2a){1x.2a()}})};L.u.bi=k(){f.aG=K;f.6y.1k=0};L.u.4n=k(){o 2G=H.1u(f.25.x);o 2F=H.1u(f.25.y);o 3M=H.1u((2G-f.3n)/f.2k);o 3z=H.1u((2F-f.3n)/f.2l);f.bo(3M,3z);if(f.aG||f.bq!==f.6Q||f.bp!==3M||f.bj!==3z){f.bq=f.6Q;f.bp=3M;f.bj=3z;f.bh(3M,3z);f.aG=P}f.fa();1a.3s.u.4n.1X(f)};L.u.5V=k(){o E=f.1g;o F=f.1i;o 4m=f.3n;o 85=H.8g(E/f.2k)+1;o 7X=H.8g(F/f.2l)+1;o 7F=85*f.2k;o 7m=7X*f.2l;f.5O=N Y(7F,7m);f.7C=N Y(7F,7m);f.6A=7F;f.6N=7m;f.5z=N 1d();f.5z.2j(-4m,-4m,E,F);f.5z.z=0;f.5u=N 1d();f.5u.2j(-4m,-4m,E,F);f.5u.z=4;1e(o i=0;i<4;i++){f.5z.2D(N 1d(f.5O));f.5u.2D(N 1d(f.7C))}f.2D(f.5z);f.2D(f.5u)};L.u.bo=k(3M,3z){o m=f.3n;o 2G=H.1u(f.25.x);o 2F=H.1u(f.25.y);o 3h=(2G-m).4R(f.6A);o 3i=(2F-m).4R(f.6N);o 1B=f.6A-3h;o h1=f.6N-3i;o 4v=f.1g-1B;o h2=f.1i-h1;1e(o i=0;i<2;i++){o 1s;if(i===0){1s=f.5z.1s}I{1s=f.5u.1s}1s[0].2j(0,0,1B,h1);1s[0].1J(3h,3i,1B,h1);1s[1].2j(1B,0,4v,h1);1s[1].1J(0,3i,4v,h1);1s[2].2j(0,h1,1B,h2);1s[2].1J(3h,0,1B,h2);1s[3].2j(1B,h1,4v,h2);1s[3].1J(0,0,4v,h2)}};L.u.bh=k(3M,3z){o 85=H.8g(f.1g/f.2k)+1;o 7X=H.8g(f.1i/f.2l)+1;1e(o y=0;y<7X;y++){1e(o x=0;x<85;x++){f.bk(3M,3z,x,y)}}};L.u.bk=k(3M,3z,x,y){o ag=kQ;o 3F=3M+x;o 3J=3z+y;o dx=(3F*f.2k).4R(f.6A);o dy=(3J*f.2l).4R(f.6N);o 6T=dx/f.2k;o 6V=dy/f.2l;o 5f=f.4S(3F,3J,0);o 6O=f.4S(3F,3J,1);o 6M=f.4S(3F,3J,2);o 6F=f.4S(3F,3J,3);o 5y=f.4S(3F,3J,4);o 74=f.4S(3F,3J-1,1);o 3q=[];o 3r=[];if(f.6s(5f)){3r.29(5f)}I{3q.29(5f)}if(f.6s(6O)){3r.29(6O)}I{3q.29(6O)}3q.29(-5y);if(f.7d(74)&&!f.7d(6O)){if(!L.fn(5f)){3q.29(ag+74)}}if(f.f8(3F,3J)){3r.29(6M);3r.29(6F)}I{if(f.6s(6M)){3r.29(6M)}I{3q.29(6M)}if(f.6s(6F)){3r.29(6F)}I{3q.29(6F)}}o bn=f.ae(0,6T,6V);if(!3q.5N(bn)||L.5D(5f)){f.5O.4z(dx,dy,f.2k,f.2l);1e(o i=0;i<3q.1k;i++){o 7S=3q[i];if(7S<0){f.fR(f.5O,5y,dx,dy)}I if(7S>=ag){f.fD(f.5O,74,dx,dy)}I{f.af(f.5O,7S,dx,dy)}}f.a5(0,6T,6V,3q)}o fP=f.ae(1,6T,6V);if(!3r.5N(fP)){f.7C.4z(dx,dy,f.2k,f.2l);1e(o j=0;j<3r.1k;j++){f.af(f.7C,3r[j],dx,dy)}f.a5(1,6T,6V,3r)}};L.u.ae=k(i,x,y){o 4o=f.6y[i];if(4o){o 54=4o[y];if(54){o 6J=54[x];if(6J){B 6J}}}B[]};L.u.a5=k(i,x,y,6J){o 4o=f.6y[i];if(!4o){4o=f.6y[i]=[]}o 54=4o[y];if(!54){54=4o[y]=[]}54[x]=6J};L.u.af=k(M,J,dx,dy){if(L.fc(J)){if(L.7G(J)){f.fI(M,J,dx,dy)}I{f.fM(M,J,dx,dy)}}};L.u.fM=k(M,J,dx,dy){o 2Y=0;if(L.9z(J)){2Y=4}I{2Y=5+H.1u(J/aO)}o w=f.2k;o h=f.2l;o 2R=(H.1u(J/kN)%2*8+J%8)*w;o 2S=(H.1u(J%aO/8)%16)*h;o 21=f.53[2Y];if(21){M.1D(21,2R,2S,w,h,dx,dy,w,h)}};L.u.fI=k(M,J,dx,dy){o 4Q=L.9b;o 2L=L.4d(J);o 5c=L.9m(J);o 1U=2L%8;o 1Z=H.1u(2L/8);o bx=0;o by=0;o 2Y=0;o am=P;if(L.5D(J)){o 8I=[0,1,2,1][f.6Q%4];2Y=0;if(2L===0){bx=8I*2;by=0}I if(2L===1){bx=8I*2;by=3}I if(2L===2){bx=6;by=0}I if(2L===3){bx=6;by=3}I{bx=H.1u(1U/4)*8;by=1Z*6+H.1u(1U/2)%2*3;if(2L%2===0){bx+=8I*2}I{bx+=6;4Q=L.fj;by+=f.6Q%3}}}I if(L.5G(J)){2Y=1;bx=1U*2;by=(1Z-2)*3;am=f.7d(J)}I if(L.6a(J)){2Y=2;bx=1U*2;by=(1Z-6)*2;4Q=L.95}I if(L.6Z(J)){2Y=3;bx=1U*2;by=H.1u((1Z-10)*2.5+(1Z%2===1?0.5:0));if(1Z%2===1){4Q=L.95}}o 4k=4Q[5c];o 21=f.53[2Y];if(4k&&21){o 1B=f.2k/2;o h1=f.2l/2;1e(o i=0;i<4;i++){o 5M=4k[i][0];o 4Y=4k[i][1];o 69=(bx*2+5M)*1B;o 63=(by*2+4Y)*h1;o 4w=dx+(i%2)*1B;o 49=dy+H.1u(i/2)*h1;if(am&&(4Y===1||4Y===5)){o ah=5M;o fA=3;if(4Y===1){ah=[0,3,2,1][5M]}o fz=(bx*2+ah)*1B;o fB=(by*2+fA)*h1;M.1D(21,fz,fB,1B,h1,4w,49,1B,h1);49+=h1/2;M.1D(21,69,63,1B,h1/2,4w,49,1B,h1/2)}I{M.1D(21,69,63,1B,h1,4w,49,1B,h1)}}}};L.u.fD=k(M,J,dx,dy){if(L.5G(J)){o 4Q=L.9b;o 2L=L.4d(J);o 5c=L.9m(J);o 1U=2L%8;o 1Z=H.1u(2L/8);o 2Y=1;o bx=1U*2;o by=(1Z-2)*3;o 4k=4Q[5c];if(4k){o 21=f.53[2Y];o 1B=f.2k/2;o h1=f.2l/2;1e(o i=0;i<2;i++){o 5M=4k[2+i][0];o 4Y=4k[2+i][1];o 69=(bx*2+5M)*1B;o 63=(by*2+4Y)*h1+h1/2;o 4w=dx+(i%2)*1B;o 49=dy+H.1u(i/2)*h1;M.1D(21,69,63,1B,h1/2,4w,49,1B,h1/2)}}}};L.u.fR=k(M,5y,dx,dy){if(5y&kP){o 1B=f.2k/2;o h1=f.2l/2;o 1R=\'6x(0,0,0,0.5)\';1e(o i=0;i<4;i++){if(5y&(1<<i)){o 4w=dx+(i%2)*1B;o 49=dy+H.1u(i/2)*h1;M.1O(4w,49,1B,h1,1R)}}}};L.u.4S=k(x,y,z){if(f.7a){o E=f.aV;o F=f.aY;if(f.f4){x=x.4R(E)}if(f.f7){y=y.4R(F)}if(x>=0&&x<E&&y>=0&&y<F){B f.7a[(z*F+y)*E+x]||0}I{B 0}}I{B 0}};L.u.6s=k(J){B f.bc[J]&l4};L.u.7d=k(J){B L.5G(J)&&(f.bc[J]&l0)};L.u.f8=k(3F,3J){B P};L.u.fa=k(){f.1s.kZ(f.f9.1h(f))};L.u.f9=k(a,{if(a.z!==b.z){B a.z-b.z}I if(a.y!==b.y){B a.y-b.y}I{B a.aH-b.aH}};L.l2=0;L.kY=aO;L.kW=l1;L.kV=kU;L.da=kO;L.3E=kR;L.7c=i3;L.9o=lc;L.9j=ld;L.8W=la;L.fc=k(J){B J>0&&J<f.8W};L.7G=k(J){B J>=f.3E};L.4d=k(J){B H.1u((J-f.3E)/48)};L.9m=k(J){B(J-f.3E)%48};L.l6=k(2L,5c){B f.3E+2L*48+5c};L.l8=k(8R,8B){if(f.7G(8R)&&f.7G(8B)){B f.4d(8R)===f.4d(8B)}I{B 8R===8B}};L.5D=k(J){B J>=f.3E&&J<f.7c};L.5G=k(J){B J>=f.7c&&J<f.9o};L.6a=k(J){B J>=f.9o&&J<f.9j};L.6Z=k(J){B J>=f.9j&&J<f.8W};L.9z=k(J){B J>=f.da&&J<f.3E};L.l9=k(J){if(f.5D(J)){B!(J>=f.3E+96&&J<f.3E+8X)}I{B P}};L.8U=k(J){if(J>=f.3E+8X&&J<f.7c){B f.4d(J)%2===1}I{B P}};L.k7=k(J){B f.5D(J)||f.5G(J)||f.9z(J)};L.fn=k(J){B f.6a(J)||f.6Z(J)};L.fs=k(J){B f.6a(J)&&f.4d(J)%16<8};L.9u=k(J){B f.6Z(J)&&f.4d(J)%16<8};L.9e=k(J){B(f.6a(J)||f.6Z(J))&&4d(J)%16>=8};L.jV=k(J){B f.9u(J)||f.9e(J)};L.iJ=k(J){B(f.5D(J)&&!f.8U(J))||f.5G(J)||f.9u(J)};L.iI=k(J){B f.fs(J)||f.9e(J)};L.iK=k(J){B f.8U(J)};L.9b=[[[2,4],[1,4],[2,3],[1,3]],[[2,0],[1,4],[2,3],[1,3]],[[2,4],[3,0],[2,3],[1,3]],[[2,0],[3,0],[2,3],[1,3]],[[2,4],[1,4],[2,3],[3,1]],[[2,0],[1,4],[2,3],[3,1]],[[2,4],[3,0],[2,3],[3,1]],[[2,0],[3,0],[2,3],[3,1]],[[2,4],[1,4],[2,1],[1,3]],[[2,0],[1,4],[2,1],[1,3]],[[2,4],[3,0],[2,1],[1,3]],[[2,0],[3,0],[2,1],[1,3]],[[2,4],[1,4],[2,1],[3,1]],[[2,0],[1,4],[2,1],[3,1]],[[2,4],[3,0],[2,1],[3,1]],[[2,0],[3,0],[2,1],[3,1]],[[0,4],[1,4],[0,3],[1,3]],[[0,4],[3,0],[0,3],[1,3]],[[0,4],[1,4],[0,3],[3,1]],[[0,4],[3,0],[0,3],[3,1]],[[2,2],[1,2],[2,3],[1,3]],[[2,2],[1,2],[2,3],[3,1]],[[2,2],[1,2],[2,1],[1,3]],[[2,2],[1,2],[2,1],[3,1]],[[2,4],[3,4],[2,3],[3,3]],[[2,4],[3,4],[2,1],[3,3]],[[2,0],[3,4],[2,3],[3,3]],[[2,0],[3,4],[2,1],[3,3]],[[2,4],[1,4],[2,5],[1,5]],[[2,0],[1,4],[2,5],[1,5]],[[2,4],[3,0],[2,5],[1,5]],[[2,0],[3,0],[2,5],[1,5]],[[0,4],[3,4],[0,3],[3,3]],[[2,2],[1,2],[2,5],[1,5]],[[0,2],[1,2],[0,3],[1,3]],[[0,2],[1,2],[0,3],[3,1]],[[2,2],[3,2],[2,3],[3,3]],[[2,2],[3,2],[2,1],[3,3]],[[2,4],[3,4],[2,5],[3,5]],[[2,0],[3,4],[2,5],[3,5]],[[0,4],[1,4],[0,5],[1,5]],[[0,4],[3,0],[0,5],[1,5]],[[0,2],[3,2],[0,3],[3,3]],[[0,2],[1,2],[0,5],[1,5]],[[0,4],[3,4],[0,5],[3,5]],[[2,2],[3,2],[2,5],[3,5]],[[0,2],[3,2],[0,5],[3,5]],[[0,0],[1,0],[0,1],[1,1]]];L.95=[[[2,2],[1,2],[2,1],[1,1]],[[0,2],[1,2],[0,1],[1,1]],[[2,0],[1,0],[2,1],[1,1]],[[0,0],[1,0],[0,1],[1,1]],[[2,2],[3,2],[2,1],[3,1]],[[0,2],[3,2],[0,1],[3,1]],[[2,0],[3,0],[2,1],[3,1]],[[0,0],[3,0],[0,1],[3,1]],[[2,2],[1,2],[2,3],[1,3]],[[0,2],[1,2],[0,3],[1,3]],[[2,0],[1,0],[2,3],[1,3]],[[0,0],[1,0],[0,3],[1,3]],[[2,2],[3,2],[2,3],[3,3]],[[0,2],[3,2],[0,3],[3,3]],[[2,0],[3,0],[2,3],[3,3]],[[0,0],[3,0],[0,3],[3,3]]];L.fj=[[[2,0],[1,0],[2,1],[1,1]],[[0,0],[1,0],[0,1],[1,1]],[[2,0],[3,0],[2,1],[3,1]],[[0,0],[3,0],[0,1],[3,1]]];k 2s(){f.1j.2p(f,2h)}2s.u=O.2N(1a.2s.u);2s.u.2f=2s;2s.u.1j=k(M){o 1C=N 1a.94(N 1a.62());1a.2s.1X(f,1C);f.1t=X;f.1g=0;f.1i=0;f.1K=N 23();f.25=N 35();f.M=M};O.19(2s.u,\'M\',{Z:k(){B f.1t},1q:k(D){if(f.1t!==D){f.1t=D;if(f.1t){f.1t.3C(f.8J.1h(f))}I{f.1C.1J(23.8M)}}},1b:K});O.19(1d.u,\'1M\',{Z:k(){B f.1A*R},1q:k(D){f.1A=D.1I(0,R)/R},1b:K});2s.u.2a=k(){f.1s.5A(k(1x){if(1x.2a){1x.2a()}})};2s.u.2j=k(x,y,E,F){f.x=x||0;f.y=y||0;f.1g=E||0;f.1i=F||0};2s.u.1J=k(x,y,E,F){f.1K.x=x;f.1K.y=y;f.1K.E=E;f.1K.F=F;f.3D()};2s.u.4n=k(){f.fi.x=H.2r(-f.25.x);f.fi.y=H.2r(-f.25.y);if(!f.fd){f.iL=X;f.iM(K)}1a.2s.u.4n.1X(f)};2s.u.8J=k(){f.1C.4a=f.1t.4a;f.3D()};2s.u.3D=k(){o 2n=f.1K.5k();if(2n.E===0&&2n.F===0&&f.1t){2n.E=f.1t.E;2n.F=f.1t.F}o fg=f.1C.6X;f.1C.6X=2n;f.1C.1J(2n);f.1C.6X=fg;f.fd=X};k 3m(){f.1j.2p(f,2h)}3m.u=O.2N(1a.1d.u);3m.u.2f=3m;3m.u.1j=k(){o 1C=N 1a.94(N 1a.62());1a.1d.1X(f,1C);f.1t=N Y(1,1);f.1C.4a=f.1t.4a;f.1C.1J(N 23(0,0,1,1));f.8z.x=G.E;f.8z.y=G.F;f.1M=0;f.52=-1;f.51=-1;f.4Z=-1;f.82=\'\';f.fl()};O.19(3m.u,\'1M\',{Z:k(){B f.1A*R},1q:k(D){f.1A=D.1I(0,R)/R},1b:K});3m.u.fl=k(){f.8Q(0,0,0)};3m.u.iH=k(){f.8Q(R,R,R)};3m.u.8Q=k(r,g,{if(f.52!==r||f.51!==g||f.4Z!=={r=H.2r(r||0).1I(0,R);g=H.2r(g||0).1I(0,R);b=H.2r(b||0).1I(0,R);f.52=r;f.51=g;f.4Z=b;f.82=22.50(r,g,;f.1t.71(f.82)}};3m.u.4h=k(T){if(f.2B&&f.1A>0){o C=T.C;o t=f.6K;o r=T.eJ;C.ai(t.a,t.b,t.c,t.d,t.1U*r,t.1Z*r);C.1S=1a.iG[f.iC];C.3d=f.1A;C.1Q=f.82;C.1O(0,0,G.E,G.F)}};k 1o(){f.1j.2p(f,2h)}1o.u=O.2N(1a.3s.u);1o.u.2f=1o;1o.u.1j=k(){1a.3s.1X(f);f.6c=K;f.2t=X;f.1g=0;f.1i=0;f.3P=N 23();f.36=R;f.6h=0;f.5F=18;f.3n=4;f.3Q=[0,0,0];f.3R=X;f.3T=X;f.4A=X;f.6t=X;f.3j=X;f.iB=[];f.3O=X;f.f0();f.25=N 35();f.9v=K;f.fx=P;f.fL=P;f.az=P};O.19(1o.u,\'iD\',{Z:k(){B f.2t},1q:k(D){if(f.2t!==D){f.2t=D;f.2t.3C(f.eX.1h(f))}},1b:K});O.19(1o.u,\'iE\',{Z:k(){B f.3j.M},1q:k(D){f.3j.M=D},1b:K});O.19(1o.u,\'E\',{Z:k(){B f.1g},1q:k(D){f.1g=D;f.4U()},1b:K});O.19(1o.u,\'F\',{Z:k(){B f.1i},1q:k(D){f.1i=D;f.4U()},1b:K});O.19(1o.u,\'9f\',{Z:k(){B f.5F},1q:k(D){f.5F=D;f.4U()},1b:K});O.19(1o.u,\'4m\',{Z:k(){B f.3n},1q:k(D){f.3n=D;f.4U()},1b:K});O.19(1o.u,\'1M\',{Z:k(){B f.3R.1A*R},1q:k(D){f.3R.1A=D.1I(0,R)/R},1b:K});O.19(1o.u,\'iF\',{Z:k(){B f.3T.1A*R},1q:k(D){f.3T.1A=D.1I(0,R)/R},1b:K});O.19(1o.u,\'fw\',{Z:k(){B f.3j.1A*R},1q:k(D){f.3j.1A=D.1I(0,R)/R},1b:K});O.19(1o.u,\'aP\',{Z:k(){B f.36},1q:k(D){if(f.36!==D){f.36=D.1I(0,R);f.3R.8z.y=f.36/R;f.3R.y=f.F/2*(1-f.36/R)}},1b:K});1o.u.2a=k(){if(f.9v){f.6h++}f.1s.5A(k(1x){if(1x.2a){1x.2a()}})};1o.u.2j=k(x,y,E,F){f.x=x||0;f.y=y||0;if(f.1g!==E||f.1i!==F){f.1g=E||0;f.1i=F||0;f.4U()}};1o.u.5K=k(){B f.36>=R};1o.u.iN=k(){B f.36<=0};1o.u.iO=k(x,y,E,F){o cx=H.1u(x||0);o cy=H.1u(y||0);o cw=H.1u(E||0);o ch=H.1u(F||0);o 55=f.3P;if(55.x!==cx||55.y!==cy||55.E!==cw||55.F!==ch){f.3P.x=cx;f.3P.y=cy;f.3P.E=cw;f.3P.F=ch;f.9x()}};1o.u.eM=k(r,g,{o 1F=f.3Q;if(r!==1F[0]||g!==1F[1]||b!==1F[2]){f.3Q=[r,g,b];f.97()}};1o.u.iX=k(1x){o fb=f.1s.9r(f.3R);B f.iW(1x,fb+1)};1o.u.4n=k(){f.fJ();f.fG();f.eS();f.fH();1a.3s.u.4n.1X(f)};1o.u.f0=k(){f.3R=N 1a.3s();f.3T=N 1d();f.4A=N 1d();f.6t=N 1d();f.3j=N 1d();f.4F=N 1d();f.4E=N 1d();f.3O=N 1d();f.3T.M=N Y(1,1);f.3T.1A=8X/R;f.2D(f.3R);f.3R.2D(f.3T);f.3R.2D(f.6t);f.2D(f.4A);f.2D(f.3j);f.2D(f.4F);f.2D(f.4E);f.2D(f.3O)};1o.u.eX=k(){f.4U()};1o.u.4U=k(){f.97();f.fv();f.9x();f.f5();f.fO();f.fS()};1o.u.97=k(){o m=f.3n;o w=f.1g-m*2;o h=f.1i-m*2;o M=N Y(w,h);f.3T.M=M;f.3T.1J(0,0,w,h);f.3T.2j(m,m);if(w>0&&h>0&&f.2t){o p=96;M.1D(f.2t,0,0,p,p,0,0,w,h);1e(o y=0;y<h;y+=p){1e(o x=0;x<w;x+=p){M.1D(f.2t,0,p,p,p,x,y,p,p)}}o 1F=f.3Q;M.9L(1F[0],1F[1],1F[2])}};1o.u.fv=k(){o w=f.1g;o h=f.1i;o m=24;o M=N Y(w,h);f.6t.M=M;f.6t.1J(0,0,w,h);if(w>0&&h>0&&f.2t){o 1Y=f.2t;o p=96;o q=96;M.1D(1Y,p+m,0+0,p-m*2,m,m,0,w-m*2,m);M.1D(1Y,p+m,0+q-m,p-m*2,m,m,h-m,w-m*2,m);M.1D(1Y,p+0,0+m,m,p-m*2,0,m,m,h-m*2);M.1D(1Y,p+q-m,0+m,m,p-m*2,w-m,m,m,h-m*2);M.1D(1Y,p+0,0+0,m,m,0,0,m,m);M.1D(1Y,p+q-m,0+0,m,m,w-m,0,m,m);M.1D(1Y,p+0,0+q-m,m,m,0,h-m,m,m);M.1D(1Y,p+q-m,0+q-m,m,m,w-m,h-m,m,m)}};1o.u.9x=k(){o 4V=f.5F;o x=f.3P.x+4V-f.25.x;o y=f.3P.y+4V-f.25.y;o w=f.3P.E;o h=f.3P.F;o m=4;o 3h=H.1v(x,4V);o 3i=H.1v(y,4V);o 2G=x-3h;o 2F=y-3i;o 4v=H.4b(w,f.1g-4V-3h);o h2=H.4b(h,f.1i-4V-3i);o M=N Y(4v,h2);f.4A.M=M;f.4A.1J(0,0,4v,h2);f.4A.2j(3h,3i);if(w>0&&h>0&&f.2t){o 1Y=f.2t;o p=96;o q=48;M.1D(1Y,p+m,p+m,q-m*2,q-m*2,2G+m,2F+m,w-m*2,h-m*2);M.1D(1Y,p+m,p+0,q-m*2,m,2G+m,2F+0,w-m*2,m);M.1D(1Y,p+m,p+q-m,q-m*2,m,2G+m,2F+h-m,w-m*2,m);M.1D(1Y,p+0,p+m,m,q-m*2,2G+0,2F+m,m,h-m*2);M.1D(1Y,p+q-m,p+m,m,q-m*2,2G+w-m,2F+m,m,h-m*2);M.1D(1Y,p+0,p+0,m,m,2G+0,2F+0,m,m);M.1D(1Y,p+q-m,p+0,m,m,2G+w-m,2F+0,m,m);M.1D(1Y,p+0,p+q-m,m,m,2G+0,2F+h-m,m,m);M.1D(1Y,p+q-m,p+q-m,m,m,2G+w-m,2F+h-m,m,m)}};1o.u.f5=k(){f.3j.2j(f.9f,f.9f)};1o.u.fO=k(){o w=f.1g;o h=f.1i;o p=24;o q=p/2;o 2R=96+p;o 2S=0+p;f.4F.M=f.2t;f.4F.5X.x=0.5;f.4F.5X.y=0.5;f.4F.1J(2R+q,2S+q+p,p,q);f.4F.2j(w/2,h-q);f.4E.M=f.2t;f.4E.5X.x=0.5;f.4E.5X.y=0.5;f.4E.1J(2R+q,2S,p,q);f.4E.2j(w/2,q)};1o.u.fS=k(){o 2R=as;o 2S=96;o p=24;f.3O.M=f.2t;f.3O.5X.x=0.5;f.3O.5X.y=1;f.3O.2j(f.1g/2,f.1i);f.3O.1J(2R,2S,p,p);f.3O.1A=0};1o.u.fJ=k(){o 7R=f.6h%40;o 7O=f.fw;if(f.9v){if(7R<20){7O-=7R*8}I{7O-=(40-7R)*8}}f.4A.1A=7O/R;f.4A.2B=f.5K()};1o.u.fH=k(){o w=f.1g-f.5F*2;o h=f.1i-f.5F*2;if(w>0&&h>0){f.3j.1J(f.25.x,f.25.y,w,h);f.3j.2B=f.5K()}I{f.3j.2B=P}};1o.u.fG=k(){f.4F.2B=f.5K()&&f.fx;f.4E.2B=f.5K()&&f.fL};1o.u.eS=k(){o 11=f.3O;o x=H.1u(f.6h/16)%2;o y=H.1u(f.6h/16/2)%2;o 2R=as;o 2S=96;o p=24;if(!f.az){11.1A=0}I if(11.1A<1){11.1A=H.4b(11.1A+0.1,1)}11.1J(2R+x*p,2S+y*p,p,p);11.2B=f.5K()};k 2q(){f.1j.2p(f,2h)}2q.u=O.2N(1a.3s.u);2q.u.2f=2q;2q.u.1j=k(){1a.3s.1X(f);f.1g=0;f.1i=0;f.4J=X;f.7g=X;f.e1=[1,0,0,0,1,0,0,0,1];f.dH=N 1d(N Y(1,1))};O.19(2q.u,\'E\',{Z:k(){B f.1g},1q:k(D){f.1g=D},1b:K});O.19(2q.u,\'F\',{Z:k(){B f.1i},1q:k(D){f.1i=D},1b:K});2q.u.2j=k(x,y,E,F){f.x=x;f.y=y;f.E=E;f.F=F};2q.u.2a=k(){f.1s.5A(k(1x){if(1x.2a){1x.2a()}})};2q.u.4h=k(T){if(!f.2B){B}if(!f.4J){f.4J=V.2m(\'1z\')}f.4J.E=G.E;f.4J.F=G.F;o dL=T.C;o C=f.4J.3x(\'2d\');C.3B();C.4z(0,0,G.E,G.F);C.dP();C.55(f.x,f.y,f.E,f.F);C.iY();C.iZ();T.C=C;1e(o i=0;i<f.1s.1k;i++){o 1x=f.1s[i];if(1x.6c&&1x.2B&&1x.aP>0){f.dK(T,1x);C.3B();1x.4h(T);C.3y()}}C.3y();T.C=dL;T.C.ai(1,0,0,1,0,0);T.C.1S=\'21-7D\';T.C.3d=1;T.C.2M(f.4J,0,0);1e(o j=0;j<f.1s.1k;j++){if(!f.1s[j].6c){f.1s[j].4h(T)}}};2q.u.dK=k(T,1E){o 7I=f.x+1E.x;o 7J=f.y+1E.y+1E.F/2*(1-1E.36/R);o 7L=1E.E;o 7K=1E.F*1E.36/R;T.C.4z(7I,7J,7L,7K)};2q.u.4N=k(T){if(!f.2B){B}o gl=T.gl;if(!f.7g){f.7g=gl.jW()}f.dH.4N(T);T.2A.3b();gl.iV(gl.dI);gl.2b(gl.iU);f.dJ(T);T.2A.5a();1e(o i=f.1s.1k-1;i>=0;i--){o 1x=f.1s[i];if(1x.6c&&1x.2B&&1x.aP>0){gl.dU(gl.dV,0,dW);1x.4N(T);T.2A.3b();f.eT(T,1x);T.2A.5a()}}gl.iQ(gl.dI);1e(o j=0;j<f.1s.1k;j++){if(!f.1s[j].6c){f.1s[j].4N(T)}}};2q.u.dJ=k(T){o dR=f.x;o dQ=f.y;o 3h=f.x+f.E;o 3i=f.y+f.F;f.5W(T,0,0,G.E,dQ);f.5W(T,0,3i,G.E,G.F-3i);f.5W(T,0,0,dR,G.F);f.5W(T,3h,0,G.E-3h,G.F)};2q.u.eT=k(T,1E){o 7I=f.x+1E.x;o 7J=f.y+1E.y+1E.F/2*(1-1E.36/R);o 7L=1E.E;o 7K=1E.F*1E.36/R;f.5W(T,7I,7J,7L,7K)};2q.u.5W=k(T,x,y,w,h){if(w>0&&h>0){o gl=T.gl;o 72=T.72;o 1H=T.1H;o 4y=T.dZ.iP;T.dZ.iR(4y);gl.iS(4y.iT,P,f.e1);gl.iA(4y.iz,1);gl.dT(4y.ie,72.x,-72.y);gl.dT(4y.ic,-1H.x,-1H.y);gl.dU(gl.dV,0,dW);gl.dl(gl.6v,gl.6v,gl.ig);o 2u=N ih([x,y,x+w,y,x,y+h,x,y+h,x+w,y,x+w,y+h]);gl.ii(gl.dD,f.7g);gl.ib(gl.dD,2u,gl.ia);gl.i5(4y.dj);gl.i4(4y.dj,2,gl.i6,P,0,0);gl.i7(gl.i9,0,6);gl.dl(gl.6v,gl.6v,gl.6v)}};k 2c(){f.1j.2p(f,2h)}2c.u=O.2N(1a.3s.u);2c.u.2f=2c;2c.u.1j=k(){1a.3s.1X(f);f.1g=G.E;f.1i=G.F;f.5q=[];f.dg();f.de();f.2w=\'6r\';f.b6=0;f.25=N 35()};2c.u.2a=k(){f.df();f.dn()};2c.u.dg=k(){f.9R=N Y(1,60);f.9R.71(\'3K\');f.9V=N Y(2,6d);f.9V.71(\'3K\');f.9Z=N Y(9,9);f.9Z.db(4,4,4,\'3K\')};2c.u.de=k(){f.8D=N 3m();f.8D.8Q(80,80,80);f.2D(f.8D)};2c.u.df=k(){f.8D.1M=H.1u(f.b6*6)};2c.u.dn=k(){o b5=H.1u(f.b6*10);3e(f.5q.1k<b5){f.do()}3e(f.5q.1k>b5){f.dz()}f.5q.5A(k(11){f.dC(11);11.x=11.ax-f.25.x;11.y=11.ay-f.25.y},f)};2c.u.do=k(){o 11=N 1d(f.i8);11.1M=0;f.5q.29(11);f.2D(11)};2c.u.dz=k(){f.ij(f.5q.ik())};2c.u.dC=k(11){8F(f.2w){2v\'iv\':f.du(11);3a;2v\'iu\':f.dp(11);3a;2v\'iw\':f.dr(11);3a}if(11.1M<40){f.dt(11)}};2c.u.du=k(11){11.M=f.9R;11.3V=H.5U/16;11.ax-=6*H.8y(11.3V);11.ay+=6*H.8w(11.3V);11.1M-=6};2c.u.dp=k(11){11.M=f.9V;11.3V=H.5U/8;11.ax-=8*H.8y(11.3V);11.ay+=8*H.8w(11.3V);11.1M-=8};2c.u.dr=k(11){11.M=f.9Z;11.3V=H.5U/16;11.ax-=3*H.8y(11.3V);11.ay+=3*H.8w(11.3V);11.1M-=3};2c.u.dt=k(11){11.ax=H.7Y(G.E+6d)-6d+f.25.x;11.ay=H.7Y(G.F+e4)-e4+f.25.y;11.1M=ix+H.7Y(60)};k 3N(){1a.eE.1X(f);f.1j.2p(f,2h)}3N.u=O.2N(1a.eE.u);3N.u.2f=3N;3N.u.1j=k(){f.iy=[f];f.9K={4W:{2w:\'eA\',D:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}};f.it=[\'ir im il;\',\'eB io eG;\',\'eB ip iq;\',\'ew eA 4W;\',\'ew j1 ez;\',\'ex j2(ex) {\',\' jD = jC(ez, eG) * 4W;\',\'}\']};3N.u.jE=k(){f.9K.4W.D=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]};3N.u.jF=k(D){D=(D||0)/eH;if(D!==0){o c=H.8w(D*H.5U);o s=H.8y(D*H.5U);o 8m=0.3l+c*0.9J-s*0.3l;o 8n=0.2V-c*0.2V-s*0.2V;o 8p=0.3g-c*0.3g+s*0.9M;o 8o=0.3l-c*0.3l+s*0.jG;o 73=0.2V+c*0.eO+s*0.jB;o 8j=0.3g-c*0.3g-s*0.jA;o 8l=0.3l-c*0.3l-s*0.9J;o 8q=0.2V-c*0.2V+s*0.2V;o 8r=0.3g+c*0.9M+s*0.3g;f.8x([8m,8n,8p,0,8o,73,8j,0,8l,8q,8r,0,0,0,0,1])}};3N.u.jw=k(D){D=(D||0).1I(-R,R)/R;if(D!==0){o a=1+D;o 8m=0.3l+0.9J*a;o 8n=0.2V-0.2V*a;o 8p=0.3g-0.3g*a;o 8o=0.3l-0.3l*a;o 73=0.2V+0.eO*a;o 8j=0.3g-0.3g*a;o 8l=0.3l-0.3l*a;o 8q=0.2V-0.2V*a;o 8r=0.3g+0.9M*a;f.8x([8m,8n,8p,0,8o,73,8j,0,8l,8q,8r,0,0,0,0,1])}};3N.u.9L=k(r,g,{r=(r||0).1I(-R,R)/R;g=(g||0).1I(-R,R)/R;b=(b||0).1I(-R,R)/R;if(r!==0||g!==0||b!==0){f.8x([1,0,0,r,0,1,0,g,0,0,1,b,0,0,0,1])}};3N.u.8x=k(4W){o D=f.9K.4W.D;o a2=[];1e(o i=0;i<4;i++){1e(o m=0;m<4;m++){a2[m]=D[i*4+m]}1e(o j=0;j<4;j++){o ak=0;1e(o n=0;n<4;n++){ak+=4W[n*4+j]*a2[n]}D[i*4+j]=ak}}};k 3Z(){f.1j.2p(f,2h)}3Z.u=O.2N(1a.eN.u);3Z.u.2f=3Z;3Z.u.1j=k(){1a.eN.1X(f);f.2b()};3Z.u.2b=k(){f.52=0;f.51=0;f.4Z=0;f.8S=0};3Z.u.eM=k(r,g,b,7Z){f.52=H.2r(r||0).1I(-R,R);f.51=H.2r(g||0).1I(-R,R);f.4Z=H.2r(b||0).1I(-R,R);f.8S=H.2r(7Z||0).1I(0,R)};3Z.u.4h=k(T){if(f.2B){o C=T.C;o t=f.6K;o r=T.eJ;o E=G.E;o F=G.F;C.3B();C.ai(t.a,t.b,t.c,t.d,t.1U*r,t.1Z*r);if(G.ar()&&f.8S>0){C.1S=\'aq\';C.3d=f.8S/R;C.1Q=\'#7i\';C.1O(0,0,E,F)}C.3d=1;o 6W=H.1v(0,f.52);o g1=H.1v(0,f.51);o b1=H.1v(0,f.4Z);if(6W||g1||b1){C.1S=\'6S\';C.1Q=22.50(6W,g1,b1);C.1O(0,0,E,F)}if(G.ao()){o 6P=H.1v(0,-f.52);o g2=H.1v(0,-f.51);o b2=H.1v(0,-f.4Z);if(6P||g2||b2){C.1S=\'6H\';C.1Q=\'#7i\';C.1O(0,0,E,F);C.1S=\'6S\';C.1Q=22.50(6P,g2,b2);C.1O(0,0,E,F);C.1S=\'6H\';C.1Q=\'#7i\';C.1O(0,0,E,F)}}C.3y()}};3Z.u.4N=k(T){};k 4L(){f.1j.2p(f,2h)}4L.u=O.2N(1a.4L.u);4L.u.2f=4L;4L.u.1j=k(){1a.4L.1X(f);f.jv=P};k Q(){f.1j.2p(f,2h)}Q.u.1j=k(1V){if(!Q.3f){Q.1j()}f.2b();f.6q(1V);f.4e=1V};Q.1f=X;Q.4c=X;Q.3f=P;Q.4i=P;Q.1j=k(e8){if(!f.3f){if(!e8){f.eh();f.er();f.ei();f.3S()}f.3f=K}B!!f.1f};Q.jx=k(){if(!f.3f){f.1j()}B!!f.es};Q.jy=k(){if(!f.3f){f.1j()}B!!f.en};Q.eh=k(){6m{if(7t ep!==\'6D\'){f.1f=N ep()}I if(7t eq!==\'6D\'){f.1f=N eq()}}6u(e){f.1f=X}};Q.er=k(){o 4H=V.2m(\'4H\');if(4H.7w){f.es=4H.7w(\'4H/jz\');f.en=4H.7w(\'4H/jH\')}};Q.ei=k(){o C=Q.1f;if(C){f.4c=C.eR();f.4c.1N.D=1;f.4c.8s(C.ek)}};Q.3S=k(){V.1P(\'8T\',f.5x.1h(f));V.1P(\'eU\',f.83.1h(f))};Q.5x=k(){o C=Q.1f;if(C&&!f.4i){o el=C.eK();el.5a(0);f.4i=K}};Q.83=k(){if(V.ff===\'fe\'){f.8a()}I{f.79()}};Q.8a=k(){if(f.ac()){f.ej(1)}};Q.79=k(){if(f.ac()){f.em(0.5)}};Q.ac=k(){B 22.9a()};Q.em=k(2e){if(f.4c){o 1N=f.4c.1N;o 1T=Q.1f.1T;1N.7N(1N.D,1T);1N.7M(1,1T+2e)}};Q.ej=k(2e){if(f.4c){o 1N=f.4c.1N;o 1T=Q.1f.1T;1N.7N(1N.D,1T);1N.7M(0,1T+2e)}};Q.u.2b=k(){f.3b();f.89=X;f.2g=X;f.2T=X;f.4l=X;f.8f=0;f.5Z=0;f.4C=0;f.3U=0;f.86=0;f.2I=1;f.4g=1;f.8P=0;f.6p=X;f.3c=[];f.6I=[];f.4f=P;f.3k=P};O.19(Q.u,\'1V\',{Z:k(){B f.4e},1b:K});O.19(Q.u,\'2U\',{Z:k(){B f.2I},1q:k(D){f.2I=D;if(f.2T){f.2T.1N.D=f.2I}},1b:K});O.19(Q.u,\'jI\',{Z:k(){B f.4g},1q:k(D){if(f.4g!==D){f.4g=D;if(f.aQ()){f.4j(f.2g.2i,0)}}},1b:K});O.19(Q.u,\'jR\',{Z:k(){B f.8P},1q:k(D){f.8P=D;f.b0()},1b:K});Q.u.3W=k(){B!!f.89};Q.u.aI=k(){B f.4f};Q.u.aQ=k(){B!!f.2g};Q.u.4j=k(2i,1H){if(f.3W()){1H=1H||0;f.8L(2i,1H)}I if(Q.1f){f.3k=K;f.3C(k(){if(f.3k){f.4j(2i,1H)}}.1h(f))}};Q.u.3b=k(){f.3k=P;f.9S();f.9H();if(f.6I){3e(f.6I.1k>0){o 2Q=f.6I.5v();2Q()}}};Q.u.6n=k(2e){if(f.3W()){if(f.2T){o 1N=f.2T.1N;o 1T=Q.1f.1T;1N.7N(0,1T);1N.7M(f.2I,1T+2e)}}I if(f.3k){f.3C(k(){f.6n(2e)}.1h(f))}};Q.u.f6=k(2e){if(f.2T){o 1N=f.2T.1N;o 1T=Q.1f.1T;1N.7N(1N.D,1T);1N.7M(0,1T+2e)}f.3k=P};Q.u.fu=k(){if(Q.1f){o 7H=(Q.1f.1T-f.86)*f.4g;if(f.3U>0){3e(7H>=f.4C+f.3U){7H-=f.3U}}B 7H}I{B 0}};Q.u.3C=k(2Q){f.3c.29(2Q)};Q.u.jQ=k(2Q){f.6I.29(2Q)};Q.u.6q=k(1V){if(Q.1f){o 2y=N e5();2y.e6(\'ea\',1V);2y.jS=\'jT\';2y.eb=k(){if(2y.jU<jP){f.ed(2y)}}.1h(f);2y.a8=k(){f.4f=K}.1h(f);2y.ee()}};Q.u.ed=k(2y){o 1c=N ec(2y.eu);f.di(1c);Q.1f.jO(2y.eu,k(8d){f.89=8d;f.8f=8d.2e;if(f.3U>0&&f.5Z>0){f.4C/=f.5Z;f.3U/=f.5Z}I{f.4C=0;f.3U=f.8f}f.5s()}.1h(f))};Q.u.8L=k(2i,1H){f.9S();f.9H();f.eL();f.eP();f.2g.2i=2i;f.2g.5a(0,1H);f.86=Q.1f.1T-1H/f.4g;f.eD()};Q.u.eL=k(){o C=Q.1f;f.2g=C.eK();f.2g.8d=f.89;f.2g.jK=f.4C;f.2g.jJ=f.4C+f.3U;f.2g.jL.D=f.4g;f.2T=C.eR();f.2T.1N.D=f.2I;f.4l=C.jM();f.4l.jN=\'ju\';f.b0()};Q.u.eP=k(){f.2g.8s(f.2T);f.2T.8s(f.4l);f.4l.8s(Q.4c)};Q.u.9H=k(){if(f.2g){f.2g.3b(0);f.2g=X;f.2T=X;f.4l=X}};Q.u.eD=k(){if(f.2g&&!f.2g.2i){o 8A=f.86+f.8f/f.4g;o ds=8A-Q.1f.1T;f.6p=jt(k(){f.3b()}.1h(f),ds*fE)}};Q.u.9S=k(){if(f.6p){jb(f.6p);f.6p=X}};Q.u.b0=k(){if(f.4l){o x=f.8P;o z=1-H.6U(x);f.4l.ja(x,0,z)}};Q.u.5s=k(){3e(f.3c.1k>0){o 2Q=f.3c.5v();2Q()}};Q.u.di=k(1c){f.dm(1c);f.dS(1c)};Q.u.dm=k(1c){o 1p=0;3e(1p<1c.1k){if(f.5S(1c,1p)===\'jc\'){1p+=26;o bb=P;o aW=1c[1p++];o 7e=[];1e(o i=0;i<aW;i++){7e.29(1c[1p++])}1e(i=0;i<aW;i++){if(f.5S(1c,1p+1)===\'jd\'){o bf=1c[1p];if(bf===1){f.5Z=f.dM(1c,1p+12)}I if(bf===3){f.aR(1c,1p,7e[i])}bb=K}1p+=7e[i]}if(!bb){3a}}I{3a}}};Q.u.dS=k(1c){if(f.5S(1c,4)===\'je\'){o 1p=0;3e(1p<1c.1k){o 5I=f.9h(1c,1p);o 1y=f.5S(1c,1p+4);if(1y===\'j9\'){1p+=8}I{if(1y===\'j8\'){f.5Z=f.9h(1c,1p+20)}if(1y===\'j4\'||1y===\'j3\'){f.aR(1c,1p,5I)}1p+=5I;if(5I<=1){3a}}}}};Q.u.aR=k(1c,1p,5I){1e(o i=1p;i<1p+5I-10;i++){if(f.5S(1c,i)===\'j5\'){o 1n=\'\';3e(1c[i]>0){1n+=58.9l(1c[i++])}if(1n.4x(/aK=([0-9]+)/)){f.4C=7A(dO.$1)}if(1n.4x(/dN=([0-9]+)/)){f.3U=7A(dO.$1)}if(1n==\'aK\'||1n==\'dN\'){o 7z=\'\';i+=16;3e(1c[i]>0){7z+=58.9l(1c[i++])}if(1n==\'aK\'){f.4C=7A(7z)}I{f.3U=7A(7z)}}}}};Q.u.dM=k(1c,1p){B(1c[1p+3]*fm+1c[1p+2]*fy+1c[1p+1]*fF+1c[1p+0])};Q.u.9h=k(1c,1p){B(1c[1p+0]*fm+1c[1p+1]*fy+1c[1p+2]*fF+1c[1p+3])};Q.u.5S=k(1c,1p){o 6e=\'\';1e(o i=0;i<4;i++){6e+=58.9l(1c[1p+i])}B 6e};k U(){3w N 3u(\'59 is a 5i 5b\')}U.3f=P;U.4i=P;U.1m=X;U.2P=X;U.2H=0;U.57=0;U.6z=0;U.8O=X;U.j6=k(1V){if(!f.3f){f.1j()}f.2b();f.4e=1V};U.1j=k(){if(!f.3f){if(!f.1m){6m{f.1m=N j7()}6u(e){f.1m=X}}if(!!f.1m)f.3S();f.3f=K}B!!f.1m};U.3S=k(){V.1P(\'8T\',f.5x.1h(f));V.1P(\'eU\',f.83.1h(f));f.1m.1P("jf",f.fh.1h(f));f.1m.1P("jg",f.84.1h(f));f.1m.1P("jp",f.fk.1h(f))};U.5x=k(){if(f.1m&&!f.4i){if(f.2Z){f.6q(f.4e);f.4i=K}I{if(f.8O){f.1m.3p=f.8O;f.1m.2U=0;f.1m.2i=P;f.1m.4j();f.4i=K}}}};U.83=k(){if(V.ff===\'fe\'){f.8a()}I{f.79()}};U.fh=k(){f.9t=K;if(f.4i)f.5s()};U.84=k(){f.4f=K};U.fk=k(){if(!f.1m.2i){f.3b()}};U.8a=k(){f.1m.2U=0;f.2H=0};U.79=k(){f.6n(0.5)};U.2b=k(){f.3b();f.2I=1;f.3c=[];f.4f=P;f.3k=P;f.2Z=P;f.9t=P};U.jo=k(1V){if(!f.3f){f.1j();f.2b()}f.8O=1V};O.19(U,\'1V\',{Z:k(){B U.4e},1b:K});O.19(U,\'2U\',{Z:k(){B U.2I}.1h(f),1q:k(D){U.2I=D;if(U.1m){U.1m.2U=f.2I}},1b:K});U.3W=k(){B f.9t};U.aI=k(){B f.4f};U.aQ=k(){B!f.1m.jq};U.4j=k(2i,1H){if(f.3W()){1H=1H||0;f.8L(2i,1H)}I if(U.1m){f.3k=K;f.3C(k(){if(f.3k){f.4j(2i,1H);if(f.2P){6B(f.2P);f.2P=X}}}.1h(f));if(!f.2Z)f.6q(f.4e)}};U.3b=k(){if(f.1m)f.1m.az();f.3k=P;if(f.aA){6B(f.aA);f.aA=X;f.1m.2U=0}};U.6n=k(2e){if(f.3W()){if(f.1m){f.57=f.2I;f.2H=0;f.a1(2e)}}I if(f.3k){f.3C(k(){f.6n(2e)}.1h(f))}};U.f6=k(2e){if(f.1m){f.57=0;f.2H=f.2I;f.a1(2e)}};U.fu=k(){if(f.1m){B f.1m.1T}I{B 0}};U.3C=k(2Q){f.3c.29(2Q)};U.6q=k(1V){if(f.1m){f.2Z=K;f.1m.3p=1V;f.1m.9Q()}};U.8L=k(2i,1H){f.1m.2i=2i;if(f.2P){6B(f.2P);f.2P=X}if(f.1m){f.1m.2U=f.2I;f.1m.1T=1H;f.1m.4j()}};U.5s=k(){f.2Z=P;3e(f.3c.1k>0){o 8t=f.3c.5v();8t()}};U.a1=k(2e){f.1m.2U=f.2H;if(f.2P){6B(f.2P);f.2P=X}f.6z=(f.57-f.2H)/(60*2e);f.2P=jr(k(){U.fK(U.57)},fE/60)};U.fK=k(2U){U.2H+=U.6z;if(U.2H<0&&U.6z<0){U.2H=0}I if(U.2H>2U&&U.6z>0){U.2H=2U}if(H.6U(U.57-U.2H)<0.js){U.2H=U.57;6B(U.2P);U.2P=X}U.1m.2U=U.2H};k 44(){3w N 3u(\'59 is a 5i 5b\')}44.cu=6d;44.aJ=k(3X){B cq.aJ(f.aT(3X))};44.aL=k(cr){B f.bd(cq.aL(cr))};44.jn=k(3X){B f.aL(f.aJ(3X))};44.aT=k(D,5j){5j=5j||0;if(++5j>=f.cu){3w N 3u(\'O jm ji\')}o 2w=O.u.b9.1X(D);if(2w===\'[3X O]\'||2w===\'[3X 3L]\'){o 7u=f.cS(D);if(7u!==\'O\'&&7u!==\'3L\'){D[\'@\']=7u}1e(o 31 in D){if(D.a9(31)){D[31]=f.aT(D[31],5j+1)}}}5j--;B D};44.bd=k(D){o 2w=O.u.b9.1X(D);if(2w===\'[3X O]\'||2w===\'[3X 3L]\'){if(D[\'@\']){o 2f=1E[D[\'@\']];if(2f){D=f.bF(D,2f.u)}}1e(o 31 in D){if(D.a9(31)){D[31]=f.bd(D[31])}}}B D};44.cS=k(D){o 1y=D.2f.1y;if(1y===6D){o bw=/^\\s*k\\s*([A-jh-jj-jk$]*)/;1y=bw.jl(D.2f)[1]}B 1y};44.bF=k(D,u){if(O.c8!==6D){O.c8(D,u)}I if(\'c7\'in D){D.c7=u}I{o aa=O.2N(u);1e(o 31 in D){if(D.a9(31)){aa[31]=D[31]}}D=aa}B D};', 62, 1317, '|||||||||||||||this|||||function||||var||||||prototype|||||||return|context|value|width|height|Graphics|Math|else|tileId|true|Tilemap|bitmap|new|Object|false|WebAudio|255|style|renderSession|Html5Audio|document|event|null|Bitmap|get||sprite||||||||defineProperty|PIXI|configurable|array|Sprite|for|_context|_width|bind|_height|initialize|length|_canvas|_audioElement|text|Window|index|set|TouchInput|children|_bitmap|floor|max|Input|child|name|canvas|alpha|w1|texture|blt|window|tone|_events|offset|clamp|setFrame|_frame|element|opacity|gain|fillRect|addEventListener|fillStyle|color|globalCompositeOperation|currentTime|tx|url|_video|call|skin|ty||source|Utils|Rectangle||origin||||push|update|clear|Weather||duration|constructor|_sourceNode|arguments|loop|move|_tileWidth|_tileHeight|createElement|frame|div|apply|WindowLayer|round|TilingSprite|_windowskin|data|case|type|keyName|xhr|_pressedTime|spriteBatch|visible|body|addChild|_fpsMeter|oy|ox|_tweenGain|_volume|box|pixels|kind|drawImage|create|_errorPrinter|_gainTweenInterval|listner|sx|sy|_gainNode|volume|715|_upperCanvas|_setDirty|setNumber|_isLoading||key||||Point|_openness||||break|stop|_loadListeners|globalAlpha|while|_initialized|072|x2|y2|_windowContentsSprite|_autoPlay|213|ScreenSprite|_margin|maxWidth|src|lowerTiles|upperTiles|DisplayObjectContainer|touch|Error|_renderer|throw|getContext|restore|startY|left|save|addLoadListener|_refresh|TILE_ID_A1|mx|font|newState|isPressed|my|white|Array|startX|ToneFilter|_windowPauseSignSprite|_cursorRect|_colorTone|_windowSpriteContainer|_setupEventHandlers|_windowBackSprite|_loopLength|rotation|isReady|object|pageToCanvasX|ToneSprite||gamepad|buttonName|appendChild|JsonEx||_currentState|pageToCanvasY||dy1|baseTexture|min|_masterGainNode|getAutotileKind|_url|_hasError|_pitch|_renderCanvas|_unlocked|play|table|_pannerNode|margin|updateTransform|array1|_tintTexture|keyCode|escape|pageX|pageY|preventDefault|w2|dx1|match|shader|clearRect|_windowCursorSprite|_baseTexture|_loopStart|_image|_upArrowSprite|_downArrowSprite|_realScale|audio|_loadingImage|_tempCanvas|stage|Stage|zIndex|_renderWebGL|_latestButton|elements|autotileTable|mod|_readMapData|getImageData|_refreshAllParts|pad|matrix|xm|qsy|_blue|rgbToCssColor|_green|_red|bitmaps|array2|rect|agent|_tweenTargetGain|String|This|start|class|shape|_realFrame|1px|tileId0|imageData|right|static|depth|clone|_updateAllElements|grad|top|tempContext|realH|_sprites|realX|_onLoad|realY|_upperLayer|shift|axes|_onTouchStart|shadowBits|_lowerLayer|forEach|realW|_y|isTileA1|navigator|_padding|isTileA2|keyRepeatWait|size|changedTouches|isOpen|_mask|qsx|equals|_lowerBitmap|_date|fontSize|delta|_readFourCharacters|options|PI|_createLayers|_webglMaskRect|anchor|_x|_sampleRate||_blendColor|BaseTexture|sy1|scaleMode|cmax|tempCanvas|rgb|_loadingCount|sx1|isTileA3|_mousePressed|_isWindow|100|string|wheelX|wheelY|_animationCount|isInsideCanvas|_screenPressed|_scale|_isEscapeCompatible|try|fadeIn|threshold|_endTimer|_load|none|_isHigherTile|_windowFrameSprite|catch|KEEP|renderTexture|rgba|_lastTiles|_tweenGainStep|_layerWidth|clearInterval|_offset|undefined|_centerElement|tileId3|sw|difference|_stopListeners|tiles|worldTransform|sh|tileId2|_layerHeight|tileId1|r2|animationFrame|_smooth|lighter|lx|abs|ly|r1|trim|_paintOpacity|isTileA4|keyRepeatInterval|fillAll|projection|a11|upperTileId1|_fpsMeterToggled|_rendered|_skipCount|_triggered|_onShow|_mapData|down|TILE_ID_A2|_isTableTile|segments|up|_vertexBuffer|_preferredAxis|ffffff|_stretchEnabled|absolute|instanceof|layerHeight|padZero|_onCancel|now|maskManager|render|message|typeof|constructorName|_updateVisibility|canPlayType|triggered|getElementsByTagName|text2|parseInt|Date|_upperBitmap|over|resize|layerWidth|isAutotile|pos|rx|ry|rh|rw|linearRampToValueAtTime|setValueAtTime|cursorOpacity|cancelled|button|blinkCount|lowerTileId|moved|released|Number|_modeBox|tileRows|randomInt|gray|||_colorText|_onVisibilityChange|_onError|tileCols|_startTime|||_buffer|_onHide|blur|_onKeyDown|buffer|buttons|_totalTime|ceil|hsl|ok|a12|0px|a20|a00|a01|a10|a02|a21|a22|connect|listener|360|_clearUpperCanvas|cos|_multiplyMatrix|sin|scale|endTime|tileID2|gamepads|_dimmerSprite|frameX|switch|frameY|position|waterSurfaceIndex|_onBitmapLoad|_hiddenCanvas|_startPlaying|emptyRectangle|align|_staticSePath|_pan|setColor|tileID1|_gray|touchstart|isWaterfallTile|bitmapH|TILE_ID_MAX|192|_boxHeight|contains||_onTrigger|_updateRealScale|bitmapW|Texture|WALL_AUTOTILE_TABLE||_refreshBack|||isMobileDevice|FLOOR_AUTOTILE_TABLE|_updateVideo|head|isWallSideTile|padding|measureText|_readBigEndian|_updateUpperCanvas|TILE_ID_A4|userAgent|fromCharCode|getAutotileShape|webgl|TILE_ID_A3|_onRelease|width1|indexOf|width2|_buffered|isWallTopTile|active|_paintUpperCanvas|_refreshCursor|_boxWidth|isTileA5|_updateCanvas|_onMove|imageData1|pageup|_createFontLoader|pagedown|_previousState|_removeNodes|cmin|787|uniforms|adjustTone|928|_updateErrorPrinter|putImageData|_makeFontNameText|load|_rainBitmap|_removeEndTimer|center|textAlign|_stormBitmap|isWebGL|isNwjs|gui|_snowBitmap|imageData2|_startGainTween|temp||result|_writeLastTiles|px|showFps|onerror|hasOwnProperty|newValue|oncontextmenu|_shouldMuteOnHide|videoVisible|_readLastTiles|_drawTile|tableEdgeVirtualId|qsx2|setTransform|scaleModes|val|lineHeight|isTable||canUseDifferenceBlend|auto|saturation|canUseSaturationBlend|144|_canUseSaturationBlend|_released|_wheelX|_wheelY|||pause|_tweenInterval|_moved|isRepeated|isLongPressed|keyMapper|_cancelled|_needsRepaint|spriteId|isError|stringify|LOOPSTART|parse|animationCount|scripts|256|openness|isPlaying|_readMetaData|isTriggered|_encode|_canUseDifferenceBlend|_mapWidth|numSegments|_dir8|_mapHeight|_gamepadStates|_updatePanner||||webGLPixels|maxSprites|power|canvasData|_makeNumpadDirection|toString|_dir4|vorbisHeaderFound|flags|_decode||headerType|_createCanvas|_paintAllTiles|refresh|_lastStartY|_paintTiles|filterManager|_filters|lastLowerTiles|_updateLayerPositions|_lastStartX|_lastAnimationFrame||_onRightButtonDown|_createGameFontLoader|GameFont|120|func|||mode|fontFamily|transparent|webkitCancelFullScreen|msExitFullscreen|control|_resetPrototype|_wrapNwjsAlert|alert|textShadow|_onKeyUp|args|_onLostFocus|innerHTML|_shouldPreventDefault|require|_alert|win|keydown|mozCancelFullScreen|cancelFullScreen|_onWindowResize|_isVideoVisible|_disableTextSelection|_switchFPSMeter|hideFps|_onVideoEnd|_onVideoError|_applyCanvasFilter|_disableContextMenu|8px|_onVideoLoad|_switchStretchMode|_switchFullScreen|__proto__|setPrototypeOf|msRequestFullscreen|_cancelFullScreen|webkitRequestFullScreen|mozRequestFullScreen|_isFullScreen|fullScreenElement|_requestFullScreen|requestFullScreen||_pollGamepads|getGamepads|_rendererType|_counter||Argument|must|_createRenderer|JSON|json|_onTouchCancel|_onPointerDown|maxDepth|slice||||frameW|frameH|_createUpperCanvas|opaque|pushMask|_createVideo|crop|r3|dirty|_needsTint|_createTinter|_executeTint|_onTouchEnd|_onTouchMove|_signX|_signY|cancel|menu|_updateDirection|_getConstructorName|_updateGamepadState|119px|lastState|gamepadMapper|5px|date|_onMouseUp|_onWheel|_createFPSMeter|_updateRenderer|_onMouseMove|_onMiddleButtonDown|_createModeBox|hide|_onMouseDown|_onLeftButtonDown|popMask|TILE_ID_A5|drawCircle|bindFramebuffer|FRAMEBUFFER|_createDimmer|_updateDimmer|_createBitmaps||_readLoopComments|aVertexPosition|_callLoadListeners|stencilOp|_readOgg|_updateAllSprites|_addSprite|_updateStormSprite|outlineColor|_updateSnowSprite|delay|_rebornSprite|_updateRainSprite|outlineWidth||||_removeSprite|textColor|_drawTextBody|_updateSprite|ARRAY_BUFFER|tickStart|Image|lastScript|_dummySprite|STENCIL_TEST|_webglMaskOutside|_canvasClearWindowRect|realCanvasContext|_readLittleEndian|LOOPLENGTH|RegExp|beginPath|y1|x1|_readMp4|uniform2f|stencilFunc|EQUAL|0xFF|startTime|elapsed|shaderManager|frameCount|_translationMatrix|_maxSkip|_drawTextOutline|200|XMLHttpRequest|open|addColorStop|noAudio|color1|GET|onload|Uint8Array|_onXhrLoad|send|color2|createLinearGradient|_createContext|_createMasterGainNode|_fadeOut|destination|node|_fadeIn|_canPlayM4a|vertical|AudioContext|webkitAudioContext|_detectCodecs|_canPlayOgg|radius|response|hslToRgb|uniform|void|rgbToHsl|uSampler|mat4|varying|fontFace|_createEndTimer|AbstractFilter|fontItalic|vTextureCoord|180|NEAREST|resolution|createBufferSource|_createNodes|setTone|DisplayObject|285|_connectNodes|textureBuffer|createGain|_updatePauseSign|_webglMaskWindow|visibilitychange|iPod|_defaultStretchMode|_onWindowskinLoad|_makeErrorHtml|iPhone|_createAllParts|iPad|_testCanvasBlendModes|black|horizontalWrap|_refreshContents|fadeOut|verticalWrap|_isOverpassPosition|_compareChildOrder|_sortChildren|containerIndex|isVisibleTile|tilingTexture|hidden|visibilityState|lastTrim|_onLoadedData|tilePosition|WATERFALL_AUTOTILE_TABLE|_onEnded|setBlack|0x1000000|isShadowingTile|rule|_createAllElements|40px|sans|isRoofTile|serif|seek|_refreshFrame|contentsOpacity|downArrowVisible|0x10000|sx2|qsy2|sy2|Android|_drawTableEdge|1000|0x100|_updateArrows|_updateContents|_drawAutotile|_updateCursor|_applyTweenValue|upArrowVisible|_drawNormalTile|_createErrorPrinter|_refreshArrows|lastUpperTiles|_modifyExistingElements|_drawShadow|_refreshPauseSign|boxWidth|format|Mini|Opera|UpperCanvas|300|gradientFillRect|webOS||||canPlayVideoType|GameVideo|3px|createTextNode|video|Italic|getAlphaPixel|offsetTop|offsetLeft|replace|rotateHue|drawText|userSelect|Canvas|webkitUserSelect|0xffffffff|msUserSelect||fill|not|getPixel|JsExtensions|IEMobile|paintOpacity|ErrorPrinter|arc|yellow|20px|bottom|000|smooth|GameCanvas|240|BlackBerry|innerWidth|measureTextWidth|textBaseline|LINEAR|mozUserSelect|innerHeight|alphabetic|boxHeight|split|FPSMeter|snap|RenderTexture|toggleOn|theme|hasWebGL|face|decimals|modeTextBack|process|58px|css|background|family|isAndroidChrome|identity|||renderer|WEBGL_RENDERER|javascript|overrideMimeType|WebGLRenderer|location|default|printError|search|loadFont|show|Chrome|canReadGameFiles|endLoading|graph|setLoadingImage|experimental|isOptionValid|startLoading|script|autoDetectRenderer|updateLoading|CanvasRenderer|CriOS|abcdefghijklmnopqrstuvwxyz|isMobileSafari|12px|41px|modeText|sheet|insertRule|isFontLoaded|fillText|playVideo|WebGL|onended|strokeStyle|lineWidth|lineJoin|onloadeddata|monospace|strokeText|item|random|BLEND_SCREEN|BLEND_MULTIPLY|BLEND_ADD|tickEnd|tick|view|AppleWebKit|dontSayHello|BLEND_NORMAL|600|MV|UNSIGNED_BYTE|RPGMAKER_NAME|RGBA|readPixels|800|frameBuffer|isVideoPlaying|2816|vertexAttribPointer|enableVertexAttribArray|FLOAT|drawArrays|viewport|TRIANGLES|STATIC_DRAW|bufferData|offsetVector||projectionVector||INCR|Float32Array|bindBuffer|removeChild|pop|float|mediump||vec2|vec4|vColor|precision||fragmentSrc|storm|rain|snow|160|passes|flipY|uniform1f|_windowArrowSprites|blendMode|windowskin|contents|backOpacity|blendModesCanvas|setWhite|isWallTypeAutotile|isFloorTypeAutotile|isWaterfallTypeAutotile|originalTexture|generateTilingTexture|isClosed|setCursorRect|primitiveShader|disable|setShader|uniformMatrix3fv|translationMatrix|STENCIL_BUFFER_BIT|enable|addChildAt|addChildToBack|closePath|clip|filter|sampler2D|main|meta|udta|LOOP|setup|Audio|mvhd|moov|setPosition|clearTimeout|OggS|vorb|ftyp|loadeddata|error|Za|deep|z0|9_|exec|too|makeDeepCopy|setStaticSe|ended|paused|setInterval|01|setTimeout|equalpower|interactive|adjustSaturation|canPlayOgg|canPlayM4a|ogg|283|140|texture2D|gl_FragColor|reset|adjustHue|143|mp4|pitch|loopEnd|loopStart|playbackRate|createPanner|panningModel|decodeAudioData|400|addStopListener|pan|responseType|arraybuffer|status|isWallTile|createBuffer|touchcancel|touchend|pointerdown|deltaX|deltaY|touchmove|wheel|isReleased|mousedown|mousemove|isGroundTile|touches|cordova|_isInBitmapRect|setColorTone|copy|atop|flush|getColorTone|setBlendColor|standalone|pointerType|isPrimary|getBlendColor|isMoved|isCancelled|showDuration|isPaused|mozFullScreen|webkitFullscreenElement|msFullscreenElement|115|114|webkitFilter|ctrlKey|altKey|113|Element|ALLOW_KEYBOARD_INPUT|focus|nw|keyup|connected|pressed|dir8|dir4|tab|102|104|debug|pushFilter|mouseup|128|1536|0x0f|10000|2048|tileHeight|setData|768|TILE_ID_E|TILE_ID_D|_filterBlock|TILE_ID_C|sort|0x80|512|TILE_ID_B|tileWidth|0x10|popFilter|makeAutotileId|COLOR_BUFFER_BIT|isSameKindTile|isWaterTile|8192|mask|4352|5888|clearColor'.split('|'), 0, {}) Graphics._defaultStretchMode = function() { return true; }; /* Autoresize Plugin */ Pezzi di codice JS presi dall pagina del preorder Condividi questo messaggio Link di questo messaggio Condividi su altri siti
MrSte 1110 Segnala messaggio Inviato September 30, 2015 Ho provato la Demo, eccovi alcuni Screen che ho fatto 1 Ghost Rider reacted to this Condividi questo messaggio Link di questo messaggio Condividi su altri siti
kaine 1858 Segnala messaggio Inviato September 30, 2015 Ah grazie mistino, ho letto che ci saranno risorse scifi nelle rtp *___* Edit: Melo aggiungi uno spoiler, non finivo più di scrollare la pagina col pollice XD 1 MrSte reacted to this Condividi questo messaggio Link di questo messaggio Condividi su altri siti
Melosx 16 Segnala messaggio Inviato September 30, 2015 Melo aggiungi uno spoiler, non finivo più di scrollare la pagina col pollice XD Fatto XD Su PC non sembra così lungo, per questo l'ho evitato il tag spoiler Condividi questo messaggio Link di questo messaggio Condividi su altri siti
•Miha• 211 Segnala messaggio Inviato September 30, 2015 Lo vorrò ;ww; Ora no che devo prima potenziarmi il Mac, ma lo vorrò! *____* Condividi questo messaggio Link di questo messaggio Condividi su altri siti
Melosx 16 Segnala messaggio Inviato September 30, 2015 Altra roba scriptosa, e in linguaggio comprensibile(usando UnPacker) rpg_scenes.js function Scene_Base() { this.initialize.apply(this,arguments) } Scene_Base.prototype=Object.create(Stage.prototype); Scene_Base.prototype.constructor=Scene_Base; Scene_Base.prototype.initialize=function() { Stage.prototype.initialize.call(this); this._active=false; this._fadeSign=0; this._fadeDuration=0; this._fadeSprite=null }; Scene_Base.prototype.create=function() { }; Scene_Base.prototype.isActive=function() { return this._active }; Scene_Base.prototype.isReady=function() { return ImageManager.isReady() }; Scene_Base.prototype.start=function() { this._active=true }; Scene_Base.prototype.update=function() { this.updateFade(); this.updateChildren(); AudioManager.checkErrors() }; Scene_Base.prototype.stop=function() { this._active=false }; Scene_Base.prototype.isBusy=function() { return this._fadeDuration>0 }; Scene_Base.prototype.terminate=function() { }; Scene_Base.prototype.createWindowLayer=function() { var width=Graphics.boxWidth; var height=Graphics.boxHeight; var x=(Graphics.width-width)/2; var y=(Graphics.height-height)/2; this._windowLayer=new WindowLayer(); this._windowLayer.move(x,y,width,height); this.addChild(this._windowLayer) }; Scene_Base.prototype.addWindow=function(window) { this._windowLayer.addChild(window) }; Scene_Base.prototype.startFadeIn=function(duration,white) { this.createFadeSprite(white); this._fadeSign=1; this._fadeDuration=duration||30; this._fadeSprite.opacity=255 }; Scene_Base.prototype.startFadeOut=function(duration,white) { this.createFadeSprite(white); this._fadeSign=-1; this._fadeDuration=duration||30; this._fadeSprite.opacity=0 }; Scene_Base.prototype.createFadeSprite=function(white) { if(!this._fadeSprite) { this._fadeSprite=new ScreenSprite(); this.addChild(this._fadeSprite) } if(white) { this._fadeSprite.setWhite() } else { this._fadeSprite.setBlack() } }; Scene_Base.prototype.updateFade=function() { if(this._fadeDuration>0) { var d=this._fadeDuration; if(this._fadeSign>0) { this._fadeSprite.opacity-=this._fadeSprite.opacity/d } else { this._fadeSprite.opacity+=(255-this._fadeSprite.opacity)/d } this._fadeDuration-- } }; Scene_Base.prototype.updateChildren=function() { this.children.forEach(function(child) { if(child.update) { child.update() } } ) }; Scene_Base.prototype.popScene=function() { SceneManager.pop() }; Scene_Base.prototype.checkGameover=function() { if($gameParty.isAllDead()) { SceneManager.goto(Scene_Gameover) } }; Scene_Base.prototype.fadeOutAll=function() { var time=this.slowFadeSpeed()/60; AudioManager.fadeOutBgm(time); AudioManager.fadeOutBgs(time); AudioManager.fadeOutMe(time); this.startFadeOut(this.slowFadeSpeed()) }; Scene_Base.prototype.fadeSpeed=function() { return 24 }; Scene_Base.prototype.slowFadeSpeed=function() { return this.fadeSpeed()*2 }; function Scene_Boot() { this.initialize.apply(this,arguments) } Scene_Boot.prototype=Object.create(Scene_Base.prototype); Scene_Boot.prototype.constructor=Scene_Boot; Scene_Boot.prototype.initialize=function() { Scene_Base.prototype.initialize.call(this); this._startDate=Date.now() }; Scene_Boot.prototype.create=function() { Scene_Base.prototype.create.call(this); DataManager.loadDatabase(); ConfigManager.load(); this.loadSystemImages() }; Scene_Boot.prototype.loadSystemImages=function() { ImageManager.loadSystem('Window'); ImageManager.loadSystem('IconSet'); ImageManager.loadSystem('Balloon'); ImageManager.loadSystem('Shadow1'); ImageManager.loadSystem('Shadow2'); ImageManager.loadSystem('Damage'); ImageManager.loadSystem('States'); ImageManager.loadSystem('Weapons1'); ImageManager.loadSystem('Weapons2'); ImageManager.loadSystem('Weapons3'); ImageManager.loadSystem('ButtonSet') }; Scene_Boot.prototype.isReady=function() { if(Scene_Base.prototype.isReady.call(this)) { return DataManager.isDatabaseLoaded()&&this.isGameFontLoaded() } else { return false } }; Scene_Boot.prototype.isGameFontLoaded=function() { if(Graphics.isFontLoaded('GameFont')) { return true } else { var elapsed=Date.now()-this._startDate; if(elapsed>=20000) { throw new Error('Failed to load GameFont') } } }; Scene_Boot.prototype.start=function() { Scene_Base.prototype.start.call(this); SoundManager.preloadImportantSounds(); if(DataManager.isBattleTest()) { DataManager.setupBattleTest(); SceneManager.goto(Scene_Battle) } else if(DataManager.isEventTest()) { DataManager.setupEventTest(); SceneManager.goto(Scene_Map) } else { this.checkPlayerLocation(); DataManager.setupNewGame(); SceneManager.goto(Scene_Title); Window_TitleCommand.initCommandPosition() } this.updateDocumentTitle() }; Scene_Boot.prototype.updateDocumentTitle=function() { document.title=$dataSystem.gameTitle }; Scene_Boot.prototype.checkPlayerLocation=function() { if($dataSystem.startMapId===0) { throw new Error('Player\'s starting position is not set') } }; function Scene_Title() { this.initialize.apply(this,arguments) } Scene_Title.prototype=Object.create(Scene_Base.prototype); Scene_Title.prototype.constructor=Scene_Title; Scene_Title.prototype.initialize=function() { Scene_Base.prototype.initialize.call(this) }; Scene_Title.prototype.create=function() { Scene_Base.prototype.create.call(this); this.createBackground(); this.createForeground(); this.createWindowLayer(); this.createCommandWindow() }; Scene_Title.prototype.start=function() { Scene_Base.prototype.start.call(this); SceneManager.clearStack(); this.centerSprite(this._backSprite1); this.centerSprite(this._backSprite2); this.playTitleMusic(); this.startFadeIn(this.fadeSpeed(),false) }; Scene_Title.prototype.update=function() { if(!this.isBusy()) { this._commandWindow.open() } Scene_Base.prototype.update.call(this) }; Scene_Title.prototype.isBusy=function() { return this._commandWindow.isClosing()||Scene_Base.prototype.isBusy.call(this) }; Scene_Title.prototype.terminate=function() { Scene_Base.prototype.terminate.call(this); SceneManager.snapForBackground() }; Scene_Title.prototype.createBackground=function() { this._backSprite1=new Sprite(ImageManager.loadTitle1($dataSystem.title1Name)); this._backSprite2=new Sprite(ImageManager.loadTitle2($dataSystem.title2Name)); this.addChild(this._backSprite1); this.addChild(this._backSprite2) }; Scene_Title.prototype.createForeground=function() { this._gameTitleSprite=new Sprite(new Bitmap(Graphics.width,Graphics.height)); this.addChild(this._gameTitleSprite); if($dataSystem.optDrawTitle) { this.drawGameTitle() } }; Scene_Title.prototype.drawGameTitle=function() { var x=20; var y=Graphics.height/4; var maxWidth=Graphics.width-x*2; var text=$dataSystem.gameTitle; this._gameTitleSprite.bitmap.outlineColor='black'; this._gameTitleSprite.bitmap.outlineWidth=8; this._gameTitleSprite.bitmap.fontSize=72; this._gameTitleSprite.bitmap.drawText(text,x,y,maxWidth,48,'center') }; Scene_Title.prototype.centerSprite=function(sprite) { sprite.x=Graphics.width/2; sprite.y=Graphics.height/2; sprite.anchor.x=0.5; sprite.anchor.y=0.5 }; Scene_Title.prototype.createCommandWindow=function() { this._commandWindow=new Window_TitleCommand(); this._commandWindow.setHandler('newGame',this.commandNewGame.bind(this)); this._commandWindow.setHandler('continue',this.commandContinue.bind(this)); this._commandWindow.setHandler('options',this.commandOptions.bind(this)); this.addWindow(this._commandWindow) }; Scene_Title.prototype.commandNewGame=function() { DataManager.setupNewGame(); this._commandWindow.close(); this.fadeOutAll(); SceneManager.goto(Scene_Map) }; Scene_Title.prototype.commandContinue=function() { this._commandWindow.close(); SceneManager.push(Scene_Load) }; Scene_Title.prototype.commandOptions=function() { this._commandWindow.close(); SceneManager.push(Scene_Options) }; Scene_Title.prototype.playTitleMusic=function() { AudioManager.playBgm($dataSystem.titleBgm); AudioManager.stopBgs(); AudioManager.stopMe() }; function Scene_Map() { this.initialize.apply(this,arguments) } Scene_Map.prototype=Object.create(Scene_Base.prototype); Scene_Map.prototype.constructor=Scene_Map; Scene_Map.prototype.initialize=function() { Scene_Base.prototype.initialize.call(this); this._waitCount=0; this._encounterEffectDuration=0; this._mapLoaded=false; this._touchCount=0 }; Scene_Map.prototype.create=function() { Scene_Base.prototype.create.call(this); this._transfer=$gamePlayer.isTransferring(); var mapId=this._transfer?$gamePlayer.newMapId():$gameMap.mapId(); DataManager.loadMapData(mapId) }; Scene_Map.prototype.isReady=function() { if(!this._mapLoaded&&DataManager.isMapLoaded()) { this.onMapLoaded(); this._mapLoaded=true } return this._mapLoaded&&Scene_Base.prototype.isReady.call(this) }; Scene_Map.prototype.onMapLoaded=function() { if(this._transfer) { $gamePlayer.performTransfer() } this.createDisplayObjects() }; Scene_Map.prototype.start=function() { Scene_Base.prototype.start.call(this); SceneManager.clearStack(); if(this._transfer) { this.fadeInForTransfer(); this._mapNameWindow.open(); $gameMap.autoplay() } else if(this.needsFadeIn()) { this.startFadeIn(this.fadeSpeed(),false) } this.menuCalling=false }; Scene_Map.prototype.update=function() { this.updateDestination(); this.updateMainMultiply(); if(this.isSceneChangeOk()) { this.updateScene() } else if(SceneManager.isNextScene(Scene_Battle)) { this.updateEncounterEffect() } this.updateWaitCount(); Scene_Base.prototype.update.call(this) }; Scene_Map.prototype.updateMainMultiply=function() { this.updateMain(); if(this.isFastForward()) { this.updateMain() } }; Scene_Map.prototype.updateMain=function() { var active=this.isActive(); $gameMap.update(active); $gamePlayer.update(active); $gameTimer.update(active); $gameScreen.update() }; Scene_Map.prototype.isFastForward=function() { return($gameMap.isEventRunning()&&!SceneManager.isSceneChanging()&&(Input.isLongPressed('ok')||TouchInput.isLongPressed())) }; Scene_Map.prototype.stop=function() { Scene_Base.prototype.stop.call(this); $gamePlayer.straighten(); this._mapNameWindow.close(); if(this.needsSlowFadeOut()) { this.startFadeOut(this.slowFadeSpeed(),false) } else if(SceneManager.isNextScene(Scene_Map)) { this.fadeOutForTransfer() } else if(SceneManager.isNextScene(Scene_Battle)) { this.launchBattle() } }; Scene_Map.prototype.isBusy=function() { return((this._messageWindow&&this._messageWindow.isClosing())||this._waitCount>0||this._encounterEffectDuration>0||Scene_Base.prototype.isBusy.call(this)) }; Scene_Map.prototype.terminate=function() { Scene_Base.prototype.terminate.call(this); if(!SceneManager.isNextScene(Scene_Battle)) { this._spriteset.update(); SceneManager.snapForBackground() } $gameScreen.clearZoom() }; Scene_Map.prototype.needsFadeIn=function() { return(SceneManager.isPreviousScene(Scene_Battle)||SceneManager.isPreviousScene(Scene_Load)) }; Scene_Map.prototype.needsSlowFadeOut=function() { return(SceneManager.isNextScene(Scene_Title)||SceneManager.isNextScene(Scene_Gameover)) }; Scene_Map.prototype.updateWaitCount=function() { if(this._waitCount>0) { this._waitCount--; return true } return false }; Scene_Map.prototype.updateDestination=function() { if(this.isMapTouchOk()) { this.processMapTouch() } else { $gameTemp.clearDestination(); this._touchCount=0 } }; Scene_Map.prototype.isMapTouchOk=function() { return this.isActive()&&$gamePlayer.canMove() }; Scene_Map.prototype.processMapTouch=function() { if(TouchInput.isTriggered()||this._touchCount>0) { if(TouchInput.isPressed()) { if(this._touchCount===0||this._touchCount>=15) { var x=$gameMap.canvasToMapX(TouchInput.x); var y=$gameMap.canvasToMapY(TouchInput.y); $gameTemp.setDestination(x,y) } this._touchCount++ } else { this._touchCount=0 } } }; Scene_Map.prototype.isSceneChangeOk=function() { return this.isActive()&&!$gameMessage.isBusy() }; Scene_Map.prototype.updateScene=function() { this.checkGameover(); if(!SceneManager.isSceneChanging()) { this.updateTransferPlayer() } if(!SceneManager.isSceneChanging()) { this.updateEncounter() } if(!SceneManager.isSceneChanging()) { this.updateCallMenu() } if(!SceneManager.isSceneChanging()) { this.updateCallDebug() } }; Scene_Map.prototype.createDisplayObjects=function() { this.createSpriteset(); this.createMapNameWindow(); this.createWindowLayer(); this.createAllWindows() }; Scene_Map.prototype.createSpriteset=function() { this._spriteset=new Spriteset_Map(); this.addChild(this._spriteset) }; Scene_Map.prototype.createAllWindows=function() { this.createMessageWindow(); this.createScrollTextWindow() }; Scene_Map.prototype.createMapNameWindow=function() { this._mapNameWindow=new Window_MapName(); this.addChild(this._mapNameWindow) }; Scene_Map.prototype.createMessageWindow=function() { this._messageWindow=new Window_Message(); this.addWindow(this._messageWindow); this._messageWindow.subWindows().forEach(function(window) { this.addWindow(window) } ,this) }; Scene_Map.prototype.createScrollTextWindow=function() { this._scrollTextWindow=new Window_ScrollText(); this.addWindow(this._scrollTextWindow) }; Scene_Map.prototype.updateTransferPlayer=function() { if($gamePlayer.isTransferring()) { SceneManager.goto(Scene_Map) } }; Scene_Map.prototype.updateEncounter=function() { if($gamePlayer.executeEncounter()) { SceneManager.push(Scene_Battle) } }; Scene_Map.prototype.updateCallMenu=function() { if(this.isMenuEnabled()) { if(this.isMenuCalled()) { this.menuCalling=true } if(this.menuCalling&&!$gamePlayer.isMoving()) { this.callMenu() } } else { this.menuCalling=false } }; Scene_Map.prototype.isMenuEnabled=function() { return $gameSystem.isMenuEnabled()&&!$gameMap.isEventRunning() }; Scene_Map.prototype.isMenuCalled=function() { return Input.isTriggered('menu')||TouchInput.isCancelled() }; Scene_Map.prototype.callMenu=function() { SoundManager.playOk(); SceneManager.push(Scene_Menu); Window_MenuCommand.initCommandPosition(); $gameTemp.clearDestination(); this._mapNameWindow.hide(); this._waitCount=2 }; Scene_Map.prototype.updateCallDebug=function() { if(this.isDebugCalled()) { SceneManager.push(Scene_Debug) } }; Scene_Map.prototype.isDebugCalled=function() { return Input.isTriggered('debug')&&$gameTemp.isPlaytest() }; Scene_Map.prototype.fadeInForTransfer=function() { var fadeType=$gamePlayer.fadeType(); switch(fadeType) { case 0:case 1:this.startFadeIn(this.fadeSpeed(),fadeType===1); break } }; Scene_Map.prototype.fadeOutForTransfer=function() { var fadeType=$gamePlayer.fadeType(); switch(fadeType) { case 0:case 1:this.startFadeOut(this.fadeSpeed(),fadeType===1); break } }; Scene_Map.prototype.launchBattle=function() { BattleManager.saveBgmAndBgs(); this.stopAudioOnBattleStart(); SoundManager.playBattleStart(); this.startEncounterEffect() }; Scene_Map.prototype.stopAudioOnBattleStart=function() { if(!AudioManager.isCurrentBgm($gameSystem.battleBgm())) { AudioManager.stopBgm() } AudioManager.stopBgs(); AudioManager.stopMe(); AudioManager.stopSe() }; Scene_Map.prototype.startEncounterEffect=function() { this._spriteset.hideCharacters(); this._encounterEffectDuration=this.encounterEffectSpeed() }; Scene_Map.prototype.updateEncounterEffect=function() { if(this._encounterEffectDuration>0) { this._encounterEffectDuration--; var speed=this.encounterEffectSpeed(); var n=speed-this._encounterEffectDuration; var p=n/speed; var q=((p-1)*20*p+5)*p+1; var zoomX=$gamePlayer.screenX(); var zoomY=$gamePlayer.screenY()-24; if(n===2) { $gameScreen.setZoom(zoomX,zoomY,1); this.snapForBattleBackground(); this.startFlashForEncounter(speed/2) } $gameScreen.setZoom(zoomX,zoomY,q); if(n===Math.floor(speed/6)) { this.startFlashForEncounter(speed/2) } if(n===Math.floor(speed/2)) { BattleManager.playBattleBgm(); this.startFadeOut(this.fadeSpeed()) } } }; Scene_Map.prototype.snapForBattleBackground=function() { this._windowLayer.visible=false; SceneManager.snapForBackground(); this._windowLayer.visible=true }; Scene_Map.prototype.startFlashForEncounter=function(duration) { var color=[255,255,255,255]; $gameScreen.startFlash(color,duration) }; Scene_Map.prototype.encounterEffectSpeed=function() { return 60 }; function Scene_MenuBase() { this.initialize.apply(this,arguments) } Scene_MenuBase.prototype=Object.create(Scene_Base.prototype); Scene_MenuBase.prototype.constructor=Scene_MenuBase; Scene_MenuBase.prototype.initialize=function() { Scene_Base.prototype.initialize.call(this) }; Scene_MenuBase.prototype.create=function() { Scene_Base.prototype.create.call(this); this.createBackground(); this.updateActor(); this.createWindowLayer() }; Scene_MenuBase.prototype.actor=function() { return this._actor }; Scene_MenuBase.prototype.updateActor=function() { this._actor=$gameParty.menuActor() }; Scene_MenuBase.prototype.createBackground=function() { this._backgroundSprite=new Sprite(); this._backgroundSprite.bitmap=SceneManager.backgroundBitmap(); this.addChild(this._backgroundSprite) }; Scene_MenuBase.prototype.setBackgroundOpacity=function(opacity) { this._backgroundSprite.opacity=opacity }; Scene_MenuBase.prototype.createHelpWindow=function() { this._helpWindow=new Window_Help(); this.addWindow(this._helpWindow) }; Scene_MenuBase.prototype.nextActor=function() { $gameParty.makeMenuActorNext(); this.updateActor(); this.onActorChange() }; Scene_MenuBase.prototype.previousActor=function() { $gameParty.makeMenuActorPrevious(); this.updateActor(); this.onActorChange() }; Scene_MenuBase.prototype.onActorChange=function() { }; function Scene_Menu() { this.initialize.apply(this,arguments) } Scene_Menu.prototype=Object.create(Scene_MenuBase.prototype); Scene_Menu.prototype.constructor=Scene_Menu; Scene_Menu.prototype.initialize=function() { Scene_MenuBase.prototype.initialize.call(this) }; Scene_Menu.prototype.create=function() { Scene_MenuBase.prototype.create.call(this); this.createCommandWindow(); this.createGoldWindow(); this.createStatusWindow() }; Scene_Menu.prototype.start=function() { Scene_MenuBase.prototype.start.call(this); this._statusWindow.refresh() }; Scene_Menu.prototype.createCommandWindow=function() { this._commandWindow=new Window_MenuCommand(0,0); this._commandWindow.setHandler('item',this.commandItem.bind(this)); this._commandWindow.setHandler('skill',this.commandPersonal.bind(this)); this._commandWindow.setHandler('equip',this.commandPersonal.bind(this)); this._commandWindow.setHandler('status',this.commandPersonal.bind(this)); this._commandWindow.setHandler('formation',this.commandFormation.bind(this)); this._commandWindow.setHandler('options',this.commandOptions.bind(this)); this._commandWindow.setHandler('save',this.commandSave.bind(this)); this._commandWindow.setHandler('gameEnd',this.commandGameEnd.bind(this)); this._commandWindow.setHandler('cancel',this.popScene.bind(this)); this.addWindow(this._commandWindow) }; Scene_Menu.prototype.createGoldWindow=function() { this._goldWindow=new Window_Gold(0,0); this._goldWindow.y=Graphics.boxHeight-this._goldWindow.height; this.addWindow(this._goldWindow) }; Scene_Menu.prototype.createStatusWindow=function() { this._statusWindow=new Window_MenuStatus(this._commandWindow.width,0); this.addWindow(this._statusWindow) }; Scene_Menu.prototype.commandItem=function() { SceneManager.push(Scene_Item) }; Scene_Menu.prototype.commandPersonal=function() { this._statusWindow.setFormationMode(false); this._statusWindow.selectLast(); this._statusWindow.activate(); this._statusWindow.setHandler('ok',this.onPersonalOk.bind(this)); this._statusWindow.setHandler('cancel',this.onPersonalCancel.bind(this)) }; Scene_Menu.prototype.commandFormation=function() { this._statusWindow.setFormationMode(true); this._statusWindow.selectLast(); this._statusWindow.activate(); this._statusWindow.setHandler('ok',this.onFormationOk.bind(this)); this._statusWindow.setHandler('cancel',this.onFormationCancel.bind(this)) }; Scene_Menu.prototype.commandOptions=function() { SceneManager.push(Scene_Options) }; Scene_Menu.prototype.commandSave=function() { SceneManager.push(Scene_Save) }; Scene_Menu.prototype.commandGameEnd=function() { SceneManager.push(Scene_GameEnd) }; Scene_Menu.prototype.onPersonalOk=function() { switch(this._commandWindow.currentSymbol()) { case'skill':SceneManager.push(Scene_Skill); break; case'equip':SceneManager.push(Scene_Equip); break; case'status':SceneManager.push(Scene_Status); break } }; Scene_Menu.prototype.onPersonalCancel=function() { this._statusWindow.deselect(); this._commandWindow.activate() }; Scene_Menu.prototype.onFormationOk=function() { var index=this._statusWindow.index(); var actor=$gameParty.members()[index]; var pendingIndex=this._statusWindow.pendingIndex(); if(pendingIndex>=0) { $gameParty.swapOrder(index,pendingIndex); this._statusWindow.setPendingIndex(-1); this._statusWindow.redrawItem(index) } else { this._statusWindow.setPendingIndex(index) } this._statusWindow.activate() }; Scene_Menu.prototype.onFormationCancel=function() { if(this._statusWindow.pendingIndex()>=0) { this._statusWindow.setPendingIndex(-1); this._statusWindow.activate() } else { this._statusWindow.deselect(); this._commandWindow.activate() } }; function Scene_ItemBase() { this.initialize.apply(this,arguments) } Scene_ItemBase.prototype=Object.create(Scene_MenuBase.prototype); Scene_ItemBase.prototype.constructor=Scene_ItemBase; Scene_ItemBase.prototype.initialize=function() { Scene_MenuBase.prototype.initialize.call(this) }; Scene_ItemBase.prototype.create=function() { Scene_MenuBase.prototype.create.call(this) }; Scene_ItemBase.prototype.createActorWindow=function() { this._actorWindow=new Window_MenuActor(); this._actorWindow.setHandler('ok',this.onActorOk.bind(this)); this._actorWindow.setHandler('cancel',this.onActorCancel.bind(this)); this.addWindow(this._actorWindow) }; Scene_ItemBase.prototype.item=function() { return this._itemWindow.item() }; Scene_ItemBase.prototype.user=function() { return null }; Scene_ItemBase.prototype.isCursorLeft=function() { return this._itemWindow.index()%2===0 }; Scene_ItemBase.prototype.showSubWindow=function(window) { window.x=this.isCursorLeft()?Graphics.boxWidth-window.width:0; window.show(); window.activate() }; Scene_ItemBase.prototype.hideSubWindow=function(window) { window.hide(); window.deactivate(); this.activateItemWindow() }; Scene_ItemBase.prototype.onActorOk=function() { if(this.canUse()) { this.useItem() } else { SoundManager.playBuzzer() } }; Scene_ItemBase.prototype.onActorCancel=function() { this.hideSubWindow(this._actorWindow) }; Scene_ItemBase.prototype.determineItem=function() { var action=new Game_Action(this.user()); var item=this.item(); action.setItemObject(item); if(action.isForFriend()) { this.showSubWindow(this._actorWindow); this._actorWindow.selectForItem(this.item()) } else { this.useItem(); this.activateItemWindow() } }; Scene_ItemBase.prototype.useItem=function() { this.playSeForItem(); this.user().useItem(this.item()); this.applyItem(); this.checkCommonEvent(); this.checkGameover(); this._actorWindow.refresh() }; Scene_ItemBase.prototype.activateItemWindow=function() { this._itemWindow.refresh(); this._itemWindow.activate() }; Scene_ItemBase.prototype.itemTargetActors=function() { var action=new Game_Action(this.user()); action.setItemObject(this.item()); if(!action.isForFriend()) { return[] } else if(action.isForAll()) { return $gameParty.members() } else { return[$gameParty.members()[this._actorWindow.index()]] } }; Scene_ItemBase.prototype.canUse=function() { return this.user().canUse(this.item())&&this.isItemEffectsValid() }; Scene_ItemBase.prototype.isItemEffectsValid=function() { var action=new Game_Action(this.user()); action.setItemObject(this.item()); return this.itemTargetActors().some(function(target) { return action.testApply(target) } ,this) }; Scene_ItemBase.prototype.applyItem=function() { var action=new Game_Action(this.user()); action.setItemObject(this.item()); this.itemTargetActors().forEach(function(target) { for(var i=0; i<action.numRepeats(); i++) { action.apply(target) } } ,this); action.applyGlobal() }; Scene_ItemBase.prototype.checkCommonEvent=function() { if($gameTemp.isCommonEventReserved()) { SceneManager.goto(Scene_Map) } }; function Scene_Item() { this.initialize.apply(this,arguments) } Scene_Item.prototype=Object.create(Scene_ItemBase.prototype); Scene_Item.prototype.constructor=Scene_Item; Scene_Item.prototype.initialize=function() { Scene_ItemBase.prototype.initialize.call(this) }; Scene_Item.prototype.create=function() { Scene_ItemBase.prototype.create.call(this); this.createHelpWindow(); this.createCategoryWindow(); this.createItemWindow(); this.createActorWindow() }; Scene_Item.prototype.createCategoryWindow=function() { this._categoryWindow=new Window_ItemCategory(); this._categoryWindow.setHelpWindow(this._helpWindow); this._categoryWindow.y=this._helpWindow.height; this._categoryWindow.setHandler('ok',this.onCategoryOk.bind(this)); this._categoryWindow.setHandler('cancel',this.popScene.bind(this)); this.addWindow(this._categoryWindow) }; Scene_Item.prototype.createItemWindow=function() { var wy=this._categoryWindow.y+this._categoryWindow.height; var wh=Graphics.boxHeight-wy; this._itemWindow=new Window_ItemList(0,wy,Graphics.boxWidth,wh); this._itemWindow.setHelpWindow(this._helpWindow); this._itemWindow.setHandler('ok',this.onItemOk.bind(this)); this._itemWindow.setHandler('cancel',this.onItemCancel.bind(this)); this.addWindow(this._itemWindow); this._categoryWindow.setItemWindow(this._itemWindow) }; Scene_Item.prototype.user=function() { var members=$gameParty.movableMembers(); var bestActor=members[0]; var bestPha=0; for(var i=0; i<members.length; i++) { if(members[i].pha>bestPha) { bestPha=members[i].pha; bestActor=members[i] } } return bestActor }; Scene_Item.prototype.onCategoryOk=function() { this._itemWindow.activate(); this._itemWindow.selectLast() }; Scene_Item.prototype.onItemOk=function() { $gameParty.setLastItem(this.item()); this.determineItem() }; Scene_Item.prototype.onItemCancel=function() { this._itemWindow.deselect(); this._categoryWindow.activate() }; Scene_Item.prototype.playSeForItem=function() { SoundManager.playUseItem() }; Scene_Item.prototype.useItem=function() { Scene_ItemBase.prototype.useItem.call(this); this._itemWindow.redrawCurrentItem() }; function Scene_Skill() { this.initialize.apply(this,arguments) } Scene_Skill.prototype=Object.create(Scene_ItemBase.prototype); Scene_Skill.prototype.constructor=Scene_Skill; Scene_Skill.prototype.initialize=function() { Scene_ItemBase.prototype.initialize.call(this) }; Scene_Skill.prototype.create=function() { Scene_ItemBase.prototype.create.call(this); this.createHelpWindow(); this.createSkillTypeWindow(); this.createStatusWindow(); this.createItemWindow(); this.createActorWindow(); this.refreshActor() }; Scene_Skill.prototype.createSkillTypeWindow=function() { var wy=this._helpWindow.height; this._skillTypeWindow=new Window_SkillType(0,wy); this._skillTypeWindow.setHelpWindow(this._helpWindow); this._skillTypeWindow.setHandler('skill',this.commandSkill.bind(this)); this._skillTypeWindow.setHandler('cancel',this.popScene.bind(this)); this._skillTypeWindow.setHandler('pagedown',this.nextActor.bind(this)); this._skillTypeWindow.setHandler('pageup',this.previousActor.bind(this)); this.addWindow(this._skillTypeWindow) }; Scene_Skill.prototype.createStatusWindow=function() { var wx=this._skillTypeWindow.width; var wy=this._helpWindow.height; var ww=Graphics.boxWidth-wx; var wh=this._skillTypeWindow.height; this._statusWindow=new Window_SkillStatus(wx,wy,ww,wh); this.addWindow(this._statusWindow) }; Scene_Skill.prototype.createItemWindow=function() { var wx=0; var wy=this._statusWindow.y+this._statusWindow.height; var ww=Graphics.boxWidth; var wh=Graphics.boxHeight-wy; this._itemWindow=new Window_SkillList(wx,wy,ww,wh); this._itemWindow.setHelpWindow(this._helpWindow); this._itemWindow.setHandler('ok',this.onItemOk.bind(this)); this._itemWindow.setHandler('cancel',this.onItemCancel.bind(this)); this._skillTypeWindow.setSkillWindow(this._itemWindow); this.addWindow(this._itemWindow) }; Scene_Skill.prototype.refreshActor=function() { var actor=this.actor(); this._skillTypeWindow.setActor(actor); this._statusWindow.setActor(actor); this._itemWindow.setActor(actor) }; Scene_Skill.prototype.user=function() { return this.actor() }; Scene_Skill.prototype.commandSkill=function() { this._itemWindow.activate(); this._itemWindow.selectLast() }; Scene_Skill.prototype.onItemOk=function() { this.actor().setLastMenuSkill(this.item()); this.determineItem() }; Scene_Skill.prototype.onItemCancel=function() { this._itemWindow.deselect(); this._skillTypeWindow.activate() }; Scene_Skill.prototype.playSeForItem=function() { SoundManager.playUseSkill() }; Scene_Skill.prototype.useItem=function() { Scene_ItemBase.prototype.useItem.call(this); this._statusWindow.refresh(); this._itemWindow.refresh() }; Scene_Skill.prototype.onActorChange=function() { this.refreshActor(); this._skillTypeWindow.activate() }; function Scene_Equip() { this.initialize.apply(this,arguments) } Scene_Equip.prototype=Object.create(Scene_MenuBase.prototype); Scene_Equip.prototype.constructor=Scene_Equip; Scene_Equip.prototype.initialize=function() { Scene_MenuBase.prototype.initialize.call(this) }; Scene_Equip.prototype.create=function() { Scene_MenuBase.prototype.create.call(this); this.createHelpWindow(); this.createStatusWindow(); this.createCommandWindow(); this.createSlotWindow(); this.createItemWindow(); this.refreshActor() }; Scene_Equip.prototype.createStatusWindow=function() { this._statusWindow=new Window_EquipStatus(0,this._helpWindow.height); this.addWindow(this._statusWindow) }; Scene_Equip.prototype.createCommandWindow=function() { var wx=this._statusWindow.width; var wy=this._helpWindow.height; var ww=Graphics.boxWidth-this._statusWindow.width; this._commandWindow=new Window_EquipCommand(wx,wy,ww); this._commandWindow.setHelpWindow(this._helpWindow); this._commandWindow.setHandler('equip',this.commandEquip.bind(this)); this._commandWindow.setHandler('optimize',this.commandOptimize.bind(this)); this._commandWindow.setHandler('clear',this.commandClear.bind(this)); this._commandWindow.setHandler('cancel',this.popScene.bind(this)); this._commandWindow.setHandler('pagedown',this.nextActor.bind(this)); this._commandWindow.setHandler('pageup',this.previousActor.bind(this)); this.addWindow(this._commandWindow) }; Scene_Equip.prototype.createSlotWindow=function() { var wx=this._statusWindow.width; var wy=this._commandWindow.y+this._commandWindow.height; var ww=Graphics.boxWidth-this._statusWindow.width; var wh=this._statusWindow.height-this._commandWindow.height; this._slotWindow=new Window_EquipSlot(wx,wy,ww,wh); this._slotWindow.setHelpWindow(this._helpWindow); this._slotWindow.setStatusWindow(this._statusWindow); this._slotWindow.setHandler('ok',this.onSlotOk.bind(this)); this._slotWindow.setHandler('cancel',this.onSlotCancel.bind(this)); this.addWindow(this._slotWindow) }; Scene_Equip.prototype.createItemWindow=function() { var wx=0; var wy=this._statusWindow.y+this._statusWindow.height; var ww=Graphics.boxWidth; var wh=Graphics.boxHeight-wy; this._itemWindow=new Window_EquipItem(wx,wy,ww,wh); this._itemWindow.setHelpWindow(this._helpWindow); this._itemWindow.setStatusWindow(this._statusWindow); this._itemWindow.setHandler('ok',this.onItemOk.bind(this)); this._itemWindow.setHandler('cancel',this.onItemCancel.bind(this)); this._slotWindow.setItemWindow(this._itemWindow); this.addWindow(this._itemWindow) }; Scene_Equip.prototype.refreshActor=function() { var actor=this.actor(); this._statusWindow.setActor(actor); this._slotWindow.setActor(actor); this._itemWindow.setActor(actor) }; Scene_Equip.prototype.commandEquip=function() { this._slotWindow.activate(); this._slotWindow.select(0) }; Scene_Equip.prototype.commandOptimize=function() { SoundManager.playEquip(); this.actor().optimizeEquipments(); this._statusWindow.refresh(); this._slotWindow.refresh(); this._commandWindow.activate() }; Scene_Equip.prototype.commandClear=function() { SoundManager.playEquip(); this.actor().clearEquipments(); this._statusWindow.refresh(); this._slotWindow.refresh(); this._commandWindow.activate() }; Scene_Equip.prototype.onSlotOk=function() { this._itemWindow.activate(); this._itemWindow.select(0) }; Scene_Equip.prototype.onSlotCancel=function() { this._slotWindow.deselect(); this._commandWindow.activate() }; Scene_Equip.prototype.onItemOk=function() { SoundManager.playEquip(); this.actor().changeEquip(this._slotWindow.index(),this._itemWindow.item()); this._slotWindow.activate(); this._slotWindow.refresh(); this._itemWindow.deselect(); this._itemWindow.refresh(); this._statusWindow.refresh() }; Scene_Equip.prototype.onItemCancel=function() { this._slotWindow.activate(); this._itemWindow.deselect() }; Scene_Equip.prototype.onActorChange=function() { this.refreshActor(); this._commandWindow.activate() }; function Scene_Status() { this.initialize.apply(this,arguments) } Scene_Status.prototype=Object.create(Scene_MenuBase.prototype); Scene_Status.prototype.constructor=Scene_Status; Scene_Status.prototype.initialize=function() { Scene_MenuBase.prototype.initialize.call(this) }; Scene_Status.prototype.create=function() { Scene_MenuBase.prototype.create.call(this); this._statusWindow=new Window_Status(); this._statusWindow.setHandler('cancel',this.popScene.bind(this)); this._statusWindow.setHandler('pagedown',this.nextActor.bind(this)); this._statusWindow.setHandler('pageup',this.previousActor.bind(this)); this.addWindow(this._statusWindow); this.refreshActor() }; Scene_Status.prototype.refreshActor=function() { var actor=this.actor(); this._statusWindow.setActor(actor) }; Scene_Status.prototype.onActorChange=function() { this.refreshActor(); this._statusWindow.activate() }; function Scene_Options() { this.initialize.apply(this,arguments) } Scene_Options.prototype=Object.create(Scene_MenuBase.prototype); Scene_Options.prototype.constructor=Scene_Options; Scene_Options.prototype.initialize=function() { Scene_MenuBase.prototype.initialize.call(this) }; Scene_Options.prototype.create=function() { Scene_MenuBase.prototype.create.call(this); this.createOptionsWindow() }; Scene_Options.prototype.terminate=function() { Scene_MenuBase.prototype.terminate.call(this); ConfigManager.save() }; Scene_Options.prototype.createOptionsWindow=function() { this._optionsWindow=new Window_Options(); this._optionsWindow.setHandler('cancel',this.popScene.bind(this)); this.addWindow(this._optionsWindow) }; function Scene_File() { this.initialize.apply(this,arguments) } Scene_File.prototype=Object.create(Scene_MenuBase.prototype); Scene_File.prototype.constructor=Scene_File; Scene_File.prototype.initialize=function() { Scene_MenuBase.prototype.initialize.call(this) }; Scene_File.prototype.create=function() { Scene_MenuBase.prototype.create.call(this); DataManager.loadAllSavefileImages(); this.createHelpWindow(); this.createListWindow() }; Scene_File.prototype.start=function() { Scene_MenuBase.prototype.start.call(this); this._listWindow.refresh() }; Scene_File.prototype.savefileId=function() { return this._listWindow.index()+1 }; Scene_File.prototype.createHelpWindow=function() { this._helpWindow=new Window_Help(1); this._helpWindow.setText(this.helpWindowText()); this.addWindow(this._helpWindow) }; Scene_File.prototype.createListWindow=function() { var x=0; var y=this._helpWindow.height; var width=Graphics.boxWidth; var height=Graphics.boxHeight-y; this._listWindow=new Window_SavefileList(x,y,width,height); this._listWindow.setHandler('ok',this.onSavefileOk.bind(this)); this._listWindow.setHandler('cancel',this.popScene.bind(this)); this._listWindow.select(this.firstSavefileIndex()); this._listWindow.setTopRow(this.firstSavefileIndex()-2); this._listWindow.setMode(this.mode()); this._listWindow.refresh(); this.addWindow(this._listWindow) }; Scene_File.prototype.mode=function() { return null }; Scene_File.prototype.activateListWindow=function() { this._listWindow.activate() }; Scene_File.prototype.helpWindowText=function() { return'' }; Scene_File.prototype.firstSavefileIndex=function() { return 0 }; Scene_File.prototype.onSavefileOk=function() { }; function Scene_Save() { this.initialize.apply(this,arguments) } Scene_Save.prototype=Object.create(Scene_File.prototype); Scene_Save.prototype.constructor=Scene_Save; Scene_Save.prototype.initialize=function() { Scene_File.prototype.initialize.call(this) }; Scene_Save.prototype.mode=function() { return'save' }; Scene_Save.prototype.helpWindowText=function() { return TextManager.saveMessage }; Scene_Save.prototype.firstSavefileIndex=function() { return DataManager.lastAccessedSavefileId()-1 }; Scene_Save.prototype.onSavefileOk=function() { Scene_File.prototype.onSavefileOk.call(this); $gameSystem.onBeforeSave(); if(DataManager.saveGame(this.savefileId())) { this.onSaveSuccess() } else { this.onSaveFailure() } }; Scene_Save.prototype.onSaveSuccess=function() { SoundManager.playSave(); this.popScene() }; Scene_Save.prototype.onSaveFailure=function() { SoundManager.playBuzzer(); this.activateListWindow() }; function Scene_Load() { this.initialize.apply(this,arguments) } Scene_Load.prototype=Object.create(Scene_File.prototype); Scene_Load.prototype.constructor=Scene_Load; Scene_Load.prototype.initialize=function() { Scene_File.prototype.initialize.call(this); this._loadSuccess=false }; Scene_Load.prototype.terminate=function() { Scene_File.prototype.terminate.call(this); if(this._loadSuccess) { $gameSystem.onAfterLoad() } }; Scene_Load.prototype.mode=function() { return'load' }; Scene_Load.prototype.helpWindowText=function() { return TextManager.loadMessage }; Scene_Load.prototype.firstSavefileIndex=function() { return DataManager.latestSavefileId()-1 }; Scene_Load.prototype.onSavefileOk=function() { Scene_File.prototype.onSavefileOk.call(this); if(DataManager.loadGame(this.savefileId())) { this.onLoadSuccess() } else { this.onLoadFailure() } }; Scene_Load.prototype.onLoadSuccess=function() { SoundManager.playLoad(); this.fadeOutAll(); this.reloadMapIfUpdated(); SceneManager.goto(Scene_Map); this._loadSuccess=true }; Scene_Load.prototype.onLoadFailure=function() { SoundManager.playBuzzer(); this.activateListWindow() }; Scene_Load.prototype.reloadMapIfUpdated=function() { if($gameSystem.versionId()!==$dataSystem.versionId) { $gamePlayer.reserveTransfer($gameMap.mapId(),$gamePlayer.x,$gamePlayer.y); $gamePlayer.requestMapReload() } }; function Scene_GameEnd() { this.initialize.apply(this,arguments) } Scene_GameEnd.prototype=Object.create(Scene_MenuBase.prototype); Scene_GameEnd.prototype.constructor=Scene_GameEnd; Scene_GameEnd.prototype.initialize=function() { Scene_MenuBase.prototype.initialize.call(this) }; Scene_GameEnd.prototype.create=function() { Scene_MenuBase.prototype.create.call(this); this.createCommandWindow() }; Scene_GameEnd.prototype.stop=function() { Scene_MenuBase.prototype.stop.call(this); this._commandWindow.close() }; Scene_GameEnd.prototype.createBackground=function() { Scene_MenuBase.prototype.createBackground.call(this); this.setBackgroundOpacity(128) }; Scene_GameEnd.prototype.createCommandWindow=function() { this._commandWindow=new Window_GameEnd(); this._commandWindow.setHandler('toTitle',this.commandToTitle.bind(this)); this._commandWindow.setHandler('cancel',this.popScene.bind(this)); this.addWindow(this._commandWindow) }; Scene_GameEnd.prototype.commandToTitle=function() { this.fadeOutAll(); SceneManager.goto(Scene_Title) }; function Scene_Shop() { this.initialize.apply(this,arguments) } Scene_Shop.prototype=Object.create(Scene_MenuBase.prototype); Scene_Shop.prototype.constructor=Scene_Shop; Scene_Shop.prototype.initialize=function() { Scene_MenuBase.prototype.initialize.call(this) }; Scene_Shop.prototype.prepare=function(goods,purchaseOnly) { this._goods=goods; this._purchaseOnly=purchaseOnly; this._item=null }; Scene_Shop.prototype.create=function() { Scene_MenuBase.prototype.create.call(this); this.createHelpWindow(); this.createGoldWindow(); this.createCommandWindow(); this.createDummyWindow(); this.createNumberWindow(); this.createStatusWindow(); this.createBuyWindow(); this.createCategoryWindow(); this.createSellWindow() }; Scene_Shop.prototype.createGoldWindow=function() { this._goldWindow=new Window_Gold(0,this._helpWindow.height); this._goldWindow.x=Graphics.boxWidth-this._goldWindow.width; this.addWindow(this._goldWindow) }; Scene_Shop.prototype.createCommandWindow=function() { this._commandWindow=new Window_ShopCommand(this._goldWindow.x,this._purchaseOnly); this._commandWindow.y=this._helpWindow.height; this._commandWindow.setHandler('buy',this.commandBuy.bind(this)); this._commandWindow.setHandler('sell',this.commandSell.bind(this)); this._commandWindow.setHandler('cancel',this.popScene.bind(this)); this.addWindow(this._commandWindow) }; Scene_Shop.prototype.createDummyWindow=function() { var wy=this._commandWindow.y+this._commandWindow.height; var wh=Graphics.boxHeight-wy; this._dummyWindow=new Window_Base(0,wy,Graphics.boxWidth,wh); this.addWindow(this._dummyWindow) }; Scene_Shop.prototype.createNumberWindow=function() { var wy=this._dummyWindow.y; var wh=this._dummyWindow.height; this._numberWindow=new Window_ShopNumber(0,wy,wh); this._numberWindow.hide(); this._numberWindow.setHandler('ok',this.onNumberOk.bind(this)); this._numberWindow.setHandler('cancel',this.onNumberCancel.bind(this)); this.addWindow(this._numberWindow) }; Scene_Shop.prototype.createStatusWindow=function() { var wx=this._numberWindow.width; var wy=this._dummyWindow.y; var ww=Graphics.boxWidth-wx; var wh=this._dummyWindow.height; this._statusWindow=new Window_ShopStatus(wx,wy,ww,wh); this._statusWindow.hide(); this.addWindow(this._statusWindow) }; Scene_Shop.prototype.createBuyWindow=function() { var wy=this._dummyWindow.y; var wh=this._dummyWindow.height; this._buyWindow=new Window_ShopBuy(0,wy,wh,this._goods); this._buyWindow.setHelpWindow(this._helpWindow); this._buyWindow.setStatusWindow(this._statusWindow); this._buyWindow.hide(); this._buyWindow.setHandler('ok',this.onBuyOk.bind(this)); this._buyWindow.setHandler('cancel',this.onBuyCancel.bind(this)); this.addWindow(this._buyWindow) }; Scene_Shop.prototype.createCategoryWindow=function() { this._categoryWindow=new Window_ItemCategory(); this._categoryWindow.setHelpWindow(this._helpWindow); this._categoryWindow.y=this._dummyWindow.y; this._categoryWindow.hide(); this._categoryWindow.deactivate(); this._categoryWindow.setHandler('ok',this.onCategoryOk.bind(this)); this._categoryWindow.setHandler('cancel',this.onCategoryCancel.bind(this)); this.addWindow(this._categoryWindow) }; Scene_Shop.prototype.createSellWindow=function() { var wy=this._categoryWindow.y+this._categoryWindow.height; var wh=Graphics.boxHeight-wy; this._sellWindow=new Window_ShopSell(0,wy,Graphics.boxWidth,wh); this._sellWindow.setHelpWindow(this._helpWindow); this._sellWindow.hide(); this._sellWindow.setHandler('ok',this.onSellOk.bind(this)); this._sellWindow.setHandler('cancel',this.onSellCancel.bind(this)); this._categoryWindow.setItemWindow(this._sellWindow); this.addWindow(this._sellWindow) }; Scene_Shop.prototype.activateBuyWindow=function() { this._buyWindow.setMoney(this.money()); this._buyWindow.show(); this._buyWindow.activate(); this._statusWindow.show() }; Scene_Shop.prototype.activateSellWindow=function() { this._categoryWindow.show(); this._sellWindow.refresh(); this._sellWindow.show(); this._sellWindow.activate(); this._statusWindow.hide() }; Scene_Shop.prototype.commandBuy=function() { this._dummyWindow.hide(); this.activateBuyWindow() }; Scene_Shop.prototype.commandSell=function() { this._dummyWindow.hide(); this._categoryWindow.show(); this._categoryWindow.activate(); this._sellWindow.show(); this._sellWindow.deselect(); this._sellWindow.refresh() }; Scene_Shop.prototype.onBuyOk=function() { this._item=this._buyWindow.item(); this._buyWindow.hide(); this._numberWindow.setup(this._item,this.maxBuy(),this.buyingPrice()); this._numberWindow.setCurrencyUnit(this.currencyUnit()); this._numberWindow.show(); this._numberWindow.activate() }; Scene_Shop.prototype.onBuyCancel=function() { this._commandWindow.activate(); this._dummyWindow.show(); this._buyWindow.hide(); this._statusWindow.hide(); this._statusWindow.setItem(null); this._helpWindow.clear() }; Scene_Shop.prototype.onCategoryOk=function() { this.activateSellWindow(); this._sellWindow.select(0) }; Scene_Shop.prototype.onCategoryCancel=function() { this._commandWindow.activate(); this._dummyWindow.show(); this._categoryWindow.hide(); this._sellWindow.hide() }; Scene_Shop.prototype.onSellOk=function() { this._item=this._sellWindow.item(); this._categoryWindow.hide(); this._sellWindow.hide(); this._numberWindow.setup(this._item,this.maxSell(),this.sellingPrice()); this._numberWindow.setCurrencyUnit(this.currencyUnit()); this._numberWindow.show(); this._numberWindow.activate(); this._statusWindow.setItem(this._item); this._statusWindow.show() }; Scene_Shop.prototype.onSellCancel=function() { this._sellWindow.deselect(); this._categoryWindow.activate(); this._statusWindow.setItem(null); this._helpWindow.clear() }; Scene_Shop.prototype.onNumberOk=function() { SoundManager.playShop(); switch(this._commandWindow.currentSymbol()) { case'buy':this.doBuy(this._numberWindow.number()); break; case'sell':this.doSell(this._numberWindow.number()); break } this.endNumberInput(); this._goldWindow.refresh(); this._statusWindow.refresh() }; Scene_Shop.prototype.onNumberCancel=function() { SoundManager.playCancel(); this.endNumberInput() }; Scene_Shop.prototype.doBuy=function(number) { $gameParty.loseGold(number*this.buyingPrice()); $gameParty.gainItem(this._item,number) }; Scene_Shop.prototype.doSell=function(number) { $gameParty.gainGold(number*this.sellingPrice()); $gameParty.loseItem(this._item,number) }; Scene_Shop.prototype.endNumberInput=function() { this._numberWindow.hide(); switch(this._commandWindow.currentSymbol()) { case'buy':this.activateBuyWindow(); break; case'sell':this.activateSellWindow(); break } }; Scene_Shop.prototype.maxBuy=function() { var max=$gameParty.maxItems(this._item)-$gameParty.numItems(this._item); var price=this.buyingPrice(); if(price>0) { return Math.min(max,Math.floor(this.money()/price)) } else { return max } }; Scene_Shop.prototype.maxSell=function() { return $gameParty.numItems(this._item) }; Scene_Shop.prototype.money=function() { return this._goldWindow.value() }; Scene_Shop.prototype.currencyUnit=function() { return this._goldWindow.currencyUnit() }; Scene_Shop.prototype.buyingPrice=function() { return this._buyWindow.price(this._item) }; Scene_Shop.prototype.sellingPrice=function() { return this._item.price/2 }; function Scene_Name() { this.initialize.apply(this,arguments) } Scene_Name.prototype=Object.create(Scene_MenuBase.prototype); Scene_Name.prototype.constructor=Scene_Name; Scene_Name.prototype.initialize=function() { Scene_MenuBase.prototype.initialize.call(this) }; Scene_Name.prototype.prepare=function(actorId,maxLength) { this._actorId=actorId; this._maxLength=maxLength }; Scene_Name.prototype.create=function() { Scene_MenuBase.prototype.create.call(this); this._actor=$gameActors.actor(this._actorId); this.createEditWindow(); this.createInputWindow() }; Scene_Name.prototype.start=function() { Scene_MenuBase.prototype.start.call(this); this._editWindow.refresh() }; Scene_Name.prototype.createEditWindow=function() { this._editWindow=new Window_NameEdit(this._actor,this._maxLength); this.addWindow(this._editWindow) }; Scene_Name.prototype.createInputWindow=function() { this._inputWindow=new Window_NameInput(this._editWindow); this._inputWindow.setHandler('ok',this.onInputOk.bind(this)); this.addWindow(this._inputWindow) }; Scene_Name.prototype.onInputOk=function() { this._actor.setName(this._editWindow.name()); this.popScene() }; function Scene_Debug() { this.initialize.apply(this,arguments) } Scene_Debug.prototype=Object.create(Scene_MenuBase.prototype); Scene_Debug.prototype.constructor=Scene_Debug; Scene_Debug.prototype.initialize=function() { Scene_MenuBase.prototype.initialize.call(this) }; Scene_Debug.prototype.create=function() { Scene_MenuBase.prototype.create.call(this); this.createRangeWindow(); this.createEditWindow(); this.createDebugHelpWindow() }; Scene_Debug.prototype.createRangeWindow=function() { this._rangeWindow=new Window_DebugRange(0,0); this._rangeWindow.setHandler('ok',this.onRangeOk.bind(this)); this._rangeWindow.setHandler('cancel',this.popScene.bind(this)); this.addWindow(this._rangeWindow) }; Scene_Debug.prototype.createEditWindow=function() { var wx=this._rangeWindow.width; var ww=Graphics.boxWidth-wx; this._editWindow=new Window_DebugEdit(wx,0,ww); this._editWindow.setHandler('cancel',this.onEditCancel.bind(this)); this._rangeWindow.setEditWindow(this._editWindow); this.addWindow(this._editWindow) }; Scene_Debug.prototype.createDebugHelpWindow=function() { var wx=this._editWindow.x; var wy=this._editWindow.height; var ww=this._editWindow.width; var wh=Graphics.boxHeight-wy; this._debugHelpWindow=new Window_Base(wx,wy,ww,wh); this.addWindow(this._debugHelpWindow) }; Scene_Debug.prototype.onRangeOk=function() { this._editWindow.activate(); this._editWindow.select(0); this.refreshHelpWindow() }; Scene_Debug.prototype.onEditCancel=function() { this._rangeWindow.activate(); this._editWindow.deselect(); this.refreshHelpWindow() }; Scene_Debug.prototype.refreshHelpWindow=function() { this._debugHelpWindow.contents.clear(); if(this._editWindow.active) { this._debugHelpWindow.drawTextEx(this.helpText(),4,0) } }; Scene_Debug.prototype.helpText=function() { if(this._rangeWindow.mode()==='switch') { return'Enter : ON / OFF' } else { return('Left : -1\n'+'Right : +1\n'+'Pageup : -10\n'+'Pagedown : +10') } }; function Scene_Battle() { this.initialize.apply(this,arguments) } Scene_Battle.prototype=Object.create(Scene_Base.prototype); Scene_Battle.prototype.constructor=Scene_Battle; Scene_Battle.prototype.initialize=function() { Scene_Base.prototype.initialize.call(this) }; Scene_Battle.prototype.create=function() { Scene_Base.prototype.create.call(this); this.createDisplayObjects() }; Scene_Battle.prototype.start=function() { Scene_Base.prototype.start.call(this); this.startFadeIn(this.fadeSpeed(),false); BattleManager.playBattleBgm(); BattleManager.startBattle() }; Scene_Battle.prototype.update=function() { var active=this.isActive(); $gameTimer.update(active); $gameScreen.update(); this.updateStatusWindow(); this.updateWindowPositions(); if(active&&!this.isBusy()) { this.updateBattleProcess() } Scene_Base.prototype.update.call(this) }; Scene_Battle.prototype.updateBattleProcess=function() { if(!this.isAnyInputWindowActive()||BattleManager.isAborting()||BattleManager.isBattleEnd()) { BattleManager.update(); this.changeInputWindow() } }; Scene_Battle.prototype.isAnyInputWindowActive=function() { return(this._partyCommandWindow.active||this._actorCommandWindow.active||this._skillWindow.active||this._itemWindow.active||this._actorWindow.active||this._enemyWindow.active) }; Scene_Battle.prototype.changeInputWindow=function() { if(BattleManager.isInputting()) { if(BattleManager.actor()) { this.startActorCommandSelection() } else { this.startPartyCommandSelection() } } else { this.endCommandSelection() } }; Scene_Battle.prototype.stop=function() { Scene_Base.prototype.stop.call(this); if(this.needsSlowFadeOut()) { this.startFadeOut(this.slowFadeSpeed(),false) } else { this.startFadeOut(this.fadeSpeed(),false) } this._statusWindow.close(); this._partyCommandWindow.close(); this._actorCommandWindow.close() }; Scene_Battle.prototype.terminate=function() { Scene_Base.prototype.terminate.call(this); $gameParty.onBattleEnd(); $gameTroop.onBattleEnd(); AudioManager.stopMe() }; Scene_Battle.prototype.needsSlowFadeOut=function() { return(SceneManager.isNextScene(Scene_Title)||SceneManager.isNextScene(Scene_Gameover)) }; Scene_Battle.prototype.updateStatusWindow=function() { if($gameMessage.isBusy()) { this._statusWindow.close(); this._partyCommandWindow.close(); this._actorCommandWindow.close() } else if(this.isActive()&&!this._messageWindow.isClosing()) { this._statusWindow.open() } }; Scene_Battle.prototype.updateWindowPositions=function() { var statusX=0; if(BattleManager.isInputting()) { statusX=this._partyCommandWindow.width } else { statusX=this._partyCommandWindow.width/2 } if(this._statusWindow.x<statusX) { this._statusWindow.x+=16; if(this._statusWindow.x>statusX) { this._statusWindow.x=statusX } } if(this._statusWindow.x>statusX) { this._statusWindow.x-=16; if(this._statusWindow.x<statusX) { this._statusWindow.x=statusX } } }; Scene_Battle.prototype.createDisplayObjects=function() { this.createSpriteset(); this.createWindowLayer(); this.createAllWindows(); BattleManager.setLogWindow(this._logWindow); BattleManager.setStatusWindow(this._statusWindow); BattleManager.setSpriteset(this._spriteset); this._logWindow.setSpriteset(this._spriteset) }; Scene_Battle.prototype.createSpriteset=function() { this._spriteset=new Spriteset_Battle(); this.addChild(this._spriteset) }; Scene_Battle.prototype.createAllWindows=function() { this.createLogWindow(); this.createStatusWindow(); this.createPartyCommandWindow(); this.createActorCommandWindow(); this.createHelpWindow(); this.createSkillWindow(); this.createItemWindow(); this.createActorWindow(); this.createEnemyWindow(); this.createMessageWindow(); this.createScrollTextWindow() }; Scene_Battle.prototype.createLogWindow=function() { this._logWindow=new Window_BattleLog(); this.addWindow(this._logWindow) }; Scene_Battle.prototype.createStatusWindow=function() { this._statusWindow=new Window_BattleStatus(); this.addWindow(this._statusWindow) }; Scene_Battle.prototype.createPartyCommandWindow=function() { this._partyCommandWindow=new Window_PartyCommand(); this._partyCommandWindow.setHandler('fight',this.commandFight.bind(this)); this._partyCommandWindow.setHandler('escape',this.commandEscape.bind(this)); this._partyCommandWindow.deselect(); this.addWindow(this._partyCommandWindow) }; Scene_Battle.prototype.createActorCommandWindow=function() { this._actorCommandWindow=new Window_ActorCommand(); this._actorCommandWindow.setHandler('attack',this.commandAttack.bind(this)); this._actorCommandWindow.setHandler('skill',this.commandSkill.bind(this)); this._actorCommandWindow.setHandler('guard',this.commandGuard.bind(this)); this._actorCommandWindow.setHandler('item',this.commandItem.bind(this)); this._actorCommandWindow.setHandler('cancel',this.selectPreviousCommand.bind(this)); this.addWindow(this._actorCommandWindow) }; Scene_Battle.prototype.createHelpWindow=function() { this._helpWindow=new Window_Help(); this._helpWindow.visible=false; this.addWindow(this._helpWindow) }; Scene_Battle.prototype.createSkillWindow=function() { var wy=this._helpWindow.y+this._helpWindow.height; var wh=this._statusWindow.y-wy; this._skillWindow=new Window_BattleSkill(0,wy,Graphics.boxWidth,wh); this._skillWindow.setHelpWindow(this._helpWindow); this._skillWindow.setHandler('ok',this.onSkillOk.bind(this)); this._skillWindow.setHandler('cancel',this.onSkillCancel.bind(this)); this.addWindow(this._skillWindow) }; Scene_Battle.prototype.createItemWindow=function() { var wy=this._helpWindow.y+this._helpWindow.height; var wh=this._statusWindow.y-wy; this._itemWindow=new Window_BattleItem(0,wy,Graphics.boxWidth,wh); this._itemWindow.setHelpWindow(this._helpWindow); this._itemWindow.setHandler('ok',this.onItemOk.bind(this)); this._itemWindow.setHandler('cancel',this.onItemCancel.bind(this)); this.addWindow(this._itemWindow) }; Scene_Battle.prototype.createActorWindow=function() { this._actorWindow=new Window_BattleActor(0,this._statusWindow.y); this._actorWindow.setHandler('ok',this.onActorOk.bind(this)); this._actorWindow.setHandler('cancel',this.onActorCancel.bind(this)); this.addWindow(this._actorWindow) }; Scene_Battle.prototype.createEnemyWindow=function() { this._enemyWindow=new Window_BattleEnemy(0,this._statusWindow.y); this._enemyWindow.x=Graphics.boxWidth-this._enemyWindow.width; this._enemyWindow.setHandler('ok',this.onEnemyOk.bind(this)); this._enemyWindow.setHandler('cancel',this.onEnemyCancel.bind(this)); this.addWindow(this._enemyWindow) }; Scene_Battle.prototype.createMessageWindow=function() { this._messageWindow=new Window_Message(); this.addWindow(this._messageWindow); this._messageWindow.subWindows().forEach(function(window) { this.addWindow(window) } ,this) }; Scene_Battle.prototype.createScrollTextWindow=function() { this._scrollTextWindow=new Window_ScrollText(); this.addWindow(this._scrollTextWindow) }; Scene_Battle.prototype.refreshStatus=function() { this._statusWindow.refresh() }; Scene_Battle.prototype.startPartyCommandSelection=function() { this.refreshStatus(); this._statusWindow.deselect(); this._statusWindow.open(); this._actorCommandWindow.close(); this._partyCommandWindow.setup() }; Scene_Battle.prototype.commandFight=function() { this.selectNextCommand() }; Scene_Battle.prototype.commandEscape=function() { BattleManager.processEscape(); this.changeInputWindow() }; Scene_Battle.prototype.startActorCommandSelection=function() { this._statusWindow.select(BattleManager.actor().index()); this._partyCommandWindow.close(); this._actorCommandWindow.setup(BattleManager.actor()) }; Scene_Battle.prototype.commandAttack=function() { BattleManager.inputtingAction().setAttack(); this.selectEnemySelection() }; Scene_Battle.prototype.commandSkill=function() { this._skillWindow.setActor(BattleManager.actor()); this._skillWindow.setStypeId(this._actorCommandWindow.currentExt()); this._skillWindow.refresh(); this._skillWindow.show(); this._skillWindow.activate() }; Scene_Battle.prototype.commandGuard=function() { BattleManager.inputtingAction().setGuard(); this.selectNextCommand() }; Scene_Battle.prototype.commandItem=function() { this._itemWindow.refresh(); this._itemWindow.show(); this._itemWindow.activate() }; Scene_Battle.prototype.selectNextCommand=function() { BattleManager.selectNextCommand(); this.changeInputWindow() }; Scene_Battle.prototype.selectPreviousCommand=function() { BattleManager.selectPreviousCommand(); this.changeInputWindow() }; Scene_Battle.prototype.selectActorSelection=function() { this._actorWindow.refresh(); this._actorWindow.show(); this._actorWindow.activate() }; Scene_Battle.prototype.onActorOk=function() { var action=BattleManager.inputtingAction(); action.setTarget(this._actorWindow.index()); this._actorWindow.hide(); this._skillWindow.hide(); this._itemWindow.hide(); this.selectNextCommand() }; Scene_Battle.prototype.onActorCancel=function() { this._actorWindow.hide(); switch(this._actorCommandWindow.currentSymbol()) { case'skill':this._skillWindow.show(); this._skillWindow.activate(); break; case'item':this._itemWindow.show(); this._itemWindow.activate(); break } }; Scene_Battle.prototype.selectEnemySelection=function() { this._enemyWindow.refresh(); this._enemyWindow.show(); this._enemyWindow.select(0); this._enemyWindow.activate() }; Scene_Battle.prototype.onEnemyOk=function() { var action=BattleManager.inputtingAction(); action.setTarget(this._enemyWindow.enemyIndex()); this._enemyWindow.hide(); this._skillWindow.hide(); this._itemWindow.hide(); this.selectNextCommand() }; Scene_Battle.prototype.onEnemyCancel=function() { this._enemyWindow.hide(); switch(this._actorCommandWindow.currentSymbol()) { case'attack':this._actorCommandWindow.activate(); break; case'skill':this._skillWindow.show(); this._skillWindow.activate(); break; case'item':this._itemWindow.show(); this._itemWindow.activate(); break } }; Scene_Battle.prototype.onSkillOk=function() { var skill=this._skillWindow.item(); var action=BattleManager.inputtingAction(); action.setSkill(skill.id); BattleManager.actor().setLastBattleSkill(skill); this.onSelectAction() }; Scene_Battle.prototype.onSkillCancel=function() { this._skillWindow.hide(); this._actorCommandWindow.activate() }; Scene_Battle.prototype.onItemOk=function() { var item=this._itemWindow.item(); var action=BattleManager.inputtingAction(); action.setItem(item.id); $gameParty.setLastItem(item); this.onSelectAction() }; Scene_Battle.prototype.onItemCancel=function() { this._itemWindow.hide(); this._actorCommandWindow.activate() }; Scene_Battle.prototype.onSelectAction=function() { var action=BattleManager.inputtingAction(); this._skillWindow.hide(); this._itemWindow.hide(); if(!action.needsSelection()) { this.selectNextCommand() } else if(action.isForOpponent()) { this.selectEnemySelection() } else { this.selectActorSelection() } }; Scene_Battle.prototype.endCommandSelection=function() { this._partyCommandWindow.close(); this._actorCommandWindow.close(); this._statusWindow.deselect() }; function Scene_Gameover() { this.initialize.apply(this,arguments) } Scene_Gameover.prototype=Object.create(Scene_Base.prototype); Scene_Gameover.prototype.constructor=Scene_Gameover; Scene_Gameover.prototype.initialize=function() { Scene_Base.prototype.initialize.call(this) }; Scene_Gameover.prototype.create=function() { Scene_Base.prototype.create.call(this); this.playGameoverMusic(); this.createBackground() }; Scene_Gameover.prototype.start=function() { Scene_Base.prototype.start.call(this); this.startFadeIn(this.slowFadeSpeed(),false) }; Scene_Gameover.prototype.update=function() { if(this.isActive()&&!this.isBusy()&&this.isTriggered()) { this.gotoTitle() } Scene_Base.prototype.update.call(this) }; Scene_Gameover.prototype.stop=function() { Scene_Base.prototype.stop.call(this); this.fadeOutAll() }; Scene_Gameover.prototype.terminate=function() { Scene_Base.prototype.terminate.call(this); AudioManager.stopAll() }; Scene_Gameover.prototype.playGameoverMusic=function() { AudioManager.stopBgm(); AudioManager.stopBgs(); AudioManager.playMe($dataSystem.gameoverMe) }; Scene_Gameover.prototype.createBackground=function() { this._backSprite=new Sprite(); this._backSprite.bitmap=ImageManager.loadSystem('GameOver'); this.addChild(this._backSprite) }; Scene_Gameover.prototype.isTriggered=function() { return Input.isTriggered('ok')||TouchInput.isTriggered() }; Scene_Gameover.prototype.gotoTitle=function() { SceneManager.goto(Scene_Title) }; rpg_object.js function Game_Temp() { this.initialize.apply(this,arguments) } Game_Temp.prototype.initialize=function() { this._isPlaytest=Utils.isOptionValid('test'); this._commonEventId=0; this._destinationX=null; this._destinationY=null }; Game_Temp.prototype.isPlaytest=function() { return this._isPlaytest }; Game_Temp.prototype.reserveCommonEvent=function(commonEventId) { this._commonEventId=commonEventId }; Game_Temp.prototype.clearCommonEvent=function() { this._commonEventId=0 }; Game_Temp.prototype.isCommonEventReserved=function() { return this._commonEventId>0 }; Game_Temp.prototype.reservedCommonEvent=function() { return $dataCommonEvents[this._commonEventId] }; Game_Temp.prototype.setDestination=function(x,y) { this._destinationX=x; this._destinationY=y }; Game_Temp.prototype.clearDestination=function() { this._destinationX=null; this._destinationY=null }; Game_Temp.prototype.isDestinationValid=function() { return this._destinationX!==null }; Game_Temp.prototype.destinationX=function() { return this._destinationX }; Game_Temp.prototype.destinationY=function() { return this._destinationY }; function Game_System() { this.initialize.apply(this,arguments) } Game_System.prototype.initialize=function() { this._saveEnabled=true; this._menuEnabled=true; this._encounterEnabled=true; this._formationEnabled=true; this._battleCount=0; this._winCount=0; this._escapeCount=0; this._saveCount=0; this._versionId=0; this._framesOnSave=0; this._bgmOnSave=null; this._bgsOnSave=null; this._windowTone=null; this._battleBgm=null; this._victoryMe=null; this._defeatMe=null; this._savedBgm=null; this._walkingBgm=null }; Game_System.prototype.isJapanese=function() { return $dataSystem.locale.match(/^ja/) }; Game_System.prototype.isChinese=function() { return $dataSystem.locale.match(/^zh/) }; Game_System.prototype.isKorean=function() { return $dataSystem.locale.match(/^ko/) }; Game_System.prototype.isCJK=function() { return $dataSystem.locale.match(/^(ja|zh|ko)/) }; Game_System.prototype.isRussian=function() { return $dataSystem.locale.match(/^ru/) }; Game_System.prototype.isSideView=function() { return $dataSystem.optSideView }; Game_System.prototype.isSaveEnabled=function() { return this._saveEnabled }; Game_System.prototype.disableSave=function() { this._saveEnabled=false }; Game_System.prototype.enableSave=function() { this._saveEnabled=true }; Game_System.prototype.isMenuEnabled=function() { return this._menuEnabled }; Game_System.prototype.disableMenu=function() { this._menuEnabled=false }; Game_System.prototype.enableMenu=function() { this._menuEnabled=true }; Game_System.prototype.isEncounterEnabled=function() { return this._encounterEnabled }; Game_System.prototype.disableEncounter=function() { this._encounterEnabled=false }; Game_System.prototype.enableEncounter=function() { this._encounterEnabled=true }; Game_System.prototype.isFormationEnabled=function() { return this._formationEnabled }; Game_System.prototype.disableFormation=function() { this._formationEnabled=false }; Game_System.prototype.enableFormation=function() { this._formationEnabled=true }; Game_System.prototype.battleCount=function() { return this._battleCount }; Game_System.prototype.winCount=function() { return this._winCount }; Game_System.prototype.escapeCount=function() { return this._escapeCount }; Game_System.prototype.saveCount=function() { return this._saveCount }; Game_System.prototype.versionId=function() { return this._versionId }; Game_System.prototype.windowTone=function() { return this._windowTone||$dataSystem.windowTone }; Game_System.prototype.setWindowTone=function(value) { this._windowTone=value }; Game_System.prototype.battleBgm=function() { return this._battleBgm||$dataSystem.battleBgm }; Game_System.prototype.setBattleBgm=function(value) { this._battleBgm=value }; Game_System.prototype.victoryMe=function() { return this._victoryMe||$dataSystem.victoryMe }; Game_System.prototype.setVictoryMe=function(value) { this._victoryMe=value }; Game_System.prototype.defeatMe=function() { return this._defeatMe||$dataSystem.defeatMe }; Game_System.prototype.setDefeatMe=function(value) { this._defeatMe=value }; Game_System.prototype.onBattleStart=function() { this._battleCount++ }; Game_System.prototype.onBattleWin=function() { this._winCount++ }; Game_System.prototype.onBattleEscape=function() { this._escapeCount++ }; Game_System.prototype.onBeforeSave=function() { this._saveCount++; this._versionId=$dataSystem.versionId; this._framesOnSave=Graphics.frameCount; this._bgmOnSave=AudioManager.saveBgm(); this._bgsOnSave=AudioManager.saveBgs() }; Game_System.prototype.onAfterLoad=function() { Graphics.frameCount=this._framesOnSave; AudioManager.playBgm(this._bgmOnSave); AudioManager.playBgs(this._bgsOnSave) }; Game_System.prototype.playtime=function() { return Math.floor(Graphics.frameCount/60) }; Game_System.prototype.playtimeText=function() { var hour=Math.floor(this.playtime()/60/60); var min=Math.floor(this.playtime()/60)%60; var sec=this.playtime()%60; return hour.padZero(2)+':'+min.padZero(2)+':'+sec.padZero(2) }; Game_System.prototype.saveBgm=function() { this._savedBgm=AudioManager.saveBgm() }; Game_System.prototype.replayBgm=function() { if(this._savedBgm) { AudioManager.replayBgm(this._savedBgm) } }; Game_System.prototype.saveWalkingBgm=function() { this._walkingBgm=AudioManager.saveBgm() }; Game_System.prototype.replayWalkingBgm=function() { if(this._walkingBgm) { AudioManager.playBgm(this._walkingBgm) } }; function Game_Timer() { this.initialize.apply(this,arguments) } Game_Timer.prototype.initialize=function() { this._frames=0; this._working=false }; Game_Timer.prototype.update=function(sceneActive) { if(sceneActive&&this._working&&this._frames>0) { this._frames--; if(this._frames===0) { this.onExpire() } } }; Game_Timer.prototype.start=function(count) { this._frames=count; this._working=true }; Game_Timer.prototype.stop=function() { this._working=false }; Game_Timer.prototype.isWorking=function() { return this._working }; Game_Timer.prototype.seconds=function() { return Math.floor(this._frames/60) }; Game_Timer.prototype.onExpire=function() { BattleManager.abort() }; function Game_Message() { this.initialize.apply(this,arguments) } Game_Message.prototype.initialize=function() { this.clear() }; Game_Message.prototype.clear=function() { this._texts=[]; this._choices=[]; this._faceName=''; this._faceIndex=0; this._background=0; this._positionType=2; this._choiceDefaultType=0; this._choiceCancelType=0; this._choiceBackground=0; this._choicePositionType=2; this._numInputVariableId=0; this._numInputMaxDigits=0; this._itemChoiceVariableId=0; this._itemChoiceItypeId=0; this._scrollMode=false; this._scrollSpeed=2; this._scrollNoFast=false; this._choiceCallback=null }; Game_Message.prototype.choices=function() { return this._choices }; Game_Message.prototype.faceName=function() { return this._faceName }; Game_Message.prototype.faceIndex=function() { return this._faceIndex }; Game_Message.prototype.background=function() { return this._background }; Game_Message.prototype.positionType=function() { return this._positionType }; Game_Message.prototype.choiceDefaultType=function() { return this._choiceDefaultType }; Game_Message.prototype.choiceCancelType=function() { return this._choiceCancelType }; Game_Message.prototype.choiceBackground=function() { return this._choiceBackground }; Game_Message.prototype.choicePositionType=function() { return this._choicePositionType }; Game_Message.prototype.numInputVariableId=function() { return this._numInputVariableId }; Game_Message.prototype.numInputMaxDigits=function() { return this._numInputMaxDigits }; Game_Message.prototype.itemChoiceVariableId=function() { return this._itemChoiceVariableId }; Game_Message.prototype.itemChoiceItypeId=function() { return this._itemChoiceItypeId }; Game_Message.prototype.scrollMode=function() { return this._scrollMode }; Game_Message.prototype.scrollSpeed=function() { return this._scrollSpeed }; Game_Message.prototype.scrollNoFast=function() { return this._scrollNoFast }; Game_Message.prototype.add=function(text) { this._texts.push(text) }; Game_Message.prototype.setFaceImage=function(faceName,faceIndex) { this._faceName=faceName; this._faceIndex=faceIndex }; Game_Message.prototype.setBackground=function(background) { this._background=background }; Game_Message.prototype.setPositionType=function(positionType) { this._positionType=positionType }; Game_Message.prototype.setChoices=function(choices,defaultType,cancelType) { this._choices=choices; this._choiceDefaultType=defaultType; this._choiceCancelType=cancelType }; Game_Message.prototype.setChoiceBackground=function(background) { this._choiceBackground=background }; Game_Message.prototype.setChoicePositionType=function(positionType) { this._choicePositionType=positionType }; Game_Message.prototype.setNumberInput=function(variableId,maxDigits) { this._numInputVariableId=variableId; this._numInputMaxDigits=maxDigits }; Game_Message.prototype.setItemChoice=function(variableId,itemType) { this._itemChoiceVariableId=variableId; this._itemChoiceItypeId=itemType }; Game_Message.prototype.setScroll=function(speed,noFast) { this._scrollMode=true; this._scrollSpeed=speed; this._scrollNoFast=noFast }; Game_Message.prototype.setChoiceCallback=function(callback) { this._choiceCallback=callback }; Game_Message.prototype.onChoice=function(n) { if(this._choiceCallback) { this._choiceCallback(n); this._choiceCallback=null } }; Game_Message.prototype.hasText=function() { return this._texts.length>0 }; Game_Message.prototype.isChoice=function() { return this._choices.length>0 }; Game_Message.prototype.isNumberInput=function() { return this._numInputVariableId>0 }; Game_Message.prototype.isItemChoice=function() { return this._itemChoiceVariableId>0 }; Game_Message.prototype.isBusy=function() { return(this.hasText()||this.isChoice()||this.isNumberInput()||this.isItemChoice()) }; Game_Message.prototype.newPage=function() { if(this._texts.length>0) { this._texts[this._texts.length-1]+='\f' } }; Game_Message.prototype.allText=function() { return this._texts.reduce(function(previousValue,currentValue) { return previousValue+'\n'+currentValue } ) }; function Game_Switches() { this.initialize.apply(this,arguments) } Game_Switches.prototype.initialize=function() { this.clear() }; Game_Switches.prototype.clear=function() { this._data=[] }; Game_Switches.prototype.value=function(switchId) { return!!this._data[switchId] }; Game_Switches.prototype.setValue=function(switchId,value) { if(switchId>0&&switchId<$dataSystem.switches.length) { this._data[switchId]=value; this.onChange() } }; Game_Switches.prototype.onChange=function() { $gameMap.requestRefresh() }; function Game_Variables() { this.initialize.apply(this,arguments) } Game_Variables.prototype.initialize=function() { this.clear() }; Game_Variables.prototype.clear=function() { this._data=[] }; Game_Variables.prototype.value=function(variableId) { return this._data[variableId]||0 }; Game_Variables.prototype.setValue=function(variableId,value) { if(variableId>0&&variableId<$dataSystem.variables.length) { if(typeof value==='number') { value=Math.floor(value) } this._data[variableId]=value; this.onChange() } }; Game_Variables.prototype.onChange=function() { $gameMap.requestRefresh() }; function Game_SelfSwitches() { this.initialize.apply(this,arguments) } Game_SelfSwitches.prototype.initialize=function() { this.clear() }; Game_SelfSwitches.prototype.clear=function() { this._data= { } }; Game_SelfSwitches.prototype.value=function(key) { return!!this._data[key] }; Game_SelfSwitches.prototype.setValue=function(key,value) { if(value) { this._data[key]=true } else { delete this._data[key] } this.onChange() }; Game_SelfSwitches.prototype.onChange=function() { $gameMap.requestRefresh() }; function Game_Screen() { this.initialize.apply(this,arguments) } Game_Screen.prototype.initialize=function() { this.clear() }; Game_Screen.prototype.clear=function() { this.clearFade(); this.clearTone(); this.clearFlash(); this.clearShake(); this.clearZoom(); this.clearWeather(); this.clearPictures() }; Game_Screen.prototype.onBattleStart=function() { this.clearFade(); this.clearFlash(); this.clearShake(); this.clearZoom(); this.eraseBattlePictures() }; Game_Screen.prototype.brightness=function() { return this._brightness }; Game_Screen.prototype.tone=function() { return this._tone }; Game_Screen.prototype.flashColor=function() { return this._flashColor }; Game_Screen.prototype.shake=function() { return this._shake }; Game_Screen.prototype.zoomX=function() { return this._zoomX }; Game_Screen.prototype.zoomY=function() { return this._zoomY }; Game_Screen.prototype.zoomScale=function() { return this._zoomScale }; Game_Screen.prototype.weatherType=function() { return this._weatherType }; Game_Screen.prototype.weatherPower=function() { return this._weatherPower }; Game_Screen.prototype.picture=function(pictureId) { var realPictureId=this.realPictureId(pictureId); return this._pictures[realPictureId] }; Game_Screen.prototype.realPictureId=function(pictureId) { if($gameParty.inBattle()) { return pictureId+this.maxPictures() } else { return pictureId } }; Game_Screen.prototype.clearFade=function() { this._brightness=255; this._fadeOutDuration=0; this._fadeInDuration=0 }; Game_Screen.prototype.clearTone=function() { this._tone=[0,0,0,0]; this._toneTarget=[0,0,0,0]; this._toneDuration=0 }; Game_Screen.prototype.clearFlash=function() { this._flashColor=[0,0,0,0]; this._flashDuration=0 }; Game_Screen.prototype.clearShake=function() { this._shakePower=0; this._shakeSpeed=0; this._shakeDuration=0; this._shakeDirection=1; this._shake=0 }; Game_Screen.prototype.clearZoom=function() { this._zoomX=0; this._zoomY=0; this._zoomScale=1; this._zoomScaleTarget=1; this._zoomDuration=0 }; Game_Screen.prototype.clearWeather=function() { this._weatherType='none'; this._weatherPower=0; this._weatherPowerTarget=0; this._weatherDuration=0 }; Game_Screen.prototype.clearPictures=function() { this._pictures=[] }; Game_Screen.prototype.eraseBattlePictures=function() { this._pictures=this._pictures.slice(0,this.maxPictures()+1) }; Game_Screen.prototype.maxPictures=function() { return 100 }; Game_Screen.prototype.startFadeOut=function(duration) { this._fadeOutDuration=duration; this._fadeInDuration=0 }; Game_Screen.prototype.startFadeIn=function(duration) { this._fadeInDuration=duration; this._fadeOutDuration=0 }; Game_Screen.prototype.startTint=function(tone,duration) { this._toneTarget=tone.clone(); this._toneDuration=duration; if(this._toneDuration===0) { this._tone=this._toneTarget.clone() } }; Game_Screen.prototype.startFlash=function(color,duration) { this._flashColor=color.clone(); this._flashDuration=duration }; Game_Screen.prototype.startShake=function(power,speed,duration) { this._shakePower=power; this._shakeSpeed=speed; this._shakeDuration=duration }; Game_Screen.prototype.startZoom=function(x,y,scale,duration) { this._zoomX=x; this._zoomY=y; this._zoomScaleTarget=scale; this._zoomDuration=duration }; Game_Screen.prototype.setZoom=function(x,y,scale) { this._zoomX=x; this._zoomY=y; this._zoomScale=scale }; Game_Screen.prototype.changeWeather=function(type,power,duration) { if(type!=='none'||duration===0) { this._weatherType=type } this._weatherPowerTarget=type==='none'?0:power; this._weatherDuration=duration; if(duration===0) { this._weatherPower=this._weatherPowerTarget } }; Game_Screen.prototype.update=function() { this.updateFadeOut(); this.updateFadeIn(); this.updateTone(); this.updateFlash(); this.updateShake(); this.updateZoom(); this.updateWeather(); this.updatePictures() }; Game_Screen.prototype.updateFadeOut=function() { if(this._fadeOutDuration>0) { var d=this._fadeOutDuration; this._brightness=(this._brightness*(d-1))/d; this._fadeOutDuration-- } }; Game_Screen.prototype.updateFadeIn=function() { if(this._fadeInDuration>0) { var d=this._fadeInDuration; this._brightness=(this._brightness*(d-1)+255)/d; this._fadeInDuration-- } }; Game_Screen.prototype.updateTone=function() { if(this._toneDuration>0) { var d=this._toneDuration; for(var i=0; i<4; i++) { this._tone[i]=(this._tone[i]*(d-1)+this._toneTarget[i])/d } this._toneDuration-- } }; Game_Screen.prototype.updateFlash=function() { if(this._flashDuration>0) { var d=this._flashDuration; this._flashColor[3]*=(d-1)/d; this._flashDuration-- } }; Game_Screen.prototype.updateShake=function() { if(this._shakeDuration>0||this._shake!==0) { var delta=(this._shakePower*this._shakeSpeed*this._shakeDirection)/10; if(this._shakeDuration<=1&&this._shake*(this._shake+delta)<0) { this._shake=0 } else { this._shake+=delta } if(this._shake>this._shakePower*2) { this._shakeDirection=-1 } if(this._shake<-this._shakePower*2) { this._shakeDirection=1 } this._shakeDuration-- } }; Game_Screen.prototype.updateZoom=function() { if(this._zoomDuration>0) { var d=this._zoomDuration; var t=this._zoomScaleTarget; this._zoomScale=(this._zoomScale*(d-1)+t)/d; this._zoomDuration-- } }; Game_Screen.prototype.updateWeather=function() { if(this._weatherDuration>0) { var d=this._weatherDuration; var t=this._weatherPowerTarget; this._weatherPower=(this._weatherPower*(d-1)+t)/d; this._weatherDuration--; if(this._weatherDuration===0&&this._weatherPowerTarget===0) { this._weatherType='none' } } }; Game_Screen.prototype.updatePictures=function() { this._pictures.forEach(function(picture) { if(picture) { picture.update() } } ) }; Game_Screen.prototype.startFlashForDamage=function() { this.startFlash([255,0,0,128],8) }; Game_Screen.prototype.showPicture=function(pictureId,name,origin,x,y,scaleX,scaleY,opacity,blendMode) { var realPictureId=this.realPictureId(pictureId); var picture=new Game_Picture(); picture.show(name,origin,x,y,scaleX,scaleY,opacity,blendMode); this._pictures[realPictureId]=picture }; Game_Screen.prototype.movePicture=function(pictureId,origin,x,y,scaleX,scaleY,opacity,blendMode,duration) { var picture=this.picture(pictureId); if(picture) { picture.move(origin,x,y,scaleX,scaleY,opacity,blendMode,duration) } }; Game_Screen.prototype.rotatePicture=function(pictureId,speed) { var picture=this.picture(pictureId); if(picture) { picture.rotate(speed) } }; Game_Screen.prototype.tintPicture=function(pictureId,tone,duration) { var picture=this.picture(pictureId); if(picture) { picture.tint(tone,duration) } }; Game_Screen.prototype.erasePicture=function(pictureId) { var realPictureId=this.realPictureId(pictureId); this._pictures[realPictureId]=null }; function Game_Picture() { this.initialize.apply(this,arguments) } Game_Picture.prototype.initialize=function() { this.initBasic(); this.initTarget(); this.initTone(); this.initRotation() }; Game_Picture.prototype.name=function() { return this._name }; Game_Picture.prototype.origin=function() { return this._origin }; Game_Picture.prototype.x=function() { return this._x }; Game_Picture.prototype.y=function() { return this._y }; Game_Picture.prototype.scaleX=function() { return this._scaleX }; Game_Picture.prototype.scaleY=function() { return this._scaleY }; Game_Picture.prototype.opacity=function() { return this._opacity }; Game_Picture.prototype.blendMode=function() { return this._blendMode }; Game_Picture.prototype.tone=function() { return this._tone }; Game_Picture.prototype.angle=function() { return this._angle }; Game_Picture.prototype.initBasic=function() { this._name=''; this._origin=0; this._x=0; this._y=0; this._scaleX=100; this._scaleY=100; this._opacity=255; this._blendMode=0 }; Game_Picture.prototype.initTarget=function() { this._targetX=this._x; this._targetY=this._y; this._targetScaleX=this._scaleX; this._targetScaleY=this._scaleY; this._targetOpacity=this._opacity; this._duration=0 }; Game_Picture.prototype.initTone=function() { this._tone=null; this._toneTarget=null; this._toneDuration=0 }; Game_Picture.prototype.initRotation=function() { this._angle=0; this._rotationSpeed=0 }; Game_Picture.prototype.show=function(name,origin,x,y,scaleX,scaleY,opacity,blendMode) { this._name=name; this._origin=origin; this._x=x; this._y=y; this._scaleX=scaleX; this._scaleY=scaleY; this._opacity=opacity; this._blendMode=blendMode; this.initTarget(); this.initTone(); this.initRotation() }; Game_Picture.prototype.move=function(origin,x,y,scaleX,scaleY,opacity,blendMode,duration) { this._origin=origin; this._targetX=x; this._targetY=y; this._targetScaleX=scaleX; this._targetScaleY=scaleY; this._targetOpacity=opacity; this._blendMode=blendMode; this._duration=duration }; Game_Picture.prototype.rotate=function(speed) { this._rotationSpeed=speed }; Game_Picture.prototype.tint=function(tone,duration) { if(!this._tone) { this._tone=[0,0,0,0] } this._toneTarget=tone.clone(); this._toneDuration=duration; if(this._toneDuration===0) { this._tone=this._toneTarget.clone() } }; Game_Picture.prototype.erase=function() { this._name=''; this._origin=0; this.initTarget(); this.initTone(); this.initRotation() }; Game_Picture.prototype.update=function() { this.updateMove(); this.updateTone(); this.updateRotation() }; Game_Picture.prototype.updateMove=function() { if(this._duration>0) { var d=this._duration; this._x=(this._x*(d-1)+this._targetX)/d; this._y=(this._y*(d-1)+this._targetY)/d; this._scaleX=(this._scaleX*(d-1)+this._targetScaleX)/d; this._scaleY=(this._scaleY*(d-1)+this._targetScaleY)/d; this._opacity=(this._opacity*(d-1)+this._targetOpacity)/d; this._duration-- } }; Game_Picture.prototype.updateTone=function() { if(this._toneDuration>0) { var d=this._toneDuration; for(var i=0; i<4; i++) { this._tone[i]=(this._tone[i]*(d-1)+this._toneTarget[i])/d } this._toneDuration-- } }; Game_Picture.prototype.updateRotation=function() { if(this._rotationSpeed>0) { this._angle+=this._rotationSpeed/2 } }; function Game_Item() { this.initialize.apply(this,arguments) } Game_Item.prototype.initialize=function(item) { this._dataClass=''; this._itemId=0; if(item) { this.setObject(item) } }; Game_Item.prototype.isSkill=function() { return this._dataClass==='skill' }; Game_Item.prototype.isItem=function() { return this._dataClass==='item' }; Game_Item.prototype.isUsableItem=function() { return this.isSkill()||this.isItem() }; Game_Item.prototype.isWeapon=function() { return this._dataClass==='weapon' }; Game_Item.prototype.isArmor=function() { return this._dataClass==='armor' }; Game_Item.prototype.isEquipItem=function() { return this.isWeapon()||this.isArmor() }; Game_Item.prototype.isNull=function() { return this._dataClass==='' }; Game_Item.prototype.itemId=function() { return this._itemId }; Game_Item.prototype.object=function() { if(this.isSkill()) { return $dataSkills[this._itemId] } else if(this.isItem()) { return $dataItems[this._itemId] } else if(this.isWeapon()) { return $dataWeapons[this._itemId] } else if(this.isArmor()) { return $dataArmors[this._itemId] } else { return null } }; Game_Item.prototype.setObject=function(item) { if(DataManager.isSkill(item)) { this._dataClass='skill' } else if(DataManager.isItem(item)) { this._dataClass='item' } else if(DataManager.isWeapon(item)) { this._dataClass='weapon' } else if(DataManager.isArmor(item)) { this._dataClass='armor' } else { this._dataClass='' } this._itemId=item?item.id:0 }; Game_Item.prototype.setEquip=function(isWeapon,itemId) { this._dataClass=isWeapon?'weapon':'armor'; this._itemId=itemId }; function Game_Action() { this.initialize.apply(this,arguments) } Game_Action.EFFECT_RECOVER_HP=11; Game_Action.EFFECT_RECOVER_MP=12; Game_Action.EFFECT_GAIN_TP=13; Game_Action.EFFECT_ADD_STATE=21; Game_Action.EFFECT_REMOVE_STATE=22; Game_Action.EFFECT_ADD_BUFF=31; Game_Action.EFFECT_ADD_DEBUFF=32; Game_Action.EFFECT_REMOVE_BUFF=33; Game_Action.EFFECT_REMOVE_DEBUFF=34; Game_Action.EFFECT_SPECIAL=41; Game_Action.EFFECT_GROW=42; Game_Action.EFFECT_LEARN_SKILL=43; Game_Action.EFFECT_COMMON_EVENT=44; Game_Action.SPECIAL_EFFECT_ESCAPE=0; Game_Action.HITTYPE_CERTAIN=0; Game_Action.HITTYPE_PHYSICAL=1; Game_Action.HITTYPE_MAGICAL=2; Game_Action.prototype.initialize=function(subject,forcing) { this._subjectActorId=0; this._subjectEnemyIndex=-1; this._forcing=forcing||false; this.setSubject(subject); this.clear() }; Game_Action.prototype.clear=function() { this._item=new Game_Item(); this._targetIndex=-1 }; Game_Action.prototype.setSubject=function(subject) { if(subject.isActor()) { this._subjectActorId=subject.actorId(); this._subjectEnemyIndex=-1 } else { this._subjectEnemyIndex=subject.index(); this._subjectActorId=0 } }; Game_Action.prototype.subject=function() { if(this._subjectActorId>0) { return $gameActors.actor(this._subjectActorId) } else { return $gameTroop.members()[this._subjectEnemyIndex] } }; Game_Action.prototype.friendsUnit=function() { return this.subject().friendsUnit() }; Game_Action.prototype.opponentsUnit=function() { return this.subject().opponentsUnit() }; Game_Action.prototype.setEnemyAction=function(action) { if(action) { this.setSkill(action.skillId) } else { this.clear() } }; Game_Action.prototype.setAttack=function() { this.setSkill(this.subject().attackSkillId()) }; Game_Action.prototype.setGuard=function() { this.setSkill(this.subject().guardSkillId()) }; Game_Action.prototype.setSkill=function(skillId) { this._item.setObject($dataSkills[skillId]) }; Game_Action.prototype.setItem=function(itemId) { this._item.setObject($dataItems[itemId]) }; Game_Action.prototype.setItemObject=function(object) { this._item.setObject(object) }; Game_Action.prototype.setTarget=function(targetIndex) { this._targetIndex=targetIndex }; Game_Action.prototype.item=function() { return this._item.object() }; Game_Action.prototype.isSkill=function() { return this._item.isSkill() }; Game_Action.prototype.isItem=function() { return this._item.isItem() }; Game_Action.prototype.numRepeats=function() { var repeats=this.item().repeats; if(this.isAttack()) { repeats+=this.subject().attackTimesAdd() } return Math.floor(repeats) }; Game_Action.prototype.checkItemScope=function(list) { return list.contains(this.item().scope) }; Game_Action.prototype.isForOpponent=function() { return this.checkItemScope([1,2,3,4,5,6]) }; Game_Action.prototype.isForFriend=function() { return this.checkItemScope([7,8,9,10,11]) }; Game_Action.prototype.isForDeadFriend=function() { return this.checkItemScope([9,10]) }; Game_Action.prototype.isForUser=function() { return this.checkItemScope([11]) }; Game_Action.prototype.isForOne=function() { return this.checkItemScope([1,3,7,9,11]) }; Game_Action.prototype.isForRandom=function() { return this.checkItemScope([3,4,5,6]) }; Game_Action.prototype.isForAll=function() { return this.checkItemScope([2,8,10]) }; Game_Action.prototype.needsSelection=function() { return this.checkItemScope([1,7,9]) }; Game_Action.prototype.numTargets=function() { return this.isForRandom()?this.item().scope-2:0 }; Game_Action.prototype.checkDamageType=function(list) { return list.contains(this.item().damage.type) }; Game_Action.prototype.isHpEffect=function() { return this.checkDamageType([1,3,5]) }; Game_Action.prototype.isMpEffect=function() { return this.checkDamageType([2,4,6]) }; Game_Action.prototype.isDamage=function() { return this.checkDamageType([1,2]) }; Game_Action.prototype.isRecover=function() { return this.checkDamageType([3,4]) }; Game_Action.prototype.isDrain=function() { return this.checkDamageType([5,6]) }; Game_Action.prototype.isHpRecover=function() { return this.checkDamageType([3]) }; Game_Action.prototype.isMpRecover=function() { return this.checkDamageType([4]) }; Game_Action.prototype.isCertainHit=function() { return this.item().hitType===Game_Action.HITTYPE_CERTAIN }; Game_Action.prototype.isPhysical=function() { return this.item().hitType===Game_Action.HITTYPE_PHYSICAL }; Game_Action.prototype.isMagical=function() { return this.item().hitType===Game_Action.HITTYPE_MAGICAL }; Game_Action.prototype.isAttack=function() { return this.item()===$dataSkills[this.subject().attackSkillId()] }; Game_Action.prototype.isGuard=function() { return this.item()===$dataSkills[this.subject().guardSkillId()] }; Game_Action.prototype.isMagicSkill=function() { if(this.isSkill()) { return $dataSystem.magicSkills.contains(this.item().stypeId) } else { return false } }; Game_Action.prototype.decideRandomTarget=function() { var target; if(this.isForDeadFriend()) { target=this.friendsUnit().randomDeadTarget() } else if(this.isForFriend()) { target=this.friendsUnit().randomTarget() } else { target=this.opponentsUnit().randomTarget() } if(target) { this._targetIndex=target.index } else { this.clear() } }; Game_Action.prototype.setConfusion=function() { this.setAttack() }; Game_Action.prototype.prepare=function() { if(this.subject().isConfused()&&!this._forcing) { this.setConfusion() } }; Game_Action.prototype.isValid=function() { return(this._forcing&&this.item())||this.subject().canUse(this.item()) }; Game_Action.prototype.speed=function() { var agi=this.subject().agi; var speed=agi+Math.randomInt(Math.floor(5+agi/4)); if(this.item()) { speed+=this.item().speed } if(this.isAttack()) { speed+=this.subject().attackSpeed() } return speed }; Game_Action.prototype.makeTargets=function() { var targets=[]; if(!this._forcing&&this.subject().isConfused()) { targets=[this.confusionTarget()] } else if(this.isForOpponent()) { targets=this.targetsForOpponents() } else if(this.isForFriend()) { targets=this.targetsForFriends() } return this.repeatTargets(targets) }; Game_Action.prototype.repeatTargets=function(targets) { var repeatedTargets=[]; var repeats=this.numRepeats(); for(var i=0; i<targets.length; i++) { var target=targets[i]; if(target) { for(var j=0; j<repeats; j++) { repeatedTargets.push(target) } } } return repeatedTargets }; Game_Action.prototype.confusionTarget=function() { switch(this.subject().confusionLevel()) { case 1:return this.opponentsUnit().randomTarget(); case 2:if(Math.randomInt(2)===0) { return this.opponentsUnit().randomTarget() } return this.friendsUnit().randomTarget(); default:return this.friendsUnit().randomTarget() } }; Game_Action.prototype.targetsForOpponents=function() { var targets=[]; var unit=this.opponentsUnit(); if(this.isForRandom()) { for(var i=0; i<this.numTargets(); i++) { targets.push(unit.randomTarget()) } } else if(this.isForOne()) { if(this._targetIndex<0) { targets.push(unit.randomTarget()) } else { targets.push(unit.smoothTarget(this._targetIndex)) } } else { targets=unit.aliveMembers() } return targets }; Game_Action.prototype.targetsForFriends=function() { var targets=[]; var unit=this.friendsUnit(); if(this.isForUser()) { return[this.subject()] } else if(this.isForDeadFriend()) { if(this.isForOne()) { targets.push(unit.smoothDeadTarget(this._targetIndex)) } else { targets=unit.deadMembers() } } else if(this.isForOne()) { if(this._targetIndex<0) { targets.push(unit.randomTarget()) } else { targets.push(unit.smoothTarget(this._targetIndex)) } } else { targets=unit.aliveMembers() } return targets }; Game_Action.prototype.evaluate=function() { var value=0; this.itemTargetCandidates().forEach(function(target) { var targetValue=this.evaluateWithTarget(target); if(this.isForAll()) { value+=targetValue } else if(targetValue>value) { value=targetValue; this._targetIndex=target.index } } ,this); value*=this.numRepeats(); if(value>0) { value+=Math.random() } return value }; Game_Action.prototype.itemTargetCandidates=function() { if(!this.isValid()) { return[] } else if(this.isForOpponent()) { return this.opponentsUnit().aliveMembers() } else if(this.isForUser()) { return[this.subject()] } else if(this.isForDeadFriend()) { return this.friendsUnit().deadMembers() } else { return this.friendsUnit().aliveMembers() } }; Game_Action.prototype.evaluateWithTarget=function(target) { if(this.isHpEffect()) { var value=this.makeDamageValue(target,false); if(this.isForOpponent()) { return value/Math.max(target.hp,1) } else { var recovery=Math.min(-value,target.mhp-target.hp); return recovery/target.mhp } } }; Game_Action.prototype.testApply=function(target) { return(this.isForDeadFriend()===target.isDead()&&($gameParty.inBattle()||this.isForOpponent()||(this.isHpRecover()&&target.hp<target.mhp)||(this.isMpRecover()&&target.mp<target.mmp)||(this.hasItemAnyValidEffects(target)))) }; Game_Action.prototype.hasItemAnyValidEffects=function(target) { return this.item().effects.some(function(effect) { return this.testItemEffect(target,effect) } ,this) }; Game_Action.prototype.testItemEffect=function(target,effect) { switch(effect.code) { case Game_Action.EFFECT_RECOVER_HP:return target.hp<target.mhp||effect.value1<0||effect.value2<0; case Game_Action.EFFECT_RECOVER_MP:return target.mp<target.mmp||effect.value1<0||effect.value2<0; case Game_Action.EFFECT_ADD_STATE:return!target.isStateAffected(effect.dataId); case Game_Action.EFFECT_REMOVE_STATE:return target.isStateAffected(effect.dataId); case Game_Action.EFFECT_ADD_BUFF:return!target.isMaxBuffAffected(effect.dataId); case Game_Action.EFFECT_ADD_DEBUFF:return!target.isMaxDebuffAffected(effect.dataId); case Game_Action.EFFECT_REMOVE_BUFF:return target.isBuffAffected(effect.dataId); case Game_Action.EFFECT_REMOVE_DEBUFF:return target.isDebuffAffected(effect.dataId); case Game_Action.EFFECT_LEARN_SKILL:return target.isActor()&&!target.isLearnedSkill(effect.dataId); default:return true } }; Game_Action.prototype.itemCnt=function(target) { if(this.isPhysical()&&target.canMove()) { return target.cnt } else { return 0 } }; Game_Action.prototype.itemMrf=function(target) { if(this.isMagical()) { return target.mrf } else { return 0 } }; Game_Action.prototype.itemHit=function(target) { if(this.isPhysical()) { return this.item().successRate*0.01*this.subject().hit } else { return this.item().successRate*0.01 } }; Game_Action.prototype.itemEva=function(target) { if(this.isPhysical()) { return target.eva } else if(this.isMagical()) { return target.mev } else { return 0 } }; Game_Action.prototype.itemCri=function(target) { return this.item().damage.critical?this.subject().cri*(1-target.cev):0 }; Game_Action.prototype.apply=function(target) { var result=target.result(); this.subject().clearResult(); result.clear(); result.used=this.testApply(target); result.missed=(result.used&&Math.random()>=this.itemHit(target)); result.evaded=(!result.missed&&Math.random()<this.itemEva(target)); result.physical=this.isPhysical(); result.drain=this.isDrain(); if(result.isHit()) { if(this.item().damage.type>0) { result.critical=(Math.random()<this.itemCri(target)); var value=this.makeDamageValue(target,result.critical); this.executeDamage(target,value) } this.item().effects.forEach(function(effect) { this.applyItemEffect(target,effect) } ,this); this.applyItemUserEffect(target) } }; Game_Action.prototype.makeDamageValue=function(target,critical) { var item=this.item(); var baseValue=this.evalDamageFormula(target); var value=baseValue*this.calcElementRate(target); if(this.isPhysical()) { value*=target.pdr } if(this.isMagical()) { value*=target.mdr } if(baseValue<0) { value*=target.rec } if(critical) { value=this.applyCritical(value) } value=this.applyVariance(value,item.damage.variance); value=this.applyGuard(value,target); value=Math.round(value); return value }; Game_Action.prototype.evalDamageFormula=function(target) { try { var item=this.item(); var a=this.subject(); var b=target; var v=$gameVariables._data; var sign=([3,4].contains(item.damage.type)?-1:1); return Math.max(eval(item.damage.formula),0)*sign } catch(e) { return 0 } }; Game_Action.prototype.calcElementRate=function(target) { if(this.item().damage.elementId<0) { return this.elementsMaxRate(target,this.subject().attackElements()) } else { return target.elementRate(this.item().damage.elementId) } }; Game_Action.prototype.elementsMaxRate=function(target,elements) { if(elements.length>0) { return Math.max.apply(null,elements.map(function(elementId) { return target.elementRate(elementId) } ,this)) } else { return 1 } }; Game_Action.prototype.applyCritical=function(damage) { return damage*3 }; Game_Action.prototype.applyVariance=function(damage,variance) { var amp=Math.floor(Math.max(Math.abs(damage)*variance/100,0)); var v=Math.randomInt(amp+1)+Math.randomInt(amp+1)-amp; return damage>=0?damage+v:damage-v }; Game_Action.prototype.applyGuard=function(damage,target) { return damage/(damage>0&&target.isGuard()?2*target.grd:1) }; Game_Action.prototype.executeDamage=function(target,value) { var result=target.result(); if(value===0) { result.critical=false } if(this.isHpEffect()) { this.executeHpDamage(target,value) } if(this.isMpEffect()) { this.executeMpDamage(target,value) } }; Game_Action.prototype.executeHpDamage=function(target,value) { if(this.isDrain()) { value=Math.min(target.hp,value) } this.makeSuccess(target); target.gainHp(-value); if(value>0) { target.onDamage(value) } this.gainDrainedHp(value) }; Game_Action.prototype.executeMpDamage=function(target,value) { if(!this.isMpRecover()) { value=Math.min(target.mp,value) } if(value!==0) { this.makeSuccess(target) } target.gainMp(-value); this.gainDrainedMp(value) }; Game_Action.prototype.gainDrainedHp=function(value) { if(this.isDrain()) { this.subject().gainHp(value) } }; Game_Action.prototype.gainDrainedMp=function(value) { if(this.isDrain()) { this.subject().gainMp(value) } }; Game_Action.prototype.applyItemEffect=function(target,effect) { switch(effect.code) { case Game_Action.EFFECT_RECOVER_HP:this.itemEffectRecoverHp(target,effect); break; case Game_Action.EFFECT_RECOVER_MP:this.itemEffectRecoverMp(target,effect); break; case Game_Action.EFFECT_GAIN_TP:this.itemEffectGainTp(target,effect); break; case Game_Action.EFFECT_ADD_STATE:this.itemEffectAddState(target,effect); break; case Game_Action.EFFECT_REMOVE_STATE:this.itemEffectRemoveState(target,effect); break; case Game_Action.EFFECT_ADD_BUFF:this.itemEffectAddBuff(target,effect); break; case Game_Action.EFFECT_ADD_DEBUFF:this.itemEffectAddDebuff(target,effect); break; case Game_Action.EFFECT_REMOVE_BUFF:this.itemEffectRemoveBuff(target,effect); break; case Game_Action.EFFECT_REMOVE_DEBUFF:this.itemEffectRemoveDebuff(target,effect); break; case Game_Action.EFFECT_SPECIAL:this.itemEffectSpecial(target,effect); break; case Game_Action.EFFECT_GROW:this.itemEffectGrow(target,effect); break; case Game_Action.EFFECT_LEARN_SKILL:this.itemEffectLearnSkill(target,effect); break; case Game_Action.EFFECT_COMMON_EVENT:this.itemEffectCommonEvent(target,effect); break } }; Game_Action.prototype.itemEffectRecoverHp=function(target,effect) { var value=(target.mhp*effect.value1+effect.value2)*target.rec; if(this.isItem()) { value*=this.subject().pha } value=Math.floor(value); if(value!==0) { target.gainHp(value); this.makeSuccess(target) } }; Game_Action.prototype.itemEffectRecoverMp=function(target,effect) { var value=(target.mmp*effect.value1+effect.value2)*target.rec; if(this.isItem()) { value*=this.subject().pha } value=Math.floor(value); if(value!==0) { target.gainMp(value); this.makeSuccess(target) } }; Game_Action.prototype.itemEffectGainTp=function(target,effect) { var value=Math.floor(effect.value1); if(value!==0) { target.gainTp(value); this.makeSuccess(target) } }; Game_Action.prototype.itemEffectAddState=function(target,effect) { if(effect.dataId===0) { this.itemEffectAddAttackState(target,effect) } else { this.itemEffectAddNormalState(target,effect) } }; Game_Action.prototype.itemEffectAddAttackState=function(target,effect) { this.subject().attackStates().forEach(function(stateId) { var chance=effect.value1; chance*=target.stateRate(stateId); chance*=this.subject().attackStatesRate(stateId); chance*=this.lukEffectRate(target); if(Math.random()<chance) { target.addState(stateId); this.makeSuccess(target) } } .bind(this),target) }; Game_Action.prototype.itemEffectAddNormalState=function(target,effect) { var chance=effect.value1; if(!this.isCertainHit()) { chance*=target.stateRate(effect.dataId); chance*=this.lukEffectRate(target) } if(Math.random()<chance) { target.addState(effect.dataId); this.makeSuccess(target) } }; Game_Action.prototype.itemEffectRemoveState=function(target,effect) { var chance=effect.value1; if(Math.random()<chance) { target.removeState(effect.dataId); this.makeSuccess(target) } }; Game_Action.prototype.itemEffectAddBuff=function(target,effect) { target.addBuff(effect.dataId,effect.value1); this.makeSuccess(target) }; Game_Action.prototype.itemEffectAddDebuff=function(target,effect) { var chance=target.debuffRate(effect.dataId)*this.lukEffectRate(target); if(Math.random()<chance) { target.addDebuff(effect.dataId,effect.value1); this.makeSuccess(target) } }; Game_Action.prototype.itemEffectRemoveBuff=function(target,effect) { if(target.isBuffAffected(effect.dataId)) { target.removeBuff(effect.dataId); this.makeSuccess(target) } }; Game_Action.prototype.itemEffectRemoveDebuff=function(target,effect) { if(target.isDebuffAffected(effect.dataId)) { target.removeBuff(effect.dataId); this.makeSuccess(target) } }; Game_Action.prototype.itemEffectSpecial=function(target,effect) { if(effect.dataId===Game_Action.SPECIAL_EFFECT_ESCAPE) { target.escape(); this.makeSuccess(target) } }; Game_Action.prototype.itemEffectGrow=function(target,effect) { target.addParam(effect.dataId,Math.floor(effect.value1)); this.makeSuccess(target) }; Game_Action.prototype.itemEffectLearnSkill=function(target,effect) { if(target.isActor()) { target.learnSkill(effect.dataId); this.makeSuccess(target) } }; Game_Action.prototype.itemEffectCommonEvent=function(target,effect) { }; Game_Action.prototype.makeSuccess=function(target) { target.result().success=true }; Game_Action.prototype.applyItemUserEffect=function(target) { var value=Math.floor(this.item().tpGain*this.subject().tcr); this.subject().gainSilentTp(value) }; Game_Action.prototype.lukEffectRate=function(target) { return Math.max(1.0+(this.subject().luk-target.luk)*0.001,0.0) }; Game_Action.prototype.applyGlobal=function() { this.item().effects.forEach(function(effect) { if(effect.code===Game_Action.EFFECT_COMMON_EVENT) { $gameTemp.reserveCommonEvent(effect.dataId) } } ,this) }; function Game_ActionResult() { this.initialize.apply(this,arguments) } Game_ActionResult.prototype.initialize=function() { this.clear() }; Game_ActionResult.prototype.clear=function() { this.used=false; this.missed=false; this.evaded=false; this.physical=false; this.drain=false; this.critical=false; this.success=false; this.hpAffected=false; this.hpDamage=0; this.mpDamage=0; this.tpDamage=0; this.addedStates=[]; this.removedStates=[]; this.addedBuffs=[]; this.addedDebuffs=[]; this.removedBuffs=[] }; Game_ActionResult.prototype.addedStateObjects=function() { return this.addedStates.map(function(id) { return $dataStates[id] } ) }; Game_ActionResult.prototype.removedStateObjects=function() { return this.removedStates.map(function(id) { return $dataStates[id] } ) }; Game_ActionResult.prototype.isStatusAffected=function() { return(this.addedStates.length>0||this.removedStates.length>0||this.addedBuffs.length>0||this.addedDebuffs.length>0||this.removedBuffs.length>0) }; Game_ActionResult.prototype.isHit=function() { return this.used&&!this.missed&&!this.evaded }; Game_ActionResult.prototype.isStateAdded=function(stateId) { return this.addedStates.contains(stateId) }; Game_ActionResult.prototype.pushAddedState=function(stateId) { if(!this.isStateAdded(stateId)) { this.addedStates.push(stateId) } }; Game_ActionResult.prototype.isStateRemoved=function(stateId) { return this.removedStates.contains(stateId) }; Game_ActionResult.prototype.pushRemovedState=function(stateId) { if(!this.isStateRemoved(stateId)) { this.removedStates.push(stateId) } }; Game_ActionResult.prototype.isBuffAdded=function(paramId) { return this.addedBuffs.contains(paramId) }; Game_ActionResult.prototype.pushAddedBuff=function(paramId) { if(!this.isBuffAdded(paramId)) { this.addedBuffs.push(paramId) } }; Game_ActionResult.prototype.isDebuffAdded=function(paramId) { return this.addedDebuffs.contains(paramId) }; Game_ActionResult.prototype.pushAddedDebuff=function(paramId) { if(!this.isDebuffAdded(paramId)) { this.addedDebuffs.push(paramId) } }; Game_ActionResult.prototype.isBuffRemoved=function(paramId) { return this.removedBuffs.contains(paramId) }; Game_ActionResult.prototype.pushRemovedBuff=function(paramId) { if(!this.isBuffRemoved(paramId)) { this.removedBuffs.push(paramId) } }; function Game_BattlerBase() { this.initialize.apply(this,arguments) } Game_BattlerBase.TRAIT_ELEMENT_RATE=11; Game_BattlerBase.TRAIT_DEBUFF_RATE=12; Game_BattlerBase.TRAIT_STATE_RATE=13; Game_BattlerBase.TRAIT_STATE_RESIST=14; Game_BattlerBase.TRAIT_PARAM=21; Game_BattlerBase.TRAIT_XPARAM=22; Game_BattlerBase.TRAIT_SPARAM=23; Game_BattlerBase.TRAIT_ATTACK_ELEMENT=31; Game_BattlerBase.TRAIT_ATTACK_STATE=32; Game_BattlerBase.TRAIT_ATTACK_SPEED=33; Game_BattlerBase.TRAIT_ATTACK_TIMES=34; Game_BattlerBase.TRAIT_STYPE_ADD=41; Game_BattlerBase.TRAIT_STYPE_SEAL=42; Game_BattlerBase.TRAIT_SKILL_ADD=43; Game_BattlerBase.TRAIT_SKILL_SEAL=44; Game_BattlerBase.TRAIT_EQUIP_WTYPE=51; Game_BattlerBase.TRAIT_EQUIP_ATYPE=52; Game_BattlerBase.TRAIT_EQUIP_LOCK=53; Game_BattlerBase.TRAIT_EQUIP_SEAL=54; Game_BattlerBase.TRAIT_SLOT_TYPE=55; Game_BattlerBase.TRAIT_ACTION_PLUS=61; Game_BattlerBase.TRAIT_SPECIAL_FLAG=62; Game_BattlerBase.TRAIT_COLLAPSE_TYPE=63; Game_BattlerBase.TRAIT_PARTY_ABILITY=64; Game_BattlerBase.FLAG_ID_AUTO_BATTLE=0; Game_BattlerBase.FLAG_ID_GUARD=1; Game_BattlerBase.FLAG_ID_SUBSTITUTE=2; Game_BattlerBase.FLAG_ID_PRESERVE_TP=3; Game_BattlerBase.ICON_BUFF_START=32; Game_BattlerBase.ICON_DEBUFF_START=48; Object.defineProperties(Game_BattlerBase.prototype, { hp: { get:function() { return this._hp } ,configurable:true } ,mp: { get:function() { return this._mp } ,configurable:true } ,tp: { get:function() { return this._tp } ,configurable:true } ,mhp: { get:function() { return this.param(0) } ,configurable:true } ,mmp: { get:function() { return this.param(1) } ,configurable:true } ,atk: { get:function() { return this.param(2) } ,configurable:true } ,def: { get:function() { return this.param(3) } ,configurable:true } ,mat: { get:function() { return this.param(4) } ,configurable:true } ,mdf: { get:function() { return this.param(5) } ,configurable:true } ,agi: { get:function() { return this.param(6) } ,configurable:true } ,luk: { get:function() { return this.param(7) } ,configurable:true } ,hit: { get:function() { return this.xparam(0) } ,configurable:true } ,eva: { get:function() { return this.xparam(1) } ,configurable:true } ,cri: { get:function() { return this.xparam(2) } ,configurable:true } ,cev: { get:function() { return this.xparam(3) } ,configurable:true } ,mev: { get:function() { return this.xparam(4) } ,configurable:true } ,mrf: { get:function() { return this.xparam(5) } ,configurable:true } ,cnt: { get:function() { return this.xparam(6) } ,configurable:true } ,hrg: { get:function() { return this.xparam(7) } ,configurable:true } ,mrg: { get:function() { return this.xparam(8) } ,configurable:true } ,trg: { get:function() { return this.xparam(9) } ,configurable:true } ,tgr: { get:function() { return this.sparam(0) } ,configurable:true } ,grd: { get:function() { return this.sparam(1) } ,configurable:true } ,rec: { get:function() { return this.sparam(2) } ,configurable:true } ,pha: { get:function() { return this.sparam(3) } ,configurable:true } ,mcr: { get:function() { return this.sparam(4) } ,configurable:true } ,tcr: { get:function() { return this.sparam(5) } ,configurable:true } ,pdr: { get:function() { return this.sparam(6) } ,configurable:true } ,mdr: { get:function() { return this.sparam(7) } ,configurable:true } ,fdr: { get:function() { return this.sparam(8) } ,configurable:true } ,exr: { get:function() { return this.sparam(9) } ,configurable:true } } ); Game_BattlerBase.prototype.initialize=function() { this.initMembers() }; Game_BattlerBase.prototype.initMembers=function() { this._hp=1; this._mp=0; this._tp=0; this._hidden=false; this.clearParamPlus(); this.clearStates(); this.clearBuffs() }; Game_BattlerBase.prototype.clearParamPlus=function() { this._paramPlus=[0,0,0,0,0,0,0,0] }; Game_BattlerBase.prototype.clearStates=function() { this._states=[]; this._stateTurns= { } }; Game_BattlerBase.prototype.eraseState=function(stateId) { var index=this._states.indexOf(stateId); if(index>=0) { this._states.splice(index,1) } delete this._stateTurns[stateId] }; Game_BattlerBase.prototype.isStateAffected=function(stateId) { return this._states.contains(stateId) }; Game_BattlerBase.prototype.isDeathStateAffected=function() { return this.isStateAffected(this.deathStateId()) }; Game_BattlerBase.prototype.deathStateId=function() { return 1 }; Game_BattlerBase.prototype.resetStateCounts=function(stateId) { var state=$dataStates[stateId]; var variance=1+Math.max(state.maxTurns-state.minTurns,0); this._stateTurns[stateId]=state.minTurns+Math.randomInt(variance) }; Game_BattlerBase.prototype.isStateExpired=function(stateId) { return this._stateTurns[stateId]===0 }; Game_BattlerBase.prototype.updateStateTurns=function() { this._states.forEach(function(stateId) { if(this._stateTurns[stateId]>0) { this._stateTurns[stateId]-- } } ,this) }; Game_BattlerBase.prototype.clearBuffs=function() { this._buffs=[0,0,0,0,0,0,0,0]; this._buffTurns=[0,0,0,0,0,0,0,0] }; Game_BattlerBase.prototype.eraseBuff=function(paramId) { this._buffs[paramId]=0; this._buffTurns[paramId]=0 }; Game_BattlerBase.prototype.buffLength=function() { return this._buffs.length }; Game_BattlerBase.prototype.buff=function(paramId) { return this._buffs[paramId] }; Game_BattlerBase.prototype.isBuffAffected=function(paramId) { return this._buffs[paramId]>0 }; Game_BattlerBase.prototype.isDebuffAffected=function(paramId) { return this._buffs[paramId]<0 }; Game_BattlerBase.prototype.isBuffOrDebuffAffected=function(paramId) { return this._buffs[paramId]!==0 }; Game_BattlerBase.prototype.isMaxBuffAffected=function(paramId) { return this._buffs[paramId]===2 }; Game_BattlerBase.prototype.isMaxDebuffAffected=function(paramId) { return this._buffs[paramId]===-2 }; Game_BattlerBase.prototype.increaseBuff=function(paramId) { if(!this.isMaxBuffAffected(paramId)) { this._buffs[paramId]++ } }; Game_BattlerBase.prototype.decreaseBuff=function(paramId) { if(!this.isMaxDebuffAffected(paramId)) { this._buffs[paramId]-- } }; Game_BattlerBase.prototype.overwriteBuffTurns=function(paramId,turns) { if(this._buffTurns[paramId]<turns) { this._buffTurns[paramId]=turns } }; Game_BattlerBase.prototype.isBuffExpired=function(paramId) { return this._buffTurns[paramId]===0 }; Game_BattlerBase.prototype.updateBuffTurns=function() { for(var i=0; i<this._buffTurns.length; i++) { if(this._buffTurns[i]>0) { this._buffTurns[i]-- } } }; Game_BattlerBase.prototype.die=function() { this._hp=0; this.clearStates(); this.clearBuffs() }; Game_BattlerBase.prototype.revive=function() { if(this._hp===0) { this._hp=1 } }; Game_BattlerBase.prototype.states=function() { return this._states.map(function(id) { return $dataStates[id] } ) }; Game_BattlerBase.prototype.stateIcons=function() { return this.states().map(function(state) { return state.iconIndex } ).filter(function(iconIndex) { return iconIndex>0 } ) }; Game_BattlerBase.prototype.buffIcons=function() { var icons=[]; for(var i=0; i<this._buffs.length; i++) { if(this._buffs[i]!==0) { icons.push(this.buffIconIndex(this._buffs[i],i)) } } return icons }; Game_BattlerBase.prototype.buffIconIndex=function(buffLevel,paramId) { if(buffLevel>0) { return Game_BattlerBase.ICON_BUFF_START+(buffLevel-1)*8+paramId } else if(buffLevel<0) { return Game_BattlerBase.ICON_DEBUFF_START+(-buffLevel-1)*8+paramId } else { return 0 } }; Game_BattlerBase.prototype.allIcons=function() { return this.stateIcons().concat(this.buffIcons()) }; Game_BattlerBase.prototype.traitObjects=function() { return this.states() }; Game_BattlerBase.prototype.allTraits=function() { return this.traitObjects().reduce(function(r,obj) { return r.concat(obj.traits) } ,[]) }; Game_BattlerBase.prototype.traits=function(code) { return this.allTraits().filter(function(trait) { return trait.code===code } ) }; Game_BattlerBase.prototype.traitsWithId=function(code,id) { return this.allTraits().filter(function(trait) { return trait.code===code&&trait.dataId===id } ) }; Game_BattlerBase.prototype.traitsPi=function(code,id) { return this.traitsWithId(code,id).reduce(function(r,trait) { return r*trait.value } ,1) }; Game_BattlerBase.prototype.traitsSum=function(code,id) { return this.traitsWithId(code,id).reduce(function(r,trait) { return r+trait.value } ,0) }; Game_BattlerBase.prototype.traitsSumAll=function(code) { return this.traits(code).reduce(function(r,trait) { return r+trait.value } ,0) }; Game_BattlerBase.prototype.traitsSet=function(code) { return this.traits(code).reduce(function(r,trait) { return r.concat(trait.dataId) } ,[]) }; Game_BattlerBase.prototype.paramBase=function(paramId) { return 0 }; Game_BattlerBase.prototype.paramPlus=function(paramId) { return this._paramPlus[paramId] }; Game_BattlerBase.prototype.paramMin=function(paramId) { if(paramId===1) { return 0 } else { return 1 } }; Game_BattlerBase.prototype.paramMax=function(paramId) { if(paramId===0) { return 999999 } else if(paramId===1) { return 9999 } else { return 999 } }; Game_BattlerBase.prototype.paramRate=function(paramId) { return this.traitsPi(Game_BattlerBase.TRAIT_PARAM,paramId) }; Game_BattlerBase.prototype.paramBuffRate=function(paramId) { return this._buffs[paramId]*0.25+1.0 }; Game_BattlerBase.prototype.param=function(paramId) { var value=this.paramBase(paramId)+this.paramPlus(paramId); value*=this.paramRate(paramId)*this.paramBuffRate(paramId); var maxValue=this.paramMax(paramId); var minValue=this.paramMin(paramId); return Math.round(value.clamp(minValue,maxValue)) }; Game_BattlerBase.prototype.xparam=function(xparamId) { return this.traitsSum(Game_BattlerBase.TRAIT_XPARAM,xparamId) }; Game_BattlerBase.prototype.sparam=function(sparamId) { return this.traitsPi(Game_BattlerBase.TRAIT_SPARAM,sparamId) }; Game_BattlerBase.prototype.elementRate=function(elementId) { return this.traitsPi(Game_BattlerBase.TRAIT_ELEMENT_RATE,elementId) }; Game_BattlerBase.prototype.debuffRate=function(paramId) { return this.traitsPi(Game_BattlerBase.TRAIT_DEBUFF_RATE,paramId) }; Game_BattlerBase.prototype.stateRate=function(stateId) { return this.traitsPi(Game_BattlerBase.TRAIT_STATE_RATE,stateId) }; Game_BattlerBase.prototype.stateResistSet=function() { return this.traitsSet(Game_BattlerBase.TRAIT_STATE_RESIST) }; Game_BattlerBase.prototype.isStateResist=function(stateId) { return this.stateResistSet().contains(stateId) }; Game_BattlerBase.prototype.attackElements=function() { return this.traitsSet(Game_BattlerBase.TRAIT_ATTACK_ELEMENT) }; Game_BattlerBase.prototype.attackStates=function() { return this.traitsSet(Game_BattlerBase.TRAIT_ATTACK_STATE) }; Game_BattlerBase.prototype.attackStatesRate=function(stateId) { return this.traitsSum(Game_BattlerBase.TRAIT_ATTACK_STATE,stateId) }; Game_BattlerBase.prototype.attackSpeed=function() { return this.traitsSumAll(Game_BattlerBase.TRAIT_ATTACK_SPEED) }; Game_BattlerBase.prototype.attackTimesAdd=function() { return Math.max(this.traitsSumAll(Game_BattlerBase.TRAIT_ATTACK_TIMES),0) }; Game_BattlerBase.prototype.addedSkillTypes=function() { return this.traitsSet(Game_BattlerBase.TRAIT_STYPE_ADD) }; Game_BattlerBase.prototype.isSkillTypeSealed=function(stypeId) { return this.traitsSet(Game_BattlerBase.TRAIT_STYPE_SEAL).contains(stypeId) }; Game_BattlerBase.prototype.addedSkills=function() { return this.traitsSet(Game_BattlerBase.TRAIT_SKILL_ADD) }; Game_BattlerBase.prototype.isSkillSealed=function(skillId) { return this.traitsSet(Game_BattlerBase.TRAIT_SKILL_SEAL).contains(skillId) }; Game_BattlerBase.prototype.isEquipWtypeOk=function(wtypeId) { return this.traitsSet(Game_BattlerBase.TRAIT_EQUIP_WTYPE).contains(wtypeId) }; Game_BattlerBase.prototype.isEquipAtypeOk=function(atypeId) { return this.traitsSet(Game_BattlerBase.TRAIT_EQUIP_ATYPE).contains(atypeId) }; Game_BattlerBase.prototype.isEquipTypeLocked=function(etypeId) { return this.traitsSet(Game_BattlerBase.TRAIT_EQUIP_LOCK).contains(etypeId) }; Game_BattlerBase.prototype.isEquipTypeSealed=function(etypeId) { return this.traitsSet(Game_BattlerBase.TRAIT_EQUIP_SEAL).contains(etypeId) }; Game_BattlerBase.prototype.slotType=function() { var set=this.traitsSet(Game_BattlerBase.TRAIT_SLOT_TYPE); return set.length>0?Math.max.apply(null,set):0 }; Game_BattlerBase.prototype.isDualWield=function() { return this.slotType()===1 }; Game_BattlerBase.prototype.actionPlusSet=function() { return this.traits(Game_BattlerBase.TRAIT_ACTION_PLUS).map(function(trait) { return trait.value } ) }; Game_BattlerBase.prototype.specialFlag=function(flagId) { return this.traits(Game_BattlerBase.TRAIT_SPECIAL_FLAG).some(function(trait) { return trait.dataId===flagId } ) }; Game_BattlerBase.prototype.collapseType=function() { var set=this.traitsSet(Game_BattlerBase.TRAIT_COLLAPSE_TYPE); return set.length>0?Math.max.apply(null,set):0 }; Game_BattlerBase.prototype.partyAbility=function(abilityId) { return this.traits(Game_BattlerBase.TRAIT_PARTY_ABILITY).some(function(trait) { return trait.dataId===abilityId } ) }; Game_BattlerBase.prototype.isAutoBattle=function() { return this.specialFlag(Game_BattlerBase.FLAG_ID_AUTO_BATTLE) }; Game_BattlerBase.prototype.isGuard=function() { return this.specialFlag(Game_BattlerBase.FLAG_ID_GUARD)&&this.canMove() }; Game_BattlerBase.prototype.isSubstitute=function() { return this.specialFlag(Game_BattlerBase.FLAG_ID_SUBSTITUTE)&&this.canMove() }; Game_BattlerBase.prototype.isPreserveTp=function() { return this.specialFlag(Game_BattlerBase.FLAG_ID_PRESERVE_TP) }; Game_BattlerBase.prototype.addParam=function(paramId,value) { this._paramPlus[paramId]+=value; this.refresh() }; Game_BattlerBase.prototype.setHp=function(hp) { this._hp=hp; this.refresh() }; Game_BattlerBase.prototype.setMp=function(mp) { this._mp=mp; this.refresh() }; Game_BattlerBase.prototype.setTp=function(tp) { this._tp=tp; this.refresh() }; Game_BattlerBase.prototype.maxTp=function() { return 100 }; Game_BattlerBase.prototype.refresh=function() { this.stateResistSet().forEach(function(stateId) { this.eraseState(stateId) } ,this); this._hp=this._hp.clamp(0,this.mhp); this._mp=this._mp.clamp(0,this.mmp); this._tp=this._tp.clamp(0,this.maxTp()) }; Game_BattlerBase.prototype.recoverAll=function() { this.clearStates(); this._hp=this.mhp; this._mp=this.mmp }; Game_BattlerBase.prototype.hpRate=function() { return this.hp/this.mhp }; Game_BattlerBase.prototype.mpRate=function() { return this.mmp>0?this.mp/this.mmp:0 }; Game_BattlerBase.prototype.tpRate=function() { return this.tp/100 }; Game_BattlerBase.prototype.hide=function() { this._hidden=true }; Game_BattlerBase.prototype.appear=function() { this._hidden=false }; Game_BattlerBase.prototype.isHidden=function() { return this._hidden }; Game_BattlerBase.prototype.isAppeared=function() { return!this.isHidden() }; Game_BattlerBase.prototype.isDead=function() { return this.isAppeared()&&this.isDeathStateAffected() }; Game_BattlerBase.prototype.isAlive=function() { return this.isAppeared()&&!this.isDeathStateAffected() }; Game_BattlerBase.prototype.isDying=function() { return this.isAlive()&&this._hp<this.mhp/4 }; Game_BattlerBase.prototype.isRestricted=function() { return this.isAppeared()&&this.restriction()>0 }; Game_BattlerBase.prototype.canInput=function() { return this.isAppeared()&&!this.isRestricted()&&!this.isAutoBattle() }; Game_BattlerBase.prototype.canMove=function() { return this.isAppeared()&&this.restriction()<4 }; Game_BattlerBase.prototype.isConfused=function() { return this.isAppeared()&&this.restriction()>=1&&this.restriction()<=3 }; Game_BattlerBase.prototype.confusionLevel=function() { return this.isConfused()?this.restriction():0 }; Game_BattlerBase.prototype.isActor=function() { return false }; Game_BattlerBase.prototype.isEnemy=function() { return false }; Game_BattlerBase.prototype.sortStates=function() { this._states.sort(function(a, { var p1=$dataStates[a].priority; var p2=$dataStates[b].priority; if(p1!==p2) { return p2-p1 } return a-b } ) }; Game_BattlerBase.prototype.restriction=function() { return Math.max.apply(null,this.states().map(function(state) { return state.restriction } ).concat(0)) }; Game_BattlerBase.prototype.addNewState=function(stateId) { if(stateId===this.deathStateId()) { this.die() } var restricted=this.isRestricted(); this._states.push(stateId); this.sortStates(); if(!restricted&&this.isRestricted()) { this.onRestrict() } }; Game_BattlerBase.prototype.onRestrict=function() { }; Game_BattlerBase.prototype.mostImportantStateText=function() { var states=this.states(); for(var i=0; i<states.length; i++) { if(states[i].message3) { return states[i].message3 } } return'' }; Game_BattlerBase.prototype.stateMotionIndex=function() { var states=this.states(); if(states.length>0) { return states[0].motion } else { return 0 } }; Game_BattlerBase.prototype.stateOverlayIndex=function() { var states=this.states(); if(states.length>0) { return states[0].overlay } else { return 0 } }; Game_BattlerBase.prototype.isSkillWtypeOk=function(skill) { return true }; Game_BattlerBase.prototype.skillMpCost=function(skill) { return Math.floor(skill.mpCost*this.mcr) }; Game_BattlerBase.prototype.skillTpCost=function(skill) { return skill.tpCost }; Game_BattlerBase.prototype.canPaySkillCost=function(skill) { return this._tp>=this.skillTpCost(skill)&&this._mp>=this.skillMpCost(skill) }; Game_BattlerBase.prototype.paySkillCost=function(skill) { this._mp-=this.skillMpCost(skill); this._tp-=this.skillTpCost(skill) }; Game_BattlerBase.prototype.isOccasionOk=function(item) { if($gameParty.inBattle()) { return item.occasion===0||item.occasion===1 } else { return item.occasion===0||item.occasion===2 } }; Game_BattlerBase.prototype.meetsUsableItemConditions=function(item) { return this.canMove()&&this.isOccasionOk(item) }; Game_BattlerBase.prototype.meetsSkillConditions=function(skill) { return(this.meetsUsableItemConditions(skill)&&this.isSkillWtypeOk(skill)&&this.canPaySkillCost(skill)&&!this.isSkillSealed(skill.id)&&!this.isSkillTypeSealed(skill.stypeId)) }; Game_BattlerBase.prototype.meetsItemConditions=function(item) { return this.meetsUsableItemConditions(item)&&$gameParty.hasItem(item) }; Game_BattlerBase.prototype.canUse=function(item) { if(!item) { return false } else if(DataManager.isSkill(item)) { return this.meetsSkillConditions(item) } else if(DataManager.isItem(item)) { return this.meetsItemConditions(item) } else { return false } }; Game_BattlerBase.prototype.canEquip=function(item) { if(!item) { return false } else if(DataManager.isWeapon(item)) { return this.canEquipWeapon(item) } else if(DataManager.isArmor(item)) { return this.canEquipArmor(item) } else { return false } }; Game_BattlerBase.prototype.canEquipWeapon=function(item) { return this.isEquipWtypeOk(item.wtypeId)&&!this.isEquipTypeSealed(item.etypeId) }; Game_BattlerBase.prototype.canEquipArmor=function(item) { return this.isEquipAtypeOk(item.atypeId)&&!this.isEquipTypeSealed(item.etypeId) }; Game_BattlerBase.prototype.attackSkillId=function() { return 1 }; Game_BattlerBase.prototype.guardSkillId=function() { return 2 }; Game_BattlerBase.prototype.canAttack=function() { return this.canUse($dataSkills[this.attackSkillId()]) }; Game_BattlerBase.prototype.canGuard=function() { return this.canUse($dataSkills[this.guardSkillId()]) }; function Game_Battler() { this.initialize.apply(this,arguments) } Game_Battler.prototype=Object.create(Game_BattlerBase.prototype); Game_Battler.prototype.constructor=Game_Battler; Game_Battler.prototype.initialize=function() { Game_BattlerBase.prototype.initialize.call(this) }; Game_Battler.prototype.initMembers=function() { Game_BattlerBase.prototype.initMembers.call(this); this._actions=[]; this._speed=0; this._result=new Game_ActionResult(); this._actionState=''; this._lastTargetIndex=0; this._animations=[]; this._damagePopup=false; this._effectType=null; this._motionType=null; this._weaponImageId=0; this._motionRefresh=false; this._selected=false }; Game_Battler.prototype.clearAnimations=function() { this._animations=[] }; Game_Battler.prototype.clearDamagePopup=function() { this._damagePopup=false }; Game_Battler.prototype.clearWeaponAnimation=function() { this._weaponImageId=0 }; Game_Battler.prototype.clearEffect=function() { this._effectType=null }; Game_Battler.prototype.clearMotion=function() { this._motionType=null; this._motionRefresh=false }; Game_Battler.prototype.requestEffect=function(effectType) { this._effectType=effectType }; Game_Battler.prototype.requestMotion=function(motionType) { this._motionType=motionType }; Game_Battler.prototype.requestMotionRefresh=function() { this._motionRefresh=true }; Game_Battler.prototype.select=function() { this._selected=true }; Game_Battler.prototype.deselect=function() { this._selected=false }; Game_Battler.prototype.isAnimationRequested=function() { return this._animations.length>0 }; Game_Battler.prototype.isDamagePopupRequested=function() { return this._damagePopup }; Game_Battler.prototype.isEffectRequested=function() { return!!this._effectType }; Game_Battler.prototype.isMotionRequested=function() { return!!this._motionType }; Game_Battler.prototype.isWeaponAnimationRequested=function() { return this._weaponImageId>0 }; Game_Battler.prototype.isMotionRefreshRequested=function() { return this._motionRefresh }; Game_Battler.prototype.isSelected=function() { return this._selected }; Game_Battler.prototype.effectType=function() { return this._effectType }; Game_Battler.prototype.motionType=function() { return this._motionType }; Game_Battler.prototype.weaponImageId=function() { return this._weaponImageId }; Game_Battler.prototype.shiftAnimation=function() { return this._animations.shift() }; Game_Battler.prototype.startAnimation=function(animationId,mirror,delay) { var data= { animationId:animationId,mirror:mirror,delay:delay }; this._animations.push(data) }; Game_Battler.prototype.startDamagePopup=function() { this._damagePopup=true }; Game_Battler.prototype.startWeaponAnimation=function(weaponImageId) { this._weaponImageId=weaponImageId }; Game_Battler.prototype.action=function(index) { return this._actions[index] }; Game_Battler.prototype.setAction=function(index,action) { this._actions[index]=action }; Game_Battler.prototype.numActions=function() { return this._actions.length }; Game_Battler.prototype.clearActions=function() { this._actions=[] }; Game_Battler.prototype.result=function() { return this._result }; Game_Battler.prototype.clearResult=function() { this._result.clear() }; Game_Battler.prototype.refresh=function() { Game_BattlerBase.prototype.refresh.call(this); if(this.hp===0) { this.addState(this.deathStateId()) } else { this.removeState(this.deathStateId()) } }; Game_Battler.prototype.addState=function(stateId) { if(this.isStateAddable(stateId)) { if(!this.isStateAffected(stateId)) { this.addNewState(stateId); this.refresh() } this.resetStateCounts(stateId); this._result.pushAddedState(stateId) } }; Game_Battler.prototype.isStateAddable=function(stateId) { return(this.isAlive()&&$dataStates[stateId]&&!this.isStateResist(stateId)&&!this._result.isStateRemoved(stateId)&&!this.isStateRestrict(stateId)) }; Game_Battler.prototype.isStateRestrict=function(stateId) { return $dataStates[stateId].removeByRestriction&&this.isRestricted() }; Game_Battler.prototype.onRestrict=function() { Game_BattlerBase.prototype.onRestrict.call(this); this.clearActions(); this.states().forEach(function(state) { if(state.removeByRestriction) { this.removeState(state.id) } } ,this) }; Game_Battler.prototype.removeState=function(stateId) { if(this.isStateAffected(stateId)) { if(stateId===this.deathStateId()) { this.revive() } this.eraseState(stateId); this.refresh(); this._result.pushRemovedState(stateId) } }; Game_Battler.prototype.escape=function() { if($gameParty.inBattle()) { this.hide() } this.clearActions(); this.clearStates(); SoundManager.playEscape() }; Game_Battler.prototype.addBuff=function(paramId,turns) { if(this.isAlive()) { this.increaseBuff(paramId); if(this.isBuffAffected(paramId)) { this.overwriteBuffTurns(paramId,turns) } this._result.pushAddedBuff(paramId); this.refresh() } }; Game_Battler.prototype.addDebuff=function(paramId,turns) { if(this.isAlive()) { this.decreaseBuff(paramId); if(this.isDebuffAffected(paramId)) { this.overwriteBuffTurns(paramId,turns) } this._result.pushAddedDebuff(paramId); this.refresh() } }; Game_Battler.prototype.removeBuff=function(paramId) { if(this.isAlive()&&this.isBuffOrDebuffAffected(paramId)) { this.eraseBuff(paramId); this._result.pushRemovedBuff(paramId); this.refresh() } }; Game_Battler.prototype.removeBattleStates=function() { this.states().forEach(function(state) { if(state.removeAtBattleEnd) { this.removeState(state.id) } } ,this) }; Game_Battler.prototype.removeAllBuffs=function() { for(var i=0; i<this.buffLength(); i++) { this.removeBuff(i) } }; Game_Battler.prototype.removeStatesAuto=function(timing) { this.states().forEach(function(state) { if(this.isStateExpired(state.id)&&state.autoRemovalTiming===timing) { this.removeState(state.id) } } ,this) }; Game_Battler.prototype.removeBuffsAuto=function() { for(var i=0; i<this.buffLength(); i++) { if(this.isBuffExpired(i)) { this.removeBuff(i) } } }; Game_Battler.prototype.removeStatesByDamage=function() { this.states().forEach(function(state) { if(state.removeByDamage&&Math.randomInt(100)<state.chanceByDamage) { this.removeState(state.id) } } ,this) }; Game_Battler.prototype.makeActionTimes=function() { return this.actionPlusSet().reduce(function(r,p) { return Math.random()<p?r+1:r } ,1) }; Game_Battler.prototype.makeActions=function() { this.clearActions(); if(this.canMove()) { var actionTimes=this.makeActionTimes(); this._actions=[]; for(var i=0; i<actionTimes; i++) { this._actions.push(new Game_Action(this)) } } }; Game_Battler.prototype.speed=function() { return this._speed }; Game_Battler.prototype.makeSpeed=function() { this._speed=Math.min.apply(null,this._actions.map(function(action) { return action.speed() } ))||0 }; Game_Battler.prototype.currentAction=function() { return this._actions[0] }; Game_Battler.prototype.removeCurrentAction=function() { this._actions.shift() }; Game_Battler.prototype.setLastTarget=function(target) { if(target) { this._lastTargetIndex=target.index() } else { this._lastTargetIndex=0 } }; Game_Battler.prototype.forceAction=function(skillId,targetIndex) { this.clearActions(); var action=new Game_Action(this,true); action.setSkill(skillId); if(targetIndex===-2) { action.setTarget(this._lastTargetIndex) } else if(targetIndex===-1) { action.decideRandomTarget() } else { action.setTarget(targetIndex) } this._actions.push(action) }; Game_Battler.prototype.useItem=function(item) { if(DataManager.isSkill(item)) { this.paySkillCost(item) } else if(DataManager.isItem(item)) { this.consumeItem(item) } }; Game_Battler.prototype.consumeItem=function(item) { $gameParty.consumeItem(item) }; Game_Battler.prototype.gainHp=function(value) { this._result.hpDamage=-value; this._result.hpAffected=true; this.setHp(this.hp+value) }; Game_Battler.prototype.gainMp=function(value) { this._result.mpDamage=-value; this.setMp(this.mp+value) }; Game_Battler.prototype.gainTp=function(value) { this._result.tpDamage=-value; this.setTp(this.tp+value) }; Game_Battler.prototype.gainSilentTp=function(value) { this.setTp(this.tp+value) }; Game_Battler.prototype.initTp=function() { this.setTp(Math.randomInt(25)) }; Game_Battler.prototype.clearTp=function() { this.setTp(0) }; Game_Battler.prototype.chargeTpByDamage=function(damageRate) { var value=Math.floor(50*damageRate*this.tcr); this.gainSilentTp(value) }; Game_Battler.prototype.regenerateHp=function() { var value=Math.floor(this.mhp*this.hrg); value=Math.max(value,-this.maxSlipDamage()); if(value!==0) { this.gainHp(value) } }; Game_Battler.prototype.maxSlipDamage=function() { return $dataSystem.optSlipDeath?this.hp:Math.max(this.hp-1,0) }; Game_Battler.prototype.regenerateMp=function() { var value=Math.floor(this.mmp*this.mrg); if(value!==0) { this.gainMp(value) } }; Game_Battler.prototype.regenerateTp=function() { var value=Math.floor(100*this.trg); this.gainSilentTp(value) }; Game_Battler.prototype.regenerateAll=function() { if(this.isAlive()) { this.regenerateHp(); this.regenerateMp(); this.regenerateTp() } }; Game_Battler.prototype.onBattleStart=function() { this.setActionState('undecided'); this.clearMotion(); if(!this.isPreserveTp()) { this.initTp() } }; Game_Battler.prototype.onAllActionsEnd=function() { this.clearResult(); this.removeStatesAuto(1); this.removeBuffsAuto() }; Game_Battler.prototype.onTurnEnd=function() { this.clearResult(); this.regenerateAll(); this.updateStateTurns(); this.updateBuffTurns(); this.removeStatesAuto(2) }; Game_Battler.prototype.onBattleEnd=function() { this.clearResult(); this.removeBattleStates(); this.removeAllBuffs(); this.clearActions(); if(!this.isPreserveTp()) { this.clearTp() } this.appear() }; Game_Battler.prototype.onDamage=function(value) { this.removeStatesByDamage(); this.chargeTpByDamage(value/this.mhp) }; Game_Battler.prototype.setActionState=function(actionState) { this._actionState=actionState; this.requestMotionRefresh() }; Game_Battler.prototype.isUndecided=function() { return this._actionState==='undecided' }; Game_Battler.prototype.isInputting=function() { return this._actionState==='inputting' }; Game_Battler.prototype.isWaiting=function() { return this._actionState==='waiting' }; Game_Battler.prototype.isActing=function() { return this._actionState==='acting' }; Game_Battler.prototype.isChanting=function() { if(this.isWaiting()) { return this._actions.some(function(action) { return action.isMagicSkill() } ) } return false }; Game_Battler.prototype.isGuardWaiting=function() { if(this.isWaiting()) { return this._actions.some(function(action) { return action.isGuard() } ) } return false }; Game_Battler.prototype.performActionStart=function(action) { if(!action.isGuard()) { this.setActionState('acting') } }; Game_Battler.prototype.performAction=function(action) { }; Game_Battler.prototype.performActionEnd=function() { this.setActionState('done') }; Game_Battler.prototype.performDamage=function() { }; Game_Battler.prototype.performMiss=function() { SoundManager.playMiss() }; Game_Battler.prototype.performRecovery=function() { SoundManager.playRecovery() }; Game_Battler.prototype.performEvasion=function() { SoundManager.playEvasion() }; Game_Battler.prototype.performMagicEvasion=function() { SoundManager.playMagicEvasion() }; Game_Battler.prototype.performCounter=function() { SoundManager.playEvasion() }; Game_Battler.prototype.performReflection=function() { SoundManager.playReflection() }; Game_Battler.prototype.performSubstitute=function(target) { }; Game_Battler.prototype.performCollapse=function() { }; function Game_Actor() { this.initialize.apply(this,arguments) } Game_Actor.prototype=Object.create(Game_Battler.prototype); Game_Actor.prototype.constructor=Game_Actor; Object.defineProperty(Game_Actor.prototype,'level', { get:function() { return this._level } ,configurable:true } ); Game_Actor.prototype.initialize=function(actorId) { Game_Battler.prototype.initialize.call(this); this.setup(actorId) }; Game_Actor.prototype.initMembers=function() { Game_Battler.prototype.initMembers.call(this); this._actorId=0; this._name=''; this._nickname=''; this._classId=0; this._level=0; this._characterName=''; this._characterIndex=0; this._faceName=''; this._faceIndex=0; this._battlerName=''; this._exp= { }; this._skills=[]; this._equips=[]; this._actionInputIndex=0; this._lastMenuSkill=new Game_Item(); this._lastBattleSkill=new Game_Item(); this._lastCommandSymbol='' }; Game_Actor.prototype.setup=function(actorId) { var actor=$dataActors[actorId]; this._actorId=actorId; this._name=actor.name; this._nickname=actor.nickname; this._profile=actor.profile; this._classId=actor.classId; this._level=actor.initialLevel; this.initImages(); this.initExp(); this.initSkills(); this.initEquips(actor.equips); this.clearParamPlus(); this.recoverAll() }; Game_Actor.prototype.actorId=function() { return this._actorId }; Game_Actor.prototype.actor=function() { return $dataActors[this._actorId] }; Game_Actor.prototype.name=function() { return this._name }; Game_Actor.prototype.setName=function(name) { this._name=name }; Game_Actor.prototype.nickname=function() { return this._nickname }; Game_Actor.prototype.setNickname=function(nickname) { this._nickname=nickname }; Game_Actor.prototype.profile=function() { return this._profile }; Game_Actor.prototype.setProfile=function(profile) { this._profile=profile }; Game_Actor.prototype.characterName=function() { return this._characterName }; Game_Actor.prototype.characterIndex=function() { return this._characterIndex }; Game_Actor.prototype.faceName=function() { return this._faceName }; Game_Actor.prototype.faceIndex=function() { return this._faceIndex }; Game_Actor.prototype.battlerName=function() { return this._battlerName }; Game_Actor.prototype.clearStates=function() { Game_Battler.prototype.clearStates.call(this); this._stateSteps= { } }; Game_Actor.prototype.eraseState=function(stateId) { Game_Battler.prototype.eraseState.call(this,stateId); delete this._stateSteps[stateId] }; Game_Actor.prototype.resetStateCounts=function(stateId) { Game_Battler.prototype.resetStateCounts.call(this,stateId); this._stateSteps[stateId]=$dataStates[stateId].stepsToRemove }; Game_Actor.prototype.initImages=function() { var actor=this.actor(); this._characterName=actor.characterName; this._characterIndex=actor.characterIndex; this._faceName=actor.faceName; this._faceIndex=actor.faceIndex; this._battlerName=actor.battlerName }; Game_Actor.prototype.expForLevel=function(level) { var c=this.currentClass(); var basis=c.expParams[0]; var extra=c.expParams[1]; var acc_a=c.expParams[2]; var acc_b=c.expParams[3]; return Math.round(basis*(Math.pow(level-1,0.9+acc_a/250))*level*(level+1)/(6+Math.pow(level,2)/50/acc_+(level-1)*extra) }; Game_Actor.prototype.initExp=function() { this._exp[this._classId]=this.currentLevelExp() }; Game_Actor.prototype.currentExp=function() { return this._exp[this._classId] }; Game_Actor.prototype.currentLevelExp=function() { return this.expForLevel(this._level) }; Game_Actor.prototype.nextLevelExp=function() { return this.expForLevel(this._level+1) }; Game_Actor.prototype.nextRequiredExp=function() { return this.nextLevelExp()-this.currentExp() }; Game_Actor.prototype.maxLevel=function() { return this.actor().maxLevel }; Game_Actor.prototype.isMaxLevel=function() { return this._level>=this.maxLevel() }; Game_Actor.prototype.initSkills=function() { this._skills=[]; this.currentClass().learnings.forEach(function(learning) { if(learning.level<=this._level) { this.learnSkill(learning.skillId) } } ,this) }; Game_Actor.prototype.initEquips=function(equips) { var slots=this.equipSlots(); var maxSlots=slots.length; this._equips=[]; for(var i=0; i<maxSlots; i++) { this._equips[i]=new Game_Item() } for(var j=0; j<equips.length; j++) { if(j<maxSlots) { this._equips[j].setEquip(slots[j]===1,equips[j]) } } this.releaseUnequippableItems(true); this.refresh() }; Game_Actor.prototype.equipSlots=function() { var slots=[]; for(var i=1; i<$dataSystem.equipTypes.length; i++) { slots.push(i) } if(slots.length>=2&&this.isDualWield()) { slots[1]=1 } return slots }; Game_Actor.prototype.equips=function() { return this._equips.map(function(item) { return item.object() } ) }; Game_Actor.prototype.weapons=function() { return this.equips().filter(function(item) { return item&&DataManager.isWeapon(item) } ) }; Game_Actor.prototype.armors=function() { return this.equips().filter(function(item) { return item&&DataManager.isArmor(item) } ) }; Game_Actor.prototype.hasWeapon=function(weapon) { return this.weapons().contains(weapon) }; Game_Actor.prototype.hasArmor=function(armor) { return this.armors().contains(armor) }; Game_Actor.prototype.isEquipChangeOk=function(slotId) { return(!this.isEquipTypeLocked(this.equipSlots()[slotId])&&!this.isEquipTypeSealed(this.equipSlots()[slotId])) }; Game_Actor.prototype.changeEquip=function(slotId,item) { if(this.tradeItemWithParty(item,this.equips()[slotId])&&(!item||this.equipSlots()[slotId]===item.etypeId)) { this._equips[slotId].setObject(item); this.refresh() } }; Game_Actor.prototype.forceChangeEquip=function(slotId,item) { this._equips[slotId].setObject(item); this.releaseUnequippableItems(true); this.refresh() }; Game_Actor.prototype.tradeItemWithParty=function(newItem,oldItem) { if(newItem&&!$gameParty.hasItem(newItem)) { return false } else { $gameParty.gainItem(oldItem,1); $gameParty.loseItem(newItem,1); return true } }; Game_Actor.prototype.changeEquipById=function(etypeId,itemId) { var slotId=etypeId-1; if(this.equipSlots()[slotId]===1) { this.changeEquip(slotId,$dataWeapons[itemId]) } else { this.changeEquip(slotId,$dataArmors[itemId]) } }; Game_Actor.prototype.isEquipped=function(item) { return this.equips().contains(item) }; Game_Actor.prototype.discardEquip=function(item) { var slotId=this.equips().indexOf(item); if(slotId>=0) { this._equips[slotId].setObject(null) } }; Game_Actor.prototype.releaseUnequippableItems=function(forcing) { for(;; ) { var slots=this.equipSlots(); var equips=this.equips(); var changed=false; for(var i=0; i<equips.length; i++) { var item=equips[i]; if(item&&(!this.canEquip(item)||item.etypeId!==slots[i])) { if(!forcing) { this.tradeItemWithParty(null,item) } this._equips[i].setObject(null); changed=true } } if(!changed) { break } } }; Game_Actor.prototype.clearEquipments=function() { var maxSlots=this.equipSlots().length; for(var i=0; i<maxSlots; i++) { if(this.isEquipChangeOk(i)) { this.changeEquip(i,null) } } }; Game_Actor.prototype.optimizeEquipments=function() { var maxSlots=this.equipSlots().length; this.clearEquipments(); for(var i=0; i<maxSlots; i++) { if(this.isEquipChangeOk(i)) { this.changeEquip(i,this.bestEquipItem(i)) } } }; Game_Actor.prototype.bestEquipItem=function(slotId) { var etypeId=this.equipSlots()[slotId]; var items=$gameParty.equipItems().filter(function(item) { return item.etypeId===etypeId&&this.canEquip(item) } ,this); var bestItem=null; var bestPerformance=-1000; for(var i=0; i<items.length; i++) { var performance=this.calcEquipItemPerformance(items[i]); if(performance>bestPerformance) { bestPerformance=performance; bestItem=items[i] } } return bestItem }; Game_Actor.prototype.calcEquipItemPerformance=function(item) { return item.params.reduce(function(a, { return a+b } ) }; Game_Actor.prototype.isSkillWtypeOk=function(skill) { var wtypeId1=skill.requiredWtypeId1; var wtypeId2=skill.requiredWtypeId2; if((wtypeId1===0&&wtypeId2===0)||(wtypeId1>0&&this.isWtypeEquipped(wtypeId1))||(wtypeId2>0&&this.isWtypeEquipped(wtypeId2))) { return true } else { return false } }; Game_Actor.prototype.isWtypeEquipped=function(wtypeId) { return this.weapons().some(function(weapon) { return weapon.wtypeId===wtypeId } ) }; Game_Actor.prototype.refresh=function() { this.releaseUnequippableItems(false); Game_Battler.prototype.refresh.call(this) }; Game_Actor.prototype.isActor=function() { return true }; Game_Actor.prototype.friendsUnit=function() { return $gameParty }; Game_Actor.prototype.opponentsUnit=function() { return $gameTroop }; Game_Actor.prototype.index=function() { return $gameParty.members().indexOf(this) }; Game_Actor.prototype.isBattleMember=function() { return $gameParty.battleMembers().contains(this) }; Game_Actor.prototype.isFormationChangeOk=function() { return true }; Game_Actor.prototype.currentClass=function() { return $dataClasses[this._classId] }; Game_Actor.prototype.isClass=function(gameClass) { return gameClass&&this._classId===gameClass.id }; Game_Actor.prototype.skills=function() { var list=[]; this._skills.concat(this.addedSkills()).forEach(function(id) { if(!list.contains($dataSkills[id])) { list.push($dataSkills[id]) } } ); return list }; Game_Actor.prototype.usableSkills=function() { return this.skills().filter(function(skill) { return this.canUse(skill) } ,this) }; Game_Actor.prototype.traitObjects=function() { var objects=Game_Battler.prototype.traitObjects.call(this); objects=objects.concat([this.actor(),this.currentClass()]); var equips=this.equips(); for(var i=0; i<equips.length; i++) { var item=equips[i]; if(item) { objects.push(item) } } return objects }; Game_Actor.prototype.attackElements=function() { var set=Game_Battler.prototype.attackElements.call(this); if(this.hasNoWeapons()&&!set.contains(this.bareHandsElementId())) { set.push(this.bareHandsElementId()) } return set }; Game_Actor.prototype.hasNoWeapons=function() { return this.weapons().length===0 }; Game_Actor.prototype.bareHandsElementId=function() { return 1 }; Game_Actor.prototype.paramMax=function(paramId) { if(paramId===0) { return 9999 } return Game_Battler.prototype.paramMax.call(this,paramId) }; Game_Actor.prototype.paramBase=function(paramId) { return this.currentClass().params[paramId][this._level] }; Game_Actor.prototype.paramPlus=function(paramId) { var value=Game_Battler.prototype.paramPlus.call(this,paramId); var equips=this.equips(); for(var i=0; i<equips.length; i++) { var item=equips[i]; if(item) { value+=item.params[paramId] } } return value }; Game_Actor.prototype.attackAnimationId1=function() { if(this.hasNoWeapons()) { return this.bareHandsAnimationId() } else { var weapons=this.weapons(); return weapons[0]?weapons[0].animationId:0 } }; Game_Actor.prototype.attackAnimationId2=function() { var weapons=this.weapons(); return weapons[1]?weapons[1].animationId:0 }; Game_Actor.prototype.bareHandsAnimationId=function() { return 1 }; Game_Actor.prototype.changeExp=function(exp,show) { this._exp[this._classId]=Math.max(exp,0); var lastLevel=this._level; var lastSkills=this.skills(); while(!this.isMaxLevel()&&this.currentExp()>=this.nextLevelExp()) { this.levelUp() } while(this.currentExp()<this.currentLevelExp()) { this.levelDown() } if(show&&this._level>lastLevel) { this.displayLevelUp(this.findNewSkills(lastSkills)) } this.refresh() }; Game_Actor.prototype.levelUp=function() { this._level++; this.currentClass().learnings.forEach(function(learning) { if(learning.level===this._level) { this.learnSkill(learning.skillId) } } ,this) }; Game_Actor.prototype.levelDown=function() { this._level-- }; Game_Actor.prototype.findNewSkills=function(lastSkills) { var newSkills=this.skills(); for(var i=0; i<lastSkills.length; i++) { var index=newSkills.indexOf(lastSkills[i]); if(index>=0) { newSkills.splice(index,1) } } return newSkills }; Game_Actor.prototype.displayLevelUp=function(newSkills) { var text=TextManager.levelUp.format(this._name,TextManager.level,this._level); $gameMessage.newPage(); $gameMessage.add(text); newSkills.forEach(function(skill) { $gameMessage.add(TextManager.obtainSkill.format(skill.name)) } ) }; Game_Actor.prototype.gainExp=function(exp) { var newExp=this.currentExp()+Math.round(exp*this.finalExpRate()); this.changeExp(newExp,this.shouldDisplayLevelUp()) }; Game_Actor.prototype.finalExpRate=function() { return this.exr*(this.isBattleMember()?1:this.benchMembersExpRate()) }; Game_Actor.prototype.benchMembersExpRate=function() { return $dataSystem.optExtraExp?1:0 }; Game_Actor.prototype.shouldDisplayLevelUp=function() { return true }; Game_Actor.prototype.changeLevel=function(level,show) { level=level.clamp(1,this.maxLevel()); this.changeExp(this.expForLevel(level),show) }; Game_Actor.prototype.learnSkill=function(skillId) { if(!this.isLearnedSkill(skillId)) { this._skills.push(skillId); this._skills.sort(function(a, { return a-b } ) } }; Game_Actor.prototype.forgetSkill=function(skillId) { var index=this._skills.indexOf(skillId); if(index>=0) { this._skills.splice(index,1) } }; Game_Actor.prototype.isLearnedSkill=function(skillId) { return this._skills.contains(skillId) }; Game_Actor.prototype.changeClass=function(classId,keepExp) { if(keepExp) { this._exp[classId]=this._exp() } this._classId=classId; this.changeExp(this._exp[this._classId]||0,false); this.refresh() }; Game_Actor.prototype.setCharacterImage=function(characterName,characterIndex) { this._characterName=characterName; this._characterIndex=characterIndex }; Game_Actor.prototype.setFaceImage=function(faceName,faceIndex) { this._faceName=faceName; this._faceIndex=faceIndex }; Game_Actor.prototype.setBattlerImage=function(battlerName) { this._battlerName=battlerName }; Game_Actor.prototype.isSpriteVisible=function() { return $gameSystem.isSideView() }; Game_Actor.prototype.startAnimation=function(animationId,mirror,delay) { mirror=!mirror; Game_Battler.prototype.startAnimation.call(this,animationId,mirror,delay) }; Game_Actor.prototype.performActionStart=function(action) { Game_Battler.prototype.performActionStart.call(this,action) }; Game_Actor.prototype.performAction=function(action) { Game_Battler.prototype.performAction.call(this,action); if(action.isAttack()) { this.performAttack() } else if(action.isGuard()) { this.requestMotion('guard') } else if(action.isMagicSkill()) { this.requestMotion('spell') } else if(action.isSkill()) { this.requestMotion('skill') } else if(action.isItem()) { this.requestMotion('item') } }; Game_Actor.prototype.performActionEnd=function() { Game_Battler.prototype.performActionEnd.call(this) }; Game_Actor.prototype.performAttack=function() { var weapons=this.weapons(); var wtypeId=weapons[0]?weapons[0].wtypeId:0; var attackMotion=$dataSystem.attackMotions[wtypeId]; if(attackMotion) { if(attackMotion.type===0) { this.requestMotion('thrust') } else if(attackMotion.type===1) { this.requestMotion('swing') } else if(attackMotion.type===2) { this.requestMotion('missile') } this.startWeaponAnimation(attackMotion.weaponImageId) } }; Game_Actor.prototype.performDamage=function() { Game_Battler.prototype.performDamage.call(this); if(this.isSpriteVisible()) { this.requestMotion('damage') } else { $gameScreen.startShake(5,5,10) } SoundManager.playActorDamage() }; Game_Actor.prototype.performEvasion=function() { Game_Battler.prototype.performEvasion.call(this); this.requestMotion('evade') }; Game_Actor.prototype.performMagicEvasion=function() { Game_Battler.prototype.performMagicEvasion.call(this); this.requestMotion('evade') }; Game_Actor.prototype.performCounter=function() { Game_Battler.prototype.performCounter.call(this); this.performAttack() }; Game_Actor.prototype.performCollapse=function() { Game_Battler.prototype.performCollapse.call(this); if($gameParty.inBattle()) { SoundManager.playActorCollapse() } }; Game_Actor.prototype.performVictory=function() { if(this.canMove()) { this.requestMotion('victory') } }; Game_Actor.prototype.performEscape=function() { if(this.canMove()) { this.requestMotion('escape') } }; Game_Actor.prototype.makeActionList=function() { var list=[]; var action=new Game_Action(this); action.setAttack(); list.push(action); this.usableSkills().forEach(function(skill) { action=new Game_Action(this); action.setSkill(skill.id); list.push(action) } ,this); return list }; Game_Actor.prototype.makeAutoBattleActions=function() { for(var i=0; i<this.numActions(); i++) { var list=this.makeActionList(); var maxValue=Number.MIN_VALUE; for(var j=0; j<list.length; j++) { var value=list[j].evaluate(); if(value>maxValue) { maxValue=value; this.setAction(i,list[j]) } } } this.setActionState('waiting') }; Game_Actor.prototype.makeConfusionActions=function() { for(var i=0; i<this.numActions(); i++) { this.action(i).setConfusion() } this.setActionState('waiting') }; Game_Actor.prototype.makeActions=function() { Game_Battler.prototype.makeActions.call(this); if(this.numActions()>0) { this.setActionState('undecided') } else { this.setActionState('waiting') } if(this.isAutoBattle()) { this.makeAutoBattleActions() } else if(this.isConfused()) { this.makeConfusionActions() } }; Game_Actor.prototype.onPlayerWalk=function() { this.clearResult(); this.checkFloorEffect(); if($gamePlayer.isNormal()) { this.turnEndOnMap(); this.states().forEach(function(state) { this.updateStateSteps(state) } ,this); this.showAddedStates(); this.showRemovedStates() } }; Game_Actor.prototype.updateStateSteps=function(state) { if(state.removeByWalking) { if(this._stateSteps[state.id]>0) { if(--this._stateSteps[state.id]===0) { this.removeState(state.id) } } } }; Game_Actor.prototype.showAddedStates=function() { this.result().addedStateObjects().forEach(function(state) { if(state.message1) { $gameMessage.add(this._name+state.message1) } } ,this) }; Game_Actor.prototype.showRemovedStates=function() { this.result().removedStateObjects().forEach(function(state) { if(state.message4) { $gameMessage.add(this._name+state.message4) } } ,this) }; Game_Actor.prototype.stepsForTurn=function() { return 20 }; Game_Actor.prototype.turnEndOnMap=function() { if($gameParty.steps()%this.stepsForTurn()===0) { this.onTurnEnd(); if(this.result().hpDamage>0) { this.performMapDamage() } } }; Game_Actor.prototype.checkFloorEffect=function() { if($gamePlayer.isOnDamageFloor()) { this.executeFloorDamage() } }; Game_Actor.prototype.executeFloorDamage=function() { var damage=Math.floor(this.basicFloorDamage()*this.fdr); damage=Math.min(damage,this.maxFloorDamage()); this.gainHp(-damage); if(damage>0) { this.performMapDamage() } }; Game_Actor.prototype.basicFloorDamage=function() { return 10 }; Game_Actor.prototype.maxFloorDamage=function() { return $dataSystem.optFloorDeath?this.hp:Math.max(this.hp-1,0) }; Game_Actor.prototype.performMapDamage=function() { if(!$gameParty.inBattle()) { $gameScreen.startFlashForDamage() } }; Game_Actor.prototype.clearActions=function() { Game_Battler.prototype.clearActions.call(this); this._actionInputIndex=0 }; Game_Actor.prototype.inputtingAction=function() { return this.action(this._actionInputIndex) }; Game_Actor.prototype.selectNextCommand=function() { if(this._actionInputIndex<this.numActions()-1) { this._actionInputIndex++; return true } else { return false } }; Game_Actor.prototype.selectPreviousCommand=function() { if(this._actionInputIndex>0) { this._actionInputIndex--; return true } else { return false } }; Game_Actor.prototype.lastMenuSkill=function() { return this._lastMenuSkill.object() }; Game_Actor.prototype.setLastMenuSkill=function(skill) { this._lastMenuSkill.setObject(skill) }; Game_Actor.prototype.lastBattleSkill=function() { return this._lastBattleSkill.object() }; Game_Actor.prototype.setLastBattleSkill=function(skill) { this._lastBattleSkill.setObject(skill) }; Game_Actor.prototype.lastCommandSymbol=function() { return this._lastCommandSymbol }; Game_Actor.prototype.setLastCommandSymbol=function(symbol) { this._lastCommandSymbol=symbol }; function Game_Enemy() { this.initialize.apply(this,arguments) } Game_Enemy.prototype=Object.create(Game_Battler.prototype); Game_Enemy.prototype.constructor=Game_Enemy; Game_Enemy.prototype.initialize=function(enemyId,x,y) { Game_Battler.prototype.initialize.call(this); this.setup(enemyId,x,y) }; Game_Enemy.prototype.initMembers=function() { Game_Battler.prototype.initMembers.call(this); this._enemyId=0; this._letter=''; this._plural=false; this._screenX=0; this._screenY=0 }; Game_Enemy.prototype.setup=function(enemyId,x,y) { this._enemyId=enemyId; this._screenX=x; this._screenY=y; this.recoverAll() }; Game_Enemy.prototype.isEnemy=function() { return true }; Game_Enemy.prototype.friendsUnit=function() { return $gameTroop }; Game_Enemy.prototype.opponentsUnit=function() { return $gameParty }; Game_Enemy.prototype.index=function() { return $gameTroop.members().indexOf(this) }; Game_Enemy.prototype.isBattleMember=function() { return this.index()>=0 }; Game_Enemy.prototype.enemyId=function() { return this._enemyId }; Game_Enemy.prototype.enemy=function() { return $dataEnemies[this._enemyId] }; Game_Enemy.prototype.traitObjects=function() { return Game_Battler.prototype.traitObjects.call(this).concat(this.enemy()) }; Game_Enemy.prototype.paramBase=function(paramId) { return this.enemy().params[paramId] }; Game_Enemy.prototype.exp=function() { return this.enemy().exp }; Game_Enemy.prototype.gold=function() { return this.enemy().gold }; Game_Enemy.prototype.makeDropItems=function() { return this.enemy().dropItems.reduce(function(r,di) { if(di.kind>0&&Math.random()*di.denominator<this.dropItemRate()) { return r.concat(this.itemObject(di.kind,di.dataId)) } else { return r } } .bind(this),[]) }; Game_Enemy.prototype.dropItemRate=function() { return $gameParty.hasDropItemDouble()?2:1 }; Game_Enemy.prototype.itemObject=function(kind,dataId) { if(kind===1) { return $dataItems[dataId] } else if(kind===2) { return $dataWeapons[dataId] } else if(kind===3) { return $dataArmors[dataId] } else { return null } }; Game_Enemy.prototype.isSpriteVisible=function() { return true }; Game_Enemy.prototype.screenX=function() { return this._screenX }; Game_Enemy.prototype.screenY=function() { return this._screenY }; Game_Enemy.prototype.battlerName=function() { return this.enemy().battlerName }; Game_Enemy.prototype.battlerHue=function() { return this.enemy().battlerHue }; Game_Enemy.prototype.originalName=function() { return this.enemy().name }; Game_Enemy.prototype.name=function() { return this.originalName()+(this._plural?this._letter:'') }; Game_Enemy.prototype.isLetterEmpty=function() { return this._letter==='' }; Game_Enemy.prototype.setLetter=function(letter) { this._letter=letter }; Game_Enemy.prototype.setPlural=function(plural) { this._plural=plural }; Game_Enemy.prototype.performActionStart=function(action) { Game_Battler.prototype.performActionStart.call(this,action); this.requestEffect('whiten') }; Game_Enemy.prototype.performAction=function(action) { Game_Battler.prototype.performAction.call(this,action) }; Game_Enemy.prototype.performActionEnd=function() { Game_Battler.prototype.performActionEnd.call(this) }; Game_Enemy.prototype.performDamage=function() { Game_Battler.prototype.performDamage.call(this); SoundManager.playEnemyDamage(); this.requestEffect('blink') }; Game_Enemy.prototype.performCollapse=function() { Game_Battler.prototype.performCollapse.call(this); switch(this.collapseType()) { case 0:this.requestEffect('collapse'); SoundManager.playEnemyCollapse(); break; case 1:this.requestEffect('bossCollapse'); SoundManager.playBossCollapse1(); break; case 2:this.requestEffect('instantCollapse'); break } }; Game_Enemy.prototype.transform=function(enemyId) { var name=this.originalName(); this._enemyId=enemyId; if(this.originalName()!==name) { this._letter=''; this._plural=false } this.refresh(); if(this.numActions()>0) { this.makeActions() } }; Game_Enemy.prototype.meetsCondition=function(action) { var param1=action.conditionParam1; var param2=action.conditionParam2; switch(action.conditionType) { case 1:return this.meetsTurnCondition(param1,param2); case 2:return this.meetsHpCondition(param1,param2); case 3:return this.meetsMpCondition(param1,param2); case 4:return this.meetsStateCondition(param1); case 5:return this.meetsPartyLevelCondition(param1); case 6:return this.meetsSwitchCondition(param1); default:return true } }; Game_Enemy.prototype.meetsTurnCondition=function(param1,param2) { var n=$gameTroop.turnCount(); if(param2===0) { return n===param1 } else { return n>0&&n>=param1&&n%param2===param1%param2 } }; Game_Enemy.prototype.meetsHpCondition=function(param1,param2) { return this.hpRate()>=param1&&this.hpRate()<=param2 }; Game_Enemy.prototype.meetsMpCondition=function(param1,param2) { return this.mpRate()>=param1&&this.mpRate()<=param2 }; Game_Enemy.prototype.meetsStateCondition=function(param) { return this.isStateAffected(param) }; Game_Enemy.prototype.meetsPartyLevelCondition=function(param) { return $gameParty.highestLevel()>=param }; Game_Enemy.prototype.meetsSwitchCondition=function(param) { return $gameSwitches.value(param) }; Game_Enemy.prototype.isActionValid=function(action) { return this.meetsCondition(action)&&this.canUse($dataSkills[action.skillId]) }; Game_Enemy.prototype.selectAction=function(actionList,ratingZero) { var sum=actionList.reduce(function(r,a) { return r+a.rating-ratingZero } ,0); if(sum>0) { var value=Math.randomInt(sum); for(var i=0; i<actionList.length; i++) { var action=actionList[i]; value-=action.rating-ratingZero; if(value<0) { return action } } } else { return null } }; Game_Enemy.prototype.selectAllActions=function(actionList) { var ratingMax=Math.max.apply(null,actionList.map(function(a) { return a.rating } )); var ratingZero=ratingMax-3; actionList=actionList.filter(function(a) { return a.rating>ratingZero } ); for(var i=0; i<this.numActions(); i++) { this.action(i).setEnemyAction(this.selectAction(actionList,ratingZero)) } }; Game_Enemy.prototype.makeActions=function() { Game_Battler.prototype.makeActions.call(this); if(this.numActions()>0) { var actionList=this.enemy().actions.filter(function(a) { return this.isActionValid(a) } ,this); if(actionList.length>0) { this.selectAllActions(actionList) } } this.setActionState('waiting') }; function Game_Actors() { this.initialize.apply(this,arguments) } Game_Actors.prototype.initialize=function() { this._data=[] }; Game_Actors.prototype.actor=function(actorId) { if($dataActors[actorId]) { if(!this._data[actorId]) { this._data[actorId]=new Game_Actor(actorId) } return this._data[actorId] } return null }; function Game_Unit() { this.initialize.apply(this,arguments) } Game_Unit.prototype.initialize=function() { this._inBattle=false }; Game_Unit.prototype.inBattle=function() { return this._inBattle }; Game_Unit.prototype.members=function() { return[] }; Game_Unit.prototype.aliveMembers=function() { return this.members().filter(function(member) { return member.isAlive() } ) }; Game_Unit.prototype.deadMembers=function() { return this.members().filter(function(member) { return member.isDead() } ) }; Game_Unit.prototype.movableMembers=function() { return this.members().filter(function(member) { return member.canMove() } ) }; Game_Unit.prototype.clearActions=function() { return this.members().forEach(function(member) { return member.clearActions() } ) }; Game_Unit.prototype.agility=function() { var members=this.members(); if(members.length===0) { return 1 } var sum=members.reduce(function(r,member) { return r+member.agi } ,0); return sum/members.length }; Game_Unit.prototype.tgrSum=function() { return this.aliveMembers().reduce(function(r,member) { return r+member.tgr } ,0) }; Game_Unit.prototype.randomTarget=function() { var tgrRand=Math.random()*this.tgrSum(); var target=null; this.aliveMembers().forEach(function(member) { tgrRand-=member.tgr; if(tgrRand<=0&&!target) { target=member } } ); return target }; Game_Unit.prototype.randomDeadTarget=function() { var members=this.deadMembers(); if(members.length===0) { return null } return members[Math.floor(Math.random()*members.length)] }; Game_Unit.prototype.smoothTarget=function(index) { if(index<0) { index=0 } var member=this.members()[index]; return(member&&member.isAlive())?member:this.aliveMembers()[0] }; Game_Unit.prototype.smoothDeadTarget=function(index) { if(index<0) { index=0 } var member=this.members()[index]; return(member&&member.isDead())?member:this.deadMembers()[0] }; Game_Unit.prototype.clearResults=function() { this.members().forEach(function(member) { member.clearResult() } ) }; Game_Unit.prototype.onBattleStart=function() { this.members().forEach(function(member) { member.onBattleStart() } ); this._inBattle=true }; Game_Unit.prototype.onBattleEnd=function() { this._inBattle=false; this.members().forEach(function(member) { member.onBattleEnd() } ) }; Game_Unit.prototype.makeActions=function() { this.members().forEach(function(member) { member.makeActions() } ) }; Game_Unit.prototype.select=function(activeMember) { this.members().forEach(function(member) { if(member===activeMember) { member.select() } else { member.deselect() } } ) }; Game_Unit.prototype.isAllDead=function() { return this.aliveMembers().length===0 }; Game_Unit.prototype.substituteBattler=function() { var members=this.members(); for(var i=0; i<members.length; i++) { if(members[i].isSubstitute()) { return members[i] } } }; function Game_Party() { this.initialize.apply(this,arguments) } Game_Party.prototype=Object.create(Game_Unit.prototype); Game_Party.prototype.constructor=Game_Party; Game_Party.ABILITY_ENCOUNTER_HALF=0; Game_Party.ABILITY_ENCOUNTER_NONE=1; Game_Party.ABILITY_CANCEL_SURPRISE=2; Game_Party.ABILITY_RAISE_PREEMPTIVE=3; Game_Party.ABILITY_GOLD_DOUBLE=4; Game_Party.ABILITY_DROP_ITEM_DOUBLE=5; Game_Party.prototype.initialize=function() { Game_Unit.prototype.initialize.call(this); this._gold=0; this._steps=0; this._lastItem=new Game_Item(); this._menuActorId=0; this._targetActorId=0; this._actors=[]; this.initAllItems() }; Game_Party.prototype.initAllItems=function() { this._items= { }; this._weapons= { }; this._armors= { } }; Game_Party.prototype.exists=function() { return this._actors.length>0 }; Game_Party.prototype.size=function() { return this.members().length }; Game_Party.prototype.isEmpty=function() { return this.size()===0 }; Game_Party.prototype.members=function() { return this.inBattle()?this.battleMembers():this.allMembers() }; Game_Party.prototype.allMembers=function() { return this._actors.map(function(id) { return $gameActors.actor(id) } ) }; Game_Party.prototype.battleMembers=function() { return this.allMembers().slice(0,this.maxBattleMembers()).filter(function(actor) { return actor.isAppeared() } ) }; Game_Party.prototype.maxBattleMembers=function() { return 4 }; Game_Party.prototype.leader=function() { return this.battleMembers()[0] }; Game_Party.prototype.reviveBattleMembers=function() { this.battleMembers().forEach(function(actor) { if(actor.isDead()) { actor.setHp(1) } } ) }; Game_Party.prototype.items=function() { var list=[]; for(var id in this._items) { list.push($dataItems[id]) } return list }; Game_Party.prototype.weapons=function() { var list=[]; for(var id in this._weapons) { list.push($dataWeapons[id]) } return list }; Game_Party.prototype.armors=function() { var list=[]; for(var id in this._armors) { list.push($dataArmors[id]) } return list }; Game_Party.prototype.equipItems=function() { return this.weapons().concat(this.armors()) }; Game_Party.prototype.allItems=function() { return this.items().concat(this.equipItems()) }; Game_Party.prototype.itemContainer=function(item) { if(!item) { return null } else if(DataManager.isItem(item)) { return this._items } else if(DataManager.isWeapon(item)) { return this._weapons } else if(DataManager.isArmor(item)) { return this._armors } else { return null } }; Game_Party.prototype.setupStartingMembers=function() { this._actors=[]; $dataSystem.partyMembers.forEach(function(actorId) { if($gameActors.actor(actorId)) { this._actors.push(actorId) } } ,this) }; Game_Party.prototype.name=function() { var numBattleMembers=this.battleMembers().length; if(numBattleMembers===0) { return'' } else if(numBattleMembers===1) { return this.leader().name() } else { return TextManager.partyName.format(this.leader().name()) } }; Game_Party.prototype.setupBattleTest=function() { this.setupBattleTestMembers(); this.setupBattleTestItems() }; Game_Party.prototype.setupBattleTestMembers=function() { $dataSystem.testBattlers.forEach(function(battler) { var actor=$gameActors.actor(battler.actorId); if(actor) { actor.changeLevel(battler.level,false); actor.initEquips(battler.equips); actor.recoverAll(); this.addActor(battler.actorId) } } ,this) }; Game_Party.prototype.setupBattleTestItems=function() { $dataItems.forEach(function(item) { if(item&&item.name.length>0) { this.gainItem(item,this.maxItems(item)) } } ,this) }; Game_Party.prototype.highestLevel=function() { return Math.max.apply(null,this.members().map(function(actor) { return actor.level } )) }; Game_Party.prototype.addActor=function(actorId) { if(!this._actors.contains(actorId)) { this._actors.push(actorId); $gamePlayer.refresh(); $gameMap.requestRefresh() } }; Game_Party.prototype.removeActor=function(actorId) { if(this._actors.contains(actorId)) { this._actors.splice(this._actors.indexOf(actorId),1); $gamePlayer.refresh(); $gameMap.requestRefresh() } }; Game_Party.prototype.gold=function() { return this._gold }; Game_Party.prototype.gainGold=function(amount) { this._gold=(this._gold+amount).clamp(0,this.maxGold()) }; Game_Party.prototype.loseGold=function(amount) { this.gainGold(-amount) }; Game_Party.prototype.maxGold=function() { return 99999999 }; Game_Party.prototype.steps=function() { return this._steps }; Game_Party.prototype.increaseSteps=function() { this._steps++ }; Game_Party.prototype.numItems=function(item) { var container=this.itemContainer(item); return container?container[item.id]||0:0 }; Game_Party.prototype.maxItems=function(item) { return 99 }; Game_Party.prototype.hasMaxItems=function(item) { return this.numItems(item)>=this.maxItems(item) }; Game_Party.prototype.hasItem=function(item,includeEquip) { if(includeEquip===undefined) { includeEquip=false } if(this.numItems(item)>0) { return true } else if(includeEquip&&this.isAnyMemberEquipped(item)) { return true } else { return false } }; Game_Party.prototype.isAnyMemberEquipped=function(item) { return this.members().some(function(actor) { return actor.equips().contains(item) } ) }; Game_Party.prototype.gainItem=function(item,amount,includeEquip) { var container=this.itemContainer(item); if(container) { var lastNumber=this.numItems(item); var newNumber=lastNumber+amount; container[item.id]=newNumber.clamp(0,this.maxItems(item)); if(container[item.id]===0) { delete container[item.id] } if(includeEquip&&newNumber<0) { this.discardMembersEquip(item,-newNumber) } $gameMap.requestRefresh() } }; Game_Party.prototype.discardMembersEquip=function(item,amount) { var n=amount; this.members().forEach(function(actor) { while(n>0&&actor.isEquipped(item)) { actor.discardEquip(item); n-- } } ) }; Game_Party.prototype.loseItem=function(item,amount,includeEquip) { this.gainItem(item,-amount,includeEquip) }; Game_Party.prototype.consumeItem=function(item) { if(DataManager.isItem(item)&&item.consumable) { this.loseItem(item,1) } }; Game_Party.prototype.canUse=function(item) { return this.members().some(function(actor) { return actor.canUse(item) } ) }; Game_Party.prototype.canInput=function() { return this.members().some(function(actor) { return actor.canInput() } ) }; Game_Party.prototype.isAllDead=function() { if(Game_Unit.prototype.isAllDead.call(this)) { return this.inBattle()||!this.isEmpty() } else { return false } }; Game_Party.prototype.onPlayerWalk=function() { this.members().forEach(function(actor) { return actor.onPlayerWalk() } ) }; Game_Party.prototype.menuActor=function() { var actor=$gameActors.actor(this._menuActorId); if(!this.members().contains(actor)) { actor=this.members()[0] } return actor }; Game_Party.prototype.setMenuActor=function(actor) { this._menuActorId=actor.actorId() }; Game_Party.prototype.makeMenuActorNext=function() { var index=this.members().indexOf(this.menuActor()); if(index>=0) { index=(index+1)%this.members().length; this.setMenuActor(this.members()[index]) } else { this.setMenuActor(this.members()[0]) } }; Game_Party.prototype.makeMenuActorPrevious=function() { var index=this.members().indexOf(this.menuActor()); if(index>=0) { index=(index+this.members().length-1)%this.members().length; this.setMenuActor(this.members()[index]) } else { this.setMenuActor(this.members()[0]) } }; Game_Party.prototype.targetActor=function() { var actor=$gameActors.actor(this._targetActorId); if(!this.members().contains(actor)) { actor=this.members()[0] } return actor }; Game_Party.prototype.setTargetActor=function(actor) { this._targetActorId=actor.actorId() }; Game_Party.prototype.lastItem=function() { return this._lastItem.object() }; Game_Party.prototype.setLastItem=function(item) { this._lastItem.setObject(item) }; Game_Party.prototype.swapOrder=function(index1,index2) { var temp=this._actors[index1]; this._actors[index1]=this._actors[index2]; this._actors[index2]=temp; $gamePlayer.refresh() }; Game_Party.prototype.charactersForSavefile=function() { return this.battleMembers().map(function(actor) { return[actor.characterName(),actor.characterIndex()] } ) }; Game_Party.prototype.facesForSavefile=function() { return this.battleMembers().map(function(actor) { return[actor.faceName(),actor.faceIndex()] } ) }; Game_Party.prototype.partyAbility=function(abilityId) { return this.battleMembers().some(function(actor) { return actor.partyAbility(abilityId) } ) }; Game_Party.prototype.hasEncounterHalf=function() { return this.partyAbility(Game_Party.ABILITY_ENCOUNTER_HALF) }; Game_Party.prototype.hasEncounterNone=function() { return this.partyAbility(Game_Party.ABILITY_ENCOUNTER_NONE) }; Game_Party.prototype.hasCancelSurprise=function() { return this.partyAbility(Game_Party.ABILITY_CANCEL_SURPRISE) }; Game_Party.prototype.hasRaisePreemptive=function() { return this.partyAbility(Game_Party.ABILITY_RAISE_PREEMPTIVE) }; Game_Party.prototype.hasGoldDouble=function() { return this.partyAbility(Game_Party.ABILITY_GOLD_DOUBLE) }; Game_Party.prototype.hasDropItemDouble=function() { return this.partyAbility(Game_Party.ABILITY_DROP_ITEM_DOUBLE) }; Game_Party.prototype.ratePreemptive=function(troopAgi) { var rate=this.agility()>=troopAgi?0.05:0.03; if(this.hasRaisePreemptive()) { rate*=4 } return rate }; Game_Party.prototype.rateSurprise=function(troopAgi) { var rate=this.agility()>=troopAgi?0.03:0.05; if(this.hasCancelSurprise()) { rate=0 } return rate }; Game_Party.prototype.performVictory=function() { this.members().forEach(function(actor) { actor.performVictory() } ) }; Game_Party.prototype.performEscape=function() { this.members().forEach(function(actor) { actor.performEscape() } ) }; Game_Party.prototype.removeBattleStates=function() { this.members().forEach(function(actor) { actor.removeBattleStates() } ) }; Game_Party.prototype.requestMotionRefresh=function() { this.members().forEach(function(actor) { actor.requestMotionRefresh() } ) }; function Game_Troop() { this.initialize.apply(this,arguments) } Game_Troop.prototype=Object.create(Game_Unit.prototype); Game_Troop.prototype.constructor=Game_Troop; Game_Troop.LETTER_TABLE_HALF=[' A',' B',' C',' D',' E',' F',' G',' H',' I',' J',' K',' L',' M',' N',' O',' P',' Q',' R',' S',' T',' U',' V',' W',' X',' Y',' Z']; Game_Troop.LETTER_TABLE_FULL=['A','ï¼¢','ï¼£','D','ï¼¥','F','G','H','I','J','K','L','ï¼','ï¼®','O','ï¼°','ï¼±','ï¼²','ï¼³','ï¼´','ï¼µ','V','ï¼·','X','ï¼¹','Z']; Game_Troop.prototype.initialize=function() { Game_Unit.prototype.initialize.call(this); this._interpreter=new Game_Interpreter(); this.clear() }; Game_Troop.prototype.isEventRunning=function() { return this._interpreter.isRunning() }; Game_Troop.prototype.updateInterpreter=function() { this._interpreter.update() }; Game_Troop.prototype.turnCount=function() { return this._turnCount }; Game_Troop.prototype.members=function() { return this._enemies }; Game_Troop.prototype.clear=function() { this._interpreter.clear(); this._troopId=0; this._eventFlags= { }; this._enemies=[]; this._turnCount=0; this._namesCount= { } }; Game_Troop.prototype.troop=function() { return $dataTroops[this._troopId] }; Game_Troop.prototype.setup=function(troopId) { this.clear(); this._troopId=troopId; this._enemies=[]; this.troop().members.forEach(function(member) { if($dataEnemies[member.enemyId]) { var enemyId=member.enemyId; var x=member.x; var y=member.y; var enemy=new Game_Enemy(enemyId,x,y); if(member.hidden) { enemy.hide() } this._enemies.push(enemy) } } ,this); this.makeUniqueNames() }; Game_Troop.prototype.makeUniqueNames=function() { var table=this.letterTable(); this.members().forEach(function(enemy) { if(enemy.isAlive()&&enemy.isLetterEmpty()) { var name=enemy.originalName(); var n=this._namesCount[name]||0; enemy.setLetter(table[n%table.length]); this._namesCount[name]=n+1 } } ,this); this.members().forEach(function(enemy) { var name=enemy.originalName(); if(this._namesCount[name]>=2) { enemy.setPlural(true) } } ,this) }; Game_Troop.prototype.letterTable=function() { return $gameSystem.isCJK()?Game_Troop.LETTER_TABLE_FULL:Game_Troop.LETTER_TABLE_HALF }; Game_Troop.prototype.enemyNames=function() { var names=[]; this.members().forEach(function(enemy) { var name=enemy.originalName(); if(enemy.isAlive()&&!names.contains(name)) { names.push(name) } } ); return names }; Game_Troop.prototype.meetsConditions=function(page) { var c=page.conditions; if(!c.turnEnding&&!c.turnValid&&!c.enemyValid&&!c.actorValid&&!c.switchValid) { return false } if(c.turnEnding) { if(!BattleManager.isTurnEnd()) { return false } } if(c.turnValid) { var n=this._turnCount; var a=c.turnA; var b=c.turnB; if((b===0&&n!==a)) { return false } if((b>0&&(n<1||n<a||n%b!==a%)) { return false } } if(c.enemyValid) { var enemy=$gameTroop.members()[c.enemyIndex]; if(!enemy||enemy.hpRate()*100>c.enemyHp) { return false } } if(c.actorValid) { var actor=$gameActors.actor(c.actorId); if(!actor||actor.hpRate()*100>c.actorHp) { return false } } if(c.switchValid) { if(!$gameSwitches.value(c.switchId)) { return false } } return true }; Game_Troop.prototype.setupBattleEvent=function() { if(!this._interpreter.isRunning()) { if(this._interpreter.setupReservedCommonEvent()) { return } var pages=this.troop().pages; for(var i=0; i<pages.length; i++) { var page=pages[i]; if(this.meetsConditions(page)&&!this._eventFlags[i]) { this._interpreter.setup(page.list); if(page.span<=1) { this._eventFlags[i]=true } break } } } }; Game_Troop.prototype.increaseTurn=function() { var pages=this.troop().pages; for(var i=0; i<pages.length; i++) { var page=pages[i]; if(page.span===1) { this._eventFlags[i]=false } } this._turnCount++ }; Game_Troop.prototype.expTotal=function() { return this.deadMembers().reduce(function(r,enemy) { return r+enemy.exp() } ,0) }; Game_Troop.prototype.goldTotal=function() { return this.deadMembers().reduce(function(r,enemy) { return r+enemy.gold() } ,0)*this.goldRate() }; Game_Troop.prototype.goldRate=function() { return $gameParty.hasGoldDouble()?2:1 }; Game_Troop.prototype.makeDropItems=function() { return this.deadMembers().reduce(function(r,enemy) { return r.concat(enemy.makeDropItems()) } ,[]) }; function Game_Map() { this.initialize.apply(this,arguments) } Game_Map.prototype.initialize=function() { this._interpreter=new Game_Interpreter(); this._mapId=0; this._tilesetId=0; this._events=[]; this._commonEvents=[]; this._vehicles=[]; this._displayX=0; this._displayY=0; this._nameDisplay=true; this._scrollDirection=2; this._scrollRest=0; this._scrollSpeed=4; this._parallaxName=''; this._parallaxZero=false; this._parallaxLoopX=false; this._parallaxLoopY=false; this._parallaxSx=0; this._parallaxSy=0; this._parallaxX=0; this._parallaxY=0; this._battleback1Name=null; this._battleback2Name=null; this.createVehicles() }; Game_Map.prototype.setup=function(mapId) { if(!$dataMap) { throw new Error('The map data is not available') } this._mapId=mapId; this._tilesetId=$dataMap.tilesetId; this._displayX=0; this._displayY=0; this.refereshVehicles(); this.setupEvents(); this.setupScroll(); this.setupParallax(); this.setupBattleback(); this._needsRefresh=false }; Game_Map.prototype.isEventRunning=function() { return this._interpreter.isRunning()||this.isAnyEventStarting() }; Game_Map.prototype.tileWidth=function() { return 48 }; Game_Map.prototype.tileHeight=function() { return 48 }; Game_Map.prototype.mapId=function() { return this._mapId }; Game_Map.prototype.tilesetId=function() { return this._tilesetId }; Game_Map.prototype.displayX=function() { return this._displayX }; Game_Map.prototype.displayY=function() { return this._displayY }; Game_Map.prototype.parallaxName=function() { return this._parallaxName }; Game_Map.prototype.battleback1Name=function() { return this._battleback1Name }; Game_Map.prototype.battleback2Name=function() { return this._battleback2Name }; Game_Map.prototype.requestRefresh=function(mapId) { this._needsRefresh=true }; Game_Map.prototype.isNameDisplayEnabled=function() { return this._nameDisplay }; Game_Map.prototype.disableNameDisplay=function() { this._nameDisplay=false }; Game_Map.prototype.enableNameDisplay=function() { this._nameDisplay=true }; Game_Map.prototype.createVehicles=function() { this._vehicles=[]; this._vehicles[0]=new Game_Vehicle('boat'); this._vehicles[1]=new Game_Vehicle('ship'); this._vehicles[2]=new Game_Vehicle('airship') }; Game_Map.prototype.refereshVehicles=function() { this._vehicles.forEach(function(vehicle) { vehicle.refresh() } ) }; Game_Map.prototype.vehicles=function() { return this._vehicles }; Game_Map.prototype.vehicle=function(type) { if(type===0||type==='boat') { return this.boat() } else if(type===1||type==='ship') { return this.ship() } else if(type===2||type==='airship') { return this.airship() } else { return null } }; Game_Map.prototype.boat=function() { return this._vehicles[0] }; Game_Map.prototype.ship=function() { return this._vehicles[1] }; Game_Map.prototype.airship=function() { return this._vehicles[2] }; Game_Map.prototype.setupEvents=function() { this._events=[]; for(var i=0; i<$dataMap.events.length; i++) { if($dataMap.events[i]) { this._events[i]=new Game_Event(this._mapId,i) } } this._commonEvents=this.parallelCommonEvents().map(function(commonEvent) { return new Game_CommonEvent(commonEvent.id) } ); this.refreshTileEvents() }; Game_Map.prototype.events=function() { return this._events.filter(function(event) { return!!event } ) }; Game_Map.prototype.event=function(eventId) { return this._events[eventId] }; Game_Map.prototype.eraseEvent=function(eventId) { this._events[eventId].erase() }; Game_Map.prototype.parallelCommonEvents=function() { return $dataCommonEvents.filter(function(commonEvent) { return commonEvent&&commonEvent.trigger===2 } ) }; Game_Map.prototype.setupScroll=function() { this._scrollDirection=2; this._scrollRest=0; this._scrollSpeed=4 }; Game_Map.prototype.setupParallax=function() { this._parallaxName=$dataMap.parallaxName||''; this._parallaxZero=ImageManager.isZeroParallax(this._parallaxName); this._parallaxLoopX=$dataMap.parallaxLoopX; this._parallaxLoopY=$dataMap.parallaxLoopY; this._parallaxSx=$dataMap.parallaxSx; this._parallaxSy=$dataMap.parallaxSy; this._parallaxX=0; this._parallaxY=0 }; Game_Map.prototype.setupBattleback=function() { if($dataMap.specifyBattleback) { this._battleback1Name=$dataMap.battleback1Name; this._battleback2Name=$dataMap.battleback2Name } else { this._battleback1Name=null; this._battleback2Name=null } }; Game_Map.prototype.setDisplayPos=function(x,y) { if(this.isLoopHorizontal()) { this._displayX=x.mod(this.width()); this._parallaxX=x } else { var endX=this.width()-this.screenTileX(); this._displayX=endX<0?endX/2:x.clamp(0,endX); this._parallaxX=this._displayX } if(this.isLoopVertical()) { this._displayY=y.mod(this.height()); this._parallaxY=y } else { var endY=this.height()-this.screenTileY(); this._displayY=endY<0?endY/2:y.clamp(0,endY); this._parallaxY=this._displayY } }; Game_Map.prototype.parallaxOx=function() { if(this._parallaxZero) { return this._parallaxX*this.tileWidth() } else if(this._parallaxLoopX) { return this._parallaxX*this.tileWidth()/2 } else { return 0 } }; Game_Map.prototype.parallaxOy=function() { if(this._parallaxZero) { return this._parallaxY*this.tileHeight() } else if(this._parallaxLoopY) { return this._parallaxY*this.tileHeight()/2 } else { return 0 } }; Game_Map.prototype.tileset=function() { return $dataTilesets[this._tilesetId] }; Game_Map.prototype.tilesetFlags=function() { var tileset=this.tileset(); if(tileset) { return tileset.flags } else { return[] } }; Game_Map.prototype.displayName=function() { return $dataMap.displayName }; Game_Map.prototype.width=function() { return $dataMap.width }; Game_Map.prototype.height=function() { return $dataMap.height }; Game_Map.prototype.data=function() { return $dataMap.data }; Game_Map.prototype.isLoopHorizontal=function() { return $dataMap.scrollType===2||$dataMap.scrollType===3 }; Game_Map.prototype.isLoopVertical=function() { return $dataMap.scrollType===1||$dataMap.scrollType===3 }; Game_Map.prototype.isDashDisabled=function() { return $dataMap.disableDashing }; Game_Map.prototype.encounterList=function() { return $dataMap.encounterList }; Game_Map.prototype.encounterStep=function() { return $dataMap.encounterStep }; Game_Map.prototype.isOverworld=function() { return this.tileset()&&this.tileset().mode===0 }; Game_Map.prototype.screenTileX=function() { return Graphics.width/this.tileWidth() }; Game_Map.prototype.screenTileY=function() { return Graphics.height/this.tileHeight() }; Game_Map.prototype.adjustX=function(x) { if(this.isLoopHorizontal()&&x<this._displayX-(this.width()-this.screenTileX())/2) { return x-this._displayX+$dataMap.width } else { return x-this._displayX } }; Game_Map.prototype.adjustY=function(y) { if(this.isLoopVertical()&&y<this._displayY-(this.height()-this.screenTileY())/2) { return y-this._displayY+$dataMap.height } else { return y-this._displayY } }; Game_Map.prototype.roundX=function(x) { return this.isLoopHorizontal()?x.mod(this.width()):x }; Game_Map.prototype.roundY=function(y) { return this.isLoopVertical()?y.mod(this.height()):y }; Game_Map.prototype.xWithDirection=function(x,d) { return x+(d===6?1:d===4?-1:0) }; Game_Map.prototype.yWithDirection=function(y,d) { return y+(d===2?1:d===8?-1:0) }; Game_Map.prototype.roundXWithDirection=function(x,d) { return this.roundX(x+(d===6?1:d===4?-1:0)) }; Game_Map.prototype.roundYWithDirection=function(y,d) { return this.roundY(y+(d===2?1:d===8?-1:0)) }; Game_Map.prototype.deltaX=function(x1,x2) { var result=x1-x2; if(this.isLoopHorizontal()&&Math.abs(result)>this.width()/2) { if(result<0) { result+=this.width() } else { result-=this.width() } } return result }; Game_Map.prototype.deltaY=function(y1,y2) { var result=y1-y2; if(this.isLoopVertical()&&Math.abs(result)>this.height()/2) { if(result<0) { result+=this.height() } else { result-=this.height() } } return result }; Game_Map.prototype.distance=function(x1,y1,x2,y2) { return Math.abs(this.deltaX(x1,x2))+Math.abs(this.deltaY(y1,y2)) }; Game_Map.prototype.canvasToMapX=function(x) { var tileWidth=this.tileWidth(); var originX=this._displayX*tileWidth; var mapX=Math.floor((originX+x)/tileWidth); return this.roundX(mapX) }; Game_Map.prototype.canvasToMapY=function(y) { var tileHeight=this.tileHeight(); var originY=this._displayY*tileHeight; var mapY=Math.floor((originY+y)/tileHeight); return this.roundY(mapY) }; Game_Map.prototype.autoplay=function() { if($dataMap.autoplayBgm) { AudioManager.playBgm($dataMap.bgm) } if($dataMap.autoplayBgs) { AudioManager.playBgs($dataMap.bgs) } }; Game_Map.prototype.refreshIfNeeded=function() { if(this._needsRefresh) { this.refresh() } }; Game_Map.prototype.refresh=function() { this.events().forEach(function(event) { event.refresh() } ); this._commonEvents.forEach(function(event) { event.refresh() } ); this.refreshTileEvents(); this._needsRefresh=false }; Game_Map.prototype.refreshTileEvents=function() { this.tileEvents=this.events().filter(function(event) { return event.isTile() } ) }; Game_Map.prototype.eventsXy=function(x,y) { return this.events().filter(function(event) { return event.pos(x,y) } ) }; Game_Map.prototype.eventsXyNt=function(x,y) { return this.events().filter(function(event) { return event.posNt(x,y) } ) }; Game_Map.prototype.tileEventsXy=function(x,y) { return this.tileEvents.filter(function(event) { return event.posNt(x,y) } ) }; Game_Map.prototype.eventIdXy=function(x,y) { var list=this.eventsXy(x,y); return list.length===0?0:list[0].eventId() }; Game_Map.prototype.scrollDown=function(distance) { if(this.isLoopVertical()) { this._displayY+=distance; this._displayY%=$dataMap.height; if(this._parallaxLoopY) { this._parallaxY+=distance } } else if(this.height()>=this.screenTileY()) { var lastY=this._displayY; this._displayY=Math.min(this._displayY+distance,this.height()-this.screenTileY()); this._parallaxY+=this._displayY-lastY } }; Game_Map.prototype.scrollLeft=function(distance) { if(this.isLoopHorizontal()) { this._displayX+=$dataMap.width-distance; this._displayX%=$dataMap.width; if(this._parallaxLoopX) { this._parallaxX-=distance } } else if(this.width()>=this.screenTileX()) { var lastX=this._displayX; this._displayX=Math.max(this._displayX-distance,0); this._parallaxX+=this._displayX-lastX } }; Game_Map.prototype.scrollRight=function(distance) { if(this.isLoopHorizontal()) { this._displayX+=distance; this._displayX%=$dataMap.width; if(this._parallaxLoopX) { this._parallaxX+=distance } } else if(this.width()>=this.screenTileX()) { var lastX=this._displayX; this._displayX=Math.min(this._displayX+distance,this.width()-this.screenTileX()); this._parallaxX+=this._displayX-lastX } }; Game_Map.prototype.scrollUp=function(distance) { if(this.isLoopVertical()) { this._displayY+=$dataMap.height-distance; this._displayY%=$dataMap.height; if(this._parallaxLoopY) { this._parallaxY-=distance } } else if(this.height()>=this.screenTileY()) { var lastY=this._displayY; this._displayY=Math.max(this._displayY-distance,0); this._parallaxY+=this._displayY-lastY } }; Game_Map.prototype.isValid=function(x,y) { return x>=0&&x<this.width()&&y>=0&&y<this.height() }; Game_Map.prototype.checkPassage=function(x,y,bit) { var flags=this.tilesetFlags(); var tiles=this.allTiles(x,y); for(var i=0; i<tiles.length; i++) { var flag=flags[tiles[i]]; if((flag&0x10)!==0)continue; if((flag&bit)===0)return true; if((flag&bit)===bit)return false } return false }; Game_Map.prototype.tileId=function(x,y,z) { var width=$dataMap.width; var height=$dataMap.height; return $dataMap.data[(z*height+y)*width+x]||0 }; Game_Map.prototype.layeredTiles=function(x,y) { var tiles=[]; for(var i=0; i<4; i++) { tiles.push(this.tileId(x,y,3-i)) } return tiles }; Game_Map.prototype.allTiles=function(x,y) { var tiles=this.tileEventsXy(x,y).map(function(event) { return event.tileId() } ); return tiles.concat(this.layeredTiles(x,y)) }; Game_Map.prototype.autotileType=function(x,y,z) { var tileId=this.tileId(x,y,z); return tileId>=2048?Math.floor((tileId-2048)/48):-1 }; Game_Map.prototype.isPassable=function(x,y,d) { return this.checkPassage(x,y,(1<<(d/2-1))&0x0f) }; Game_Map.prototype.isBoatPassable=function(x,y) { return this.checkPassage(x,y,0x0200) }; Game_Map.prototype.isShipPassable=function(x,y) { return this.checkPassage(x,y,0x0400) }; Game_Map.prototype.isAirshipLandOk=function(x,y) { return this.checkPassage(x,y,0x0800)&&this.checkPassage(x,y,0x0f) }; Game_Map.prototype.checkLayeredTilesFlags=function(x,y,bit) { var flags=this.tilesetFlags(); return this.layeredTiles(x,y).some(function(tileId) { return(flags[tileId]&bit)!==0 } ) }; Game_Map.prototype.isLadder=function(x,y) { return this.isValid(x,y)&&this.checkLayeredTilesFlags(x,y,0x20) }; Game_Map.prototype.isBush=function(x,y) { return this.isValid(x,y)&&this.checkLayeredTilesFlags(x,y,0x40) }; Game_Map.prototype.isCounter=function(x,y) { return this.isValid(x,y)&&this.checkLayeredTilesFlags(x,y,0x80) }; Game_Map.prototype.isDamageFloor=function(x,y) { return this.isValid(x,y)&&this.checkLayeredTilesFlags(x,y,0x100) }; Game_Map.prototype.terrainTag=function(x,y) { if(this.isValid(x,y)) { var flags=this.tilesetFlags(); var tiles=this.layeredTiles(x,y); for(var i=0; i<tiles.length; i++) { var tag=flags[tiles[i]]>>12; if(tag>0) { return tag } } } return 0 }; Game_Map.prototype.regionId=function(x,y) { return this.isValid(x,y)?this.tileId(x,y,5):0 }; Game_Map.prototype.startScroll=function(direction,distance,speed) { this._scrollDirection=direction; this._scrollRest=distance; this._scrollSpeed=speed }; Game_Map.prototype.isScrolling=function() { return this._scrollRest>0 }; Game_Map.prototype.update=function(sceneActive) { this.refreshIfNeeded(); if(sceneActive) { this.updateInterpreter() } this.updateScroll(); this.updateEvents(); this.updateVehicles(); this.updateParallax() }; Game_Map.prototype.updateScroll=function() { if(this.isScrolling()) { var lastX=this._displayX; var lastY=this._displayY; this.doScroll(this._scrollDirection,this.scrollDistance()); if(this._displayX===lastX&&this._displayY===lastY) { this._scrollRest=0 } else { this._scrollRest-=this.scrollDistance() } } }; Game_Map.prototype.scrollDistance=function() { return Math.pow(2,this._scrollSpeed)/256 }; Game_Map.prototype.doScroll=function(direction,distance) { switch(direction) { case 2:this.scrollDown(distance); break; case 4:this.scrollLeft(distance); break; case 6:this.scrollRight(distance); break; case 8:this.scrollUp(distance); break } }; Game_Map.prototype.updateEvents=function() { this.events().forEach(function(event) { event.update() } ); this._commonEvents.forEach(function(event) { event.update() } ) }; Game_Map.prototype.updateVehicles=function() { this._vehicles.forEach(function(vehicle) { vehicle.update() } ) }; Game_Map.prototype.updateParallax=function() { if(this._parallaxLoopX) { this._parallaxX+=this._parallaxSx/this.tileWidth()/2 } if(this._parallaxLoopY) { this._parallaxY+=this._parallaxSy/this.tileHeight()/2 } }; Game_Map.prototype.changeTileset=function(tilesetId) { this._tilesetId=tilesetId; this.refresh() }; Game_Map.prototype.changeBattleback=function(battleback1Name,battleback2Name) { this._battleback1Name=battleback1Name; this._battleback2Name=battleback2Name }; Game_Map.prototype.changeParallax=function(name,loopX,loopY,sx,sy) { this._parallaxName=name; this._parallaxZero=ImageManager.isZeroParallax(this._parallaxName); if(this._parallaxLoopX&&!loopX) { this._parallaxX=0 } if(this._parallaxLoopY&&!loopY) { this._parallaxY=0 } this._parallaxLoopX=loopX; this._parallaxLoopY=loopY; this._parallaxSx=sx; this._parallaxSy=sy }; Game_Map.prototype.updateInterpreter=function() { for(;; ) { this._interpreter.update(); if(this._interpreter.isRunning()) { return } if(this._interpreter.eventId()>0) { this.unlockEvent(this._interpreter.eventId()); this._interpreter.clear() } if(!this.setupStartingEvent()) { return } } }; Game_Map.prototype.unlockEvent=function(eventId) { if(this._events[eventId]) { this._events[eventId].unlock() } }; Game_Map.prototype.setupStartingEvent=function() { this.refreshIfNeeded(); if(this._interpreter.setupReservedCommonEvent()) { return true } if(this.setupTestEvent()) { return true } if(this.setupStartingMapEvent()) { return true } if(this.setupAutorunCommonEvent()) { return true } return false }; Game_Map.prototype.setupTestEvent=function() { if($testEvent) { this._interpreter.setup($testEvent,0); $testEvent=null; return true } return false }; Game_Map.prototype.setupStartingMapEvent=function() { var events=this.events(); for(var i=0; i<events.length; i++) { var event=events[i]; if(event.isStarting()) { event.clearStartingFlag(); this._interpreter.setup(event.list(),event.eventId()); return true } } return false }; Game_Map.prototype.setupAutorunCommonEvent=function() { for(var i=0; i<$dataCommonEvents.length; i++) { var event=$dataCommonEvents[i]; if(event&&event.trigger===1&&$gameSwitches.value(event.switchId)) { this._interpreter.setup(event.list); return true } } return false }; Game_Map.prototype.isAnyEventStarting=function() { return this.events().some(function(event) { return event.isStarting() } ) }; function Game_CommonEvent() { this.initialize.apply(this,arguments) } Game_CommonEvent.prototype.initialize=function(commonEventId) { this._commonEventId=commonEventId; this.refresh() }; Game_CommonEvent.prototype.event=function() { return $dataCommonEvents[this._commonEventId] }; Game_CommonEvent.prototype.list=function() { return this.event().list }; Game_CommonEvent.prototype.refresh=function() { if(this.isActive()) { if(!this._interpreter) { this._interpreter=new Game_Interpreter() } } else { this._interpreter=null } }; Game_CommonEvent.prototype.isActive=function() { var event=this.event(); return event.trigger===2&&$gameSwitches.value(event.switchId) }; Game_CommonEvent.prototype.update=function() { if(this._interpreter) { if(!this._interpreter.isRunning()) { this._interpreter.setup(this.list()) } this._interpreter.update() } }; function Game_CharacterBase() { this.initialize.apply(this,arguments) } Object.defineProperties(Game_CharacterBase.prototype, { x: { get:function() { return this._x } ,configurable:true } ,y: { get:function() { return this._y } ,configurable:true } } ); Game_CharacterBase.prototype.initialize=function() { this.initMembers() }; Game_CharacterBase.prototype.initMembers=function() { this._x=0; this._y=0; this._realX=0; this._realY=0; this._moveSpeed=4; this._moveFrequency=6; this._opacity=255; this._blendMode=0; this._direction=2; this._pattern=1; this._priorityType=1; this._tileId=0; this._characterName=''; this._characterIndex=0; this._isObjectCharacter=false; this._walkAnime=true; this._stepAnime=false; this._directionFix=false; this._through=false; this._transparent=false; this._bushDepth=0; this._animationId=0; this._balloonId=0; this._animationPlaying=false; this._balloonPlaying=false; this._animationCount=0; this._stopCount=0; this._jumpCount=0; this._jumpPeak=0; this._movementSuccess=true }; Game_CharacterBase.prototype.pos=function(x,y) { return this._x===x&&this._y===y }; Game_CharacterBase.prototype.posNt=function(x,y) { return this.pos(x,y)&&!this.isThrough() }; Game_CharacterBase.prototype.moveSpeed=function() { return this._moveSpeed }; Game_CharacterBase.prototype.setMoveSpeed=function(moveSpeed) { this._moveSpeed=moveSpeed }; Game_CharacterBase.prototype.moveFrequency=function() { return this._moveFrequency }; Game_CharacterBase.prototype.setMoveFrequency=function(moveFrequency) { this._moveFrequency=moveFrequency }; Game_CharacterBase.prototype.opacity=function() { return this._opacity }; Game_CharacterBase.prototype.setOpacity=function(opacity) { this._opacity=opacity }; Game_CharacterBase.prototype.blendMode=function() { return this._blendMode }; Game_CharacterBase.prototype.setBlendMode=function(blendMode) { this._blendMode=blendMode }; Game_CharacterBase.prototype.isNormalPriority=function() { return this._priorityType===1 }; Game_CharacterBase.prototype.setPriorityType=function(priorityType) { this._priorityType=priorityType }; Game_CharacterBase.prototype.isMoving=function() { return this._realX!==this._x||this._realY!==this._y }; Game_CharacterBase.prototype.isJumping=function() { return this._jumpCount>0 }; Game_CharacterBase.prototype.jumpHeight=function() { return(this._jumpPeak*this._jumpPeak-Math.pow(Math.abs(this._jumpCount-this._jumpPeak),2))/2 }; Game_CharacterBase.prototype.isStopping=function() { return!this.isMoving()&&!this.isJumping() }; Game_CharacterBase.prototype.checkStop=function(threshold) { return this._stopCount>threshold }; Game_CharacterBase.prototype.resetStopCount=function() { this._stopCount=0 }; Game_CharacterBase.prototype.realMoveSpeed=function() { return this._moveSpeed+(this.isDashing()?1:0) }; Game_CharacterBase.prototype.distancePerFrame=function() { return Math.pow(2,this.realMoveSpeed())/256 }; Game_CharacterBase.prototype.isDashing=function() { return false }; Game_CharacterBase.prototype.isDebugThrough=function() { return false }; Game_CharacterBase.prototype.straighten=function() { if(this.hasWalkAnime()||this.hasStepAnime()) { this._pattern=1 } this._animationCount=0 }; Game_CharacterBase.prototype.reverseDir=function(d) { return 10-d }; Game_CharacterBase.prototype.canPass=function(x,y,d) { var x2=$gameMap.roundXWithDirection(x,d); var y2=$gameMap.roundYWithDirection(y,d); if(!$gameMap.isValid(x2,y2)) { return false } if(this.isThrough()||this.isDebugThrough()) { return true } if(!this.isMapPassable(x,y,d)) { return false } if(this.isCollidedWithCharacters(x2,y2)) { return false } return true }; Game_CharacterBase.prototype.canPassDiagonally=function(x,y,horz,vert) { var x2=$gameMap.roundXWithDirection(x,horz); var y2=$gameMap.roundYWithDirection(y,vert); if(this.canPass(x,y,vert)&&this.canPass(x,y2,horz)) { return true } if(this.canPass(x,y,horz)&&this.canPass(x2,y,vert)) { return true } return false }; Game_CharacterBase.prototype.isMapPassable=function(x,y,d) { var x2=$gameMap.roundXWithDirection(x,d); var y2=$gameMap.roundYWithDirection(y,d); var d2=this.reverseDir(d); return $gameMap.isPassable(x,y,d)&&$gameMap.isPassable(x2,y2,d2) }; Game_CharacterBase.prototype.isCollidedWithCharacters=function(x,y) { return this.isCollidedWithEvents(x,y)||this.isCollidedWithVehicles(x,y) }; Game_CharacterBase.prototype.isCollidedWithEvents=function(x,y) { var events=$gameMap.eventsXyNt(x,y); return events.some(function(event) { return event.isNormalPriority() } ) }; Game_CharacterBase.prototype.isCollidedWithVehicles=function(x,y) { return $gameMap.boat().posNt(x,y)||$gameMap.ship().posNt(x,y) }; Game_CharacterBase.prototype.setPosition=function(x,y) { this._x=Math.round(x); this._y=Math.round(y); this._realX=x; this._realY=y }; Game_CharacterBase.prototype.copyPosition=function(character) { this._x=character._x; this._y=character._y; this._realX=character._realX; this._realY=character._realY; this._direction=character._direction }; Game_CharacterBase.prototype.locate=function(x,y) { this.setPosition(x,y); this.straighten(); this.refreshBushDepth() }; Game_CharacterBase.prototype.direction=function() { return this._direction }; Game_CharacterBase.prototype.setDirection=function(d) { if(!this.isDirectionFixed()&&d) { this._direction=d } this.resetStopCount() }; Game_CharacterBase.prototype.isTile=function() { return this._tileId>0&&this._priorityType===0 }; Game_CharacterBase.prototype.isObjectCharacter=function() { return this._isObjectCharacter }; Game_CharacterBase.prototype.shiftY=function() { return this.isObjectCharacter()?0:6 }; Game_CharacterBase.prototype.scrolledX=function() { return $gameMap.adjustX(this._realX) }; Game_CharacterBase.prototype.scrolledY=function() { return $gameMap.adjustY(this._realY) }; Game_CharacterBase.prototype.screenX=function() { var tw=$gameMap.tileWidth(); return Math.round(this.scrolledX()*tw+tw/2) }; Game_CharacterBase.prototype.screenY=function() { var th=$gameMap.tileHeight(); return Math.round(this.scrolledY()*th+th-this.shiftY()-this.jumpHeight()) }; Game_CharacterBase.prototype.screenZ=function() { return this._priorityType*2+1 }; Game_CharacterBase.prototype.isNearTheScreen=function() { var gw=Graphics.width; var gh=Graphics.height; var tw=$gameMap.tileWidth(); var th=$gameMap.tileHeight(); var px=this.scrolledX()*tw+tw/2-gw/2; var py=this.scrolledY()*th+th/2-gh/2; return px>=-gw&&px<=gw&&py>=-gh&&py<=gh }; Game_CharacterBase.prototype.update=function() { if(this.isStopping()) { this.updateStop() } if(this.isJumping()) { this.updateJump() } else if(this.isMoving()) { this.updateMove() } this.updateAnimation() }; Game_CharacterBase.prototype.updateStop=function() { this._stopCount++ }; Game_CharacterBase.prototype.updateJump=function() { this._jumpCount--; this._realX=(this._realX*this._jumpCount+this._x)/(this._jumpCount+1.0); this._realY=(this._realY*this._jumpCount+this._y)/(this._jumpCount+1.0); this.refreshBushDepth(); if(this._jumpCount===0) { this._realX=this._x=$gameMap.roundX(this._x); this._realY=this._y=$gameMap.roundY(this._y) } }; Game_CharacterBase.prototype.updateMove=function() { if(this._x<this._realX) { this._realX=Math.max(this._realX-this.distancePerFrame(),this._x) } if(this._x>this._realX) { this._realX=Math.min(this._realX+this.distancePerFrame(),this._x) } if(this._y<this._realY) { this._realY=Math.max(this._realY-this.distancePerFrame(),this._y) } if(this._y>this._realY) { this._realY=Math.min(this._realY+this.distancePerFrame(),this._y) } if(!this.isMoving()) { this.refreshBushDepth() } }; Game_CharacterBase.prototype.updateAnimation=function() { this.updateAnimationCount(); if(this._animationCount>=this.animationWait()) { this.updatePattern(); this._animationCount=0 } }; Game_CharacterBase.prototype.animationWait=function() { return(9-this.realMoveSpeed())*3 }; Game_CharacterBase.prototype.updateAnimationCount=function() { if(this.isMoving()&&this.hasWalkAnime()) { this._animationCount+=1.5 } else if(this.hasStepAnime()||!this.isOriginalPattern()) { this._animationCount++ } }; Game_CharacterBase.prototype.updatePattern=function() { if(!this.hasStepAnime()&&this._stopCount>0) { this.resetPattern() } else { this._pattern=(this._pattern+1)%this.maxPattern() } }; Game_CharacterBase.prototype.maxPattern=function() { return 4 }; Game_CharacterBase.prototype.pattern=function() { return this._pattern<3?this._pattern:1 }; Game_CharacterBase.prototype.setPattern=function(pattern) { this._pattern=pattern }; Game_CharacterBase.prototype.isOriginalPattern=function() { return this.pattern()===1 }; Game_CharacterBase.prototype.resetPattern=function() { this.setPattern(1) }; Game_CharacterBase.prototype.refreshBushDepth=function() { if(this.isNormalPriority()&&!this.isObjectCharacter()&&this.isOnBush()&&!this.isJumping()) { if(!this.isMoving()) { this._bushDepth=12 } } else { this._bushDepth=0 } }; Game_CharacterBase.prototype.isOnLadder=function() { return $gameMap.isLadder(this._x,this._y) }; Game_CharacterBase.prototype.isOnBush=function() { return $gameMap.isBush(this._x,this._y) }; Game_CharacterBase.prototype.terrainTag=function() { return $gameMap.terrainTag(this._x,this._y) }; Game_CharacterBase.prototype.regionId=function() { return $gameMap.regionId(this._x,this._y) }; Game_CharacterBase.prototype.increaseSteps=function() { if(this.isOnLadder()) { this.setDirection(8) } this.resetStopCount(); this.refreshBushDepth() }; Game_CharacterBase.prototype.tileId=function() { return this._tileId }; Game_CharacterBase.prototype.characterName=function() { return this._characterName }; Game_CharacterBase.prototype.characterIndex=function() { return this._characterIndex }; Game_CharacterBase.prototype.setImage=function(characterName,characterIndex) { this._tileId=0; this._characterName=characterName; this._characterIndex=characterIndex; this._isObjectCharacter=ImageManager.isObjectCharacter(characterName) }; Game_CharacterBase.prototype.setTileImage=function(tileId) { this._tileId=tileId; this._characterName=''; this._characterIndex=0; this._isObjectCharacter=true }; Game_CharacterBase.prototype.checkEventTriggerTouchFront=function(d) { var x2=$gameMap.roundXWithDirection(this._x,d); var y2=$gameMap.roundYWithDirection(this._y,d); this.checkEventTriggerTouch(x2,y2) }; Game_CharacterBase.prototype.checkEventTriggerTouch=function(x,y) { return false }; Game_CharacterBase.prototype.isMovementSucceeded=function(x,y) { return this._movementSuccess }; Game_CharacterBase.prototype.setMovementSuccess=function(success) { this._movementSuccess=success }; Game_CharacterBase.prototype.moveStraight=function(d) { this.setMovementSuccess(this.canPass(this._x,this._y,d)); if(this.isMovementSucceeded()) { this.setDirection(d); this._x=$gameMap.roundXWithDirection(this._x,d); this._y=$gameMap.roundYWithDirection(this._y,d); this._realX=$gameMap.xWithDirection(this._x,this.reverseDir(d)); this._realY=$gameMap.yWithDirection(this._y,this.reverseDir(d)); this.increaseSteps() } else { this.setDirection(d); this.checkEventTriggerTouchFront(d) } }; Game_CharacterBase.prototype.moveDiagonally=function(horz,vert) { this.setMovementSuccess(this.canPassDiagonally(this._x,this._y,horz,vert)); if(this.isMovementSucceeded()) { this._x=$gameMap.roundXWithDirection(this._x,horz); this._y=$gameMap.roundYWithDirection(this._y,vert); this._realX=$gameMap.xWithDirection(this._x,this.reverseDir(horz)); this._realY=$gameMap.yWithDirection(this._y,this.reverseDir(vert)); this.increaseSteps() } if(this._direction===this.reverseDir(horz)) { this.setDirection(horz) } if(this._direction===this.reverseDir(vert)) { this.setDirection(vert) } }; Game_CharacterBase.prototype.jump=function(xPlus,yPlus) { if(Math.abs(xPlus)>Math.abs(yPlus)) { if(xPlus!==0) { this.setDirection(xPlus<0?4:6) } } else { if(yPlus!==0) { this.setDirection(yPlus<0?8:2) } } this._x+=xPlus; this._y+=yPlus; var distance=Math.round(Math.sqrt(xPlus*xPlus+yPlus*yPlus)); this._jumpPeak=10+distance-this._moveSpeed; this._jumpCount=this._jumpPeak*2; this.resetStopCount(); this.straighten() }; Game_CharacterBase.prototype.hasWalkAnime=function() { return this._walkAnime }; Game_CharacterBase.prototype.setWalkAnime=function(walkAnime) { this._walkAnime=walkAnime }; Game_CharacterBase.prototype.hasStepAnime=function() { return this._stepAnime }; Game_CharacterBase.prototype.setStepAnime=function(stepAnime) { this._stepAnime=stepAnime }; Game_CharacterBase.prototype.isDirectionFixed=function() { return this._directionFix }; Game_CharacterBase.prototype.setDirectionFix=function(directionFix) { this._directionFix=directionFix }; Game_CharacterBase.prototype.isThrough=function() { return this._through }; Game_CharacterBase.prototype.setThrough=function(through) { this._through=through }; Game_CharacterBase.prototype.isTransparent=function() { return this._transparent }; Game_CharacterBase.prototype.bushDepth=function() { return this._bushDepth }; Game_CharacterBase.prototype.setTransparent=function(transparent) { this._transparent=transparent }; Game_CharacterBase.prototype.requestAnimation=function(animationId) { this._animationId=animationId }; Game_CharacterBase.prototype.requestBalloon=function(balloonId) { this._balloonId=balloonId }; Game_CharacterBase.prototype.animationId=function() { return this._animationId }; Game_CharacterBase.prototype.balloonId=function() { return this._balloonId }; Game_CharacterBase.prototype.startAnimation=function() { this._animationId=0; this._animationPlaying=true }; Game_CharacterBase.prototype.startBalloon=function() { this._balloonId=0; this._balloonPlaying=true }; Game_CharacterBase.prototype.isAnimationPlaying=function() { return this._animationId>0||this._animationPlaying }; Game_CharacterBase.prototype.isBalloonPlaying=function() { return this._balloonId>0||this._balloonPlaying }; Game_CharacterBase.prototype.endAnimation=function() { this._animationPlaying=false }; Game_CharacterBase.prototype.endBalloon=function() { this._balloonPlaying=false }; function Game_Character() { this.initialize.apply(this,arguments) } Game_Character.prototype=Object.create(Game_CharacterBase.prototype); Game_Character.prototype.constructor=Game_Character; Game_Character.ROUTE_END=0; Game_Character.ROUTE_MOVE_DOWN=1; Game_Character.ROUTE_MOVE_LEFT=2; Game_Character.ROUTE_MOVE_RIGHT=3; Game_Character.ROUTE_MOVE_UP=4; Game_Character.ROUTE_MOVE_LOWER_L=5; Game_Character.ROUTE_MOVE_LOWER_R=6; Game_Character.ROUTE_MOVE_UPPER_L=7; Game_Character.ROUTE_MOVE_UPPER_R=8; Game_Character.ROUTE_MOVE_RANDOM=9; Game_Character.ROUTE_MOVE_TOWARD=10; Game_Character.ROUTE_MOVE_AWAY=11; Game_Character.ROUTE_MOVE_FORWARD=12; Game_Character.ROUTE_MOVE_BACKWARD=13; Game_Character.ROUTE_JUMP=14; Game_Character.ROUTE_WAIT=15; Game_Character.ROUTE_TURN_DOWN=16; Game_Character.ROUTE_TURN_LEFT=17; Game_Character.ROUTE_TURN_RIGHT=18; Game_Character.ROUTE_TURN_UP=19; Game_Character.ROUTE_TURN_90D_R=20; Game_Character.ROUTE_TURN_90D_L=21; Game_Character.ROUTE_TURN_180D=22; Game_Character.ROUTE_TURN_90D_R_L=23; Game_Character.ROUTE_TURN_RANDOM=24; Game_Character.ROUTE_TURN_TOWARD=25; Game_Character.ROUTE_TURN_AWAY=26; Game_Character.ROUTE_SWITCH_ON=27; Game_Character.ROUTE_SWITCH_OFF=28; Game_Character.ROUTE_CHANGE_SPEED=29; Game_Character.ROUTE_CHANGE_FREQ=30; Game_Character.ROUTE_WALK_ANIME_ON=31; Game_Character.ROUTE_WALK_ANIME_OFF=32; Game_Character.ROUTE_STEP_ANIME_ON=33; Game_Character.ROUTE_STEP_ANIME_OFF=34; Game_Character.ROUTE_DIR_FIX_ON=35; Game_Character.ROUTE_DIR_FIX_OFF=36; Game_Character.ROUTE_THROUGH_ON=37; Game_Character.ROUTE_THROUGH_OFF=38; Game_Character.ROUTE_TRANSPARENT_ON=39; Game_Character.ROUTE_TRANSPARENT_OFF=40; Game_Character.ROUTE_CHANGE_IMAGE=41; Game_Character.ROUTE_CHANGE_OPACITY=42; Game_Character.ROUTE_CHANGE_BLEND_MODE=43; Game_Character.ROUTE_PLAY_SE=44; Game_Character.ROUTE_SCRIPT=45; Game_Character.prototype.initialize=function() { Game_CharacterBase.prototype.initialize.call(this) }; Game_Character.prototype.initMembers=function() { Game_CharacterBase.prototype.initMembers.call(this); this._moveRouteForcing=false; this._moveRoute=null; this._moveRouteIndex=0; this._originalMoveRoute=null; this._originalMoveRouteIndex=0; this._waitCount=0 }; Game_Character.prototype.memorizeMoveRoute=function() { this._originalMoveRoute=this._moveRoute; this._originalMoveRouteIndex=this._moveRouteIndex }; Game_Character.prototype.restoreMoveRoute=function() { this._moveRoute=this._originalMoveRoute; this._moveRouteIndex=this._originalMoveRouteIndex; this._originalMoveRoute=null }; Game_Character.prototype.isMoveRouteForcing=function() { return this._moveRouteForcing }; Game_Character.prototype.setMoveRoute=function(moveRoute) { this._moveRoute=moveRoute; this._moveRouteIndex=0; this._moveRouteForcing=false }; Game_Character.prototype.forceMoveRoute=function(moveRoute) { if(!this._originalMoveRoute) { this.memorizeMoveRoute() } this._moveRoute=moveRoute; this._moveRouteIndex=0; this._moveRouteForcing=true; this._waitCount=0 }; Game_Character.prototype.updateStop=function() { Game_CharacterBase.prototype.updateStop.call(this); if(this._moveRouteForcing) { this.updateRoutineMove() } }; Game_Character.prototype.updateRoutineMove=function() { if(this._waitCount>0) { this._waitCount-- } else { this.setMovementSuccess(true); var command=this._moveRoute.list[this._moveRouteIndex]; if(command) { this.processMoveCommand(command); this.advanceMoveRouteIndex() } } }; Game_Character.prototype.processMoveCommand=function(command) { var gc=Game_Character; var params=command.parameters; switch(command.code) { case gc.ROUTE_END:this.processRouteEnd(); break; case gc.ROUTE_MOVE_DOWN:this.moveStraight(2); break; case gc.ROUTE_MOVE_LEFT:this.moveStraight(4); break; case gc.ROUTE_MOVE_RIGHT:this.moveStraight(6); break; case gc.ROUTE_MOVE_UP:this.moveStraight(8); break; case gc.ROUTE_MOVE_LOWER_L:this.moveDiagonally(4,2); break; case gc.ROUTE_MOVE_LOWER_R:this.moveDiagonally(6,2); break; case gc.ROUTE_MOVE_UPPER_L:this.moveDiagonally(4,8); break; case gc.ROUTE_MOVE_UPPER_R:this.moveDiagonally(6,8); break; case gc.ROUTE_MOVE_RANDOM:this.moveRandom(); break; case gc.ROUTE_MOVE_TOWARD:this.moveTowardPlayer(); break; case gc.ROUTE_MOVE_AWAY:this.moveAwayFromPlayer(); break; case gc.ROUTE_MOVE_FORWARD:this.moveForward(); break; case gc.ROUTE_MOVE_BACKWARD:this.moveBackward(); break; case gc.ROUTE_JUMP:this.jump(params[0],params[1]); break; case gc.ROUTE_WAIT:this._waitCount=params[0]-1; break; case gc.ROUTE_TURN_DOWN:this.setDirection(2); break; case gc.ROUTE_TURN_LEFT:this.setDirection(4); break; case gc.ROUTE_TURN_RIGHT:this.setDirection(6); break; case gc.ROUTE_TURN_UP:this.setDirection(8); break; case gc.ROUTE_TURN_90D_R:this.turnRight90(); break; case gc.ROUTE_TURN_90D_L:this.turnLeft90(); break; case gc.ROUTE_TURN_180D:this.turn180(); break; case gc.ROUTE_TURN_90D_R_L:this.turnRightOrLeft90(); break; case gc.ROUTE_TURN_RANDOM:this.turnRandom(); break; case gc.ROUTE_TURN_TOWARD:this.turnTowardPlayer(); break; case gc.ROUTE_TURN_AWAY:this.turnAwayFromPlayer(); break; case gc.ROUTE_SWITCH_ON:$gameSwitches.setValue(params[0],true); break; case gc.ROUTE_SWITCH_OFF:$gameSwitches.setValue(params[0],false); break; case gc.ROUTE_CHANGE_SPEED:this.setMoveSpeed(params[0]); break; case gc.ROUTE_CHANGE_FREQ:this.setMoveFrequency(params[0]); break; case gc.ROUTE_WALK_ANIME_ON:this.setWalkAnime(true); break; case gc.ROUTE_WALK_ANIME_OFF:this.setWalkAnime(false); break; case gc.ROUTE_STEP_ANIME_ON:this.setStepAnime(true); break; case gc.ROUTE_STEP_ANIME_OFF:this.setStepAnime(false); break; case gc.ROUTE_DIR_FIX_ON:this.setDirectionFix(true); break; case gc.ROUTE_DIR_FIX_OFF:this.setDirectionFix(false); break; case gc.ROUTE_THROUGH_ON:this.setThrough(true); break; case gc.ROUTE_THROUGH_OFF:this.setThrough(false); break; case gc.ROUTE_TRANSPARENT_ON:this.setTransparent(true); break; case gc.ROUTE_TRANSPARENT_OFF:this.setTransparent(false); break; case gc.ROUTE_CHANGE_IMAGE:this.setImage(params[0],params[1]); break; case gc.ROUTE_CHANGE_OPACITY:this.setOpacity(params[0]); break; case gc.ROUTE_CHANGE_BLEND_MODE:this.setBlendMode(params[0]); break; case gc.ROUTE_PLAY_SE:AudioManager.playSe(params[0]); break; case gc.ROUTE_SCRIPT:eval(params[0]); break } }; Game_Character.prototype.deltaXFrom=function(x) { return $gameMap.deltaX(this.x,x) }; Game_Character.prototype.deltaYFrom=function(y) { return $gameMap.deltaY(this.y,y) }; Game_Character.prototype.moveRandom=function() { var d=2+Math.randomInt(4)*2; if(this.canPass(this.x,this.y,d)) { this.moveStraight(d) } }; Game_Character.prototype.moveTowardCharacter=function(character) { var sx=this.deltaXFrom(character.x); var sy=this.deltaYFrom(character.y); if(Math.abs(sx)>Math.abs(sy)) { this.moveStraight(sx>0?4:6); if(!this.isMovementSucceeded()&&sy!==0) { this.moveStraight(sy>0?8:2) } } else if(sy!==0) { this.moveStraight(sy>0?8:2); if(!this.isMovementSucceeded()&&sx!==0) { this.moveStraight(sx>0?4:6) } } }; Game_Character.prototype.moveAwayFromCharacter=function(character) { var sx=this.deltaXFrom(character.x); var sy=this.deltaYFrom(character.y); if(Math.abs(sx)>Math.abs(sy)) { this.moveStraight(sx>0?6:4); if(!this.isMovementSucceeded()&&sy!==0) { this.moveStraight(sy>0?2:8) } } else if(sy!==0) { this.moveStraight(sy>0?2:8); if(!this.isMovementSucceeded()&&sx!==0) { this.moveStraight(sx>0?6:4) } } }; Game_Character.prototype.turnTowardCharacter=function(character) { var sx=this.deltaXFrom(character.x); var sy=this.deltaYFrom(character.y); if(Math.abs(sx)>Math.abs(sy)) { this.setDirection(sx>0?4:6) } else if(sy!==0) { this.setDirection(sy>0?8:2) } }; Game_Character.prototype.turnAwayFromCharacter=function(character) { var sx=this.deltaXFrom(character.x); var sy=this.deltaYFrom(character.y); if(Math.abs(sx)>Math.abs(sy)) { this.setDirection(sx>0?6:4) } else if(sy!==0) { this.setDirection(sy>0?2:8) } }; Game_Character.prototype.turnTowardPlayer=function() { this.turnTowardCharacter($gamePlayer) }; Game_Character.prototype.turnAwayFromPlayer=function() { this.turnAwayFromCharacter($gamePlayer) }; Game_Character.prototype.moveTowardPlayer=function() { this.moveTowardCharacter($gamePlayer) }; Game_Character.prototype.moveAwayFromPlayer=function() { this.moveAwayFromCharacter($gamePlayer) }; Game_Character.prototype.moveForward=function() { this.moveStraight(this.direction()) }; Game_Character.prototype.moveBackward=function() { var lastDirectionFix=this.isDirectionFixed(); this.setDirectionFix(true); this.moveStraight(this.reverseDir(this.direction())); this.setDirectionFix(lastDirectionFix) }; Game_Character.prototype.processRouteEnd=function() { if(this._moveRoute.repeat) { this._moveRouteIndex=-1 } else if(this._moveRouteForcing) { this._moveRouteForcing=false; this.restoreMoveRoute() } }; Game_Character.prototype.advanceMoveRouteIndex=function() { var moveRoute=this._moveRoute; if(moveRoute&&(this.isMovementSucceeded()||moveRoute.skippable)) { var numCommands=moveRoute.list.length-1; this._moveRouteIndex++; if(moveRoute.repeat&&this._moveRouteIndex>=numCommands) { this._moveRouteIndex=0 } } }; Game_Character.prototype.turnRight90=function() { switch(this.direction()) { case 2:this.setDirection(4); break; case 4:this.setDirection(8); break; case 6:this.setDirection(2); break; case 8:this.setDirection(6); break } }; Game_Character.prototype.turnLeft90=function() { switch(this.direction()) { case 2:this.setDirection(6); break; case 4:this.setDirection(2); break; case 6:this.setDirection(8); break; case 8:this.setDirection(4); break } }; Game_Character.prototype.turn180=function() { this.setDirection(this.reverseDir(this.direction())) }; Game_Character.prototype.turnRightOrLeft90=function() { switch(Math.randomInt(2)) { case 0:this.turnRight90(); break; case 1:this.turnLeft90(); break } }; Game_Character.prototype.turnRandom=function() { this.setDirection(2+Math.randomInt(4)*2) }; Game_Character.prototype.swap=function(character) { var newX=character.x; var newY=character.y; character.locate(this.x,this.y); this.locate(newX,newY) }; Game_Character.prototype.findDirectionTo=function(goalX,goalY) { var searchLimit=this.searchLimit(); var mapWidth=$gameMap.width(); var nodeList=[]; var openList=[]; var closedList=[]; var start= { }; var best=start; if(this.x===goalX&&this.y===goalY) { return 0 } start.parent=null; start.x=this.x; start.y=this.y; start.g=0; start.f=$gameMap.distance(start.x,start.y,goalX,goalY); nodeList.push(start); openList.push(start.y*mapWidth+start.x); while(nodeList.length>0) { var bestIndex=0; for(var i=0; i<nodeList.length; i++) { if(nodeList[i].f<nodeList[bestIndex].f) { bestIndex=i } } var current=nodeList[bestIndex]; var x1=current.x; var y1=current.y; var pos1=y1*mapWidth+x1; var g1=current.g; nodeList.splice(bestIndex,1); openList.splice(openList.indexOf(pos1),1); closedList.push(pos1); if(current.x===goalX&¤t.y===goalY) { best=current; goaled=true; break } if(g1>=searchLimit) { continue } for(var j=0; j<4; j++) { var direction=2+j*2; var x2=$gameMap.roundXWithDirection(x1,direction); var y2=$gameMap.roundYWithDirection(y1,direction); var pos2=y2*mapWidth+x2; if(closedList.contains(pos2)) { continue } if(!this.canPass(x1,y1,direction)) { continue } var g2=g1+1; var index2=openList.indexOf(pos2); if(index2<0||g2<nodeList[index2].g) { var neighbor; if(index2>=0) { neighbor=nodeList[index2] } else { neighbor= { }; nodeList.push(neighbor); openList.push(pos2) } neighbor.parent=current; neighbor.x=x2; neighbor.y=y2; neighbor.g=g2; neighbor.f=g2+$gameMap.distance(x2,y2,goalX,goalY); if(!best||neighbor.f-neighbor.g<best.f-best.g) { best=neighbor } } } } var node=best; while(node.parent&&node.parent!==start) { node=node.parent } var deltaX1=$gameMap.deltaX(node.x,start.x); var deltaY1=$gameMap.deltaY(node.y,start.y); if(deltaY1>0) { return 2 } else if(deltaX1<0) { return 4 } else if(deltaX1>0) { return 6 } else if(deltaY1<0) { return 8 } var deltaX2=this.deltaXFrom(goalX); var deltaY2=this.deltaYFrom(goalY); if(Math.abs(deltaX2)>Math.abs(deltaY2)) { return deltaX2>0?4:6 } else if(deltaY2!==0) { return deltaY2>0?8:2 } return 0 }; Game_Character.prototype.searchLimit=function() { return 12 }; function Game_Player() { this.initialize.apply(this,arguments) } Game_Player.prototype=Object.create(Game_Character.prototype); Game_Player.prototype.constructor=Game_Player; Game_Player.prototype.initialize=function() { Game_Character.prototype.initialize.call(this); this.setTransparent($dataSystem.optTransparent) }; Game_Player.prototype.initMembers=function() { Game_Character.prototype.initMembers.call(this); this._vehicleType='walk'; this._vehicleGettingOn=false; this._vehicleGettingOff=false; this._dashing=false; this._needsMapReload=false; this._transferring=false; this._newMapId=0; this._newX=0; this._newY=0; this._newDirection=0; this._fadeType=0; this._followers=new Game_Followers(); this._encounterCount=0 }; Game_Player.prototype.clearTransferInfo=function() { this._transferring=false; this._newMapId=0; this._newX=0; this._newY=0; this._newDirection=0 }; Game_Player.prototype.followers=function() { return this._followers }; Game_Player.prototype.refresh=function() { var actor=$gameParty.leader(); var characterName=actor?actor.characterName():''; var characterIndex=actor?actor.characterIndex():0; this.setImage(characterName,characterIndex); this._followers.refresh() }; Game_Player.prototype.isStopping=function() { if(this._vehicleGettingOn||this._vehicleGettingOff) { return false } return Game_Character.prototype.isStopping.call(this) }; Game_Player.prototype.reserveTransfer=function(mapId,x,y,d,fadeType) { this._transferring=true; this._newMapId=mapId; this._newX=x; this._newY=y; this._newDirection=d; this._fadeType=fadeType }; Game_Player.prototype.requestMapReload=function() { this._needsMapReload=true }; Game_Player.prototype.isTransferring=function() { return this._transferring }; Game_Player.prototype.newMapId=function() { return this._newMapId }; Game_Player.prototype.fadeType=function() { return this._fadeType }; Game_Player.prototype.performTransfer=function() { if(this.isTransferring()) { this.setDirection(this._newDirection); if(this._newMapId!==$gameMap.mapId()||this._needsMapReload) { $gameMap.setup(this._newMapId); this._needsMapReload=false } this.locate(this._newX,this._newY); this.refresh(); this.clearTransferInfo() } }; Game_Player.prototype.isMapPassable=function(x,y,d) { var vehicle=this.vehicle(); if(vehicle) { return vehicle.isMapPassable(x,y,d) } else { return Game_Character.prototype.isMapPassable.call(this,x,y,d) } }; Game_Player.prototype.vehicle=function() { return $gameMap.vehicle(this._vehicleType) }; Game_Player.prototype.isInBoat=function() { return this._vehicleType==='boat' }; Game_Player.prototype.isInShip=function() { return this._vehicleType==='ship' }; Game_Player.prototype.isInAirship=function() { return this._vehicleType==='airship' }; Game_Player.prototype.isInVehicle=function() { return this.isInBoat()||this.isInShip()||this.isInAirship() }; Game_Player.prototype.isNormal=function() { return this._vehicleType==='walk'&&!this.isMoveRouteForcing() }; Game_Player.prototype.isDashing=function() { return this._dashing }; Game_Player.prototype.isDebugThrough=function() { return Input.isPressed('control')&&$gameTemp.isPlaytest() }; Game_Player.prototype.isCollided=function(x,y) { if(this.isThrough()) { return false } else { return this.pos(x,y)||this._followers.isSomeoneCollided(x,y) } }; Game_Player.prototype.centerX=function() { return(Graphics.width/$gameMap.tileWidth()-1)/2.0 }; Game_Player.prototype.centerY=function() { return(Graphics.height/$gameMap.tileHeight()-1)/2.0 }; Game_Player.prototype.center=function(x,y) { return $gameMap.setDisplayPos(x-this.centerX(),y-this.centerY()) }; Game_Player.prototype.locate=function(x,y) { Game_Character.prototype.locate.call(this,x,y); this.center(x,y); this.makeEncounterCount(); if(this.isInVehicle()) { this.vehicle().refresh() } this._followers.synchronize(x,y,this.direction()) }; Game_Player.prototype.increaseSteps=function() { Game_Character.prototype.increaseSteps.call(this); if(this.isNormal()) { $gameParty.increaseSteps() } }; Game_Player.prototype.makeEncounterCount=function() { var n=$gameMap.encounterStep(); this._encounterCount=Math.randomInt(n)+Math.randomInt(n)+1 }; Game_Player.prototype.makeEncounterTroopId=function() { var encounterList=[]; var weightSum=0; $gameMap.encounterList().forEach(function(encounter) { if(this.meetsEncounterConditions(encounter)) { encounterList.push(encounter); weightSum+=encounter.weight } } ,this); if(weightSum>0) { var value=Math.randomInt(weightSum); for(var i=0; i<encounterList.length; i++) { value-=encounterList[i].weight; if(value<0) { return encounterList[i].troopId } } } return 0 }; Game_Player.prototype.meetsEncounterConditions=function(encounter) { return(encounter.regionSet.length===0||encounter.regionSet.contains(this.regionId())) }; Game_Player.prototype.executeEncounter=function() { if(!$gameMap.isEventRunning()&&this._encounterCount<=0) { this.makeEncounterCount(); var troopId=this.makeEncounterTroopId(); if($dataTroops[troopId]) { BattleManager.setup(troopId,true,false); BattleManager.onEncounter(); return true } else { return false } } else { return false } }; Game_Player.prototype.startMapEvent=function(x,y,triggers,normal) { if(!$gameMap.isEventRunning()) { $gameMap.eventsXy(x,y).forEach(function(event) { if(event.isTriggerIn(triggers)&&event.isNormalPriority()===normal) { event.start() } } ) } }; Game_Player.prototype.moveByInput=function() { if(!this.isMoving()&&this.canMove()) { var direction=this.getInputDirection(); if(direction>0) { $gameTemp.clearDestination() } else if($gameTemp.isDestinationValid()) { var x=$gameTemp.destinationX(); var y=$gameTemp.destinationY(); direction=this.findDirectionTo(x,y) } if(direction>0) { this.executeMove(direction) } } }; Game_Player.prototype.canMove=function() { if($gameMap.isEventRunning()||$gameMessage.isBusy()) { return false } if(this.isMoveRouteForcing()||this.areFollowersGathering()) { return false } if(this._vehicleGettingOn||this._vehicleGettingOff) { return false } if(this.isInVehicle()&&!this.vehicle().canMove()) { return false } return true }; Game_Player.prototype.getInputDirection=function() { return Input.dir4 }; Game_Player.prototype.executeMove=function(direction) { this.moveStraight(direction) }; Game_Player.prototype.update=function(sceneActive) { var lastScrolledX=this.scrolledX(); var lastScrolledY=this.scrolledY(); var wasMoving=this.isMoving(); this.updateDashing(); if(sceneActive) { this.moveByInput() } Game_Character.prototype.update.call(this); this.updateScroll(lastScrolledX,lastScrolledY); this.updateVehicle(); if(!this.isMoving()) { this.updateNonmoving(wasMoving) } this._followers.update() }; Game_Player.prototype.updateDashing=function() { if(this.isMoving()) { return } if(this.canMove()&&!this.isInVehicle()&&!$gameMap.isDashDisabled()) { this._dashing=this.isDashButtonPressed()||$gameTemp.isDestinationValid() } else { this._dashing=false } }; Game_Player.prototype.isDashButtonPressed=function() { var shift=Input.isPressed('shift'); if(ConfigManager.alwaysDash) { return!shift } else { return shift } }; Game_Player.prototype.updateScroll=function(lastScrolledX,lastScrolledY) { var x1=lastScrolledX; var y1=lastScrolledY; var x2=this.scrolledX(); var y2=this.scrolledY(); if(y2>y1&&y2>this.centerY()) { $gameMap.scrollDown(y2-y1) } if(x2<x1&&x2<this.centerX()) { $gameMap.scrollLeft(x1-x2) } if(x2>x1&&x2>this.centerX()) { $gameMap.scrollRight(x2-x1) } if(y2<y1&&y2<this.centerY()) { $gameMap.scrollUp(y1-y2) } }; Game_Player.prototype.updateVehicle=function() { if(this.isInVehicle()&&!this.areFollowersGathering()) { if(this._vehicleGettingOn) { this.updateVehicleGetOn() } else if(this._vehicleGettingOff) { this.updateVehicleGetOff() } else { this.vehicle().syncWithPlayer() } } }; Game_Player.prototype.updateVehicleGetOn=function() { if(!this.areFollowersGathering()&&!this.isMoving()) { this.setDirection(this.vehicle().direction()); this.setMoveSpeed(this.vehicle().moveSpeed()); this._vehicleGettingOn=false; this.setTransparent(true); if(this.isInAirship()) { this.setThrough(true) } this.vehicle().getOn() } }; Game_Player.prototype.updateVehicleGetOff=function() { if(!this.areFollowersGathering()&&this.vehicle().isLowest()) { this._vehicleGettingOff=false; this._vehicleType='walk'; this.setTransparent(false) } }; Game_Player.prototype.updateNonmoving=function(wasMoving) { if(!$gameMap.isEventRunning()) { if(wasMoving) { $gameParty.onPlayerWalk(); this.checkEventTriggerHere([1,2]); if($gameMap.setupStartingEvent()) { return } } if(this.triggerAction()) { return } if(wasMoving) { this.updateEncounterCount() } else { $gameTemp.clearDestination() } } }; Game_Player.prototype.triggerAction=function() { if(this.canMove()) { if(this.triggerButtonAction()) { return true } if(this.triggerTouchAction()) { return true } } return false }; Game_Player.prototype.triggerButtonAction=function() { if(Input.isTriggered('ok')) { if(this.getOnOffVehicle()) { return true } this.checkEventTriggerHere([0]); if($gameMap.setupStartingEvent()) { return true } this.checkEventTriggerThere([0,1,2]); if($gameMap.setupStartingEvent()) { return true } } return false }; Game_Player.prototype.triggerTouchAction=function() { if($gameTemp.isDestinationValid()) { var direction=this.direction(); var x1=this.x; var y1=this.y; var x2=$gameMap.roundXWithDirection(x1,direction); var y2=$gameMap.roundYWithDirection(y1,direction); var =$gameMap.roundXWithDirection(x2,direction); var y3=$gameMap.roundYWithDirection(y2,direction); var destX=$gameTemp.destinationX(); var destY=$gameTemp.destinationY(); if(destX===x1&&destY===y1) { return this.triggerTouchActionD1(x1,y1) } else if(destX===x2&&destY===y2) { return this.triggerTouchActionD2(x2,y2) } else if(destX===&&destY===y3) { return this.triggerTouchActionD3(x2,y2) } } return false }; Game_Player.prototype.triggerTouchActionD1=function(x1,y1) { if($gameMap.airship().pos(x1,y1)) { if(TouchInput.isTriggered()&&this.getOnOffVehicle()) { return true } } this.checkEventTriggerHere([0]); return $gameMap.setupStartingEvent() }; Game_Player.prototype.triggerTouchActionD2=function(x2,y2) { if($gameMap.boat().pos(x2,y2)||$gameMap.ship().pos(x2,y2)) { if(TouchInput.isTriggered()&&this.getOnVehicle()) { return true } } if(this.isInBoat()||this.isInShip()) { if(TouchInput.isTriggered()&&this.getOffVehicle()) { return true } } this.checkEventTriggerThere([0,1,2]); return $gameMap.setupStartingEvent() }; Game_Player.prototype.triggerTouchActionD3=function(x2,y2) { if($gameMap.isCounter(x2,y2)) { this.checkEventTriggerThere([0,1,2]) } return $gameMap.setupStartingEvent() }; Game_Player.prototype.updateEncounterCount=function() { if(this.canEncounter()) { this._encounterCount-=this.encounterProgressValue() } }; Game_Player.prototype.canEncounter=function() { return(!$gameParty.hasEncounterNone()&&$gameSystem.isEncounterEnabled()&&!this.isInAirship()&&!this.isMoveRouteForcing()&&!this.isDebugThrough()) }; Game_Player.prototype.encounterProgressValue=function() { var value=$gameMap.isBush(this.x,this.y)?2:1; if($gameParty.hasEncounterHalf()) { value*=0.5 } if(this.isInShip()) { value*=0.5 } return value }; Game_Player.prototype.checkEventTriggerHere=function(triggers) { if(this.canStartLocalEvents()) { this.startMapEvent(this.x,this.y,triggers,false) } }; Game_Player.prototype.checkEventTriggerThere=function(triggers) { if(this.canStartLocalEvents()) { var direction=this.direction(); var x1=this.x; var y1=this.y; var x2=$gameMap.roundXWithDirection(x1,direction); var y2=$gameMap.roundYWithDirection(y1,direction); this.startMapEvent(x2,y2,triggers,true); if(!$gameMap.isAnyEventStarting()&&$gameMap.isCounter(x2,y2)) { var =$gameMap.roundXWithDirection(x2,direction); var y3=$gameMap.roundYWithDirection(y2,direction); this.startMapEvent(,y3,triggers,true) } } }; Game_Player.prototype.checkEventTriggerTouch=function(x,y) { if(this.canStartLocalEvents()) { this.startMapEvent(x,y,[1,2],true) } }; Game_Player.prototype.canStartLocalEvents=function() { return!this.isInAirship() }; Game_Player.prototype.getOnOffVehicle=function() { if(this.isInVehicle()) { return this.getOffVehicle() } else { return this.getOnVehicle() } }; Game_Player.prototype.getOnVehicle=function() { var direction=this.direction(); var x1=this.x; var y1=this.y; var x2=$gameMap.roundXWithDirection(x1,direction); var y2=$gameMap.roundYWithDirection(y1,direction); if($gameMap.airship().pos(x1,y1)) { this._vehicleType='airship' } else if($gameMap.ship().pos(x2,y2)) { this._vehicleType='ship' } else if($gameMap.boat().pos(x2,y2)) { this._vehicleType='boat' } if(this.isInVehicle()) { this._vehicleGettingOn=true; if(!this.isInAirship()) { this.forceMoveForward() } this.gatherFollowers() } return this._vehicleGettingOn }; Game_Player.prototype.getOffVehicle=function() { if(this.vehicle().isLandOk(this.x,this.y,this.direction())) { if(this.isInAirship()) { this.setDirection(2) } this._followers.synchronize(this.x,this.y,this.direction()); this.vehicle().getOff(); if(!this.isInAirship()) { this.forceMoveForward(); this.setTransparent(false) } this._vehicleGettingOff=true; this.setMoveSpeed(4); this.setThrough(false); this.makeEncounterCount(); this.gatherFollowers() } return this._vehicleGettingOff }; Game_Player.prototype.forceMoveForward=function() { this.setThrough(true); this.moveForward(); this.setThrough(false) }; Game_Player.prototype.isOnDamageFloor=function() { return $gameMap.isDamageFloor(this.x,this.y)&&!this.isInAirship() }; Game_Player.prototype.moveStraight=function(d) { if(this.canPass(this.x,this.y,d)) { this._followers.updateMove() } Game_Character.prototype.moveStraight.call(this,d) }; Game_Player.prototype.moveDiagonally=function(horz,vert) { if(this.canPassDiagonally(this.x,this.y,horz,vert)) { this._followers.updateMove() } Game_Character.prototype.moveDiagonally.call(this,horz,vert) }; Game_Player.prototype.jump=function(xPlus,yPlus) { Game_Character.prototype.jump.call(this,xPlus,yPlus); this._followers.jumpAll() }; Game_Player.prototype.showFollowers=function() { this._followers.show() }; Game_Player.prototype.hideFollowers=function() { this._followers.hide() }; Game_Player.prototype.gatherFollowers=function() { this._followers.gather() }; Game_Player.prototype.areFollowersGathering=function() { return this._followers.areGathering() }; Game_Player.prototype.areFollowersGathered=function() { return this._followers.areGathered() }; function Game_Follower() { this.initialize.apply(this,arguments) } Game_Follower.prototype=Object.create(Game_Character.prototype); Game_Follower.prototype.constructor=Game_Follower; Game_Follower.prototype.initialize=function(memberIndex) { Game_Character.prototype.initialize.call(this); this._memberIndex=memberIndex; this.setTransparent($dataSystem.optTransparent); this.setThrough(true) }; Game_Follower.prototype.refresh=function() { var characterName=this.isVisible()?this.actor().characterName():''; var characterIndex=this.isVisible()?this.actor().characterIndex():0; this.setImage(characterName,characterIndex) }; Game_Follower.prototype.actor=function() { return $gameParty.battleMembers()[this._memberIndex] }; Game_Follower.prototype.isVisible=function() { return this.actor()&&$gamePlayer.followers().isVisible() }; Game_Follower.prototype.update=function() { Game_Character.prototype.update.call(this); this.setMoveSpeed($gamePlayer.realMoveSpeed()); this.setOpacity($gamePlayer.opacity()); this.setBlendMode($gamePlayer.blendMode()); this.setWalkAnime($gamePlayer.hasWalkAnime()); this.setStepAnime($gamePlayer.hasStepAnime()); this.setDirectionFix($gamePlayer.isDirectionFixed()); this.setTransparent($gamePlayer.isTransparent()) }; Game_Follower.prototype.chaseCharacter=function(character) { var sx=this.deltaXFrom(character.x); var sy=this.deltaYFrom(character.y); if(sx!==0&&sy!==0) { this.moveDiagonally(sx>0?4:6,sy>0?8:2) } else if(sx!==0) { this.moveStraight(sx>0?4:6) } else if(sy!==0) { this.moveStraight(sy>0?8:2) } this.setMoveSpeed($gamePlayer.realMoveSpeed()) }; function Game_Followers() { this.initialize.apply(this,arguments) } Game_Followers.prototype.initialize=function() { this._visible=$dataSystem.optFollowers; this._gathering=false; this._data=[]; for(var i=1; i<$gameParty.maxBattleMembers(); i++) { this._data.push(new Game_Follower(i)) } }; Game_Followers.prototype.isVisible=function() { return this._visible }; Game_Followers.prototype.show=function() { this._visible=true }; Game_Followers.prototype.hide=function() { this._visible=false }; Game_Followers.prototype.follower=function(index) { return this._data[index] }; Game_Followers.prototype.forEach=function(callback,thisObject) { this._data.forEach(callback,thisObject) }; Game_Followers.prototype.reverseEach=function(callback,thisObject) { this._data.reverse(); this._data.forEach(callback,thisObject); this._data.reverse() }; Game_Followers.prototype.refresh=function() { this.forEach(function(follower) { return follower.refresh() } ,this) }; Game_Followers.prototype.update=function() { if(this.areGathering()) { if(!this.areMoving()) { this.updateMove() } if(this.areGathered()) { this._gathering=false } } this.forEach(function(follower) { follower.update() } ,this) }; Game_Followers.prototype.updateMove=function() { for(var i=this._data.length-1; i>=0; i--) { var precedingCharacter=(i>0?this._data[i-1]:$gamePlayer); this._data[i].chaseCharacter(precedingCharacter) } }; Game_Followers.prototype.jumpAll=function() { if($gamePlayer.isJumping()) { for(var i=0; i<this._data.length; i++) { var follower=this._data[i]; var sx=$gamePlayer.deltaXFrom(follower.x); var sy=$gamePlayer.deltaYFrom(follower.y); follower.jump(sx,sy) } } }; Game_Followers.prototype.synchronize=function(x,y,d) { this.forEach(function(follower) { follower.locate(x,y); follower.setDirection(d) } ,this) }; Game_Followers.prototype.gather=function() { this._gathering=true }; Game_Followers.prototype.areGathering=function() { return this._gathering }; Game_Followers.prototype.visibleFollowers=function() { return this._data.filter(function(follower) { return follower.isVisible() } ,this) }; Game_Followers.prototype.areMoving=function() { return this.visibleFollowers().some(function(follower) { return follower.isMoving() } ,this) }; Game_Followers.prototype.areGathered=function() { return this.visibleFollowers().every(function(follower) { return!follower.isMoving()&&follower.pos($gamePlayer.x,$gamePlayer.y) } ,this) }; Game_Followers.prototype.isSomeoneCollided=function(x,y) { return this.visibleFollowers().some(function(follower) { return follower.pos(x,y) } ,this) }; function Game_Vehicle() { this.initialize.apply(this,arguments) } Game_Vehicle.prototype=Object.create(Game_Character.prototype); Game_Vehicle.prototype.constructor=Game_Vehicle; Game_Vehicle.prototype.initialize=function(type) { Game_Character.prototype.initialize.call(this); this._type=type; this.resetDirection(); this.initMoveSpeed(); this.loadSystemSettings() }; Game_Vehicle.prototype.initMembers=function() { Game_Character.prototype.initMembers.call(this); this._type=''; this._mapId=0; this._altitude=0; this._driving=false; this._bgm=null }; Game_Vehicle.prototype.isBoat=function() { return this._type==='boat' }; Game_Vehicle.prototype.isShip=function() { return this._type==='ship' }; Game_Vehicle.prototype.isAirship=function() { return this._type==='airship' }; Game_Vehicle.prototype.resetDirection=function() { this.setDirection(4) }; Game_Vehicle.prototype.initMoveSpeed=function() { if(this.isBoat()) { this.setMoveSpeed(4) } else if(this.isShip()) { this.setMoveSpeed(5) } else if(this.isAirship()) { this.setMoveSpeed(6) } }; Game_Vehicle.prototype.vehicle=function() { if(this.isBoat()) { return $dataSystem.boat } else if(this.isShip()) { return $dataSystem.ship } else if(this.isAirship()) { return $dataSystem.airship } else { return null } }; Game_Vehicle.prototype.loadSystemSettings=function() { var vehicle=this.vehicle(); this._mapId=vehicle.startMapId; this.setPosition(vehicle.startX,vehicle.startY); this.setImage(vehicle.characterName,vehicle.characterIndex) }; Game_Vehicle.prototype.refresh=function() { if(this._driving) { this._mapId=$gameMap.mapId(); this.syncWithPlayer() } else if(this._mapId===$gameMap.mapId()) { this.locate(this.x,this.y) } if(this.isAirship()) { this.setPriorityType(this._driving?2:0) } else { this.setPriorityType(1) } this.setWalkAnime(this._driving); this.setStepAnime(this._driving); this.setTransparent(this._mapId!==$gameMap.mapId()) }; Game_Vehicle.prototype.setLocation=function(mapId,x,y) { this._mapId=mapId; this.setPosition(x,y); this.refresh() }; Game_Vehicle.prototype.pos=function(x,y) { if(this._mapId===$gameMap.mapId()) { return Game_Character.prototype.pos.call(this,x,y) } else { return false } }; Game_Vehicle.prototype.isMapPassable=function(x,y,d) { var x2=$gameMap.roundXWithDirection(x,d); var y2=$gameMap.roundYWithDirection(y,d); if(this.isBoat()) { return $gameMap.isBoatPassable(x2,y2) } else if(this.isShip()) { return $gameMap.isShipPassable(x2,y2) } else if(this.isAirship()) { return true } else { return false } }; Game_Vehicle.prototype.getOn=function() { this._driving=true; this.setWalkAnime(true); this.setStepAnime(true); $gameSystem.saveWalkingBgm(); this.playBgm() }; Game_Vehicle.prototype.getOff=function() { this._driving=false; this.setWalkAnime(false); this.setStepAnime(false); this.resetDirection(); $gameSystem.replayWalkingBgm() }; Game_Vehicle.prototype.setBgm=function(bgm) { this._bgm=bgm }; Game_Vehicle.prototype.playBgm=function() { AudioManager.playBgm(this._bgm||this.vehicle().bgm) }; Game_Vehicle.prototype.syncWithPlayer=function() { this.copyPosition($gamePlayer); this.refreshBushDepth() }; Game_Vehicle.prototype.screenY=function() { return Game_Character.prototype.screenY.call(this)-this._altitude }; Game_Vehicle.prototype.shadowX=function() { return this.screenX() }; Game_Vehicle.prototype.shadowY=function() { return this.screenY()+this._altitude }; Game_Vehicle.prototype.shadowOpacity=function() { return 255*this._altitude/this.maxAltitude() }; Game_Vehicle.prototype.canMove=function() { if(this.isAirship()) { return this.isHighest() } else { return true } }; Game_Vehicle.prototype.update=function() { Game_Character.prototype.update.call(this); if(this.isAirship()) { this.updateAirship() } }; Game_Vehicle.prototype.updateAirship=function() { this.updateAirshipAltitude(); this.setStepAnime(this.isHighest()); this.setPriorityType(this.isLowest()?0:2) }; Game_Vehicle.prototype.updateAirshipAltitude=function() { if(this._driving&&!this.isHighest()) { this._altitude++ } if(!this._driving&&!this.isLowest()) { this._altitude-- } }; Game_Vehicle.prototype.maxAltitude=function() { return 48 }; Game_Vehicle.prototype.isLowest=function() { return this._altitude<=0 }; Game_Vehicle.prototype.isHighest=function() { return this._altitude>=this.maxAltitude() }; Game_Vehicle.prototype.isTakeoffOk=function() { return $gamePlayer.areFollowersGathered() }; Game_Vehicle.prototype.isLandOk=function(x,y,d) { if(this.isAirship()) { if(!$gameMap.isAirshipLandOk(x,y)) { return false } if($gameMap.eventsXy(x,y).length>0) { return false } } else { var x2=$gameMap.roundXWithDirection(x,d); var y2=$gameMap.roundYWithDirection(y,d); if(!$gameMap.isValid(x2,y2)) { return false } if(!$gameMap.isPassable(x2,y2,this.reverseDir(d))) { return false } if(this.isCollidedWithCharacters(x2,y2)) { return false } } return true }; function Game_Event() { this.initialize.apply(this,arguments) } Game_Event.prototype=Object.create(Game_Character.prototype); Game_Event.prototype.constructor=Game_Event; Game_Event.prototype.initialize=function(mapId,eventId) { Game_Character.prototype.initialize.call(this); this._mapId=mapId; this._eventId=eventId; this.locate(this.event().x,this.event().y); this.refresh() }; Game_Event.prototype.initMembers=function() { Game_Character.prototype.initMembers.call(this); this._moveType=0; this._trigger=0; this._starting=false; this._erased=false; this._pageIndex=-2; this._originalPattern=1; this._originalDirection=2; this._prelockDirection=0; this._locked=false }; Game_Event.prototype.eventId=function() { return this._eventId }; Game_Event.prototype.event=function() { return $dataMap.events[this._eventId] }; Game_Event.prototype.page=function() { return this.event().pages[this._pageIndex] }; Game_Event.prototype.list=function() { return this.page().list }; Game_Event.prototype.isCollidedWithCharacters=function(x,y) { return(Game_Character.prototype.isCollidedWithCharacters.call(this,x,y)||this.isCollidedWithPlayerCharacters(x,y)) }; Game_Event.prototype.isCollidedWithEvents=function(x,y) { var events=$gameMap.eventsXyNt(x,y); return events.length>0 }; Game_Event.prototype.isCollidedWithPlayerCharacters=function(x,y) { return this.isNormalPriority()&&$gamePlayer.isCollided(x,y) }; Game_Event.prototype.lock=function() { if(!this._locked) { this._prelockDirection=this.direction(); this.turnTowardPlayer(); this._locked=true } }; Game_Event.prototype.unlock=function() { if(this._locked) { this._locked=false; this.setDirection(this._prelockDirection) } }; Game_Event.prototype.updateStop=function() { if(this._locked) { this.resetStopCount() } Game_Character.prototype.updateStop.call(this); if(!this.isMoveRouteForcing()) { this.updateSelfMovement() } }; Game_Event.prototype.updateSelfMovement=function() { if(this.isNearTheScreen()&&this.checkStop(this.stopCountThreshold())) { switch(this._moveType) { case 1:this.moveTypeRandom(); break; case 2:this.moveTypeTowardPlayer(); break; case 3:this.moveTypeCustom(); break } } }; Game_Event.prototype.stopCountThreshold=function() { return 30*(5-this.moveFrequency()) }; Game_Event.prototype.moveTypeRandom=function() { switch(Math.randomInt(6)) { case 0:case 1:this.moveRandom(); break; case 2:case 3:case 4:this.moveForward(); break; case 5:this.resetStopCount(); break } }; Game_Event.prototype.moveTypeTowardPlayer=function() { if(this.isNearThePlayer()) { switch(Math.randomInt(6)) { case 0:case 1:case 2:case 3:this.moveTowardPlayer(); break; case 4:this.moveRandom(); break; case 5:this.moveForward(); break } } else { this.moveRandom() } }; Game_Event.prototype.isNearThePlayer=function() { var sx=Math.abs(this.deltaXFrom($gamePlayer.x)); var sy=Math.abs(this.deltaYFrom($gamePlayer.y)); return sx+sy<20 }; Game_Event.prototype.moveTypeCustom=function() { this.updateRoutineMove() }; Game_Event.prototype.isStarting=function() { return this._starting }; Game_Event.prototype.clearStartingFlag=function() { this._starting=false }; Game_Event.prototype.isTriggerIn=function(triggers) { return triggers.contains(this._trigger) }; Game_Event.prototype.start=function() { var list=this.list(); if(list&&list.length>1) { this._starting=true; if(this.isTriggerIn([0,1,2])) { this.lock() } } }; Game_Event.prototype.erase=function() { this._erased=true; this.refresh() }; Game_Event.prototype.refresh=function() { var newPageIndex=this._erased?-1:this.findProperPageIndex(); if(this._pageIndex!==newPageIndex) { this._pageIndex=newPageIndex; this.setupPage() } }; Game_Event.prototype.findProperPageIndex=function() { var pages=this.event().pages; for(var i=pages.length-1; i>=0; i--) { var page=pages[i]; if(this.meetsConditions(page)) { return i } } return-1 }; Game_Event.prototype.meetsConditions=function(page) { var c=page.conditions; if(c.switch1Valid) { if(!$gameSwitches.value(c.switch1Id)) { return false } } if(c.switch2Valid) { if(!$gameSwitches.value(c.switch2Id)) { return false } } if(c.variableValid) { if($gameVariables.value(c.variableId)<c.variableValue) { return false } } if(c.selfSwitchValid) { var key=[this._mapId,this._eventId,c.selfSwitchCh]; if($gameSelfSwitches.value(key)!==true) { return false } } if(c.itemValid) { var item=$dataItems[c.itemId]; if(!$gameParty.hasItem(item)) { return false } } if(c.actorValid) { var actor=$gameActors.actor(c.actorId); if(!$gameParty.members().contains(actor)) { return false } } return true }; Game_Event.prototype.setupPage=function() { if(this._pageIndex>=0) { this.setupPageSettings() } else { this.clearPageSettings() } this.refreshBushDepth(); this.clearStartingFlag(); this.checkEventTriggerAuto() }; Game_Event.prototype.clearPageSettings=function() { this.setImage('',0); this._moveType=0; this._trigger=null; this._interpreter=null; this.setThrough(true) }; Game_Event.prototype.setupPageSettings=function() { var page=this.page(); var image=page.image; if(image.tileId>0) { this.setTileImage(image.tileId) } else { this.setImage(image.characterName,image.characterIndex) } if(this._originalDirection!==image.direction) { this._originalDirection=image.direction; this._prelockDirection=0; this.setDirectionFix(false); this.setDirection(image.direction) } if(this._originalPattern!==image.pattern) { this._originalPattern=image.pattern; this.setPattern(image.pattern) } this.setMoveSpeed(page.moveSpeed); this.setMoveFrequency(page.moveFrequency); this.setPriorityType(page.priorityType); this.setWalkAnime(page.walkAnime); this.setStepAnime(page.stepAnime); this.setDirectionFix(page.directionFix); this.setThrough(page.through); this.setMoveRoute(page.moveRoute); this._moveType=page.moveType; this._trigger=page.trigger; if(this._trigger===4) { this._interpreter=new Game_Interpreter() } else { this._interpreter=null } }; Game_Event.prototype.isOriginalPattern=function() { return this.pattern()===this._originalPattern }; Game_Event.prototype.resetPattern=function() { this.setPattern(this._originalPattern) }; Game_Event.prototype.checkEventTriggerTouch=function(x,y) { if(!$gameMap.isEventRunning()) { if(this._trigger===2&&$gamePlayer.pos(x,y)) { if(!this.isJumping()&&this.isNormalPriority()) { this.start() } } } }; Game_Event.prototype.checkEventTriggerAuto=function() { if(this._trigger===3) { this.start() } }; Game_Event.prototype.update=function() { Game_Character.prototype.update.call(this); this.checkEventTriggerAuto(); this.updateParallel() }; Game_Event.prototype.updateParallel=function() { if(this._interpreter) { if(!this._interpreter.isRunning()) { this._interpreter.setup(this.list(),this._eventId) } this._interpreter.update() } }; Game_Event.prototype.locate=function(x,y) { Game_Character.prototype.locate.call(this,x,y); this._prelockDirection=0 }; Game_Event.prototype.forceMoveRoute=function(moveRoute) { Game_Character.prototype.forceMoveRoute.call(this,moveRoute); this._prelockDirection=0 }; function Game_Interpreter() { this.initialize.apply(this,arguments) } Game_Interpreter.prototype.initialize=function(depth) { this._depth=depth||0; this.checkOverflow(); this.clear(); this._branch= { }; this._params=[]; this._indent=0; this._frameCount=0; this._freezeChecker=0 }; Game_Interpreter.prototype.checkOverflow=function() { if(this._depth>=100) { throw new Error('Common event calls exceeded the limit') } }; Game_Interpreter.prototype.clear=function() { this._mapId=0; this._eventId=0; this._list=null; this._index=0; this._waitCount=0; this._waitMode=''; this._comments=''; this._character=null; this._childInterpreter=null }; Game_Interpreter.prototype.setup=function(list,eventId) { this.clear(); this._mapId=$gameMap.mapId(); this._eventId=eventId||0; this._list=list }; Game_Interpreter.prototype.eventId=function() { return this._eventId }; Game_Interpreter.prototype.isOnCurrentMap=function() { return this._mapId===$gameMap.mapId() }; Game_Interpreter.prototype.setupReservedCommonEvent=function() { if($gameTemp.isCommonEventReserved()) { this.setup($gameTemp.reservedCommonEvent().list); $gameTemp.clearCommonEvent(); return true } else { return false } }; Game_Interpreter.prototype.isRunning=function() { return!!this._list }; Game_Interpreter.prototype.update=function() { while(this.isRunning()) { if(this.updateChild()||this.updateWait()) { break } if(SceneManager.isSceneChanging()) { break } if(!this.executeCommand()) { break } if(this.checkFreeze()) { break } } }; Game_Interpreter.prototype.updateChild=function() { if(this._childInterpreter) { this._childInterpreter.update(); if(this._childInterpreter.isRunning()) { return true } else { this._childInterpreter=null } } return false }; Game_Interpreter.prototype.updateWait=function() { return this.updateWaitCount()||this.updateWaitMode() }; Game_Interpreter.prototype.updateWaitCount=function() { if(this._waitCount>0) { this._waitCount--; return true } return false }; Game_Interpreter.prototype.updateWaitMode=function() { var waiting=false; switch(this._waitMode) { case'message':waiting=$gameMessage.isBusy(); break; case'transfer':waiting=$gamePlayer.isTransferring(); break; case'scroll':waiting=$gameMap.isScrolling(); break; case'route':waiting=this._character.isMoveRouteForcing(); break; case'animation':waiting=this._character.isAnimationPlaying(); break; case'balloon':waiting=this._character.isBalloonPlaying(); break; case'gather':waiting=$gamePlayer.areFollowersGathering(); break; case'action':waiting=BattleManager.isActionForced(); break; case'video':waiting=Graphics.isVideoPlaying(); break; case'image':waiting=!ImageManager.isReady(); break } if(!waiting) { this._waitMode='' } return waiting }; Game_Interpreter.prototype.setWaitMode=function(waitMode) { this._waitMode=waitMode }; Game_Interpreter.prototype.wait=function(duration) { this._waitCount=duration }; Game_Interpreter.prototype.fadeSpeed=function() { return 24 }; Game_Interpreter.prototype.executeCommand=function() { var command=this.currentCommand(); if(command) { this._params=command.parameters; this._indent=command.indent; var methodName='command'+command.code; if(typeof this[methodName]==='function') { if(!this[methodName]()) { return false } } this._index++ } else { this.terminate() } return true }; Game_Interpreter.prototype.checkFreeze=function() { if(this._frameCount!==Graphics.frameCount) { this._frameCount=Graphics.frameCount; this._freezeChecker=0 } if(this._freezeChecker++>=100000) { return true } else { return false } }; Game_Interpreter.prototype.terminate=function() { this._list=null; this._comments='' }; Game_Interpreter.prototype.skipBranch=function() { while(this._list[this._index+1].indent>this._indent) { this._index++ } }; Game_Interpreter.prototype.currentCommand=function() { return this._list[this._index] }; Game_Interpreter.prototype.nextEventCode=function() { var command=this._list[this._index+1]; if(command) { return command.code } else { return 0 } }; Game_Interpreter.prototype.iterateActorId=function(param,callback) { if(param===0) { $gameParty.members().forEach(callback) } else { var actor=$gameActors.actor(param); if(actor) { callback(actor) } } }; Game_Interpreter.prototype.iterateActorEx=function(param1,param2,callback) { if(param1===0) { this.iterateActorId(param2,callback) } else { this.iterateActorId($gameVariables.value(param2),callback) } }; Game_Interpreter.prototype.iterateActorIndex=function(param,callback) { if(param<0) { $gameParty.members().forEach(callback) } else { var actor=$gameParty.members()[param]; if(actor) { callback(actor) } } }; Game_Interpreter.prototype.iterateEnemyIndex=function(param,callback) { if(param<0) { $gameTroop.members().forEach(callback) } else { var enemy=$gameTroop.members()[param]; if(enemy) { callback(enemy) } } }; Game_Interpreter.prototype.iterateBattler=function(param1,param2,callback) { if($gameParty.inBattle()) { if(param1===0) { this.iterateEnemyIndex(param2,callback) } else { this.iterateActorId(param2,callback) } } }; Game_Interpreter.prototype.character=function(param) { if($gameParty.inBattle()) { return null } else if(param<0) { return $gamePlayer } else if(this.isOnCurrentMap()) { return $gameMap.event(param>0?param:this._eventId) } else { return null } }; Game_Interpreter.prototype.operateValue=function(operation,operandType,operand) { var value=operandType===0?operand:$gameVariables.value(operand); return operation===0?value:-value }; Game_Interpreter.prototype.changeHp=function(target,value,allowDeath) { if(target.isAlive()) { if(!allowDeath&&target.hp<=-value) { value=1-target.hp } target.gainHp(value); if(target.isDead()) { target.performCollapse() } } }; Game_Interpreter.prototype.command101=function() { if(!$gameMessage.isBusy()) { $gameMessage.setFaceImage(this._params[0],this._params[1]); $gameMessage.setBackground(this._params[2]); $gameMessage.setPositionType(this._params[3]); while(this.nextEventCode()===401) { this._index++; $gameMessage.add(this.currentCommand().parameters[0]) } switch(this.nextEventCode()) { case 102:this._index++; this.setupChoices(this.currentCommand().parameters); break; case 103:this._index++; this.setupNumInput(this.currentCommand().parameters); break; case 104:this._index++; this.setupItemChoice(this.currentCommand().parameters); break } this._index++; this.setWaitMode('message') } return false }; Game_Interpreter.prototype.command102=function() { if(!$gameMessage.isBusy()) { this.setupChoices(this._params); this._index++; this.setWaitMode('message') } return false }; Game_Interpreter.prototype.setupChoices=function(params) { var choices=params[0].clone(); var cancelType=params[1]; var defaultType=params.length>2?params[2]:0; var positionType=params.length>3?params[3]:2; var background=params.length>4?params[4]:0; if(cancelType>=choices.length) { cancelType=-2 } $gameMessage.setChoices(choices,defaultType,cancelType); $gameMessage.setChoiceBackground(background); $gameMessage.setChoicePositionType(positionType); $gameMessage.setChoiceCallback(function(n) { this._branch[this._indent]=n } .bind(this)) }; Game_Interpreter.prototype.command402=function() { if(this._branch[this._indent]!==this._params[0]) { this.skipBranch() } return true }; Game_Interpreter.prototype.command403=function() { if(this._branch[this._indent]>=0) { this.skipBranch() } return true }; Game_Interpreter.prototype.command103=function() { if(!$gameMessage.isBusy()) { this.setupNumInput(this._params); this._index++; this.setWaitMode('message') } return false }; Game_Interpreter.prototype.setupNumInput=function(params) { $gameMessage.setNumberInput(params[0],params[1]) }; Game_Interpreter.prototype.command104=function() { if(!$gameMessage.isBusy()) { this.setupItemChoice(this._params); this._index++; this.setWaitMode('message') } return false }; Game_Interpreter.prototype.setupItemChoice=function(params) { $gameMessage.setItemChoice(params[0],params[1]||2) }; Game_Interpreter.prototype.command105=function() { if(!$gameMessage.isBusy()) { $gameMessage.setScroll(this._params[0],this._params[1]); while(this.nextEventCode()===405) { this._index++; $gameMessage.add(this.currentCommand().parameters[0]) } this._index++; this.setWaitMode('message') } return false }; Game_Interpreter.prototype.command108=function() { this._comments=[this._params[0]]; while(this.nextEventCode()===408) { this._index++; this._comments.push(this.currentCommand().parameters[0]) } return true }; Game_Interpreter.prototype.command111=function() { var result=false; switch(this._params[0]) { case 0:result=($gameSwitches.value(this._params[1])===(this._params[2]===0)); break; case 1:var value1=$gameVariables.value(this._params[1]); var value2; if(this._params[2]===0) { value2=this._params[3] } else { value2=$gameVariables.value(this._params[3]) } switch(this._params[4]) { case 0:result=(value1===value2); break; case 1:result=(value1>=value2); break; case 2:result=(value1<=value2); break; case 3:result=(value1>value2); break; case 4:result=(value1<value2); break; case 5:result=(value1!==value2); break } break; case 2:if(this._eventId>0) { var key=[this._mapId,this._eventId,this._params[1]]; result=($gameSelfSwitches.value(key)===(this._params[2]===0)) } break; case 3:if($gameTimer.isWorking()) { if(this._params[2]===0) { result=($gameTimer.seconds()>=this._params[1]) } else { result=($gameTimer.seconds()<=this._params[1]) } } break; case 4:var actor=$gameActors.actor(this._params[1]); if(actor) { var n=this._params[3]; switch(this._params[2]) { case 0:result=$gameParty.members().contains(actor); break; case 1:result=(actor.name()===n); break; case 2:result=actor.isClass($dataClasses[n]); break; case 3:result=actor.isLearnedSkill(n); break; case 4:result=actor.hasWeapon($dataWeapons[n]); break; case 5:result=actor.hasArmor($dataArmors[n]); break; case 6:result=actor.isStateAffected(n); break } } break; case 5:var enemy=$gameTroop.members()[this._params[1]]; if(enemy) { switch(this._params[2]) { case 0:result=enemy.isAlive(); break; case 1:result=enemy.isStateAffected(this._params[3]); break } } break; case 6:var character=this.character(this._params[1]); if(character) { result=(character.direction()===this._params[2]) } break; case 7:switch(this._params[2]) { case 0:result=($gameParty.gold()>=this._params[1]); break; case 1:result=($gameParty.gold()<=this._params[1]); break; case 2:result=($gameParty.gold()<this._params[1]); break } break; case 8:result=$gameParty.hasItem($dataItems[this._params[1]]); break; case 9:result=$gameParty.hasItem($dataWeapons[this._params[1]],this._params[2]); break; case 10:result=$gameParty.hasItem($dataArmors[this._params[1]],this._params[2]); break; case 11:result=Input.isPressed(this._params[1]); break; case 12:result=!!eval(this._params[1]); break; case 13:result=($gamePlayer.vehicle()===$gameMap.vehicle(this._params[1])); break } this._branch[this._indent]=result; if(this._branch[this._indent]===false) { this.skipBranch() } return true }; Game_Interpreter.prototype.command411=function() { if(this._branch[this._indent]!==false) { this.skipBranch() } return true }; Game_Interpreter.prototype.command112=function() { return true }; Game_Interpreter.prototype.command413=function() { do { this._index-- } while(this.currentCommand().indent!==this._indent); return true }; Game_Interpreter.prototype.command113=function() { while(this._index<this._list.length-1) { this._index++; var command=this.currentCommand(); if(command.code===413&&command.indent<this._indent) { break } } return true }; Game_Interpreter.prototype.command115=function() { this._index=this._list.length; return true }; Game_Interpreter.prototype.command117=function() { var commonEvent=$dataCommonEvents[this._params[0]]; if(commonEvent) { var eventId=this.isOnCurrentMap()?this._eventId:0; this.setupChild(commonEvent.list,eventId) } return true }; Game_Interpreter.prototype.setupChild=function(list,eventId) { this._childInterpreter=new Game_Interpreter(this._depth+1); this._childInterpreter.setup(list,eventId) }; Game_Interpreter.prototype.command118=function() { return true }; Game_Interpreter.prototype.command119=function() { var labelName=this._params[0]; for(var i=0; i<this._list.length; i++) { var command=this._list[i]; if(command.code===118&&command.parameters[0]===labelName) { this.jumpTo(i); return } } return true }; Game_Interpreter.prototype.jumpTo=function(index) { var lastIndex=this._index; var startIndex=Math.min(index,lastIndex); var endIndex=Math.max(index,lastIndex); var indent=this._indent; for(var i=startIndex; i<=endIndex; i++) { var newIndent=this._list[i].indent; if(newIndent!==indent) { this._branch[indent]=null; indent=newIndent } } this._index=index }; Game_Interpreter.prototype.command121=function() { for(var i=this._params[0]; i<=this._params[1]; i++) { $gameSwitches.setValue(i,this._params[2]===0) } return true }; Game_Interpreter.prototype.command122=function() { var value=0; switch(this._params[3]) { case 0:value=this._params[4]; break; case 1:value=$gameVariables.value(this._params[4]); break; case 2:value=this._params[4]+Math.randomInt(this._params[5]-this._params[4]+1); break; case 3:value=this.gameDataOperand(this._params[4],this._params[5],this._params[6]); break; case 4:value=eval(this._params[4]); break } for(var i=this._params[0]; i<=this._params[1]; i++) { this.operateVariable(i,this._params[2],value) } return true }; Game_Interpreter.prototype.gameDataOperand=function(type,param1,param2) { switch(type) { case 0:return $gameParty.numItems($dataItems[param1]); case 1:return $gameParty.numItems($dataWeapons[param1]); case 2:return $gameParty.numItems($dataArmors[param1]); case 3:var actor=$gameActors.actor(param1); if(actor) { switch(param2) { case 0:return actor.level; case 1:return actor.currentExp(); case 2:return actor.hp; case 3:return actor.mp; default:if(param2>=4&¶m2<=11) { return actor.param(param2-4) } } } break; case 4:var enemy=$gameTroop.members()[param1]; if(enemy) { switch(param2) { case 0:return enemy.hp; case 1:return enemy.mp; default:if(param2>=2&¶m2<=9) { return enemy.param(param2-2) } } } break; case 5:var character=this.character(param1); if(character) { switch(param2) { case 0:return character.x; case 1:return character.y; case 2:return character.direction(); case 3:return character.screenX(); case 4:return character.screenY() } } break; case 6:actor=$gameParty.members()[param1]; return actor?actor.actorId():0; case 7:switch(param1) { case 0:return $gameMap.mapId(); case 1:return $gameParty.size(); case 2:return $gameParty.gold(); case 3:return $gameParty.steps(); case 4:return $gameSystem.playtime(); case 5:return $gameTimer.seconds(); case 6:return $gameSystem.saveCount(); case 7:return $gameSystem.battleCount(); case 8:return $gameSystem.winCount(); case 9:return $gameSystem.escapeCount() } break } return 0 }; Game_Interpreter.prototype.operateVariable=function(variableId,operationType,value) { try { var oldValue=$gameVariables.value(variableId); switch(operationType) { case 0:$gameVariables.setValue(variableId,oldValue=value); break; case 1:$gameVariables.setValue(variableId,oldValue+value); break; case 2:$gameVariables.setValue(variableId,oldValue-value); break; case 3:$gameVariables.setValue(variableId,oldValue*value); break; case 4:$gameVariables.setValue(variableId,oldValue/value); break; case 5:$gameVariables.setValue(variableId,oldValue%value); break } } catch(e) { $gameVariables.setValue(variableId,0) } }; Game_Interpreter.prototype.command123=function() { if(this._eventId>0) { var key=[this._mapId,this._eventId,this._params[0]]; $gameSelfSwitches.setValue(key,this._params[1]===0) } return true }; Game_Interpreter.prototype.command124=function() { if(this._params[0]===0) { $gameTimer.start(this._params[1]*60) } else { $gameTimer.stop() } return true }; Game_Interpreter.prototype.command125=function() { var value=this.operateValue(this._params[0],this._params[1],this._params[2]); $gameParty.gainGold(value); return true }; Game_Interpreter.prototype.command126=function() { var value=this.operateValue(this._params[1],this._params[2],this._params[3]); $gameParty.gainItem($dataItems[this._params[0]],value); return true }; Game_Interpreter.prototype.command127=function() { var value=this.operateValue(this._params[1],this._params[2],this._params[3]); $gameParty.gainItem($dataWeapons[this._params[0]],value,this._params[4]); return true }; Game_Interpreter.prototype.command128=function() { var value=this.operateValue(this._params[1],this._params[2],this._params[3]); $gameParty.gainItem($dataArmors[this._params[0]],value,this._params[4]); return true }; Game_Interpreter.prototype.command129=function() { var actor=$gameActors.actor(this._params[0]); if(actor) { if(this._params[1]===0) { if(this._params[2]) { $gameActors.actor(this._params[0]).setup(this._params[0]) } $gameParty.addActor(this._params[0]) } else { $gameParty.removeActor(this._params[0]) } } return true }; Game_Interpreter.prototype.command132=function() { $gameSystem.setBattleBgm(this._params[0]); return true }; Game_Interpreter.prototype.command133=function() { $gameSystem.setVictoryMe(this._params[0]); return true }; Game_Interpreter.prototype.command134=function() { if(this._params[0]===0) { $gameSystem.disableSave() } else { $gameSystem.enableSave() } return true }; Game_Interpreter.prototype.command135=function() { if(this._params[0]===0) { $gameSystem.disableMenu() } else { $gameSystem.enableMenu() } return true }; Game_Interpreter.prototype.command136=function() { if(this._params[0]===0) { $gameSystem.disableEncounter() } else { $gameSystem.enableEncounter() } $gamePlayer.makeEncounterCount(); return true }; Game_Interpreter.prototype.command137=function() { if(this._params[0]===0) { $gameSystem.disableFormation() } else { $gameSystem.enableFormation() } return true }; Game_Interpreter.prototype.command138=function() { $gameSystem.setWindowTone(this._params[0]); return true }; Game_Interpreter.prototype.command139=function() { $gameSystem.setDefeatMe(this._params[0]); return true }; Game_Interpreter.prototype.command140=function() { var vehicle=$gameMap.vehicle(this._params[0]); if(vehicle) { vehicle.setBgm(this._params[1]) } return true }; Game_Interpreter.prototype.command201=function() { if(!$gameParty.inBattle()&&!$gameMessage.isBusy()) { var mapId,x,y; if(this._params[0]===0) { mapId=this._params[1]; x=this._params[2]; y=this._params[3] } else { mapId=$gameVariables.value(this._params[1]); x=$gameVariables.value(this._params[2]); y=$gameVariables.value(this._params[3]) } $gamePlayer.reserveTransfer(mapId,x,y,this._params[4],this._params[5]); this.setWaitMode('transfer'); this._index++ } return false }; Game_Interpreter.prototype.command202=function() { var mapId,x,y; if(this._params[1]===0) { mapId=this._params[2]; x=this._params[3]; y=this._params[4] } else { mapId=$gameVariables.value(this._params[2]); x=$gameVariables.value(this._params[3]); y=$gameVariables.value(this._params[4]) } var vehicle=$gameMap.vehicle(this._params[0]); if(vehicle) { vehicle.setLocation(mapId,x,y) } return true }; Game_Interpreter.prototype.command203=function() { var character=this.character(this._params[0]); if(character) { if(this._params[1]===0) { character.locate(this._params[2],this._params[3]) } else if(this._params[1]===1) { var x=$gameVariables.value(this._params[2]); var y=$gameVariables.value(this._params[3]); character.locate(x,y) } else { var character2=this.character(this._params[2]); if(character2) { character.swap(character2) } } if(this._params[4]>0) { character.setDirection(this._params[4]) } } return true }; Game_Interpreter.prototype.command204=function() { if(!$gameParty.inBattle()) { if($gameMap.isScrolling()) { this.setWaitMode('scroll'); return false } $gameMap.startScroll(this._params[0],this._params[1],this._params[2]) } return true }; Game_Interpreter.prototype.command205=function() { $gameMap.refreshIfNeeded(); this._character=this.character(this._params[0]); if(this._character) { this._character.forceMoveRoute(this._params[1]); if(this._params[1].wait) { this.setWaitMode('route') } } return true }; Game_Interpreter.prototype.command206=function() { $gamePlayer.getOnOffVehicle(); return true }; Game_Interpreter.prototype.command211=function() { $gamePlayer.setTransparent(this._params[0]===0); return true }; Game_Interpreter.prototype.command212=function() { this._character=this.character(this._params[0]); if(this._character) { this._character.requestAnimation(this._params[1]); if(this._params[2]) { this.setWaitMode('animation') } } return true }; Game_Interpreter.prototype.command213=function() { this._character=this.character(this._params[0]); if(this._character) { this._character.requestBalloon(this._params[1]); if(this._params[2]) { this.setWaitMode('balloon') } } return true }; Game_Interpreter.prototype.command214=function() { if(this.isOnCurrentMap()&&this._eventId>0) { $gameMap.eraseEvent(this._eventId) } return true }; Game_Interpreter.prototype.command216=function() { if(this._params[0]===0) { $gamePlayer.showFollowers() } else { $gamePlayer.hideFollowers() } $gamePlayer.refresh(); return true }; Game_Interpreter.prototype.command217=function() { if(!$gameParty.inBattle()) { $gamePlayer.gatherFollowers(); this.setWaitMode('gather') } return true }; Game_Interpreter.prototype.command221=function() { if(!$gameMessage.isBusy()) { $gameScreen.startFadeOut(this.fadeSpeed()); this.wait(this.fadeSpeed()); this._index++ } return false }; Game_Interpreter.prototype.command222=function() { if(!$gameMessage.isBusy()) { $gameScreen.startFadeIn(this.fadeSpeed()); this.wait(this.fadeSpeed()); this._index++ } return false }; Game_Interpreter.prototype.command223=function() { $gameScreen.startTint(this._params[0],this._params[1]); if(this._params[2]) { this.wait(this._params[1]) } return true }; Game_Interpreter.prototype.command224=function() { $gameScreen.startFlash(this._params[0],this._params[1]); if(this._params[2]) { this.wait(this._params[1]) } return true }; Game_Interpreter.prototype.command225=function() { $gameScreen.startShake(this._params[0],this._params[1],this._params[2]); if(this._params[3]) { this.wait(this._params[2]) } return true }; Game_Interpreter.prototype.command230=function() { this.wait(this._params[0]); return true }; Game_Interpreter.prototype.command231=function() { var x,y; if(this._params[3]===0) { x=this._params[4]; y=this._params[5] } else { x=$gameVariables.value(this._params[4]); y=$gameVariables.value(this._params[5]) } $gameScreen.showPicture(this._params[0],this._params[1],this._params[2],x,y,this._params[6],this._params[7],this._params[8],this._params[9]); return true }; Game_Interpreter.prototype.command232=function() { var x,y; if(this._params[3]===0) { x=this._params[4]; y=this._params[5] } else { x=$gameVariables.value(this._params[4]); y=$gameVariables.value(this._params[5]) } $gameScreen.movePicture(this._params[0],this._params[2],x,y,this._params[6],this._params[7],this._params[8],this._params[9],this._params[10]); if(this._params[11]) { this.wait(this._params[10]) } return true }; Game_Interpreter.prototype.command233=function() { $gameScreen.rotatePicture(this._params[0],this._params[1]); return true }; Game_Interpreter.prototype.command234=function() { $gameScreen.tintPicture(this._params[0],this._params[1],this._params[2]); if(this._params[3]) { this.wait(this._params[2]) } return true }; Game_Interpreter.prototype.command235=function() { $gameScreen.erasePicture(this._params[0]); return true }; Game_Interpreter.prototype.command236=function() { if(!$gameParty.inBattle()) { $gameScreen.changeWeather(this._params[0],this._params[1],this._params[2]); if(this._params[3]) { this.wait(this._params[2]) } } return true }; Game_Interpreter.prototype.command241=function() { AudioManager.playBgm(this._params[0]); return true }; Game_Interpreter.prototype.command242=function() { AudioManager.fadeOutBgm(this._params[0]); return true }; Game_Interpreter.prototype.command243=function() { $gameSystem.saveBgm(); return true }; Game_Interpreter.prototype.command244=function() { $gameSystem.replayBgm(); return true }; Game_Interpreter.prototype.command245=function() { AudioManager.playBgs(this._params[0]); return true }; Game_Interpreter.prototype.command246=function() { AudioManager.fadeOutBgs(this._params[0]); return true }; Game_Interpreter.prototype.command249=function() { AudioManager.playMe(this._params[0]); return true }; Game_Interpreter.prototype.command250=function() { AudioManager.playSe(this._params[0]); return true }; Game_Interpreter.prototype.command251=function() { AudioManager.stopSe(); return true }; Game_Interpreter.prototype.command261=function() { if(!$gameMessage.isBusy()) { var name=this._params[0]; if(name.length>0) { var ext=this.videoFileExt(); Graphics.playVideo('movies/'+name+ext); this.setWaitMode('video') } this._index++ } return false }; Game_Interpreter.prototype.videoFileExt=function() { if(Graphics.canPlayVideoType('video/webm')&&!Utils.isMobileDevice()) { return'.webm' } else { return'.mp4' } }; Game_Interpreter.prototype.command281=function() { if(this._params[0]===0) { $gameMap.enableNameDisplay() } else { $gameMap.disableNameDisplay() } return true }; Game_Interpreter.prototype.command282=function() { var tileset=$dataTilesets[this._params[0]]; for(var i=0; i<tileset.tilesetNames.length; i++) { ImageManager.loadTileset(tileset.tilesetNames[i]) } if(ImageManager.isReady()) { $gameMap.changeTileset(this._params[0]); return true } else { return false } }; Game_Interpreter.prototype.command283=function() { $gameMap.changeBattleback(this._params[0],this._params[1]); return true }; Game_Interpreter.prototype.command284=function() { $gameMap.changeParallax(this._params[0],this._params[1],this._params[2],this._params[3],this._params[4]); return true }; Game_Interpreter.prototype.command285=function() { var x,y,value; if(this._params[2]===0) { x=this._params[3]; y=this._params[4] } else { x=$gameVariables.value(this._params[3]); y=$gameVariables.value(this._params[4]) } switch(this._params[1]) { case 0:value=$gameMap.terrainTag(x,y); break; case 1:value=$gameMap.eventIdXy(x,y); break; case 2:case 3:case 4:case 5:value=$gameMap.tileId(x,y,this._params[1]-2); break; default:value=$gameMap.regionId(x,y); break } $gameVariables.setValue(this._params[0],value); return true }; Game_Interpreter.prototype.command301=function() { if(!$gameParty.inBattle()) { var troopId; if(this._params[0]===0) { troopId=this._params[1] } else if(this._params[0]===1) { troopId=$gameVariables.value(this._params[1]) } else { troopId=$gamePlayer.makeEncounterTroopId() } if($dataTroops[troopId]) { BattleManager.setup(troopId,this._params[2],this._params[3]); BattleManager.setEventCallback(function(n) { this._branch[this._indent]=n } .bind(this)); $gamePlayer.makeEncounterCount(); SceneManager.push(Scene_Battle) } } return true }; Game_Interpreter.prototype.command601=function() { if(this._branch[this._indent]!==0) { this.skipBranch() } return true }; Game_Interpreter.prototype.command602=function() { if(this._branch[this._indent]!==1) { this.skipBranch() } return true }; Game_Interpreter.prototype.command603=function() { if(this._branch[this._indent]!==2) { this.skipBranch() } return true }; Game_Interpreter.prototype.command302=function() { if(!$gameParty.inBattle()) { var goods=[this._params]; while(this.nextEventCode()===605) { this._index++; goods.push(this.currentCommand().parameters) } SceneManager.push(Scene_Shop); SceneManager.prepareNextScene(goods,this._params[4]) } return true }; Game_Interpreter.prototype.command303=function() { if(!$gameParty.inBattle()) { if($dataActors[this._params[0]]) { SceneManager.push(Scene_Name); SceneManager.prepareNextScene(this._params[0],this._params[1]) } } return true }; Game_Interpreter.prototype.command311=function() { var value=this.operateValue(this._params[2],this._params[3],this._params[4]); this.iterateActorEx(this._params[0],this._params[1],function(actor) { this.changeHp(actor,value,this._params[5]) } .bind(this)); return true }; Game_Interpreter.prototype.command312=function() { var value=this.operateValue(this._params[2],this._params[3],this._params[4]); this.iterateActorEx(this._params[0],this._params[1],function(actor) { actor.gainMp(value) } .bind(this)); return true }; Game_Interpreter.prototype.command326=function() { var value=this.operateValue(this._params[2],this._params[3],this._params[4]); this.iterateActorEx(this._params[0],this._params[1],function(actor) { actor.gainTp(value) } .bind(this)); return true }; Game_Interpreter.prototype.command313=function() { this.iterateActorEx(this._params[0],this._params[1],function(actor) { var alreadyDead=actor.isDead(); if(this._params[2]===0) { actor.addState(this._params[3]) } else { actor.removeState(this._params[3]) } if(actor.isDead()&&!alreadyDead) { actor.performCollapse() } actor.clearResult() } .bind(this)); return true }; Game_Interpreter.prototype.command314=function() { this.iterateActorEx(this._params[0],this._params[1],function(actor) { actor.recoverAll() } .bind(this)); return true }; Game_Interpreter.prototype.command315=function() { var value=this.operateValue(this._params[2],this._params[3],this._params[4]); this.iterateActorEx(this._params[0],this._params[1],function(actor) { actor.changeExp(actor.currentExp()+value,this._params[5]) } .bind(this)); return true }; Game_Interpreter.prototype.command316=function() { var value=this.operateValue(this._params[2],this._params[3],this._params[4]); this.iterateActorEx(this._params[0],this._params[1],function(actor) { actor.changeLevel(actor.level+value,this._params[5]) } .bind(this)); return true }; Game_Interpreter.prototype.command317=function() { var value=this.operateValue(this._params[3],this._params[4],this._params[5]); this.iterateActorEx(this._params[0],this._params[1],function(actor) { actor.addParam(this._params[2],value) } .bind(this)); return true }; Game_Interpreter.prototype.command318=function() { this.iterateActorEx(this._params[0],this._params[1],function(actor) { if(this._params[2]===0) { actor.learnSkill(this._params[3]) } else { actor.forgetSkill(this._params[3]) } } .bind(this)); return true }; Game_Interpreter.prototype.command319=function() { var actor=$gameActors.actor(this._params[0]); if(actor) { actor.changeEquipById(this._params[1],this._params[2]) } return true }; Game_Interpreter.prototype.command320=function() { var actor=$gameActors.actor(this._params[0]); if(actor) { actor.setName(this._params[1]) } return true }; Game_Interpreter.prototype.command321=function() { var actor=$gameActors.actor(this._params[0]); if(actor&&$dataClasses[this._params[1]]) { actor.changeClass(this._params[1],false) } return true }; Game_Interpreter.prototype.command322=function() { var actor=$gameActors.actor(this._params[0]); if(actor) { actor.setCharacterImage(this._params[1],this._params[2]); actor.setFaceImage(this._params[3],this._params[4]); actor.setBattlerImage(this._params[5]) } $gamePlayer.refresh(); return true }; Game_Interpreter.prototype.command323=function() { var vehicle=$gameMap.vehicle(this._params[0]); if(vehicle) { vehicle.setImage(this._params[1],this._params[2]) } return true }; Game_Interpreter.prototype.command324=function() { var actor=$gameActors.actor(this._params[0]); if(actor) { actor.setNickname(this._params[1]) } return true }; Game_Interpreter.prototype.command325=function() { var actor=$gameActors.actor(this._params[0]); if(actor) { actor.setProfile(this._params[1]) } return true }; Game_Interpreter.prototype.command331=function() { var value=this.operateValue(this._params[1],this._params[2],this._params[3]); this.iterateEnemyIndex(this._params[0],function(enemy) { this.changeHp(enemy,value,this._params[4]) } .bind(this)); return true }; Game_Interpreter.prototype.command332=function() { var value=this.operateValue(this._params[1],this._params[2],this._params[3]); this.iterateEnemyIndex(this._params[0],function(enemy) { enemy.gainMp(value) } .bind(this)); return true }; Game_Interpreter.prototype.command342=function() { var value=this.operateValue(this._params[1],this._params[2],this._params[3]); this.iterateEnemyIndex(this._params[0],function(enemy) { enemy.gainTp(value) } .bind(this)); return true }; Game_Interpreter.prototype.command333=function() { this.iterateEnemyIndex(this._params[0],function(enemy) { var alreadyDead=enemy.isDead(); if(this._params[1]===0) { enemy.addState(this._params[2]) } else { enemy.removeState(this._params[2]) } if(enemy.isDead()&&!alreadyDead) { enemy.performCollapse() } enemy.clearResult() } .bind(this)); return true }; Game_Interpreter.prototype.command334=function() { this.iterateEnemyIndex(this._params[0],function(enemy) { enemy.recoverAll() } .bind(this)); return true }; Game_Interpreter.prototype.command335=function() { this.iterateEnemyIndex(this._params[0],function(enemy) { enemy.appear(); $gameTroop.makeUniqueNames() } .bind(this)); return true }; Game_Interpreter.prototype.command336=function() { this.iterateEnemyIndex(this._params[0],function(enemy) { enemy.transform(this._params[1]); $gameTroop.makeUniqueNames() } .bind(this)); return true }; Game_Interpreter.prototype.command337=function() { this.iterateEnemyIndex(this._params[0],function(enemy) { if(enemy.isAlive()) { enemy.startAnimation(this._params[1],false,0) } } .bind(this)); return true }; Game_Interpreter.prototype.command339=function() { this.iterateBattler(this._params[0],this._params[1],function(battler) { if(!battler.isDeathStateAffected()) { battler.forceAction(this._params[2],this._params[3]); BattleManager.forceAction(battler); this.setWaitMode('action') } } .bind(this)); return true }; Game_Interpreter.prototype.command340=function() { BattleManager.abort(); return true }; Game_Interpreter.prototype.command351=function() { if(!$gameParty.inBattle()) { SceneManager.push(Scene_Menu); Window_MenuCommand.initCommandPosition() } return true }; Game_Interpreter.prototype.command352=function() { if(!$gameParty.inBattle()) { SceneManager.push(Scene_Save) } return true }; Game_Interpreter.prototype.command353=function() { SceneManager.goto(Scene_Gameover); return true }; Game_Interpreter.prototype.command354=function() { SceneManager.goto(Scene_Title); return true }; Game_Interpreter.prototype.command355=function() { var script=this.currentCommand().parameters[0]+'\n'; while(this.nextEventCode()===655) { this._index++; script+=this.currentCommand().parameters[0]+'\n' } eval(script); return true }; Game_Interpreter.prototype.command356=function() { var args=this._params[0].split(" "); var command=args.shift(); this.pluginCommand(command,args); return true }; Game_Interpreter.prototype.pluginCommand=function(command,args) { }; rpg_managers.js function DataManager() { throw new Error('This is a static class') } var $dataActors=null; var $dataClasses=null; var $dataSkills=null; var $dataItems=null; var $dataWeapons=null; var $dataArmors=null; var $dataEnemies=null; var $dataTroops=null; var $dataStates=null; var $dataAnimations=null; var $dataTilesets=null; var $dataCommonEvents=null; var $dataSystem=null; var $dataMapInfos=null; var $dataMap=null; var $gameTemp=null; var $gameSystem=null; var $gameScreen=null; var $gameTimer=null; var $gameMessage=null; var $gameSwitches=null; var $gameVariables=null; var $gameSelfSwitches=null; var $gameActors=null; var $gameParty=null; var $gameTroop=null; var $gameMap=null; var $gamePlayer=null; var $testEvent=null; DataManager._globalId='RPGMV'; DataManager._lastAccessedId=1; DataManager._errorUrl=null; DataManager._databaseFiles=[ { name:'$dataActors',src:'Actors.json' } , { name:'$dataClasses',src:'Classes.json' } , { name:'$dataSkills',src:'Skills.json' } , { name:'$dataItems',src:'Items.json' } , { name:'$dataWeapons',src:'Weapons.json' } , { name:'$dataArmors',src:'Armors.json' } , { name:'$dataEnemies',src:'Enemies.json' } , { name:'$dataTroops',src:'Troops.json' } , { name:'$dataStates',src:'States.json' } , { name:'$dataAnimations',src:'Animations.json' } , { name:'$dataTilesets',src:'Tilesets.json' } , { name:'$dataCommonEvents',src:'CommonEvents.json' } , { name:'$dataSystem',src:'System.json' } , { name:'$dataMapInfos',src:'MapInfos.json' } ]; DataManager.loadDatabase=function() { var test=this.isBattleTest()||this.isEventTest(); var prefix=test?'Test_':''; for(var i=0; i<this._databaseFiles.length; i++) { var name=this._databaseFiles[i].name; var src=this._databaseFiles[i].src; this.loadDataFile(name,prefix+src) } if(this.isEventTest()) { this.loadDataFile('$testEvent',prefix+'Event.json') } }; DataManager.loadDataFile=function(name,src) { var xhr=new XMLHttpRequest(); var url='data/'+src; xhr.open('GET',url); xhr.overrideMimeType('application/json'); xhr.onload=function() { if(xhr.status<400) { window[name]=JSON.parse(xhr.responseText); DataManager.onLoad(window[name]) } }; xhr.onerror=function() { DataManager._errorUrl=DataManager._errorUrl||url }; window[name]=null; xhr.send() }; DataManager.isDatabaseLoaded=function() { this.checkError(); for(var i=0; i<this._databaseFiles.length; i++) { if(!window[this._databaseFiles[i].name]) { return false } } return true }; DataManager.loadMapData=function(mapId) { if(mapId>0) { var filename='Map%1.json'.format(mapId.padZero(3)); this.loadDataFile('$dataMap',filename) } else { this.makeEmptyMap() } }; DataManager.makeEmptyMap=function() { $dataMap= { }; $dataMap.data=[]; $dataMap.events=[]; $dataMap.width=100; $dataMap.height=100; $dataMap.scrollType=3 }; DataManager.isMapLoaded=function() { this.checkError(); return!!$dataMap }; DataManager.onLoad=function(object) { var array; if(object===$dataMap) { this.extractMetadata(object); array=object.events } else { array=object } if(Array.isArray(array)) { for(var i=0; i<array.length; i++) { var data=array[i]; if(data&&data.note!==undefined) { this.extractMetadata(data) } } } }; DataManager.extractMetadata=function(data) { var re=/<([^<>:]+)(:?)([^>]*)>/g; data.meta= { }; for(;; ) { var match=re.exec(data.note); if(match) { if(match[2]===':') { data.meta[match[1]]=match[3] } else { data.meta[match[1]]=true } } else { break } } }; DataManager.checkError=function() { if(DataManager._errorUrl) { throw new Error('Failed to load: '+DataManager._errorUrl) } }; DataManager.isBattleTest=function() { return Utils.isOptionValid('btest') }; DataManager.isEventTest=function() { return Utils.isOptionValid('etest') }; DataManager.isSkill=function(item) { return item&&$dataSkills.contains(item) }; DataManager.isItem=function(item) { return item&&$dataItems.contains(item) }; DataManager.isWeapon=function(item) { return item&&$dataWeapons.contains(item) }; DataManager.isArmor=function(item) { return item&&$dataArmors.contains(item) }; DataManager.createGameObjects=function() { $gameTemp=new Game_Temp(); $gameSystem=new Game_System(); $gameScreen=new Game_Screen(); $gameTimer=new Game_Timer(); $gameMessage=new Game_Message(); $gameSwitches=new Game_Switches(); $gameVariables=new Game_Variables(); $gameSelfSwitches=new Game_SelfSwitches(); $gameActors=new Game_Actors(); $gameParty=new Game_Party(); $gameTroop=new Game_Troop(); $gameMap=new Game_Map(); $gamePlayer=new Game_Player() }; DataManager.setupNewGame=function() { this.createGameObjects(); this.selectSavefileForNewGame(); $gameParty.setupStartingMembers(); $gamePlayer.reserveTransfer($dataSystem.startMapId,$dataSystem.startX,$dataSystem.startY); Graphics.frameCount=0 }; DataManager.setupBattleTest=function() { this.createGameObjects(); $gameParty.setupBattleTest(); BattleManager.setup($dataSystem.testTroopId,true,false); BattleManager.setBattleTest(true); BattleManager.playBattleBgm() }; DataManager.setupEventTest=function() { this.createGameObjects(); this.selectSavefileForNewGame(); $gameParty.setupStartingMembers(); $gamePlayer.reserveTransfer(-1,8,6); $gamePlayer.setTransparent(false) }; DataManager.loadGlobalInfo=function() { var json; try { json=StorageManager.load(0) } catch(e) { console.error(e); return[] } if(json) { var globalInfo=JSON.parse(json); for(var i=1; i<=this.maxSavefiles(); i++) { if(!StorageManager.exists(i)) { delete globalInfo[i] } } return globalInfo } else { return[] } }; DataManager.saveGlobalInfo=function(info) { StorageManager.save(0,JSON.stringify(info)) }; DataManager.isThisGameFile=function(savefileId) { var globalInfo=this.loadGlobalInfo(); if(globalInfo&&globalInfo[savefileId]) { if(StorageManager.isLocalMode()) { return true } else { var savefile=globalInfo[savefileId]; return(savefile.globalId===this._globalId&&savefile.title===$dataSystem.gameTitle) } } else { return false } }; DataManager.isAnySavefileExists=function() { var globalInfo=this.loadGlobalInfo(); if(globalInfo) { for(var i=1; i<globalInfo.length; i++) { if(this.isThisGameFile(i)) { return true } } } return false }; DataManager.latestSavefileId=function() { var globalInfo=this.loadGlobalInfo(); var savefileId=1; var timestamp=0; if(globalInfo) { for(var i=1; i<globalInfo.length; i++) { if(this.isThisGameFile(i)&&globalInfo[i].timestamp>timestamp) { timestamp=globalInfo[i].timestamp; savefileId=i } } } return savefileId }; DataManager.loadAllSavefileImages=function() { var globalInfo=this.loadGlobalInfo(); if(globalInfo) { for(var i=1; i<globalInfo.length; i++) { if(this.isThisGameFile(i)) { var info=globalInfo[i]; this.loadSavefileImages(info) } } } }; DataManager.loadSavefileImages=function(info) { if(info.characters) { for(var i=0; i<info.characters.length; i++) { ImageManager.loadCharacter(info.characters[i][0]) } } if(info.faces) { for(var j=0; j<info.faces.length; j++) { ImageManager.loadFace(info.faces[j][0]) } } }; DataManager.maxSavefiles=function() { return 20 }; DataManager.saveGame=function(savefileId) { try { return this.saveGameWithoutRescue(savefileId) } catch(e) { console.error(e); try { StorageManager.remove(savefileId) } catch(e2) { } return false } }; DataManager.loadGame=function(savefileId) { try { return this.loadGameWithoutRescue(savefileId) } catch(e) { console.error(e); return false } }; DataManager.loadSavefileInfo=function(savefileId) { var globalInfo=this.loadGlobalInfo(); return(globalInfo&&globalInfo[savefileId])?globalInfo[savefileId]:null }; DataManager.lastAccessedSavefileId=function() { return this._lastAccessedId }; DataManager.saveGameWithoutRescue=function(savefileId) { var json=JsonEx.stringify(this.makeSaveContents()); if(json.length>=200000) { console.warn('Save data too big!') } StorageManager.save(savefileId,json); this._lastAccessedId=savefileId; var globalInfo=this.loadGlobalInfo()||[]; globalInfo[savefileId]=this.makeSavefileInfo(); this.saveGlobalInfo(globalInfo); return true }; DataManager.loadGameWithoutRescue=function(savefileId) { var globalInfo=this.loadGlobalInfo(); if(this.isThisGameFile(savefileId)) { var json=StorageManager.load(savefileId); this.createGameObjects(); this.extractSaveContents(JsonEx.parse(json)); this._lastAccessedId=savefileId; return true } else { return false } }; DataManager.selectSavefileForNewGame=function() { var globalInfo=this.loadGlobalInfo(); this._lastAccessedId=1; if(globalInfo) { var numSavefiles=Math.max(0,globalInfo.length-1); if(numSavefiles<this.maxSavefiles()) { this._lastAccessedId=numSavefiles+1 } else { var timestamp=Number.MAX_VALUE; for(var i=1; i<globalInfo.length; i++) { if(!globalInfo[i]) { this._lastAccessedId=i; break } if(globalInfo[i].timestamp<timestamp) { timestamp=globalInfo[i].timestamp; this._lastAccessedId=i } } } } }; DataManager.makeSavefileInfo=function() { var info= { }; info.globalId=this._globalId; info.title=$dataSystem.gameTitle; info.characters=$gameParty.charactersForSavefile(); info.faces=$gameParty.facesForSavefile(); info.playtime=$gameSystem.playtimeText(); info.timestamp=Date.now(); return info }; DataManager.makeSaveContents=function() { var contents= { }; contents.system=$gameSystem; contents.screen=$gameScreen; contents.timer=$gameTimer; contents.switches=$gameSwitches; contents.variables=$gameVariables; contents.selfSwitches=$gameSelfSwitches; contents.actors=$gameActors; contents.party=$gameParty; contents.map=$gameMap; contents.player=$gamePlayer; return contents }; DataManager.extractSaveContents=function(contents) { $gameSystem=contents.system; $gameScreen=contents.screen; $gameTimer=contents.timer; $gameSwitches=contents.switches; $gameVariables=contents.variables; $gameSelfSwitches=contents.selfSwitches; $gameActors=contents.actors; $gameParty=contents.party; $gameMap=contents.map; $gamePlayer=contents.player }; function ConfigManager() { throw new Error('This is a static class') } ConfigManager.alwaysDash=false; ConfigManager.commandRemember=false; Object.defineProperty(ConfigManager,'bgmVolume', { get:function() { return AudioManager._bgmVolume } ,set:function(value) { AudioManager.bgmVolume=value } ,configurable:true } ); Object.defineProperty(ConfigManager,'bgsVolume', { get:function() { return AudioManager.bgsVolume } ,set:function(value) { AudioManager.bgsVolume=value } ,configurable:true } ); Object.defineProperty(ConfigManager,'meVolume', { get:function() { return AudioManager.meVolume } ,set:function(value) { AudioManager.meVolume=value } ,configurable:true } ); Object.defineProperty(ConfigManager,'seVolume', { get:function() { return AudioManager.seVolume } ,set:function(value) { AudioManager.seVolume=value } ,configurable:true } ); ConfigManager.load=function() { var json; var config= { }; try { json=StorageManager.load(-1) } catch(e) { console.error(e) } if(json) { config=JSON.parse(json) } this.applyData(config) }; ConfigManager.save=function() { StorageManager.save(-1,JSON.stringify(this.makeData())) }; ConfigManager.makeData=function() { var config= { }; config.alwaysDash=this.alwaysDash; config.commandRemember=this.commandRemember; config.bgmVolume=this.bgmVolume; config.bgsVolume=this.bgsVolume; config.meVolume=this.meVolume; config.seVolume=this.seVolume; return config }; ConfigManager.applyData=function(config) { this.alwaysDash=this.readFlag(config,'alwaysDash'); this.commandRemember=this.readFlag(config,'commandRemember'); this.bgmVolume=this.readVolume(config,'bgmVolume'); this.bgsVolume=this.readVolume(config,'bgsVolume'); this.meVolume=this.readVolume(config,'meVolume'); this.seVolume=this.readVolume(config,'seVolume') }; ConfigManager.readFlag=function(config,name) { return!!config[name] }; ConfigManager.readVolume=function(config,name) { var value=config[name]; if(value!==undefined) { return Number(value).clamp(0,100) } else { return 100 } }; function StorageManager() { throw new Error('This is a static class') } StorageManager.save=function(savefileId,json) { if(this.isLocalMode()) { this.saveToLocalFile(savefileId,json) } else { this.saveToWebStorage(savefileId,json) } }; StorageManager.load=function(savefileId) { if(this.isLocalMode()) { return this.loadFromLocalFile(savefileId) } else { return this.loadFromWebStorage(savefileId) } }; StorageManager.exists=function(savefileId) { if(this.isLocalMode()) { return this.localFileExists(savefileId) } else { return this.webStorageExists(savefileId) } }; StorageManager.remove=function(savefileId) { if(this.isLocalMode()) { this.removeLocalFile(savefileId) } else { this.removeWebStorage(savefileId) } }; StorageManager.isLocalMode=function() { return Utils.isNwjs() }; StorageManager.saveToLocalFile=function(savefileId,json) { var data=LZString.compressToBase64(json); var fs=require('fs'); var dirPath=this.localFileDirectoryPath(); var filePath=this.localFilePath(savefileId); if(!fs.existsSync(dirPath)) { fs.mkdirSync(dirPath) } fs.writeFileSync(filePath,data) }; StorageManager.loadFromLocalFile=function(savefileId) { var data=null; var fs=require('fs'); var filePath=this.localFilePath(savefileId); if(fs.existsSync(filePath)) { data=fs.readFileSync(filePath, { encoding:'utf8' } ) } return LZString.decompressFromBase64(data) }; StorageManager.localFileExists=function(savefileId) { var fs=require('fs'); return fs.existsSync(this.localFilePath(savefileId)) }; StorageManager.removeLocalFile=function(savefileId) { var fs=require('fs'); var filePath=this.localFilePath(savefileId); if(fs.existsSync(filePath)) { fs.unlinkSync(filePath) } }; StorageManager.saveToWebStorage=function(savefileId,json) { var key=this.webStorageKey(savefileId); var data=LZString.compressToBase64(json); localStorage.setItem(key,data) }; StorageManager.loadFromWebStorage=function(savefileId) { var key=this.webStorageKey(savefileId); var data=localStorage.getItem(key); return LZString.decompressFromBase64(data) }; StorageManager.webStorageExists=function(savefileId) { var key=this.webStorageKey(savefileId); return!!localStorage.getItem(key) }; StorageManager.removeWebStorage=function(savefileId) { var key=this.webStorageKey(savefileId); localStorage.removeItem(key) }; StorageManager.localFileDirectoryPath=function() { var path=window.location.pathname.replace(/\/[^\/]*$/,'/save/'); if(path.match(/^\/([A-Z]\:)/)) { path=path.slice(1) } return decodeURIComponent(path) }; StorageManager.localFilePath=function(savefileId) { var name; if(savefileId<0) { name='config.rpgsave' } else if(savefileId===0) { name='global.rpgsave' } else { name='file%1.rpgsave'.format(savefileId) } return this.localFileDirectoryPath()+name }; StorageManager.webStorageKey=function(savefileId) { if(savefileId<0) { return'RPG Config' } else if(savefileId===0) { return'RPG Global' } else { return'RPG File%1'.format(savefileId) } }; function ImageManager() { throw new Error('This is a static class') } ImageManager._cache= { }; ImageManager.loadAnimation=function(filename,hue) { return this.loadBitmap('img/animations/',filename,hue,true) }; ImageManager.loadBattleback1=function(filename,hue) { return this.loadBitmap('img/battlebacks1/',filename,hue,true) }; ImageManager.loadBattleback2=function(filename,hue) { return this.loadBitmap('img/battlebacks2/',filename,hue,true) }; ImageManager.loadEnemy=function(filename,hue) { return this.loadBitmap('img/enemies/',filename,hue,true) }; ImageManager.loadCharacter=function(filename,hue) { return this.loadBitmap('img/characters/',filename,hue,false) }; ImageManager.loadFace=function(filename,hue) { return this.loadBitmap('img/faces/',filename,hue,true) }; ImageManager.loadParallax=function(filename,hue) { return this.loadBitmap('img/parallaxes/',filename,hue,true) }; ImageManager.loadPicture=function(filename,hue) { return this.loadBitmap('img/pictures/',filename,hue,true) }; ImageManager.loadSvActor=function(filename,hue) { return this.loadBitmap('img/sv_actors/',filename,hue,false) }; ImageManager.loadSvEnemy=function(filename,hue) { return this.loadBitmap('img/sv_enemies/',filename,hue,true) }; ImageManager.loadSystem=function(filename,hue) { return this.loadBitmap('img/system/',filename,hue,false) }; ImageManager.loadTileset=function(filename,hue) { return this.loadBitmap('img/tilesets/',filename,hue,false) }; ImageManager.loadTitle1=function(filename,hue) { return this.loadBitmap('img/titles1/',filename,hue,true) }; ImageManager.loadTitle2=function(filename,hue) { return this.loadBitmap('img/titles2/',filename,hue,true) }; ImageManager.loadBitmap=function(folder,filename,hue,smooth) { if(filename) { var path=folder+encodeURIComponent(filename)+'.png'; var bitmap=this.loadNormalBitmap(path,hue||0); bitmap.smooth=smooth; return bitmap } else { return this.loadEmptyBitmap() } }; ImageManager.loadEmptyBitmap=function() { if(!this._cache[null]) { this._cache[null]=new Bitmap() } return this._cache[null] }; ImageManager.loadNormalBitmap=function(path,hue) { var key=path+':'+hue; if(!this._cache[key]) { var bitmap=Bitmap.load(path); bitmap.addLoadListener(function() { bitmap.rotateHue(hue) } ); this._cache[key]=bitmap } return this._cache[key] }; ImageManager.clear=function() { this._cache= { } }; ImageManager.isReady=function() { for(var key in this._cache) { var bitmap=this._cache[key]; if(bitmap.isError()) { throw new Error('Failed to load: '+bitmap.url) } if(!bitmap.isReady()) { return false } } return true }; ImageManager.isObjectCharacter=function(filename) { var sign=filename.match(/^[\!\$]+/); return sign&&sign[0].contains('!') }; ImageManager.isBigCharacter=function(filename) { var sign=filename.match(/^[\!\$]+/); return sign&&sign[0].contains('$') }; ImageManager.isZeroParallax=function(filename) { return filename.charAt(0)==='!' }; function AudioManager() { throw new Error('This is a static class') } AudioManager._bgmVolume=100; AudioManager._bgsVolume=100; AudioManager._meVolume=100; AudioManager._seVolume=100; AudioManager._currentBgm=null; AudioManager._currentBgs=null; AudioManager._bgmBuffer=null; AudioManager._bgsBuffer=null; AudioManager._meBuffer=null; AudioManager._seBuffers=[]; AudioManager._staticBuffers=[]; AudioManager._replayFadeTime=0.5; AudioManager._path='audio/'; Object.defineProperty(AudioManager,'bgmVolume', { get:function() { return this._bgmVolume } ,set:function(value) { this._bgmVolume=value; this.updateBgmParameters(this._currentBgm) } ,configurable:true } ); Object.defineProperty(AudioManager,'bgsVolume', { get:function() { return this._bgsVolume } ,set:function(value) { this._bgsVolume=value; this.updateBgsParameters(this._currentBgs) } ,configurable:true } ); Object.defineProperty(AudioManager,'meVolume', { get:function() { return this._meVolume } ,set:function(value) { this._meVolume=value; this.updateMeParameters(this._currentMe) } ,configurable:true } ); Object.defineProperty(AudioManager,'seVolume', { get:function() { return this._seVolume } ,set:function(value) { this._seVolume=value } ,configurable:true } ); AudioManager.playBgm=function(bgm,pos) { if(this.isCurrentBgm(bgm)) { this.updateBgmParameters(bgm) } else { this.stopBgm(); if(bgm.name) { this._bgmBuffer=this.createBuffer('bgm',bgm.name); this.updateBgmParameters(bgm); if(!this._meBuffer) { this._bgmBuffer.play(true,pos||0) } } } this.updateCurrentBgm(bgm,pos) }; AudioManager.replayBgm=function(bgm) { if(this.isCurrentBgm(bgm)) { this.updateBgmParameters(bgm) } else { this.playBgm(bgm,bgm.pos); if(this._bgmBuffer) { this._bgmBuffer.fadeIn(this._replayFadeTime) } } }; AudioManager.isCurrentBgm=function(bgm) { return(this._currentBgm&&this._bgmBuffer&&this._currentBgm.name===bgm.name) }; AudioManager.updateBgmParameters=function(bgm) { this.updateBufferParameters(this._bgmBuffer,this._bgmVolume,bgm) }; AudioManager.updateCurrentBgm=function(bgm,pos) { this._currentBgm= { name:bgm.name,volume:bgm.volume,pitch:bgm.pitch,pan:bgm.pan,pos:pos } }; AudioManager.stopBgm=function() { if(this._bgmBuffer) { this._bgmBuffer.stop(); this._bgmBuffer=null; this._currentBgm=null } }; AudioManager.fadeOutBgm=function(duration) { if(this._bgmBuffer&&this._currentBgm) { this._bgmBuffer.fadeOut(duration); this._currentBgm=null } }; AudioManager.fadeInBgm=function(duration) { if(this._bgmBuffer&&this._currentBgm) { this._bgmBuffer.fadeIn(duration) } }; AudioManager.playBgs=function(bgs,pos) { if(this.isCurrentBgs(bgs)) { this.updateBgsParameters(bgs) } else { this.stopBgs(); if(bgs.name) { this._bgsBuffer=this.createBuffer('bgs',bgs.name); this.updateBgsParameters(bgs); this._bgsBuffer.play(true,pos||0) } } this.updateCurrentBgs(bgs,pos) }; AudioManager.replayBgs=function(bgs) { if(this.isCurrentBgs(bgs)) { this.updateBgsParameters(bgs) } else { this.playBgs(bgs,bgs.pos); if(this._bgsBuffer) { this._bgsBuffer.fadeIn(this._replayFadeTime) } } }; AudioManager.isCurrentBgs=function(bgs) { return(this._currentBgs&&this._bgsBuffer&&this._currentBgs.name===bgs.name) }; AudioManager.updateBgsParameters=function(bgs) { this.updateBufferParameters(this._bgsBuffer,this._bgsVolume,bgs) }; AudioManager.updateCurrentBgs=function(bgs,pos) { this._currentBgs= { name:bgs.name,volume:bgs.volume,pitch:bgs.pitch,pan:bgs.pan,pos:pos } }; AudioManager.stopBgs=function() { if(this._bgsBuffer) { this._bgsBuffer.stop(); this._bgsBuffer=null; this._currentBgs=null } }; AudioManager.fadeOutBgs=function(duration) { if(this._bgsBuffer&&this._currentBgs) { this._bgsBuffer.fadeOut(duration); this._currentBgs=null } }; AudioManager.fadeInBgs=function(duration) { if(this._bgsBuffer&&this._currentBgs) { this._bgsBuffer.fadeIn(duration) } }; AudioManager.playMe=function(me) { this.stopMe(); if(me.name) { if(this._bgmBuffer&&this._currentBgm) { this._currentBgm.pos=this._bgmBuffer.seek(); this._bgmBuffer.stop() } this._meBuffer=this.createBuffer('me',me.name); this.updateMeParameters(me); this._meBuffer.play(false); this._meBuffer.addStopListener(this.stopMe.bind(this)) } }; AudioManager.updateMeParameters=function(me) { this.updateBufferParameters(this._meBuffer,this._meVolume,me) }; AudioManager.fadeOutMe=function(duration) { if(this._meBuffer) { this._meBuffer.fadeOut(duration) } }; AudioManager.stopMe=function() { if(this._meBuffer) { this._meBuffer.stop(); this._meBuffer=null; if(this._bgmBuffer&&this._currentBgm&&!this._bgmBuffer.isPlaying()) { this._bgmBuffer.play(true,this._currentBgm.pos); this._bgmBuffer.fadeIn(this._replayFadeTime) } } }; AudioManager.playSe=function(se) { if(se.name) { this._seBuffers=this._seBuffers.filter(function(audio) { return audio.isPlaying() } ); var buffer=this.createBuffer('se',se.name); this.updateSeParameters(buffer,se); buffer.play(false); this._seBuffers.push(buffer) } }; AudioManager.updateSeParameters=function(buffer,se) { this.updateBufferParameters(buffer,this._seVolume,se) }; AudioManager.stopSe=function() { this._seBuffers.forEach(function(buffer) { buffer.stop() } ); this._seBuffers=[] }; AudioManager.playStaticSe=function(se) { if(se.name) { this.loadStaticSe(se); for(var i=0; i<this._staticBuffers.length; i++) { var buffer=this._staticBuffers[i]; if(buffer._reservedSeName===se.name) { buffer.stop(); this.updateSeParameters(buffer,se); buffer.play(false); break } } } }; AudioManager.loadStaticSe=function(se) { if(se.name&&!this.isStaticSe(se)) { var buffer=this.createBuffer('se',se.name); buffer._reservedSeName=se.name; this._staticBuffers.push(buffer); if(this.shouldUseHtml5Audio()) { Html5Audio.setStaticSe(buffer._url) } } }; AudioManager.isStaticSe=function(se) { for(var i=0; i<this._staticBuffers.length; i++) { var buffer=this._staticBuffers[i]; if(buffer._reservedSeName===se.name) { return true } } return false }; AudioManager.stopAll=function() { this.stopMe(); this.stopBgm(); this.stopBgs(); this.stopSe() }; AudioManager.saveBgm=function() { if(this._currentBgm) { var bgm=this._currentBgm; return { name:bgm.name,volume:bgm.volume,pitch:bgm.pitch,pan:bgm.pan,pos:this._bgmBuffer?this._bgmBuffer.seek():0 } } else { return this.makeEmptyAudioObject() } }; AudioManager.saveBgs=function() { if(this._currentBgs) { var bgs=this._currentBgs; return { name:bgs.name,volume:bgs.volume,pitch:bgs.pitch,pan:bgs.pan,pos:this._bgsBuffer?this._bgsBuffer.seek():0 } } else { return this.makeEmptyAudioObject() } }; AudioManager.makeEmptyAudioObject=function() { return { name:'',volume:0,pitch:0 } }; AudioManager.createBuffer=function(folder,name) { var ext=this.audioFileExt(); var url=this._path+folder+'/'+encodeURIComponent(name)+ext; if(this.shouldUseHtml5Audio()&&folder==='bgm') { Html5Audio.setup(url); return Html5Audio } else { return new WebAudio(url) } }; AudioManager.updateBufferParameters=function(buffer,configVolume,audio) { if(buffer&&audio) { buffer.volume=configVolume*(audio.volume||0)/10000; buffer.pitch=(audio.pitch||0)/100; buffer.pan=(audio.pan||0)/100 } }; AudioManager.audioFileExt=function() { if(WebAudio.canPlayOgg()&&!Utils.isMobileDevice()) { return'.ogg' } else { return'.m4a' } }; AudioManager.shouldUseHtml5Audio=function() { return Utils.isAndroidChrome() }; AudioManager.checkErrors=function() { this.checkWebAudioError(this._bgmBuffer); this.checkWebAudioError(this._bgsBuffer); this.checkWebAudioError(this._meBuffer); this._seBuffers.forEach(function(buffer) { this.checkWebAudioError(buffer) } .bind(this)); this._staticBuffers.forEach(function(buffer) { this.checkWebAudioError(buffer) } .bind(this)) }; AudioManager.checkWebAudioError=function(webAudio) { if(webAudio&&webAudio.isError()) { throw new Error('Failed to load: '+webAudio.url) } }; function SoundManager() { throw new Error('This is a static class') } SoundManager.preloadImportantSounds=function() { this.loadSystemSound(0); this.loadSystemSound(1); this.loadSystemSound(2); this.loadSystemSound(3) }; SoundManager.loadSystemSound=function(n) { if($dataSystem) { AudioManager.loadStaticSe($dataSystem.sounds[n]) } }; SoundManager.playSystemSound=function(n) { if($dataSystem) { AudioManager.playStaticSe($dataSystem.sounds[n]) } }; SoundManager.playCursor=function() { this.playSystemSound(0) }; SoundManager.playOk=function() { this.playSystemSound(1) }; SoundManager.playCancel=function() { this.playSystemSound(2) }; SoundManager.playBuzzer=function() { this.playSystemSound(3) }; SoundManager.playEquip=function() { this.playSystemSound(4) }; SoundManager.playSave=function() { this.playSystemSound(5) }; SoundManager.playLoad=function() { this.playSystemSound(6) }; SoundManager.playBattleStart=function() { this.playSystemSound(7) }; SoundManager.playEscape=function() { this.playSystemSound(8) }; SoundManager.playEnemyAttack=function() { this.playSystemSound(9) }; SoundManager.playEnemyDamage=function() { this.playSystemSound(10) }; SoundManager.playEnemyCollapse=function() { this.playSystemSound(11) }; SoundManager.playBossCollapse1=function() { this.playSystemSound(12) }; SoundManager.playBossCollapse2=function() { this.playSystemSound(13) }; SoundManager.playActorDamage=function() { this.playSystemSound(14) }; SoundManager.playActorCollapse=function() { this.playSystemSound(15) }; SoundManager.playRecovery=function() { this.playSystemSound(16) }; SoundManager.playMiss=function() { this.playSystemSound(17) }; SoundManager.playEvasion=function() { this.playSystemSound(18) }; SoundManager.playMagicEvasion=function() { this.playSystemSound(19) }; SoundManager.playReflection=function() { this.playSystemSound(20) }; SoundManager.playShop=function() { this.playSystemSound(21) }; SoundManager.playUseItem=function() { this.playSystemSound(22) }; SoundManager.playUseSkill=function() { this.playSystemSound(23) }; function TextManager() { throw new Error('This is a static class') } TextManager.basic=function(basicId) { return $dataSystem.terms.basic[basicId]||'' }; TextManager.param=function(paramId) { return $dataSystem.terms.params[paramId]||'' }; TextManager.command=function(commandId) { return $dataSystem.terms.commands[commandId]||'' }; TextManager.message=function(messageId) { return $dataSystem.terms.messages[messageId]||'' }; TextManager.getter=function(method,param) { return { get:function() { return this[method](param) } ,configurable:true } }; Object.defineProperty(TextManager,'currencyUnit', { get:function() { return $dataSystem.currencyUnit } ,configurable:true } ); Object.defineProperties(TextManager, { level:TextManager.getter('basic',0),levelA:TextManager.getter('basic',1),hp:TextManager.getter('basic',2),hpA:TextManager.getter('basic',3),mp:TextManager.getter('basic',4),mpA:TextManager.getter('basic',5),tp:TextManager.getter('basic',6),tpA:TextManager.getter('basic',7),exp:TextManager.getter('basic',8),expA:TextManager.getter('basic',9),fight:TextManager.getter('command',0),escape:TextManager.getter('command',1),attack:TextManager.getter('command',2),guard:TextManager.getter('command',3),item:TextManager.getter('command',4),skill:TextManager.getter('command',5),equip:TextManager.getter('command',6),status:TextManager.getter('command',7),formation:TextManager.getter('command',8),save:TextManager.getter('command',9),gameEnd:TextManager.getter('command',10),options:TextManager.getter('command',11),weapon:TextManager.getter('command',12),armor:TextManager.getter('command',13),keyItem:TextManager.getter('command',14),equip2:TextManager.getter('command',15),optimize:TextManager.getter('command',16),clear:TextManager.getter('command',17),newGame:TextManager.getter('command',18),continue_:TextManager.getter('command',19),toTitle:TextManager.getter('command',21),cancel:TextManager.getter('command',22),buy:TextManager.getter('command',24),sell:TextManager.getter('command',25),alwaysDash:TextManager.getter('message','alwaysDash'),commandRemember:TextManager.getter('message','commandRemember'),bgmVolume:TextManager.getter('message','bgmVolume'),bgsVolume:TextManager.getter('message','bgsVolume'),meVolume:TextManager.getter('message','meVolume'),seVolume:TextManager.getter('message','seVolume'),possession:TextManager.getter('message','possession'),expTotal:TextManager.getter('message','expTotal'),expNext:TextManager.getter('message','expNext'),saveMessage:TextManager.getter('message','saveMessage'),loadMessage:TextManager.getter('message','loadMessage'),file:TextManager.getter('message','file'),partyName:TextManager.getter('message','partyName'),emerge:TextManager.getter('message','emerge'),preemptive:TextManager.getter('message','preemptive'),surprise:TextManager.getter('message','surprise'),escapeStart:TextManager.getter('message','escapeStart'),escapeFailure:TextManager.getter('message','escapeFailure'),victory:TextManager.getter('message','victory'),defeat:TextManager.getter('message','defeat'),obtainExp:TextManager.getter('message','obtainExp'),obtainGold:TextManager.getter('message','obtainGold'),obtainItem:TextManager.getter('message','obtainItem'),levelUp:TextManager.getter('message','levelUp'),obtainSkill:TextManager.getter('message','obtainSkill'),useItem:TextManager.getter('message','useItem'),criticalToEnemy:TextManager.getter('message','criticalToEnemy'),criticalToActor:TextManager.getter('message','criticalToActor'),actorDamage:TextManager.getter('message','actorDamage'),actorRecovery:TextManager.getter('message','actorRecovery'),actorGain:TextManager.getter('message','actorGain'),actorLoss:TextManager.getter('message','actorLoss'),actorDrain:TextManager.getter('message','actorDrain'),actorNoDamage:TextManager.getter('message','actorNoDamage'),actorNoHit:TextManager.getter('message','actorNoHit'),enemyDamage:TextManager.getter('message','enemyDamage'),enemyRecovery:TextManager.getter('message','enemyRecovery'),enemyGain:TextManager.getter('message','enemyGain'),enemyLoss:TextManager.getter('message','enemyLoss'),enemyDrain:TextManager.getter('message','enemyDrain'),enemyNoDamage:TextManager.getter('message','enemyNoDamage'),enemyNoHit:TextManager.getter('message','enemyNoHit'),evasion:TextManager.getter('message','evasion'),magicEvasion:TextManager.getter('message','magicEvasion'),magicReflection:TextManager.getter('message','magicReflection'),counterAttack:TextManager.getter('message','counterAttack'),substitute:TextManager.getter('message','substitute'),buffAdd:TextManager.getter('message','buffAdd'),debuffAdd:TextManager.getter('message','debuffAdd'),buffRemove:TextManager.getter('message','buffRemove'),actionFailure:TextManager.getter('message','actionFailure'), } ); function SceneManager() { throw new Error('This is a static class') } SceneManager._scene=null; SceneManager._nextScene=null; SceneManager._stack=[]; SceneManager._stopped=false; SceneManager._sceneStarted=false; SceneManager._exiting=false; SceneManager._previousClass=null; SceneManager._backgroundBitmap=null; SceneManager._screenWidth=816; SceneManager._screenHeight=624; SceneManager._boxWidth=816; SceneManager._boxHeight=624; SceneManager.run=function(sceneClass) { try { this.initialize(); this.goto(sceneClass); this.requestUpdate() } catch(e) { this.catchException(e) } }; SceneManager.initialize=function() { this.initGraphics(); this.checkFileAccess(); this.initAudio(); this.initInput(); this.initNwjs(); this.checkPluginErrors(); this.setupErrorHandlers() }; SceneManager.initGraphics=function() { var type=this.preferableRendererType(); Graphics.initialize(this._screenWidth,this._screenHeight,type); Graphics.boxWidth=this._boxWidth; Graphics.boxHeight=this._boxHeight; Graphics.setLoadingImage('img/system/Loading.png'); if(Utils.isOptionValid('showfps')) { Graphics.showFps() } if(type==='webgl') { this.checkWebGL() } }; SceneManager.preferableRendererType=function() { if(Utils.isOptionValid('canvas')) { return'canvas' } else if(Utils.isOptionValid('webgl')) { return'webgl' } else if(this.shouldUseCanvasRenderer()) { return'canvas' } else { return'auto' } }; SceneManager.shouldUseCanvasRenderer=function() { return Utils.isMobileDevice() }; SceneManager.checkWebGL=function() { if(!Graphics.hasWebGL()) { throw new Error('Your browser does not support WebGL.') } }; SceneManager.checkFileAccess=function() { if(!Utils.canReadGameFiles()) { throw new Error('Your browser does not allow to read local files.') } }; SceneManager.initAudio=function() { var noAudio=Utils.isOptionValid('noaudio'); if(!WebAudio.initialize(noAudio)&&!noAudio) { throw new Error('Your browser does not support Web Audio API.') } }; SceneManager.initInput=function() { Input.initialize(); TouchInput.initialize() }; SceneManager.initNwjs=function() { if(Utils.isNwjs()) { var gui=require('nw.gui'); var win=gui.Window.get(); if(process.platform==='darwin'&&!win.menu) { var menubar=new gui.Menu( { type:'menubar' } ); var option= { hideEdit:true,hideWindow:true }; menubar.createMacBuiltin('Game',option); win.menu=menubar } } }; SceneManager.checkPluginErrors=function() { PluginManager.checkErrors() }; SceneManager.setupErrorHandlers=function() { window.addEventListener('error',this.onError.bind(this)); document.addEventListener('keydown',this.onKeyDown.bind(this)) }; SceneManager.requestUpdate=function() { if(!this._stopped) { requestAnimationFrame(this.update.bind(this)) } }; SceneManager.update=function() { try { this.tickStart(); this.updateInputData(); this.updateMain(); this.tickEnd() } catch(e) { this.catchException(e) } }; SceneManager.terminate=function() { window.close() }; SceneManager.onError=function(e) { console.error(e.message); console.error(e.filename,e.lineno); try { this.stop(); Graphics.printError('Error',e.message); AudioManager.stopAll() } catch(e2) { } }; SceneManager.onKeyDown=function(event) { if(!event.ctrlKey&&!event.altKey) { switch(event.keyCode) { case 116:if(Utils.isNwjs()) { location.reload() } break; case 119:if(Utils.isNwjs()&&Utils.isOptionValid('test')) { require('nw.gui').Window.get().showDevTools() } break } } }; SceneManager.catchException=function(e) { if(e instanceof Error) { Graphics.printError(e.name,e.message); console.error(e.stack) } else { Graphics.printError('UnknownError',e) } AudioManager.stopAll(); this.stop() }; SceneManager.tickStart=function() { Graphics.tickStart() }; SceneManager.tickEnd=function() { Graphics.tickEnd() }; SceneManager.updateInputData=function() { Input.update(); TouchInput.update() }; SceneManager.updateMain=function() { this.changeScene(); this.updateScene(); this.renderScene(); this.requestUpdate() }; SceneManager.changeScene=function() { if(this.isSceneChanging()&&!this.isCurrentSceneBusy()) { if(this._scene) { this._scene.terminate(); this._previousClass=this._scene.constructor } this._scene=this._nextScene; if(this._scene) { this._scene.create(); this._nextScene=null; this._sceneStarted=false; this.onSceneCreate() } if(this._exiting) { this.terminate() } } }; SceneManager.updateScene=function() { if(this._scene) { if(!this._sceneStarted&&this._scene.isReady()) { this._scene.start(); this._sceneStarted=true; this.onSceneStart() } if(this.isCurrentSceneStarted()) { this._scene.update() } } }; SceneManager.renderScene=function() { if(this.isCurrentSceneStarted()) { Graphics.render(this._scene) } else if(this._scene) { this.onSceneLoading() } }; SceneManager.onSceneCreate=function() { Graphics.startLoading() }; SceneManager.onSceneStart=function() { Graphics.endLoading() }; SceneManager.onSceneLoading=function() { Graphics.updateLoading() }; SceneManager.isSceneChanging=function() { return this._exiting||!!this._nextScene }; SceneManager.isCurrentSceneBusy=function() { return this._scene&&this._scene.isBusy() }; SceneManager.isCurrentSceneStarted=function() { return this._scene&&this._sceneStarted }; SceneManager.isNextScene=function(sceneClass) { return this._nextScene&&this._nextScene.constructor===sceneClass }; SceneManager.isPreviousScene=function(sceneClass) { return this._previousClass===sceneClass }; SceneManager.goto=function(sceneClass) { if(sceneClass) { this._nextScene=new sceneClass() } if(this._scene) { this._scene.stop() } }; SceneManager.push=function(sceneClass) { this._stack.push(this._scene.constructor); this.goto(sceneClass) }; SceneManager.pop=function() { if(this._stack.length>0) { this.goto(this._stack.pop()) } else { this.exit() } }; SceneManager.exit=function() { this.goto(null); this._exiting=true }; SceneManager.clearStack=function() { this._stack=[] }; SceneManager.stop=function() { this._stopped=true }; SceneManager.prepareNextScene=function() { this._nextScene.prepare.apply(this._nextScene,arguments) }; SceneManager.snap=function() { return Bitmap.snap(this._scene) }; SceneManager.snapForBackground=function() { this._backgroundBitmap=this.snap(); this._backgroundBitmap.blur() }; SceneManager.backgroundBitmap=function() { return this._backgroundBitmap }; function BattleManager() { throw new Error('This is a static class') } BattleManager.setup=function(troopId,canEscape,canLose) { this.initMembers(); this._canEscape=canEscape; this._canLose=canLose; $gameTroop.setup(troopId); $gameScreen.onBattleStart(); this.makeEscapeRatio() }; BattleManager.initMembers=function() { this._phase='init'; this._canEscape=false; this._canLose=false; this._battleTest=false; this._eventCallback=null; this._preemptive=false; this._surprise=false; this._actorIndex=-1; this._actionForcedBattler=null; this._mapBgm=null; this._mapBgs=null; this._actionBattlers=[]; this._subject=null; this._action=null; this._targets=[]; this._logWindow=null; this._statusWindow=null; this._spriteset=null; this._escapeRatio=0; this._escaped=false; this._rewards= { } }; BattleManager.isBattleTest=function() { return this._battleTest }; BattleManager.setBattleTest=function(battleTest) { this._battleTest=battleTest }; BattleManager.setEventCallback=function(callback) { this._eventCallback=callback }; BattleManager.setLogWindow=function(logWindow) { this._logWindow=logWindow }; BattleManager.setStatusWindow=function(statusWindow) { this._statusWindow=statusWindow }; BattleManager.setSpriteset=function(spriteset) { this._spriteset=spriteset }; BattleManager.onEncounter=function() { this._preemptive=(Math.random()<this.ratePreemptive()); this._surprise=(Math.random()<this.rateSurprise()&&!this._preemptive) }; BattleManager.ratePreemptive=function() { return $gameParty.ratePreemptive($gameTroop.agility()) }; BattleManager.rateSurprise=function() { return $gameParty.rateSurprise($gameTroop.agility()) }; BattleManager.saveBgmAndBgs=function() { this._mapBgm=AudioManager.saveBgm(); this._mapBgs=AudioManager.saveBgs() }; BattleManager.playBattleBgm=function() { AudioManager.playBgm($gameSystem.battleBgm()); AudioManager.stopBgs() }; BattleManager.playVictoryMe=function() { AudioManager.playMe($gameSystem.victoryMe()) }; BattleManager.playDefeatMe=function() { AudioManager.playMe($gameSystem.defeatMe()) }; BattleManager.replayBgmAndBgs=function() { if(this._mapBgm) { AudioManager.replayBgm(this._mapBgm) } else { AudioManager.stopBgm() } if(this._mapBgs) { AudioManager.replayBgs(this._mapBgs) } }; BattleManager.makeEscapeRatio=function() { this._escapeRatio=0.5*$gameParty.agility()/$gameTroop.agility() }; BattleManager.update=function() { if(!this.isBusy()&&!this.updateEvent()) { switch(this._phase) { case'start':this.startInput(); break; case'turn':this.updateTurn(); break; case'action':this.updateAction(); break; case'turnEnd':this.updateTurnEnd(); break; case'battleEnd':this.updateBattleEnd(); break } } }; BattleManager.updateEvent=function() { switch(this._phase) { case'start':case'turn':case'turnEnd':if(this.isActionForced()) { this.processForcedAction(); return true } else { return this.updateEventMain() } } return this.checkAbort() }; BattleManager.updateEventMain=function() { $gameTroop.updateInterpreter(); $gameParty.requestMotionRefresh(); if($gameTroop.isEventRunning()||this.checkBattleEnd()) { return true } $gameTroop.setupBattleEvent(); if($gameTroop.isEventRunning()||SceneManager.isSceneChanging()) { return true } return false }; BattleManager.isBusy=function() { return($gameMessage.isBusy()||this._spriteset.isBusy()||this._logWindow.isBusy()) }; BattleManager.isInputting=function() { return this._phase==='input' }; BattleManager.isInTurn=function() { return this._phase==='turn' }; BattleManager.isTurnEnd=function() { return this._phase==='turnEnd' }; BattleManager.isAborting=function() { return this._phase==='aborting' }; BattleManager.isBattleEnd=function() { return this._phase==='battleEnd' }; BattleManager.canEscape=function() { return this._canEscape }; BattleManager.canLose=function() { return this._canLose }; BattleManager.isEscaped=function() { return this._escaped }; BattleManager.actor=function() { return this._actorIndex>=0?$gameParty.members()[this._actorIndex]:null }; BattleManager.clearActor=function() { this.changeActor(-1,'') }; BattleManager.changeActor=function(newActorIndex,lastActorActionState) { var lastActor=this.actor(); this._actorIndex=newActorIndex; var newActor=this.actor(); if(lastActor) { lastActor.setActionState(lastActorActionState) } if(newActor) { newActor.setActionState('inputting') } }; BattleManager.startBattle=function() { this._phase='start'; $gameSystem.onBattleStart(); $gameParty.onBattleStart(); $gameTroop.onBattleStart(); this.displayStartMessages() }; BattleManager.displayStartMessages=function() { $gameTroop.enemyNames().forEach(function(name) { $gameMessage.add(TextManager.emerge.format(name)) } ); if(this._preemptive) { $gameMessage.add(TextManager.preemptive.format($gameParty.name())) } else if(this._surprise) { $gameMessage.add(TextManager.surprise.format($gameParty.name())) } }; BattleManager.startInput=function() { this._phase='input'; $gameParty.makeActions(); $gameTroop.makeActions(); this.clearActor(); if(this._surprise||!$gameParty.canInput()) { this.startTurn() } }; BattleManager.inputtingAction=function() { return this.actor()?this.actor().inputtingAction():null }; BattleManager.selectNextCommand=function() { do { if(!this.actor()||!this.actor().selectNextCommand()) { this.changeActor(this._actorIndex+1,'waiting'); if(this._actorIndex>=$gameParty.size()) { this.startTurn(); break } } } while(!this.actor().canInput()) }; BattleManager.selectPreviousCommand=function() { do { if(!this.actor()||!this.actor().selectPreviousCommand()) { this.changeActor(this._actorIndex-1,'undecided'); if(this._actorIndex<0) { return } } } while(!this.actor().canInput()) }; BattleManager.refreshStatus=function() { this._statusWindow.refresh() }; BattleManager.startTurn=function() { this._phase='turn'; this.clearActor(); $gameTroop.increaseTurn(); this.makeActionOrders(); $gameParty.requestMotionRefresh(); this._logWindow.startTurn(); this._subject=this.getNextSubject() }; BattleManager.updateTurn=function() { $gameParty.requestMotionRefresh(); if(this._subject) { this.processTurn() } else { this.endTurn() } }; BattleManager.processTurn=function() { var subject=this._subject; var action=subject.currentAction(); if(action) { action.prepare(); if(action.isValid()) { this.startAction() } subject.removeCurrentAction() } else { subject.onAllActionsEnd(); this.refreshStatus(); this._logWindow.displayAutoAffectedStatus(subject); this._logWindow.displayCurrentState(subject); this._logWindow.displayRegeneration(subject); this._subject=this.getNextSubject() } }; BattleManager.endTurn=function() { this._phase='turnEnd'; this._preemptive=false; this._surprise=false; this.allBattleMembers().forEach(function(battler) { battler.onTurnEnd(); this.refreshStatus(); this._logWindow.displayAutoAffectedStatus(battler); this._logWindow.displayRegeneration(battler) } ,this) }; BattleManager.updateTurnEnd=function() { this.startInput() }; BattleManager.getNextSubject=function() { for(;; ) { var battler=this._actionBattlers.shift(); if(!battler) { return null } if(battler.isBattleMember()&&battler.isAlive()) { return battler } } }; BattleManager.allBattleMembers=function() { return $gameParty.members().concat($gameTroop.members()) }; BattleManager.makeActionOrders=function() { var battlers=[]; if(!this._surprise) { battlers=battlers.concat($gameParty.members()) } if(!this._preemptive) { battlers=battlers.concat($gameTroop.members()) } battlers.forEach(function(battler) { battler.makeSpeed() } ); battlers.sort(function(a, { return b.speed()-a.speed() } ); this._actionBattlers=battlers }; BattleManager.startAction=function() { var subject=this._subject; var action=subject.currentAction(); var targets=action.makeTargets(); this._phase='action'; this._action=action; this._targets=targets; subject.useItem(action.item()); this._action.applyGlobal(); this.refreshStatus(); this._logWindow.startAction(subject,action,targets) }; BattleManager.updateAction=function() { var target=this._targets.shift(); if(target) { this.invokeAction(this._subject,target) } else { this.endAction() } }; BattleManager.endAction=function() { this._logWindow.endAction(this._subject); this._phase='turn' }; BattleManager.invokeAction=function(subject,target) { this._logWindow.push('pushBaseLine'); if(Math.random()<this._action.itemCnt(target)) { this.invokeCounterAttack(subject,target) } else if(Math.random()<this._action.itemMrf(target)) { this.invokeMagicReflection(subject,target) } else { this.invokeNormalAction(subject,target) } subject.setLastTarget(target); this._logWindow.push('popBaseLine'); this.refreshStatus() }; BattleManager.invokeNormalAction=function(subject,target) { var realTarget=this.applySubstitute(target); this._action.apply(realTarget); this._logWindow.displayActionResults(subject,realTarget) }; BattleManager.invokeCounterAttack=function(subject,target) { var action=new Game_Action(target); action.setAttack(); action.apply(subject); this._logWindow.displayCounter(target); this._logWindow.displayActionResults(subject,subject) }; BattleManager.invokeMagicReflection=function(subject,target) { this._logWindow.displayReflection(target); this._action.apply(subject); this._logWindow.displayActionResults(subject,subject) }; BattleManager.applySubstitute=function(target) { if(this.checkSubstitute(target)) { var substitute=target.friendsUnit().substituteBattler(); if(substitute&&target!==substitute) { this._logWindow.displaySubstitute(substitute,target); return substitute } } return target }; BattleManager.checkSubstitute=function(target) { return target.isDying()&&!this._action.isCertainHit() }; BattleManager.isActionForced=function() { return!!this._actionForcedBattler }; BattleManager.forceAction=function(battler) { this._actionForcedBattler=battler; var index=this._actionBattlers.indexOf(battler); if(index>=0) { this._actionBattlers.splice(index,1) } }; BattleManager.processForcedAction=function() { if(this._actionForcedBattler) { this._subject=this._actionForcedBattler; this._actionForcedBattler=null; this.startAction(); this._subject.removeCurrentAction() } }; BattleManager.abort=function() { this._phase='aborting' }; BattleManager.checkBattleEnd=function() { if(this._phase) { if(this.checkAbort()) { return true } else if($gameParty.isAllDead()) { this.processDefeat(); return true } else if($gameTroop.isAllDead()) { this.processVictory(); return true } } return false }; BattleManager.checkAbort=function() { if($gameParty.isEmpty()||this.isAborting()) { this.processAbort(); return true } return false }; BattleManager.processVictory=function() { $gameParty.removeBattleStates(); $gameParty.performVictory(); this.playVictoryMe(); this.replayBgmAndBgs(); this.makeRewards(); this.displayVictoryMessage(); this.displayRewards(); this.gainRewards(); this.endBattle(0) }; BattleManager.processEscape=function() { $gameParty.removeBattleStates(); $gameParty.performEscape(); SoundManager.playEscape(); var success=this._preemptive?true:(Math.random()<this._escapeRatio); if(success) { this.displayEscapeSuccessMessage(); this._escaped=true; this.processAbort() } else { this.displayEscapeFailureMessage(); this._escapeRatio+=0.1; $gameParty.clearActions(); this.startTurn() } return success }; BattleManager.processAbort=function() { this.replayBgmAndBgs(); this.endBattle(1) }; BattleManager.processDefeat=function() { this.displayDefeatMessage(); this.playDefeatMe(); if(this._canLose) { this.replayBgmAndBgs() } else { AudioManager.stopBgm() } this.endBattle(2) }; BattleManager.endBattle=function(result) { this._phase='battleEnd'; if(this._eventCallback) { this._eventCallback(result) } if(result===0) { $gameSystem.onBattleWin() } else if(this._escaped) { $gameSystem.onBattleEscape() } }; BattleManager.updateBattleEnd=function() { if(this.isBattleTest()) { AudioManager.stopBgm(); SceneManager.exit() } else if($gameParty.isAllDead()) { if(this._canLose) { $gameParty.reviveBattleMembers(); SceneManager.pop() } else { SceneManager.goto(Scene_Gameover) } } else { SceneManager.pop() } this._phase=null }; BattleManager.makeRewards=function() { this._rewards= { }; this._rewards.gold=$gameTroop.goldTotal(); this._rewards.exp=$gameTroop.expTotal(); this._rewards.items=$gameTroop.makeDropItems() }; BattleManager.displayVictoryMessage=function() { $gameMessage.add(TextManager.victory.format($gameParty.name())) }; BattleManager.displayDefeatMessage=function() { $gameMessage.add(TextManager.defeat.format($gameParty.name())) }; BattleManager.displayEscapeSuccessMessage=function() { $gameMessage.add(TextManager.escapeStart.format($gameParty.name())) }; BattleManager.displayEscapeFailureMessage=function() { $gameMessage.add(TextManager.escapeStart.format($gameParty.name())); $gameMessage.add('\\.'+TextManager.escapeFailure) }; BattleManager.displayRewards=function() { this.displayExp(); this.displayGold(); this.displayDropItems() }; BattleManager.displayExp=function() { var exp=this._rewards.exp; if(exp>0) { var text=TextManager.obtainExp.format(exp,TextManager.exp); $gameMessage.add('\\.'+text) } }; BattleManager.displayGold=function() { var gold=this._rewards.gold; if(gold>0) { $gameMessage.add('\\.'+TextManager.obtainGold.format(gold)) } }; BattleManager.displayDropItems=function() { var items=this._rewards.items; if(items.length>0) { $gameMessage.newPage(); items.forEach(function(item) { $gameMessage.add(TextManager.obtainItem.format(item.name)) } ) } }; BattleManager.gainRewards=function() { this.gainExp(); this.gainGold(); this.gainDropItems() }; BattleManager.gainExp=function() { var exp=this._rewards.exp; $gameParty.allMembers().forEach(function(actor) { actor.gainExp(exp) } ) }; BattleManager.gainGold=function() { $gameParty.gainGold(this._rewards.gold) }; BattleManager.gainDropItems=function() { var items=this._rewards.items; items.forEach(function(item) { $gameParty.gainItem(item,1) } ) }; function PluginManager() { throw new Error('This is a static class') } PluginManager._path='js/plugins/'; PluginManager._scripts=[]; PluginManager._errorUrls=[]; PluginManager._parameters= { }; PluginManager.setup=function(plugins) { plugins.forEach(function(plugin) { if(plugin.status&&!this._scripts.contains(plugin.name)) { this.setParameters(plugin.name,plugin.parameters); this.loadScript(plugin.name+'.js'); this._scripts.push(plugin.name) } } ,this) }; PluginManager.checkErrors=function() { var url=this._errorUrls.shift(); if(url) { throw new Error('Failed to load: '+url) } }; PluginManager.parameters=function(name) { return this._parameters[name.toLowerCase()]|| { } }; PluginManager.setParameters=function(name,parameters) { this._parameters[name.toLowerCase()]=parameters }; PluginManager.loadScript=function(name) { var url=this._path+name; var script=document.createElement('script'); script.type='text/javascript'; script.src=url; script.async=false; script.onerror=this.onError.bind(this); script._url=url; document.body.appendChild(script) }; PluginManager.onError=function(e) { this._errorUrls.push(e.target._url) }; rpg_windows.js function Window_Base() { this.initialize.apply(this,arguments) } Window_Base.prototype=Object.create(Window.prototype); Window_Base.prototype.constructor=Window_Base; Window_Base.prototype.initialize=function(x,y,width,height) { Window.prototype.initialize.call(this); this.loadWindowskin(); this.move(x,y,width,height); this.updatePadding(); this.updateBackOpacity(); this.updateTone(); this.createContents(); this._opening=false; this._closing=false; this._dimmerSprite=null }; Window_Base._iconWidth=32; Window_Base._iconHeight=32; Window_Base._faceWidth=144; Window_Base._faceHeight=144; Window_Base.prototype.lineHeight=function() { return 36 }; Window_Base.prototype.standardFontFace=function() { if($gameSystem.isChinese()) { return'SimHei, Heiti TC, sans-serif' } else if($gameSystem.isKorean()) { return'Dotum, AppleGothic, sans-serif' } else { return'GameFont' } }; Window_Base.prototype.standardFontSize=function() { return 28 }; Window_Base.prototype.standardPadding=function() { return 18 }; Window_Base.prototype.textPadding=function() { return 6 }; Window_Base.prototype.standardBackOpacity=function() { return 192 }; Window_Base.prototype.loadWindowskin=function() { this.windowskin=ImageManager.loadSystem('Window') }; Window_Base.prototype.updatePadding=function() { this.padding=this.standardPadding() }; Window_Base.prototype.updateBackOpacity=function() { this.backOpacity=this.standardBackOpacity() }; Window_Base.prototype.contentsWidth=function() { return this.width-this.standardPadding()*2 }; Window_Base.prototype.contentsHeight=function() { return this.height-this.standardPadding()*2 }; Window_Base.prototype.fittingHeight=function(numLines) { return numLines*this.lineHeight()+this.standardPadding()*2 }; Window_Base.prototype.updateTone=function() { var tone=$gameSystem.windowTone(); this.setTone(tone[0],tone[1],tone[2]) }; Window_Base.prototype.createContents=function() { this.contents=new Bitmap(this.contentsWidth(),this.contentsHeight()); this.resetFontSettings() }; Window_Base.prototype.resetFontSettings=function() { this.contents.fontFace=this.standardFontFace(); this.contents.fontSize=this.standardFontSize(); this.resetTextColor() }; Window_Base.prototype.resetTextColor=function() { this.changeTextColor(this.normalColor()) }; Window_Base.prototype.update=function() { Window.prototype.update.call(this); this.updateTone(); this.updateOpen(); this.updateClose(); this.updateBackgroundDimmer() }; Window_Base.prototype.updateOpen=function() { if(this._opening) { this.openness+=32; if(this.isOpen()) { this._opening=false } } }; Window_Base.prototype.updateClose=function() { if(this._closing) { this.openness-=32; if(this.isClosed()) { this._closing=false } } }; Window_Base.prototype.open=function() { if(!this.isOpen()) { this._opening=true } this._closing=false }; Window_Base.prototype.close=function() { if(!this.isClosed()) { this._closing=true } this._opening=false }; Window_Base.prototype.isOpening=function() { return this._opening }; Window_Base.prototype.isClosing=function() { return this._closing }; Window_Base.prototype.show=function() { this.visible=true }; Window_Base.prototype.hide=function() { this.visible=false }; Window_Base.prototype.activate=function() { this.active=true }; Window_Base.prototype.deactivate=function() { this.active=false }; Window_Base.prototype.textColor=function(n) { var px=96+(n%8)*12+6; var py=144+Math.floor(n/8)*12+6; return this.windowskin.getPixel(px,py) }; Window_Base.prototype.normalColor=function() { return this.textColor(0) }; Window_Base.prototype.systemColor=function() { return this.textColor(16) }; Window_Base.prototype.crisisColor=function() { return this.textColor(17) }; Window_Base.prototype.deathColor=function() { return this.textColor(18) }; Window_Base.prototype.gaugeBackColor=function() { return this.textColor(19) }; Window_Base.prototype.hpGaugeColor1=function() { return this.textColor(20) }; Window_Base.prototype.hpGaugeColor2=function() { return this.textColor(21) }; Window_Base.prototype.mpGaugeColor1=function() { return this.textColor(22) }; Window_Base.prototype.mpGaugeColor2=function() { return this.textColor(23) }; Window_Base.prototype.mpCostColor=function() { return this.textColor(23) }; Window_Base.prototype.powerUpColor=function() { return this.textColor(24) }; Window_Base.prototype.powerDownColor=function() { return this.textColor(25) }; Window_Base.prototype.tpGaugeColor1=function() { return this.textColor(28) }; Window_Base.prototype.tpGaugeColor2=function() { return this.textColor(29) }; Window_Base.prototype.tpCostColor=function() { return this.textColor(29) }; Window_Base.prototype.pendingColor=function() { return this.windowskin.getPixel(120,120) }; Window_Base.prototype.translucentOpacity=function() { return 160 }; Window_Base.prototype.changeTextColor=function(color) { this.contents.textColor=color }; Window_Base.prototype.changePaintOpacity=function(enabled) { this.contents.paintOpacity=enabled?255:this.translucentOpacity() }; Window_Base.prototype.drawText=function(text,x,y,maxWidth,align) { this.contents.drawText(text,x,y,maxWidth,this.lineHeight(),align) }; Window_Base.prototype.textWidth=function(text) { return this.contents.measureTextWidth(text) }; Window_Base.prototype.drawTextEx=function(text,x,y) { if(text) { var textState= { index:0,x:x,y:y,left:x }; textState.text=this.convertEscapeCharacters(text); textState.height=this.calcTextHeight(textState,false); this.resetFontSettings(); while(textState.index<textState.text.length) { this.processCharacter(textState) } return textState.x-x } else { return 0 } }; Window_Base.prototype.convertEscapeCharacters=function(text) { text=text.replace(/\\/g,'\x1b'); text=text.replace(/\x1b\x1b/g,'\\'); text=text.replace(/\x1bV\[(\d+)\]/gi,function() { return $gameVariables.value(parseInt(arguments[1])) } .bind(this)); text=text.replace(/\x1bV\[(\d+)\]/gi,function() { return $gameVariables.value(parseInt(arguments[1])) } .bind(this)); text=text.replace(/\x1bN\[(\d+)\]/gi,function() { return this.actorName(parseInt(arguments[1])) } .bind(this)); text=text.replace(/\x1bP\[(\d+)\]/gi,function() { return this.partyMemberName(parseInt(arguments[1])) } .bind(this)); text=text.replace(/\x1bG/gi,TextManager.currencyUnit); return text }; Window_Base.prototype.actorName=function(n) { var actor=n>=1?$gameActors.actor(n):null; return actor?actor.name():'' }; Window_Base.prototype.partyMemberName=function(n) { var actor=n>=1?$gameParty.members()[n-1]:null; return actor?actor.name():'' }; Window_Base.prototype.processCharacter=function(textState) { switch(textState.text[textState.index]) { case'\n':this.processNewLine(textState); break; case'\f':this.processNewPage(textState); break; case'\x1b':this.processEscapeCharacter(this.obtainEscapeCode(textState),textState); break; default:this.processNormalCharacter(textState); break } }; Window_Base.prototype.processNormalCharacter=function(textState) { var c=textState.text[textState.index++]; var w=this.textWidth(c); this.contents.drawText(c,textState.x,textState.y,w*2,textState.height); textState.x+=w }; Window_Base.prototype.processNewLine=function(textState) { textState.x=textState.left; textState.y+=textState.height; textState.height=this.calcTextHeight(textState,false); textState.index++ }; Window_Base.prototype.processNewPage=function(textState) { textState.index++ }; Window_Base.prototype.obtainEscapeCode=function(textState) { textState.index++; var regExp=/^[\$\.\|\^!><\ { \ } \\]|^[A-Z]+/i; var arr=regExp.exec(textState.text.slice(textState.index)); if(arr) { textState.index+=arr[0].length; return arr[0].toUpperCase() } else { return'' } }; Window_Base.prototype.obtainEscapeParam=function(textState) { var arr=/^\[\d+\]/.exec(textState.text.slice(textState.index)); if(arr) { textState.index+=arr[0].length; return parseInt(arr[0].slice(1)) } else { return'' } }; Window_Base.prototype.processEscapeCharacter=function(code,textState) { switch(code) { case'C':this.changeTextColor(this.textColor(this.obtainEscapeParam(textState))); break; case'I':this.processDrawIcon(this.obtainEscapeParam(textState),textState); break; case' { ':this.makeFontBigger(); break; case' } ':this.makeFontSmaller(); break } }; Window_Base.prototype.processDrawIcon=function(iconIndex,textState) { this.drawIcon(iconIndex,textState.x+2,textState.y+2); textState.x+=Window_Base._iconWidth+4 }; Window_Base.prototype.makeFontBigger=function() { if(this.contents.fontSize<=96) { this.contents.fontSize+=12 } }; Window_Base.prototype.makeFontSmaller=function() { if(this.contents.fontSize>=24) { this.contents.fontSize-=12 } }; Window_Base.prototype.calcTextHeight=function(textState,all) { var lastFontSize=this.contents.fontSize; var textHeight=0; var lines=textState.text.slice(textState.index).split('\n'); var maxLines=all?lines.length:1; for(var i=0; i<maxLines; i++) { var maxFontSize=this.contents.fontSize; var regExp=/\x1b[\ { \ } ]/g; for(;; ) { var array=regExp.exec(lines[i]); if(array) { if(array[0]==='\x1b { ') { this.makeFontBigger() } if(array[0]==='\x1b } ') { this.makeFontSmaller() } if(maxFontSize<this.contents.fontSize) { maxFontSize=this.contents.fontSize } } else { break } } textHeight+=maxFontSize+8 } this.contents.fontSize=lastFontSize; return textHeight }; Window_Base.prototype.drawIcon=function(iconIndex,x,y) { var bitmap=ImageManager.loadSystem('IconSet'); var pw=Window_Base._iconWidth; var ph=Window_Base._iconHeight; var sx=iconIndex%16*pw; var sy=Math.floor(iconIndex/16)*ph; this.contents.blt(bitmap,sx,sy,pw,ph,x,y) }; Window_Base.prototype.drawFace=function(faceName,faceIndex,x,y,width,height) { width=width||Window_Base._faceWidth; height=height||Window_Base._faceHeight; var bitmap=ImageManager.loadFace(faceName); var pw=Window_Base._faceWidth; var ph=Window_Base._faceHeight; var sw=Math.min(width,pw); var sh=Math.min(height,ph); var dx=Math.floor(x+Math.max(width-pw,0)/2); var dy=Math.floor(y+Math.max(height-ph,0)/2); var sx=faceIndex%4*pw+(pw-sw)/2; var sy=Math.floor(faceIndex/4)*ph+(ph-sh)/2; this.contents.blt(bitmap,sx,sy,sw,sh,dx,dy) }; Window_Base.prototype.drawCharacter=function(characterName,characterIndex,x,y) { var bitmap=ImageManager.loadCharacter(characterName); var big=ImageManager.isBigCharacter(characterName); var pw=bitmap.width/(big?3:12); var ph=bitmap.height/(big?4:8); var n=characterIndex; var sx=(n%4*3+1)*pw; var sy=(Math.floor(n/4)*4)*ph; this.contents.blt(bitmap,sx,sy,pw,ph,x-pw/2,y-ph) }; Window_Base.prototype.drawGauge=function(x,y,width,rate,color1,color2) { var fillW=Math.floor(width*rate); var gaugeY=y+this.lineHeight()-8; this.contents.fillRect(x,gaugeY,width,6,this.gaugeBackColor()); this.contents.gradientFillRect(x,gaugeY,fillW,6,color1,color2) }; Window_Base.prototype.hpColor=function(actor) { if(actor.isDead()) { return this.deathColor() } else if(actor.isDying()) { return this.crisisColor() } else { return this.normalColor() } }; Window_Base.prototype.mpColor=function(actor) { return this.normalColor() }; Window_Base.prototype.tpColor=function(actor) { return this.normalColor() }; Window_Base.prototype.drawActorCharacter=function(actor,x,y) { this.drawCharacter(actor.characterName(),actor.characterIndex(),x,y) }; Window_Base.prototype.drawActorFace=function(actor,x,y,width,height) { this.drawFace(actor.faceName(),actor.faceIndex(),x,y,width,height) }; Window_Base.prototype.drawActorName=function(actor,x,y,width) { width=width||168; this.changeTextColor(this.hpColor(actor)); this.drawText(actor.name(),x,y,width) }; Window_Base.prototype.drawActorClass=function(actor,x,y,width) { width=width||168; this.resetTextColor(); this.drawText(actor.currentClass().name,x,y,width) }; Window_Base.prototype.drawActorNickname=function(actor,x,y,width) { width=width||270; this.resetTextColor(); this.drawText(actor.nickname(),x,y,width) }; Window_Base.prototype.drawActorLevel=function(actor,x,y) { this.changeTextColor(this.systemColor()); this.drawText(TextManager.levelA,x,y,48); this.resetTextColor(); this.drawText(actor.level,x+84,y,36,'right') }; Window_Base.prototype.drawActorIcons=function(actor,x,y,width) { width=width||144; var icons=actor.allIcons().slice(0,Math.floor(width/Window_Base._iconWidth)); for(var i=0; i<icons.length; i++) { this.drawIcon(icons[i],x+Window_Base._iconWidth*i,y+2) } }; Window_Base.prototype.drawCurrentAndMax=function(current,max,x,y,width,color1,color2) { var labelWidth=this.textWidth('HP'); var valueWidth=this.textWidth('0000'); var slashWidth=this.textWidth('/'); var x1=x+width-valueWidth; var x2=x1-slashWidth; var =x2-valueWidth; if(>=x+labelWidth) { this.changeTextColor(color1); this.drawText(current,,y,valueWidth,'right'); this.changeTextColor(color2); this.drawText('/',x2,y,slashWidth,'right'); this.drawText(max,x1,y,valueWidth,'right') } else { this.changeTextColor(color1); this.drawText(current,x1,y,valueWidth,'right') } }; Window_Base.prototype.drawActorHp=function(actor,x,y,width) { width=width||186; var color1=this.hpGaugeColor1(); var color2=this.hpGaugeColor2(); this.drawGauge(x,y,width,actor.hpRate(),color1,color2); this.changeTextColor(this.systemColor()); this.drawText(TextManager.hpA,x,y,44); this.drawCurrentAndMax(actor.hp,actor.mhp,x,y,width,this.hpColor(actor),this.normalColor()) }; Window_Base.prototype.drawActorMp=function(actor,x,y,width) { width=width||186; var color1=this.mpGaugeColor1(); var color2=this.mpGaugeColor2(); this.drawGauge(x,y,width,actor.mpRate(),color1,color2); this.changeTextColor(this.systemColor()); this.drawText(TextManager.mpA,x,y,44); this.drawCurrentAndMax(actor.mp,actor.mmp,x,y,width,this.mpColor(actor),this.normalColor()) }; Window_Base.prototype.drawActorTp=function(actor,x,y,width) { width=width||96; var color1=this.tpGaugeColor1(); var color2=this.tpGaugeColor2(); this.drawGauge(x,y,width,actor.tpRate(),color1,color2); this.changeTextColor(this.systemColor()); this.drawText(TextManager.tpA,x,y,44); this.changeTextColor(this.tpColor(actor)); this.drawText(actor.tp,x+width-64,y,64,'right') }; Window_Base.prototype.drawActorSimpleStatus=function(actor,x,y,width) { var lineHeight=this.lineHeight(); var x2=x+180; var width2=Math.min(200,width-180-this.textPadding()); this.drawActorName(actor,x,y); this.drawActorLevel(actor,x,y+lineHeight*1); this.drawActorIcons(actor,x,y+lineHeight*2); this.drawActorClass(actor,x2,y); this.drawActorHp(actor,x2,y+lineHeight*1,width2); this.drawActorMp(actor,x2,y+lineHeight*2,width2) }; Window_Base.prototype.drawItemName=function(item,x,y,width) { width=width||312; if(item) { var iconBoxWidth=Window_Base._iconWidth+4; this.resetTextColor(); this.drawIcon(item.iconIndex,x+2,y+2); this.drawText(item.name,x+iconBoxWidth,y,width-iconBoxWidth) } }; Window_Base.prototype.drawCurrencyValue=function(value,unit,x,y,width) { var unitWidth=Math.min(80,this.textWidth(unit)); this.resetTextColor(); this.drawText(value,x,y,width-unitWidth-6,'right'); this.changeTextColor(this.systemColor()); this.drawText(unit,x+width-unitWidth,y,unitWidth,'right') }; Window_Base.prototype.paramchangeTextColor=function(change) { if(change>0) { return this.powerUpColor() } else if(change<0) { return this.powerDownColor() } else { return this.normalColor() } }; Window_Base.prototype.setBackgroundType=function(type) { if(type===0) { this.opacity=255 } else { this.opacity=0 } if(type===1) { this.showBackgroundDimmer() } else { this.hideBackgroundDimmer() } }; Window_Base.prototype.showBackgroundDimmer=function() { if(!this._dimmerSprite) { this._dimmerSprite=new Sprite(); this._dimmerSprite.bitmap=new Bitmap(0,0); this.addChildToBack(this._dimmerSprite) } var bitmap=this._dimmerSprite.bitmap; if(bitmap.width!==this.width||bitmap.height!==this.height) { this.refreshDimmerBitmap() } this._dimmerSprite.visible=true; this.updateBackgroundDimmer() }; Window_Base.prototype.hideBackgroundDimmer=function() { if(this._dimmerSprite) { this._dimmerSprite.visible=false } }; Window_Base.prototype.updateBackgroundDimmer=function() { if(this._dimmerSprite) { this._dimmerSprite.opacity=this.openness } }; Window_Base.prototype.refreshDimmerBitmap=function() { if(this._dimmerSprite) { var bitmap=this._dimmerSprite.bitmap; var w=this.width; var h=this.height; var m=this.padding; var c1=this.dimColor1(); var c2=this.dimColor2(); bitmap.resize(w,h); bitmap.gradientFillRect(0,0,w,m,c2,c1,true); bitmap.fillRect(0,m,w,h-m*2,c1); bitmap.gradientFillRect(0,h-m,w,m,c1,c2,true); this._dimmerSprite.setFrame(0,0,w,h) } }; Window_Base.prototype.dimColor1=function() { return'rgba(0, 0, 0, 0.6)' }; Window_Base.prototype.dimColor2=function() { return'rgba(0, 0, 0, 0)' }; Window_Base.prototype.canvasToLocalX=function(x) { var node=this; while(node) { x-=node.x; node=node.parent } return x }; Window_Base.prototype.canvasToLocalY=function(y) { var node=this; while(node) { y-=node.y; node=node.parent } return y }; function Window_Selectable() { this.initialize.apply(this,arguments) } Window_Selectable.prototype=Object.create(Window_Base.prototype); Window_Selectable.prototype.constructor=Window_Selectable; Window_Selectable.prototype.initialize=function(x,y,width,height) { Window_Base.prototype.initialize.call(this,x,y,width,height); this._index=-1; this._cursorFixed=false; this._cursorAll=false; this._stayCount=0; this._helpWindow=null; this._handlers= { }; this._touching=false; this._scrollX=0; this._scrollY=0; this.deactivate() }; Window_Selectable.prototype.index=function() { return this._index }; Window_Selectable.prototype.cursorFixed=function() { return this._cursorFixed }; Window_Selectable.prototype.setCursorFixed=function(cursorFixed) { this._cursorFixed=cursorFixed }; Window_Selectable.prototype.cursorAll=function() { return this._cursorAll }; Window_Selectable.prototype.setCursorAll=function(cursorAll) { this._cursorAll=cursorAll }; Window_Selectable.prototype.maxCols=function() { return 1 }; Window_Selectable.prototype.maxItems=function() { return 0 }; Window_Selectable.prototype.spacing=function() { return 12 }; Window_Selectable.prototype.itemWidth=function() { return Math.floor((this.width-this.padding*2+this.spacing())/this.maxCols()-this.spacing()) }; Window_Selectable.prototype.itemHeight=function() { return this.lineHeight() }; Window_Selectable.prototype.maxRows=function() { return Math.max(Math.ceil(this.maxItems()/this.maxCols()),1) }; Window_Selectable.prototype.activate=function() { Window_Base.prototype.activate.call(this); this.reselect() }; Window_Selectable.prototype.deactivate=function() { Window_Base.prototype.deactivate.call(this); this.reselect() }; Window_Selectable.prototype.select=function(index) { this._index=index; this._stayCount=0; this.ensureCursorVisible(); this.updateCursor(); this.callUpdateHelp() }; Window_Selectable.prototype.deselect=function() { this.select(-1) }; Window_Selectable.prototype.reselect=function() { this.select(this._index) }; Window_Selectable.prototype.row=function() { return Math.floor(this.index()/this.maxCols()) }; Window_Selectable.prototype.topRow=function() { return Math.floor(this._scrollY/this.itemHeight()) }; Window_Selectable.prototype.maxTopRow=function() { return Math.max(0,this.maxRows()-this.maxPageRows()) }; Window_Selectable.prototype.setTopRow=function(row) { var scrollY=row.clamp(0,this.maxTopRow())*this.itemHeight(); if(this._scrollY!==scrollY) { this._scrollY=scrollY; this.refresh(); this.updateCursor() } }; Window_Selectable.prototype.resetScroll=function() { this.setTopRow(0) }; Window_Selectable.prototype.maxPageRows=function() { var pageHeight=this.height-this.padding*2; return Math.floor(pageHeight/this.itemHeight()) }; Window_Selectable.prototype.maxPageItems=function() { return this.maxPageRows()*this.maxCols() }; Window_Selectable.prototype.isHorizontal=function() { return this.maxPageRows()===1 }; Window_Selectable.prototype.bottomRow=function() { return Math.max(0,this.topRow()+this.maxPageRows()-1) }; Window_Selectable.prototype.setBottomRow=function(row) { this.setTopRow(row-(this.maxPageRows()-1)) }; Window_Selectable.prototype.topIndex=function() { return this.topRow()*this.maxCols() }; Window_Selectable.prototype.itemRect=function(index) { var rect=new Rectangle(); var maxCols=this.maxCols(); rect.width=this.itemWidth(); rect.height=this.itemHeight(); rect.x=index%maxCols*(rect.width+this.spacing())-this._scrollX; rect.y=Math.floor(index/maxCols)*rect.height-this._scrollY; return rect }; Window_Selectable.prototype.itemRectForText=function(index) { var rect=this.itemRect(index); rect.x+=this.textPadding(); rect.width-=this.textPadding()*2; return rect }; Window_Selectable.prototype.setHelpWindow=function(helpWindow) { this._helpWindow=helpWindow; this.callUpdateHelp() }; Window_Selectable.prototype.showHelpWindow=function() { if(this._helpWindow) { this._helpWindow.show() } }; Window_Selectable.prototype.hideHelpWindow=function() { if(this._helpWindow) { this._helpWindow.hide() } }; Window_Selectable.prototype.setHandler=function(symbol,method) { this._handlers[symbol]=method }; Window_Selectable.prototype.isHandled=function(symbol) { return!!this._handlers[symbol] }; Window_Selectable.prototype.callHandler=function(symbol) { if(this.isHandled(symbol)) { this._handlers[symbol]() } }; Window_Selectable.prototype.isOpenAndActive=function() { return this.isOpen()&&this.active }; Window_Selectable.prototype.isCursorMovable=function() { return(this.isOpenAndActive()&&!this._cursorFixed&&!this._cursorAll&&this.maxItems()>0) }; Window_Selectable.prototype.cursorDown=function(wrap) { var index=this.index(); var maxItems=this.maxItems(); var maxCols=this.maxCols(); if(index<maxItems-maxCols||(wrap&&maxCols===1)) { this.select((index+maxCols)%maxItems) } }; Window_Selectable.prototype.cursorUp=function(wrap) { var index=this.index(); var maxItems=this.maxItems(); var maxCols=this.maxCols(); if(index>=maxCols||(wrap&&maxCols===1)) { this.select((index-maxCols+maxItems)%maxItems) } }; Window_Selectable.prototype.cursorRight=function(wrap) { var index=this.index(); var maxItems=this.maxItems(); var maxCols=this.maxCols(); if(maxCols>=2&&(index<maxItems-1||(wrap&&this.isHorizontal()))) { this.select((index+1)%maxItems) } }; Window_Selectable.prototype.cursorLeft=function(wrap) { var index=this.index(); var maxItems=this.maxItems(); var maxCols=this.maxCols(); if(maxCols>=2&&(index>0||(wrap&&this.isHorizontal()))) { this.select((index-1+maxItems)%maxItems) } }; Window_Selectable.prototype.cursorPagedown=function() { var index=this.index(); var maxItems=this.maxItems(); if(this.topRow()+this.maxPageRows()<this.maxRows()) { this.setTopRow(this.topRow()+this.maxPageRows()); this.select(Math.min(index+this.maxPageItems(),maxItems-1)) } }; Window_Selectable.prototype.cursorPageup=function() { var index=this.index(); if(this.topRow()>0) { this.setTopRow(this.topRow()-this.maxPageRows()); this.select(Math.max(index-this.maxPageItems(),0)) } }; Window_Selectable.prototype.scrollDown=function() { if(this.topRow()+1<this.maxRows()) { this.setTopRow(this.topRow()+1) } }; Window_Selectable.prototype.scrollUp=function() { if(this.topRow()>0) { this.setTopRow(this.topRow()-1) } }; Window_Selectable.prototype.update=function() { Window_Base.prototype.update.call(this); this.updateArrows(); this.processCursorMove(); this.processHandling(); this.processWheel(); this.processTouch(); this._stayCount++ }; Window_Selectable.prototype.updateArrows=function() { var topRow=this.topRow(); var maxTopRow=this.maxTopRow(); this.downArrowVisible=maxTopRow>0&&topRow<maxTopRow; this.upArrowVisible=topRow>0 }; Window_Selectable.prototype.processCursorMove=function() { if(this.isCursorMovable()) { var lastIndex=this.index(); if(Input.isRepeated('down')) { this.cursorDown(Input.isTriggered('down')) } if(Input.isRepeated('up')) { this.cursorUp(Input.isTriggered('up')) } if(Input.isRepeated('right')) { this.cursorRight(Input.isTriggered('right')) } if(Input.isRepeated('left')) { this.cursorLeft(Input.isTriggered('left')) } if(!this.isHandled('pagedown')&&Input.isTriggered('pagedown')) { this.cursorPagedown() } if(!this.isHandled('pageup')&&Input.isTriggered('pageup')) { this.cursorPageup() } if(this.index()!==lastIndex) { SoundManager.playCursor() } } }; Window_Selectable.prototype.processHandling=function() { if(this.isOpenAndActive()) { if(this.isOkEnabled()&&this.isOkTriggered()) { this.processOk() } else if(this.isCancelEnabled()&&this.isCancelTriggered()) { this.processCancel() } else if(this.isHandled('pagedown')&&Input.isTriggered('pagedown')) { this.processPagedown() } else if(this.isHandled('pageup')&&Input.isTriggered('pageup')) { this.processPageup() } } }; Window_Selectable.prototype.processWheel=function() { if(this.isOpenAndActive()) { var threshold=20; if(TouchInput.wheelY>=threshold) { this.scrollDown() } if(TouchInput.wheelY<=-threshold) { this.scrollUp() } } }; Window_Selectable.prototype.processTouch=function() { if(this.isOpenAndActive()) { if(TouchInput.isTriggered()&&this.isTouchedInsideFrame()) { this._touching=true; this.onTouch(true) } else if(TouchInput.isCancelled()) { if(this.isCancelEnabled()) { this.processCancel() } } if(this._touching) { if(TouchInput.isPressed()) { this.onTouch(false) } else { this._touching=false } } } else { this._touching=false } }; Window_Selectable.prototype.isTouchedInsideFrame=function() { var x=this.canvasToLocalX(TouchInput.x); var y=this.canvasToLocalY(TouchInput.y); return x>=0&&y>=0&&x<this.width&&y<this.height }; Window_Selectable.prototype.onTouch=function(triggered) { var lastIndex=this.index(); var x=this.canvasToLocalX(TouchInput.x); var y=this.canvasToLocalY(TouchInput.y); var hitIndex=this.hitTest(x,y); if(hitIndex>=0) { if(hitIndex===this.index()) { if(triggered&&this.isTouchOkEnabled()) { this.processOk() } } else if(this.isCursorMovable()) { this.select(hitIndex) } } else if(this._stayCount>=10) { if(y<this.padding) { this.cursorUp() } else if(y>=this.height-this.padding) { this.cursorDown() } } if(this.index()!==lastIndex) { SoundManager.playCursor() } }; Window_Selectable.prototype.hitTest=function(x,y) { if(this.isContentsArea(x,y)) { var cx=x-this.padding; var cy=y-this.padding; var topIndex=this.topIndex(); for(var i=0; i<this.maxPageItems(); i++) { var index=topIndex+i; if(index<this.maxItems()) { var rect=this.itemRect(index); var right=rect.x+rect.width; var bottom=rect.y+rect.height; if(cx>=rect.x&&cy>=rect.y&&cx<right&&cy<bottom) { return index } } } } return-1 }; Window_Selectable.prototype.isContentsArea=function(x,y) { var left=this.padding; var top=this.padding; var right=this.width-this.padding; var bottom=this.height-this.padding; return(x>=left&&y>=top&&x<right&&y<bottom) }; Window_Selectable.prototype.isTouchOkEnabled=function() { return this.isOkEnabled() }; Window_Selectable.prototype.isOkEnabled=function() { return this.isHandled('ok') }; Window_Selectable.prototype.isCancelEnabled=function() { return this.isHandled('cancel') }; Window_Selectable.prototype.isOkTriggered=function() { return Input.isRepeated('ok') }; Window_Selectable.prototype.isCancelTriggered=function() { return Input.isRepeated('cancel') }; Window_Selectable.prototype.processOk=function() { if(this.isCurrentItemEnabled()) { this.playOkSound(); this.updateInputData(); this.deactivate(); this.callOkHandler() } else { this.playBuzzerSound() } }; Window_Selectable.prototype.playOkSound=function() { SoundManager.playOk() }; Window_Selectable.prototype.playBuzzerSound=function() { SoundManager.playBuzzer() }; Window_Selectable.prototype.callOkHandler=function() { this.callHandler('ok') }; Window_Selectable.prototype.processCancel=function() { SoundManager.playCancel(); this.updateInputData(); this.deactivate(); this.callCancelHandler() }; Window_Selectable.prototype.callCancelHandler=function() { this.callHandler('cancel') }; Window_Selectable.prototype.processPageup=function() { SoundManager.playCursor(); this.updateInputData(); this.deactivate(); this.callHandler('pageup') }; Window_Selectable.prototype.processPagedown=function() { SoundManager.playCursor(); this.updateInputData(); this.deactivate(); this.callHandler('pagedown') }; Window_Selectable.prototype.updateInputData=function() { Input.update(); TouchInput.update() }; Window_Selectable.prototype.updateCursor=function() { if(this._cursorAll) { var allRowsHeight=this.maxRows()*this.itemHeight(); this.setCursorRect(0,0,this.contents.width,allRowsHeight); this.setTopRow(0) } else if(this.isCursorVisible()) { var rect=this.itemRect(this.index()); this.setCursorRect(rect.x,rect.y,rect.width,rect.height) } else { this.setCursorRect(0,0,0,0) } }; Window_Selectable.prototype.isCursorVisible=function() { var row=this.row(); return row>=this.topRow()&&row<=this.bottomRow() }; Window_Selectable.prototype.ensureCursorVisible=function() { var row=this.row(); if(row<this.topRow()) { this.setTopRow(row) } else if(row>this.bottomRow()) { this.setBottomRow(row) } }; Window_Selectable.prototype.callUpdateHelp=function() { if(this.active&&this._helpWindow) { this.updateHelp() } }; Window_Selectable.prototype.updateHelp=function() { this._helpWindow.clear() }; Window_Selectable.prototype.setHelpWindowItem=function(item) { if(this._helpWindow) { this._helpWindow.setItem(item) } }; Window_Selectable.prototype.isCurrentItemEnabled=function() { return true }; Window_Selectable.prototype.drawAllItems=function() { var topIndex=this.topIndex(); for(var i=0; i<this.maxPageItems(); i++) { var index=topIndex+i; if(index<this.maxItems()) { this.drawItem(index) } } }; Window_Selectable.prototype.drawItem=function(index) { }; Window_Selectable.prototype.clearItem=function(index) { var rect=this.itemRect(index); this.contents.clearRect(rect.x,rect.y,rect.width,rect.height) }; Window_Selectable.prototype.redrawItem=function(index) { if(index>=0) { this.clearItem(index); this.drawItem(index) } }; Window_Selectable.prototype.redrawCurrentItem=function() { this.redrawItem(this.index()) }; Window_Selectable.prototype.refresh=function() { if(this.contents) { this.contents.clear(); this.drawAllItems() } }; function Window_Command() { this.initialize.apply(this,arguments) } Window_Command.prototype=Object.create(Window_Selectable.prototype); Window_Command.prototype.constructor=Window_Command; Window_Command.prototype.initialize=function(x,y) { this.clearCommandList(); this.makeCommandList(); var width=this.windowWidth(); var height=this.windowHeight(); Window_Selectable.prototype.initialize.call(this,x,y,width,height); this.refresh(); this.select(0); this.activate() }; Window_Command.prototype.windowWidth=function() { return 240 }; Window_Command.prototype.windowHeight=function() { return this.fittingHeight(this.numVisibleRows()) }; Window_Command.prototype.numVisibleRows=function() { return Math.ceil(this.maxItems()/this.maxCols()) }; Window_Command.prototype.maxItems=function() { return this._list.length }; Window_Command.prototype.clearCommandList=function() { this._list=[] }; Window_Command.prototype.makeCommandList=function() { }; Window_Command.prototype.addCommand=function(name,symbol,enabled,ext) { if(enabled===undefined) { enabled=true } if(ext===undefined) { ext=null } this._list.push( { name:name,symbol:symbol,enabled:enabled,ext:ext } ) }; Window_Command.prototype.commandName=function(index) { return this._list[index].name }; Window_Command.prototype.commandSymbol=function(index) { return this._list[index].symbol }; Window_Command.prototype.isCommandEnabled=function(index) { return this._list[index].enabled }; Window_Command.prototype.currentData=function() { return this.index()>=0?this._list[this.index()]:null }; Window_Command.prototype.isCurrentItemEnabled=function() { return this.currentData()?this.currentData().enabled:false }; Window_Command.prototype.currentSymbol=function() { return this.currentData()?this.currentData().symbol:null }; Window_Command.prototype.currentExt=function() { return this.currentData()?this.currentData().ext:null }; Window_Command.prototype.findSymbol=function(symbol) { for(var i=0; i<this._list.length; i++) { if(this._list[i].symbol===symbol) { return i } } return-1 }; Window_Command.prototype.selectSymbol=function(symbol) { var index=this.findSymbol(symbol); if(index>=0) { this.select(index) } else { this.select(0) } }; Window_Command.prototype.findExt=function(ext) { for(var i=0; i<this._list.length; i++) { if(this._list[i].ext===ext) { return i } } return-1 }; Window_Command.prototype.selectExt=function(ext) { var index=this.findExt(ext); if(index>=0) { this.select(index) } else { this.select(0) } }; Window_Command.prototype.drawItem=function(index) { var rect=this.itemRectForText(index); var align=this.itemTextAlign(); this.resetTextColor(); this.changePaintOpacity(this.isCommandEnabled(index)); this.drawText(this.commandName(index),rect.x,rect.y,rect.width,align) }; Window_Command.prototype.itemTextAlign=function() { return'left' }; Window_Command.prototype.isOkEnabled=function() { return true }; Window_Command.prototype.callOkHandler=function() { var symbol=this.currentSymbol(); if(this.isHandled(symbol)) { this.callHandler(symbol) } else if(this.isHandled('ok')) { Window_Selectable.prototype.callOkHandler.call(this) } else { this.activate() } }; Window_Command.prototype.refresh=function() { this.clearCommandList(); this.makeCommandList(); this.createContents(); Window_Selectable.prototype.refresh.call(this) }; function Window_HorzCommand() { this.initialize.apply(this,arguments) } Window_HorzCommand.prototype=Object.create(Window_Command.prototype); Window_HorzCommand.prototype.constructor=Window_HorzCommand; Window_HorzCommand.prototype.initialize=function(x,y) { Window_Command.prototype.initialize.call(this,x,y) }; Window_HorzCommand.prototype.numVisibleRows=function() { return 1 }; Window_HorzCommand.prototype.maxCols=function() { return 4 }; Window_HorzCommand.prototype.itemTextAlign=function() { return'center' }; function Window_Help() { this.initialize.apply(this,arguments) } Window_Help.prototype=Object.create(Window_Base.prototype); Window_Help.prototype.constructor=Window_Help; Window_Help.prototype.initialize=function(numLines) { var width=Graphics.boxWidth; var height=this.fittingHeight(numLines||2); Window_Base.prototype.initialize.call(this,0,0,width,height); this._text='' }; Window_Help.prototype.setText=function(text) { if(this._text!==text) { this._text=text; this.refresh() } }; Window_Help.prototype.clear=function() { this.setText('') }; Window_Help.prototype.setItem=function(item) { this.setText(item?item.description:'') }; Window_Help.prototype.refresh=function() { this.contents.clear(); this.drawTextEx(this._text,this.textPadding(),0) }; function Window_Gold() { this.initialize.apply(this,arguments) } Window_Gold.prototype=Object.create(Window_Base.prototype); Window_Gold.prototype.constructor=Window_Gold; Window_Gold.prototype.initialize=function(x,y) { var width=this.windowWidth(); var height=this.windowHeight(); Window_Base.prototype.initialize.call(this,x,y,width,height); this.refresh() }; Window_Gold.prototype.windowWidth=function() { return 240 }; Window_Gold.prototype.windowHeight=function() { return this.fittingHeight(1) }; Window_Gold.prototype.refresh=function() { var x=this.textPadding(); var width=this.contents.width-this.textPadding()*2; this.contents.clear(); this.drawCurrencyValue(this.value(),this.currencyUnit(),x,0,width) }; Window_Gold.prototype.value=function() { return $gameParty.gold() }; Window_Gold.prototype.currencyUnit=function() { return TextManager.currencyUnit }; Window_Gold.prototype.open=function() { this.refresh(); Window_Base.prototype.open.call(this) }; function Window_MenuCommand() { this.initialize.apply(this,arguments) } Window_MenuCommand.prototype=Object.create(Window_Command.prototype); Window_MenuCommand.prototype.constructor=Window_MenuCommand; Window_MenuCommand.prototype.initialize=function(x,y) { Window_Command.prototype.initialize.call(this,x,y); this.selectLast() }; Window_MenuCommand._lastCommandSymbol=null; Window_MenuCommand.initCommandPosition=function() { this._lastCommandSymbol=null }; Window_MenuCommand.prototype.windowWidth=function() { return 240 }; Window_MenuCommand.prototype.numVisibleRows=function() { return this.maxItems() }; Window_MenuCommand.prototype.makeCommandList=function() { this.addMainCommands(); this.addFormationCommand(); this.addOriginalCommands(); this.addOptionsCommand(); this.addSaveCommand(); this.addGameEndCommand() }; Window_MenuCommand.prototype.addMainCommands=function() { var enabled=this.areMainCommandsEnabled(); if(this.needsCommand('item')) { this.addCommand(TextManager.item,'item',enabled) } if(this.needsCommand('skill')) { this.addCommand(TextManager.skill,'skill',enabled) } if(this.needsCommand('equip')) { this.addCommand(TextManager.equip,'equip',enabled) } if(this.needsCommand('status')) { this.addCommand(TextManager.status,'status',enabled) } }; Window_MenuCommand.prototype.addFormationCommand=function() { if(this.needsCommand('formation')) { var enabled=this.isFormationEnabled(); this.addCommand(TextManager.formation,'formation',enabled) } }; Window_MenuCommand.prototype.addOriginalCommands=function() { }; Window_MenuCommand.prototype.addOptionsCommand=function() { if(this.needsCommand('options')) { var enabled=this.isOptionsEnabled(); this.addCommand(TextManager.options,'options',enabled) } }; Window_MenuCommand.prototype.addSaveCommand=function() { if(this.needsCommand('save')) { var enabled=this.isSaveEnabled(); this.addCommand(TextManager.save,'save',enabled) } }; Window_MenuCommand.prototype.addGameEndCommand=function() { var enabled=this.isGameEndEnabled(); this.addCommand(TextManager.gameEnd,'gameEnd',enabled) }; Window_MenuCommand.prototype.needsCommand=function(name) { var flags=$dataSystem.menuCommands; if(flags) { switch(name) { case'item':return flags[0]; case'skill':return flags[1]; case'equip':return flags[2]; case'status':return flags[3]; case'formation':return flags[4]; case'save':return flags[5] } } return true }; Window_MenuCommand.prototype.areMainCommandsEnabled=function() { return $gameParty.exists() }; Window_MenuCommand.prototype.isFormationEnabled=function() { return $gameParty.size()>=2&&$gameSystem.isFormationEnabled() }; Window_MenuCommand.prototype.isOptionsEnabled=function() { return true }; Window_MenuCommand.prototype.isSaveEnabled=function() { return!DataManager.isEventTest()&&$gameSystem.isSaveEnabled() }; Window_MenuCommand.prototype.isGameEndEnabled=function() { return true }; Window_MenuCommand.prototype.processOk=function() { Window_MenuCommand._lastCommandSymbol=this.currentSymbol(); Window_Command.prototype.processOk.call(this) }; Window_MenuCommand.prototype.selectLast=function() { this.selectSymbol(Window_MenuCommand._lastCommandSymbol) }; function Window_MenuStatus() { this.initialize.apply(this,arguments) } Window_MenuStatus.prototype=Object.create(Window_Selectable.prototype); Window_MenuStatus.prototype.constructor=Window_MenuStatus; Window_MenuStatus.prototype.initialize=function(x,y) { var width=this.windowWidth(); var height=this.windowHeight(); Window_Selectable.prototype.initialize.call(this,x,y,width,height); this._formationMode=false; this._pendingIndex=-1; this.loadImages(); this.refresh() }; Window_MenuStatus.prototype.windowWidth=function() { return Graphics.boxWidth-240 }; Window_MenuStatus.prototype.windowHeight=function() { return Graphics.boxHeight }; Window_MenuStatus.prototype.maxItems=function() { return $gameParty.size() }; Window_MenuStatus.prototype.itemHeight=function() { var clientHeight=this.height-this.padding*2; return Math.floor(clientHeight/this.numVisibleRows()) }; Window_MenuStatus.prototype.numVisibleRows=function() { return 4 }; Window_MenuStatus.prototype.loadImages=function() { $gameParty.members().forEach(function(actor) { ImageManager.loadFace(actor.faceName()) } ,this) }; Window_MenuStatus.prototype.drawItem=function(index) { this.drawItemBackground(index); this.drawItemImage(index); this.drawItemStatus(index) }; Window_MenuStatus.prototype.drawItemBackground=function(index) { if(index===this._pendingIndex) { var rect=this.itemRect(index); var color=this.pendingColor(); this.changePaintOpacity(false); this.contents.fillRect(rect.x,rect.y,rect.width,rect.height,color); this.changePaintOpacity(true) } }; Window_MenuStatus.prototype.drawItemImage=function(index) { var actor=$gameParty.members()[index]; var rect=this.itemRect(index); this.changePaintOpacity(actor.isBattleMember()); this.drawActorFace(actor,rect.x+1,rect.y+1,144,rect.height-2); this.changePaintOpacity(true) }; Window_MenuStatus.prototype.drawItemStatus=function(index) { var actor=$gameParty.members()[index]; var rect=this.itemRect(index); var x=rect.x+162; var y=rect.y+rect.height/2-this.lineHeight()*1.5; var width=rect.width-x-this.textPadding(); this.drawActorSimpleStatus(actor,x,y,width) }; Window_MenuStatus.prototype.processOk=function() { Window_Selectable.prototype.processOk.call(this); $gameParty.setMenuActor($gameParty.members()[this.index()]) }; Window_MenuStatus.prototype.isCurrentItemEnabled=function() { if(this._formationMode) { var actor=$gameParty.members()[this.index()]; return actor&&actor.isFormationChangeOk() } else { return true } }; Window_MenuStatus.prototype.selectLast=function() { this.select($gameParty.menuActor().index()||0) }; Window_MenuStatus.prototype.formationMode=function() { return this._formationMode }; Window_MenuStatus.prototype.setFormationMode=function(formationMode) { this._formationMode=formationMode }; Window_MenuStatus.prototype.pendingIndex=function() { return this._pendingIndex }; Window_MenuStatus.prototype.setPendingIndex=function(index) { var lastPendingIndex=this._pendingIndex; this._pendingIndex=index; this.redrawItem(this._pendingIndex); this.redrawItem(lastPendingIndex) }; function Window_MenuActor() { this.initialize.apply(this,arguments) } Window_MenuActor.prototype=Object.create(Window_MenuStatus.prototype); Window_MenuActor.prototype.constructor=Window_MenuActor; Window_MenuActor.prototype.initialize=function() { Window_MenuStatus.prototype.initialize.call(this,0,0); this.hide() }; Window_MenuActor.prototype.processOk=function() { if(!this.cursorAll()) { $gameParty.setTargetActor($gameParty.members()[this.index()]) } this.callOkHandler() }; Window_MenuActor.prototype.selectLast=function() { this.select($gameParty.targetActor().index()||0) }; Window_MenuActor.prototype.selectForItem=function(item) { var actor=$gameParty.menuActor(); var action=new Game_Action(actor); action.setItemObject(item); this.setCursorFixed(false); this.setCursorAll(false); if(action.isForUser()) { if(DataManager.isSkill(item)) { this.setCursorFixed(true); this.select(actor.index()) } else { this.selectLast() } } else if(action.isForAll()) { this.setCursorAll(true); this.select(0) } else { this.selectLast() } }; function Window_ItemCategory() { this.initialize.apply(this,arguments) } Window_ItemCategory.prototype=Object.create(Window_HorzCommand.prototype); Window_ItemCategory.prototype.constructor=Window_ItemCategory; Window_ItemCategory.prototype.initialize=function() { Window_HorzCommand.prototype.initialize.call(this,0,0) }; Window_ItemCategory.prototype.windowWidth=function() { return Graphics.boxWidth }; Window_ItemCategory.prototype.maxCols=function() { return 4 }; Window_ItemCategory.prototype.update=function() { Window_HorzCommand.prototype.update.call(this); if(this._itemWindow) { this._itemWindow.setCategory(this.currentSymbol()) } }; Window_ItemCategory.prototype.makeCommandList=function() { this.addCommand(TextManager.item,'item'); this.addCommand(TextManager.weapon,'weapon'); this.addCommand(TextManager.armor,'armor'); this.addCommand(TextManager.keyItem,'keyItem') }; Window_ItemCategory.prototype.setItemWindow=function(itemWindow) { this._itemWindow=itemWindow; this.update() }; function Window_ItemList() { this.initialize.apply(this,arguments) } Window_ItemList.prototype=Object.create(Window_Selectable.prototype); Window_ItemList.prototype.constructor=Window_ItemList; Window_ItemList.prototype.initialize=function(x,y,width,height) { Window_Selectable.prototype.initialize.call(this,x,y,width,height); this._category='none'; this._data=[] }; Window_ItemList.prototype.setCategory=function(category) { if(this._category!==category) { this._category=category; this.refresh(); this.resetScroll() } }; Window_ItemList.prototype.maxCols=function() { return 2 }; Window_ItemList.prototype.spacing=function() { return 48 }; Window_ItemList.prototype.maxItems=function() { return this._data?this._data.length:1 }; Window_ItemList.prototype.item=function() { var index=this.index(); return this._data&&index>=0?this._data[index]:null }; Window_ItemList.prototype.isCurrentItemEnabled=function() { return this.isEnabled(this.item()) }; Window_ItemList.prototype.includes=function(item) { switch(this._category) { case'item':return DataManager.isItem(item)&&item.itypeId===1; case'weapon':return DataManager.isWeapon(item); case'armor':return DataManager.isArmor(item); case'keyItem':return DataManager.isItem(item)&&item.itypeId===2; default:return false } }; Window_ItemList.prototype.needsNumber=function() { return true }; Window_ItemList.prototype.isEnabled=function(item) { return $gameParty.canUse(item) }; Window_ItemList.prototype.makeItemList=function() { this._data=$gameParty.allItems().filter(function(item) { return this.includes(item) } ,this); if(this.includes(null)) { this._data.push(null) } }; Window_ItemList.prototype.selectLast=function() { var index=this._data.indexOf($gameParty.lastItem()); this.select(index>=0?index:0) }; Window_ItemList.prototype.drawItem=function(index) { var item=this._data[index]; if(item) { var numberWidth=this.numberWidth(); var rect=this.itemRect(index); rect.width-=this.textPadding(); this.changePaintOpacity(this.isEnabled(item)); this.drawItemName(item,rect.x,rect.y,rect.width-numberWidth); this.drawItemNumber(item,rect.x,rect.y,rect.width); this.changePaintOpacity(1) } }; Window_ItemList.prototype.numberWidth=function() { return this.textWidth('000') }; Window_ItemList.prototype.drawItemNumber=function(item,x,y,width) { if(this.needsNumber()) { this.drawText(':',x,y,width-this.textWidth('00'),'right'); this.drawText($gameParty.numItems(item),x,y,width,'right') } }; Window_ItemList.prototype.updateHelp=function() { this.setHelpWindowItem(this.item()) }; Window_ItemList.prototype.refresh=function() { this.makeItemList(); this.createContents(); this.drawAllItems() }; function Window_SkillType() { this.initialize.apply(this,arguments) } Window_SkillType.prototype=Object.create(Window_Command.prototype); Window_SkillType.prototype.constructor=Window_SkillType; Window_SkillType.prototype.initialize=function(x,y) { Window_Command.prototype.initialize.call(this,x,y); this._actor=null }; Window_SkillType.prototype.windowWidth=function() { return 240 }; Window_SkillType.prototype.setActor=function(actor) { if(this._actor!==actor) { this._actor=actor; this.refresh(); this.selectLast() } }; Window_SkillType.prototype.numVisibleRows=function() { return 4 }; Window_SkillType.prototype.makeCommandList=function() { if(this._actor) { var skillTypes=this._actor.addedSkillTypes(); skillTypes.sort(function(a, { return a-b } ); skillTypes.forEach(function(stypeId) { var name=$dataSystem.skillTypes[stypeId]; this.addCommand(name,'skill',true,stypeId) } ,this) } }; Window_SkillType.prototype.update=function() { Window_Command.prototype.update.call(this); if(this._skillWindow) { this._skillWindow.setStypeId(this.currentExt()) } }; Window_SkillType.prototype.setSkillWindow=function(skillWindow) { this._skillWindow=skillWindow; this.update() }; Window_SkillType.prototype.selectLast=function() { var skill=this._actor.lastMenuSkill(); if(skill) { this.selectExt(skill.stypeId) } else { this.select(0) } }; function Window_SkillStatus() { this.initialize.apply(this,arguments) } Window_SkillStatus.prototype=Object.create(Window_Base.prototype); Window_SkillStatus.prototype.constructor=Window_SkillStatus; Window_SkillStatus.prototype.initialize=function(x,y,width,height) { Window_Base.prototype.initialize.call(this,x,y,width,height); this._actor=null }; Window_SkillStatus.prototype.setActor=function(actor) { if(this._actor!==actor) { this._actor=actor; this.refresh() } }; Window_SkillStatus.prototype.refresh=function() { this.contents.clear(); if(this._actor) { var w=this.width-this.padding*2; var h=this.height-this.padding*2; var y=h/2-this.lineHeight()*1.5; var width=w-162-this.textPadding(); this.drawActorFace(this._actor,0,0,144,h); this.drawActorSimpleStatus(this._actor,162,y,width) } }; function Window_SkillList() { this.initialize.apply(this,arguments) } Window_SkillList.prototype=Object.create(Window_Selectable.prototype); Window_SkillList.prototype.constructor=Window_SkillList; Window_SkillList.prototype.initialize=function(x,y,width,height) { Window_Selectable.prototype.initialize.call(this,x,y,width,height); this._actor=null; this._stypeId=0; this._data=[] }; Window_SkillList.prototype.setActor=function(actor) { if(this._actor!==actor) { this._actor=actor; this.refresh(); this.resetScroll() } }; Window_SkillList.prototype.setStypeId=function(stypeId) { if(this._stypeId!==stypeId) { this._stypeId=stypeId; this.refresh(); this.resetScroll() } }; Window_SkillList.prototype.maxCols=function() { return 2 }; Window_SkillList.prototype.spacing=function() { return 48 }; Window_SkillList.prototype.maxItems=function() { return this._data?this._data.length:1 }; Window_SkillList.prototype.item=function() { return this._data&&this.index()>=0?this._data[this.index()]:null }; Window_SkillList.prototype.isCurrentItemEnabled=function() { return this.isEnabled(this._data[this.index()]) }; Window_SkillList.prototype.includes=function(item) { return item&&item.stypeId===this._stypeId }; Window_SkillList.prototype.isEnabled=function(item) { return this._actor&&this._actor.canUse(item) }; Window_SkillList.prototype.makeItemList=function() { if(this._actor) { this._data=this._actor.skills().filter(function(item) { return this.includes(item) } ,this) } else { this._data=[] } }; Window_SkillList.prototype.selectLast=function() { var skill; if($gameParty.inBattle()) { skill=this._actor.lastBattleSkill() } else { skill=this._actor.lastMenuSkill() } var index=this._data.indexOf(skill); this.select(index>=0?index:0) }; Window_SkillList.prototype.drawItem=function(index) { var skill=this._data[index]; if(skill) { var costWidth=this.costWidth(); var rect=this.itemRect(index); rect.width-=this.textPadding(); this.changePaintOpacity(this.isEnabled(skill)); this.drawItemName(skill,rect.x,rect.y,rect.width-costWidth); this.drawSkillCost(skill,rect.x,rect.y,rect.width); this.changePaintOpacity(1) } }; Window_SkillList.prototype.costWidth=function() { return this.textWidth('000') }; Window_SkillList.prototype.drawSkillCost=function(skill,x,y,width) { if(this._actor.skillTpCost(skill)>0) { this.changeTextColor(this.tpCostColor()); this.drawText(this._actor.skillTpCost(skill),x,y,width,'right') } else if(this._actor.skillMpCost(skill)>0) { this.changeTextColor(this.mpCostColor()); this.drawText(this._actor.skillMpCost(skill),x,y,width,'right') } }; Window_SkillList.prototype.updateHelp=function() { this.setHelpWindowItem(this.item()) }; Window_SkillList.prototype.refresh=function() { this.makeItemList(); this.createContents(); this.drawAllItems() }; function Window_EquipStatus() { this.initialize.apply(this,arguments) } Window_EquipStatus.prototype=Object.create(Window_Base.prototype); Window_EquipStatus.prototype.constructor=Window_EquipStatus; Window_EquipStatus.prototype.initialize=function(x,y) { var width=this.windowWidth(); var height=this.windowHeight(); Window_Base.prototype.initialize.call(this,x,y,width,height); this._actor=null; this._tempActor=null; this.refresh() }; Window_EquipStatus.prototype.windowWidth=function() { return 312 }; Window_EquipStatus.prototype.windowHeight=function() { return this.fittingHeight(this.numVisibleRows()) }; Window_EquipStatus.prototype.numVisibleRows=function() { return 7 }; Window_EquipStatus.prototype.setActor=function(actor) { if(this._actor!==actor) { this._actor=actor; this.refresh() } }; Window_EquipStatus.prototype.refresh=function() { this.contents.clear(); if(this._actor) { this.drawActorName(this._actor,this.textPadding(),0); for(var i=0; i<6; i++) { this.drawItem(0,this.lineHeight()*(1+i),2+i) } } }; Window_EquipStatus.prototype.setTempActor=function(tempActor) { if(this._tempActor!==tempActor) { this._tempActor=tempActor; this.refresh() } }; Window_EquipStatus.prototype.drawItem=function(x,y,paramId) { this.drawParamName(x+this.textPadding(),y,paramId); if(this._actor) { this.drawCurrentParam(x+140,y,paramId) } this.drawRightArrow(x+188,y); if(this._tempActor) { this.drawNewParam(x+222,y,paramId) } }; Window_EquipStatus.prototype.drawParamName=function(x,y,paramId) { this.changeTextColor(this.systemColor()); this.drawText(TextManager.param(paramId),x,y,120) }; Window_EquipStatus.prototype.drawCurrentParam=function(x,y,paramId) { this.resetTextColor(); this.drawText(this._actor.param(paramId),x,y,48,'right') }; Window_EquipStatus.prototype.drawRightArrow=function(x,y) { this.changeTextColor(this.systemColor()); this.drawText('\u2192',x,y,32,'center') }; Window_EquipStatus.prototype.drawNewParam=function(x,y,paramId) { var newValue=this._tempActor.param(paramId); var diffvalue=newValue-this._actor.param(paramId); this.changeTextColor(this.paramchangeTextColor(diffvalue)); this.drawText(newValue,x,y,48,'right') }; function Window_EquipCommand() { this.initialize.apply(this,arguments) } Window_EquipCommand.prototype=Object.create(Window_HorzCommand.prototype); Window_EquipCommand.prototype.constructor=Window_EquipCommand; Window_EquipCommand.prototype.initialize=function(x,y,width) { this._windowWidth=width; Window_HorzCommand.prototype.initialize.call(this,x,y) }; Window_EquipCommand.prototype.windowWidth=function() { return this._windowWidth }; Window_EquipCommand.prototype.maxCols=function() { return 3 }; Window_EquipCommand.prototype.makeCommandList=function() { this.addCommand(TextManager.equip2,'equip'); this.addCommand(TextManager.optimize,'optimize'); this.addCommand(TextManager.clear,'clear') }; function Window_EquipSlot() { this.initialize.apply(this,arguments) } Window_EquipSlot.prototype=Object.create(Window_Selectable.prototype); Window_EquipSlot.prototype.constructor=Window_EquipSlot; Window_EquipSlot.prototype.initialize=function(x,y,width,height) { Window_Selectable.prototype.initialize.call(this,x,y,width,height); this._actor=null; this.refresh() }; Window_EquipSlot.prototype.setActor=function(actor) { if(this._actor!==actor) { this._actor=actor; this.refresh() } }; Window_EquipSlot.prototype.update=function() { Window_Selectable.prototype.update.call(this); if(this._itemWindow) { this._itemWindow.setSlotId(this.index()) } }; Window_EquipSlot.prototype.maxItems=function() { return this._actor?this._actor.equipSlots().length:0 }; Window_EquipSlot.prototype.item=function() { return this._actor?this._actor.equips()[this.index()]:null }; Window_EquipSlot.prototype.drawItem=function(index) { if(this._actor) { var rect=this.itemRectForText(index); this.changeTextColor(this.systemColor()); this.changePaintOpacity(this.isEnabled(index)); this.drawText(this.slotName(index),rect.x,rect.y,138,this.lineHeight()); this.drawItemName(this._actor.equips()[index],rect.x+138,rect.y); this.changePaintOpacity(true) } }; Window_EquipSlot.prototype.slotName=function(index) { var slots=this._actor.equipSlots(); return this._actor?$dataSystem.equipTypes[slots[index]]:'' }; Window_EquipSlot.prototype.isEnabled=function(index) { return this._actor?this._actor.isEquipChangeOk(index):false }; Window_EquipSlot.prototype.isCurrentItemEnabled=function() { return this.isEnabled(this.index()) }; Window_EquipSlot.prototype.setStatusWindow=function(statusWindow) { this._statusWindow=statusWindow; this.callUpdateHelp() }; Window_EquipSlot.prototype.setItemWindow=function(itemWindow) { this._itemWindow=itemWindow; this.update() }; Window_EquipSlot.prototype.updateHelp=function() { Window_Selectable.prototype.updateHelp.call(this); this.setHelpWindowItem(this.item()); if(this._statusWindow) { this._statusWindow.setTempActor(null) } }; function Window_EquipItem() { this.initialize.apply(this,arguments) } Window_EquipItem.prototype=Object.create(Window_ItemList.prototype); Window_EquipItem.prototype.constructor=Window_EquipItem; Window_EquipItem.prototype.initialize=function(x,y,width,height) { Window_ItemList.prototype.initialize.call(this,x,y,width,height); this._actor=null; this._slotId=0 }; Window_EquipItem.prototype.setActor=function(actor) { if(this._actor!==actor) { this._actor=actor; this.refresh(); this.resetScroll() } }; Window_EquipItem.prototype.setSlotId=function(slotId) { if(this._slotId!==slotId) { this._slotId=slotId; this.refresh(); this.resetScroll() } }; Window_EquipItem.prototype.includes=function(item) { if(item===null) { return true } if(this._slotId<0||item.etypeId!==this._actor.equipSlots()[this._slotId]) { return false } return this._actor.canEquip(item) }; Window_EquipItem.prototype.isEnabled=function(item) { return true }; Window_EquipItem.prototype.selectLast=function() { }; Window_EquipItem.prototype.setStatusWindow=function(statusWindow) { this._statusWindow=statusWindow; this.callUpdateHelp() }; Window_EquipItem.prototype.updateHelp=function() { Window_ItemList.prototype.updateHelp.call(this); if(this._actor&&this._statusWindow) { var actor=JsonEx.makeDeepCopy(this._actor); actor.forceChangeEquip(this._slotId,this.item()); this._statusWindow.setTempActor(actor) } }; Window_EquipItem.prototype.playOkSound=function() { }; function Window_Status() { this.initialize.apply(this,arguments) } Window_Status.prototype=Object.create(Window_Selectable.prototype); Window_Status.prototype.constructor=Window_Status; Window_Status.prototype.initialize=function() { var width=Graphics.boxWidth; var height=Graphics.boxHeight; Window_Selectable.prototype.initialize.call(this,0,0,width,height); this.refresh(); this.activate() }; Window_Status.prototype.setActor=function(actor) { if(this._actor!==actor) { this._actor=actor; this.refresh() } }; Window_Status.prototype.refresh=function() { this.contents.clear(); if(this._actor) { var lineHeight=this.lineHeight(); this.drawBlock1(lineHeight*0); this.drawHorzLine(lineHeight*1); this.drawBlock2(lineHeight*2); this.drawHorzLine(lineHeight*6); this.drawBlock3(lineHeight*7); this.drawHorzLine(lineHeight*13); this.drawBlock4(lineHeight*14) } }; Window_Status.prototype.drawBlock1=function(y) { this.drawActorName(this._actor,6,y); this.drawActorClass(this._actor,192,y); this.drawActorNickname(this._actor,432,y) }; Window_Status.prototype.drawBlock2=function(y) { this.drawActorFace(this._actor,12,y); this.drawBasicInfo(204,y); this.drawExpInfo(456,y) }; Window_Status.prototype.drawBlock3=function(y) { this.drawParameters(48,y); this.drawEquipments(432,y) }; Window_Status.prototype.drawBlock4=function(y) { this.drawProfile(6,y) }; Window_Status.prototype.drawHorzLine=function(y) { var lineY=y+this.lineHeight()/2-1; this.contents.paintOpacity=48; this.contents.fillRect(0,lineY,this.contentsWidth(),2,this.lineColor()); this.contents.paintOpacity=255 }; Window_Status.prototype.lineColor=function() { return this.normalColor() }; Window_Status.prototype.drawBasicInfo=function(x,y) { var lineHeight=this.lineHeight(); this.drawActorLevel(this._actor,x,y+lineHeight*0); this.drawActorIcons(this._actor,x,y+lineHeight*1); this.drawActorHp(this._actor,x,y+lineHeight*2); this.drawActorMp(this._actor,x,y+lineHeight*3) }; Window_Status.prototype.drawParameters=function(x,y) { var lineHeight=this.lineHeight(); for(var i=0; i<6; i++) { var paramId=i+2; var y2=y+lineHeight*i; this.changeTextColor(this.systemColor()); this.drawText(TextManager.param(paramId),x,y2,160); this.resetTextColor(); this.drawText(this._actor.param(paramId),x+160,y2,60,'right') } }; Window_Status.prototype.drawExpInfo=function(x,y) { var lineHeight=this.lineHeight(); var expTotal=TextManager.expTotal.format(TextManager.exp); var expNext=TextManager.expNext.format(TextManager.level); var value1=this._actor.currentExp(); var value2=this._actor.nextRequiredExp(); if(this._actor.isMaxLevel()) { value1='-------'; value2='-------' } this.changeTextColor(this.systemColor()); this.drawText(expTotal,x,y+lineHeight*0,270); this.drawText(expNext,x,y+lineHeight*2,270); this.resetTextColor(); this.drawText(value1,x,y+lineHeight*1,270,'right'); this.drawText(value2,x,y+lineHeight*3,270,'right') }; Window_Status.prototype.drawEquipments=function(x,y) { var equips=this._actor.equips(); var count=Math.min(equips.length,this.maxEquipmentLines()); for(var i=0; i<count; i++) { this.drawItemName(equips[i],x,y+this.lineHeight()*i) } }; Window_Status.prototype.drawProfile=function(x,y) { this.drawTextEx(this._actor.profile(),x,y) }; Window_Status.prototype.maxEquipmentLines=function() { return 6 }; function Window_Options() { this.initialize.apply(this,arguments) } Window_Options.prototype=Object.create(Window_Command.prototype); Window_Options.prototype.constructor=Window_Options; Window_Options.prototype.initialize=function() { Window_Command.prototype.initialize.call(this,0,0); this.updatePlacement() }; Window_Options.prototype.windowWidth=function() { return 400 }; Window_Options.prototype.windowHeight=function() { return this.fittingHeight(Math.min(this.numVisibleRows(),12)) }; Window_Options.prototype.updatePlacement=function() { this.x=(Graphics.boxWidth-this.width)/2; this.y=(Graphics.boxHeight-this.height)/2 }; Window_Options.prototype.makeCommandList=function() { this.addGeneralOptions(); this.addVolumeOptions() }; Window_Options.prototype.addGeneralOptions=function() { this.addCommand(TextManager.alwaysDash,'alwaysDash'); this.addCommand(TextManager.commandRemember,'commandRemember') }; Window_Options.prototype.addVolumeOptions=function() { this.addCommand(TextManager.bgmVolume,'bgmVolume'); this.addCommand(TextManager.bgsVolume,'bgsVolume'); this.addCommand(TextManager.meVolume,'meVolume'); this.addCommand(TextManager.seVolume,'seVolume') }; Window_Options.prototype.drawItem=function(index) { var rect=this.itemRectForText(index); var statusWidth=this.statusWidth(); var titleWidth=rect.width-statusWidth; this.resetTextColor(); this.changePaintOpacity(this.isCommandEnabled(index)); this.drawText(this.commandName(index),rect.x,rect.y,titleWidth,'left'); this.drawText(this.statusText(index),titleWidth,rect.y,statusWidth,'right') }; Window_Options.prototype.statusWidth=function() { return 120 }; Window_Options.prototype.statusText=function(index) { var symbol=this.commandSymbol(index); var value=this.getConfigValue(symbol); if(this.isVolumeSymbol(symbol)) { return this.volumeStatusText(value) } else { return this.booleanStatusText(value) } }; Window_Options.prototype.isVolumeSymbol=function(symbol) { return symbol.contains('Volume') }; Window_Options.prototype.booleanStatusText=function(value) { return value?'ON':'OFF' }; Window_Options.prototype.volumeStatusText=function(value) { return value+'%' }; Window_Options.prototype.processOk=function() { var index=this.index(); var symbol=this.commandSymbol(index); var value=this.getConfigValue(symbol); if(this.isVolumeSymbol(symbol)) { value+=this.volumeOffset(); if(value>100) { value=0 } value=value.clamp(0,100); this.changeValue(symbol,value) } else { this.changeValue(symbol,!value) } }; Window_Options.prototype.cursorRight=function(wrap) { var index=this.index(); var symbol=this.commandSymbol(index); var value=this.getConfigValue(symbol); if(this.isVolumeSymbol(symbol)) { value+=this.volumeOffset(); value=value.clamp(0,100); this.changeValue(symbol,value) } else { this.changeValue(symbol,true) } }; Window_Options.prototype.cursorLeft=function(wrap) { var index=this.index(); var symbol=this.commandSymbol(index); var value=this.getConfigValue(symbol); if(this.isVolumeSymbol(symbol)) { value-=this.volumeOffset(); value=value.clamp(0,100); this.changeValue(symbol,value) } else { this.changeValue(symbol,false) } }; Window_Options.prototype.volumeOffset=function() { return 20 }; Window_Options.prototype.changeValue=function(symbol,value) { var lastValue=this.getConfigValue(symbol); if(lastValue!==value) { this.setConfigValue(symbol,value); this.redrawItem(this.findSymbol(symbol)); SoundManager.playCursor() } }; Window_Options.prototype.getConfigValue=function(symbol) { return ConfigManager[symbol] }; Window_Options.prototype.setConfigValue=function(symbol,volume) { ConfigManager[symbol]=volume }; function Window_SavefileList() { this.initialize.apply(this,arguments) } Window_SavefileList.prototype=Object.create(Window_Selectable.prototype); Window_SavefileList.prototype.constructor=Window_SavefileList; Window_SavefileList.prototype.initialize=function(x,y,width,height) { Window_Selectable.prototype.initialize.call(this,x,y,width,height); this.activate(); this._mode=null }; Window_SavefileList.prototype.setMode=function(mode) { this._mode=mode }; Window_SavefileList.prototype.maxItems=function() { return DataManager.maxSavefiles() }; Window_SavefileList.prototype.maxVisibleItems=function() { return 5 }; Window_SavefileList.prototype.itemHeight=function() { var innerHeight=this.height-this.padding*2; return Math.floor(innerHeight/this.maxVisibleItems()) }; Window_SavefileList.prototype.drawItem=function(index) { var id=index+1; var valid=DataManager.isThisGameFile(id); var info=DataManager.loadSavefileInfo(id); var rect=this.itemRectForText(index); this.resetTextColor(); if(this._mode==='load') { this.changePaintOpacity(valid) } this.drawFileId(id,rect.x,rect.y); if(info) { this.changePaintOpacity(valid); this.drawContents(info,rect,valid); this.changePaintOpacity(true) } }; Window_SavefileList.prototype.drawFileId=function(id,x,y) { this.drawText(TextManager.file+' '+id,x,y,180) }; Window_SavefileList.prototype.drawContents=function(info,rect,valid) { var bottom=rect.y+rect.height; if(rect.width>=420) { this.drawGameTitle(info,rect.x+192,rect.y,rect.width-192); if(valid) { this.drawPartyCharacters(info,rect.x+220,bottom-4) } } var lineHeight=this.lineHeight(); var y2=bottom-lineHeight; if(y2>=lineHeight) { this.drawPlaytime(info,rect.x,y2,rect.width) } }; Window_SavefileList.prototype.drawGameTitle=function(info,x,y,width) { if(info.title) { this.drawText(info.title,x,y,width) } }; Window_SavefileList.prototype.drawPartyCharacters=function(info,x,y) { if(info.characters) { for(var i=0; i<info.characters.length; i++) { var data=info.characters[i]; this.drawCharacter(data[0],data[1],x+i*48,y) } } }; Window_SavefileList.prototype.drawPlaytime=function(info,x,y,width) { if(info.playtime) { this.drawText(info.playtime,x,y,width,'right') } }; Window_SavefileList.prototype.playOkSound=function() { }; function Window_ShopCommand() { this.initialize.apply(this,arguments) } Window_ShopCommand.prototype=Object.create(Window_HorzCommand.prototype); Window_ShopCommand.prototype.constructor=Window_ShopCommand; Window_ShopCommand.prototype.initialize=function(width,purchaseOnly) { this._windowWidth=width; this._purchaseOnly=purchaseOnly; Window_HorzCommand.prototype.initialize.call(this,0,0) }; Window_ShopCommand.prototype.windowWidth=function() { return this._windowWidth }; Window_ShopCommand.prototype.maxCols=function() { return 3 }; Window_ShopCommand.prototype.makeCommandList=function() { this.addCommand(TextManager.buy,'buy'); this.addCommand(TextManager.sell,'sell',!this._purchaseOnly); this.addCommand(TextManager.cancel,'cancel') }; function Window_ShopBuy() { this.initialize.apply(this,arguments) } Window_ShopBuy.prototype=Object.create(Window_Selectable.prototype); Window_ShopBuy.prototype.constructor=Window_ShopBuy; Window_ShopBuy.prototype.initialize=function(x,y,height,shopGoods) { var width=this.windowWidth(); Window_Selectable.prototype.initialize.call(this,x,y,width,height); this._shopGoods=shopGoods; this._money=0; this.refresh(); this.select(0) }; Window_ShopBuy.prototype.windowWidth=function() { return 456 }; Window_ShopBuy.prototype.maxItems=function() { return this._data?this._data.length:1 }; Window_ShopBuy.prototype.item=function() { return this._data[this.index()] }; Window_ShopBuy.prototype.setMoney=function(money) { this._money=money; this.refresh() }; Window_ShopBuy.prototype.isCurrentItemEnabled=function() { return this.isEnabled(this._data[this.index()]) }; Window_ShopBuy.prototype.price=function(item) { return this._price[this._data.indexOf(item)]||0 }; Window_ShopBuy.prototype.isEnabled=function(item) { return(item&&this.price(item)<=this._money&&!$gameParty.hasMaxItems(item)) }; Window_ShopBuy.prototype.refresh=function() { this.makeItemList(); this.createContents(); this.drawAllItems() }; Window_ShopBuy.prototype.makeItemList=function() { this._data=[]; this._price=[]; this._shopGoods.forEach(function(goods) { var item=null; switch(goods[0]) { case 0:item=$dataItems[goods[1]]; break; case 1:item=$dataWeapons[goods[1]]; break; case 2:item=$dataArmors[goods[1]]; break } if(item) { this._data.push(item); this._price.push(goods[2]===0?item.price:goods[3]) } } ,this) }; Window_ShopBuy.prototype.drawItem=function(index) { var item=this._data[index]; var rect=this.itemRect(index); var priceWidth=96; rect.width-=this.textPadding(); this.changePaintOpacity(this.isEnabled(item)); this.drawItemName(item,rect.x,rect.y,rect.width-priceWidth); this.drawText(this.price(item),rect.x+rect.width-priceWidth,rect.y,priceWidth,'right'); this.changePaintOpacity(true) }; Window_ShopBuy.prototype.setStatusWindow=function(statusWindow) { this._statusWindow=statusWindow; this.callUpdateHelp() }; Window_ShopBuy.prototype.updateHelp=function() { this.setHelpWindowItem(this.item()); if(this._statusWindow) { this._statusWindow.setItem(this.item()) } }; function Window_ShopSell() { this.initialize.apply(this,arguments) } Window_ShopSell.prototype=Object.create(Window_ItemList.prototype); Window_ShopSell.prototype.constructor=Window_ShopSell; Window_ShopSell.prototype.initialize=function(x,y,width,height) { Window_ItemList.prototype.initialize.call(this,x,y,width,height) }; Window_ShopSell.prototype.isEnabled=function(item) { return item&&item.price>0 }; function Window_ShopNumber() { this.initialize.apply(this,arguments) } Window_ShopNumber.prototype=Object.create(Window_Selectable.prototype); Window_ShopNumber.prototype.constructor=Window_ShopNumber; Window_ShopNumber.prototype.initialize=function(x,y,height) { var width=this.windowWidth(); Window_Selectable.prototype.initialize.call(this,x,y,width,height); this._item=null; this._max=1; this._price=0; this._number=1; this._currencyUnit=TextManager.currencyUnit; this.createButtons() }; Window_ShopNumber.prototype.windowWidth=function() { return 456 }; Window_ShopNumber.prototype.number=function() { return this._number }; Window_ShopNumber.prototype.setup=function(item,max,price) { this._item=item; this._max=Math.floor(max); this._price=price; this._number=1; this.placeButtons(); this.updateButtonsVisiblity(); this.refresh() }; Window_ShopNumber.prototype.setCurrencyUnit=function(currencyUnit) { this._currencyUnit=currencyUnit; this.refresh() }; Window_ShopNumber.prototype.createButtons=function() { var bitmap=ImageManager.loadSystem('ButtonSet'); var buttonWidth=48; var buttonHeight=48; this._buttons=[]; for(var i=0; i<5; i++) { var button=new Sprite_Button(); var x=buttonWidth*i; var w=buttonWidth*(i===4?2:1); button.bitmap=bitmap; button.setColdFrame(x,0,w,buttonHeight); button.setHotFrame(x,buttonHeight,w,buttonHeight); button.visible=false; this._buttons.push(button); this.addChild(button) } this._buttons[0].setClickHandler(this.onButtonDown2.bind(this)); this._buttons[1].setClickHandler(this.onButtonDown.bind(this)); this._buttons[2].setClickHandler(this.onButtonUp.bind(this)); this._buttons[3].setClickHandler(this.onButtonUp2.bind(this)); this._buttons[4].setClickHandler(this.onButtonOk.bind(this)) }; Window_ShopNumber.prototype.placeButtons=function() { var numButtons=this._buttons.length; var spacing=16; var totalWidth=-spacing; for(var i=0; i<numButtons; i++) { totalWidth+=this._buttons[i].width+spacing } var x=(this.width-totalWidth)/2; for(var j=0; j<numButtons; j++) { var button=this._buttons[j]; button.x=x; button.y=this.buttonY(); x+=button.width+spacing } }; Window_ShopNumber.prototype.updateButtonsVisiblity=function() { if(TouchInput.date>Input.date) { this.showButtons() } else { this.hideButtons() } }; Window_ShopNumber.prototype.showButtons=function() { for(var i=0; i<this._buttons.length; i++) { this._buttons[i].visible=true } }; Window_ShopNumber.prototype.hideButtons=function() { for(var i=0; i<this._buttons.length; i++) { this._buttons[i].visible=false } }; Window_ShopNumber.prototype.refresh=function() { this.contents.clear(); this.drawItemName(this._item,0,this.itemY()); this.drawMultiplicationSign(); this.drawNumber(); this.drawTotalPrice() }; Window_ShopNumber.prototype.drawMultiplicationSign=function() { var sign='\u00d7'; var width=this.textWidth(sign); var x=this.cursorX()-width*2; var y=this.itemY(); this.resetTextColor(); this.drawText(sign,x,y,width) }; Window_ShopNumber.prototype.drawNumber=function() { var x=this.cursorX(); var y=this.itemY(); var width=this.cursorWidth()-this.textPadding(); this.resetTextColor(); this.drawText(this._number,x,y,width,'right') }; Window_ShopNumber.prototype.drawTotalPrice=function() { var total=this._price*this._number; var width=this.contentsWidth()-this.textPadding(); this.drawCurrencyValue(total,this._currencyUnit,0,this.priceY(),width) }; Window_ShopNumber.prototype.itemY=function() { return Math.round(this.contentsHeight()/2-this.lineHeight()*1.5) }; Window_ShopNumber.prototype.priceY=function() { return Math.round(this.contentsHeight()/2+this.lineHeight()/2) }; Window_ShopNumber.prototype.buttonY=function() { return Math.round(this.priceY()+this.lineHeight()*2.5) }; Window_ShopNumber.prototype.cursorWidth=function() { var digitWidth=this.textWidth('0'); return this.maxDigits()*digitWidth+this.textPadding()*2 }; Window_ShopNumber.prototype.cursorX=function() { return this.contentsWidth()-this.cursorWidth()-this.textPadding() }; Window_ShopNumber.prototype.maxDigits=function() { return 2 }; Window_ShopNumber.prototype.update=function() { Window_Selectable.prototype.update.call(this); this.processNumberChange() }; Window_ShopNumber.prototype.isOkTriggered=function() { return Input.isTriggered('ok') }; Window_ShopNumber.prototype.playOkSound=function() { }; Window_ShopNumber.prototype.processNumberChange=function() { if(this.isOpenAndActive()) { if(Input.isRepeated('right')) { this.changeNumber(1) } if(Input.isRepeated('left')) { this.changeNumber(-1) } if(Input.isRepeated('up')) { this.changeNumber(10) } if(Input.isRepeated('down')) { this.changeNumber(-10) } } }; Window_ShopNumber.prototype.changeNumber=function(amount) { var lastNumber=this._number; this._number=(this._number+amount).clamp(1,this._max); if(this._number!==lastNumber) { SoundManager.playCursor(); this.refresh() } }; Window_ShopNumber.prototype.updateCursor=function() { this.setCursorRect(this.cursorX(),this.itemY(),this.cursorWidth(),this.lineHeight()) }; Window_ShopNumber.prototype.onButtonUp=function() { this.changeNumber(1) }; Window_ShopNumber.prototype.onButtonUp2=function() { this.changeNumber(10) }; Window_ShopNumber.prototype.onButtonDown=function() { this.changeNumber(-1) }; Window_ShopNumber.prototype.onButtonDown2=function() { this.changeNumber(-10) }; Window_ShopNumber.prototype.onButtonOk=function() { this.processOk() }; function Window_ShopStatus() { this.initialize.apply(this,arguments) } Window_ShopStatus.prototype=Object.create(Window_Base.prototype); Window_ShopStatus.prototype.constructor=Window_ShopStatus; Window_ShopStatus.prototype.initialize=function(x,y,width,height) { Window_Base.prototype.initialize.call(this,x,y,width,height); this._item=null; this._pageIndex=0; this.refresh() }; Window_ShopStatus.prototype.refresh=function() { this.contents.clear(); if(this._item) { var x=this.textPadding(); this.drawPossession(x,0); if(this.isEquipItem()) { this.drawEquipInfo(x,this.lineHeight()*2) } } }; Window_ShopStatus.prototype.setItem=function(item) { this._item=item; this.refresh() }; Window_ShopStatus.prototype.isEquipItem=function() { return DataManager.isWeapon(this._item)||DataManager.isArmor(this._item) }; Window_ShopStatus.prototype.drawPossession=function(x,y) { var width=this.contents.width-this.textPadding()-x; var possessionWidth=this.textWidth('0000'); this.changeTextColor(this.systemColor()); this.drawText(TextManager.possession,x,y,width-possessionWidth); this.resetTextColor(); this.drawText($gameParty.numItems(this._item),x,y,width,'right') }; Window_ShopStatus.prototype.drawEquipInfo=function(x,y) { var members=this.statusMembers(); for(var i=0; i<members.length; i++) { this.drawActorEquipInfo(x,y+this.lineHeight()*(i*2.4),members[i]) } }; Window_ShopStatus.prototype.statusMembers=function() { var start=this._pageIndex*this.pageSize(); var end=start+this.pageSize(); return $gameParty.members().slice(start,end) }; Window_ShopStatus.prototype.pageSize=function() { return 4 }; Window_ShopStatus.prototype.maxPages=function() { return Math.floor(($gameParty.size()+this.pageSize()-1)/this.pageSize()) }; Window_ShopStatus.prototype.drawActorEquipInfo=function(x,y,actor) { var enabled=actor.canEquip(this._item); this.changePaintOpacity(enabled); this.resetTextColor(); this.drawText(actor.name(),x,y,168); var item1=this.currentEquippedItem(actor,this._item.etypeId); if(enabled) { this.drawActorParamChange(x,y,actor,item1) } this.drawItemName(item1,x,y+this.lineHeight()); this.changePaintOpacity(true) }; Window_ShopStatus.prototype.drawActorParamChange=function(x,y,actor,item1) { var width=this.contents.width-this.textPadding()-x; var paramId=this.paramId(); var change=this._item.params[paramId]-(item1?item1.params[paramId]:0); this.changeTextColor(this.paramchangeTextColor(change)); this.drawText((change>0?'+':'')+change,x,y,width,'right') }; Window_ShopStatus.prototype.paramId=function() { return DataManager.isWeapon(this._item)?2:3 }; Window_ShopStatus.prototype.currentEquippedItem=function(actor,etypeId) { var list=[]; var equips=actor.equips(); var slots=actor.equipSlots(); for(var i=0; i<slots.length; i++) { if(slots[i]===etypeId) { list.push(equips[i]) } } var paramId=this.paramId(); var worstParam=Number.MAX_VALUE; var worstItem=null; for(var j=0; j<list.length; j++) { if(list[j]&&list[j].params[paramId]<worstParam) { worstParam=list[j].params[paramId]; worstItem=list[j] } } return worstItem }; Window_ShopStatus.prototype.update=function() { Window_Base.prototype.update.call(this); this.updatePage() }; Window_ShopStatus.prototype.updatePage=function() { if(this.isPageChangeEnabled()&&this.isPageChangeRequested()) { this.changePage() } }; Window_ShopStatus.prototype.isPageChangeEnabled=function() { return this.visible&&this.maxPages()>=2 }; Window_ShopStatus.prototype.isPageChangeRequested=function() { if(Input.isTriggered('shift')) { return true } if(TouchInput.isTriggered()&&this.isTouchedInsideFrame()) { return true } return false }; Window_ShopStatus.prototype.isTouchedInsideFrame=function() { var x=this.canvasToLocalX(TouchInput.x); var y=this.canvasToLocalY(TouchInput.y); return x>=0&&y>=0&&x<this.width&&y<this.height }; Window_ShopStatus.prototype.changePage=function() { this._pageIndex=(this._pageIndex+1)%this.maxPages(); this.refresh(); SoundManager.playCursor() }; function Window_NameEdit() { this.initialize.apply(this,arguments) } Window_NameEdit.prototype=Object.create(Window_Base.prototype); Window_NameEdit.prototype.constructor=Window_NameEdit; Window_NameEdit.prototype.initialize=function(actor,maxLength) { var width=this.windowWidth(); var height=this.windowHeight(); var x=(Graphics.boxWidth-width)/2; var y=(Graphics.boxHeight-(height+this.fittingHeight(9)+8))/2; Window_Base.prototype.initialize.call(this,x,y,width,height); this._actor=actor; this._name=actor.name().slice(0,this._maxLength); this._index=this._name.length; this._maxLength=maxLength; this._defaultName=this._name; this.deactivate(); this.refresh(); ImageManager.loadFace(actor.faceName()) }; Window_NameEdit.prototype.windowWidth=function() { return 480 }; Window_NameEdit.prototype.windowHeight=function() { return this.fittingHeight(4) }; Window_NameEdit.prototype.name=function() { return this._name }; Window_NameEdit.prototype.restoreDefault=function() { this._name=this._defaultName; this._index=this._name.length; this.refresh(); return this._name.length>0 }; Window_NameEdit.prototype.add=function(ch) { if(this._index<this._maxLength) { this._name+=ch; this._index++; this.refresh(); return true } else { return false } }; Window_NameEdit.prototype.back=function() { if(this._index>0) { this._index--; this._name=this._name.slice(0,this._index); this.refresh(); return true } else { return false } }; Window_NameEdit.prototype.faceWidth=function() { return 144 }; Window_NameEdit.prototype.charWidth=function() { var text=$gameSystem.isJapanese()?'\uff21':'A'; return this.textWidth(text) }; Window_NameEdit.prototype.left=function() { var nameCenter=(this.contentsWidth()+this.faceWidth())/2; var nameWidth=(this._maxLength+1)*this.charWidth(); return Math.min(nameCenter-nameWidth/2,this.contentsWidth()-nameWidth) }; Window_NameEdit.prototype.itemRect=function(index) { return { x:this.left()+index*this.charWidth(),y:54,width:this.charWidth(),height:this.lineHeight() } }; Window_NameEdit.prototype.underlineRect=function(index) { var rect=this.itemRect(index); rect.x++; rect.y+=rect.height-4; rect.width-=2; rect.height=2; return rect }; Window_NameEdit.prototype.underlineColor=function() { return this.normalColor() }; Window_NameEdit.prototype.drawUnderline=function(index) { var rect=this.underlineRect(index); var color=this.underlineColor(); this.contents.paintOpacity=48; this.contents.fillRect(rect.x,rect.y,rect.width,rect.height,color); this.contents.paintOpacity=255 }; Window_NameEdit.prototype.drawChar=function(index) { var rect=this.itemRect(index); this.resetTextColor(); this.drawText(this._name[index]||'',rect.x,rect.y) }; Window_NameEdit.prototype.refresh=function() { this.contents.clear(); this.drawActorFace(this._actor,0,0); for(var i=0; i<this._maxLength; i++) { this.drawUnderline(i) } for(var j=0; j<this._name.length; j++) { this.drawChar(j) } var rect=this.itemRect(this._index); this.setCursorRect(rect.x,rect.y,rect.width,rect.height) }; function Window_NameInput() { this.initialize.apply(this,arguments) } Window_NameInput.prototype=Object.create(Window_Selectable.prototype); Window_NameInput.prototype.constructor=Window_NameInput; Window_NameInput.LATIN1=['A','B','C','D','E','a','b','c','d','e','F','G','H','I','J','f','g','h','i','j','K','L','M','N','O','k','l','m','n','o','P','Q','R','S','T','p','q','r','s','t','U','V','W','X','Y','u','v','w','x','y','Z','[',']','^','_','z',' { ',' } ','|','~','0','1','2','3','4','!','#','$','%','&','5','6','7','8','9','(',')','*','+','-','/','=','@','<','>',':','; ',' ','Page','OK']; Window_NameInput.LATIN2=['Ã','É','Ã','Ó','Ú','á','é','Ã','ó','ú','À','È','ÃŒ','Ã’','Ù','à ','è','ì','ò','ù','Â','Ê','ÃŽ','Ô','Û','â','ê','î','ô','û','Ä','Ë','Ã','Ö','Ãœ','ä','ë','ï','ö','ü','Ä€','Ä’','Ī','ÅŒ','Ū','Ä','Ä“','Ä«','Å','Å«','Ã','Ã…','Æ','Ç','Ã','ã','Ã¥','æ','ç','ð','Ñ','Õ','Ø','Å ','Å´','ñ','õ','ø','Å¡','ŵ','Ã','Ŷ','Ÿ','Ž','Þ','ý','ÿ','Å·','ž','þ','IJ','Å’','ij','Å“','ß','«','»',' ','Page','OK']; Window_NameInput.RUSSIA=['Ð','Б','Ð’','Г','Д','а','б','в','г','д','Е','Ð','Ж','З','И','е','Ñ‘','ж','з','и','Й','К','Л','Ðœ','Ð','й','к','л','м','н','О','П','Ð ','С','Т','о','п','Ñ€','Ñ','Ñ‚','У','Ф','Ð¥','Ц','Ч','у','Ñ„','Ñ…','ц','ч','Ш','Щ','Ъ','Ы','Ь','ш','щ','ÑŠ','Ñ‹','ÑŒ','Ð','Ю','Я','^','_','Ñ','ÑŽ','Ñ','%','&','0','1','2','3','4','(',')','*','+','-','5','6','7','8','9',':','; ',' ','','OK']; Window_NameInput.JAPAN1=['ã‚','ã„','ã†','ãˆ','ãŠ','ãŒ','ãŽ','ã','ã’','ã”','ã‹','ã','ã','ã‘','ã“','ã–','ã˜','ãš','ãœ','ãž','ã•','ã—','ã™','ã›','ã','ã ','ã¢','ã¥','ã§','ã©','ãŸ','ã¡','ã¤','ã¦','ã¨','ã°','ã³','ã¶','ã¹','ã¼','ãª','ã«','ã¬','ã','ã®','ã±','ã´','ã·','ãº','ã½','ã¯','ã²','ãµ','ã¸','ã»','ã','ãƒ','ã…','ã‡','ã‰','ã¾','ã¿','ã‚€','ã‚','ã‚‚','ã£','ゃ','ã‚…','ょ','ã‚Ž','ã‚„','ゆ','よ','ã‚','ã‚“','ー','~','・','ï¼','☆','ら','ã‚Š','ã‚‹','ã‚Œ','ã‚','ã‚”','ã‚’',' ','カナ','決定']; Window_NameInput.JAPAN2=['ã‚¢','イ','ウ','エ','オ','ガ','ã‚®','ã‚°','ゲ','ã‚´','ã‚«','ã‚','ク','ケ','コ','ザ','ジ','ズ','ゼ','ゾ','サ','ã‚·','ス','ã‚»','ソ','ダ','ヂ','ヅ','デ','ド','ã‚¿','ãƒ','ツ','テ','ト','ãƒ','ビ','ブ','ベ','ボ','ナ','ニ','ヌ','ãƒ','ノ','パ','ピ','プ','ペ','ãƒ','ãƒ','ヒ','フ','ヘ','ホ','ã‚¡','ã‚£','ã‚¥','ェ','ã‚©','マ','ミ','ム','メ','モ','ッ','ャ','ュ','ョ','ヮ','ヤ','ユ','ヨ','ワ','ン','ー','~','・','ï¼','☆','ラ','リ','ル','レ','ãƒ','ヴ','ヲ',' ','英数','決定']; Window_NameInput.JAPAN3=['A','ï¼¢','ï¼£','D','ï¼¥','ï½','b','c','d','ï½…','F','G','H','I','J','f','g','h','i','j','K','L','ï¼','ï¼®','O','k','l','ï½','n','ï½','ï¼°','ï¼±','ï¼²','ï¼³','ï¼´','ï½','q','ï½’','s','ï½”','ï¼µ','V','ï¼·','X','ï¼¹','u','ï½–','ï½—','x','ï½™','Z','ï¼»','ï¼½','ï¼¾','_','z','ï½›','ï½','|','~','ï¼','1','ï¼’','3','ï¼”','ï¼','#','$','ï¼…','&','5','ï¼–','ï¼—','8','ï¼™','(',')','*','+','ï¼','ï¼','ï¼','ï¼ ','<','>',':','ï¼›',' ','ã‹ãª','決定']; Window_NameInput.prototype.initialize=function(editWindow) { var x=editWindow.x; var y=editWindow.y+editWindow.height+8; var width=editWindow.width; var height=this.windowHeight(); Window_Selectable.prototype.initialize.call(this,x,y,width,height); this._editWindow=editWindow; this._page=0; this._index=0; this.refresh(); this.updateCursor(); this.activate() }; Window_NameInput.prototype.windowHeight=function() { return this.fittingHeight(9) }; Window_NameInput.prototype.table=function() { if($gameSystem.isJapanese()) { return[Window_NameInput.JAPAN1,Window_NameInput.JAPAN2,Window_NameInput.JAPAN3] } else if($gameSystem.isRussian()) { return[Window_NameInput.RUSSIA] } else { return[Window_NameInput.LATIN1,Window_NameInput.LATIN2] } }; Window_NameInput.prototype.maxCols=function() { return 10 }; Window_NameInput.prototype.maxItems=function() { return 90 }; Window_NameInput.prototype.character=function() { return this._index<88?this.table()[this._page][this._index]:'' }; Window_NameInput.prototype.isPageChange=function() { return this._index===88 }; Window_NameInput.prototype.isOk=function() { return this._index===89 }; Window_NameInput.prototype.itemRect=function(index) { return { x:index%10*42+Math.floor(index%10/5)*24,y:Math.floor(index/10)*this.lineHeight(),width:42,height:this.lineHeight() } }; Window_NameInput.prototype.refresh=function() { var table=this.table(); this.contents.clear(); this.resetTextColor(); for(var i=0; i<90; i++) { var rect=this.itemRect(i); rect.x+=3; rect.width-=6; this.drawText(table[this._page][i],rect.x,rect.y,rect.width,'center') } }; Window_NameInput.prototype.updateCursor=function() { var rect=this.itemRect(this._index); this.setCursorRect(rect.x,rect.y,rect.width,rect.height) }; Window_NameInput.prototype.isCursorMovable=function() { return this.active }; Window_NameInput.prototype.cursorDown=function(wrap) { if(this._index<80||wrap) { this._index=(this._index+10)%90 } }; Window_NameInput.prototype.cursorUp=function(wrap) { if(this._index>=10||wrap) { this._index=(this._index+80)%90 } }; Window_NameInput.prototype.cursorRight=function(wrap) { if(this._index%10<9) { this._index++ } else if(wrap) { this._index-=9 } }; Window_NameInput.prototype.cursorLeft=function(wrap) { if(this._index%10>0) { this._index-- } else if(wrap) { this._index+=9 } }; Window_NameInput.prototype.cursorPagedown=function() { this._page=(this._page+1)%this.table().length; this.refresh() }; Window_NameInput.prototype.cursorPageup=function() { this._page=(this._page+this.table().length-1)%this.table().length; this.refresh() }; Window_NameInput.prototype.processCursorMove=function() { var lastPage=this._page; Window_Selectable.prototype.processCursorMove.call(this); this.updateCursor(); if(this._page!==lastPage) { SoundManager.playCursor() } }; Window_NameInput.prototype.processHandling=function() { if(this.isOpen()&&this.active) { if(Input.isTriggered('shift')) { this.processJump() } if(Input.isRepeated('cancel')) { this.processBack() } if(Input.isRepeated('ok')) { this.processOk() } } }; Window_NameInput.prototype.isCancelEnabled=function() { return true }; Window_NameInput.prototype.processCancel=function() { this.processBack() }; Window_NameInput.prototype.processJump=function() { if(this._index!==89) { this._index=89; SoundManager.playCursor() } }; Window_NameInput.prototype.processBack=function() { if(this._editWindow.back()) { SoundManager.playCancel() } }; Window_NameInput.prototype.processOk=function() { if(this.character()) { this.onNameAdd() } else if(this.isPageChange()) { SoundManager.playOk(); this.cursorPagedown() } else if(this.isOk()) { this.onNameOk() } }; Window_NameInput.prototype.onNameAdd=function() { if(this._editWindow.add(this.character())) { SoundManager.playOk() } else { SoundManager.playBuzzer() } }; Window_NameInput.prototype.onNameOk=function() { if(this._editWindow.name()==='') { if(this._editWindow.restoreDefault()) { SoundManager.playOk() } else { SoundManager.playBuzzer() } } else { SoundManager.playOk(); this.callOkHandler() } }; function Window_ChoiceList() { this.initialize.apply(this,arguments) } Window_ChoiceList.prototype=Object.create(Window_Command.prototype); Window_ChoiceList.prototype.constructor=Window_ChoiceList; Window_ChoiceList.prototype.initialize=function(messageWindow) { this._messageWindow=messageWindow; Window_Command.prototype.initialize.call(this,0,0); this.openness=0; this.deactivate(); this._background=0 }; Window_ChoiceList.prototype.start=function() { this.updatePlacement(); this.updateBackground(); this.refresh(); this.selectDefault(); this.open(); this.activate() }; Window_ChoiceList.prototype.selectDefault=function() { this.select($gameMessage.choiceDefaultType()) }; Window_ChoiceList.prototype.updatePlacement=function() { var positionType=$gameMessage.choicePositionType(); var messageY=this._messageWindow.y; this.width=this.windowWidth(); this.height=this.windowHeight(); switch(positionType) { case 0:this.x=0; break; case 1:this.x=(Graphics.boxWidth-this.width)/2; break; case 2:this.x=Graphics.boxWidth-this.width; break } if(messageY>=Graphics.boxHeight/2) { this.y=messageY-this.height } else { this.y=messageY+this._messageWindow.height } }; Window_ChoiceList.prototype.updateBackground=function() { this._background=$gameMessage.choiceBackground(); this.setBackgroundType(this._background) }; Window_ChoiceList.prototype.windowWidth=function() { var width=this.maxChoiceWidth()+this.padding*2; return Math.min(width,Graphics.boxWidth) }; Window_ChoiceList.prototype.numVisibleRows=function() { var messageY=this._messageWindow.y; var messageHeight=this._messageWindow.height; var centerY=Graphics.boxHeight/2; var choices=$gameMessage.choices(); var numLines=choices.length; var maxLines=8; if(messageY<centerY&&messageY+messageHeight>centerY) { maxLines=4 } if(numLines>maxLines) { numLines=maxLines } return numLines }; Window_ChoiceList.prototype.maxChoiceWidth=function() { var maxWidth=96; var choices=$gameMessage.choices(); for(var i=0; i<choices.length; i++) { var choiceWidth=this.textWidthEx(choices[i])+this.textPadding()*2; if(maxWidth<choiceWidth) { maxWidth=choiceWidth } } return maxWidth }; Window_ChoiceList.prototype.textWidthEx=function(text) { return this.drawTextEx(text,0,this.contents.height) }; Window_ChoiceList.prototype.contentsHeight=function() { return this.maxItems()*this.itemHeight() }; Window_ChoiceList.prototype.makeCommandList=function() { var choices=$gameMessage.choices(); for(var i=0; i<choices.length; i++) { this.addCommand(choices[i],'choice') } }; Window_ChoiceList.prototype.drawItem=function(index) { var rect=this.itemRectForText(index); this.drawTextEx(this.commandName(index),rect.x,rect.y) }; Window_ChoiceList.prototype.isCancelEnabled=function() { return $gameMessage.choiceCancelType()!==-1 }; Window_ChoiceList.prototype.isOkTriggered=function() { return Input.isTriggered('ok') }; Window_ChoiceList.prototype.callOkHandler=function() { $gameMessage.onChoice(this.index()); this._messageWindow.terminateMessage(); this.close() }; Window_ChoiceList.prototype.callCancelHandler=function() { $gameMessage.onChoice($gameMessage.choiceCancelType()); this._messageWindow.terminateMessage(); this.close() }; function Window_NumberInput() { this.initialize.apply(this,arguments) } Window_NumberInput.prototype=Object.create(Window_Selectable.prototype); Window_NumberInput.prototype.constructor=Window_NumberInput; Window_NumberInput.prototype.initialize=function(messageWindow) { this._messageWindow=messageWindow; Window_Selectable.prototype.initialize.call(this,0,0,0,0); this._number=0; this._maxDigits=1; this.openness=0; this.createButtons(); this.deactivate() }; Window_NumberInput.prototype.start=function() { this._maxDigits=$gameMessage.numInputMaxDigits(); this._number=$gameVariables.value($gameMessage.numInputVariableId()); this._number=this._number.clamp(0,Math.pow(10,this._maxDigits)-1); this.updatePlacement(); this.placeButtons(); this.updateButtonsVisiblity(); this.createContents(); this.refresh(); this.open(); this.activate(); this.select(0) }; Window_NumberInput.prototype.updatePlacement=function() { var messageY=this._messageWindow.y; var spacing=8; this.width=this.windowWidth(); this.height=this.windowHeight(); this.x=(Graphics.boxWidth-this.width)/2; if(messageY>=Graphics.boxHeight/2) { this.y=messageY-this.height-spacing } else { this.y=messageY+this._messageWindow.height+spacing } }; Window_NumberInput.prototype.windowWidth=function() { return this.maxCols()*this.itemWidth()+this.padding*2 }; Window_NumberInput.prototype.windowHeight=function() { return this.fittingHeight(1) }; Window_NumberInput.prototype.maxCols=function() { return this._maxDigits }; Window_NumberInput.prototype.maxItems=function() { return this._maxDigits }; Window_NumberInput.prototype.spacing=function() { return 0 }; Window_NumberInput.prototype.itemWidth=function() { return 32 }; Window_NumberInput.prototype.createButtons=function() { var bitmap=ImageManager.loadSystem('ButtonSet'); var buttonWidth=48; var buttonHeight=48; this._buttons=[]; for(var i=0; i<3; i++) { var button=new Sprite_Button(); var x=buttonWidth*[1,2,4][i]; var w=buttonWidth*(i===2?2:1); button.bitmap=bitmap; button.setColdFrame(x,0,w,buttonHeight); button.setHotFrame(x,buttonHeight,w,buttonHeight); button.visible=false; this._buttons.push(button); this.addChild(button) } this._buttons[0].setClickHandler(this.onButtonDown.bind(this)); this._buttons[1].setClickHandler(this.onButtonUp.bind(this)); this._buttons[2].setClickHandler(this.onButtonOk.bind(this)) }; Window_NumberInput.prototype.placeButtons=function() { var numButtons=this._buttons.length; var spacing=16; var totalWidth=-spacing; for(var i=0; i<numButtons; i++) { totalWidth+=this._buttons[i].width+spacing } var x=(this.width-totalWidth)/2; for(var j=0; j<numButtons; j++) { var button=this._buttons[j]; button.x=x; button.y=this.buttonY(); x+=button.width+spacing } }; Window_NumberInput.prototype.updateButtonsVisiblity=function() { if(TouchInput.date>Input.date) { this.showButtons() } else { this.hideButtons() } }; Window_NumberInput.prototype.showButtons=function() { for(var i=0; i<this._buttons.length; i++) { this._buttons[i].visible=true } }; Window_NumberInput.prototype.hideButtons=function() { for(var i=0; i<this._buttons.length; i++) { this._buttons[i].visible=false } }; Window_NumberInput.prototype.buttonY=function() { var spacing=8; if(this._messageWindow.y>=Graphics.boxHeight/2) { return 0-this._buttons[0].height-spacing } else { return this.height+spacing } }; Window_NumberInput.prototype.update=function() { Window_Selectable.prototype.update.call(this); this.processDigitChange() }; Window_NumberInput.prototype.processDigitChange=function() { if(this.isOpenAndActive()) { if(Input.isRepeated('up')) { this.changeDigit(true) } else if(Input.isRepeated('down')) { this.changeDigit(false) } } }; Window_NumberInput.prototype.changeDigit=function(up) { var index=this.index(); var place=Math.pow(10,this._maxDigits-1-index); var n=Math.floor(this._number/place)%10; this._number-=n*place; if(up) { n=(n+1)%10 } else { n=(n+9)%10 } this._number+=n*place; this.refresh(); SoundManager.playCursor() }; Window_NumberInput.prototype.isTouchOkEnabled=function() { return false }; Window_NumberInput.prototype.isOkEnabled=function() { return true }; Window_NumberInput.prototype.isCancelEnabled=function() { return false }; Window_NumberInput.prototype.isOkTriggered=function() { return Input.isTriggered('ok') }; Window_NumberInput.prototype.processOk=function() { SoundManager.playOk(); $gameVariables.setValue($gameMessage.numInputVariableId(),this._number); this._messageWindow.terminateMessage(); this.updateInputData(); this.deactivate(); this.close() }; Window_NumberInput.prototype.drawItem=function(index) { var rect=this.itemRect(index); var align='center'; var s=this._number.padZero(this._maxDigits); var c=s.slice(index,index+1); this.resetTextColor(); this.drawText(c,rect.x,rect.y,rect.width,align) }; Window_NumberInput.prototype.onButtonUp=function() { this.changeDigit(true) }; Window_NumberInput.prototype.onButtonDown=function() { this.changeDigit(false) }; Window_NumberInput.prototype.onButtonOk=function() { this.processOk(); this.hideButtons() }; function Window_EventItem() { this.initialize.apply(this,arguments) } Window_EventItem.prototype=Object.create(Window_ItemList.prototype); Window_EventItem.prototype.constructor=Window_EventItem; Window_EventItem.prototype.initialize=function(messageWindow) { this._messageWindow=messageWindow; var width=Graphics.boxWidth; var height=this.windowHeight(); Window_ItemList.prototype.initialize.call(this,0,0,width,height); this.openness=0; this.deactivate(); this.setHandler('ok',this.onOk.bind(this)); this.setHandler('cancel',this.onCancel.bind(this)) }; Window_EventItem.prototype.windowHeight=function() { return this.fittingHeight(this.numVisibleRows()) }; Window_EventItem.prototype.numVisibleRows=function() { return 4 }; Window_EventItem.prototype.start=function() { this.refresh(); this.updatePlacement(); this.select(0); this.open(); this.activate() }; Window_EventItem.prototype.updatePlacement=function() { if(this._messageWindow.y>=Graphics.boxHeight/2) { this.y=0 } else { this.y=Graphics.boxHeight-this.height } }; Window_EventItem.prototype.includes=function(item) { var itypeId=$gameMessage.itemChoiceItypeId(); return DataManager.isItem(item)&&item.itypeId===itypeId }; Window_EventItem.prototype.isEnabled=function(item) { return true }; Window_EventItem.prototype.onOk=function() { var item=this.item(); var itemId=item?item.id:0; $gameVariables.setValue($gameMessage.itemChoiceVariableId(),itemId); this._messageWindow.terminateMessage(); this.close() }; Window_EventItem.prototype.onCancel=function() { $gameVariables.setValue($gameMessage.itemChoiceVariableId(),0); this._messageWindow.terminateMessage(); this.close() }; function Window_Message() { this.initialize.apply(this,arguments) } Window_Message.prototype=Object.create(Window_Base.prototype); Window_Message.prototype.constructor=Window_Message; Window_Message.prototype.initialize=function() { var width=this.windowWidth(); var height=this.windowHeight(); var x=(Graphics.boxWidth-width)/2; Window_Base.prototype.initialize.call(this,x,0,width,height); this.openness=0; this.initMembers(); this.createSubWindows(); this.updatePlacement() }; Window_Message.prototype.initMembers=function() { this._background=0; this._positionType=2; this._waitCount=0; this._faceBitmap=null; this._textState=null; this.clearFlags() }; Window_Message.prototype.subWindows=function() { return[this._goldWindow,this._choiceWindow,this._numberWindow,this._itemWindow] }; Window_Message.prototype.createSubWindows=function() { this._goldWindow=new Window_Gold(0,0); this._goldWindow.x=Graphics.boxWidth-this._goldWindow.width; this._goldWindow.openness=0; this._choiceWindow=new Window_ChoiceList(this); this._numberWindow=new Window_NumberInput(this); this._itemWindow=new Window_EventItem(this) }; Window_Message.prototype.windowWidth=function() { return Graphics.boxWidth }; Window_Message.prototype.windowHeight=function() { return this.fittingHeight(this.numVisibleRows()) }; Window_Message.prototype.clearFlags=function() { this._showFast=false; this._lineShowFast=false; this._pauseSkip=false }; Window_Message.prototype.numVisibleRows=function() { return 4 }; Window_Message.prototype.update=function() { this.checkToNotClose(); Window_Base.prototype.update.call(this); while(!this.isOpening()&&!this.isClosing()) { if(this.updateWait()) { return } else if(this.updateLoading()) { return } else if(this.updateInput()) { return } else if(this.updateMessage()) { return } else if(this.canStart()) { this.startMessage() } else { this.startInput(); return } } }; Window_Message.prototype.checkToNotClose=function() { if(this.isClosing()&&this.isOpen()) { if(this.doesContinue()) { this.open() } } }; Window_Message.prototype.canStart=function() { return $gameMessage.hasText()&&!$gameMessage.scrollMode() }; Window_Message.prototype.startMessage=function() { this._textState= { }; this._textState.index=0; this._textState.text=this.convertEscapeCharacters($gameMessage.allText()); this.newPage(this._textState); this.updatePlacement(); this.updateBackground(); this.open() }; Window_Message.prototype.updatePlacement=function() { this._positionType=$gameMessage.positionType(); this.y=this._positionType*(Graphics.boxHeight-this.height)/2; this._goldWindow.y=this.y>0?0:Graphics.boxHeight-this._goldWindow.height }; Window_Message.prototype.updateBackground=function() { this._background=$gameMessage.background(); this.setBackgroundType(this._background) }; Window_Message.prototype.terminateMessage=function() { this.close(); this._goldWindow.close(); $gameMessage.clear() }; Window_Message.prototype.updateWait=function() { if(this._waitCount>0) { this._waitCount--; return true } else { return false } }; Window_Message.prototype.updateLoading=function() { if(this._faceBitmap) { if(ImageManager.isReady()) { this.drawMessageFace(); this._faceBitmap=null; return false } else { return true } } else { return false } }; Window_Message.prototype.updateInput=function() { if(this.isAnySubWindowActive()) { return true } if(this.pause) { if(this.isTriggered()) { Input.update(); this.pause=false; if(!this._textState) { this.terminateMessage() } } return true } return false }; Window_Message.prototype.isAnySubWindowActive=function() { return(this._choiceWindow.active||this._numberWindow.active||this._itemWindow.active) }; Window_Message.prototype.updateMessage=function() { if(this._textState) { while(!this.isEndOfText(this._textState)) { if(this.needsNewPage(this._textState)) { this.newPage(this._textState) } this.updateShowFast(); this.processCharacter(this._textState); if(!this._showFast&&!this._lineShowFast) { break } if(this.pause||this._waitCount>0) { break } } if(this.isEndOfText(this._textState)) { this.onEndOfText() } return true } else { return false } }; Window_Message.prototype.onEndOfText=function() { if(!this.startInput()) { if(!this._pauseSkip) { this.startPause() } else { this.terminateMessage() } } this._textState=null }; Window_Message.prototype.startInput=function() { if($gameMessage.isChoice()) { this._choiceWindow.start(); return true } else if($gameMessage.isNumberInput()) { this._numberWindow.start(); return true } else if($gameMessage.isItemChoice()) { this._itemWindow.start(); return true } else { return false } }; Window_Message.prototype.isTriggered=function() { return(Input.isRepeated('ok')||Input.isRepeated('cancel')||TouchInput.isRepeated()) }; Window_Message.prototype.doesContinue=function() { return($gameMessage.hasText()&&!$gameMessage.scrollMode()&&!this.areSettingsChanged()) }; Window_Message.prototype.areSettingsChanged=function() { return(this._background!==$gameMessage.background()||this._positionType!==$gameMessage.positionType()) }; Window_Message.prototype.updateShowFast=function() { if(this.isTriggered()) { this._showFast=true } }; Window_Message.prototype.newPage=function(textState) { this.contents.clear(); this.resetFontSettings(); this.clearFlags(); this.loadMessageFace(); textState.x=this.newLineX(); textState.y=0; textState.left=this.newLineX(); textState.height=this.calcTextHeight(textState,false) }; Window_Message.prototype.loadMessageFace=function() { this._faceBitmap=ImageManager.loadFace($gameMessage.faceName()) }; Window_Message.prototype.drawMessageFace=function() { this.drawFace($gameMessage.faceName(),$gameMessage.faceIndex(),0,0) }; Window_Message.prototype.newLineX=function() { return $gameMessage.faceName()===''?0:168 }; Window_Message.prototype.processNewLine=function(textState) { this._lineShowFast=false; Window_Base.prototype.processNewLine.call(this,textState); if(this.needsNewPage(textState)) { this.startPause() } }; Window_Message.prototype.processNewPage=function(textState) { Window_Base.prototype.processNewPage.call(this,textState); if(textState.text[textState.index]==='\n') { textState.index++ } textState.y=this.contents.height; this.startPause() }; Window_Message.prototype.isEndOfText=function(textState) { return textState.index>=textState.text.length }; Window_Message.prototype.needsNewPage=function(textState) { return(!this.isEndOfText(textState)&&textState.y+textState.height>this.contents.height) }; Window_Message.prototype.processEscapeCharacter=function(code,textState) { switch(code) { case'$':this._goldWindow.open(); break; case'.':this.startWait(15); break; case'|':this.startWait(60); break; case'!':this.startPause(); break; case'>':this._lineShowFast=true; break; case'<':this._lineShowFast=false; break; case'^':this._pauseSkip=true; break; default:Window_Base.prototype.processEscapeCharacter.call(this,code,textState); break } }; Window_Message.prototype.startWait=function(count) { this._waitCount=count }; Window_Message.prototype.startPause=function() { this.startWait(10); this.pause=true }; function Window_ScrollText() { this.initialize.apply(this,arguments) } Window_ScrollText.prototype=Object.create(Window_Base.prototype); Window_ScrollText.prototype.constructor=Window_ScrollText; Window_ScrollText.prototype.initialize=function() { var width=Graphics.boxWidth; var height=Graphics.boxHeight; Window_Base.prototype.initialize.call(this,0,0,width,height); this.opacity=0; this.hide(); this._text=''; this._allTextHeight=0 }; Window_ScrollText.prototype.update=function() { Window_Base.prototype.update.call(this); if($gameMessage.scrollMode()) { if(this._text) { this.updateMessage() } if(!this._text&&$gameMessage.hasText()) { this.startMessage() } } }; Window_ScrollText.prototype.startMessage=function() { this._text=$gameMessage.allText(); this.refresh(); this.show() }; Window_ScrollText.prototype.refresh=function() { var textState= { index:0 }; textState.text=this.convertEscapeCharacters(this._text); this.resetFontSettings(); this._allTextHeight=this.calcTextHeight(textState,true); this.createContents(); this.origin.y=-this.height; this.drawTextEx(this._text,this.textPadding(),1) }; Window_ScrollText.prototype.contentsHeight=function() { return Math.max(this._allTextHeight,1) }; Window_ScrollText.prototype.updateMessage=function() { this.origin.y+=this.scrollSpeed(); if(this.origin.y>=this.contents.height) { this.terminateMessage() } }; Window_ScrollText.prototype.scrollSpeed=function() { var speed=$gameMessage.scrollSpeed()/2; if(this.isFastForward()) { speed*=this.fastForwardRate() } return speed }; Window_ScrollText.prototype.isFastForward=function() { if($gameMessage.scrollNoFast()) { return false } else { return(Input.isPressed('ok')||Input.isPressed('shift')||TouchInput.isPressed()) } }; Window_ScrollText.prototype.fastForwardRate=function() { return 3 }; Window_ScrollText.prototype.terminateMessage=function() { this._text=null; $gameMessage.clear(); this.hide() }; function Window_MapName() { this.initialize.apply(this,arguments) } Window_MapName.prototype=Object.create(Window_Base.prototype); Window_MapName.prototype.constructor=Window_MapName; Window_MapName.prototype.initialize=function() { var wight=this.windowWidth(); var height=this.windowHeight(); Window_Base.prototype.initialize.call(this,0,0,wight,height); this.opacity=0; this.contentsOpacity=0; this._showCount=0; this.refresh() }; Window_MapName.prototype.windowWidth=function() { return 360 }; Window_MapName.prototype.windowHeight=function() { return this.fittingHeight(1) }; Window_MapName.prototype.update=function() { Window_Base.prototype.update.call(this); if(this._showCount>0&&$gameMap.isNameDisplayEnabled()) { this.updateFadeIn(); this._showCount-- } else { this.updateFadeOut() } }; Window_MapName.prototype.updateFadeIn=function() { this.contentsOpacity+=16 }; Window_MapName.prototype.updateFadeOut=function() { this.contentsOpacity-=16 }; Window_MapName.prototype.open=function() { this.refresh(); this._showCount=150 }; Window_MapName.prototype.close=function() { this._showCount=0 }; Window_MapName.prototype.refresh=function() { this.contents.clear(); if($gameMap.displayName()) { var width=this.contentsWidth(); this.drawBackground(0,0,width,this.lineHeight()); this.drawText($gameMap.displayName(),0,0,width,'center') } }; Window_MapName.prototype.drawBackground=function(x,y,width,height) { var color1=this.dimColor1(); var color2=this.dimColor2(); this.contents.gradientFillRect(x,y,width/2,height,color2,color1); this.contents.gradientFillRect(x+width/2,y,width/2,height,color1,color2) }; function Window_BattleLog() { this.initialize.apply(this,arguments) } Window_BattleLog.prototype=Object.create(Window_Selectable.prototype); Window_BattleLog.prototype.constructor=Window_BattleLog; Window_BattleLog.prototype.initialize=function() { var width=this.windowWidth(); var height=this.windowHeight(); Window_Selectable.prototype.initialize.call(this,0,0,width,height); this.opacity=0; this._lines=[]; this._methods=[]; this._waitCount=0; this._waitMode=''; this._baseLineStack=[]; this._spriteset=null; this.createBackBitmap(); this.createBackSprite(); this.refresh() }; Window_BattleLog.prototype.setSpriteset=function(spriteset) { this._spriteset=spriteset }; Window_BattleLog.prototype.windowWidth=function() { return Graphics.boxWidth }; Window_BattleLog.prototype.windowHeight=function() { return this.fittingHeight(this.maxLines()) }; Window_BattleLog.prototype.maxLines=function() { return 10 }; Window_BattleLog.prototype.createBackBitmap=function() { this._backBitmap=new Bitmap(this.width,this.height) }; Window_BattleLog.prototype.createBackSprite=function() { this._backSprite=new Sprite(); this._backSprite.bitmap=this._backBitmap; this._backSprite.y=this.y; this.addChildToBack(this._backSprite) }; Window_BattleLog.prototype.numLines=function() { return this._lines.length }; Window_BattleLog.prototype.messageSpeed=function() { return 16 }; Window_BattleLog.prototype.isBusy=function() { return this._waitCount>0||this._waitMode||this._methods.length>0 }; Window_BattleLog.prototype.update=function() { if(!this.updateWait()) { this.callNextMethod() } }; Window_BattleLog.prototype.updateWait=function() { return this.updateWaitCount()||this.updateWaitMode() }; Window_BattleLog.prototype.updateWaitCount=function() { if(this._waitCount>0) { this._waitCount-=this.isFastForward()?3:1; if(this._waitCount<0) { this._waitCount=0 } return true } return false }; Window_BattleLog.prototype.updateWaitMode=function() { var waiting=false; switch(this._waitMode) { case'effect':waiting=this._spriteset.isEffecting(); break; case'movement':waiting=this._spriteset.isAnyoneMoving(); break } if(!waiting) { this._waitMode='' } return waiting }; Window_BattleLog.prototype.setWaitMode=function(waitMode) { this._waitMode=waitMode }; Window_BattleLog.prototype.callNextMethod=function() { if(this._methods.length>0) { var method=this._methods.shift(); if(method.name&&this[method.name]) { this[method.name].apply(this,method.params) } else { throw new Error('Method not found: '+method.name) } } }; Window_BattleLog.prototype.isFastForward=function() { return(Input.isLongPressed('ok')||Input.isPressed('shift')||TouchInput.isLongPressed()) }; Window_BattleLog.prototype.push=function(methodName) { var methodArgs=Array.prototype.slice.call(arguments,1); this._methods.push( { name:methodName,params:methodArgs } ) }; Window_BattleLog.prototype.clear=function() { this._lines=[]; this._baseLineStack=[]; this.refresh() }; Window_BattleLog.prototype.wait=function() { this._waitCount=this.messageSpeed() }; Window_BattleLog.prototype.waitForEffect=function() { this.setWaitMode('effect') }; Window_BattleLog.prototype.waitForMovement=function() { this.setWaitMode('movement') }; Window_BattleLog.prototype.addText=function(text) { this._lines.push(text); this.refresh(); this.wait() }; Window_BattleLog.prototype.pushBaseLine=function() { this._baseLineStack.push(this._lines.length) }; Window_BattleLog.prototype.popBaseLine=function() { var baseLine=this._baseLineStack.pop(); while(this._lines.length>baseLine) { this._lines.pop() } }; Window_BattleLog.prototype.waitForNewLine=function() { var baseLine=0; if(this._baseLineStack.length>0) { baseLine=this._baseLineStack[this._baseLineStack.length-1] } if(this._lines.length>baseLine) { this.wait() } }; Window_BattleLog.prototype.popupDamage=function(target) { target.startDamagePopup() }; Window_BattleLog.prototype.performActionStart=function(subject,action) { subject.performActionStart(action) }; Window_BattleLog.prototype.performAction=function(subject,action) { subject.performAction(action) }; Window_BattleLog.prototype.performActionEnd=function(subject) { subject.performActionEnd() }; Window_BattleLog.prototype.performDamage=function(target) { target.performDamage() }; Window_BattleLog.prototype.performMiss=function(target) { target.performMiss() }; Window_BattleLog.prototype.performRecovery=function(target) { target.performRecovery() }; Window_BattleLog.prototype.performEvasion=function(target) { target.performEvasion() }; Window_BattleLog.prototype.performMagicEvasion=function(target) { target.performMagicEvasion() }; Window_BattleLog.prototype.performCounter=function(target) { target.performCounter() }; Window_BattleLog.prototype.performReflection=function(target) { target.performReflection() }; Window_BattleLog.prototype.performSubstitute=function(substitute,target) { substitute.performSubstitute(target) }; Window_BattleLog.prototype.performCollapse=function(target) { target.performCollapse() }; Window_BattleLog.prototype.showAnimation=function(subject,targets,animationId) { if(animationId<0) { this.showAttackAnimation(subject,targets) } else { this.showNormalAnimation(targets,animationId) } }; Window_BattleLog.prototype.showAttackAnimation=function(subject,targets) { if(subject.isActor()) { this.showActorAttackAnimation(subject,targets) } else { this.showEnemyAttackAnimation(subject,targets) } }; Window_BattleLog.prototype.showActorAttackAnimation=function(subject,targets) { this.showNormalAnimation(targets,subject.attackAnimationId1(),false); this.showNormalAnimation(targets,subject.attackAnimationId2(),true) }; Window_BattleLog.prototype.showEnemyAttackAnimation=function(subject,targets) { SoundManager.playEnemyAttack() }; Window_BattleLog.prototype.showNormalAnimation=function(targets,animationId,mirror) { var animation=$dataAnimations[animationId]; if(animation) { var delay=this.animationBaseDelay(); var nextDelay=this.animationNextDelay(); targets.forEach(function(target) { target.startAnimation(animationId,mirror,delay); delay+=nextDelay } ) } }; Window_BattleLog.prototype.animationBaseDelay=function() { return 8 }; Window_BattleLog.prototype.animationNextDelay=function() { return 12 }; Window_BattleLog.prototype.refresh=function() { this.drawBackground(); this.contents.clear(); for(var i=0; i<this._lines.length; i++) { this.drawLineText(i) } }; Window_BattleLog.prototype.drawBackground=function() { var rect=this.backRect(); var color=this.backColor(); this._backBitmap.clear(); this._backBitmap.paintOpacity=this.backPaintOpacity(); this._backBitmap.fillRect(rect.x,rect.y,rect.width,rect.height,color); this._backBitmap.paintOpacity=255 }; Window_BattleLog.prototype.backRect=function() { return { x:0,y:this.padding,width:this.width,height:this.numLines()*this.lineHeight() } }; Window_BattleLog.prototype.backColor=function() { return'#000000' }; Window_BattleLog.prototype.backPaintOpacity=function() { return 64 }; Window_BattleLog.prototype.drawLineText=function(index) { var rect=this.itemRectForText(index); this.contents.clearRect(rect.x,rect.y,rect.width,rect.height); this.drawTextEx(this._lines[index],rect.x,rect.y,rect.width) }; Window_BattleLog.prototype.startTurn=function() { this.push('wait') }; Window_BattleLog.prototype.startAction=function(subject,action,targets) { var item=action.item(); this.push('performActionStart',subject,action); this.push('waitForMovement'); this.push('performAction',subject,action); this.push('showAnimation',subject,targets.clone(),item.animationId); this.displayAction(subject,item) }; Window_BattleLog.prototype.endAction=function(subject) { this.push('waitForNewLine'); this.push('clear'); this.push('performActionEnd',subject) }; Window_BattleLog.prototype.displayCurrentState=function(subject) { var stateText=subject.mostImportantStateText(); if(stateText) { this.push('addText',subject.name()+stateText); this.push('wait'); this.push('clear') } }; Window_BattleLog.prototype.displayRegeneration=function(subject) { this.push('popupDamage',subject) }; Window_BattleLog.prototype.displayAction=function(subject,item) { if(DataManager.isSkill(item)) { if(item.message1) { this.push('addText',subject.name()+item.message1.format(item.name)) } if(item.message2) { this.push('addText',item.message2.format(item.name)) } } else { this.push('addText',TextManager.useItem.format(subject.name(),item.name)) } }; Window_BattleLog.prototype.displayCounter=function(target) { this.push('performCounter',target); this.push('addText',TextManager.counterAttack.format(target.name())) }; Window_BattleLog.prototype.displayReflection=function(target) { this.push('performReflection',target); this.push('addText',TextManager.magicReflection.format(target.name())) }; Window_BattleLog.prototype.displaySubstitute=function(substitute,target) { var substName=substitute.name(); this.push('performSubstitute',substitute,target); this.push('addText',TextManager.substitute.format(substName,target.name())) }; Window_BattleLog.prototype.displayActionResults=function(subject,target) { if(target.result().used) { this.push('pushBaseLine'); this.displayCritical(target); this.push('popupDamage',target); this.push('popupDamage',subject); this.displayDamage(target); this.displayAffectedStatus(target); this.displayFailure(target); this.push('waitForNewLine'); this.push('popBaseLine') } }; Window_BattleLog.prototype.displayFailure=function(target) { if(target.result().isHit()&&!target.result().success) { this.push('addText',TextManager.actionFailure.format(target.name())) } }; Window_BattleLog.prototype.displayCritical=function(target) { if(target.result().critical) { if(target.isActor()) { this.push('addText',TextManager.criticalToActor) } else { this.push('addText',TextManager.criticalToEnemy) } } }; Window_BattleLog.prototype.displayDamage=function(target) { if(target.result().missed) { this.displayMiss(target) } else if(target.result().evaded) { this.displayEvasion(target) } else { this.displayHpDamage(target); this.displayMpDamage(target); this.displayTpDamage(target) } }; Window_BattleLog.prototype.displayMiss=function(target) { var fmt; if(target.result().physical) { fmt=target.isActor()?TextManager.actorNoHit:TextManager.enemyNoHit; this.push('performMiss',target) } else { fmt=TextManager.actionFailure } this.push('addText',fmt.format(target.name())) }; Window_BattleLog.prototype.displayEvasion=function(target) { var fmt; if(target.result().physical) { fmt=TextManager.evasion; this.push('performEvasion',target) } else { fmt=TextManager.magicEvasion; this.push('performMagicEvasion',target) } this.push('addText',fmt.format(target.name())) }; Window_BattleLog.prototype.displayHpDamage=function(target) { if(target.result().hpAffected) { if(target.result().hpDamage>0&&!target.result().drain) { this.push('performDamage',target) } if(target.result().hpDamage<0) { this.push('performRecovery',target) } this.push('addText',this.makeHpDamageText(target)) } }; Window_BattleLog.prototype.displayMpDamage=function(target) { if(target.isAlive()&&target.result().mpDamage!==0) { if(target.result().mpDamage<0) { this.push('performRecovery',target) } this.push('addText',this.makeMpDamageText(target)) } }; Window_BattleLog.prototype.displayTpDamage=function(target) { if(target.isAlive()&&target.result().tpDamage!==0) { if(target.result().tpDamage<0) { this.push('performRecovery',target) } this.push('addText',this.makeTpDamageText(target)) } }; Window_BattleLog.prototype.displayAffectedStatus=function(target) { if(target.result().isStatusAffected()) { this.push('pushBaseLine'); this.displayChangedStates(target); this.displayChangedBuffs(target); this.push('waitForNewLine'); this.push('popBaseLine') } }; Window_BattleLog.prototype.displayAutoAffectedStatus=function(target) { if(target.result().isStatusAffected()) { this.displayAffectedStatus(target,null); this.push('clear') } }; Window_BattleLog.prototype.displayChangedStates=function(target) { this.displayAddedStates(target); this.displayRemovedStates(target) }; Window_BattleLog.prototype.displayAddedStates=function(target) { target.result().addedStateObjects().forEach(function(state) { var stateMsg=target.isActor()?state.message1:state.message2; if(state.id===target.deathStateId()) { this.push('performCollapse',target) } if(stateMsg) { this.push('popBaseLine'); this.push('pushBaseLine'); this.push('addText',target.name()+stateMsg); this.push('waitForEffect') } } ,this) }; Window_BattleLog.prototype.displayRemovedStates=function(target) { target.result().removedStateObjects().forEach(function(state) { if(state.message4) { this.push('popBaseLine'); this.push('pushBaseLine'); this.push('addText',target.name()+state.message4) } } ,this) }; Window_BattleLog.prototype.displayChangedBuffs=function(target) { var result=target.result(); this.displayBuffs(target,result.addedBuffs,TextManager.buffAdd); this.displayBuffs(target,result.addedDebuffs,TextManager.debuffAdd); this.displayBuffs(target,result.removedBuffs,TextManager.buffRemove) }; Window_BattleLog.prototype.displayBuffs=function(target,buffs,fmt) { buffs.forEach(function(paramId) { this.push('popBaseLine'); this.push('pushBaseLine'); this.push('addText',fmt.format(target.name(),TextManager.param(paramId))) } ,this) }; Window_BattleLog.prototype.makeHpDamageText=function(target) { var result=target.result(); var damage=result.hpDamage; var isActor=target.isActor(); var fmt; if(damage>0&&result.drain) { fmt=isActor?TextManager.actorDrain:TextManager.enemyDrain; return fmt.format(target.name(),TextManager.hp,damage) } else if(damage>0) { fmt=isActor?TextManager.actorDamage:TextManager.enemyDamage; return fmt.format(target.name(),damage) } else if(damage<0) { fmt=isActor?TextManager.actorRecovery:TextManager.enemyRecovery; return fmt.format(target.name(),TextManager.hp,-damage) } else { fmt=isActor?TextManager.actorNoDamage:TextManager.enemyNoDamage; return fmt.format(target.name()) } }; Window_BattleLog.prototype.makeMpDamageText=function(target) { var result=target.result(); var damage=result.mpDamage; var isActor=target.isActor(); var fmt; if(damage>0&&result.drain) { fmt=isActor?TextManager.actorDrain:TextManager.enemyDrain; return fmt.format(target.name(),TextManager.mp,damage) } else if(damage>0) { fmt=isActor?TextManager.actorLoss:TextManager.enemyLoss; return fmt.format(target.name(),TextManager.mp,damage) } else if(damage<0) { fmt=isActor?TextManager.actorRecovery:TextManager.enemyRecovery; return fmt.format(target.name(),TextManager.mp,-damage) } else { return'' } }; Window_BattleLog.prototype.makeTpDamageText=function(target) { var result=target.result(); var damage=result.tpDamage; var isActor=target.isActor(); var fmt; if(damage>0) { fmt=isActor?TextManager.actorLoss:TextManager.enemyLoss; return fmt.format(target.name(),TextManager.tp,damage) } else if(damage<0) { fmt=isActor?TextManager.actorGain:TextManager.enemyGain; return fmt.format(target.name(),TextManager.tp,-damage) } else { return'' } }; function Window_PartyCommand() { this.initialize.apply(this,arguments) } Window_PartyCommand.prototype=Object.create(Window_Command.prototype); Window_PartyCommand.prototype.constructor=Window_PartyCommand; Window_PartyCommand.prototype.initialize=function() { var y=Graphics.boxHeight-this.windowHeight(); Window_Command.prototype.initialize.call(this,0,y); this.openness=0; this.deactivate() }; Window_PartyCommand.prototype.windowWidth=function() { return 192 }; Window_PartyCommand.prototype.numVisibleRows=function() { return 4 }; Window_PartyCommand.prototype.makeCommandList=function() { this.addCommand(TextManager.fight,'fight'); this.addCommand(TextManager.escape,'escape',BattleManager.canEscape()) }; Window_PartyCommand.prototype.setup=function() { this.clearCommandList(); this.makeCommandList(); this.refresh(); this.select(0); this.activate(); this.open() }; function Window_ActorCommand() { this.initialize.apply(this,arguments) } Window_ActorCommand.prototype=Object.create(Window_Command.prototype); Window_ActorCommand.prototype.constructor=Window_ActorCommand; Window_ActorCommand.prototype.initialize=function() { var y=Graphics.boxHeight-this.windowHeight(); Window_Command.prototype.initialize.call(this,0,y); this.openness=0; this.deactivate(); this._actor=null }; Window_ActorCommand.prototype.windowWidth=function() { return 192 }; Window_ActorCommand.prototype.numVisibleRows=function() { return 4 }; Window_ActorCommand.prototype.makeCommandList=function() { if(this._actor) { this.addAttackCommand(); this.addSkillCommands(); this.addGuardCommand(); this.addItemCommand() } }; Window_ActorCommand.prototype.addAttackCommand=function() { this.addCommand(TextManager.attack,'attack',this._actor.canAttack()) }; Window_ActorCommand.prototype.addSkillCommands=function() { var skillTypes=this._actor.addedSkillTypes(); skillTypes.sort(function(a, { return a-b } ); skillTypes.forEach(function(stypeId) { var name=$dataSystem.skillTypes[stypeId]; this.addCommand(name,'skill',true,stypeId) } ,this) }; Window_ActorCommand.prototype.addGuardCommand=function() { this.addCommand(TextManager.guard,'guard',this._actor.canGuard()) }; Window_ActorCommand.prototype.addItemCommand=function() { this.addCommand(TextManager.item,'item') }; Window_ActorCommand.prototype.setup=function(actor) { this._actor=actor; this.clearCommandList(); this.makeCommandList(); this.refresh(); this.selectLast(); this.activate(); this.open() }; Window_ActorCommand.prototype.processOk=function() { if(this._actor) { if(ConfigManager.commandRemember) { this._actor.setLastCommandSymbol(this.currentSymbol()) } else { this._actor.setLastCommandSymbol('') } } Window_Command.prototype.processOk.call(this) }; Window_ActorCommand.prototype.selectLast=function() { if(this._actor&&ConfigManager.commandRemember) { this.selectSymbol(this._actor.lastCommandSymbol()) } else { this.select(0) } }; function Window_BattleStatus() { this.initialize.apply(this,arguments) } Window_BattleStatus.prototype=Object.create(Window_Selectable.prototype); Window_BattleStatus.prototype.constructor=Window_BattleStatus; Window_BattleStatus.prototype.initialize=function() { var width=this.windowWidth(); var height=this.windowHeight(); var x=Graphics.boxWidth-width; var y=Graphics.boxHeight-height; Window_Selectable.prototype.initialize.call(this,x,y,width,height); this.refresh(); this.openness=0 }; Window_BattleStatus.prototype.windowWidth=function() { return Graphics.boxWidth-192 }; Window_BattleStatus.prototype.windowHeight=function() { return this.fittingHeight(this.numVisibleRows()) }; Window_BattleStatus.prototype.numVisibleRows=function() { return 4 }; Window_BattleStatus.prototype.maxItems=function() { return $gameParty.battleMembers().length }; Window_BattleStatus.prototype.refresh=function() { this.contents.clear(); this.drawAllItems() }; Window_BattleStatus.prototype.drawItem=function(index) { var actor=$gameParty.battleMembers()[index]; this.drawBasicArea(this.basicAreaRect(index),actor); this.drawGaugeArea(this.gaugeAreaRect(index),actor) }; Window_BattleStatus.prototype.basicAreaRect=function(index) { var rect=this.itemRectForText(index); rect.width-=this.gaugeAreaWidth()+15; return rect }; Window_BattleStatus.prototype.gaugeAreaRect=function(index) { var rect=this.itemRectForText(index); rect.x+=rect.width-this.gaugeAreaWidth(); rect.width=this.gaugeAreaWidth(); return rect }; Window_BattleStatus.prototype.gaugeAreaWidth=function() { return 330 }; Window_BattleStatus.prototype.drawBasicArea=function(rect,actor) { this.drawActorName(actor,rect.x+0,rect.y,150); this.drawActorIcons(actor,rect.x+156,rect.y,rect.width-156) }; Window_BattleStatus.prototype.drawGaugeArea=function(rect,actor) { if($dataSystem.optDisplayTp) { this.drawGaugeAreaWithTp(rect,actor) } else { this.drawGaugeAreaWithoutTp(rect,actor) } }; Window_BattleStatus.prototype.drawGaugeAreaWithTp=function(rect,actor) { this.drawActorHp(actor,rect.x+0,rect.y,108); this.drawActorMp(actor,rect.x+123,rect.y,96); this.drawActorTp(actor,rect.x+234,rect.y,96) }; Window_BattleStatus.prototype.drawGaugeAreaWithoutTp=function(rect,actor) { this.drawActorHp(actor,rect.x+0,rect.y,201); this.drawActorMp(actor,rect.x+216,rect.y,114) }; function Window_BattleActor() { this.initialize.apply(this,arguments) } Window_BattleActor.prototype=Object.create(Window_BattleStatus.prototype); Window_BattleActor.prototype.constructor=Window_BattleActor; Window_BattleActor.prototype.initialize=function(x,y) { Window_BattleStatus.prototype.initialize.call(this); this.x=x; this.y=y; this.openness=255; this.hide() }; Window_BattleActor.prototype.show=function() { this.select(0); Window_BattleStatus.prototype.show.call(this) }; Window_BattleActor.prototype.hide=function() { Window_BattleStatus.prototype.hide.call(this); $gameParty.select(null) }; Window_BattleActor.prototype.select=function(index) { Window_BattleStatus.prototype.select.call(this,index); $gameParty.select(this.actor()) }; Window_BattleActor.prototype.actor=function() { return $gameParty.members()[this.index()] }; function Window_BattleEnemy() { this.initialize.apply(this,arguments) } Window_BattleEnemy.prototype=Object.create(Window_Selectable.prototype); Window_BattleEnemy.prototype.constructor=Window_BattleEnemy; Window_BattleEnemy.prototype.initialize=function(x,y) { this._enemies=[]; var width=this.windowWidth(); var height=this.windowHeight(); Window_Selectable.prototype.initialize.call(this,x,y,width,height); this.refresh(); this.hide() }; Window_BattleEnemy.prototype.windowWidth=function() { return Graphics.boxWidth-192 }; Window_BattleEnemy.prototype.windowHeight=function() { return this.fittingHeight(this.numVisibleRows()) }; Window_BattleEnemy.prototype.numVisibleRows=function() { return 4 }; Window_BattleEnemy.prototype.maxCols=function() { return 2 }; Window_BattleEnemy.prototype.maxItems=function() { return this._enemies.length }; Window_BattleEnemy.prototype.enemy=function() { return this._enemies[this.index()] }; Window_BattleEnemy.prototype.enemyIndex=function() { var enemy=this.enemy(); return enemy?enemy.index():-1 }; Window_BattleEnemy.prototype.drawItem=function(index) { this.resetTextColor(); var name=this._enemies[index].name(); var rect=this.itemRectForText(index); this.drawText(name,rect.x,rect.y,rect.width) }; Window_BattleEnemy.prototype.show=function() { this.refresh(); this.select(0); Window_Selectable.prototype.show.call(this) }; Window_BattleEnemy.prototype.hide=function() { Window_Selectable.prototype.hide.call(this); $gameTroop.select(null) }; Window_BattleEnemy.prototype.refresh=function() { this._enemies=$gameTroop.aliveMembers(); Window_Selectable.prototype.refresh.call(this) }; Window_BattleEnemy.prototype.select=function(index) { Window_Selectable.prototype.select.call(this,index); $gameTroop.select(this.enemy()) }; function Window_BattleSkill() { this.initialize.apply(this,arguments) } Window_BattleSkill.prototype=Object.create(Window_SkillList.prototype); Window_BattleSkill.prototype.constructor=Window_BattleSkill; Window_BattleSkill.prototype.initialize=function(x,y,width,height) { Window_SkillList.prototype.initialize.call(this,x,y,width,height); this.hide() }; Window_BattleSkill.prototype.show=function() { this.selectLast(); this.showHelpWindow(); Window_SkillList.prototype.show.call(this) }; Window_BattleSkill.prototype.hide=function() { this.hideHelpWindow(); Window_SkillList.prototype.hide.call(this) }; function Window_BattleItem() { this.initialize.apply(this,arguments) } Window_BattleItem.prototype=Object.create(Window_ItemList.prototype); Window_BattleItem.prototype.constructor=Window_BattleItem; Window_BattleItem.prototype.initialize=function(x,y,width,height) { Window_ItemList.prototype.initialize.call(this,x,y,width,height); this.hide() }; Window_BattleItem.prototype.includes=function(item) { return $gameParty.canUse(item) }; Window_BattleItem.prototype.show=function() { this.selectLast(); this.showHelpWindow(); Window_ItemList.prototype.show.call(this) }; Window_BattleItem.prototype.hide=function() { this.hideHelpWindow(); Window_ItemList.prototype.hide.call(this) }; function Window_TitleCommand() { this.initialize.apply(this,arguments) } Window_TitleCommand.prototype=Object.create(Window_Command.prototype); Window_TitleCommand.prototype.constructor=Window_TitleCommand; Window_TitleCommand.prototype.initialize=function() { Window_Command.prototype.initialize.call(this,0,0); this.updatePlacement(); this.openness=0; this.selectLast() }; Window_TitleCommand._lastCommandSymbol=null; Window_TitleCommand.initCommandPosition=function() { this._lastCommandSymbol=null }; Window_TitleCommand.prototype.windowWidth=function() { return 240 }; Window_TitleCommand.prototype.updatePlacement=function() { this.x=(Graphics.boxWidth-this.width)/2; this.y=Graphics.boxHeight-this.height-96 }; Window_TitleCommand.prototype.makeCommandList=function() { this.addCommand(TextManager.newGame,'newGame'); this.addCommand(TextManager.continue_,'continue',this.isContinueEnabled()); this.addCommand(TextManager.options,'options') }; Window_TitleCommand.prototype.isContinueEnabled=function() { return DataManager.isAnySavefileExists() }; Window_TitleCommand.prototype.processOk=function() { Window_TitleCommand._lastCommandSymbol=this.currentSymbol(); Window_Command.prototype.processOk.call(this) }; Window_TitleCommand.prototype.selectLast=function() { if(Window_TitleCommand._lastCommandSymbol) { this.selectSymbol(Window_TitleCommand._lastCommandSymbol) } else if(this.isContinueEnabled()) { this.selectSymbol('continue') } }; function Window_GameEnd() { this.initialize.apply(this,arguments) } Window_GameEnd.prototype=Object.create(Window_Command.prototype); Window_GameEnd.prototype.constructor=Window_GameEnd; Window_GameEnd.prototype.initialize=function() { Window_Command.prototype.initialize.call(this,0,0); this.updatePlacement(); this.openness=0; this.open() }; Window_GameEnd.prototype.windowWidth=function() { return 240 }; Window_GameEnd.prototype.updatePlacement=function() { this.x=(Graphics.boxWidth-this.width)/2; this.y=(Graphics.boxHeight-this.height)/2 }; Window_GameEnd.prototype.makeCommandList=function() { this.addCommand(TextManager.toTitle,'toTitle'); this.addCommand(TextManager.cancel,'cancel') }; function Window_DebugRange() { this.initialize.apply(this,arguments) } Window_DebugRange.prototype=Object.create(Window_Selectable.prototype); Window_DebugRange.prototype.constructor=Window_DebugRange; Window_DebugRange.lastTopRow=0; Window_DebugRange.lastIndex=0; Window_DebugRange.prototype.initialize=function(x,y) { this._maxSwitches=Math.ceil(($dataSystem.switches.length-1)/10); this._maxVariables=Math.ceil(($dataSystem.variables.length-1)/10); var width=this.windowWidth(); var height=this.windowHeight(); Window_Selectable.prototype.initialize.call(this,x,y,width,height); this.refresh(); this.setTopRow(Window_DebugRange.lastTopRow); this.select(Window_DebugRange.lastIndex); this.activate() }; Window_DebugRange.prototype.windowWidth=function() { return 246 }; Window_DebugRange.prototype.windowHeight=function() { return Graphics.boxHeight }; Window_DebugRange.prototype.maxItems=function() { return this._maxSwitches+this._maxVariables }; Window_DebugRange.prototype.update=function() { Window_Selectable.prototype.update.call(this); if(this._editWindow) { this._editWindow.setMode(this.mode()); this._editWindow.setTopId(this.topId()) } }; Window_DebugRange.prototype.mode=function() { return this.index()<this._maxSwitches?'switch':'variable' }; Window_DebugRange.prototype.topId=function() { var index=this.index(); if(index<this._maxSwitches) { return index*10+1 } else { return(index-this._maxSwitches)*10+1 } }; Window_DebugRange.prototype.refresh=function() { this.createContents(); this.drawAllItems() }; Window_DebugRange.prototype.drawItem=function(index) { var rect=this.itemRectForText(index); var start; var text; if(index<this._maxSwitches) { start=index*10+1; text='S' } else { start=(index-this._maxSwitches)*10+1; text='V' } var end=start+9; text+=' ['+start.padZero(4)+'-'+end.padZero(4)+']'; this.drawText(text,rect.x,rect.y,rect.width) }; Window_DebugRange.prototype.isCancelTriggered=function() { return(Window_Selectable.prototype.isCancelTriggered()||Input.isTriggered('debug')) }; Window_DebugRange.prototype.processCancel=function() { Window_Selectable.prototype.processCancel.call(this); Window_DebugRange.lastTopRow=this.topRow(); Window_DebugRange.lastIndex=this.index() }; Window_DebugRange.prototype.setEditWindow=function(editWindow) { this._editWindow=editWindow; this.update() }; function Window_DebugEdit() { this.initialize.apply(this,arguments) } Window_DebugEdit.prototype=Object.create(Window_Selectable.prototype); Window_DebugEdit.prototype.constructor=Window_DebugEdit; Window_DebugEdit.prototype.initialize=function(x,y,width) { var height=this.fittingHeight(10); Window_Selectable.prototype.initialize.call(this,x,y,width,height); this._mode='switch'; this._topId=1; this.refresh() }; Window_DebugEdit.prototype.maxItems=function() { return 10 }; Window_DebugEdit.prototype.refresh=function() { this.contents.clear(); this.drawAllItems() }; Window_DebugEdit.prototype.drawItem=function(index) { var dataId=this._topId+index; var idText=dataId.padZero(4)+':'; var idWidth=this.textWidth(idText); var statusWidth=this.textWidth('-00000000'); var name=this.itemName(dataId); var status=this.itemStatus(dataId); var rect=this.itemRectForText(index); this.resetTextColor(); this.drawText(idText,rect.x,rect.y,rect.width); rect.x+=idWidth; rect.width-=idWidth+statusWidth; this.drawText(name,rect.x,rect.y,rect.width); this.drawText(status,rect.x+rect.width,rect.y,statusWidth,'right') }; Window_DebugEdit.prototype.itemName=function(dataId) { if(this._mode==='switch') { return $dataSystem.switches[dataId] } else { return $dataSystem.variables[dataId] } }; Window_DebugEdit.prototype.itemStatus=function(dataId) { if(this._mode==='switch') { return $gameSwitches.value(dataId)?'[ON]':'[OFF]' } else { return String($gameVariables.value(dataId)) } }; Window_DebugEdit.prototype.setMode=function(mode) { if(this._mode!==mode) { this._mode=mode; this.refresh() } }; Window_DebugEdit.prototype.setTopId=function(id) { if(this._topId!==id) { this._topId=id; this.refresh() } }; Window_DebugEdit.prototype.currentId=function() { return this._topId+this.index() }; Window_DebugEdit.prototype.update=function() { Window_Selectable.prototype.update.call(this); if(this.active) { if(this._mode==='switch') { this.updateSwitch() } else { this.updateVariable() } } }; Window_DebugEdit.prototype.updateSwitch=function() { if(Input.isRepeated('ok')) { var switchId=this.currentId(); SoundManager.playCursor(); $gameSwitches.setValue(switchId,!$gameSwitches.value(switchId)); this.redrawCurrentItem() } }; Window_DebugEdit.prototype.updateVariable=function() { var variableId=this.currentId(); var value=$gameVariables.value(variableId); if(typeof value==='number') { if(Input.isRepeated('right')) { value++ } if(Input.isRepeated('left')) { value-- } if(Input.isRepeated('pagedown')) { value+=10 } if(Input.isRepeated('pageup')) { value-=10 } if($gameVariables.value(variableId)!==value) { $gameVariables.setValue(variableId,value); SoundManager.playCursor(); this.redrawCurrentItem() } } }; Condividi questo messaggio Link di questo messaggio Condividi su altri siti
Melosx 16 Segnala messaggio Inviato September 30, 2015 Non so se ci sono limiti di caratteri quindi per sicurezza metto qui altri script rpg_sprites.js function Sprite_Base() { this.initialize.apply(this,arguments) } Sprite_Base.prototype=Object.create(Sprite.prototype); Sprite_Base.prototype.constructor=Sprite_Base; Sprite_Base.prototype.initialize=function() { Sprite.prototype.initialize.call(this); this._animationSprites=[]; this._effectTarget=this; this._hiding=false }; Sprite_Base.prototype.update=function() { Sprite.prototype.update.call(this); this.updateVisibility(); this.updateAnimationSprites() }; Sprite_Base.prototype.hide=function() { this._hiding=true; this.updateVisibility() }; Sprite_Base.prototype.show=function() { this._hiding=false; this.updateVisibility() }; Sprite_Base.prototype.updateVisibility=function() { this.visible=!this._hiding }; Sprite_Base.prototype.updateAnimationSprites=function() { if(this._animationSprites.length>0) { var sprites=this._animationSprites.clone(); this._animationSprites=[]; for(var i=0; i<sprites.length; i++) { var sprite=sprites[i]; if(sprite.isPlaying()) { this._animationSprites.push(sprite) } else { sprite.remove() } } } }; Sprite_Base.prototype.startAnimation=function(animation,mirror,delay) { var sprite=new Sprite_Animation(); sprite.setup(this._effectTarget,animation,mirror,delay); this._effectTarget.parent.addChild(sprite); this._animationSprites.push(sprite) }; Sprite_Base.prototype.isAnimationPlaying=function() { return this._animationSprites.length>0 }; function Sprite_Button() { this.initialize.apply(this,arguments) } Sprite_Button.prototype=Object.create(Sprite.prototype); Sprite_Button.prototype.constructor=Sprite_Button; Sprite_Button.prototype.initialize=function() { Sprite.prototype.initialize.call(this); this._touching=false; this._coldFrame=null; this._hotFrame=null; this._clickHandler=null }; Sprite_Button.prototype.update=function() { Sprite.prototype.update.call(this); this.updateFrame(); this.processTouch() }; Sprite_Button.prototype.updateFrame=function() { var frame; if(this._touching) { frame=this._hotFrame } else { frame=this._coldFrame } if(frame) { this.setFrame(frame.x,frame.y,frame.width,frame.height) } }; Sprite_Button.prototype.setColdFrame=function(x,y,width,height) { this._coldFrame=new Rectangle(x,y,width,height) }; Sprite_Button.prototype.setHotFrame=function(x,y,width,height) { this._hotFrame=new Rectangle(x,y,width,height) }; Sprite_Button.prototype.setClickHandler=function(method) { this._clickHandler=method }; Sprite_Button.prototype.callClickHandler=function() { if(this._clickHandler) { this._clickHandler() } }; Sprite_Button.prototype.processTouch=function() { if(this.isActive()) { if(TouchInput.isTriggered()&&this.isButtonTouched()) { this._touching=true } if(this._touching) { if(TouchInput.isReleased()||!this.isButtonTouched()) { this._touching=false; if(TouchInput.isReleased()) { this.callClickHandler() } } } } else { this._touching=false } }; Sprite_Button.prototype.isActive=function() { var node=this; while(node) { if(!node.visible) { return false } node=node.parent } return true }; Sprite_Button.prototype.isButtonTouched=function() { var x=this.canvasToLocalX(TouchInput.x); var y=this.canvasToLocalY(TouchInput.y); return x>=0&&y>=0&&x<this.width&&y<this.height }; Sprite_Button.prototype.canvasToLocalX=function(x) { var node=this; while(node) { x-=node.x; node=node.parent } return x }; Sprite_Button.prototype.canvasToLocalY=function(y) { var node=this; while(node) { y-=node.y; node=node.parent } return y }; function Sprite_Character() { this.initialize.apply(this,arguments) } Sprite_Character.prototype=Object.create(Sprite_Base.prototype); Sprite_Character.prototype.constructor=Sprite_Character; Sprite_Character.prototype.initialize=function(character) { Sprite_Base.prototype.initialize.call(this); this.initMembers(); this.setCharacter(character) }; Sprite_Character.prototype.initMembers=function() { this.anchor.x=0.5; this.anchor.y=1; this._character=null; this._balloonDuration=0; this._tilesetId=0; this._upperBody=null; this._lowerBody=null }; Sprite_Character.prototype.setCharacter=function(character) { this._character=character }; Sprite_Character.prototype.update=function() { Sprite_Base.prototype.update.call(this); this.updateBitmap(); this.updateFrame(); this.updatePosition(); this.updateAnimation(); this.updateBalloon(); this.updateOther() }; Sprite_Character.prototype.updateVisibility=function() { Sprite_Base.prototype.updateVisibility.call(this); if(this._character.isTransparent()) { this.visible=false } }; Sprite_Character.prototype.isTile=function() { return this._character.tileId>0 }; Sprite_Character.prototype.tilesetBitmap=function(tileId) { var tileset=$gameMap.tileset(); var setNumber=5+Math.floor(tileId/256); return ImageManager.loadTileset(tileset.tilesetNames[setNumber]) }; Sprite_Character.prototype.updateBitmap=function() { if(this.isImageChanged()) { this._tilesetId=$gameMap.tilesetId(); this._tileId=this._character.tileId(); this._characterName=this._character.characterName(); this._characterIndex=this._character.characterIndex(); if(this._tileId>0) { this.setTileBitmap() } else { this.setCharacterBitmap() } } }; Sprite_Character.prototype.isImageChanged=function() { return(this._tilesetId!==$gameMap.tilesetId()||this._tileId!==this._character.tileId()||this._characterName!==this._character.characterName()||this._characterIndex!==this._character.characterIndex()) }; Sprite_Character.prototype.setTileBitmap=function() { this.bitmap=this.tilesetBitmap(this._tileId) }; Sprite_Character.prototype.setCharacterBitmap=function() { this.bitmap=ImageManager.loadCharacter(this._characterName); this._isBigCharacter=ImageManager.isBigCharacter(this._characterName) }; Sprite_Character.prototype.updateFrame=function() { if(this._tileId>0) { this.updateTileFrame() } else { this.updateCharacterFrame() } }; Sprite_Character.prototype.updateTileFrame=function() { var pw=this.patternWidth(); var ph=this.patternHeight(); var sx=(Math.floor(this._tileId/128)%2*8+this._tileId%8)*pw; var sy=Math.floor(this._tileId%256/8)%16*ph; this.setFrame(sx,sy,pw,ph) }; Sprite_Character.prototype.updateCharacterFrame=function() { var pw=this.patternWidth(); var ph=this.patternHeight(); var sx=(this.characterBlockX()+this.characterPatternX())*pw; var sy=(this.characterBlockY()+this.characterPatternY())*ph; this.updateHalfBodySprites(); if(this._bushDepth>0) { var d=this._bushDepth; this._upperBody.setFrame(sx,sy,pw,ph-d); this._lowerBody.setFrame(sx,sy+ph-d,pw,d); this.setFrame(sx,sy,0,ph) } else { this.setFrame(sx,sy,pw,ph) } }; Sprite_Character.prototype.characterBlockX=function() { if(this._isBigCharacter) { return 0 } else { var index=this._character.characterIndex(); return index%4*3 } }; Sprite_Character.prototype.characterBlockY=function() { if(this._isBigCharacter) { return 0 } else { var index=this._character.characterIndex(); return Math.floor(index/4)*4 } }; Sprite_Character.prototype.characterPatternX=function() { return this._character.pattern() }; Sprite_Character.prototype.characterPatternY=function() { return(this._character.direction()-2)/2 }; Sprite_Character.prototype.patternWidth=function() { if(this._tileId>0) { return $gameMap.tileWidth() } else if(this._isBigCharacter) { return this.bitmap.width/3 } else { return this.bitmap.width/12 } }; Sprite_Character.prototype.patternHeight=function() { if(this._tileId>0) { return $gameMap.tileHeight() } else if(this._isBigCharacter) { return this.bitmap.height/4 } else { return this.bitmap.height/8 } }; Sprite_Character.prototype.updateHalfBodySprites=function() { if(this._bushDepth>0) { this.createHalfBodySprites(); this._upperBody.bitmap=this.bitmap; this._upperBody.visible=true; this._upperBody.y=-this._bushDepth; this._lowerBody.bitmap=this.bitmap; this._lowerBody.visible=true; this._upperBody.setBlendColor(this.getBlendColor()); this._lowerBody.setBlendColor(this.getBlendColor()); this._upperBody.setColorTone(this.getColorTone()); this._lowerBody.setColorTone(this.getColorTone()) } else if(this._upperBody) { this._upperBody.visible=false; this._lowerBody.visible=false } }; Sprite_Character.prototype.createHalfBodySprites=function() { if(!this._upperBody) { this._upperBody=new Sprite(); this._upperBody.anchor.x=0.5; this._upperBody.anchor.y=1; this.addChild(this._upperBody) } if(!this._lowerBody) { this._lowerBody=new Sprite(); this._lowerBody.anchor.x=0.5; this._lowerBody.anchor.y=1; this._lowerBody.opacity=128; this.addChild(this._lowerBody) } }; Sprite_Character.prototype.updatePosition=function() { this.x=this._character.screenX(); this.y=this._character.screenY(); this.z=this._character.screenZ() }; Sprite_Character.prototype.updateAnimation=function() { this.setupAnimation(); if(!this.isAnimationPlaying()) { this._character.endAnimation() } if(!this.isBalloonPlaying()) { this._character.endBalloon() } }; Sprite_Character.prototype.updateOther=function() { this.opacity=this._character.opacity(); this.blendMode=this._character.blendMode(); this._bushDepth=this._character.bushDepth() }; Sprite_Character.prototype.setupAnimation=function() { if(this._character.animationId()>0) { var animation=$dataAnimations[this._character.animationId()]; this.startAnimation(animation,false,0); this._character.startAnimation() } }; Sprite_Character.prototype.setupBalloon=function() { if(this._character.balloonId()>0) { this.startBalloon(); this._character.startBalloon() } }; Sprite_Character.prototype.startBalloon=function() { if(!this._balloonSprite) { this._balloonSprite=new Sprite_Balloon() } this._balloonSprite.setup(this._character.balloonId()); this.parent.addChild(this._balloonSprite) }; Sprite_Character.prototype.updateBalloon=function() { this.setupBalloon(); if(this._balloonSprite) { this._balloonSprite.x=this.x; this._balloonSprite.y=this.y-this.height; if(!this._balloonSprite.isPlaying()) { this.endBalloon() } } }; Sprite_Character.prototype.endBalloon=function() { if(this._balloonSprite) { this.parent.removeChild(this._balloonSprite); this._balloonSprite=null } }; Sprite_Character.prototype.isBalloonPlaying=function() { return!!this._balloonSprite }; function Sprite_Battler() { this.initialize.apply(this,arguments) } Sprite_Battler.prototype=Object.create(Sprite_Base.prototype); Sprite_Battler.prototype.constructor=Sprite_Battler; Sprite_Battler.prototype.initialize=function(battler) { Sprite_Base.prototype.initialize.call(this); this.initMembers(); this.setBattler(battler) }; Sprite_Battler.prototype.initMembers=function() { this.anchor.x=0.5; this.anchor.y=1; this._battler=null; this._damages=[]; this._homeX=0; this._homeY=0; this._offsetX=0; this._offsetY=0; this._targetOffsetX=NaN; this._targetOffsetY=NaN; this._movementDuration=0; this._selectionEffectCount=0 }; Sprite_Battler.prototype.setBattler=function(battler) { this._battler=battler }; Sprite_Battler.prototype.setHome=function(x,y) { this._homeX=x; this._homeY=y; this.updatePosition() }; Sprite_Battler.prototype.update=function() { Sprite_Base.prototype.update.call(this); if(this._battler) { this.updateMain(); this.updateAnimation(); this.updateDamagePopup(); this.updateSelectionEffect() } else { this.bitmap=null } }; Sprite_Battler.prototype.updateVisibility=function() { Sprite_Base.prototype.updateVisibility.call(this); if(!this._battler||!this._battler.isSpriteVisible()) { this.visible=false } }; Sprite_Battler.prototype.updateMain=function() { if(this._battler.isSpriteVisible()) { this.updateBitmap(); this.updateFrame() } this.updateMove(); this.updatePosition() }; Sprite_Battler.prototype.updateBitmap=function() { }; Sprite_Battler.prototype.updateFrame=function() { }; Sprite_Battler.prototype.updateMove=function() { if(this._movementDuration>0) { var d=this._movementDuration; this._offsetX=(this._offsetX*(d-1)+this._targetOffsetX)/d; this._offsetY=(this._offsetY*(d-1)+this._targetOffsetY)/d; this._movementDuration--; if(this._movementDuration===0) { this.onMoveEnd() } } }; Sprite_Battler.prototype.updatePosition=function() { this.x=this._homeX+this._offsetX; this.y=this._homeY+this._offsetY }; Sprite_Battler.prototype.updateAnimation=function() { this.setupAnimation() }; Sprite_Battler.prototype.updateDamagePopup=function() { this.setupDamagePopup(); if(this._damages.length>0) { for(var i=0; i<this._damages.length; i++) { this._damages[i].update() } if(!this._damages[0].isPlaying()) { this.parent.removeChild(this._damages[0]); this._damages.shift() } } }; Sprite_Battler.prototype.updateSelectionEffect=function() { var target=this._effectTarget; if(this._battler.isSelected()) { this._selectionEffectCount++; if(this._selectionEffectCount%30<15) { target.setBlendColor([255,255,255,64]) } else { target.setBlendColor([0,0,0,0]) } } else if(this._selectionEffectCount>0) { this._selectionEffectCount=0; target.setBlendColor([0,0,0,0]) } }; Sprite_Battler.prototype.setupAnimation=function() { while(this._battler.isAnimationRequested()) { var data=this._battler.shiftAnimation(); var animation=$dataAnimations[data.animationId]; var mirror=data.mirror; var delay=animation.position===3?0:data.delay; this.startAnimation(animation,mirror,delay) } }; Sprite_Battler.prototype.setupDamagePopup=function() { if(this._battler.isDamagePopupRequested()) { if(this._battler.isSpriteVisible()) { var sprite=new Sprite_Damage(); sprite.x=this.x+this.damageOffsetX(); sprite.y=this.y+this.damageOffsetY(); sprite.setup(this._battler); this._damages.push(sprite); this.parent.addChild(sprite) } this._battler.clearDamagePopup(); this._battler.clearResult() } }; Sprite_Battler.prototype.damageOffsetX=function() { return 0 }; Sprite_Battler.prototype.damageOffsetY=function() { return 0 }; Sprite_Battler.prototype.startMove=function(x,y,duration) { if(this._targetOffsetX!==x||this._targetOffsetY!==y) { this._targetOffsetX=x; this._targetOffsetY=y; this._movementDuration=duration; if(duration===0) { this._offsetX=x; this._offsetY=y } } }; Sprite_Battler.prototype.onMoveEnd=function() { }; Sprite_Battler.prototype.isEffecting=function() { return false }; Sprite_Battler.prototype.isMoving=function() { return this._movementDuration>0 }; Sprite_Battler.prototype.inHomePosition=function() { return this._offsetX===0&&this._offsetY===0 }; function Sprite_Actor() { this.initialize.apply(this,arguments) } Sprite_Actor.prototype=Object.create(Sprite_Battler.prototype); Sprite_Actor.prototype.constructor=Sprite_Actor; Sprite_Actor.MOTIONS= { walk: { index:0,loop:true } ,wait: { index:1,loop:true } ,chant: { index:2,loop:true } ,guard: { index:3,loop:true } ,damage: { index:4,loop:false } ,evade: { index:5,loop:false } ,thrust: { index:6,loop:false } ,swing: { index:7,loop:false } ,missile: { index:8,loop:false } ,skill: { index:9,loop:false } ,spell: { index:10,loop:false } ,item: { index:11,loop:false } ,escape: { index:12,loop:true } ,victory: { index:13,loop:true } ,dying: { index:14,loop:true } ,abnormal: { index:15,loop:true } ,sleep: { index:16,loop:true } ,dead: { index:17,loop:true } }; Sprite_Actor.prototype.initialize=function(battler) { Sprite_Battler.prototype.initialize.call(this,battler); this.moveToStartPosition() }; Sprite_Actor.prototype.initMembers=function() { Sprite_Battler.prototype.initMembers.call(this); this._battlerName=''; this._motion=null; this._motionCount=0; this._pattern=0; this.createShadowSprite(); this.createWeaponSprite(); this.createMainSprite(); this.createStateSprite() }; Sprite_Actor.prototype.createMainSprite=function() { this._mainSprite=new Sprite_Base(); this._mainSprite.anchor.x=0.5; this._mainSprite.anchor.y=1; this.addChild(this._mainSprite); this._effectTarget=this._mainSprite }; Sprite_Actor.prototype.createShadowSprite=function() { this._shadowSprite=new Sprite(); this._shadowSprite.bitmap=ImageManager.loadSystem('Shadow2'); this._shadowSprite.anchor.x=0.5; this._shadowSprite.anchor.y=0.5; this._shadowSprite.y=-2; this.addChild(this._shadowSprite) }; Sprite_Actor.prototype.createWeaponSprite=function() { this._weaponSprite=new Sprite_Weapon(); this.addChild(this._weaponSprite) }; Sprite_Actor.prototype.createStateSprite=function() { this._stateSprite=new Sprite_StateOverlay(); this.addChild(this._stateSprite) }; Sprite_Actor.prototype.setBattler=function(battler) { Sprite_Battler.prototype.setBattler.call(this,battler); var changed=(battler!==this._actor); if(changed) { this._actor=battler; if(battler) { this.setActorHome(battler.index()) } this.startEntryMotion(); this._stateSprite.setup(battler) } }; Sprite_Actor.prototype.moveToStartPosition=function() { this.startMove(300,0,0) }; Sprite_Actor.prototype.setActorHome=function(index) { this.setHome(600+index*32,280+index*48) }; Sprite_Actor.prototype.update=function() { Sprite_Battler.prototype.update.call(this); this.updateShadow(); if(this._actor) { this.updateMotion() } }; Sprite_Actor.prototype.updateShadow=function() { this._shadowSprite.visible=!!this._actor }; Sprite_Actor.prototype.updateMain=function() { Sprite_Battler.prototype.updateMain.call(this); if(this._actor.isSpriteVisible()&&!this.isMoving()) { this.updateTargetPosition() } }; Sprite_Actor.prototype.setupMotion=function() { if(this._actor.isMotionRequested()) { this.startMotion(this._actor.motionType()); this._actor.clearMotion() } }; Sprite_Actor.prototype.setupWeaponAnimation=function() { if(this._actor.isWeaponAnimationRequested()) { this._weaponSprite.setup(this._actor.weaponImageId()); this._actor.clearWeaponAnimation() } }; Sprite_Actor.prototype.startMotion=function(motionType) { var newMotion=Sprite_Actor.MOTIONS[motionType]; if(this._motion!==newMotion) { this._motion=newMotion; this._motionCount=0; this._pattern=0 } }; Sprite_Actor.prototype.updateTargetPosition=function() { if(this._actor.isInputting()||this._actor.isActing()) { this.stepForward() } else if(this._actor.canMove()&&BattleManager.isEscaped()) { this.retreat() } else if(!this.inHomePosition()) { this.stepBack() } }; Sprite_Actor.prototype.updateBitmap=function() { Sprite_Battler.prototype.updateBitmap.call(this); var name=this._actor.battlerName(); if(this._battlerName!==name) { this._battlerName=name; this._mainSprite.bitmap=ImageManager.loadSvActor(name) } }; Sprite_Actor.prototype.updateFrame=function() { Sprite_Battler.prototype.updateFrame.call(this); var bitmap=this._mainSprite.bitmap; if(bitmap) { var motionIndex=this._motion?this._motion.index:0; var pattern=this._pattern<3?this._pattern:1; var cw=bitmap.width/9; var ch=bitmap.height/6; var cx=Math.floor(motionIndex/6)*3+pattern; var cy=motionIndex%6; this._mainSprite.setFrame(cx*cw,cy*ch,cw,ch) } }; Sprite_Actor.prototype.updateMotion=function() { this.setupMotion(); this.setupWeaponAnimation(); if(this._actor.isMotionRefreshRequested()) { this.refreshMotion(); this._actor.clearMotion() } this.updateMotionCount() }; Sprite_Actor.prototype.updateMotionCount=function() { if(this._motion&&++this._motionCount>=this.motionSpeed()) { if(this._motion.loop) { this._pattern=(this._pattern+1)%4 } else if(this._pattern<2) { this._pattern++ } else { this.refreshMotion() } this._motionCount=0 } }; Sprite_Actor.prototype.motionSpeed=function() { return 12 }; Sprite_Actor.prototype.refreshMotion=function() { var actor=this._actor; if(actor) { var stateMotion=actor.stateMotionIndex(); if(actor.isInputting()||actor.isActing()) { this.startMotion('walk') } else if(stateMotion===3) { this.startMotion('dead') } else if(stateMotion===2) { this.startMotion('sleep') } else if(actor.isChanting()) { this.startMotion('chant') } else if(actor.isGuard()||actor.isGuardWaiting()) { this.startMotion('guard') } else if(stateMotion===1) { this.startMotion('abnormal') } else if(actor.isDying()) { this.startMotion('dying') } else if(actor.isUndecided()) { this.startMotion('walk') } else { this.startMotion('wait') } } }; Sprite_Actor.prototype.startEntryMotion=function() { if(this._actor&&this._actor.canMove()) { this.startMotion('walk'); this.startMove(0,0,30) } else if(!this.isMoving()) { this.refreshMotion(); this.startMove(0,0,0) } }; Sprite_Actor.prototype.stepForward=function() { this.startMove(-48,0,12) }; Sprite_Actor.prototype.stepBack=function() { this.startMove(0,0,12) }; Sprite_Actor.prototype.retreat=function() { this.startMove(300,0,30) }; Sprite_Actor.prototype.onMoveEnd=function() { Sprite_Battler.prototype.onMoveEnd.call(this); if(!BattleManager.isBattleEnd()) { this.refreshMotion() } }; Sprite_Actor.prototype.damageOffsetX=function() { return-32 }; Sprite_Actor.prototype.damageOffsetY=function() { return 0 }; function Sprite_Enemy() { this.initialize.apply(this,arguments) } Sprite_Enemy.prototype=Object.create(Sprite_Battler.prototype); Sprite_Enemy.prototype.constructor=Sprite_Enemy; Sprite_Enemy.prototype.initialize=function(battler) { Sprite_Battler.prototype.initialize.call(this,battler) }; Sprite_Enemy.prototype.initMembers=function() { Sprite_Battler.prototype.initMembers.call(this); this._enemy=null; this._appeared=false; this._battlerName=''; this._battlerHue=0; this._effectType=null; this._effectDuration=0; this._shake=0; this.createStateIconSprite() }; Sprite_Enemy.prototype.createStateIconSprite=function() { this._stateIconSprite=new Sprite_StateIcon(); this.addChild(this._stateIconSprite) }; Sprite_Enemy.prototype.setBattler=function(battler) { Sprite_Battler.prototype.setBattler.call(this,battler); this._enemy=battler; this.setHome(battler.screenX(),battler.screenY()); this._stateIconSprite.setup(battler) }; Sprite_Enemy.prototype.update=function() { Sprite_Battler.prototype.update.call(this); if(this._enemy) { this.updateEffect(); this.updateStateSprite() } }; Sprite_Enemy.prototype.updateBitmap=function() { Sprite_Battler.prototype.updateBitmap.call(this); var name=this._enemy.battlerName(); var hue=this._enemy.battlerHue(); if(this._battlerName!==name||this._battlerHue!==hue) { this._battlerName=name; this._battlerHue=hue; this.loadBitmap(name,hue); this.initVisibility() } }; Sprite_Enemy.prototype.loadBitmap=function(name,hue) { if($gameSystem.isSideView()) { this.bitmap=ImageManager.loadSvEnemy(name,hue) } else { this.bitmap=ImageManager.loadEnemy(name,hue) } }; Sprite_Enemy.prototype.updateFrame=function() { Sprite_Battler.prototype.updateFrame.call(this); var frameHeight=this.bitmap.height; if(this._effectType==='bossCollapse') { frameHeight=this._effectDuration } this.setFrame(0,0,this.bitmap.width,frameHeight) }; Sprite_Enemy.prototype.updatePosition=function() { Sprite_Battler.prototype.updatePosition.call(this); this.x+=this._shake }; Sprite_Enemy.prototype.updateStateSprite=function() { this._stateIconSprite.y=-Math.round((this.bitmap.height+40)*0.9); if(this._stateIconSprite.y<20-this.y) { this._stateIconSprite.y=20-this.y } }; Sprite_Enemy.prototype.initVisibility=function() { this._appeared=this._enemy.isAlive(); if(!this._appeared) { this.opacity=0 } }; Sprite_Enemy.prototype.setupEffect=function() { if(this._appeared&&this._enemy.isEffectRequested()) { this.startEffect(this._enemy.effectType()); this._enemy.clearEffect() } if(!this._appeared&&this._enemy.isAlive()) { this.startEffect('appear') } else if(this._appeared&&this._enemy.isHidden()) { this.startEffect('disappear') } }; Sprite_Enemy.prototype.startEffect=function(effectType) { this._effectType=effectType; switch(this._effectType) { case'appear':this.startAppear(); break; case'disappear':this.startDisappear(); break; case'whiten':this.startWhiten(); break; case'blink':this.startBlink(); break; case'collapse':this.startCollapse(); break; case'bossCollapse':this.startBossCollapse(); break; case'instantCollapse':this.startInstantCollapse(); break } this.revertToNormal() }; Sprite_Enemy.prototype.startAppear=function() { this._effectDuration=16; this._appeared=true }; Sprite_Enemy.prototype.startDisappear=function() { this._effectDuration=32; this._appeared=false }; Sprite_Enemy.prototype.startWhiten=function() { this._effectDuration=16 }; Sprite_Enemy.prototype.startBlink=function() { this._effectDuration=20 }; Sprite_Enemy.prototype.startCollapse=function() { this._effectDuration=32; this._appeared=false }; Sprite_Enemy.prototype.startBossCollapse=function() { this._effectDuration=this.bitmap.height; this._appeared=false }; Sprite_Enemy.prototype.startInstantCollapse=function() { this._effectDuration=16; this._appeared=false }; Sprite_Enemy.prototype.updateEffect=function() { this.setupEffect(); if(this._effectDuration>0) { this._effectDuration--; switch(this._effectType) { case'whiten':this.updateWhiten(); break; case'blink':this.updateBlink(); break; case'appear':this.updateAppear(); break; case'disappear':this.updateDisappear(); break; case'collapse':this.updateCollapse(); break; case'bossCollapse':this.updateBossCollapse(); break; case'instantCollapse':this.updateInstantCollapse(); break } if(this._effectDuration===0) { this._effectType=null } } }; Sprite_Enemy.prototype.isEffecting=function() { return this._effectType!==null }; Sprite_Enemy.prototype.revertToNormal=function() { this._shake=0; this.blendMode=0; this.opacity=255; this.setBlendColor([0,0,0,0]) }; Sprite_Enemy.prototype.updateWhiten=function() { var alpha=128-(16-this._effectDuration)*10; this.setBlendColor([255,255,255,alpha]) }; Sprite_Enemy.prototype.updateBlink=function() { this.opacity=(this._effectDuration%10<5)?255:0 }; Sprite_Enemy.prototype.updateAppear=function() { this.opacity=(16-this._effectDuration)*16 }; Sprite_Enemy.prototype.updateDisappear=function() { this.opacity=256-(32-this._effectDuration)*10 }; Sprite_Enemy.prototype.updateCollapse=function() { this.blendMode=Graphics.BLEND_ADD; this.setBlendColor([255,128,128,128]); this.opacity*=this._effectDuration/(this._effectDuration+1) }; Sprite_Enemy.prototype.updateBossCollapse=function() { this._shake=this._effectDuration%2*4-2; this.blendMode=Graphics.BLEND_ADD; this.opacity*=this._effectDuration/(this._effectDuration+1); this.setBlendColor([255,255,255,255-this.opacity]); if(this._effectDuration%20===19) { SoundManager.playBossCollapse2() } }; Sprite_Enemy.prototype.updateInstantCollapse=function() { this.opacity=0 }; Sprite_Enemy.prototype.damageOffsetX=function() { return 0 }; Sprite_Enemy.prototype.damageOffsetY=function() { return-8 }; function Sprite_Animation() { this.initialize.apply(this,arguments) } Sprite_Animation.prototype=Object.create(Sprite.prototype); Sprite_Animation.prototype.constructor=Sprite_Animation; Sprite_Animation._checker1= { }; Sprite_Animation._checker2= { }; Sprite_Animation.prototype.initialize=function() { Sprite.prototype.initialize.call(this); this.initMembers() }; Sprite_Animation.prototype.initMembers=function() { this._target=null; this._animation=null; this._mirror=false; this._delay=0; this._rate=4; this._duration=0; this._flashColor=[0,0,0,0]; this._flashDuration=0; this._screenFlashDuration=0; this._hidingDuration=0; this._bitmap1=null; this._bitmap2=null; this._cellSprites=[]; this._screenFlashSprite=null; this._duplicated=false; this.z=8 }; Sprite_Animation.prototype.setup=function(target,animation,mirror,delay) { this._target=target; this._animation=animation; this._mirror=mirror; this._delay=delay; if(this._animation) { this.remove(); this.setupRate(); this.setupDuration(); this.loadBitmaps(); this.createSprites() } }; Sprite_Animation.prototype.remove=function() { if(this._target.parent.removeChild(this)) { this._target.setBlendColor([0,0,0,0]); this._target.show() } }; Sprite_Animation.prototype.setupRate=function() { this._rate=4 }; Sprite_Animation.prototype.setupDuration=function() { this._duration=this._animation.frames.length*this._rate+1 }; Sprite_Animation.prototype.update=function() { Sprite.prototype.update.call(this); this.updateMain(); this.updateFlash(); this.updateScreenFlash(); this.updateHiding(); Sprite_Animation._checker1= { }; Sprite_Animation._checker2= { } }; Sprite_Animation.prototype.updateFlash=function() { if(this._flashDuration>0) { var d=this._flashDuration--; this._flashColor[3]*=(d-1)/d; this._target.setBlendColor(this._flashColor) } }; Sprite_Animation.prototype.updateScreenFlash=function() { if(this._screenFlashDuration>0) { var d=this._screenFlashDuration--; if(this._screenFlashSprite) { this._screenFlashSprite.x=-this.absoluteX(); this._screenFlashSprite.y=-this.absoluteY(); this._screenFlashSprite.opacity*=(d-1)/d; this._screenFlashSprite.visible=(this._screenFlashDuration>0) } } }; Sprite_Animation.prototype.absoluteX=function() { var x=0; var object=this; while(object) { x+=object.x; object=object.parent } return x }; Sprite_Animation.prototype.absoluteY=function() { var y=0; var object=this; while(object) { y+=object.y; object=object.parent } return y }; Sprite_Animation.prototype.updateHiding=function() { if(this._hidingDuration>0) { this._hidingDuration--; if(this._hidingDuration===0) { this._target.show() } } }; Sprite_Animation.prototype.isPlaying=function() { return this._duration>0 }; Sprite_Animation.prototype.loadBitmaps=function() { var name1=this._animation.animation1Name; var name2=this._animation.animation2Name; var hue1=this._animation.animation1Hue; var hue2=this._animation.animation2Hue; this._bitmap1=ImageManager.loadAnimation(name1,hue1); this._bitmap2=ImageManager.loadAnimation(name2,hue2) }; Sprite_Animation.prototype.isReady=function() { return ImageManager.isReady() }; Sprite_Animation.prototype.createSprites=function() { if(!Sprite_Animation._checker2[this._animation]) { this.createCellSprites(); if(this._animation.position===3) { Sprite_Animation._checker2[this._animation]=true } this.createScreenFlashSprite() } if(Sprite_Animation._checker1[this._animation]) { this._duplicated=true } else { this._duplicated=false; if(this._animation.position===3) { Sprite_Animation._checker1[this._animation]=true } } }; Sprite_Animation.prototype.createCellSprites=function() { this._cellSprites=[]; for(var i=0; i<16; i++) { var sprite=new Sprite(); sprite.anchor.x=0.5; sprite.anchor.y=0.5; this._cellSprites.push(sprite); this.addChild(sprite) } }; Sprite_Animation.prototype.createScreenFlashSprite=function() { this._screenFlashSprite=new ScreenSprite(); this.addChild(this._screenFlashSprite) }; Sprite_Animation.prototype.updateMain=function() { if(this.isPlaying()&&this.isReady()) { if(this._delay>0) { this._delay-- } else { this._duration--; this.updatePosition(); if(this._duration%this._rate===0) { this.updateFrame() } } } }; Sprite_Animation.prototype.updatePosition=function() { if(this._animation.position===3) { this.x=this.parent.width/2; this.y=this.parent.height/2 } else { this.x=this._target.x; this.y=this._target.y; if(this._animation.position===0) { this.y-=this._target.height } else if(this._animation.position===1) { this.y-=this._target.height/2 } } }; Sprite_Animation.prototype.updateFrame=function() { if(this._duration>0) { var frameIndex=this.currentFrameIndex(); this.updateAllCellSprites(this._animation.frames[frameIndex]); this._animation.timings.forEach(function(timing) { if(timing.frame===frameIndex) { this.processTimingData(timing) } } ,this) } }; Sprite_Animation.prototype.currentFrameIndex=function() { return(this._animation.frames.length-Math.floor((this._duration+this._rate-1)/this._rate)) }; Sprite_Animation.prototype.updateAllCellSprites=function(frame) { for(var i=0; i<this._cellSprites.length; i++) { var sprite=this._cellSprites[i]; if(i<frame.length) { this.updateCellSprite(sprite,frame[i]) } else { sprite.visible=false } } }; Sprite_Animation.prototype.updateCellSprite=function(sprite,cell) { var pattern=cell[0]; if(pattern>=0) { var sx=pattern%5*192; var sy=Math.floor(pattern%100/5)*192; sprite.bitmap=pattern<100?this._bitmap1:this._bitmap2; sprite.setFrame(sx,sy,192,192); sprite.x=cell[1]; sprite.y=cell[2]; if(this._mirror) { sprite.x*=-1 } sprite.rotation=cell[4]*Math.PI/180; sprite.scale.x=cell[3]/100; if(cell[5]===(this._mirror?0:1)) { sprite.scale.x*=-1 } sprite.scale.y=cell[3]/100; sprite.opacity=cell[6]; sprite.blendMode=cell[7]; sprite.visible=this._target.visible } else { sprite.visible=false } }; Sprite_Animation.prototype.processTimingData=function(timing) { var duration=timing.flashDuration*this._rate; switch(timing.flashScope) { case 1:this.startFlash(timing.flashColor,duration); break; case 2:this.startScreenFlash(timing.flashColor,duration); break; case 3:this.startHiding(duration); break } if(!this._duplicated&&timing.se) { AudioManager.playSe(timing.se) } }; Sprite_Animation.prototype.startFlash=function(color,duration) { this._flashColor=color.clone(); this._flashDuration=duration }; Sprite_Animation.prototype.startScreenFlash=function(color,duration) { this._screenFlashDuration=duration; if(this._screenFlashSprite) { this._screenFlashSprite.setColor(color[0],color[1],color[2]); this._screenFlashSprite.opacity=color[3] } }; Sprite_Animation.prototype.startHiding=function(duration) { this._hidingDuration=duration; this._target.hide() }; function Sprite_Damage() { this.initialize.apply(this,arguments) } Sprite_Damage.prototype=Object.create(Sprite.prototype); Sprite_Damage.prototype.constructor=Sprite_Damage; Sprite_Damage.prototype.initialize=function() { Sprite.prototype.initialize.call(this); this._duration=90; this._flashColor=[0,0,0,0]; this._flashDuration=0; this._damageBitmap=ImageManager.loadSystem('Damage') }; Sprite_Damage.prototype.setup=function(target) { var result=target.result(); if(result.missed||result.evaded) { this.createMiss() } else if(result.hpAffected) { this.createDigits(0,result.hpDamage) } else if(target.isAlive()&&result.mpDamage!==0) { this.createDigits(2,result.mpDamage) } if(result.critical) { this.setupCriticalEffect() } }; Sprite_Damage.prototype.setupCriticalEffect=function() { this._flashColor=[255,0,0,160]; this._flashDuration=60 }; Sprite_Damage.prototype.digitWidth=function() { return this._damageBitmap?this._damageBitmap.width/10:0 }; Sprite_Damage.prototype.digitHeight=function() { return this._damageBitmap?this._damageBitmap.height/5:0 }; Sprite_Damage.prototype.createMiss=function() { var w=this.digitWidth(); var h=this.digitHeight(); var sprite=this.createChildSprite(); sprite.setFrame(0,4*h,4*w,h); sprite.dy=0 }; Sprite_Damage.prototype.createDigits=function(baseRow,value) { var string=Math.abs(value).toString(); var row=baseRow+(value<0?1:0); var w=this.digitWidth(); var h=this.digitHeight(); for(var i=0; i<string.length; i++) { var sprite=this.createChildSprite(); var n=Number(string[i]); sprite.setFrame(n*w,row*h,w,h); sprite.x=(i-(string.length-1)/2)*w; sprite.dy=-i } }; Sprite_Damage.prototype.createChildSprite=function() { var sprite=new Sprite(); sprite.bitmap=this._damageBitmap; sprite.anchor.x=0.5; sprite.anchor.y=1; sprite.y=-40; sprite.ry=sprite.y; this.addChild(sprite); return sprite }; Sprite_Damage.prototype.update=function() { Sprite.prototype.update.call(this); if(this._duration>0) { this._duration--; for(var i=0; i<this.children.length; i++) { this.updateChild(this.children[i]) } } this.updateFlash(); this.updateOpacity() }; Sprite_Damage.prototype.updateChild=function(sprite) { sprite.dy+=0.5; sprite.ry+=sprite.dy; if(sprite.ry>=0) { sprite.ry=0; sprite.dy*=-0.6 } sprite.y=Math.round(sprite.ry); sprite.setBlendColor(this._flashColor) }; Sprite_Damage.prototype.updateFlash=function() { if(this._flashDuration>0) { var d=this._flashDuration--; this._flashColor[3]*=(d-1)/d } }; Sprite_Damage.prototype.updateOpacity=function() { if(this._duration<10) { this.opacity=255*this._duration/10 } }; Sprite_Damage.prototype.isPlaying=function() { return this._duration>0 }; function Sprite_StateIcon() { this.initialize.apply(this,arguments) } Sprite_StateIcon.prototype=Object.create(Sprite.prototype); Sprite_StateIcon.prototype.constructor=Sprite_StateIcon; Sprite_StateIcon.prototype.initialize=function() { Sprite.prototype.initialize.call(this); this.initMembers(); this.loadBitmap() }; Sprite_StateIcon._iconWidth=32; Sprite_StateIcon._iconHeight=32; Sprite_StateIcon.prototype.initMembers=function() { this._battler=null; this._iconIndex=0; this._animationCount=0; this._animationIndex=0; this.anchor.x=0.5; this.anchor.y=0.5 }; Sprite_StateIcon.prototype.loadBitmap=function() { this.bitmap=ImageManager.loadSystem('IconSet'); this.setFrame(0,0,0,0) }; Sprite_StateIcon.prototype.setup=function(battler) { this._battler=battler }; Sprite_StateIcon.prototype.update=function() { Sprite.prototype.update.call(this); this._animationCount++; if(this._animationCount>=this.animationWait()) { this.updateIcon(); this.updateFrame(); this._animationCount=0 } }; Sprite_StateIcon.prototype.animationWait=function() { return 40 }; Sprite_StateIcon.prototype.updateIcon=function() { var icons=[]; if(this._battler&&this._battler.isAlive()) { icons=this._battler.allIcons() } if(icons.length>0) { this._animationIndex++; if(this._animationIndex>=icons.length) { this._animationIndex=0 } this._iconIndex=icons[this._animationIndex] } else { this._animationIndex=0; this._iconIndex=0 } }; Sprite_StateIcon.prototype.updateFrame=function() { var pw=Sprite_StateIcon._iconWidth; var ph=Sprite_StateIcon._iconHeight; var sx=this._iconIndex%16*pw; var sy=Math.floor(this._iconIndex/16)*ph; this.setFrame(sx,sy,pw,ph) }; function Sprite_StateOverlay() { this.initialize.apply(this,arguments) } Sprite_StateOverlay.prototype=Object.create(Sprite_Base.prototype); Sprite_StateOverlay.prototype.constructor=Sprite_StateOverlay; Sprite_StateOverlay.prototype.initialize=function() { Sprite_Base.prototype.initialize.call(this); this.initMembers(); this.loadBitmap() }; Sprite_StateOverlay.prototype.initMembers=function() { this._battler=null; this._overlayIndex=0; this._animationCount=0; this._pattern=0; this.anchor.x=0.5; this.anchor.y=1 }; Sprite_StateOverlay.prototype.loadBitmap=function() { this.bitmap=ImageManager.loadSystem('States'); this.setFrame(0,0,0,0) }; Sprite_StateOverlay.prototype.setup=function(battler) { this._battler=battler }; Sprite_StateOverlay.prototype.update=function() { Sprite_Base.prototype.update.call(this); this._animationCount++; if(this._animationCount>=this.animationWait()) { this.updatePattern(); this.updateFrame(); this._animationCount=0 } }; Sprite_StateOverlay.prototype.animationWait=function() { return 8 }; Sprite_StateOverlay.prototype.updatePattern=function() { this._pattern++; this._pattern%=8; if(this._battler) { this._overlayIndex=this._battler.stateOverlayIndex() } }; Sprite_StateOverlay.prototype.updateFrame=function() { if(this._overlayIndex>0) { var w=96; var h=96; var sx=this._pattern*w; var sy=(this._overlayIndex-1)*h; this.setFrame(sx,sy,w,h) } else { this.setFrame(0,0,0,0) } }; function Sprite_Weapon() { this.initialize.apply(this,arguments) } Sprite_Weapon.prototype=Object.create(Sprite_Base.prototype); Sprite_Weapon.prototype.constructor=Sprite_Weapon; Sprite_Weapon.prototype.initialize=function() { Sprite_Base.prototype.initialize.call(this); this.initMembers() }; Sprite_Weapon.prototype.initMembers=function() { this._weaponImageId=0; this._animationCount=0; this._pattern=0; this.anchor.x=0.5; this.anchor.y=1; this.x=-16 }; Sprite_Weapon.prototype.setup=function(weaponImageId) { this._weaponImageId=weaponImageId; this._animationCount=0; this._pattern=0; this.loadBitmap(); this.updateFrame() }; Sprite_Weapon.prototype.update=function() { Sprite_Base.prototype.update.call(this); this._animationCount++; if(this._animationCount>=this.animationWait()) { this.updatePattern(); this.updateFrame(); this._animationCount=0 } }; Sprite_Weapon.prototype.animationWait=function() { return 12 }; Sprite_Weapon.prototype.updatePattern=function() { this._pattern++; if(this._pattern>=3) { this._weaponImageId=0 } }; Sprite_Weapon.prototype.loadBitmap=function() { var pageId=Math.floor((this._weaponImageId-1)/12)+1; if(pageId>=1) { this.bitmap=ImageManager.loadSystem('Weapons'+pageId) } else { this.bitmap=ImageManager.loadSystem('') } }; Sprite_Weapon.prototype.updateFrame=function() { if(this._weaponImageId>0) { var index=(this._weaponImageId-1)%12; var w=96; var h=64; var sx=(Math.floor(index/6)*3+this._pattern)*w; var sy=Math.floor(index%6)*h; this.setFrame(sx,sy,w,h) } else { this.setFrame(0,0,0,0) } }; Sprite_Weapon.prototype.isPlaying=function() { return this._weaponImageId>0 }; function Sprite_Balloon() { this.initialize.apply(this,arguments) } Sprite_Balloon.prototype=Object.create(Sprite_Base.prototype); Sprite_Balloon.prototype.constructor=Sprite_Balloon; Sprite_Balloon.prototype.initialize=function() { Sprite_Base.prototype.initialize.call(this); this.initMembers(); this.loadBitmap() }; Sprite_Balloon.prototype.initMembers=function() { this._balloonId=0; this._duration=0; this.anchor.x=0.5; this.anchor.y=1; this.z=7 }; Sprite_Balloon.prototype.loadBitmap=function() { this.bitmap=ImageManager.loadSystem('Balloon'); this.setFrame(0,0,0,0) }; Sprite_Balloon.prototype.setup=function(balloonId) { this._balloonId=balloonId; this._duration=8*this.speed()+this.waitTime() }; Sprite_Balloon.prototype.update=function() { Sprite_Base.prototype.update.call(this); if(this._duration>0) { this._duration--; if(this._duration>0) { this.updateFrame() } } }; Sprite_Balloon.prototype.updateFrame=function() { var w=48; var h=48; var sx=this.frameIndex()*w; var sy=(this._balloonId-1)*h; this.setFrame(sx,sy,w,h) }; Sprite_Balloon.prototype.speed=function() { return 8 }; Sprite_Balloon.prototype.waitTime=function() { return 12 }; Sprite_Balloon.prototype.frameIndex=function() { var index=(this._duration-this.waitTime())/this.speed(); return 7-Math.max(Math.floor(index),0) }; Sprite_Balloon.prototype.isPlaying=function() { return this._duration>0 }; function Sprite_Picture() { this.initialize.apply(this,arguments) } Sprite_Picture.prototype=Object.create(Sprite.prototype); Sprite_Picture.prototype.constructor=Sprite_Picture; Sprite_Picture.prototype.initialize=function(pictureId) { Sprite.prototype.initialize.call(this); this._pictureId=pictureId; this._pictureName=''; this.update() }; Sprite_Picture.prototype.picture=function() { return $gameScreen.picture(this._pictureId) }; Sprite_Picture.prototype.update=function() { Sprite.prototype.update.call(this); this.updateBitmap(); if(this.visible) { this.updateOrigin(); this.updatePosition(); this.updateScale(); this.updateTone(); this.updateOther() } }; Sprite_Picture.prototype.updateBitmap=function() { var picture=this.picture(); if(picture) { var pictureName=picture.name(); if(this._pictureName!==pictureName) { this._pictureName=pictureName; this.loadBitmap() } this.visible=true } else { this._pictureName=''; this.bitmap=null; this.visible=false } }; Sprite_Picture.prototype.updateOrigin=function() { var picture=this.picture(); if(picture.origin()===0) { this.anchor.x=0; this.anchor.y=0 } else { this.anchor.x=0.5; this.anchor.y=0.5 } }; Sprite_Picture.prototype.updatePosition=function() { var picture=this.picture(); this.x=Math.floor(picture.x()); this.y=Math.floor(picture.y()) }; Sprite_Picture.prototype.updateScale=function() { var picture=this.picture(); this.scale.x=picture.scaleX()/100; this.scale.y=picture.scaleY()/100 }; Sprite_Picture.prototype.updateTone=function() { var picture=this.picture(); if(picture.tone()) { this.setColorTone(picture.tone()) } else { this.setColorTone([0,0,0,0]) } }; Sprite_Picture.prototype.updateOther=function() { var picture=this.picture(); this.opacity=picture.opacity(); this.blendMode=picture.blendMode(); this.rotation=picture.angle()*Math.PI/180 }; Sprite_Picture.prototype.loadBitmap=function() { this.bitmap=ImageManager.loadPicture(this._pictureName) }; function Sprite_Timer() { this.initialize.apply(this,arguments) } Sprite_Timer.prototype=Object.create(Sprite.prototype); Sprite_Timer.prototype.constructor=Sprite_Timer; Sprite_Timer.prototype.initialize=function() { Sprite.prototype.initialize.call(this); this._seconds=0; this.createBitmap(); this.update() }; Sprite_Timer.prototype.createBitmap=function() { this.bitmap=new Bitmap(96,48); this.bitmap.fontSize=32 }; Sprite_Timer.prototype.update=function() { Sprite.prototype.update.call(this); this.updateBitmap(); this.updatePosition(); this.updateVisibility() }; Sprite_Timer.prototype.updateBitmap=function() { if(this._seconds!==$gameTimer.seconds()) { this._seconds=$gameTimer.seconds(); this.redraw() } }; Sprite_Timer.prototype.redraw=function() { var text=this.timerText(); var width=this.bitmap.width; var height=this.bitmap.height; this.bitmap.clear(); this.bitmap.drawText(text,0,0,width,height,'center') }; Sprite_Timer.prototype.timerText=function() { var min=Math.floor(this._seconds/60)%60; var sec=this._seconds%60; return min.padZero(2)+':'+sec.padZero(2) }; Sprite_Timer.prototype.updatePosition=function() { this.x=Graphics.width-this.bitmap.width; this.y=0 }; Sprite_Timer.prototype.updateVisibility=function() { this.visible=$gameTimer.isWorking() }; function Sprite_Destination() { this.initialize.apply(this,arguments) } Sprite_Destination.prototype=Object.create(Sprite.prototype); Sprite_Destination.prototype.constructor=Sprite_Destination; Sprite_Destination.prototype.initialize=function() { Sprite.prototype.initialize.call(this); this.createBitmap(); this._frameCount=0 }; Sprite_Destination.prototype.update=function() { Sprite.prototype.update.call(this); if($gameTemp.isDestinationValid()) { this.updatePosition(); this.updateAnimation(); this.visible=true } else { this._frameCount=0; this.visible=false } }; Sprite_Destination.prototype.createBitmap=function() { var tileWidth=$gameMap.tileWidth(); var tileHeight=$gameMap.tileHeight(); this.bitmap=new Bitmap(tileWidth,tileHeight); this.bitmap.fillAll('white'); this.anchor.x=0.5; this.anchor.y=0.5; this.blendMode=Graphics.BLEND_ADD }; Sprite_Destination.prototype.updatePosition=function() { var tileWidth=$gameMap.tileWidth(); var tileHeight=$gameMap.tileHeight(); var x=$gameTemp.destinationX(); var y=$gameTemp.destinationY(); this.x=($gameMap.adjustX(x)+0.5)*tileWidth; this.y=($gameMap.adjustY(y)+0.5)*tileHeight }; Sprite_Destination.prototype.updateAnimation=function() { this._frameCount++; this._frameCount%=20; this.opacity=(20-this._frameCount)*6; this.scale.x=1+this._frameCount/20; this.scale.y=this.scale.x }; function Spriteset_Base() { this.initialize.apply(this,arguments) } Spriteset_Base.prototype=Object.create(Sprite.prototype); Spriteset_Base.prototype.constructor=Spriteset_Base; Spriteset_Base.prototype.initialize=function() { Sprite.prototype.initialize.call(this); this.setFrame(0,0,Graphics.width,Graphics.height); this._tone=[0,0,0,0]; this.opaque=true; this.createLowerLayer(); this.createToneChanger(); this.createUpperLayer(); this.update() }; Spriteset_Base.prototype.createLowerLayer=function() { this.createBaseSprite() }; Spriteset_Base.prototype.createUpperLayer=function() { this.createPictures(); this.createTimer(); this.createScreenSprites() }; Spriteset_Base.prototype.update=function() { Sprite.prototype.update.call(this); this.updateScreenSprites(); this.updateToneChanger(); this.updatePosition() }; Spriteset_Base.prototype.createBaseSprite=function() { this._baseSprite=new Sprite(); this._baseSprite.setFrame(0,0,this.width,this.height); this._blackScreen=new ScreenSprite(); this._blackScreen.opacity=255; this.addChild(this._baseSprite); this._baseSprite.addChild(this._blackScreen) }; Spriteset_Base.prototype.createToneChanger=function() { if(Graphics.isWebGL()) { this.createWebGLToneChanger() } else { this.createCanvasToneChanger() } }; Spriteset_Base.prototype.createWebGLToneChanger=function() { var margin=48; var width=Graphics.width+margin*2; var height=Graphics.height+margin*2; this._toneFilter=new ToneFilter(); this._baseSprite.filters=[this._toneFilter]; this._baseSprite.filterArea=new Rectangle(-margin,-margin,width,height) }; Spriteset_Base.prototype.createCanvasToneChanger=function() { this._toneSprite=new ToneSprite(); this.addChild(this._toneSprite) }; Spriteset_Base.prototype.createPictures=function() { var width=Graphics.boxWidth; var height=Graphics.boxHeight; var x=(Graphics.width-width)/2; var y=(Graphics.height-height)/2; this._pictureContainer=new Sprite(); this._pictureContainer.setFrame(x,y,width,height); for(var i=1; i<=$gameScreen.maxPictures(); i++) { this._pictureContainer.addChild(new Sprite_Picture(i)) } this.addChild(this._pictureContainer) }; Spriteset_Base.prototype.createTimer=function() { this._timerSprite=new Sprite_Timer(); this.addChild(this._timerSprite) }; Spriteset_Base.prototype.createScreenSprites=function() { this._flashSprite=new ScreenSprite(); this._fadeSprite=new ScreenSprite(); this.addChild(this._flashSprite); this.addChild(this._fadeSprite) }; Spriteset_Base.prototype.updateScreenSprites=function() { var color=$gameScreen.flashColor(); this._flashSprite.setColor(color[0],color[1],color[2]); this._flashSprite.opacity=color[3]; this._fadeSprite.opacity=255-$gameScreen.brightness() }; Spriteset_Base.prototype.updateToneChanger=function() { var tone=$gameScreen.tone(); if(!this._tone.equals(tone)) { this._tone=tone.clone(); if(Graphics.isWebGL()) { this.updateWebGLToneChanger() } else { this.updateCanvasToneChanger() } } }; Spriteset_Base.prototype.updateWebGLToneChanger=function() { var tone=this._tone; this._toneFilter.reset(); this._toneFilter.adjustTone(tone[0],tone[1],tone[2]); this._toneFilter.adjustSaturation(-tone[3]) }; Spriteset_Base.prototype.updateCanvasToneChanger=function() { var tone=this._tone; this._toneSprite.setTone(tone[0],tone[1],tone[2],tone[3]) }; Spriteset_Base.prototype.updatePosition=function() { var screen=$gameScreen; var scale=screen.zoomScale(); this.scale.x=scale; this.scale.y=scale; this.x=Math.round(-screen.zoomX()*(scale-1)); this.y=Math.round(-screen.zoomY()*(scale-1)); this.x+=Math.round(screen.shake()) }; function Spriteset_Map() { this.initialize.apply(this,arguments) } Spriteset_Map.prototype=Object.create(Spriteset_Base.prototype); Spriteset_Map.prototype.constructor=Spriteset_Map; Spriteset_Map.prototype.initialize=function() { Spriteset_Base.prototype.initialize.call(this) }; Spriteset_Map.prototype.createLowerLayer=function() { Spriteset_Base.prototype.createLowerLayer.call(this); this.createParallax(); this.createTilemap(); this.createCharacters(); this.createShadow(); this.createDestination(); this.createWeather() }; Spriteset_Map.prototype.update=function() { Spriteset_Base.prototype.update.call(this); this.updateTileset(); this.updateParallax(); this.updateTilemap(); this.updateShadow(); this.updateWeather() }; Spriteset_Map.prototype.hideCharacters=function() { for(var i=0; i<this._characterSprites.length; i++) { var sprite=this._characterSprites[i]; if(!sprite.isTile()) { sprite.hide() } } }; Spriteset_Map.prototype.createParallax=function() { this._parallax=new TilingSprite(); this._parallax.move(0,0,Graphics.width,Graphics.height); this._baseSprite.addChild(this._parallax) }; Spriteset_Map.prototype.createTilemap=function() { this._tilemap=new Tilemap(); this._tilemap.tileWidth=$gameMap.tileWidth(); this._tilemap.tileHeight=$gameMap.tileHeight(); this._tilemap.setData($gameMap.width(),$gameMap.height(),$gameMap.data()); this._tilemap.horizontalWrap=$gameMap.isLoopHorizontal(); this._tilemap.verticalWrap=$gameMap.isLoopVertical(); this.loadTileset(); this._baseSprite.addChild(this._tilemap) }; Spriteset_Map.prototype.loadTileset=function() { this._tileset=$gameMap.tileset(); if(this._tileset) { var tilesetNames=this._tileset.tilesetNames; for(var i=0; i<tilesetNames.length; i++) { this._tilemap.bitmaps[i]=ImageManager.loadTileset(tilesetNames[i]) } this._tilemap.flags=$gameMap.tilesetFlags(); this._tilemap.refresh() } }; Spriteset_Map.prototype.createCharacters=function() { this._characterSprites=[]; $gameMap.events().forEach(function(event) { this._characterSprites.push(new Sprite_Character(event)) } ,this); $gameMap.vehicles().forEach(function(vehicle) { this._characterSprites.push(new Sprite_Character(vehicle)) } ,this); $gamePlayer.followers().reverseEach(function(follower) { this._characterSprites.push(new Sprite_Character(follower)) } ,this); this._characterSprites.push(new Sprite_Character($gamePlayer)); for(var i=0; i<this._characterSprites.length; i++) { this._tilemap.addChild(this._characterSprites[i]) } }; Spriteset_Map.prototype.createShadow=function() { this._shadowSprite=new Sprite(); this._shadowSprite.bitmap=ImageManager.loadSystem('Shadow1'); this._shadowSprite.anchor.x=0.5; this._shadowSprite.anchor.y=1; this._shadowSprite.z=6; this._tilemap.addChild(this._shadowSprite) }; Spriteset_Map.prototype.createDestination=function() { this._destinationSprite=new Sprite_Destination(); this._destinationSprite.z=9; this._tilemap.addChild(this._destinationSprite) }; Spriteset_Map.prototype.createWeather=function() { this._weather=new Weather(); this.addChild(this._weather) }; Spriteset_Map.prototype.updateTileset=function() { if(this._tileset!==$gameMap.tileset()) { this.loadTileset() } }; Spriteset_Map.prototype.updateParallax=function() { if(this._parallaxName!==$gameMap.parallaxName()) { this._parallaxName=$gameMap.parallaxName(); this._parallax.bitmap=ImageManager.loadParallax(this._parallaxName) } if(this._parallax.bitmap) { this._parallax.origin.x=$gameMap.parallaxOx(); this._parallax.origin.y=$gameMap.parallaxOy() } }; Spriteset_Map.prototype.updateTilemap=function() { this._tilemap.origin.x=$gameMap.displayX()*$gameMap.tileWidth(); this._tilemap.origin.y=$gameMap.displayY()*$gameMap.tileHeight() }; Spriteset_Map.prototype.updateShadow=function() { var airship=$gameMap.airship(); this._shadowSprite.x=airship.shadowX(); this._shadowSprite.y=airship.shadowY(); this._shadowSprite.opacity=airship.shadowOpacity() }; Spriteset_Map.prototype.updateWeather=function() { this._weather.type=$gameScreen.weatherType(); this._weather.power=$gameScreen.weatherPower(); this._weather.origin.x=$gameMap.displayX()*$gameMap.tileWidth(); this._weather.origin.y=$gameMap.displayY()*$gameMap.tileHeight() }; function Spriteset_Battle() { this.initialize.apply(this,arguments) } Spriteset_Battle.prototype=Object.create(Spriteset_Base.prototype); Spriteset_Battle.prototype.constructor=Spriteset_Battle; Spriteset_Battle.prototype.initialize=function() { Spriteset_Base.prototype.initialize.call(this); this._battlebackLocated=false }; Spriteset_Battle.prototype.createLowerLayer=function() { Spriteset_Base.prototype.createLowerLayer.call(this); this.createBackground(); this.createBattleField(); this.createBattleback(); this.createEnemies(); this.createActors() }; Spriteset_Battle.prototype.createBackground=function() { this._backgroundSprite=new Sprite(); this._backgroundSprite.bitmap=SceneManager.backgroundBitmap(); this._baseSprite.addChild(this._backgroundSprite) }; Spriteset_Battle.prototype.update=function() { Spriteset_Base.prototype.update.call(this); this.updateActors(); this.updateBattleback() }; Spriteset_Battle.prototype.createBattleField=function() { var width=Graphics.boxWidth; var height=Graphics.boxHeight; var x=(Graphics.width-width)/2; var y=(Graphics.height-height)/2; this._battleField=new Sprite(); this._battleField.setFrame(x,y,width,height); this._battleField.x=x; this._battleField.y=y; this._baseSprite.addChild(this._battleField) }; Spriteset_Battle.prototype.createBattleback=function() { var margin=32; var x=-this._battleField.x-margin; var y=-this._battleField.y-margin; var width=Graphics.width+margin*2; var height=Graphics.height+margin*2; this._back1Sprite=new TilingSprite(); this._back2Sprite=new TilingSprite(); this._back1Sprite.bitmap=this.battleback1Bitmap(); this._back2Sprite.bitmap=this.battleback2Bitmap(); this._back1Sprite.move(x,y,width,height); this._back2Sprite.move(x,y,width,height); this._battleField.addChild(this._back1Sprite); this._battleField.addChild(this._back2Sprite) }; Spriteset_Battle.prototype.updateBattleback=function() { if(!this._battlebackLocated) { this.locateBattleback(); this._battlebackLocated=true } }; Spriteset_Battle.prototype.locateBattleback=function() { var width=this._battleField.width; var height=this._battleField.height; var sprite1=this._back1Sprite; var sprite2=this._back2Sprite; sprite1.origin.x=sprite1.x+(sprite1.bitmap.width-width)/2; sprite2.origin.x=sprite1.y+(sprite2.bitmap.width-width)/2; if($gameSystem.isSideView()) { sprite1.origin.y=sprite1.x+sprite1.bitmap.height-height; sprite2.origin.y=sprite1.y+sprite2.bitmap.height-height } }; Spriteset_Battle.prototype.battleback1Bitmap=function() { return ImageManager.loadBattleback1(this.battleback1Name()) }; Spriteset_Battle.prototype.battleback2Bitmap=function() { return ImageManager.loadBattleback2(this.battleback2Name()) }; Spriteset_Battle.prototype.battleback1Name=function() { if(BattleManager.isBattleTest()) { return $dataSystem.battleback1Name } else if($gameMap.battleback1Name()) { return $gameMap.battleback1Name() } else if($gameMap.isOverworld()) { return this.overworldBattleback1Name() } else { return'' } }; Spriteset_Battle.prototype.battleback2Name=function() { if(BattleManager.isBattleTest()) { return $dataSystem.battleback2Name } else if($gameMap.battleback2Name()) { return $gameMap.battleback2Name() } else if($gameMap.isOverworld()) { return this.overworldBattleback2Name() } else { return'' } }; Spriteset_Battle.prototype.overworldBattleback1Name=function() { if($gamePlayer.isInVehicle()) { return this.shipBattleback1Name() } else { return this.normalBattleback1Name() } }; Spriteset_Battle.prototype.overworldBattleback2Name=function() { if($gamePlayer.isInVehicle()) { return this.shipBattleback2Name() } else { return this.normalBattleback2Name() } }; Spriteset_Battle.prototype.normalBattleback1Name=function() { return(this.terrainBattleback1Name(this.autotileType(1))||this.terrainBattleback1Name(this.autotileType(0))||this.defaultBattleback1Name()) }; Spriteset_Battle.prototype.normalBattleback2Name=function() { return(this.terrainBattleback2Name(this.autotileType(1))||this.terrainBattleback2Name(this.autotileType(0))||this.defaultBattleback2Name()) }; Spriteset_Battle.prototype.terrainBattleback1Name=function(type) { switch(type) { case 24:case 25:return'Wasteland'; case 26:case 27:return'DirtField'; case 32:case 33:return'Desert'; case 34:return'Lava1'; case 35:return'Lava2'; case 40:case 41:return'Snowfield'; case 42:return'Clouds'; case 4:case 5:return'PoisonSwamp'; default:return null } }; Spriteset_Battle.prototype.terrainBattleback2Name=function(type) { switch(type) { case 20:case 21:return'Forest'; case 22:case 30:case 38:return'Cliff'; case 24:case 25:case 26:case 27:return'Wasteland'; case 32:case 33:return'Desert'; case 34:case 35:return'Lava'; case 40:case 41:return'Snowfield'; case 42:return'Clouds'; case 4:case 5:return'PoisonSwamp' } }; Spriteset_Battle.prototype.defaultBattleback1Name=function() { return'Grassland' }; Spriteset_Battle.prototype.defaultBattleback2Name=function() { return'Grassland' }; Spriteset_Battle.prototype.shipBattleback1Name=function() { return'Ship' }; Spriteset_Battle.prototype.shipBattleback2Name=function() { return'Ship' }; Spriteset_Battle.prototype.autotileType=function(z) { return $gameMap.autotileType($gamePlayer.x,$gamePlayer.y,z) }; Spriteset_Battle.prototype.createEnemies=function() { var enemies=$gameTroop.members(); var sprites=[]; for(var i=0; i<enemies.length; i++) { sprites[i]=new Sprite_Enemy(enemies[i]) } sprites.sort(this.compareEnemySprite.bind(this)); for(var j=0; j<sprites.length; j++) { this._battleField.addChild(sprites[j]) } this._enemySprites=sprites }; Spriteset_Battle.prototype.compareEnemySprite=function(a, { if(a.y!==b.y) { return a.y-b.y } else { return b.spriteId-a.spriteId } }; Spriteset_Battle.prototype.createActors=function() { this._actorSprites=[]; for(var i=0; i<$gameParty.maxBattleMembers(); i++) { this._actorSprites[i]=new Sprite_Actor(); this._battleField.addChild(this._actorSprites[i]) } }; Spriteset_Battle.prototype.updateActors=function() { var members=$gameParty.battleMembers(); for(var i=0; i<this._actorSprites.length; i++) { this._actorSprites[i].setBattler(members[i]) } }; Spriteset_Battle.prototype.battlerSprites=function() { return this._enemySprites.concat(this._actorSprites) }; Spriteset_Battle.prototype.isAnimationPlaying=function() { return this.battlerSprites().some(function(sprite) { return sprite.isAnimationPlaying() } ) }; Spriteset_Battle.prototype.isEffecting=function() { return this.battlerSprites().some(function(sprite) { return sprite.isEffecting() } ) }; Spriteset_Battle.prototype.isAnyoneMoving=function() { return this.battlerSprites().some(function(sprite) { return sprite.isMoving() } ) }; Spriteset_Battle.prototype.isBusy=function() { return this.isAnimationPlaying()||this.isAnyoneMoving() }; Script di terze parti, presumibilmente. libs/lz-string.js var LZString = { _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", _f: String.fromCharCode, compressToBase64: function(e) { if (e == null) return ""; var t = ""; var n, r, i, s, o, u, a; var f = 0; e = LZString.compress(e); while (f < e.length * 2) { if (f % 2 == 0) { n = e.charCodeAt(f / 2) >> 8; r = e.charCodeAt(f / 2) & 255; if (f / 2 + 1 < e.length) i = e.charCodeAt(f / 2 + 1) >> 8; else i = NaN } else { n = e.charCodeAt((f - 1) / 2) & 255; if ((f + 1) / 2 < e.length) { r = e.charCodeAt((f + 1) / 2) >> 8; i = e.charCodeAt((f + 1) / 2) & 255 } else r = i = NaN } f += 3; s = n >> 2; o = (n & 3) << 4 | r >> 4; u = (r & 15) << 2 | i >> 6; a = i & 63; if (isNaN(r)) { u = a = 64 } else if (isNaN(i)) { a = 64 } t = t + LZString._keyStr.charAt(s) + LZString._keyStr.charAt(o) + LZString._keyStr.charAt(u) + LZString._keyStr.charAt(a) } return t }, decompressFromBase64: function(e) { if (e == null) return ""; var t = "", n = 0, r, i, s, o, u, a, f, l, c = 0, h = LZString._f; e = e.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (c < e.length) { u = LZString._keyStr.indexOf(e.charAt(c++)); a = LZString._keyStr.indexOf(e.charAt(c++)); f = LZString._keyStr.indexOf(e.charAt(c++)); l = LZString._keyStr.indexOf(e.charAt(c++)); i = u << 2 | a >> 4; s = (a & 15) << 4 | f >> 2; o = (f & 3) << 6 | l; if (n % 2 == 0) { r = i << 8; if (f != 64) { t += h(r | s) } if (l != 64) { r = o << 8 } } else { t = t + h(r | i); if (f != 64) { r = s << 8 } if (l != 64) { t += h(r | o) } } n += 3 } return LZString.decompress(t) }, compressToUTF16: function(e) { if (e == null) return ""; var t = "", n, r, i, s = 0, o = LZString._f; e = LZString.compress(e); for (n = 0; n < e.length; n++) { r = e.charCodeAt(n); switch (s++) { case 0: t += o((r >> 1) + 32); i = (r & 1) << 14; break; case 1: t += o(i + (r >> 2) + 32); i = (r & 3) << 13; break; case 2: t += o(i + (r >> 3) + 32); i = (r & 7) << 12; break; case 3: t += o(i + (r >> 4) + 32); i = (r & 15) << 11; break; case 4: t += o(i + (r >> 5) + 32); i = (r & 31) << 10; break; case 5: t += o(i + (r >> 6) + 32); i = (r & 63) << 9; break; case 6: t += o(i + (r >> 7) + 32); i = (r & 127) << 8; break; case 7: t += o(i + (r >> 8) + 32); i = (r & 255) << 7; break; case 8: t += o(i + (r >> 9) + 32); i = (r & 511) << 6; break; case 9: t += o(i + (r >> 10) + 32); i = (r & 1023) << 5; break; case 10: t += o(i + (r >> 11) + 32); i = (r & 2047) << 4; break; case 11: t += o(i + (r >> 12) + 32); i = (r & 4095) << 3; break; case 12: t += o(i + (r >> 13) + 32); i = (r & 8191) << 2; break; case 13: t += o(i + (r >> 14) + 32); i = (r & 16383) << 1; break; case 14: t += o(i + (r >> 15) + 32, (r & 32767) + 32); s = 0; break } } return t + o(i + 32) }, decompressFromUTF16: function(e) { if (e == null) return ""; var t = "", n, r, i = 0, s = 0, o = LZString._f; while (s < e.length) { r = e.charCodeAt(s) - 32; switch (i++) { case 0: n = r << 1; break; case 1: t += o(n | r >> 14); n = (r & 16383) << 2; break; case 2: t += o(n | r >> 13); n = (r & 8191) << 3; break; case 3: t += o(n | r >> 12); n = (r & 4095) << 4; break; case 4: t += o(n | r >> 11); n = (r & 2047) << 5; break; case 5: t += o(n | r >> 10); n = (r & 1023) << 6; break; case 6: t += o(n | r >> 9); n = (r & 511) << 7; break; case 7: t += o(n | r >> 8); n = (r & 255) << 8; break; case 8: t += o(n | r >> 7); n = (r & 127) << 9; break; case 9: t += o(n | r >> 6); n = (r & 63) << 10; break; case 10: t += o(n | r >> 5); n = (r & 31) << 11; break; case 11: t += o(n | r >> 4); n = (r & 15) << 12; break; case 12: t += o(n | r >> 3); n = (r & 7) << 13; break; case 13: t += o(n | r >> 2); n = (r & 3) << 14; break; case 14: t += o(n | r >> 1); n = (r & 1) << 15; break; case 15: t += o(n | r); i = 0; break } s++ } return LZString.decompress(t) }, compressToUint8Array: function(e) { var t = LZString.compress(e); var n = new Uint8Array(t.length * 2); for (var r = 0, i = t.length; r < i; r++) { var s = t.charCodeAt(r); n[r * 2] = s >>> 8; n[r * 2 + 1] = s % 256 } return n }, decompressFromUint8Array: function(e) { if (e === null || e === undefined) { return LZString.decompress(e) } else { var t = new Array(e.length / 2); for (var n = 0, r = t.length; n < r; n++) { t[n] = e[n * 2] * 256 + e[n * 2 + 1] } return LZString.decompress(String.fromCharCode.apply(null, t)) } }, compressToEncodedURIComponent: function(e) { return LZString.compressToBase64(e).replace(/=/g, "$").replace(/\//g, "-") }, decompressFromEncodedURIComponent: function(e) { if (e) e = e.replace(/$/g, "=").replace(/-/g, "/"); return LZString.decompressFromBase64(e) }, compress: function(e) { if (e == null) return ""; var t, n, r = {}, i = {}, s = "", o = "", u = "", a = 2, f = 3, l = 2, c = "", h = 0, p = 0, d, v = LZString._f; for (d = 0; d < e.length; d += 1) { s = e.charAt(d); if (!Object.prototype.hasOwnProperty.call(r, s)) { r[s] = f++; i[s] = true } o = u + s; if (Object.prototype.hasOwnProperty.call(r, o)) { u = o } else { if (Object.prototype.hasOwnProperty.call(i, u)) { if (u.charCodeAt(0) < 256) { for (t = 0; t < l; t++) { h = h << 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } } n = u.charCodeAt(0); for (t = 0; t < 8; t++) { h = h << 1 | n & 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = n >> 1 } } else { n = 1; for (t = 0; t < l; t++) { h = h << 1 | n; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = 0 } n = u.charCodeAt(0); for (t = 0; t < 16; t++) { h = h << 1 | n & 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = n >> 1 } } a--; if (a == 0) { a = Math.pow(2, l); l++ } delete i[u] } else { n = r[u]; for (t = 0; t < l; t++) { h = h << 1 | n & 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = n >> 1 } } a--; if (a == 0) { a = Math.pow(2, l); l++ } r[o] = f++; u = String(s) } } if (u !== "") { if (Object.prototype.hasOwnProperty.call(i, u)) { if (u.charCodeAt(0) < 256) { for (t = 0; t < l; t++) { h = h << 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } } n = u.charCodeAt(0); for (t = 0; t < 8; t++) { h = h << 1 | n & 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = n >> 1 } } else { n = 1; for (t = 0; t < l; t++) { h = h << 1 | n; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = 0 } n = u.charCodeAt(0); for (t = 0; t < 16; t++) { h = h << 1 | n & 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = n >> 1 } } a--; if (a == 0) { a = Math.pow(2, l); l++ } delete i[u] } else { n = r[u]; for (t = 0; t < l; t++) { h = h << 1 | n & 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = n >> 1 } } a--; if (a == 0) { a = Math.pow(2, l); l++ } } n = 2; for (t = 0; t < l; t++) { h = h << 1 | n & 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = n >> 1 } while (true) { h = h << 1; if (p == 15) { c += v(h); break } else p++ } return c }, decompress: function(e) { if (e == null) return ""; if (e == "") return null; var t = [], n, r = 4, i = 4, s = 3, o = "", u = "", a, f, l, c, h, p, d, v = LZString._f, m = { string: e, val: e.charCodeAt(0), position: 32768, index: 1 }; for (a = 0; a < 3; a += 1) { t[a] = a } l = 0; h = Math.pow(2, 2); p = 1; while (p != h) { c = m.val & m.position; m.position >>= 1; if (m.position == 0) { m.position = 32768; m.val = m.string.charCodeAt(m.index++) } l |= (c > 0 ? 1 : 0) * p; p <<= 1 } switch (n = l) { case 0: l = 0; h = Math.pow(2, 8); p = 1; while (p != h) { c = m.val & m.position; m.position >>= 1; if (m.position == 0) { m.position = 32768; m.val = m.string.charCodeAt(m.index++) } l |= (c > 0 ? 1 : 0) * p; p <<= 1 } d = v(l); break; case 1: l = 0; h = Math.pow(2, 16); p = 1; while (p != h) { c = m.val & m.position; m.position >>= 1; if (m.position == 0) { m.position = 32768; m.val = m.string.charCodeAt(m.index++) } l |= (c > 0 ? 1 : 0) * p; p <<= 1 } d = v(l); break; case 2: return "" } t[3] = d; f = u = d; while (true) { if (m.index > m.string.length) { return "" } l = 0; h = Math.pow(2, s); p = 1; while (p != h) { c = m.val & m.position; m.position >>= 1; if (m.position == 0) { m.position = 32768; m.val = m.string.charCodeAt(m.index++) } l |= (c > 0 ? 1 : 0) * p; p <<= 1 } switch (d = l) { case 0: l = 0; h = Math.pow(2, 8); p = 1; while (p != h) { c = m.val & m.position; m.position >>= 1; if (m.position == 0) { m.position = 32768; m.val = m.string.charCodeAt(m.index++) } l |= (c > 0 ? 1 : 0) * p; p <<= 1 } t[i++] = v(l); d = i - 1; r--; break; case 1: l = 0; h = Math.pow(2, 16); p = 1; while (p != h) { c = m.val & m.position; m.position >>= 1; if (m.position == 0) { m.position = 32768; m.val = m.string.charCodeAt(m.index++) } l |= (c > 0 ? 1 : 0) * p; p <<= 1 } t[i++] = v(l); d = i - 1; r--; break; case 2: return u } if (r == 0) { r = Math.pow(2, s); s++ } if (t[d]) { o = t[d] } else { if (d === i) { o = f + f.charAt(0) } else { return null } } u += o; t[i++] = f + o.charAt(0); r--; f = o; if (r == 0) { r = Math.pow(2, s); s++ } } } }; if (typeof module !== "undefined" && module != null) { module.exports = LZString } libs/pixi.js /** * @license * pixi.js - v2.2.9 * Copyright (c) 2012-2014, Mat Groves * http://goodboydigital.com/ * * Compiled: 2015-04-08 * * pixi.js is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php */ /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ (function(){ var root = this; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The [pixi.js](http://www.pixijs.com/'>http://www.pixijs.com/) module/namespace. * * @module PIXI */ /** * Namespace-class for [pixi.js](http://www.pixijs.com/'>http://www.pixijs.com/). * * Contains assorted static properties and enumerations. * * @class PIXI * @static */ var PIXI = PIXI || {}; /** * @property {Number} WEBGL_RENDERER * @protected * @static */ PIXI.WEBGL_RENDERER = 0; /** * @property {Number} CANVAS_RENDERER * @protected * @static */ PIXI.CANVAS_RENDERER = 1; /** * Version of pixi that is loaded. * @property {String} VERSION * @static */ PIXI.VERSION = "v2.2.9"; /** * Various blend modes supported by pixi. IMPORTANT - The WebGL renderer only supports the NORMAL, ADD, MULTIPLY and SCREEN blend modes. * @property {Object} blendModes * @property {Number} blendModes.NORMAL * @property {Number} blendModes.ADD * @property {Number} blendModes.MULTIPLY * @property {Number} blendModes.SCREEN * @property {Number} blendModes.OVERLAY * @property {Number} blendModes.DARKEN * @property {Number} blendModes.LIGHTEN * @property {Number} blendModes.COLOR_DODGE * @property {Number} blendModes.COLOR_BURN * @property {Number} blendModes.HARD_LIGHT * @property {Number} blendModes.SOFT_LIGHT * @property {Number} blendModes.DIFFERENCE * @property {Number} blendModes.EXCLUSION * @property {Number} blendModes.HUE * @property {Number} blendModes.SATURATION * @property {Number} blendModes.COLOR * @property {Number} blendModes.LUMINOSITY * @static */ PIXI.blendModes = { NORMAL:0, ADD:1, MULTIPLY:2, SCREEN:3, OVERLAY:4, DARKEN:5, LIGHTEN:6, COLOR_DODGE:7, COLOR_BURN:8, HARD_LIGHT:9, SOFT_LIGHT:10, DIFFERENCE:11, EXCLUSION:12, HUE:13, SATURATION:14, COLOR:15, LUMINOSITY:16 }; /** * The scale modes that are supported by pixi. * * The DEFAULT scale mode affects the default scaling mode of future operations. * It can be re-assigned to either LINEAR or NEAREST, depending upon suitability. * * @property {Object} scaleModes * @property {Number} scaleModes.DEFAULT=LINEAR * @property {Number} scaleModes.LINEAR Smooth scaling * @property {Number} scaleModes.NEAREST Pixelating scaling * @static */ PIXI.scaleModes = { DEFAULT:0, LINEAR:0, NEAREST:1 }; // used to create uids for various pixi objects.. PIXI._UID = 0; if(typeof(Float32Array) != 'undefined') { PIXI.Float32Array = Float32Array; PIXI.Uint16Array = Uint16Array; // Uint32Array and ArrayBuffer only used by WebGL renderer // We can suppose that if WebGL is supported then typed arrays are supported too // as they predate WebGL support for all browsers: // see typed arrays support: http://caniuse.com/#search=TypedArrays // see WebGL support: http://caniuse.com/#search=WebGL PIXI.Uint32Array = Uint32Array; PIXI.ArrayBuffer = ArrayBuffer; } else { PIXI.Float32Array = Array; PIXI.Uint16Array = Array; } // interaction frequency PIXI.INTERACTION_FREQUENCY = 30; PIXI.AUTO_PREVENT_DEFAULT = true; /** * @property {Number} PI_2 * @static */ PIXI.PI_2 = Math.PI * 2; /** * @property {Number} RAD_TO_DEG * @static */ PIXI.RAD_TO_DEG = 180 / Math.PI; /** * @property {Number} DEG_TO_RAD * @static */ PIXI.DEG_TO_RAD = Math.PI / 180; /** * @property {String} RETINA_PREFIX * @protected * @static */ PIXI.RETINA_PREFIX = "@2x"; //PIXI.SCALE_PREFIX "@x%%"; /** * If true the default pixi startup (console) banner message will be suppressed. * * @property {Boolean} dontSayHello * @default false * @static */ PIXI.dontSayHello = false; /** * The default render options if none are supplied to * {{#crossLink "WebGLRenderer"}}{{/crossLink}} or {{#crossLink "CanvasRenderer"}}{{/crossLink}}. * * @property {Object} defaultRenderOptions * @property {Object} defaultRenderOptions.view=null * @property {Boolean} defaultRenderOptions.transparent=false * @property {Boolean} defaultRenderOptions.antialias=false * @property {Boolean} defaultRenderOptions.preserveDrawingBuffer=false * @property {Number} defaultRenderOptions.resolution=1 * @property {Boolean} defaultRenderOptions.clearBeforeRender=true * @property {Boolean} defaultRenderOptions.autoResize=false * @static */ PIXI.defaultRenderOptions = { view:null, transparent:false, antialias:false, preserveDrawingBuffer:false, resolution:1, clearBeforeRender:true, autoResize:false } PIXI.sayHello = function (type) { if(PIXI.dontSayHello)return; if ( navigator.userAgent.toLowerCase().indexOf('chrome') > -1 ) { var args = [ '%c %c %c Pixi.js ' + PIXI.VERSION + ' - ' + type + ' %c ' + ' %c ' + ' http://www.pixijs.com/'>http://www.pixijs.com/ %c %c ♥%c♥%c♥ ', 'background: #ff66a5', 'background: #ff66a5', 'color: #ff66a5; background: #030307;', 'background: #ff66a5', 'background: #ffc3dc', 'background: #ff66a5', 'color: #ff2424; background: #fff', 'color: #ff2424; background: #fff', 'color: #ff2424; background: #fff' ]; console.log.apply(console, args); } else if (window['console']) { console.log('Pixi.js ' + PIXI.VERSION + ' - http://www.pixijs.com/'>http://www.pixijs.com/'); } PIXI.dontSayHello = true; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The Point object represents a location in a two-dimensional coordinate system, where x represents the horizontal axis and y represents the vertical axis. * * @class Point * @constructor * @param x {Number} position of the point on the x axis * @param y {Number} position of the point on the y axis */ PIXI.Point = function(x, y) { /** * @property x * @type Number * @default 0 */ this.x = x || 0; /** * @property y * @type Number * @default 0 */ this.y = y || 0; }; /** * Creates a clone of this point * * @method clone * @return {Point} a copy of the point */ PIXI.Point.prototype.clone = function() { return new PIXI.Point(this.x, this.y); }; /** * Sets the point to a new x and y position. * If y is omitted, both x and y will be set to x. * * @method set * @param [x=0] {Number} position of the point on the x axis * @param [y=0] {Number} position of the point on the y axis */ PIXI.Point.prototype.set = function(x, y) { this.x = x || 0; this.y = y || ( (y !== 0) ? this.x : 0 ) ; }; // constructor PIXI.Point.prototype.constructor = PIXI.Point; /** * @author Mat Groves http://matgroves.com/ */ /** * the Rectangle object is an area defined by its position, as indicated by its top-left corner point (x, y) and by its width and its height. * * @class Rectangle * @constructor * @param x {Number} The X coordinate of the upper-left corner of the rectangle * @param y {Number} The Y coordinate of the upper-left corner of the rectangle * @param width {Number} The overall width of this rectangle * @param height {Number} The overall height of this rectangle */ PIXI.Rectangle = function(x, y, width, height) { /** * @property x * @type Number * @default 0 */ this.x = x || 0; /** * @property y * @type Number * @default 0 */ this.y = y || 0; /** * @property width * @type Number * @default 0 */ this.width = width || 0; /** * @property height * @type Number * @default 0 */ this.height = height || 0; /** * The type of the object, should be one of the Graphics type consts, PIXI.Graphics.RECT in this case * @property type * @type Number * @default 0 */ }; /** * Creates a clone of this Rectangle * * @method clone * @return {Rectangle} a copy of the rectangle */ PIXI.Rectangle.prototype.clone = function() { return new PIXI.Rectangle(this.x, this.y, this.width, this.height); }; /** * Checks whether the x and y coordinates given are contained within this Rectangle * * @method contains * @param x {Number} The X coordinate of the point to test * @param y {Number} The Y coordinate of the point to test * @return {Boolean} Whether the x/y coordinates are within this Rectangle */ PIXI.Rectangle.prototype.contains = function(x, y) { if(this.width <= 0 || this.height <= 0) return false; var x1 = this.x; if(x >= x1 && x <= x1 + this.width) { var y1 = this.y; if(y >= y1 && y <= y1 + this.height) { return true; } } return false; }; // constructor PIXI.Rectangle.prototype.constructor = PIXI.Rectangle; PIXI.EmptyRectangle = new PIXI.Rectangle(0,0,0,0); /** * @author Adrien Brault <[email protected]> */ /** * @class Polygon * @constructor * @param points* {Array(Point)|Array(Number)|Point...|Number...} This can be an array of Points that form the polygon, * a flat array of numbers that will be interpreted as [x,y, x,y, ...], or the arguments passed can be * all the points of the polygon e.g. `new PIXI.Polygon(new PIXI.Point(), new PIXI.Point(), ...)`, or the * arguments passed can be flat x,y values e.g. `new PIXI.Polygon(x,y, x,y, x,y, ...)` where `x` and `y` are * Numbers. */ PIXI.Polygon = function(points) { //if points isn't an array, use arguments as the array if(!(points instanceof Array))points = Array.prototype.slice.call(arguments); //if this is a flat array of numbers, convert it to points if(points[0] instanceof PIXI.Point) { var p = []; for(var i = 0, il = points.length; i < il; i++) { p.push(points[i].x, points[i].y); } points = p; } this.closed = true; /** * An array of the points of this polygon * @property points * @type Array(Point)|Array(Number) * */ this.points = points; /** * The type of the object, should be one of the Graphics type consts, PIXI.Graphics.POLY in this case * @property type * @type Number * @default 0 */ }; /** * Creates a clone of this polygon * * @method clone * @return {Polygon} a copy of the polygon */ PIXI.Polygon.prototype.clone = function() { var points = this.points.slice(); return new PIXI.Polygon(points); }; /** * Checks whether the x and y coordinates passed to this function are contained within this polygon * * @method contains * @param x {Number} The X coordinate of the point to test * @param y {Number} The Y coordinate of the point to test * @return {Boolean} Whether the x/y coordinates are within this polygon */ PIXI.Polygon.prototype.contains = function(x, y) { var inside = false; // use some raycasting to test hits // https://github.com/substack/point-in-polygon/blob/master/index.js var length = this.points.length / 2; for(var i = 0, j = length - 1; i < length; j = i++) { var xi = this.points[i * 2], yi = this.points[i * 2 + 1], xj = this.points[j * 2], yj = this.points[j * 2 + 1], intersect = ((yi > y) !== (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi); if(intersect) inside = !inside; } return inside; }; // constructor PIXI.Polygon.prototype.constructor = PIXI.Polygon; /** * @author Chad Engler <[email protected]> */ /** * The Circle object can be used to specify a hit area for displayObjects * * @class Circle * @constructor * @param x {Number} The X coordinate of the center of this circle * @param y {Number} The Y coordinate of the center of this circle * @param radius {Number} The radius of the circle */ PIXI.Circle = function(x, y, radius) { /** * @property x * @type Number * @default 0 */ this.x = x || 0; /** * @property y * @type Number * @default 0 */ this.y = y || 0; /** * @property radius * @type Number * @default 0 */ this.radius = radius || 0; /** * The type of the object, should be one of the Graphics type consts, PIXI.Graphics.CIRC in this case * @property type * @type Number * @default 0 */ }; /** * Creates a clone of this Circle instance * * @method clone * @return {Circle} a copy of the Circle */ PIXI.Circle.prototype.clone = function() { return new PIXI.Circle(this.x, this.y, this.radius); }; /** * Checks whether the x and y coordinates given are contained within this circle * * @method contains * @param x {Number} The X coordinate of the point to test * @param y {Number} The Y coordinate of the point to test * @return {Boolean} Whether the x/y coordinates are within this Circle */ PIXI.Circle.prototype.contains = function(x, y) { if(this.radius <= 0) return false; var dx = (this.x - x), dy = (this.y - y), r2 = this.radius * this.radius; dx *= dx; dy *= dy; return (dx + dy <= r2); }; /** * Returns the framing rectangle of the circle as a PIXI.Rectangle object * * @method getBounds * @return {Rectangle} the framing rectangle */ PIXI.Circle.prototype.getBounds = function() { return new PIXI.Rectangle(this.x - this.radius, this.y - this.radius, this.radius * 2, this.radius * 2); }; // constructor PIXI.Circle.prototype.constructor = PIXI.Circle; /** * @author Chad Engler <[email protected]> */ /** * The Ellipse object can be used to specify a hit area for displayObjects * * @class Ellipse * @constructor * @param x {Number} The X coordinate of the center of the ellipse * @param y {Number} The Y coordinate of the center of the ellipse * @param width {Number} The half width of this ellipse * @param height {Number} The half height of this ellipse */ PIXI.Ellipse = function(x, y, width, height) { /** * @property x * @type Number * @default 0 */ this.x = x || 0; /** * @property y * @type Number * @default 0 */ this.y = y || 0; /** * @property width * @type Number * @default 0 */ this.width = width || 0; /** * @property height * @type Number * @default 0 */ this.height = height || 0; /** * The type of the object, should be one of the Graphics type consts, PIXI.Graphics.ELIP in this case * @property type * @type Number * @default 0 */ }; /** * Creates a clone of this Ellipse instance * * @method clone * @return {Ellipse} a copy of the ellipse */ PIXI.Ellipse.prototype.clone = function() { return new PIXI.Ellipse(this.x, this.y, this.width, this.height); }; /** * Checks whether the x and y coordinates given are contained within this ellipse * * @method contains * @param x {Number} The X coordinate of the point to test * @param y {Number} The Y coordinate of the point to test * @return {Boolean} Whether the x/y coords are within this ellipse */ PIXI.Ellipse.prototype.contains = function(x, y) { if(this.width <= 0 || this.height <= 0) return false; //normalize the coords to an ellipse with center 0,0 var normx = ((x - this.x) / this.width), normy = ((y - this.y) / this.height); normx *= normx; normy *= normy; return (normx + normy <= 1); }; /** * Returns the framing rectangle of the ellipse as a PIXI.Rectangle object * * @method getBounds * @return {Rectangle} the framing rectangle */ PIXI.Ellipse.prototype.getBounds = function() { return new PIXI.Rectangle(this.x - this.width, this.y - this.height, this.width, this.height); }; // constructor PIXI.Ellipse.prototype.constructor = PIXI.Ellipse; /** * @author Mat Groves http://matgroves.com/ */ /** * The Rounded Rectangle object is an area defined by its position and has nice rounded corners, as indicated by its top-left corner point (x, y) and by its width and its height. * * @class RoundedRectangle * @constructor * @param x {Number} The X coordinate of the upper-left corner of the rounded rectangle * @param y {Number} The Y coordinate of the upper-left corner of the rounded rectangle * @param width {Number} The overall width of this rounded rectangle * @param height {Number} The overall height of this rounded rectangle * @param radius {Number} Controls the radius of the rounded corners */ PIXI.RoundedRectangle = function(x, y, width, height, radius) { /** * @property x * @type Number * @default 0 */ this.x = x || 0; /** * @property y * @type Number * @default 0 */ this.y = y || 0; /** * @property width * @type Number * @default 0 */ this.width = width || 0; /** * @property height * @type Number * @default 0 */ this.height = height || 0; /** * @property radius * @type Number * @default 20 */ this.radius = radius || 20; /** * The type of the object, should be one of the Graphics type consts, PIXI.Graphics.RRECT in this case * @property type * @type Number * @default 0 */ }; /** * Creates a clone of this Rounded Rectangle * * @method clone * @return {RoundedRectangle} a copy of the rounded rectangle */ PIXI.RoundedRectangle.prototype.clone = function() { return new PIXI.RoundedRectangle(this.x, this.y, this.width, this.height, this.radius); }; /** * Checks whether the x and y coordinates given are contained within this Rounded Rectangle * * @method contains * @param x {Number} The X coordinate of the point to test * @param y {Number} The Y coordinate of the point to test * @return {Boolean} Whether the x/y coordinates are within this Rounded Rectangle */ PIXI.RoundedRectangle.prototype.contains = function(x, y) { if(this.width <= 0 || this.height <= 0) return false; var x1 = this.x; if(x >= x1 && x <= x1 + this.width) { var y1 = this.y; if(y >= y1 && y <= y1 + this.height) { return true; } } return false; }; // constructor PIXI.RoundedRectangle.prototype.constructor = PIXI.RoundedRectangle; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The Matrix class is now an object, which makes it a lot faster, * here is a representation of it : * | a | b | tx| * | c | d | ty| * | 0 | 0 | 1 | * * @class Matrix * @constructor */ PIXI.Matrix = function() { /** * @property a * @type Number * @default 1 */ this.a = 1; /** * @property b * @type Number * @default 0 */ this.b = 0; /** * @property c * @type Number * @default 0 */ this.c = 0; /** * @property d * @type Number * @default 1 */ this.d = 1; /** * @property tx * @type Number * @default 0 */ this.tx = 0; /** * @property ty * @type Number * @default 0 */ this.ty = 0; }; /** * Creates a Matrix object based on the given array. The Element to Matrix mapping order is as follows: * * a = array[0] * b = array[1] * c = array[3] * d = array[4] * tx = array[2] * ty = array[5] * * @method fromArray * @param array {Array} The array that the matrix will be populated from. */ PIXI.Matrix.prototype.fromArray = function(array) { this.a = array[0]; this.b = array[1]; this.c = array[3]; this.d = array[4]; this.tx = array[2]; this.ty = array[5]; }; /** * Creates an array from the current Matrix object. * * @method toArray * @param transpose {Boolean} Whether we need to transpose the matrix or not * @return {Array} the newly created array which contains the matrix */ PIXI.Matrix.prototype.toArray = function(transpose) { if(!this.array) this.array = new PIXI.Float32Array(9); var array = this.array; if(transpose) { array[0] = this.a; array[1] = this.b; array[2] = 0; array[3] = this.c; array[4] = this.d; array[5] = 0; array[6] = this.tx; array[7] = this.ty; array[8] = 1; } else { array[0] = this.a; array[1] = this.c; array[2] = this.tx; array[3] = this.b; array[4] = this.d; array[5] = this.ty; array[6] = 0; array[7] = 0; array[8] = 1; } return array; }; /** * Get a new position with the current transformation applied. * Can be used to go from a child's coordinate space to the world coordinate space. (e.g. rendering) * * @method apply * @param pos {Point} The origin * @param [newPos] {Point} The point that the new position is assigned to (allowed to be same as input) * @return {Point} The new point, transformed through this matrix */ PIXI.Matrix.prototype.apply = function(pos, newPos) { newPos = newPos || new PIXI.Point(); newPos.x = this.a * pos.x + this.c * pos.y + this.tx; newPos.y = this.b * pos.x + this.d * pos.y + this.ty; return newPos; }; /** * Get a new position with the inverse of the current transformation applied. * Can be used to go from the world coordinate space to a child's coordinate space. (e.g. input) * * @method applyInverse * @param pos {Point} The origin * @param [newPos] {Point} The point that the new position is assigned to (allowed to be same as input) * @return {Point} The new point, inverse-transformed through this matrix */ PIXI.Matrix.prototype.applyInverse = function(pos, newPos) { newPos = newPos || new PIXI.Point(); var id = 1 / (this.a * this.d + this.c * -this.; newPos.x = this.d * id * pos.x + -this.c * id * pos.y + (this.ty * this.c - this.tx * this.d) * id; newPos.y = this.a * id * pos.y + -this.b * id * pos.x + (-this.ty * this.a + this.tx * this. * id; return newPos; }; /** * Translates the matrix on the x and y. * * @method translate * @param {Number} x * @param {Number} y * @return {Matrix} This matrix. Good for chaining method calls. **/ PIXI.Matrix.prototype.translate = function(x, y) { this.tx += x; this.ty += y; return this; }; /** * Applies a scale transformation to the matrix. * * @method scale * @param {Number} x The amount to scale horizontally * @param {Number} y The amount to scale vertically * @return {Matrix} This matrix. Good for chaining method calls. **/ PIXI.Matrix.prototype.scale = function(x, y) { this.a *= x; this.d *= y; this.c *= x; this.b *= y; this.tx *= x; this.ty *= y; return this; }; /** * Applies a rotation transformation to the matrix. * @method rotate * @param {Number} angle The angle in radians. * @return {Matrix} This matrix. Good for chaining method calls. **/ PIXI.Matrix.prototype.rotate = function(angle) { var cos = Math.cos( angle ); var sin = Math.sin( angle ); var a1 = this.a; var c1 = this.c; var tx1 = this.tx; this.a = a1 * cos-this.b * sin; this.b = a1 * sin+this.b * cos; this.c = c1 * cos-this.d * sin; this.d = c1 * sin+this.d * cos; this.tx = tx1 * cos - this.ty * sin; this.ty = tx1 * sin + this.ty * cos; return this; }; /** * Appends the given Matrix to this Matrix. * * @method append * @param {Matrix} matrix * @return {Matrix} This matrix. Good for chaining method calls. */ PIXI.Matrix.prototype.append = function(matrix) { var a1 = this.a; var b1 = this.b; var c1 = this.c; var d1 = this.d; this.a = matrix.a * a1 + matrix.b * c1; this.b = matrix.a * b1 + matrix.b * d1; this.c = matrix.c * a1 + matrix.d * c1; this.d = matrix.c * b1 + matrix.d * d1; this.tx = matrix.tx * a1 + matrix.ty * c1 + this.tx; this.ty = matrix.tx * b1 + matrix.ty * d1 + this.ty; return this; }; /** * Resets this Matix to an identity (default) matrix. * * @method identity * @return {Matrix} This matrix. Good for chaining method calls. */ PIXI.Matrix.prototype.identity = function() { this.a = 1; this.b = 0; this.c = 0; this.d = 1; this.tx = 0; this.ty = 0; return this; }; PIXI.identityMatrix = new PIXI.Matrix(); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The base class for all objects that are rendered on the screen. * This is an abstract class and should not be used on its own rather it should be extended. * * @class DisplayObject * @constructor */ PIXI.DisplayObject = function() { /** * The coordinate of the object relative to the local coordinates of the parent. * * @property position * @type Point */ this.position = new PIXI.Point(); /** * The scale factor of the object. * * @property scale * @type Point */ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** * The pivot point of the displayObject that it rotates around * * @property pivot * @type Point */ this.pivot = new PIXI.Point(0,0); /** * The rotation of the object in radians. * * @property rotation * @type Number */ this.rotation = 0; /** * The opacity of the object. * * @property alpha * @type Number */ this.alpha = 1; /** * The visibility of the object. * * @property visible * @type Boolean */ this.visible = true; /** * This is the defined area that will pick up mouse / touch events. It is null by default. * Setting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children) * * @property hitArea * @type Rectangle|Circle|Ellipse|Polygon */ this.hitArea = null; /** * This is used to indicate if the displayObject should display a mouse hand cursor on rollover * * @property buttonMode * @type Boolean */ this.buttonMode = false; /** * Can this object be rendered * * @property renderable * @type Boolean */ this.renderable = false; /** * [read-only] The display object container that contains this display object. * * @property parent * @type DisplayObjectContainer * @readOnly */ this.parent = null; /** * [read-only] The stage the display object is connected to, or undefined if it is not connected to the stage. * * @property stage * @type Stage * @readOnly */ this.stage = null; /** * [read-only] The multiplied alpha of the displayObject * * @property worldAlpha * @type Number * @readOnly */ this.worldAlpha = 1; /** * [read-only] Whether or not the object is interactive, do not toggle directly! use the `interactive` property * * @property _interactive * @type Boolean * @readOnly * @private */ this._interactive = false; /** * This is the cursor that will be used when the mouse is over this object. To enable this the element must have interaction = true and buttonMode = true * * @property defaultCursor * @type String * */ this.defaultCursor = 'pointer'; /** * [read-only] Current transform of the object based on world (parent) factors * * @property worldTransform * @type Matrix * @readOnly * @private */ this.worldTransform = new PIXI.Matrix(); /** * cached sin rotation and cos rotation * * @property _sr * @type Number * @private */ this._sr = 0; /** * cached sin rotation and cos rotation * * @property _cr * @type Number * @private */ this._cr = 1; /** * The area the filter is applied to like the hitArea this is used as more of an optimisation * rather than figuring out the dimensions of the displayObject each frame you can set this rectangle * * @property filterArea * @type Rectangle */ this.filterArea = null;//new PIXI.Rectangle(0,0,1,1); /** * The original, cached bounds of the object * * @property _bounds * @type Rectangle * @private */ this._bounds = new PIXI.Rectangle(0, 0, 1, 1); /** * The most up-to-date bounds of the object * * @property _currentBounds * @type Rectangle * @private */ this._currentBounds = null; /** * The original, cached mask of the object * * @property _currentBounds * @type Rectangle * @private */ this._mask = null; /** * Cached internal flag. * * @property _cacheAsBitmap * @type Boolean * @private */ this._cacheAsBitmap = false; /** * Cached internal flag. * * @property _cacheIsDirty * @type Boolean * @private */ this._cacheIsDirty = false; /* * MOUSE Callbacks */ /** * A callback that is used when the users mouse rolls over the displayObject * @method mouseover * @param interactionData {InteractionData} */ /** * A callback that is used when the users mouse leaves the displayObject * @method mouseout * @param interactionData {InteractionData} */ //Left button /** * A callback that is used when the users clicks on the displayObject with their mouse's left button * @method click * @param interactionData {InteractionData} */ /** * A callback that is used when the user clicks the mouse's left button down over the sprite * @method mousedown * @param interactionData {InteractionData} */ /** * A callback that is used when the user releases the mouse's left button that was over the displayObject * for this callback to be fired, the mouse's left button must have been pressed down over the displayObject * @method mouseup * @param interactionData {InteractionData} */ /** * A callback that is used when the user releases the mouse's left button that was over the displayObject but is no longer over the displayObject * for this callback to be fired, the mouse's left button must have been pressed down over the displayObject * @method mouseupoutside * @param interactionData {InteractionData} */ //Right button /** * A callback that is used when the users clicks on the displayObject with their mouse's right button * @method rightclick * @param interactionData {InteractionData} */ /** * A callback that is used when the user clicks the mouse's right button down over the sprite * @method rightdown * @param interactionData {InteractionData} */ /** * A callback that is used when the user releases the mouse's right button that was over the displayObject * for this callback to be fired the mouse's right button must have been pressed down over the displayObject * @method rightup * @param interactionData {InteractionData} */ /** * A callback that is used when the user releases the mouse's right button that was over the displayObject but is no longer over the displayObject * for this callback to be fired, the mouse's right button must have been pressed down over the displayObject * @method rightupoutside * @param interactionData {InteractionData} */ /* * TOUCH Callbacks */ /** * A callback that is used when the users taps on the sprite with their finger * basically a touch version of click * @method tap * @param interactionData {InteractionData} */ /** * A callback that is used when the user touches over the displayObject * @method touchstart * @param interactionData {InteractionData} */ /** * A callback that is used when the user releases a touch over the displayObject * @method touchend * @param interactionData {InteractionData} */ /** * A callback that is used when the user releases the touch that was over the displayObject * for this callback to be fired, The touch must have started over the sprite * @method touchendoutside * @param interactionData {InteractionData} */ }; // constructor PIXI.DisplayObject.prototype.constructor = PIXI.DisplayObject; /** * Indicates if the sprite will have touch and mouse interactivity. It is false by default * * @property interactive * @type Boolean * @default false */ Object.defineProperty(PIXI.DisplayObject.prototype, 'interactive', { get: function() { return this._interactive; }, set: function(value) { this._interactive = value; // TODO more to be done here.. // need to sort out a re-crawl! if(this.stage)this.stage.dirty = true; } }); /** * [read-only] Indicates if the sprite is globally visible. * * @property worldVisible * @type Boolean */ Object.defineProperty(PIXI.DisplayObject.prototype, 'worldVisible', { get: function() { var item = this; do { if(!item.visible)return false; item = item.parent; } while(item); return true; } }); /** * Sets a mask for the displayObject. A mask is an object that limits the visibility of an object to the shape of the mask applied to it. * In PIXI a regular mask must be a PIXI.Graphics object. This allows for much faster masking in canvas as it utilises shape clipping. * To remove a mask, set this property to null. * * @property mask * @type Graphics */ Object.defineProperty(PIXI.DisplayObject.prototype, 'mask', { get: function() { return this._mask; }, set: function(value) { if(this._mask)this._mask.isMask = false; this._mask = value; if(this._mask)this._mask.isMask = true; } }); /** * Sets the filters for the displayObject. * * IMPORTANT: This is a webGL only feature and will be ignored by the canvas renderer. * To remove filters simply set this property to 'null' * @property filters * @type Array(Filter) */ Object.defineProperty(PIXI.DisplayObject.prototype, 'filters', { get: function() { return this._filters; }, set: function(value) { if(value) { // now put all the passes in one place.. var passes = []; for (var i = 0; i < value.length; i++) { var filterPasses = value[i].passes; for (var j = 0; j < filterPasses.length; j++) { passes.push(filterPasses[j]); } } // TODO change this as it is legacy this._filterBlock = {target:this, filterPasses:passes}; } this._filters = value; } }); /** * Set if this display object is cached as a bitmap. * This basically takes a snap shot of the display object as it is at that moment. It can provide a performance benefit for complex static displayObjects. * To remove simply set this property to 'null' * @property cacheAsBitmap * @type Boolean */ Object.defineProperty(PIXI.DisplayObject.prototype, 'cacheAsBitmap', { get: function() { return this._cacheAsBitmap; }, set: function(value) { if(this._cacheAsBitmap === value)return; if(value) { this._generateCachedSprite(); } else { this._destroyCachedSprite(); } this._cacheAsBitmap = value; } }); /* * Updates the object transform for rendering * * @method updateTransform * @private */ PIXI.DisplayObject.prototype.updateTransform = function() { // create some matrix refs for easy access var pt = this.parent.worldTransform; var wt = this.worldTransform; // temporary matrix variables var a, b, c, d, tx, ty; // so if rotation is between 0 then we can simplify the multiplication process.. if(this.rotation % PIXI.PI_2) { // check to see if the rotation is the same as the previous render. This means we only need to use sin and cos when rotation actually changes if(this.rotation !== this.rotationCache) { this.rotationCache = this.rotation; this._sr = Math.sin(this.rotation); this._cr = Math.cos(this.rotation); } // get the matrix values of the displayobject based on its transform properties.. a = this._cr * this.scale.x; b = this._sr * this.scale.x; c = -this._sr * this.scale.y; d = this._cr * this.scale.y; tx = this.position.x; ty = this.position.y; // check for pivot.. not often used so geared towards that fact! if(this.pivot.x || this.pivot.y) { tx -= this.pivot.x * a + this.pivot.y * c; ty -= this.pivot.x * b + this.pivot.y * d; } // concat the parent matrix with the objects transform. wt.a = a * pt.a + b * pt.c; wt.b = a * pt.b + b * pt.d; wt.c = c * pt.a + d * pt.c; wt.d = c * pt.b + d * pt.d; wt.tx = tx * pt.a + ty * pt.c + pt.tx; wt.ty = tx * pt.b + ty * pt.d + pt.ty; } else { // lets do the fast version as we know there is no rotation.. a = this.scale.x; d = this.scale.y; tx = this.position.x - this.pivot.x * a; ty = this.position.y - this.pivot.y * d; wt.a = a * pt.a; wt.b = a * pt.b; wt.c = d * pt.c; wt.d = d * pt.d; wt.tx = tx * pt.a + ty * pt.c + pt.tx; wt.ty = tx * pt.b + ty * pt.d + pt.ty; } // multiply the alphas.. this.worldAlpha = this.alpha * this.parent.worldAlpha; }; // performance increase to avoid using call.. (10x faster) PIXI.DisplayObject.prototype.displayObjectUpdateTransform = PIXI.DisplayObject.prototype.updateTransform; /** * Retrieves the bounds of the displayObject as a rectangle object * * @method getBounds * @param matrix {Matrix} * @return {Rectangle} the rectangular bounding area */ PIXI.DisplayObject.prototype.getBounds = function(matrix) { matrix = matrix;//just to get passed js hinting (and preserve inheritance) return PIXI.EmptyRectangle; }; /** * Retrieves the local bounds of the displayObject as a rectangle object * * @method getLocalBounds * @return {Rectangle} the rectangular bounding area */ PIXI.DisplayObject.prototype.getLocalBounds = function() { return this.getBounds(PIXI.identityMatrix);///PIXI.EmptyRectangle(); }; /** * Sets the object's stage reference, the stage this object is connected to * * @method setStageReference * @param stage {Stage} the stage that the object will have as its current stage reference */ PIXI.DisplayObject.prototype.setStageReference = function(stage) { this.stage = stage; if(this._interactive)this.stage.dirty = true; }; /** * Useful function that returns a texture of the displayObject object that can then be used to create sprites * This can be quite useful if your displayObject is static / complicated and needs to be reused multiple times. * * @method generateTexture * @param resolution {Number} The resolution of the texture being generated * @param scaleMode {Number} See {{#crossLink "PIXI/scaleModes:property"}}PIXI.scaleModes{{/crossLink}} for possible values * @param renderer {CanvasRenderer|WebGLRenderer} The renderer used to generate the texture. * @return {Texture} a texture of the graphics object */ PIXI.DisplayObject.prototype.generateTexture = function(resolution, scaleMode, renderer) { var bounds = this.getLocalBounds(); var renderTexture = new PIXI.RenderTexture(bounds.width | 0, bounds.height | 0, renderer, scaleMode, resolution); PIXI.DisplayObject._tempMatrix.tx = -bounds.x; PIXI.DisplayObject._tempMatrix.ty = -bounds.y; renderTexture.render(this, PIXI.DisplayObject._tempMatrix); return renderTexture; }; /** * Generates and updates the cached sprite for this object. * * @method updateCache */ PIXI.DisplayObject.prototype.updateCache = function() { this._generateCachedSprite(); }; /** * Calculates the global position of the display object * * @method toGlobal * @param position {Point} The world origin to calculate from * @return {Point} A point object representing the position of this object */ PIXI.DisplayObject.prototype.toGlobal = function(position) { // don't need to u[date the lot this.displayObjectUpdateTransform(); return this.worldTransform.apply(position); }; /** * Calculates the local position of the display object relative to another point * * @method toLocal * @param position {Point} The world origin to calculate from * @param [from] {DisplayObject} The DisplayObject to calculate the global position from * @return {Point} A point object representing the position of this object */ PIXI.DisplayObject.prototype.toLocal = function(position, from) { // if (from) { position = from.toGlobal(position); } // don't need to u[date the lot this.displayObjectUpdateTransform(); return this.worldTransform.applyInverse(position); }; /** * Internal method. * * @method _renderCachedSprite * @param renderSession {Object} The render session * @private */ PIXI.DisplayObject.prototype._renderCachedSprite = function(renderSession) { this._cachedSprite.worldAlpha = this.worldAlpha; if(renderSession.gl) { PIXI.Sprite.prototype._renderWebGL.call(this._cachedSprite, renderSession); } else { PIXI.Sprite.prototype._renderCanvas.call(this._cachedSprite, renderSession); } }; /** * Internal method. * * @method _generateCachedSprite * @private */ PIXI.DisplayObject.prototype._generateCachedSprite = function() { this._cacheAsBitmap = false; var bounds = this.getLocalBounds(); if(!this._cachedSprite) { var renderTexture = new PIXI.RenderTexture(bounds.width | 0, bounds.height | 0);//, renderSession.renderer); this._cachedSprite = new PIXI.Sprite(renderTexture); this._cachedSprite.worldTransform = this.worldTransform; } else { this._cachedSprite.texture.resize(bounds.width | 0, bounds.height | 0); } //REMOVE filter! var tempFilters = this._filters; this._filters = null; this._cachedSprite.filters = tempFilters; PIXI.DisplayObject._tempMatrix.tx = -bounds.x; PIXI.DisplayObject._tempMatrix.ty = -bounds.y; this._cachedSprite.texture.render(this, PIXI.DisplayObject._tempMatrix, true); this._cachedSprite.anchor.x = -( bounds.x / bounds.width ); this._cachedSprite.anchor.y = -( bounds.y / bounds.height ); this._filters = tempFilters; this._cacheAsBitmap = true; }; /** * Destroys the cached sprite. * * @method _destroyCachedSprite * @private */ PIXI.DisplayObject.prototype._destroyCachedSprite = function() { if(!this._cachedSprite)return; this._cachedSprite.texture.destroy(true); // TODO could be object pooled! this._cachedSprite = null; }; /** * Renders the object using the WebGL renderer * * @method _renderWebGL * @param renderSession {RenderSession} * @private */ PIXI.DisplayObject.prototype._renderWebGL = function(renderSession) { // OVERWRITE; // this line is just here to pass jshinting renderSession = renderSession; }; /** * Renders the object using the Canvas renderer * * @method _renderCanvas * @param renderSession {RenderSession} * @private */ PIXI.DisplayObject.prototype._renderCanvas = function(renderSession) { // OVERWRITE; // this line is just here to pass jshinting renderSession = renderSession; }; PIXI.DisplayObject._tempMatrix = new PIXI.Matrix(); /** * The position of the displayObject on the x axis relative to the local coordinates of the parent. * * @property x * @type Number */ Object.defineProperty(PIXI.DisplayObject.prototype, 'x', { get: function() { return this.position.x; }, set: function(value) { this.position.x = value; } }); /** * The position of the displayObject on the y axis relative to the local coordinates of the parent. * * @property y * @type Number */ Object.defineProperty(PIXI.DisplayObject.prototype, 'y', { get: function() { return this.position.y; }, set: function(value) { this.position.y = value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * A DisplayObjectContainer represents a collection of display objects. * It is the base class of all display objects that act as a container for other objects. * * @class DisplayObjectContainer * @extends DisplayObject * @constructor */ PIXI.DisplayObjectContainer = function() { PIXI.DisplayObject.call( this ); /** * [read-only] The array of children of this container. * * @property children * @type Array(DisplayObject) * @readOnly */ this.children = []; // fast access to update transform.. }; // constructor PIXI.DisplayObjectContainer.prototype = Object.create( PIXI.DisplayObject.prototype ); PIXI.DisplayObjectContainer.prototype.constructor = PIXI.DisplayObjectContainer; /** * The width of the displayObjectContainer, setting this will actually modify the scale to achieve the value set * * @property width * @type Number */ Object.defineProperty(PIXI.DisplayObjectContainer.prototype, 'width', { get: function() { return this.scale.x * this.getLocalBounds().width; }, set: function(value) { var width = this.getLocalBounds().width; if(width !== 0) { this.scale.x = value / width; } else { this.scale.x = 1; } this._width = value; } }); /** * The height of the displayObjectContainer, setting this will actually modify the scale to achieve the value set * * @property height * @type Number */ Object.defineProperty(PIXI.DisplayObjectContainer.prototype, 'height', { get: function() { return this.scale.y * this.getLocalBounds().height; }, set: function(value) { var height = this.getLocalBounds().height; if(height !== 0) { this.scale.y = value / height ; } else { this.scale.y = 1; } this._height = value; } }); /** * Adds a child to the container. * * @method addChild * @param child {DisplayObject} The DisplayObject to add to the container * @return {DisplayObject} The child that was added. */ PIXI.DisplayObjectContainer.prototype.addChild = function(child) { return this.addChildAt(child, this.children.length); }; /** * Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown * * @method addChildAt * @param child {DisplayObject} The child to add * @param index {Number} The index to place the child in * @return {DisplayObject} The child that was added. */ PIXI.DisplayObjectContainer.prototype.addChildAt = function(child, index) { if(index >= 0 && index <= this.children.length) { if(child.parent) { child.parent.removeChild(child); } child.parent = this; this.children.splice(index, 0, child); if(this.stage)child.setStageReference(this.stage); return child; } else { throw new Error(child + 'addChildAt: The index '+ index +' supplied is out of bounds ' + this.children.length); } }; /** * Swaps the position of 2 Display Objects within this container. * * @method swapChildren * @param child {DisplayObject} * @param child2 {DisplayObject} */ PIXI.DisplayObjectContainer.prototype.swapChildren = function(child, child2) { if(child === child2) { return; } var index1 = this.getChildIndex(child); var index2 = this.getChildIndex(child2); if(index1 < 0 || index2 < 0) { throw new Error('swapChildren: Both the supplied DisplayObjects must be a child of the caller.'); } this.children[index1] = child2; this.children[index2] = child; }; /** * Returns the index position of a child DisplayObject instance * * @method getChildIndex * @param child {DisplayObject} The DisplayObject instance to identify * @return {Number} The index position of the child display object to identify */ PIXI.DisplayObjectContainer.prototype.getChildIndex = function(child) { var index = this.children.indexOf(child); if (index === -1) { throw new Error('The supplied DisplayObject must be a child of the caller'); } return index; }; /** * Changes the position of an existing child in the display object container * * @method setChildIndex * @param child {DisplayObject} The child DisplayObject instance for which you want to change the index number * @param index {Number} The resulting index number for the child display object */ PIXI.DisplayObjectContainer.prototype.setChildIndex = function(child, index) { if (index < 0 || index >= this.children.length) { throw new Error('The supplied index is out of bounds'); } var currentIndex = this.getChildIndex(child); this.children.splice(currentIndex, 1); //remove from old position this.children.splice(index, 0, child); //add at new position }; /** * Returns the child at the specified index * * @method getChildAt * @param index {Number} The index to get the child from * @return {DisplayObject} The child at the given index, if any. */ PIXI.DisplayObjectContainer.prototype.getChildAt = function(index) { if (index < 0 || index >= this.children.length) { throw new Error('getChildAt: Supplied index '+ index +' does not exist in the child list, or the supplied DisplayObject must be a child of the caller'); } return this.children[index]; }; /** * Removes a child from the container. * * @method removeChild * @param child {DisplayObject} The DisplayObject to remove * @return {DisplayObject} The child that was removed. */ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); if(index === -1)return; return this.removeChildAt( index ); }; /** * Removes a child from the specified index position. * * @method removeChildAt * @param index {Number} The index to get the child from * @return {DisplayObject} The child that was removed. */ PIXI.DisplayObjectContainer.prototype.removeChildAt = function(index) { var child = this.getChildAt( index ); if(this.stage) child.removeStageReference(); child.parent = undefined; this.children.splice( index, 1 ); return child; }; /** * Removes all children from this container that are within the begin and end indexes. * * @method removeChildren * @param beginIndex {Number} The beginning position. Default value is 0. * @param endIndex {Number} The ending position. Default value is size of the container. */ PIXI.DisplayObjectContainer.prototype.removeChildren = function(beginIndex, endIndex) { var begin = beginIndex || 0; var end = typeof endIndex === 'number' ? endIndex : this.children.length; var range = end - begin; if (range > 0 && range <= end) { var removed = this.children.splice(begin, range); for (var i = 0; i < removed.length; i++) { var child = removed[i]; if(this.stage) child.removeStageReference(); child.parent = undefined; } return removed; } else if (range === 0 && this.children.length === 0) { return []; } else { throw new Error( 'removeChildren: Range Error, numeric values are outside the acceptable range' ); } }; /* * Updates the transform on all children of this container for rendering * * @method updateTransform * @private */ PIXI.DisplayObjectContainer.prototype.updateTransform = function() { if(!this.visible)return; this.displayObjectUpdateTransform(); //PIXI.DisplayObject.prototype.updateTransform.call( this ); if(this._cacheAsBitmap)return; for(var i=0,j=this.children.length; i<j; i++) { this.children[i].updateTransform(); } }; // performance increase to avoid using call.. (10x faster) PIXI.DisplayObjectContainer.prototype.displayObjectContainerUpdateTransform = PIXI.DisplayObjectContainer.prototype.updateTransform; /** * Retrieves the bounds of the displayObjectContainer as a rectangle. The bounds calculation takes all visible children into consideration. * * @method getBounds * @return {Rectangle} The rectangular bounding area */ PIXI.DisplayObjectContainer.prototype.getBounds = function() { if(this.children.length === 0)return PIXI.EmptyRectangle; // TODO the bounds have already been calculated this render session so return what we have var minX = Infinity; var minY = Infinity; var maxX = -Infinity; var maxY = -Infinity; var childBounds; var childMaxX; var childMaxY; var childVisible = false; for(var i=0,j=this.children.length; i<j; i++) { var child = this.children[i]; if(!child.visible)continue; childVisible = true; childBounds = this.children[i].getBounds(); minX = minX < childBounds.x ? minX : childBounds.x; minY = minY < childBounds.y ? minY : childBounds.y; childMaxX = childBounds.width + childBounds.x; childMaxY = childBounds.height + childBounds.y; maxX = maxX > childMaxX ? maxX : childMaxX; maxY = maxY > childMaxY ? maxY : childMaxY; } if(!childVisible) return PIXI.EmptyRectangle; var bounds = this._bounds; bounds.x = minX; bounds.y = minY; bounds.width = maxX - minX; bounds.height = maxY - minY; // TODO: store a reference so that if this function gets called again in the render cycle we do not have to recalculate //this._currentBounds = bounds; return bounds; }; /** * Retrieves the non-global local bounds of the displayObjectContainer as a rectangle. The calculation takes all visible children into consideration. * * @method getLocalBounds * @return {Rectangle} The rectangular bounding area */ PIXI.DisplayObjectContainer.prototype.getLocalBounds = function() { var matrixCache = this.worldTransform; this.worldTransform = PIXI.identityMatrix; for(var i=0,j=this.children.length; i<j; i++) { this.children[i].updateTransform(); } var bounds = this.getBounds(); this.worldTransform = matrixCache; return bounds; }; /** * Sets the containers Stage reference. This is the Stage that this object, and all of its children, is connected to. * * @method setStageReference * @param stage {Stage} the stage that the container will have as its current stage reference */ PIXI.DisplayObjectContainer.prototype.setStageReference = function(stage) { this.stage = stage; if(this._interactive)this.stage.dirty = true; for(var i=0,j=this.children.length; i<j; i++) { var child = this.children[i]; child.setStageReference(stage); } }; /** * Removes the current stage reference from the container and all of its children. * * @method removeStageReference */ PIXI.DisplayObjectContainer.prototype.removeStageReference = function() { for(var i=0,j=this.children.length; i<j; i++) { var child = this.children[i]; child.removeStageReference(); } if(this._interactive)this.stage.dirty = true; this.stage = null; }; /** * Renders the object using the WebGL renderer * * @method _renderWebGL * @param renderSession {RenderSession} * @private */ PIXI.DisplayObjectContainer.prototype._renderWebGL = function(renderSession) { if(!this.visible || this.alpha <= 0)return; if(this._cacheAsBitmap) { this._renderCachedSprite(renderSession); return; } var i,j; if(this._mask || this._filters) { // push filter first as we need to ensure the stencil buffer is correct for any masking if(this._filters) { renderSession.spriteBatch.flush(); renderSession.filterManager.pushFilter(this._filterBlock); } if(this._mask) { renderSession.spriteBatch.stop(); renderSession.maskManager.pushMask(this.mask, renderSession); renderSession.spriteBatch.start(); } // simple render children! for(i=0,j=this.children.length; i<j; i++) { this.children[i]._renderWebGL(renderSession); } renderSession.spriteBatch.stop(); if(this._mask)renderSession.maskManager.popMask(this._mask, renderSession); if(this._filters)renderSession.filterManager.popFilter(); renderSession.spriteBatch.start(); } else { // simple render children! for(i=0,j=this.children.length; i<j; i++) { this.children[i]._renderWebGL(renderSession); } } }; /** * Renders the object using the Canvas renderer * * @method _renderCanvas * @param renderSession {RenderSession} * @private */ PIXI.DisplayObjectContainer.prototype._renderCanvas = function(renderSession) { if(this.visible === false || this.alpha === 0)return; if(this._cacheAsBitmap) { this._renderCachedSprite(renderSession); return; } if(this._mask) { renderSession.maskManager.pushMask(this._mask, renderSession); } for(var i=0,j=this.children.length; i<j; i++) { var child = this.children[i]; child._renderCanvas(renderSession); } if(this._mask) { renderSession.maskManager.popMask(renderSession); } }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The Sprite object is the base for all textured objects that are rendered to the screen * * @class Sprite * @extends DisplayObjectContainer * @constructor * @param texture {Texture} The texture for this sprite * * A sprite can be created directly from an image like this : * var sprite = new PIXI.Sprite.fromImage('assets/image.png'); * yourStage.addChild(sprite); * then obviously don't forget to add it to the stage you have already created */ PIXI.Sprite = function(texture) { PIXI.DisplayObjectContainer.call( this ); /** * The anchor sets the origin point of the texture. * The default is 0,0 this means the texture's origin is the top left * Setting than anchor to 0.5,0.5 means the textures origin is centered * Setting the anchor to 1,1 would mean the textures origin points will be the bottom right corner * * @property anchor * @type Point */ this.anchor = new PIXI.Point(); /** * The texture that the sprite is using * * @property texture * @type Texture */ this.texture = texture || PIXI.Texture.emptyTexture; /** * The width of the sprite (this is initially set by the texture) * * @property _width * @type Number * @private */ this._width = 0; /** * The height of the sprite (this is initially set by the texture) * * @property _height * @type Number * @private */ this._height = 0; /** * The tint applied to the sprite. This is a hex value. A value of 0xFFFFFF will remove any tint effect. * * @property tint * @type Number * @default 0xFFFFFF */ this.tint = 0xFFFFFF; /** * The blend mode to be applied to the sprite. Set to PIXI.blendModes.NORMAL to remove any blend mode. * * @property blendMode * @type Number * @default PIXI.blendModes.NORMAL; */ this.blendMode = PIXI.blendModes.NORMAL; /** * The shader that will be used to render the texture to the stage. Set to null to remove a current shader. * * @property shader * @type AbstractFilter * @default null */ this.shader = null; if(this.texture.baseTexture.hasLoaded) { this.onTextureUpdate(); } else { this.texture.on( 'update', this.onTextureUpdate.bind(this) ); } this.renderable = true; }; // constructor PIXI.Sprite.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); PIXI.Sprite.prototype.constructor = PIXI.Sprite; /** * The width of the sprite, setting this will actually modify the scale to achieve the value set * * @property width * @type Number */ Object.defineProperty(PIXI.Sprite.prototype, 'width', { get: function() { return this.scale.x * this.texture.frame.width; }, set: function(value) { this.scale.x = value / this.texture.frame.width; this._width = value; } }); /** * The height of the sprite, setting this will actually modify the scale to achieve the value set * * @property height * @type Number */ Object.defineProperty(PIXI.Sprite.prototype, 'height', { get: function() { return this.scale.y * this.texture.frame.height; }, set: function(value) { this.scale.y = value / this.texture.frame.height; this._height = value; } }); /** * Sets the texture of the sprite * * @method setTexture * @param texture {Texture} The PIXI texture that is displayed by the sprite */ PIXI.Sprite.prototype.setTexture = function(texture) { this.texture = texture; this.cachedTint = 0xFFFFFF; }; /** * When the texture is updated, this event will fire to update the scale and frame * * @method onTextureUpdate * @param event * @private */ PIXI.Sprite.prototype.onTextureUpdate = function() { // so if _width is 0 then width was not set.. if(this._width)this.scale.x = this._width / this.texture.frame.width; if(this._height)this.scale.y = this._height / this.texture.frame.height; //this.updateFrame = true; }; /** * Returns the bounds of the Sprite as a rectangle. The bounds calculation takes the worldTransform into account. * * @method getBounds * @param matrix {Matrix} the transformation matrix of the sprite * @return {Rectangle} the framing rectangle */ PIXI.Sprite.prototype.getBounds = function(matrix) { var width = this.texture.frame.width; var height = this.texture.frame.height; var w0 = width * (1-this.anchor.x); var w1 = width * -this.anchor.x; var h0 = height * (1-this.anchor.y); var h1 = height * -this.anchor.y; var worldTransform = matrix || this.worldTransform ; var a = worldTransform.a; var b = worldTransform.b; var c = worldTransform.c; var d = worldTransform.d; var tx = worldTransform.tx; var ty = worldTransform.ty; var maxX = -Infinity; var maxY = -Infinity; var minX = Infinity; var minY = Infinity; if(b === 0 && c === 0) { // scale may be negative! if(a < 0)a *= -1; if(d < 0)d *= -1; // this means there is no rotation going on right? RIGHT? // if thats the case then we can avoid checking the bound values! yay minX = a * w1 + tx; maxX = a * w0 + tx; minY = d * h1 + ty; maxY = d * h0 + ty; } else { var x1 = a * w1 + c * h1 + tx; var y1 = d * h1 + b * w1 + ty; var x2 = a * w0 + c * h1 + tx; var y2 = d * h1 + b * w0 + ty; var = a * w0 + c * h0 + tx; var y3 = d * h0 + b * w0 + ty; var x4 = a * w1 + c * h0 + tx; var y4 = d * h0 + b * w1 + ty; minX = x1 < minX ? x1 : minX; minX = x2 < minX ? x2 : minX; minX = < minX ? : minX; minX = x4 < minX ? x4 : minX; minY = y1 < minY ? y1 : minY; minY = y2 < minY ? y2 : minY; minY = y3 < minY ? y3 : minY; minY = y4 < minY ? y4 : minY; maxX = x1 > maxX ? x1 : maxX; maxX = x2 > maxX ? x2 : maxX; maxX = > maxX ? : maxX; maxX = x4 > maxX ? x4 : maxX; maxY = y1 > maxY ? y1 : maxY; maxY = y2 > maxY ? y2 : maxY; maxY = y3 > maxY ? y3 : maxY; maxY = y4 > maxY ? y4 : maxY; } var bounds = this._bounds; bounds.x = minX; bounds.width = maxX - minX; bounds.y = minY; bounds.height = maxY - minY; // store a reference so that if this function gets called again in the render cycle we do not have to recalculate this._currentBounds = bounds; return bounds; }; /** * Renders the object using the WebGL renderer * * @method _renderWebGL * @param renderSession {RenderSession} * @private */ PIXI.Sprite.prototype._renderWebGL = function(renderSession) { // if the sprite is not visible or the alpha is 0 then no need to render this element if(!this.visible || this.alpha <= 0)return; var i,j; // do a quick check to see if this element has a mask or a filter. if(this._mask || this._filters) { var spriteBatch = renderSession.spriteBatch; // push filter first as we need to ensure the stencil buffer is correct for any masking if(this._filters) { spriteBatch.flush(); renderSession.filterManager.pushFilter(this._filterBlock); } if(this._mask) { spriteBatch.stop(); renderSession.maskManager.pushMask(this.mask, renderSession); spriteBatch.start(); } // add this sprite to the batch spriteBatch.render(this); // now loop through the children and make sure they get rendered for(i=0,j=this.children.length; i<j; i++) { this.children[i]._renderWebGL(renderSession); } // time to stop the sprite batch as either a mask element or a filter draw will happen next spriteBatch.stop(); if(this._mask)renderSession.maskManager.popMask(this._mask, renderSession); if(this._filters)renderSession.filterManager.popFilter(); spriteBatch.start(); } else { renderSession.spriteBatch.render(this); // simple render children! for(i=0,j=this.children.length; i<j; i++) { this.children[i]._renderWebGL(renderSession); } } }; /** * Renders the object using the Canvas renderer * * @method _renderCanvas * @param renderSession {RenderSession} * @private */ PIXI.Sprite.prototype._renderCanvas = function(renderSession) { // If the sprite is not visible or the alpha is 0 then no need to render this element if (this.visible === false || this.alpha === 0 || this.texture.crop.width <= 0 || this.texture.crop.height <= 0) return; if (this.blendMode !== renderSession.currentBlendMode) { renderSession.currentBlendMode = this.blendMode; renderSession.context.globalCompositeOperation = PIXI.blendModesCanvas[renderSession.currentBlendMode]; } if (this._mask) { renderSession.maskManager.pushMask(this._mask, renderSession); } // Ignore null sources if (this.texture.valid) { var resolution = this.texture.baseTexture.resolution / renderSession.resolution; renderSession.context.globalAlpha = this.worldAlpha; // If smoothingEnabled is supported and we need to change the smoothing property for this texture if (renderSession.smoothProperty && renderSession.scaleMode !== this.texture.baseTexture.scaleMode) { renderSession.scaleMode = this.texture.baseTexture.scaleMode; renderSession.context[renderSession.smoothProperty] = (renderSession.scaleMode === PIXI.scaleModes.LINEAR); } // If the texture is trimmed we offset by the trim x/y, otherwise we use the frame dimensions var dx = (this.texture.trim) ? this.texture.trim.x - this.anchor.x * this.texture.trim.width : this.anchor.x * -this.texture.frame.width; var dy = (this.texture.trim) ? this.texture.trim.y - this.anchor.y * this.texture.trim.height : this.anchor.y * -this.texture.frame.height; // Allow for pixel rounding if (renderSession.roundPixels) { renderSession.context.setTransform( this.worldTransform.a, this.worldTransform.b, this.worldTransform.c, this.worldTransform.d, (this.worldTransform.tx * renderSession.resolution) | 0, (this.worldTransform.ty * renderSession.resolution) | 0); dx = dx | 0; dy = dy | 0; } else { renderSession.context.setTransform( this.worldTransform.a, this.worldTransform.b, this.worldTransform.c, this.worldTransform.d, this.worldTransform.tx * renderSession.resolution, this.worldTransform.ty * renderSession.resolution); } if (this.tint !== 0xFFFFFF) { if (this.cachedTint !== this.tint) { this.cachedTint = this.tint; // TODO clean up caching - how to clean up the caches? this.tintedTexture = PIXI.CanvasTinter.getTintedTexture(this, this.tint); } renderSession.context.drawImage( this.tintedTexture, 0, 0, this.texture.crop.width, this.texture.crop.height, dx / resolution, dy / resolution, this.texture.crop.width / resolution, this.texture.crop.height / resolution); } else { renderSession.context.drawImage( this.texture.baseTexture.source, this.texture.crop.x, this.texture.crop.y, this.texture.crop.width, this.texture.crop.height, dx / resolution, dy / resolution, this.texture.crop.width / resolution, this.texture.crop.height / resolution); } } // OVERWRITE for (var i = 0, j = this.children.length; i < j; i++) { this.children[i]._renderCanvas(renderSession); } if (this._mask) { renderSession.maskManager.popMask(renderSession); } }; // some helper functions.. /** * * Helper function that creates a sprite that will contain a texture from the TextureCache based on the frameId * The frame ids are created when a Texture packer file has been loaded * * @method fromFrame * @static * @param frameId {String} The frame Id of the texture in the cache * @return {Sprite} A new Sprite using a texture from the texture cache matching the frameId */ PIXI.Sprite.fromFrame = function(frameId) { var texture = PIXI.TextureCache[frameId]; if(!texture) throw new Error('The frameId "' + frameId + '" does not exist in the texture cache' + this); return new PIXI.Sprite(texture); }; /** * * Helper function that creates a sprite that will contain a texture based on an image url * If the image is not in the texture cache it will be loaded * * @method fromImage * @static * @param imageId {String} The image url of the texture * @return {Sprite} A new Sprite using a texture from the texture cache matching the image id */ PIXI.Sprite.fromImage = function(imageId, crossorigin, scaleMode) { var texture = PIXI.Texture.fromImage(imageId, crossorigin, scaleMode); return new PIXI.Sprite(texture); }; /** * @author Mat Groves http://matgroves.com/ */ /** * The SpriteBatch class is a really fast version of the DisplayObjectContainer * built solely for speed, so use when you need a lot of sprites or particles. * And it's extremely easy to use : var container = new PIXI.SpriteBatch(); stage.addChild(container); for(var i = 0; i < 100; i++) { var sprite = new PIXI.Sprite.fromImage("myImage.png"); container.addChild(sprite); } * And here you have a hundred sprites that will be renderer at the speed of light * * @class SpriteBatch * @constructor * @param texture {Texture} */ //TODO RENAME to PARTICLE CONTAINER? PIXI.SpriteBatch = function(texture) { PIXI.DisplayObjectContainer.call( this); this.textureThing = texture; this.ready = false; }; PIXI.SpriteBatch.prototype = Object.create(PIXI.DisplayObjectContainer.prototype); PIXI.SpriteBatch.prototype.constructor = PIXI.SpriteBatch; /* * Initialises the spriteBatch * * @method initWebGL * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.SpriteBatch.prototype.initWebGL = function(gl) { // TODO only one needed for the whole engine really? this.fastSpriteBatch = new PIXI.WebGLFastSpriteBatch(gl); this.ready = true; }; /* * Updates the object transform for rendering * * @method updateTransform * @private */ PIXI.SpriteBatch.prototype.updateTransform = function() { // TODO don't need to! this.displayObjectUpdateTransform(); // PIXI.DisplayObjectContainer.prototype.updateTransform.call( this ); }; /** * Renders the object using the WebGL renderer * * @method _renderWebGL * @param renderSession {RenderSession} * @private */ PIXI.SpriteBatch.prototype._renderWebGL = function(renderSession) { if(!this.visible || this.alpha <= 0 || !this.children.length)return; if(!this.ready)this.initWebGL( renderSession.gl ); if(this.fastSpriteBatch.gl !== renderSession.gl) this.fastSpriteBatch.setContext(renderSession.gl); renderSession.spriteBatch.stop(); renderSession.shaderManager.setShader(renderSession.shaderManager.fastShader); this.fastSpriteBatch.begin(this, renderSession); this.fastSpriteBatch.render(this); renderSession.spriteBatch.start(); }; /** * Renders the object using the Canvas renderer * * @method _renderCanvas * @param renderSession {RenderSession} * @private */ PIXI.SpriteBatch.prototype._renderCanvas = function(renderSession) { if(!this.visible || this.alpha <= 0 || !this.children.length)return; var context = renderSession.context; context.globalAlpha = this.worldAlpha; this.displayObjectUpdateTransform(); var transform = this.worldTransform; // alow for trimming var isRotated = true; for (var i = 0; i < this.children.length; i++) { var child = this.children[i]; if(!child.visible)continue; var texture = child.texture; var frame = texture.frame; context.globalAlpha = this.worldAlpha * child.alpha; if(child.rotation % (Math.PI * 2) === 0) { if(isRotated) { context.setTransform(transform.a, transform.b, transform.c, transform.d, transform.tx, transform.ty); isRotated = false; } // this is the fastest way to optimise! - if rotation is 0 then we can avoid any kind of setTransform call context.drawImage(texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, ((child.anchor.x) * (-frame.width * child.scale.x) + child.position.x + 0.5) | 0, ((child.anchor.y) * (-frame.height * child.scale.y) + child.position.y + 0.5) | 0, frame.width * child.scale.x, frame.height * child.scale.y); } else { if(!isRotated)isRotated = true; child.displayObjectUpdateTransform(); var childTransform = child.worldTransform; // allow for trimming if (renderSession.roundPixels) { context.setTransform(childTransform.a, childTransform.b, childTransform.c, childTransform.d, childTransform.tx | 0, childTransform.ty | 0); } else { context.setTransform(childTransform.a, childTransform.b, childTransform.c, childTransform.d, childTransform.tx, childTransform.ty); } context.drawImage(texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, ((child.anchor.x) * (-frame.width) + 0.5) | 0, ((child.anchor.y) * (-frame.height) + 0.5) | 0, frame.width, frame.height); } // context.restore(); } // context.restore(); }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * A MovieClip is a simple way to display an animation depicted by a list of textures. * * @class MovieClip * @extends Sprite * @constructor * @param textures {Array(Texture)} an array of {Texture} objects that make up the animation */ PIXI.MovieClip = function(textures) { PIXI.Sprite.call(this, textures[0]); /** * The array of textures that make up the animation * * @property textures * @type Array(Texture) */ this.textures = textures; /** * The speed that the MovieClip will play at. Higher is faster, lower is slower * * @property animationSpeed * @type Number * @default 1 */ this.animationSpeed = 1; /** * Whether or not the movie clip repeats after playing. * * @property loop * @type Boolean * @default true */ this.loop = true; /** * Function to call when a MovieClip finishes playing * * @property onComplete * @type Function */ this.onComplete = null; /** * [read-only] The MovieClips current frame index (this may not have to be a whole number) * * @property currentFrame * @type Number * @default 0 * @readOnly */ this.currentFrame = 0; /** * [read-only] Indicates if the MovieClip is currently playing * * @property playing * @type Boolean * @readOnly */ this.playing = false; }; // constructor PIXI.MovieClip.prototype = Object.create( PIXI.Sprite.prototype ); PIXI.MovieClip.prototype.constructor = PIXI.MovieClip; /** * [read-only] totalFrames is the total number of frames in the MovieClip. This is the same as number of textures * assigned to the MovieClip. * * @property totalFrames * @type Number * @default 0 * @readOnly */ Object.defineProperty( PIXI.MovieClip.prototype, 'totalFrames', { get: function() { return this.textures.length; } }); /** * Stops the MovieClip * * @method stop */ PIXI.MovieClip.prototype.stop = function() { this.playing = false; }; /** * Plays the MovieClip * * @method play */ PIXI.MovieClip.prototype.play = function() { this.playing = true; }; /** * Stops the MovieClip and goes to a specific frame * * @method gotoAndStop * @param frameNumber {Number} frame index to stop at */ PIXI.MovieClip.prototype.gotoAndStop = function(frameNumber) { this.playing = false; this.currentFrame = frameNumber; var round = (this.currentFrame + 0.5) | 0; this.setTexture(this.textures[round % this.textures.length]); }; /** * Goes to a specific frame and begins playing the MovieClip * * @method gotoAndPlay * @param frameNumber {Number} frame index to start at */ PIXI.MovieClip.prototype.gotoAndPlay = function(frameNumber) { this.currentFrame = frameNumber; this.playing = true; }; /* * Updates the object transform for rendering * * @method updateTransform * @private */ PIXI.MovieClip.prototype.updateTransform = function() { this.displayObjectContainerUpdateTransform(); if(!this.playing)return; this.currentFrame += this.animationSpeed; var round = (this.currentFrame + 0.5) | 0; this.currentFrame = this.currentFrame % this.textures.length; if(this.loop || round < this.textures.length) { this.setTexture(this.textures[round % this.textures.length]); } else if(round >= this.textures.length) { this.gotoAndStop(this.textures.length - 1); if(this.onComplete) { this.onComplete(); } } }; /** * A short hand way of creating a movieclip from an array of frame ids * * @static * @method fromFrames * @param frames {Array} the array of frames ids the movieclip will use as its texture frames * @return {MovieClip} */ PIXI.MovieClip.fromFrames = function(frames) { var textures = []; for (var i = 0; i < frames.length; i++) { textures.push(new PIXI.Texture.fromFrame(frames[i])); } return new PIXI.MovieClip(textures); }; /** * A short hand way of creating a movieclip from an array of image ids * * @static * @method fromImages * @param frames {Array} the array of image ids the movieclip will use as its texture frames * @return {MovieClip} */ PIXI.MovieClip.fromImages = function(images) { var textures = []; for (var i = 0; i < images.length; i++) { textures.push(new PIXI.Texture.fromImage(images[i])); } return new PIXI.MovieClip(textures); }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * A target and pass info object for filters. * * @class FilterBlock * @constructor */ PIXI.FilterBlock = function() { /** * The visible state of this FilterBlock. * * @property visible * @type Boolean */ this.visible = true; /** * The renderable state of this FilterBlock. * * @property renderable * @type Boolean */ this.renderable = true; }; PIXI.FilterBlock.prototype.constructor = PIXI.FilterBlock; /** * @author Mat Groves http://matgroves.com/ @Doormat23 * Modified by Tom Slezakowski http://www.tomslezakowski.com @TomSlezakowski (24/03/2014) - Added dropShadowColor. */ /** * A Text Object will create a line or multiple lines of text. To split a line you can use '\n' in your text string, * or add a wordWrap property set to true and and wordWrapWidth property with a value in the style object. * * @class Text * @extends Sprite * @constructor * @param text {String} The copy that you would like the text to display * @param [style] {Object} The style parameters * @param [style.font] {String} default 'bold 20px Arial' The style and size of the font * @param [style.fill='black'] {String|Number} A canvas fillstyle that will be used on the text e.g 'red', '#00FF00' * @param [style.align='left'] {String} Alignment for multiline text ('left', 'center' or 'right'), does not affect single line text * @param [style.stroke] {String|Number} A canvas fillstyle that will be used on the text stroke e.g 'blue', '#FCFF00' * @param [style.strokeThickness=0] {Number} A number that represents the thickness of the stroke. Default is 0 (no stroke) * @param [style.wordWrap=false] {Boolean} Indicates if word wrap should be used * @param [style.wordWrapWidth=100] {Number} The width at which text will wrap, it needs wordWrap to be set to true * @param [style.dropShadow=false] {Boolean} Set a drop shadow for the text * @param [style.dropShadowColor='#000000'] {String} A fill style to be used on the dropshadow e.g 'red', '#00FF00' * @param [style.dropShadowAngle=Math.PI/4] {Number} Set a angle of the drop shadow * @param [style.dropShadowDistance=5] {Number} Set a distance of the drop shadow * @param [style.lineJoin='miter'] {String} The lineJoin property sets the type of corner created, it can resolve spiked text issue. Default is 'miter' (creates a sharp corner). */ PIXI.Text = function(text, style) { /** * The canvas element that everything is drawn to * * @property canvas * @type HTMLCanvasElement */ this.canvas = document.createElement('canvas'); /** * The canvas 2d context that everything is drawn with * @property context * @type CanvasRenderingContext2D */ this.context = this.canvas.getContext('2d'); /** * The resolution of the canvas. * @property resolution * @type Number */ this.resolution = 1; PIXI.Sprite.call(this, PIXI.Texture.fromCanvas(this.canvas)); this.setText(text); this.setStyle(style); }; // constructor PIXI.Text.prototype = Object.create(PIXI.Sprite.prototype); PIXI.Text.prototype.constructor = PIXI.Text; /** * The width of the Text, setting this will actually modify the scale to achieve the value set * * @property width * @type Number */ Object.defineProperty(PIXI.Text.prototype, 'width', { get: function() { if(this.dirty) { this.updateText(); this.dirty = false; } return this.scale.x * this.texture.frame.width; }, set: function(value) { this.scale.x = value / this.texture.frame.width; this._width = value; } }); /** * The height of the Text, setting this will actually modify the scale to achieve the value set * * @property height * @type Number */ Object.defineProperty(PIXI.Text.prototype, 'height', { get: function() { if(this.dirty) { this.updateText(); this.dirty = false; } return this.scale.y * this.texture.frame.height; }, set: function(value) { this.scale.y = value / this.texture.frame.height; this._height = value; } }); /** * Set the style of the text * * @method setStyle * @param [style] {Object} The style parameters * @param [style.font='bold 20pt Arial'] {String} The style and size of the font * @param [style.fill='black'] {Object} A canvas fillstyle that will be used on the text eg 'red', '#00FF00' * @param [style.align='left'] {String} Alignment for multiline text ('left', 'center' or 'right'), does not affect single line text * @param [style.stroke='black'] {String} A canvas fillstyle that will be used on the text stroke eg 'blue', '#FCFF00' * @param [style.strokeThickness=0] {Number} A number that represents the thickness of the stroke. Default is 0 (no stroke) * @param [style.wordWrap=false] {Boolean} Indicates if word wrap should be used * @param [style.wordWrapWidth=100] {Number} The width at which text will wrap * @param [style.dropShadow=false] {Boolean} Set a drop shadow for the text * @param [style.dropShadowColor='#000000'] {String} A fill style to be used on the dropshadow e.g 'red', '#00FF00' * @param [style.dropShadowAngle=Math.PI/4] {Number} Set a angle of the drop shadow * @param [style.dropShadowDistance=5] {Number} Set a distance of the drop shadow * @param [style.lineJoin='miter'] {String} The lineJoin property sets the type of corner created, it can resolve spiked text issue. Default is 'miter' (creates a sharp corner). * @param [style.lineHeight] {number} Line height of the text */ PIXI.Text.prototype.setStyle = function(style) { style = style || {}; style.font = style.font || 'bold 20pt Arial'; style.fill = style.fill || 'black'; style.align = style.align || 'left'; style.stroke = style.stroke || 'black'; //provide a default, see: https://github.com/GoodBoyDigital/pixi.js/issues/136 style.strokeThickness = style.strokeThickness || 0; style.wordWrap = style.wordWrap || false; style.wordWrapWidth = style.wordWrapWidth || 100; style.dropShadow = style.dropShadow || false; style.dropShadowAngle = style.dropShadowAngle || Math.PI / 6; style.dropShadowDistance = style.dropShadowDistance || 4; style.dropShadowColor = style.dropShadowColor || 'black'; style.lineJoin = style.lineJoin || 'miter'; style.lineHeight = style.lineHeight || false; this.style = style; this.dirty = true; }; /** * Set the copy for the text object. To split a line you can use '\n'. * * @method setText * @param text {String} The copy that you would like the text to display */ PIXI.Text.prototype.setText = function(text) { this.text = text.toString() || ' '; this.dirty = true; }; /** * Renders text and updates it when needed * * @method updateText * @private */ PIXI.Text.prototype.updateText = function() { this.texture.baseTexture.resolution = this.resolution; this.context.font = this.style.font; var outputText = this.text; // word wrap // preserve original text if(this.style.wordWrap)outputText = this.wordWrap(this.text); //split text into lines var lines = outputText.split(/(?:\r\n|\r|\n)/); //calculate text width var lineWidths = []; var maxLineWidth = 0; var fontProperties = this.determineFontProperties(this.style.font); for (var i = 0; i < lines.length; i++) { var lineWidth = this.context.measureText(lines[i]).width; lineWidths[i] = lineWidth; maxLineWidth = Math.max(maxLineWidth, lineWidth); } var width = maxLineWidth + this.style.strokeThickness; if(this.style.dropShadow)width += this.style.dropShadowDistance; this.canvas.width = ( width + this.context.lineWidth ) * this.resolution; //calculate text height var lineHeight = this.style.lineHeight || fontProperties.fontSize + this.style.strokeThickness; var height = lineHeight * lines.length; if(this.style.dropShadow)height += this.style.dropShadowDistance; this.canvas.height = height * this.resolution; this.context.scale( this.resolution, this.resolution); if(navigator.isCocoonJS) this.context.clearRect(0,0,this.canvas.width,this.canvas.height); // used for debugging.. //this.context.fillStyle ="#FF0000" //this.context.fillRect(0, 0, this.canvas.width,this.canvas.height); this.context.font = this.style.font; this.context.strokeStyle = this.style.stroke; this.context.lineWidth = this.style.strokeThickness; this.context.textBaseline = 'alphabetic'; this.context.lineJoin = this.style.lineJoin; var linePositionX; var linePositionY; if(this.style.dropShadow) { this.context.fillStyle = this.style.dropShadowColor; var xShadowOffset = Math.sin(this.style.dropShadowAngle) * this.style.dropShadowDistance; var yShadowOffset = Math.cos(this.style.dropShadowAngle) * this.style.dropShadowDistance; for (i = 0; i < lines.length; i++) { linePositionX = this.style.strokeThickness / 2; linePositionY = (this.style.strokeThickness / 2 + i * lineHeight) + fontProperties.ascent; if(this.style.align === 'right') { linePositionX += maxLineWidth - lineWidths[i]; } else if(this.style.align === 'center') { linePositionX += (maxLineWidth - lineWidths[i]) / 2; } if(this.style.fill) { this.context.fillText(lines[i], linePositionX + xShadowOffset, linePositionY + yShadowOffset); } // if(dropShadow) } } //set canvas text styles this.context.fillStyle = this.style.fill; //draw lines line by line for (i = 0; i < lines.length; i++) { linePositionX = this.style.strokeThickness / 2; linePositionY = (this.style.strokeThickness / 2 + i * lineHeight) + fontProperties.ascent; if(this.style.align === 'right') { linePositionX += maxLineWidth - lineWidths[i]; } else if(this.style.align === 'center') { linePositionX += (maxLineWidth - lineWidths[i]) / 2; } if(this.style.stroke && this.style.strokeThickness) { this.context.strokeText(lines[i], linePositionX, linePositionY); } if(this.style.fill) { this.context.fillText(lines[i], linePositionX, linePositionY); } // if(dropShadow) } this.updateTexture(); }; /** * Updates texture size based on canvas size * * @method updateTexture * @private */ PIXI.Text.prototype.updateTexture = function() { this.texture.baseTexture.width = this.canvas.width; this.texture.baseTexture.height = this.canvas.height; this.texture.crop.width = this.texture.frame.width = this.canvas.width; this.texture.crop.height = this.texture.frame.height = this.canvas.height; this._width = this.canvas.width; this._height = this.canvas.height; // update the dirty base textures this.texture.baseTexture.dirty(); }; /** * Renders the object using the WebGL renderer * * @method _renderWebGL * @param renderSession {RenderSession} * @private */ PIXI.Text.prototype._renderWebGL = function(renderSession) { if(this.dirty) { this.resolution = renderSession.resolution; this.updateText(); this.dirty = false; } PIXI.Sprite.prototype._renderWebGL.call(this, renderSession); }; /** * Renders the object using the Canvas renderer * * @method _renderCanvas * @param renderSession {RenderSession} * @private */ PIXI.Text.prototype._renderCanvas = function(renderSession) { if(this.dirty) { this.resolution = renderSession.resolution; this.updateText(); this.dirty = false; } PIXI.Sprite.prototype._renderCanvas.call(this, renderSession); }; /** * Calculates the ascent, descent and fontSize of a given fontStyle * * @method determineFontProperties * @param fontStyle {Object} * @private */ PIXI.Text.prototype.determineFontProperties = function(fontStyle) { var properties = PIXI.Text.fontPropertiesCache[fontStyle]; if(!properties) { properties = {}; var canvas = PIXI.Text.fontPropertiesCanvas; var context = PIXI.Text.fontPropertiesContext; context.font = fontStyle; var width = Math.ceil(context.measureText('|Mq').width); var baseline = Math.ceil(context.measureText('M').width); var height = 2 * baseline; baseline = baseline * 1.4 | 0; canvas.width = width; canvas.height = height; context.fillStyle = '#f00'; context.fillRect(0, 0, width, height); context.font = fontStyle; context.textBaseline = 'alphabetic'; context.fillStyle = '#000'; context.fillText('|MÉq', 0, baseline); var imagedata = context.getImageData(0, 0, width, height).data; var pixels = imagedata.length; var line = width * 4; var i, j; var idx = 0; var stop = false; // ascent. scan from top to bottom until we find a non red pixel for(i = 0; i < baseline; i++) { for(j = 0; j < line; j += 4) { if(imagedata[idx + j] !== 255) { stop = true; break; } } if(!stop) { idx += line; } else { break; } } properties.ascent = baseline - i; idx = pixels - line; stop = false; // descent. scan from bottom to top until we find a non red pixel for(i = height; i > baseline; i--) { for(j = 0; j < line; j += 4) { if(imagedata[idx + j] !== 255) { stop = true; break; } } if(!stop) { idx -= line; } else { break; } } properties.descent = i - baseline; //TODO might need a tweak. kind of a temp fix! properties.descent += 6; properties.fontSize = properties.ascent + properties.descent; PIXI.Text.fontPropertiesCache[fontStyle] = properties; } return properties; }; /** * Applies newlines to a string to have it optimally fit into the horizontal * bounds set by the Text object's wordWrapWidth property. * * @method wordWrap * @param text {String} * @private */ PIXI.Text.prototype.wordWrap = function(text) { // Greedy wrapping algorithm that will wrap words as the line grows longer // than its horizontal bounds. var result = ''; var lines = text.split('\n'); for (var i = 0; i < lines.length; i++) { var spaceLeft = this.style.wordWrapWidth; var words = lines[i].split(' '); for (var j = 0; j < words.length; j++) { var wordWidth = this.context.measureText(words[j]).width; var wordWidthWithSpace = wordWidth + this.context.measureText(' ').width; if(j === 0 || wordWidthWithSpace > spaceLeft) { // Skip printing the newline if it's the first word of the line that is // greater than the word wrap width. if(j > 0) { result += '\n'; } result += words[j]; spaceLeft = this.style.wordWrapWidth - wordWidth; } else { spaceLeft -= wordWidthWithSpace; result += ' ' + words[j]; } } if (i < lines.length-1) { result += '\n'; } } return result; }; /** * Returns the bounds of the Text as a rectangle. The bounds calculation takes the worldTransform into account. * * @method getBounds * @param matrix {Matrix} the transformation matrix of the Text * @return {Rectangle} the framing rectangle */ PIXI.Text.prototype.getBounds = function(matrix) { if(this.dirty) { this.updateText(); this.dirty = false; } return PIXI.Sprite.prototype.getBounds.call(this, matrix); }; /** * Destroys this text object. * * @method destroy * @param destroyBaseTexture {Boolean} whether to destroy the base texture as well */ PIXI.Text.prototype.destroy = function(destroyBaseTexture) { // make sure to reset the the context and canvas.. dont want this hanging around in memory! this.context = null; this.canvas = null; this.texture.destroy(destroyBaseTexture === undefined ? true : destroyBaseTexture); }; PIXI.Text.fontPropertiesCache = {}; PIXI.Text.fontPropertiesCanvas = document.createElement('canvas'); PIXI.Text.fontPropertiesContext = PIXI.Text.fontPropertiesCanvas.getContext('2d'); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * A BitmapText object will create a line or multiple lines of text using bitmap font. To split a line you can use '\n', '\r' or '\r\n' in your string. * You can generate the fnt files using * http://www.angelcode.com/products/bmfont/ for windows or * http://www.bmglyph.com/ for mac. * * @class BitmapText * @extends DisplayObjectContainer * @constructor * @param text {String} The copy that you would like the text to display * @param style {Object} The style parameters * @param style.font {String} The size (optional) and bitmap font id (required) eq 'Arial' or '20px Arial' (must have loaded previously) * @param [style.align='left'] {String} Alignment for multiline text ('left', 'center' or 'right'), does not affect single line text */ PIXI.BitmapText = function(text, style) { PIXI.DisplayObjectContainer.call(this); /** * [read-only] The width of the overall text, different from fontSize, * which is defined in the style object * * @property textWidth * @type Number * @readOnly */ this.textWidth = 0; /** * [read-only] The height of the overall text, different from fontSize, * which is defined in the style object * * @property textHeight * @type Number * @readOnly */ this.textHeight = 0; /** * @property _pool * @type Array * @private */ this._pool = []; this.setText(text); this.setStyle(style); this.updateText(); /** * The dirty state of this object. * @property dirty * @type Boolean */ this.dirty = false; }; // constructor PIXI.BitmapText.prototype = Object.create(PIXI.DisplayObjectContainer.prototype); PIXI.BitmapText.prototype.constructor = PIXI.BitmapText; /** * Set the text string to be rendered. * * @method setText * @param text {String} The text that you would like displayed */ PIXI.BitmapText.prototype.setText = function(text) { this.text = text || ' '; this.dirty = true; }; /** * Set the style of the text * style.font {String} The size (optional) and bitmap font id (required) eq 'Arial' or '20px Arial' (must have loaded previously) * [style.align='left'] {String} Alignment for multiline text ('left', 'center' or 'right'), does not affect single lines of text * * @method setStyle * @param style {Object} The style parameters, contained as properties of an object */ PIXI.BitmapText.prototype.setStyle = function(style) { style = style || {}; style.align = style.align || 'left'; this.style = style; var font = style.font.split(' '); this.fontName = font[font.length - 1]; this.fontSize = font.length >= 2 ? parseInt(font[font.length - 2], 10) : PIXI.BitmapText.fonts[this.fontName].size; this.dirty = true; this.tint = style.tint; }; /** * Renders text and updates it when needed * * @method updateText * @private */ PIXI.BitmapText.prototype.updateText = function() { var data = PIXI.BitmapText.fonts[this.fontName]; var pos = new PIXI.Point(); var prevCharCode = null; var chars = []; var maxLineWidth = 0; var lineWidths = []; var line = 0; var scale = this.fontSize / data.size; for(var i = 0; i < this.text.length; i++) { var charCode = this.text.charCodeAt(i); if(/(?:\r\n|\r|\n)/.test(this.text.charAt(i))) { lineWidths.push(pos.x); maxLineWidth = Math.max(maxLineWidth, pos.x); line++; pos.x = 0; pos.y += data.lineHeight; prevCharCode = null; continue; } var charData = data.chars[charCode]; if(!charData) continue; if(prevCharCode && charData.kerning[prevCharCode]) { pos.x += charData.kerning[prevCharCode]; } chars.push({texture:charData.texture, line: line, charCode: charCode, position: new PIXI.Point(pos.x + charData.xOffset, pos.y + charData.yOffset)}); pos.x += charData.xAdvance; prevCharCode = charCode; } lineWidths.push(pos.x); maxLineWidth = Math.max(maxLineWidth, pos.x); var lineAlignOffsets = []; for(i = 0; i <= line; i++) { var alignOffset = 0; if(this.style.align === 'right') { alignOffset = maxLineWidth - lineWidths[i]; } else if(this.style.align === 'center') { alignOffset = (maxLineWidth - lineWidths[i]) / 2; } lineAlignOffsets.push(alignOffset); } var lenChildren = this.children.length; var lenChars = chars.length; var tint = this.tint || 0xFFFFFF; for(i = 0; i < lenChars; i++) { var c = i < lenChildren ? this.children[i] : this._pool.pop(); // get old child if have. if not - take from pool. if (c) c.setTexture(chars[i].texture); // check if got one before. else c = new PIXI.Sprite(chars[i].texture); // if no create new one. c.position.x = (chars[i].position.x + lineAlignOffsets[chars[i].line]) * scale; c.position.y = chars[i].position.y * scale; c.scale.x = c.scale.y = scale; c.tint = tint; if (!c.parent) this.addChild(c); } // remove unnecessary children. // and put their into the pool. while(this.children.length > lenChars) { var child = this.getChildAt(this.children.length - 1); this._pool.push(child); this.removeChild(child); } this.textWidth = maxLineWidth * scale; this.textHeight = (pos.y + data.lineHeight) * scale; }; /** * Updates the transform of this object * * @method updateTransform * @private */ PIXI.BitmapText.prototype.updateTransform = function() { if(this.dirty) { this.updateText(); this.dirty = false; } PIXI.DisplayObjectContainer.prototype.updateTransform.call(this); }; PIXI.BitmapText.fonts = {}; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * Holds all information related to an Interaction event * * @class InteractionData * @constructor */ PIXI.InteractionData = function() { /** * This point stores the global coords of where the touch/mouse event happened * * @property global * @type Point */ this.global = new PIXI.Point(); /** * The target Sprite that was interacted with * * @property target * @type Sprite */ this.target = null; /** * When passed to an event handler, this will be the original DOM Event that was captured * * @property originalEvent * @type Event */ this.originalEvent = null; }; /** * This will return the local coordinates of the specified displayObject for this InteractionData * * @method getLocalPosition * @param displayObject {DisplayObject} The DisplayObject that you would like the local coords off * @param [point] {Point} A Point object in which to store the value, optional (otherwise will create a new point) * param [globalPos] {Point} A Point object containing your custom global coords, optional (otherwise will use the current global coords) * @return {Point} A point containing the coordinates of the InteractionData position relative to the DisplayObject */ PIXI.InteractionData.prototype.getLocalPosition = function(displayObject, point, globalPos) { var worldTransform = displayObject.worldTransform; var global = globalPos ? globalPos : this.global; // do a cheeky transform to get the mouse coords; var a00 = worldTransform.a, a01 = worldTransform.c, a02 = worldTransform.tx, a10 = worldTransform.b, a11 = worldTransform.d, a12 = worldTransform.ty, id = 1 / (a00 * a11 + a01 * -a10); point = point || new PIXI.Point(); point.x = a11 * id * global.x + -a01 * id * global.y + (a12 * a01 - a02 * a11) * id; point.y = a00 * id * global.y + -a10 * id * global.x + (-a12 * a00 + a02 * a10) * id; // set the mouse coords... return point; }; // constructor PIXI.InteractionData.prototype.constructor = PIXI.InteractionData; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive * if its interactive parameter is set to true * This manager also supports multitouch. * * @class InteractionManager * @constructor * @param stage {Stage} The stage to handle interactions */ PIXI.InteractionManager = function(stage) { /** * A reference to the stage * * @property stage * @type Stage */ this.stage = stage; /** * The mouse data * * @property mouse * @type InteractionData */ this.mouse = new PIXI.InteractionData(); /** * An object that stores current touches (InteractionData) by id reference * * @property touches * @type Object */ this.touches = {}; /** * @property tempPoint * @type Point * @private */ this.tempPoint = new PIXI.Point(); /** * @property mouseoverEnabled * @type Boolean * @default */ this.mouseoverEnabled = true; /** * Tiny little interactiveData pool ! * * @property pool * @type Array */ this.pool = []; /** * An array containing all the iterative items from the our interactive tree * @property interactiveItems * @type Array * @private */ this.interactiveItems = []; /** * Our canvas * @property interactionDOMElement * @type HTMLCanvasElement * @private */ this.interactionDOMElement = null; //this will make it so that you don't have to call bind all the time /** * @property onMouseMove * @type Function */ this.onMouseMove = this.onMouseMove.bind( this ); /** * @property onMouseDown * @type Function */ this.onMouseDown = this.onMouseDown.bind(this); /** * @property onMouseOut * @type Function */ this.onMouseOut = this.onMouseOut.bind(this); /** * @property onMouseUp * @type Function */ this.onMouseUp = this.onMouseUp.bind(this); /** * @property onTouchStart * @type Function */ this.onTouchStart = this.onTouchStart.bind(this); /** * @property onTouchEnd * @type Function */ this.onTouchEnd = this.onTouchEnd.bind(this); /** * @property onTouchCancel * @type Function */ this.onTouchCancel = this.onTouchCancel.bind(this); /** * @property onTouchMove * @type Function */ this.onTouchMove = this.onTouchMove.bind(this); /** * @property last * @type Number */ this.last = 0; /** * The css style of the cursor that is being used * @property currentCursorStyle * @type String */ this.currentCursorStyle = 'inherit'; /** * Is set to true when the mouse is moved out of the canvas * @property mouseOut * @type Boolean */ this.mouseOut = false; /** * @property resolution * @type Number */ this.resolution = 1; // used for hit testing this._tempPoint = new PIXI.Point(); }; // constructor PIXI.InteractionManager.prototype.constructor = PIXI.InteractionManager; /** * Collects an interactive sprite recursively to have their interactions managed * * @method collectInteractiveSprite * @param displayObject {DisplayObject} the displayObject to collect * @param iParent {DisplayObject} the display object's parent * @private */ PIXI.InteractionManager.prototype.collectInteractiveSprite = function(displayObject, iParent) { var children = displayObject.children; var length = children.length; // make an interaction tree... {item.__interactiveParent} for (var i = length - 1; i >= 0; i--) { var child = children[i]; // push all interactive bits if (child._interactive) { iParent.interactiveChildren = true; //child.__iParent = iParent; this.interactiveItems.push(child); if (child.children.length > 0) { this.collectInteractiveSprite(child, child); } } else { child.__iParent = null; if (child.children.length > 0) { this.collectInteractiveSprite(child, iParent); } } } }; /** * Sets the target for event delegation * * @method setTarget * @param target {WebGLRenderer|CanvasRenderer} the renderer to bind events to * @private */ PIXI.InteractionManager.prototype.setTarget = function(target) { this.target = target; this.resolution = target.resolution; // Check if the dom element has been set. If it has don't do anything. if (this.interactionDOMElement !== null) return; this.setTargetDomElement (target.view); }; /** * Sets the DOM element which will receive mouse/touch events. This is useful for when you have other DOM * elements on top of the renderers Canvas element. With this you'll be able to delegate another DOM element * to receive those events * * @method setTargetDomElement * @param domElement {DOMElement} the DOM element which will receive mouse and touch events * @private */ PIXI.InteractionManager.prototype.setTargetDomElement = function(domElement) { this.removeEvents(); if (window.navigator.msPointerEnabled) { // time to remove some of that zoom in ja.. domElement.style['-ms-content-zooming'] = 'none'; domElement.style['-ms-touch-action'] = 'none'; } this.interactionDOMElement = domElement; domElement.addEventListener('mousemove', this.onMouseMove, true); domElement.addEventListener('mousedown', this.onMouseDown, true); domElement.addEventListener('mouseout', this.onMouseOut, true); // aint no multi touch just yet! domElement.addEventListener('touchstart', this.onTouchStart, true); domElement.addEventListener('touchend', this.onTouchEnd, true); domElement.addEventListener('touchleave', this.onTouchCancel, true); domElement.addEventListener('touchcancel', this.onTouchCancel, true); domElement.addEventListener('touchmove', this.onTouchMove, true); window.addEventListener('mouseup', this.onMouseUp, true); }; /** * @method removeEvents * @private */ PIXI.InteractionManager.prototype.removeEvents = function() { if (!this.interactionDOMElement) return; this.interactionDOMElement.style['-ms-content-zooming'] = ''; this.interactionDOMElement.style['-ms-touch-action'] = ''; this.interactionDOMElement.removeEventListener('mousemove', this.onMouseMove, true); this.interactionDOMElement.removeEventListener('mousedown', this.onMouseDown, true); this.interactionDOMElement.removeEventListener('mouseout', this.onMouseOut, true); // aint no multi touch just yet! this.interactionDOMElement.removeEventListener('touchstart', this.onTouchStart, true); this.interactionDOMElement.removeEventListener('touchend', this.onTouchEnd, true); this.interactionDOMElement.removeEventListener('touchleave', this.onTouchCancel, true); this.interactionDOMElement.removeEventListener('touchcancel', this.onTouchCancel, true); this.interactionDOMElement.removeEventListener('touchmove', this.onTouchMove, true); this.interactionDOMElement = null; window.removeEventListener('mouseup', this.onMouseUp, true); }; /** * updates the state of interactive objects * * @method update * @private */ PIXI.InteractionManager.prototype.update = function() { if (!this.target) return; // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; diff = (diff * PIXI.INTERACTION_FREQUENCY ) / 1000; if (diff < 1) return; this.last = now; var i = 0; // ok.. so mouse events?? // yes for now // OPTIMISE - how often to check?? if (this.dirty) { this.rebuildInteractiveGraph(); } // loop through interactive objects! var length = this.interactiveItems.length; var cursor = 'inherit'; var over = false; for (i = 0; i < length; i++) { var item = this.interactiveItems[i]; // OPTIMISATION - only calculate every time if the mousemove function exists.. // OK so.. does the object have any other interactive functions? // hit-test the clip! // if (item.mouseover || item.mouseout || item.buttonMode) // { // ok so there are some functions so lets hit test it.. item.__hit = this.hitTest(item, this.mouse); this.mouse.target = item; // ok so deal with interactions.. // looks like there was a hit! if (item.__hit && !over) { if (item.buttonMode) cursor = item.defaultCursor; if (!item.interactiveChildren) { over = true; } if (!item.__isOver) { if (item.mouseover) { item.mouseover (this.mouse); } item.__isOver = true; } } else { if (item.__isOver) { // roll out! if (item.mouseout) { item.mouseout (this.mouse); } item.__isOver = false; } } } if (this.currentCursorStyle !== cursor) { this.currentCursorStyle = cursor; this.interactionDOMElement.style.cursor = cursor; } }; /** * @method rebuildInteractiveGraph * @private */ PIXI.InteractionManager.prototype.rebuildInteractiveGraph = function() { this.dirty = false; var len = this.interactiveItems.length; for (var i = 0; i < len; i++) { this.interactiveItems[i].interactiveChildren = false; } this.interactiveItems = []; if (this.stage.interactive) { this.interactiveItems.push(this.stage); } // Go through and collect all the objects that are interactive.. this.collectInteractiveSprite(this.stage, this.stage); }; /** * Is called when the mouse moves across the renderer element * * @method onMouseMove * @param event {Event} The DOM event of the mouse moving * @private */ PIXI.InteractionManager.prototype.onMouseMove = function(event) { if (this.dirty) { this.rebuildInteractiveGraph(); } this.mouse.originalEvent = event; // TODO optimize by not check EVERY TIME! maybe half as often? // var rect = this.interactionDOMElement.getBoundingClientRect(); this.mouse.global.x = (event.clientX - rect.left) * (this.target.width / rect.width) / this.resolution; this.mouse.global.y = (event.clientY - rect.top) * ( this.target.height / rect.height) / this.resolution; var length = this.interactiveItems.length; for (var i = 0; i < length; i++) { var item = this.interactiveItems[i]; // Call the function! if (item.mousemove) { item.mousemove(this.mouse); } } }; /** * Is called when the mouse button is pressed down on the renderer element * * @method onMouseDown * @param event {Event} The DOM event of a mouse button being pressed down * @private */ PIXI.InteractionManager.prototype.onMouseDown = function(event) { if (this.dirty) { this.rebuildInteractiveGraph(); } this.mouse.originalEvent = event; if (PIXI.AUTO_PREVENT_DEFAULT) { this.mouse.originalEvent.preventDefault(); } // loop through interaction tree... // hit test each item! -> // get interactive items under point?? //stage.__i var length = this.interactiveItems.length; var e = this.mouse.originalEvent; var isRightButton = e.button === 2 || e.which === 3; var downFunction = isRightButton ? 'rightdown' : 'mousedown'; var clickFunction = isRightButton ? 'rightclick' : 'click'; var buttonIsDown = isRightButton ? '__rightIsDown' : '__mouseIsDown'; var isDown = isRightButton ? '__isRightDown' : '__isDown'; // while // hit test for (var i = 0; i < length; i++) { var item = this.interactiveItems[i]; if (item[downFunction] || item[clickFunction]) { item[buttonIsDown] = true; item.__hit = this.hitTest(item, this.mouse); if (item.__hit) { //call the function! if (item[downFunction]) { item[downFunction](this.mouse); } item[isDown] = true; // just the one! if (!item.interactiveChildren) break; } } } }; /** * Is called when the mouse is moved out of the renderer element * * @method onMouseOut * @param event {Event} The DOM event of a mouse being moved out * @private */ PIXI.InteractionManager.prototype.onMouseOut = function(event) { if (this.dirty) { this.rebuildInteractiveGraph(); } this.mouse.originalEvent = event; var length = this.interactiveItems.length; this.interactionDOMElement.style.cursor = 'inherit'; for (var i = 0; i < length; i++) { var item = this.interactiveItems[i]; if (item.__isOver) { this.mouse.target = item; if (item.mouseout) { item.mouseout(this.mouse); } item.__isOver = false; } } this.mouseOut = true; // move the mouse to an impossible position this.mouse.global.x = -10000; this.mouse.global.y = -10000; }; /** * Is called when the mouse button is released on the renderer element * * @method onMouseUp * @param event {Event} The DOM event of a mouse button being released * @private */ PIXI.InteractionManager.prototype.onMouseUp = function(event) { if (this.dirty) { this.rebuildInteractiveGraph(); } this.mouse.originalEvent = event; var length = this.interactiveItems.length; var up = false; var e = this.mouse.originalEvent; var isRightButton = e.button === 2 || e.which === 3; var upFunction = isRightButton ? 'rightup' : 'mouseup'; var clickFunction = isRightButton ? 'rightclick' : 'click'; var upOutsideFunction = isRightButton ? 'rightupoutside' : 'mouseupoutside'; var isDown = isRightButton ? '__isRightDown' : '__isDown'; for (var i = 0; i < length; i++) { var item = this.interactiveItems[i]; if (item[clickFunction] || item[upFunction] || item[upOutsideFunction]) { item.__hit = this.hitTest(item, this.mouse); if (item.__hit && !up) { //call the function! if (item[upFunction]) { item[upFunction](this.mouse); } if (item[isDown]) { if (item[clickFunction]) { item[clickFunction](this.mouse); } } if (!item.interactiveChildren) { up = true; } } else { if (item[isDown]) { if (item[upOutsideFunction]) item[upOutsideFunction](this.mouse); } } item[isDown] = false; } } }; /** * Tests if the current mouse coordinates hit a sprite * * @method hitTest * @param item {DisplayObject} The displayObject to test for a hit * @param interactionData {InteractionData} The interactionData object to update in the case there is a hit * @private */ PIXI.InteractionManager.prototype.hitTest = function(item, interactionData) { var global = interactionData.global; if (!item.worldVisible) { return false; } // map the global point to local space. item.worldTransform.applyInverse(global, this._tempPoint); var x = this._tempPoint.x, y = this._tempPoint.y, i; interactionData.target = item; //a sprite or display object with a hit area defined if (item.hitArea && item.hitArea.contains) { return item.hitArea.contains(x, y); } // a sprite with no hitarea defined else if(item instanceof PIXI.Sprite) { var width = item.texture.frame.width; var height = item.texture.frame.height; var x1 = -width * item.anchor.x; var y1; if (x > x1 && x < x1 + width) { y1 = -height * item.anchor.y; if (y > y1 && y < y1 + height) { // set the target property if a hit is true! return true; } } } else if(item instanceof PIXI.Graphics) { var graphicsData = item.graphicsData; for (i = 0; i < graphicsData.length; i++) { var data = graphicsData[i]; if(!data.fill)continue; // only deal with fills.. if(data.shape) { if(data.shape.contains(x, y)) { //interactionData.target = item; return true; } } } } var length = item.children.length; for (i = 0; i < length; i++) { var tempItem = item.children[i]; var hit = this.hitTest(tempItem, interactionData); if (hit) { // hmm.. TODO SET CORRECT TARGET? interactionData.target = item; return true; } } return false; }; /** * Is called when a touch is moved across the renderer element * * @method onTouchMove * @param event {Event} The DOM event of a touch moving across the renderer view * @private */ PIXI.InteractionManager.prototype.onTouchMove = function(event) { if (this.dirty) { this.rebuildInteractiveGraph(); } var rect = this.interactionDOMElement.getBoundingClientRect(); var changedTouches = event.changedTouches; var touchData; var cLength = changedTouches.length; var wCalc = (this.target.width / rect.width); var hCalc = (this.target.height / rect.height); var isSupportCocoonJS = navigator.isCocoonJS && !rect.left && !rect.top && !event.target.style.width && !event.target.style.height; var touchEvent; for (var c = 0; c < cLength; c++) { touchEvent = changedTouches[c]; if(!isSupportCocoonJS) { touchEvent.globalX = ( (touchEvent.clientX - rect.left) * wCalc ) / this.resolution; touchEvent.globalY = ( (touchEvent.clientY - rect.top) * hCalc ) / this.resolution; } else { touchEvent.globalX = touchEvent.clientX; touchEvent.globalY = touchEvent.clientY; } } for (var i = 0; i < cLength; i++) { touchEvent = changedTouches[i]; touchData = this.touches[touchEvent.identifier]; touchData.originalEvent = event; // update the touch position if (!isSupportCocoonJS) { touchEvent.globalX = touchData.global.x = ( (touchEvent.clientX - rect.left) * wCalc ) / this.resolution; touchEvent.globalY = touchData.global.y = ( (touchEvent.clientY - rect.top) * hCalc ) / this.resolution; } else { //Support for CocoonJS fullscreen scale modes touchData.global.x = touchEvent.clientX; touchData.global.y = touchEvent.clientY; } for (var j = 0; j < this.interactiveItems.length; j++) { var item = this.interactiveItems[j]; if (item.touchmove && item.__touchData && item.__touchData[touchEvent.identifier]) { item.touchmove(touchData); } } } }; /** * Is called when a touch is started on the renderer element * * @method onTouchStart * @param event {Event} The DOM event of a touch starting on the renderer view * @private */ PIXI.InteractionManager.prototype.onTouchStart = function(event) { if (this.dirty) { this.rebuildInteractiveGraph(); } var rect = this.interactionDOMElement.getBoundingClientRect(); if (PIXI.AUTO_PREVENT_DEFAULT) { event.preventDefault(); } var changedTouches = event.changedTouches; var cLength = changedTouches.length; var wCalc = (this.target.width / rect.width); var hCalc = (this.target.height / rect.height); var isSupportCocoonJS = navigator.isCocoonJS && !rect.left && !rect.top && !event.target.style.width && !event.target.style.height; var touchEvent; for (var c = 0; c < cLength; c++) { touchEvent = changedTouches[c]; if(!isSupportCocoonJS) { touchEvent.globalX = ( (touchEvent.clientX - rect.left) * wCalc ) / this.resolution; touchEvent.globalY = ( (touchEvent.clientY - rect.top) * hCalc ) / this.resolution; } else { touchEvent.globalX = touchEvent.clientX; touchEvent.globalY = touchEvent.clientY; } } for (var i=0; i < cLength; i++) { touchEvent = changedTouches[i]; var touchData = this.pool.pop(); if (!touchData) { touchData = new PIXI.InteractionData(); } touchData.originalEvent = event; this.touches[touchEvent.identifier] = touchData; if (!isSupportCocoonJS) { touchData.global.x = ( (touchEvent.clientX - rect.left) * wCalc ) / this.resolution; touchData.global.y = ( (touchEvent.clientY - rect.top) * hCalc ) / this.resolution; } else { //Support for CocoonJS fullscreen scale modes touchData.global.x = touchEvent.clientX; touchData.global.y = touchEvent.clientY; } var length = this.interactiveItems.length; for (var j = 0; j < length; j++) { var item = this.interactiveItems[j]; if (item.touchstart || item.tap) { item.__hit = this.hitTest(item, touchData); if (item.__hit) { //call the function! if (item.touchstart)item.touchstart(touchData); item.__isDown = true; item.__touchData = item.__touchData || {}; item.__touchData[touchEvent.identifier] = touchData; if (!item.interactiveChildren) break; } } } } }; /** * Is called when a touch is ended on the renderer element * * @method onTouchEnd * @param event {Event} The DOM event of a touch ending on the renderer view * @private */ PIXI.InteractionManager.prototype.onTouchEnd = function(event) { if (this.dirty) { this.rebuildInteractiveGraph(); } var rect = this.interactionDOMElement.getBoundingClientRect(); var changedTouches = event.changedTouches; var cLength = changedTouches.length; var wCalc = (this.target.width / rect.width); var hCalc = (this.target.height / rect.height); var isSupportCocoonJS = navigator.isCocoonJS && !rect.left && !rect.top && !event.target.style.width && !event.target.style.height; var touchEvent; for (var c = 0; c < cLength; c++) { touchEvent = changedTouches[c]; if(!isSupportCocoonJS) { touchEvent.globalX = ( (touchEvent.clientX - rect.left) * wCalc ) / this.resolution; touchEvent.globalY = ( (touchEvent.clientY - rect.top) * hCalc ) / this.resolution; } else { touchEvent.globalX = touchEvent.clientX; touchEvent.globalY = touchEvent.clientY; } } for (var i=0; i < cLength; i++) { touchEvent = changedTouches[i]; var touchData = this.touches[touchEvent.identifier]; var up = false; if (!isSupportCocoonJS) { touchData.global.x = ( (touchEvent.clientX - rect.left) * wCalc ) / this.resolution; touchData.global.y = ( (touchEvent.clientY - rect.top) * hCalc ) / this.resolution; } else { //Support for CocoonJS fullscreen scale modes touchData.global.x = touchEvent.clientX; touchData.global.y = touchEvent.clientY; } var length = this.interactiveItems.length; for (var j = 0; j < length; j++) { var item = this.interactiveItems[j]; if (item.__touchData && item.__touchData[touchEvent.identifier]) { item.__hit = this.hitTest(item, item.__touchData[touchEvent.identifier]); // so this one WAS down... touchData.originalEvent = event; // hitTest?? if (item.touchend || item.tap) { if (item.__hit && !up) { if (item.touchend) { item.touchend(touchData); } if (item.__isDown && item.tap) { item.tap(touchData); } if (!item.interactiveChildren) { up = true; } } else { if (item.__isDown && item.touchendoutside) { item.touchendoutside(touchData); } } item.__isDown = false; } item.__touchData[touchEvent.identifier] = null; } } // remove the touch.. this.pool.push(touchData); this.touches[touchEvent.identifier] = null; } }; /** * Is called when a touch is canceled * * @method onTouchCancel * @param event {Event} The DOM event of a touch canceled * @private */ PIXI.InteractionManager.prototype.onTouchCancel = function(event) { if (this.dirty) { this.rebuildInteractiveGraph(); } var rect = this.interactionDOMElement.getBoundingClientRect(); var changedTouches = event.changedTouches; var cLength = changedTouches.length; var wCalc = (this.target.width / rect.width); var hCalc = (this.target.height / rect.height); var isSupportCocoonJS = navigator.isCocoonJS && !rect.left && !rect.top && !event.target.style.width && !event.target.style.height; var touchEvent; for (var c = 0; c < cLength; c++) { touchEvent = changedTouches[c]; if(!isSupportCocoonJS) { touchEvent.globalX = ( (touchEvent.clientX - rect.left) * wCalc ) / this.resolution; touchEvent.globalY = ( (touchEvent.clientY - rect.top) * hCalc ) / this.resolution; } else { touchEvent.globalX = touchEvent.clientX; touchEvent.globalY = touchEvent.clientY; } } for (var i=0; i < cLength; i++) { touchEvent = changedTouches[i]; var touchData = this.touches[touchEvent.identifier]; var up = false; if (!isSupportCocoonJS) { touchData.global.x = ( (touchEvent.clientX - rect.left) * wCalc ) / this.resolution; touchData.global.y = ( (touchEvent.clientY - rect.top) * hCalc ) / this.resolution; } else { //Support for CocoonJS fullscreen scale modes touchData.global.x = touchEvent.clientX; touchData.global.y = touchEvent.clientY; } var length = this.interactiveItems.length; for (var j = 0; j < length; j++) { var item = this.interactiveItems[j]; if (item.__touchData && item.__touchData[touchEvent.identifier]) { item.__hit = this.hitTest(item, item.__touchData[touchEvent.identifier]); // so this one WAS down... touchData.originalEvent = event; // hitTest?? if (item.touchcancel && !up) { item.touchcancel(touchData); if (!item.interactiveChildren) { up = true; } } item.__isDown = false; item.__touchData[touchEvent.identifier] = null; } } // remove the touch.. this.pool.push(touchData); this.touches[touchEvent.identifier] = null; } }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * A Stage represents the root of the display tree. Everything connected to the stage is rendered * * @class Stage * @extends DisplayObjectContainer * @constructor * @param backgroundColor {Number} the background color of the stage, you have to pass this in is in hex format * like: 0xFFFFFF for white * * Creating a stage is a mandatory process when you use Pixi, which is as simple as this : * var stage = new PIXI.Stage(0xFFFFFF); * where the parameter given is the background colour of the stage, in hex * you will use this stage instance to add your sprites to it and therefore to the renderer * Here is how to add a sprite to the stage : * stage.addChild(sprite); */ PIXI.Stage = function(backgroundColor) { PIXI.DisplayObjectContainer.call( this ); /** * [read-only] Current transform of the object based on world (parent) factors * * @property worldTransform * @type Matrix * @readOnly * @private */ this.worldTransform = new PIXI.Matrix(); /** * Whether or not the stage is interactive * * @property interactive * @type Boolean */ this.interactive = true; /** * The interaction manage for this stage, manages all interactive activity on the stage * * @property interactionManager * @type InteractionManager */ this.interactionManager = new PIXI.InteractionManager(this); /** * Whether the stage is dirty and needs to have interactions updated * * @property dirty * @type Boolean * @private */ this.dirty = true; //the stage is its own stage this.stage = this; //optimize hit detection a bit this.stage.hitArea = new PIXI.Rectangle(0, 0, 100000, 100000); this.setBackgroundColor(backgroundColor); }; // constructor PIXI.Stage.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); PIXI.Stage.prototype.constructor = PIXI.Stage; /** * Sets another DOM element which can receive mouse/touch interactions instead of the default Canvas element. * This is useful for when you have other DOM elements on top of the Canvas element. * * @method setInteractionDelegate * @param domElement {DOMElement} This new domElement which will receive mouse/touch events */ PIXI.Stage.prototype.setInteractionDelegate = function(domElement) { this.interactionManager.setTargetDomElement( domElement ); }; /* * Updates the object transform for rendering * * @method updateTransform * @private */ PIXI.Stage.prototype.updateTransform = function() { this.worldAlpha = 1; for(var i=0,j=this.children.length; i<j; i++) { this.children[i].updateTransform(); } if(this.dirty) { this.dirty = false; // update interactive! this.interactionManager.dirty = true; } if(this.interactive)this.interactionManager.update(); }; /** * Sets the background color for the stage * * @method setBackgroundColor * @param backgroundColor {Number} the color of the background, easiest way to pass this in is in hex format * like: 0xFFFFFF for white */ PIXI.Stage.prototype.setBackgroundColor = function(backgroundColor) { this.backgroundColor = backgroundColor || 0x000000; this.backgroundColorSplit = PIXI.hex2rgb(this.backgroundColor); var hex = this.backgroundColor.toString(16); hex = '000000'.substr(0, 6 - hex.length) + hex; this.backgroundColorString = '#' + hex; }; /** * This will return the point containing global coordinates of the mouse. * * @method getMousePosition * @return {Point} A point containing the coordinates of the global InteractionData position. */ PIXI.Stage.prototype.getMousePosition = function() { return this.interactionManager.mouse.global; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating // requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel // MIT license /** * A polyfill for requestAnimationFrame * You can actually use both requestAnimationFrame and requestAnimFrame, * you will still benefit from the polyfill * * @method requestAnimationFrame */ /** * A polyfill for cancelAnimationFrame * * @method cancelAnimationFrame */ (function(window) { var lastTime = 0; var vendors = ['ms', 'moz', 'webkit', 'o']; for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame']; } if (!window.requestAnimationFrame) { window.requestAnimationFrame = function(callback) { var currTime = new Date().getTime(); var timeToCall = Math.max(0, 16 - (currTime - lastTime)); var id = window.setTimeout(function() { callback(currTime + timeToCall); }, timeToCall); lastTime = currTime + timeToCall; return id; }; } if (!window.cancelAnimationFrame) { window.cancelAnimationFrame = function(id) { clearTimeout(id); }; } window.requestAnimFrame = window.requestAnimationFrame; })(this); /** * Converts a hex color number to an [R, G, B] array * * @method hex2rgb * @param hex {Number} */ PIXI.hex2rgb = function(hex) { return [(hex >> 16 & 0xFF) / 255, ( hex >> 8 & 0xFF) / 255, (hex & 0xFF)/ 255]; }; /** * Converts a color as an [R, G, B] array to a hex number * * @method rgb2hex * @param rgb {Array} */ PIXI.rgb2hex = function(rgb) { return ((rgb[0]*255 << 16) + (rgb[1]*255 << 8) + rgb[2]*255); }; /** * A polyfill for Function.prototype.bind * * @method bind */ if (typeof Function.prototype.bind !== 'function') { Function.prototype.bind = (function () { return function (thisArg) { var target = this, i = arguments.length - 1, boundArgs = []; if (i > 0) { boundArgs.length = i; while (i--) boundArgs[i] = arguments[i + 1]; } if (typeof target !== 'function') throw new TypeError(); function bound() { var i = arguments.length, args = new Array(i); while (i--) args[i] = arguments[i]; args = boundArgs.concat(args); return target.apply(this instanceof bound ? this : thisArg, args); } bound.prototype = (function F(proto) { if (proto) F.prototype = proto; if (!(this instanceof F)) return new F(); })(target.prototype); return bound; }; })(); } /** * A wrapper for ajax requests to be handled cross browser * * @class AjaxRequest * @constructor */ PIXI.AjaxRequest = function() { var activexmodes = ['Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.3.0', 'Microsoft.XMLHTTP']; //activeX versions to check for in IE if (window.ActiveXObject) { //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken) for (var i=0; i<activexmodes.length; i++) { try{ return new window.ActiveXObject(activexmodes[i]); } catch(e) { //suppress error } } } else if (window.XMLHttpRequest) // if Mozilla, Safari etc { return new window.XMLHttpRequest(); } else { return false; } }; /* PIXI.packColorRGBA = function(r, g, b, a)//r, g, b, a) { // console.log(r, b, c, d) return (Math.floor((r)*63) << 18) | (Math.floor((g)*63) << 12) | (Math.floor((*63) << 6);// | (Math.floor((a)*63)) // i = i | (Math.floor((a)*63)); // return i; // var r = (i / 262144.0 ) / 64; // var g = (i / 4096.0)%64 / 64; // var b = (i / 64.0)%64 / 64; // var a = (i)%64 / 64; // console.log(r, g, b, a); // return i; }; */ /* PIXI.packColorRGB = function(r, g, b)//r, g, b, a) { return (Math.floor((r)*255) << 16) | (Math.floor((g)*255) << 8) | (Math.floor((*255)); }; PIXI.unpackColorRGB = function(r, g, b)//r, g, b, a) { return (Math.floor((r)*255) << 16) | (Math.floor((g)*255) << 8) | (Math.floor((*255)); }; */ /** * Checks whether the Canvas BlendModes are supported by the current browser * * @method canUseNewCanvasBlendModes * @return {Boolean} whether they are supported */ PIXI.canUseNewCanvasBlendModes = function() { if (typeof document === 'undefined') return false; var canvas = document.createElement('canvas'); canvas.width = 1; canvas.height = 1; var context = canvas.getContext('2d'); context.fillStyle = '#000'; context.fillRect(0,0,1,1); context.globalCompositeOperation = 'multiply'; context.fillStyle = '#fff'; context.fillRect(0,0,1,1); return context.getImageData(0,0,1,1).data[0] === 0; }; /** * Given a number, this function returns the closest number that is a power of two * this function is taken from Starling Framework as its pretty neat * * @method getNextPowerOfTwo * @param number {Number} * @return {Number} the closest number that is a power of two */ PIXI.getNextPowerOfTwo = function(number) { if (number > 0 && (number & (number - 1)) === 0) // see: http://goo.gl/D9kPj return number; else { var result = 1; while (result < number) result <<= 1; return result; } }; /** * checks if the given width and height make a power of two texture * @method isPowerOfTwo * @param width {Number} * @param height {Number} * @return {Boolean} */ PIXI.isPowerOfTwo = function(width, height) { return (width > 0 && (width & (width - 1)) === 0 && height > 0 && (height & (height - 1)) === 0); }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 * @author Chad Engler https://github.com/englercj @Rolnaaba */ /** * Originally based on https://github.com/mrdoob/eventtarget.js/ from mr Doob. * Currently takes inspiration from the nodejs EventEmitter, EventEmitter3, and smokesignals */ /** * Mixins event emitter functionality to a class * * @class EventTarget * @example * function MyEmitter() {} * * PIXI.EventTarget.mixin(MyEmitter.prototype); * * var em = new MyEmitter(); * em.emit('eventName', 'some data', 'some more data', {}, null, ...); */ PIXI.EventTarget = { /** * Backward compat from when this used to be a function */ call: function callCompat(obj) { if(obj) { obj = obj.prototype || obj; PIXI.EventTarget.mixin(obj); } }, /** * Mixes in the properties of the EventTarget prototype onto another object * * @method mixin * @param object {Object} The obj to mix into */ mixin: function mixin(obj) { /** * Return a list of assigned event listeners. * * @method listeners * @param eventName {String} The events that should be listed. * @return {Array} An array of listener functions */ obj.listeners = function listeners(eventName) { this._listeners = this._listeners || {}; return this._listeners[eventName] ? this._listeners[eventName].slice() : []; }; /** * Emit an event to all registered event listeners. * * @method emit * @alias dispatchEvent * @param eventName {String} The name of the event. * @return {Boolean} Indication if we've emitted an event. */ obj.emit = obj.dispatchEvent = function emit(eventName, data) { this._listeners = this._listeners || {}; //backwards compat with old method ".emit({ type: 'something' })" if(typeof eventName === 'object') { data = eventName; eventName = eventName.type; } //ensure we are using a real pixi event if(!data || data.__isEventObject !== true) { data = new PIXI.Event(this, eventName, data); } //iterate the listeners if(this._listeners && this._listeners[eventName]) { var listeners = this._listeners[eventName].slice(0), length = listeners.length, fn = listeners[0], i; for(i = 0; i < length; fn = listeners[++i]) { //call the event listener fn.call(this, data); //if "stopImmediatePropagation" is called, stop calling sibling events if(data.stoppedImmediate) { return this; } } //if "stopPropagation" is called then don't bubble the event if(data.stopped) { return this; } } //bubble this event up the scene graph if(this.parent && this.parent.emit) { this.parent.emit.call(this.parent, eventName, data); } return this; }; /** * Register a new EventListener for the given event. * * @method on * @alias addEventListener * @param eventName {String} Name of the event. * @param callback {Functon} fn Callback function. */ obj.on = obj.addEventListener = function on(eventName, fn) { this._listeners = this._listeners || {}; (this._listeners[eventName] = this._listeners[eventName] || []) .push(fn); return this; }; /** * Add an EventListener that's only called once. * * @method once * @param eventName {String} Name of the event. * @param callback {Function} Callback function. */ obj.once = function once(eventName, fn) { this._listeners = this._listeners || {}; var self = this; function onceHandlerWrapper() { fn.apply(self.off(eventName, onceHandlerWrapper), arguments); } onceHandlerWrapper._originalHandler = fn; return this.on(eventName, onceHandlerWrapper); }; /** * Remove event listeners. * * @method off * @alias removeEventListener * @param eventName {String} The event we want to remove. * @param callback {Function} The listener that we need to find. */ obj.off = obj.removeEventListener = function off(eventName, fn) { this._listeners = this._listeners || {}; if(!this._listeners[eventName]) return this; var list = this._listeners[eventName], i = fn ? list.length : 0; while(i-- > 0) { if(list[i] === fn || list[i]._originalHandler === fn) { list.splice(i, 1); } } if(list.length === 0) { delete this._listeners[eventName]; } return this; }; /** * Remove all listeners or only the listeners for the specified event. * * @method removeAllListeners * @param eventName {String} The event you want to remove all listeners for. */ obj.removeAllListeners = function removeAllListeners(eventName) { this._listeners = this._listeners || {}; if(!this._listeners[eventName]) return this; delete this._listeners[eventName]; return this; }; } }; /** * Creates an homogenous object for tracking events so users can know what to expect. * * @class Event * @extends Object * @constructor * @param target {Object} The target object that the event is called on * @param name {String} The string name of the event that was triggered * @param data {Object} Arbitrary event data to pass along */ PIXI.Event = function(target, name, data) { //for duck typing in the ".on()" function this.__isEventObject = true; /** * Tracks the state of bubbling propagation. Do not * set this directly, instead use `event.stopPropagation()` * * @property stopped * @type Boolean * @private * @readOnly */ this.stopped = false; /** * Tracks the state of sibling listener propagation. Do not * set this directly, instead use `event.stopImmediatePropagation()` * * @property stoppedImmediate * @type Boolean * @private * @readOnly */ this.stoppedImmediate = false; /** * The original target the event triggered on. * * @property target * @type Object * @readOnly */ this.target = target; /** * The string name of the event that this represents. * * @property type * @type String * @readOnly */ this.type = name; /** * The data that was passed in with this event. * * @property data * @type Object * @readOnly */ this.data = data; //backwards compat with older version of events this.content = data; /** * The timestamp when the event occurred. * * @property timeStamp * @type Number * @readOnly */ this.timeStamp = Date.now(); }; /** * Stops the propagation of events up the scene graph (prevents bubbling). * * @method stopPropagation */ PIXI.Event.prototype.stopPropagation = function stopPropagation() { this.stopped = true; }; /** * Stops the propagation of events to sibling listeners (no longer calls any listeners). * * @method stopImmediatePropagation */ PIXI.Event.prototype.stopImmediatePropagation = function stopImmediatePropagation() { this.stoppedImmediate = true; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * This helper function will automatically detect which renderer you should be using. * WebGL is the preferred renderer as it is a lot faster. If webGL is not supported by * the browser then this function will return a canvas renderer * * @method autoDetectRenderer * @for PIXI * @static * @param width=800 {Number} the width of the renderers view * @param height=600 {Number} the height of the renderers view * * @param [options] {Object} The optional renderer parameters * @param [options.view] {HTMLCanvasElement} the canvas to use as a view, optional * @param [options.transparent=false] {Boolean} If the render view is transparent, default false * @param [options.antialias=false] {Boolean} sets antialias (only applicable in chrome at the moment) * @param [options.preserveDrawingBuffer=false] {Boolean} enables drawing buffer preservation, enable this if you need to call toDataUrl on the webgl context * @param [options.resolution=1] {Number} the resolution of the renderer retina would be 2 * */ PIXI.autoDetectRenderer = function(width, height, options) { if(!width)width = 800; if(!height)height = 600; // BORROWED from Mr Doob (mrdoob.com) var webgl = ( function () { try { var canvas = document.createElement( 'canvas' ); return !! window.WebGLRenderingContext && ( canvas.getContext( 'webgl' ) || canvas.getContext( 'experimental-webgl' ) ); } catch( e ) { return false; } } )(); if( webgl ) { return new PIXI.WebGLRenderer(width, height, options); } return new PIXI.CanvasRenderer(width, height, options); }; /** * This helper function will automatically detect which renderer you should be using. * This function is very similar to the autoDetectRenderer function except that is will return a canvas renderer for android. * Even thought both android chrome supports webGL the canvas implementation perform better at the time of writing. * This function will likely change and update as webGL performance improves on these devices. * * @method autoDetectRecommendedRenderer * @for PIXI * @static * @param width=800 {Number} the width of the renderers view * @param height=600 {Number} the height of the renderers view * * @param [options] {Object} The optional renderer parameters * @param [options.view] {HTMLCanvasElement} the canvas to use as a view, optional * @param [options.transparent=false] {Boolean} If the render view is transparent, default false * @param [options.antialias=false] {Boolean} sets antialias (only applicable in chrome at the moment) * @param [options.preserveDrawingBuffer=false] {Boolean} enables drawing buffer preservation, enable this if you need to call toDataUrl on the webgl context * @param [options.resolution=1] {Number} the resolution of the renderer retina would be 2 * */ PIXI.autoDetectRecommendedRenderer = function(width, height, options) { if(!width)width = 800; if(!height)height = 600; // BORROWED from Mr Doob (mrdoob.com) var webgl = ( function () { try { var canvas = document.createElement( 'canvas' ); return !! window.WebGLRenderingContext && ( canvas.getContext( 'webgl' ) || canvas.getContext( 'experimental-webgl' ) ); } catch( e ) { return false; } } )(); var isAndroid = /Android/i.test(navigator.userAgent); if( webgl && !isAndroid) { return new PIXI.WebGLRenderer(width, height, options); } return new PIXI.CanvasRenderer(width, height, options); }; /* PolyK library url: http://polyk.ivank.net Released under MIT licence. Copyright (c) 2012 Ivan Kuckir Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. This is an amazing lib! Slightly modified by Mat Groves (matgroves.com); */ /** * Based on the Polyk library http://polyk.ivank.net released under MIT licence. * This is an amazing lib! * Slightly modified by Mat Groves (matgroves.com); * @class PolyK */ PIXI.PolyK = {}; /** * Triangulates shapes for webGL graphic fills. * * @method Triangulate */ PIXI.PolyK.Triangulate = function(p) { var sign = true; var n = p.length >> 1; if(n < 3) return []; var tgs = []; var avl = []; for(var i = 0; i < n; i++) avl.push(i); i = 0; var al = n; while(al > 3) { var i0 = avl[(i+0)%al]; var i1 = avl[(i+1)%al]; var i2 = avl[(i+2)%al]; var ax = p[2*i0], ay = p[2*i0+1]; var bx = p[2*i1], by = p[2*i1+1]; var cx = p[2*i2], cy = p[2*i2+1]; var earFound = false; if(PIXI.PolyK._convex(ax, ay, bx, by, cx, cy, sign)) { earFound = true; for(var j = 0; j < al; j++) { var vi = avl[j]; if(vi === i0 || vi === i1 || vi === i2) continue; if(PIXI.PolyK._PointInTriangle(p[2*vi], p[2*vi+1], ax, ay, bx, by, cx, cy)) { earFound = false; break; } } } if(earFound) { tgs.push(i0, i1, i2); avl.splice((i+1)%al, 1); al--; i = 0; } else if(i++ > 3*al) { // need to flip flip reverse it! // reset! if(sign) { tgs = []; avl = []; for(i = 0; i < n; i++) avl.push(i); i = 0; al = n; sign = false; } else { // window.console.log("PIXI Warning: shape too complex to fill"); return null; } } } tgs.push(avl[0], avl[1], avl[2]); return tgs; }; /** * Checks whether a point is within a triangle * * @method _PointInTriangle * @param px {Number} x coordinate of the point to test * @param py {Number} y coordinate of the point to test * @param ax {Number} x coordinate of the a point of the triangle * @param ay {Number} y coordinate of the a point of the triangle * @param bx {Number} x coordinate of the b point of the triangle * @param by {Number} y coordinate of the b point of the triangle * @param cx {Number} x coordinate of the c point of the triangle * @param cy {Number} y coordinate of the c point of the triangle * @private * @return {Boolean} */ PIXI.PolyK._PointInTriangle = function(px, py, ax, ay, bx, by, cx, cy) { var v0x = cx-ax; var v0y = cy-ay; var v1x = bx-ax; var v1y = by-ay; var v2x = px-ax; var v2y = py-ay; var dot00 = v0x*v0x+v0y*v0y; var dot01 = v0x*v1x+v0y*v1y; var dot02 = v0x*v2x+v0y*v2y; var dot11 = v1x*v1x+v1y*v1y; var dot12 = v1x*v2x+v1y*v2y; var invDenom = 1 / (dot00 * dot11 - dot01 * dot01); var u = (dot11 * dot02 - dot01 * dot12) * invDenom; var v = (dot00 * dot12 - dot01 * dot02) * invDenom; // Check if point is in triangle return (u >= 0) && (v >= 0) && (u + v < 1); }; /** * Checks whether a shape is convex * * @method _convex * @private * @return {Boolean} */ PIXI.PolyK._convex = function(ax, ay, bx, by, cx, cy, sign) { return ((ay-by)*(cx-bx) + (bx-ax)*(cy-by) >= 0) === sign; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * @method initDefaultShaders * @static * @private */ PIXI.initDefaultShaders = function() { }; /** * @method CompileVertexShader * @static * @param gl {WebGLContext} the current WebGL drawing context * @param shaderSrc {Array} * @return {Any} */ PIXI.CompileVertexShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.VERTEX_SHADER); }; /** * @method CompileFragmentShader * @static * @param gl {WebGLContext} the current WebGL drawing context * @param shaderSrc {Array} * @return {Any} */ PIXI.CompileFragmentShader = function(gl, shaderSrc) { return PIXI._CompileShader(gl, shaderSrc, gl.FRAGMENT_SHADER); }; /** * @method _CompileShader * @static * @private * @param gl {WebGLContext} the current WebGL drawing context * @param shaderSrc {Array} * @param shaderType {Number} * @return {Any} */ PIXI._CompileShader = function(gl, shaderSrc, shaderType) { var src = shaderSrc.join("\n"); var shader = gl.createShader(shaderType); gl.shaderSource(shader, src); gl.compileShader(shader); if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { window.console.log(gl.getShaderInfoLog(shader)); return null; } return shader; }; /** * @method compileProgram * @static * @param gl {WebGLContext} the current WebGL drawing context * @param vertexSrc {Array} * @param fragmentSrc {Array} * @return {Any} */ PIXI.compileProgram = function(gl, vertexSrc, fragmentSrc) { var fragmentShader = PIXI.CompileFragmentShader(gl, fragmentSrc); var vertexShader = PIXI.CompileVertexShader(gl, vertexSrc); var shaderProgram = gl.createProgram(); gl.attachShader(shaderProgram, vertexShader); gl.attachShader(shaderProgram, fragmentShader); gl.linkProgram(shaderProgram); if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) { window.console.log("Could not initialise shaders"); } return shaderProgram; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 * @author Richard Davey http://www.photonstorm.com @photonstorm */ /** * @class PixiShader * @constructor * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.PixiShader = function(gl) { /** * @property _UID * @type Number * @private */ this._UID = PIXI._UID++; /** * @property gl * @type WebGLContext */ this.gl = gl; /** * The WebGL program. * @property program * @type Any */ this.program = null; /** * The fragment shader. * @property fragmentSrc * @type Array */ this.fragmentSrc = [ 'precision lowp float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform sampler2D uSampler;', 'void main(void) {', ' gl_FragColor = texture2D(uSampler, vTextureCoord) * vColor ;', '}' ]; /** * A local texture counter for multi-texture shaders. * @property textureCount * @type Number */ this.textureCount = 0; /** * A local flag * @property firstRun * @type Boolean * @private */ this.firstRun = true; /** * A dirty flag * @property dirty * @type Boolean */ this.dirty = true; /** * Uniform attributes cache. * @property attributes * @type Array * @private */ this.attributes = []; this.init(); }; PIXI.PixiShader.prototype.constructor = PIXI.PixiShader; /** * Initialises the shader. * * @method init */ PIXI.PixiShader.prototype.init = function() { var gl = this.gl; var program = PIXI.compileProgram(gl, this.vertexSrc || PIXI.PixiShader.defaultVertexSrc, this.fragmentSrc); gl.useProgram(program); // get and store the uniforms for the shader this.uSampler = gl.getUniformLocation(program, 'uSampler'); this.projectionVector = gl.getUniformLocation(program, 'projectionVector'); this.offsetVector = gl.getUniformLocation(program, 'offsetVector'); this.dimensions = gl.getUniformLocation(program, 'dimensions'); // get and store the attributes this.aVertexPosition = gl.getAttribLocation(program, 'aVertexPosition'); this.aTextureCoord = gl.getAttribLocation(program, 'aTextureCoord'); this.colorAttribute = gl.getAttribLocation(program, 'aColor'); // Begin worst hack eva // // WHY??? ONLY on my chrome pixel the line above returns -1 when using filters? // maybe its something to do with the current state of the gl context. // I'm convinced this is a bug in the chrome browser as there is NO reason why this should be returning -1 especially as it only manifests on my chrome pixel // If theres any webGL people that know why could happen please help if(this.colorAttribute === -1) { this.colorAttribute = 2; } this.attributes = [this.aVertexPosition, this.aTextureCoord, this.colorAttribute]; // End worst hack eva // // add those custom shaders! for (var key in this.uniforms) { // get the uniform locations.. this.uniforms[key].uniformLocation = gl.getUniformLocation(program, key); } this.initUniforms(); this.program = program; }; /** * Initialises the shader uniform values. * * Uniforms are specified in the GLSL_ES Specification: http://www.khronos.org/registry/webgl/specs/latest/1.0/ * http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf * * @method initUniforms */ PIXI.PixiShader.prototype.initUniforms = function() { this.textureCount = 1; var gl = this.gl; var uniform; for (var key in this.uniforms) { uniform = this.uniforms[key]; var type = uniform.type; if (type === 'sampler2D') { uniform._init = false; if (uniform.value !== null) { this.initSampler2D(uniform); } } else if (type === 'mat2' || type === 'mat3' || type === 'mat4') { // These require special handling uniform.glMatrix = true; uniform.glValueLength = 1; if (type === 'mat2') { uniform.glFunc = gl.uniformMatrix2fv; } else if (type === 'mat3') { uniform.glFunc = gl.uniformMatrix3fv; } else if (type === 'mat4') { uniform.glFunc = gl.uniformMatrix4fv; } } else { // GL function reference uniform.glFunc = gl['uniform' + type]; if (type === '2f' || type === '2i') { uniform.glValueLength = 2; } else if (type === '3f' || type === '3i') { uniform.glValueLength = 3; } else if (type === '4f' || type === '4i') { uniform.glValueLength = 4; } else { uniform.glValueLength = 1; } } } }; /** * Initialises a Sampler2D uniform (which may only be available later on after initUniforms once the texture has loaded) * * @method initSampler2D */ PIXI.PixiShader.prototype.initSampler2D = function(uniform) { if (!uniform.value || !uniform.value.baseTexture || !uniform.value.baseTexture.hasLoaded) { return; } var gl = this.gl; gl.activeTexture(gl['TEXTURE' + this.textureCount]); gl.bindTexture(gl.TEXTURE_2D, uniform.value.baseTexture._glTextures[gl.id]); // Extended texture data if (uniform.textureData) { var data = uniform.textureData; // GLTexture = mag linear, min linear_mipmap_linear, wrap repeat + gl.generateMipmap(gl.TEXTURE_2D); // GLTextureLinear = mag/min linear, wrap clamp // GLTextureNearestRepeat = mag/min NEAREST, wrap repeat // GLTextureNearest = mag/min nearest, wrap clamp // AudioTexture = whatever + luminance + width 512, height 2, border 0 // KeyTexture = whatever + luminance + width 256, height 2, border 0 // magFilter can be: gl.LINEAR, gl.LINEAR_MIPMAP_LINEAR or gl.NEAREST // wrapS/T can be: gl.CLAMP_TO_EDGE or gl.REPEAT var magFilter = (data.magFilter) ? data.magFilter : gl.LINEAR; var minFilter = (data.minFilter) ? data.minFilter : gl.LINEAR; var wrapS = (data.wrapS) ? data.wrapS : gl.CLAMP_TO_EDGE; var wrapT = (data.wrapT) ? data.wrapT : gl.CLAMP_TO_EDGE; var format = (data.luminance) ? gl.LUMINANCE : gl.RGBA; if (data.repeat) { wrapS = gl.REPEAT; wrapT = gl.REPEAT; } gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, !!data.flipY); if (data.width) { var width = (data.width) ? data.width : 512; var height = (data.height) ? data.height : 2; var border = (data.border) ? data.border : 0; // void texImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, ArrayBufferView? pixels); gl.texImage2D(gl.TEXTURE_2D, 0, format, width, height, border, format, gl.UNSIGNED_BYTE, null); } else { // void texImage2D(GLenum target, GLint level, GLenum internalformat, GLenum format, GLenum type, ImageData? pixels); gl.texImage2D(gl.TEXTURE_2D, 0, format, gl.RGBA, gl.UNSIGNED_BYTE, uniform.value.baseTexture.source); } gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, magFilter); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, minFilter); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, wrapS); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, wrapT); } gl.uniform1i(uniform.uniformLocation, this.textureCount); uniform._init = true; this.textureCount++; }; /** * Updates the shader uniform values. * * @method syncUniforms */ PIXI.PixiShader.prototype.syncUniforms = function() { this.textureCount = 1; var uniform; var gl = this.gl; // This would probably be faster in an array and it would guarantee key order for (var key in this.uniforms) { uniform = this.uniforms[key]; if (uniform.glValueLength === 1) { if (uniform.glMatrix === true) { uniform.glFunc.call(gl, uniform.uniformLocation, uniform.transpose, uniform.value); } else { uniform.glFunc.call(gl, uniform.uniformLocation, uniform.value); } } else if (uniform.glValueLength === 2) { uniform.glFunc.call(gl, uniform.uniformLocation, uniform.value.x, uniform.value.y); } else if (uniform.glValueLength === 3) { uniform.glFunc.call(gl, uniform.uniformLocation, uniform.value.x, uniform.value.y, uniform.value.z); } else if (uniform.glValueLength === 4) { uniform.glFunc.call(gl, uniform.uniformLocation, uniform.value.x, uniform.value.y, uniform.value.z, uniform.value.w); } else if (uniform.type === 'sampler2D') { if (uniform._init) { gl.activeTexture(gl['TEXTURE' + this.textureCount]); if(uniform.value.baseTexture._dirty[gl.id]) { PIXI.instances[gl.id].updateTexture(uniform.value.baseTexture); } else { // bind the current texture gl.bindTexture(gl.TEXTURE_2D, uniform.value.baseTexture._glTextures[gl.id]); } // gl.bindTexture(gl.TEXTURE_2D, uniform.value.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture( uniform.value.baseTexture, gl)); gl.uniform1i(uniform.uniformLocation, this.textureCount); this.textureCount++; } else { this.initSampler2D(uniform); } } } }; /** * Destroys the shader. * * @method destroy */ PIXI.PixiShader.prototype.destroy = function() { this.gl.deleteProgram( this.program ); this.uniforms = null; this.gl = null; this.attributes = null; }; /** * The Default Vertex shader source. * * @property defaultVertexSrc * @type String */ PIXI.PixiShader.defaultVertexSrc = [ 'attribute vec2 aVertexPosition;', 'attribute vec2 aTextureCoord;', 'attribute vec4 aColor;', 'uniform vec2 projectionVector;', 'uniform vec2 offsetVector;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'const vec2 center = vec2(-1.0, 1.0);', 'void main(void) {', ' gl_Position = vec4( ((aVertexPosition + offsetVector) / projectionVector) + center , 0.0, 1.0);', ' vTextureCoord = aTextureCoord;', ' vColor = vec4(aColor.rgb * aColor.a, aColor.a);', '}' ]; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * @class PixiFastShader * @constructor * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.PixiFastShader = function(gl) { /** * @property _UID * @type Number * @private */ this._UID = PIXI._UID++; /** * @property gl * @type WebGLContext */ this.gl = gl; /** * The WebGL program. * @property program * @type Any */ this.program = null; /** * The fragment shader. * @property fragmentSrc * @type Array */ this.fragmentSrc = [ 'precision lowp float;', 'varying vec2 vTextureCoord;', 'varying float vColor;', 'uniform sampler2D uSampler;', 'void main(void) {', ' gl_FragColor = texture2D(uSampler, vTextureCoord) * vColor ;', '}' ]; /** * The vertex shader. * @property vertexSrc * @type Array */ this.vertexSrc = [ 'attribute vec2 aVertexPosition;', 'attribute vec2 aPositionCoord;', 'attribute vec2 aScale;', 'attribute float aRotation;', 'attribute vec2 aTextureCoord;', 'attribute float aColor;', 'uniform vec2 projectionVector;', 'uniform vec2 offsetVector;', 'uniform mat3 uMatrix;', 'varying vec2 vTextureCoord;', 'varying float vColor;', 'const vec2 center = vec2(-1.0, 1.0);', 'void main(void) {', ' vec2 v;', ' vec2 sv = aVertexPosition * aScale;', ' v.x = (sv.x) * cos(aRotation) - (sv.y) * sin(aRotation);', ' v.y = (sv.x) * sin(aRotation) + (sv.y) * cos(aRotation);', ' v = ( uMatrix * vec3(v + aPositionCoord , 1.0) ).xy ;', ' gl_Position = vec4( ( v / projectionVector) + center , 0.0, 1.0);', ' vTextureCoord = aTextureCoord;', // ' vec3 color = mod(vec3(aColor.y/65536.0, aColor.y/256.0, aColor.y), 256.0) / 256.0;', ' vColor = aColor;', '}' ]; /** * A local texture counter for multi-texture shaders. * @property textureCount * @type Number */ this.textureCount = 0; this.init(); }; PIXI.PixiFastShader.prototype.constructor = PIXI.PixiFastShader; /** * Initialises the shader. * * @method init */ PIXI.PixiFastShader.prototype.init = function() { var gl = this.gl; var program = PIXI.compileProgram(gl, this.vertexSrc, this.fragmentSrc); gl.useProgram(program); // get and store the uniforms for the shader this.uSampler = gl.getUniformLocation(program, 'uSampler'); this.projectionVector = gl.getUniformLocation(program, 'projectionVector'); this.offsetVector = gl.getUniformLocation(program, 'offsetVector'); this.dimensions = gl.getUniformLocation(program, 'dimensions'); this.uMatrix = gl.getUniformLocation(program, 'uMatrix'); // get and store the attributes this.aVertexPosition = gl.getAttribLocation(program, 'aVertexPosition'); this.aPositionCoord = gl.getAttribLocation(program, 'aPositionCoord'); this.aScale = gl.getAttribLocation(program, 'aScale'); this.aRotation = gl.getAttribLocation(program, 'aRotation'); this.aTextureCoord = gl.getAttribLocation(program, 'aTextureCoord'); this.colorAttribute = gl.getAttribLocation(program, 'aColor'); // Begin worst hack eva // // WHY??? ONLY on my chrome pixel the line above returns -1 when using filters? // maybe its somthing to do with the current state of the gl context. // Im convinced this is a bug in the chrome browser as there is NO reason why this should be returning -1 especially as it only manifests on my chrome pixel // If theres any webGL people that know why could happen please help if(this.colorAttribute === -1) { this.colorAttribute = 2; } this.attributes = [this.aVertexPosition, this.aPositionCoord, this.aScale, this.aRotation, this.aTextureCoord, this.colorAttribute]; // End worst hack eva // this.program = program; }; /** * Destroys the shader. * * @method destroy */ PIXI.PixiFastShader.prototype.destroy = function() { this.gl.deleteProgram( this.program ); this.uniforms = null; this.gl = null; this.attributes = null; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * @class StripShader * @constructor * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.StripShader = function(gl) { /** * @property _UID * @type Number * @private */ this._UID = PIXI._UID++; /** * @property gl * @type WebGLContext */ this.gl = gl; /** * The WebGL program. * @property program * @type Any */ this.program = null; /** * The fragment shader. * @property fragmentSrc * @type Array */ this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', // 'varying float vColor;', 'uniform float alpha;', 'uniform sampler2D uSampler;', 'void main(void) {', ' gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y)) * alpha;', // ' gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);',//gl_FragColor * alpha;', '}' ]; /** * The vertex shader. * @property vertexSrc * @type Array */ this.vertexSrc = [ 'attribute vec2 aVertexPosition;', 'attribute vec2 aTextureCoord;', 'uniform mat3 translationMatrix;', 'uniform vec2 projectionVector;', 'uniform vec2 offsetVector;', // 'uniform float alpha;', // 'uniform vec3 tint;', 'varying vec2 vTextureCoord;', // 'varying vec4 vColor;', 'void main(void) {', ' vec3 v = translationMatrix * vec3(aVertexPosition , 1.0);', ' v -= offsetVector.xyx;', ' gl_Position = vec4( v.x / projectionVector.x -1.0, v.y / -projectionVector.y + 1.0 , 0.0, 1.0);', ' vTextureCoord = aTextureCoord;', // ' vColor = aColor * vec4(tint * alpha, alpha);', '}' ]; this.init(); }; PIXI.StripShader.prototype.constructor = PIXI.StripShader; /** * Initialises the shader. * * @method init */ PIXI.StripShader.prototype.init = function() { var gl = this.gl; var program = PIXI.compileProgram(gl, this.vertexSrc, this.fragmentSrc); gl.useProgram(program); // get and store the uniforms for the shader this.uSampler = gl.getUniformLocation(program, 'uSampler'); this.projectionVector = gl.getUniformLocation(program, 'projectionVector'); this.offsetVector = gl.getUniformLocation(program, 'offsetVector'); this.colorAttribute = gl.getAttribLocation(program, 'aColor'); //this.dimensions = gl.getUniformLocation(this.program, 'dimensions'); // get and store the attributes this.aVertexPosition = gl.getAttribLocation(program, 'aVertexPosition'); this.aTextureCoord = gl.getAttribLocation(program, 'aTextureCoord'); this.attributes = [this.aVertexPosition, this.aTextureCoord]; this.translationMatrix = gl.getUniformLocation(program, 'translationMatrix'); this.alpha = gl.getUniformLocation(program, 'alpha'); this.program = program; }; /** * Destroys the shader. * * @method destroy */ PIXI.StripShader.prototype.destroy = function() { this.gl.deleteProgram( this.program ); this.uniforms = null; this.gl = null; this.attribute = null; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * @class PrimitiveShader * @constructor * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.PrimitiveShader = function(gl) { /** * @property _UID * @type Number * @private */ this._UID = PIXI._UID++; /** * @property gl * @type WebGLContext */ this.gl = gl; /** * The WebGL program. * @property program * @type Any */ this.program = null; /** * The fragment shader. * @property fragmentSrc * @type Array */ this.fragmentSrc = [ 'precision mediump float;', 'varying vec4 vColor;', 'void main(void) {', ' gl_FragColor = vColor;', '}' ]; /** * The vertex shader. * @property vertexSrc * @type Array */ this.vertexSrc = [ 'attribute vec2 aVertexPosition;', 'attribute vec4 aColor;', 'uniform mat3 translationMatrix;', 'uniform vec2 projectionVector;', 'uniform vec2 offsetVector;', 'uniform float alpha;', 'uniform float flipY;', 'uniform vec3 tint;', 'varying vec4 vColor;', 'void main(void) {', ' vec3 v = translationMatrix * vec3(aVertexPosition , 1.0);', ' v -= offsetVector.xyx;', ' gl_Position = vec4( v.x / projectionVector.x -1.0, (v.y / projectionVector.y * -flipY) + flipY , 0.0, 1.0);', ' vColor = aColor * vec4(tint * alpha, alpha);', '}' ]; this.init(); }; PIXI.PrimitiveShader.prototype.constructor = PIXI.PrimitiveShader; /** * Initialises the shader. * * @method init */ PIXI.PrimitiveShader.prototype.init = function() { var gl = this.gl; var program = PIXI.compileProgram(gl, this.vertexSrc, this.fragmentSrc); gl.useProgram(program); // get and store the uniforms for the shader this.projectionVector = gl.getUniformLocation(program, 'projectionVector'); this.offsetVector = gl.getUniformLocation(program, 'offsetVector'); this.tintColor = gl.getUniformLocation(program, 'tint'); this.flipY = gl.getUniformLocation(program, 'flipY'); // get and store the attributes this.aVertexPosition = gl.getAttribLocation(program, 'aVertexPosition'); this.colorAttribute = gl.getAttribLocation(program, 'aColor'); this.attributes = [this.aVertexPosition, this.colorAttribute]; this.translationMatrix = gl.getUniformLocation(program, 'translationMatrix'); this.alpha = gl.getUniformLocation(program, 'alpha'); this.program = program; }; /** * Destroys the shader. * * @method destroy */ PIXI.PrimitiveShader.prototype.destroy = function() { this.gl.deleteProgram( this.program ); this.uniforms = null; this.gl = null; this.attributes = null; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * @class ComplexPrimitiveShader * @constructor * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.ComplexPrimitiveShader = function(gl) { /** * @property _UID * @type Number * @private */ this._UID = PIXI._UID++; /** * @property gl * @type WebGLContext */ this.gl = gl; /** * The WebGL program. * @property program * @type Any */ this.program = null; /** * The fragment shader. * @property fragmentSrc * @type Array */ this.fragmentSrc = [ 'precision mediump float;', 'varying vec4 vColor;', 'void main(void) {', ' gl_FragColor = vColor;', '}' ]; /** * The vertex shader. * @property vertexSrc * @type Array */ this.vertexSrc = [ 'attribute vec2 aVertexPosition;', //'attribute vec4 aColor;', 'uniform mat3 translationMatrix;', 'uniform vec2 projectionVector;', 'uniform vec2 offsetVector;', 'uniform vec3 tint;', 'uniform float alpha;', 'uniform vec3 color;', 'uniform float flipY;', 'varying vec4 vColor;', 'void main(void) {', ' vec3 v = translationMatrix * vec3(aVertexPosition , 1.0);', ' v -= offsetVector.xyx;', ' gl_Position = vec4( v.x / projectionVector.x -1.0, (v.y / projectionVector.y * -flipY) + flipY , 0.0, 1.0);', ' vColor = vec4(color * alpha * tint, alpha);',//" * vec4(tint * alpha, alpha);', '}' ]; this.init(); }; PIXI.ComplexPrimitiveShader.prototype.constructor = PIXI.ComplexPrimitiveShader; /** * Initialises the shader. * * @method init */ PIXI.ComplexPrimitiveShader.prototype.init = function() { var gl = this.gl; var program = PIXI.compileProgram(gl, this.vertexSrc, this.fragmentSrc); gl.useProgram(program); // get and store the uniforms for the shader this.projectionVector = gl.getUniformLocation(program, 'projectionVector'); this.offsetVector = gl.getUniformLocation(program, 'offsetVector'); this.tintColor = gl.getUniformLocation(program, 'tint'); this.color = gl.getUniformLocation(program, 'color'); this.flipY = gl.getUniformLocation(program, 'flipY'); // get and store the attributes this.aVertexPosition = gl.getAttribLocation(program, 'aVertexPosition'); // this.colorAttribute = gl.getAttribLocation(program, 'aColor'); this.attributes = [this.aVertexPosition, this.colorAttribute]; this.translationMatrix = gl.getUniformLocation(program, 'translationMatrix'); this.alpha = gl.getUniformLocation(program, 'alpha'); this.program = program; }; /** * Destroys the shader. * * @method destroy */ PIXI.ComplexPrimitiveShader.prototype.destroy = function() { this.gl.deleteProgram( this.program ); this.uniforms = null; this.gl = null; this.attribute = null; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * A set of functions used by the webGL renderer to draw the primitive graphics data * * @class WebGLGraphics * @private * @static */ PIXI.WebGLGraphics = function() { }; /** * Renders the graphics object * * @static * @private * @method renderGraphics * @param graphics {Graphics} * @param renderSession {Object} */ PIXI.WebGLGraphics.renderGraphics = function(graphics, renderSession)//projection, offset) { var gl = renderSession.gl; var projection = renderSession.projection, offset = renderSession.offset, shader = renderSession.shaderManager.primitiveShader, webGLData; if(graphics.dirty) { PIXI.WebGLGraphics.updateGraphics(graphics, gl); } var webGL = graphics._webGL[gl.id]; // This could be speeded up for sure! for (var i = 0; i < webGL.data.length; i++) { if(webGL.data[i].mode === 1) { webGLData = webGL.data[i]; renderSession.stencilManager.pushStencil(graphics, webGLData, renderSession); // render quad.. gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_SHORT, ( webGLData.indices.length - 4 ) * 2 ); renderSession.stencilManager.popStencil(graphics, webGLData, renderSession); } else { webGLData = webGL.data[i]; renderSession.shaderManager.setShader( shader );//activatePrimitiveShader(); shader = renderSession.shaderManager.primitiveShader; gl.uniformMatrix3fv(shader.translationMatrix, false, graphics.worldTransform.toArray(true)); gl.uniform1f(shader.flipY, 1); gl.uniform2f(shader.projectionVector, projection.x, -projection.y); gl.uniform2f(shader.offsetVector, -offset.x, -offset.y); gl.uniform3fv(shader.tintColor, PIXI.hex2rgb(graphics.tint)); gl.uniform1f(shader.alpha, graphics.worldAlpha); gl.bindBuffer(gl.ARRAY_BUFFER, webGLData.buffer); gl.vertexAttribPointer(shader.aVertexPosition, 2, gl.FLOAT, false, 4 * 6, 0); gl.vertexAttribPointer(shader.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); // set the index buffer! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, webGLData.indexBuffer); gl.drawElements(gl.TRIANGLE_STRIP, webGLData.indices.length, gl.UNSIGNED_SHORT, 0 ); } } }; /** * Updates the graphics object * * @static * @private * @method updateGraphics * @param graphicsData {Graphics} The graphics object to update * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.WebGLGraphics.updateGraphics = function(graphics, gl) { // get the contexts graphics object var webGL = graphics._webGL[gl.id]; // if the graphics object does not exist in the webGL context time to create it! if(!webGL)webGL = graphics._webGL[gl.id] = {lastIndex:0, data:[], gl:gl}; // flag the graphics as not dirty as we are about to update it... graphics.dirty = false; var i; // if the user cleared the graphics object we will need to clear every object if(graphics.clearDirty) { graphics.clearDirty = false; // lop through and return all the webGLDatas to the object pool so than can be reused later on for (i = 0; i < webGL.data.length; i++) { var graphicsData = webGL.data[i]; graphicsData.reset(); PIXI.WebGLGraphics.graphicsDataPool.push( graphicsData ); } // clear the array and reset the index.. webGL.data = []; webGL.lastIndex = 0; } var webGLData; // loop through the graphics datas and construct each one.. // if the object is a complex fill then the new stencil buffer technique will be used // other wise graphics objects will be pushed into a batch.. for (i = webGL.lastIndex; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; if(data.type === PIXI.Graphics.POLY) { // need to add the points the the graphics object.. data.points = data.shape.points.slice(); if(data.shape.closed) { // close the poly if the value is true! if(data.points[0] !== data.points[data.points.length-2] || data.points[1] !== data.points[data.points.length-1]) { data.points.push(data.points[0], data.points[1]); } } // MAKE SURE WE HAVE THE CORRECT TYPE.. if(data.fill) { if(data.points.length >= 6) { if(data.points.length < 6 * 2) { webGLData = PIXI.WebGLGraphics.switchMode(webGL, 0); var canDrawUsingSimple = PIXI.WebGLGraphics.buildPoly(data, webGLData); // console.log(canDrawUsingSimple); if(!canDrawUsingSimple) { // console.log("<>>>") webGLData = PIXI.WebGLGraphics.switchMode(webGL, 1); PIXI.WebGLGraphics.buildComplexPoly(data, webGLData); } } else { webGLData = PIXI.WebGLGraphics.switchMode(webGL, 1); PIXI.WebGLGraphics.buildComplexPoly(data, webGLData); } } } if(data.lineWidth > 0) { webGLData = PIXI.WebGLGraphics.switchMode(webGL, 0); PIXI.WebGLGraphics.buildLine(data, webGLData); } } else { webGLData = PIXI.WebGLGraphics.switchMode(webGL, 0); if(data.type === PIXI.Graphics.RECT) { PIXI.WebGLGraphics.buildRectangle(data, webGLData); } else if(data.type === PIXI.Graphics.CIRC || data.type === PIXI.Graphics.ELIP) { PIXI.WebGLGraphics.buildCircle(data, webGLData); } else if(data.type === PIXI.Graphics.RREC) { PIXI.WebGLGraphics.buildRoundedRectangle(data, webGLData); } } webGL.lastIndex++; } // upload all the dirty data... for (i = 0; i < webGL.data.length; i++) { webGLData = webGL.data[i]; if(webGLData.dirty)webGLData.upload(); } }; /** * @static * @private * @method switchMode * @param webGL {WebGLContext} * @param type {Number} */ PIXI.WebGLGraphics.switchMode = function(webGL, type) { var webGLData; if(!webGL.data.length) { webGLData = PIXI.WebGLGraphics.graphicsDataPool.pop() || new PIXI.WebGLGraphicsData(webGL.gl); webGLData.mode = type; webGL.data.push(webGLData); } else { webGLData = webGL.data[webGL.data.length-1]; if(webGLData.mode !== type || type === 1) { webGLData = PIXI.WebGLGraphics.graphicsDataPool.pop() || new PIXI.WebGLGraphicsData(webGL.gl); webGLData.mode = type; webGL.data.push(webGLData); } } webGLData.dirty = true; return webGLData; }; /** * Builds a rectangle to draw * * @static * @private * @method buildRectangle * @param graphicsData {Graphics} The graphics object containing all the necessary properties * @param webGLData {Object} */ PIXI.WebGLGraphics.buildRectangle = function(graphicsData, webGLData) { // --- // // need to convert points to a nice regular data // var rectData = graphicsData.shape; var x = rectData.x; var y = rectData.y; var width = rectData.width; var height = rectData.height; if(graphicsData.fill) { var color = PIXI.hex2rgb(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; var indices = webGLData.indices; var vertPos = verts.length/6; // start verts.push(x, y); verts.push(r, g, b, alpha); verts.push(x + width, y); verts.push(r, g, b, alpha); verts.push(x , y + height); verts.push(r, g, b, alpha); verts.push(x + width, y + height); verts.push(r, g, b, alpha); // insert 2 dead triangles.. indices.push(vertPos, vertPos, vertPos+1, vertPos+2, vertPos+3, vertPos+3); } if(graphicsData.lineWidth) { var tempPoints = graphicsData.points; graphicsData.points = [x, y, x + width, y, x + width, y + height, x, y + height, x, y]; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); graphicsData.points = tempPoints; } }; /** * Builds a rounded rectangle to draw * * @static * @private * @method buildRoundedRectangle * @param graphicsData {Graphics} The graphics object containing all the necessary properties * @param webGLData {Object} */ PIXI.WebGLGraphics.buildRoundedRectangle = function(graphicsData, webGLData) { var rrectData = graphicsData.shape; var x = rrectData.x; var y = rrectData.y; var width = rrectData.width; var height = rrectData.height; var radius = rrectData.radius; var recPoints = []; recPoints.push(x, y + radius); recPoints = recPoints.concat(PIXI.WebGLGraphics.quadraticBezierCurve(x, y + height - radius, x, y + height, x + radius, y + height)); recPoints = recPoints.concat(PIXI.WebGLGraphics.quadraticBezierCurve(x + width - radius, y + height, x + width, y + height, x + width, y + height - radius)); recPoints = recPoints.concat(PIXI.WebGLGraphics.quadraticBezierCurve(x + width, y + radius, x + width, y, x + width - radius, y)); recPoints = recPoints.concat(PIXI.WebGLGraphics.quadraticBezierCurve(x + radius, y, x, y, x, y + radius)); if (graphicsData.fill) { var color = PIXI.hex2rgb(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; var indices = webGLData.indices; var vecPos = verts.length/6; var triangles = PIXI.PolyK.Triangulate(recPoints); // var i = 0; for (i = 0; i < triangles.length; i+=3) { indices.push(triangles[i] + vecPos); indices.push(triangles[i] + vecPos); indices.push(triangles[i+1] + vecPos); indices.push(triangles[i+2] + vecPos); indices.push(triangles[i+2] + vecPos); } for (i = 0; i < recPoints.length; i++) { verts.push(recPoints[i], recPoints[++i], r, g, b, alpha); } } if (graphicsData.lineWidth) { var tempPoints = graphicsData.points; graphicsData.points = recPoints; PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); graphicsData.points = tempPoints; } }; /** * Calculate the points for a quadratic bezier curve. (helper function..) * Based on: https://stackoverflow.com/questions/785097/how-do-i-implement-a-bezier-curve-in-c * * @static * @private * @method quadraticBezierCurve * @param fromX {Number} Origin point x * @param fromY {Number} Origin point x * @param cpX {Number} Control point x * @param cpY {Number} Control point y * @param toX {Number} Destination point x * @param toY {Number} Destination point y * @return {Array(Number)} */ PIXI.WebGLGraphics.quadraticBezierCurve = function(fromX, fromY, cpX, cpY, toX, toY) { var xa, ya, xb, yb, x, y, n = 20, points = []; function getPt(n1 , n2, perc) { var diff = n2 - n1; return n1 + ( diff * perc ); } var j = 0; for (var i = 0; i <= n; i++ ) { j = i / n; // The Green Line xa = getPt( fromX , cpX , j ); ya = getPt( fromY , cpY , j ); xb = getPt( cpX , toX , j ); yb = getPt( cpY , toY , j ); // The Black Dot x = getPt( xa , xb , j ); y = getPt( ya , yb , j ); points.push(x, y); } return points; }; /** * Builds a circle to draw * * @static * @private * @method buildCircle * @param graphicsData {Graphics} The graphics object to draw * @param webGLData {Object} */ PIXI.WebGLGraphics.buildCircle = function(graphicsData, webGLData) { // need to convert points to a nice regular data var circleData = graphicsData.shape; var x = circleData.x; var y = circleData.y; var width; var height; // TODO - bit hacky?? if(graphicsData.type === PIXI.Graphics.CIRC) { width = circleData.radius; height = circleData.radius; } else { width = circleData.width; height = circleData.height; } var totalSegs = 40; var seg = (Math.PI * 2) / totalSegs ; var i = 0; if(graphicsData.fill) { var color = PIXI.hex2rgb(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var verts = webGLData.points; var indices = webGLData.indices; var vecPos = verts.length/6; indices.push(vecPos); for (i = 0; i < totalSegs + 1 ; i++) { verts.push(x,y, r, g, b, alpha); verts.push(x + Math.sin(seg * i) * width, y + Math.cos(seg * i) * height, r, g, b, alpha); indices.push(vecPos++, vecPos++); } indices.push(vecPos-1); } if(graphicsData.lineWidth) { var tempPoints = graphicsData.points; graphicsData.points = []; for (i = 0; i < totalSegs + 1; i++) { graphicsData.points.push(x + Math.sin(seg * i) * width, y + Math.cos(seg * i) * height); } PIXI.WebGLGraphics.buildLine(graphicsData, webGLData); graphicsData.points = tempPoints; } }; /** * Builds a line to draw * * @static * @private * @method buildLine * @param graphicsData {Graphics} The graphics object containing all the necessary properties * @param webGLData {Object} */ PIXI.WebGLGraphics.buildLine = function(graphicsData, webGLData) { // TODO OPTIMISE! var i = 0; var points = graphicsData.points; if(points.length === 0)return; // if the line width is an odd number add 0.5 to align to a whole pixel if(graphicsData.lineWidth%2) { for (i = 0; i < points.length; i++) { points[i] += 0.5; } } // get first and last point.. figure out the middle! var firstPoint = new PIXI.Point( points[0], points[1] ); var lastPoint = new PIXI.Point( points[points.length - 2], points[points.length - 1] ); // if the first point is the last point - gonna have issues if(firstPoint.x === lastPoint.x && firstPoint.y === lastPoint.y) { // need to clone as we are going to slightly modify the shape.. points = points.slice(); points.pop(); points.pop(); lastPoint = new PIXI.Point( points[points.length - 2], points[points.length - 1] ); var midPointX = lastPoint.x + (firstPoint.x - lastPoint.x) *0.5; var midPointY = lastPoint.y + (firstPoint.y - lastPoint.y) *0.5; points.unshift(midPointX, midPointY); points.push(midPointX, midPointY); } var verts = webGLData.points; var indices = webGLData.indices; var length = points.length / 2; var indexCount = points.length; var indexStart = verts.length/6; // DRAW the Line var width = graphicsData.lineWidth / 2; // sort color var color = PIXI.hex2rgb(graphicsData.lineColor); var alpha = graphicsData.lineAlpha; var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var px, py, p1x, p1y, p2x, p2y, p3x, p3y; var perpx, perpy, perp2x, perp2y, perp3x, perp3y; var a1, b1, c1, a2, b2, c2; var denom, pdist, dist; p1x = points[0]; p1y = points[1]; p2x = points[2]; p2y = points[3]; perpx = -(p1y - p2y); perpy = p1x - p2x; dist = Math.sqrt(perpx*perpx + perpy*perpy); perpx /= dist; perpy /= dist; perpx *= width; perpy *= width; // start verts.push(p1x - perpx , p1y - perpy, r, g, b, alpha); verts.push(p1x + perpx , p1y + perpy, r, g, b, alpha); for (i = 1; i < length-1; i++) { p1x = points[(i-1)*2]; p1y = points[(i-1)*2 + 1]; p2x = points[(i)*2]; p2y = points[(i)*2 + 1]; p3x = points[(i+1)*2]; p3y = points[(i+1)*2 + 1]; perpx = -(p1y - p2y); perpy = p1x - p2x; dist = Math.sqrt(perpx*perpx + perpy*perpy); perpx /= dist; perpy /= dist; perpx *= width; perpy *= width; perp2x = -(p2y - p3y); perp2y = p2x - p3x; dist = Math.sqrt(perp2x*perp2x + perp2y*perp2y); perp2x /= dist; perp2y /= dist; perp2x *= width; perp2y *= width; a1 = (-perpy + p1y) - (-perpy + p2y); b1 = (-perpx + p2x) - (-perpx + p1x); c1 = (-perpx + p1x) * (-perpy + p2y) - (-perpx + p2x) * (-perpy + p1y); a2 = (-perp2y + p3y) - (-perp2y + p2y); b2 = (-perp2x + p2x) - (-perp2x + p3x); c2 = (-perp2x + p3x) * (-perp2y + p2y) - (-perp2x + p2x) * (-perp2y + p3y); denom = a1*b2 - a2*b1; if(Math.abs(denom) < 0.1 ) { denom+=10.1; verts.push(p2x - perpx , p2y - perpy, r, g, b, alpha); verts.push(p2x + perpx , p2y + perpy, r, g, b, alpha); continue; } px = (b1*c2 - b2*c1)/denom; py = (a2*c1 - a1*c2)/denom; pdist = (px -p2x) * (px -p2x) + (py -p2y) + (py -p2y); if(pdist > 140 * 140) { perp3x = perpx - perp2x; perp3y = perpy - perp2y; dist = Math.sqrt(perp3x*perp3x + perp3y*perp3y); perp3x /= dist; perp3y /= dist; perp3x *= width; perp3y *= width; verts.push(p2x - perp3x, p2y -perp3y); verts.push(r, g, b, alpha); verts.push(p2x + perp3x, p2y +perp3y); verts.push(r, g, b, alpha); verts.push(p2x - perp3x, p2y -perp3y); verts.push(r, g, b, alpha); indexCount++; } else { verts.push(px , py); verts.push(r, g, b, alpha); verts.push(p2x - (px-p2x), p2y - (py - p2y)); verts.push(r, g, b, alpha); } } p1x = points[(length-2)*2]; p1y = points[(length-2)*2 + 1]; p2x = points[(length-1)*2]; p2y = points[(length-1)*2 + 1]; perpx = -(p1y - p2y); perpy = p1x - p2x; dist = Math.sqrt(perpx*perpx + perpy*perpy); perpx /= dist; perpy /= dist; perpx *= width; perpy *= width; verts.push(p2x - perpx , p2y - perpy); verts.push(r, g, b, alpha); verts.push(p2x + perpx , p2y + perpy); verts.push(r, g, b, alpha); indices.push(indexStart); for (i = 0; i < indexCount; i++) { indices.push(indexStart++); } indices.push(indexStart-1); }; /** * Builds a complex polygon to draw * * @static * @private * @method buildComplexPoly * @param graphicsData {Graphics} The graphics object containing all the necessary properties * @param webGLData {Object} */ PIXI.WebGLGraphics.buildComplexPoly = function(graphicsData, webGLData) { //TODO - no need to copy this as it gets turned into a FLoat32Array anyways.. var points = graphicsData.points.slice(); if(points.length < 6)return; // get first and last point.. figure out the middle! var indices = webGLData.indices; webGLData.points = points; webGLData.alpha = graphicsData.fillAlpha; webGLData.color = PIXI.hex2rgb(graphicsData.fillColor); /* calclate the bounds.. */ var minX = Infinity; var maxX = -Infinity; var minY = Infinity; var maxY = -Infinity; var x,y; // get size.. for (var i = 0; i < points.length; i+=2) { x = points[i]; y = points[i+1]; minX = x < minX ? x : minX; maxX = x > maxX ? x : maxX; minY = y < minY ? y : minY; maxY = y > maxY ? y : maxY; } // add a quad to the end cos there is no point making another buffer! points.push(minX, minY, maxX, minY, maxX, maxY, minX, maxY); // push a quad onto the end.. //TODO - this aint needed! var length = points.length / 2; for (i = 0; i < length; i++) { indices.push( i ); } }; /** * Builds a polygon to draw * * @static * @private * @method buildPoly * @param graphicsData {Graphics} The graphics object containing all the necessary properties * @param webGLData {Object} */ PIXI.WebGLGraphics.buildPoly = function(graphicsData, webGLData) { var points = graphicsData.points; if(points.length < 6)return; // get first and last point.. figure out the middle! var verts = webGLData.points; var indices = webGLData.indices; var length = points.length / 2; // sort color var color = PIXI.hex2rgb(graphicsData.fillColor); var alpha = graphicsData.fillAlpha; var r = color[0] * alpha; var g = color[1] * alpha; var b = color[2] * alpha; var triangles = PIXI.PolyK.Triangulate(points); if(!triangles)return false; var vertPos = verts.length / 6; var i = 0; for (i = 0; i < triangles.length; i+=3) { indices.push(triangles[i] + vertPos); indices.push(triangles[i] + vertPos); indices.push(triangles[i+1] + vertPos); indices.push(triangles[i+2] +vertPos); indices.push(triangles[i+2] + vertPos); } for (i = 0; i < length; i++) { verts.push(points[i * 2], points[i * 2 + 1], r, g, b, alpha); } return true; }; PIXI.WebGLGraphics.graphicsDataPool = []; /** * @class WebGLGraphicsData * @private * @static */ PIXI.WebGLGraphicsData = function(gl) { this.gl = gl; //TODO does this need to be split before uploding?? this.color = [0,0,0]; // color split! this.points = []; this.indices = []; this.buffer = gl.createBuffer(); this.indexBuffer = gl.createBuffer(); this.mode = 1; this.alpha = 1; this.dirty = true; }; /** * @method reset */ PIXI.WebGLGraphicsData.prototype.reset = function() { this.points = []; this.indices = []; }; /** * @method upload */ PIXI.WebGLGraphicsData.prototype.upload = function() { var gl = this.gl; // this.lastIndex = graphics.graphicsData.length; this.glPoints = new PIXI.Float32Array(this.points); gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer); gl.bufferData(gl.ARRAY_BUFFER, this.glPoints, gl.STATIC_DRAW); this.glIndicies = new PIXI.Uint16Array(this.indices); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.glIndicies, gl.STATIC_DRAW); this.dirty = false; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ PIXI.glContexts = []; // this is where we store the webGL contexts for easy access. PIXI.instances = []; /** * The WebGLRenderer draws the stage and all its content onto a webGL enabled canvas. This renderer * should be used for browsers that support webGL. This Render works by automatically managing webGLBatchs. * So no need for Sprite Batches or Sprite Clouds. * Don't forget to add the view to your DOM or you will not see anything * * @class WebGLRenderer * @constructor * @param [width=0] {Number} the width of the canvas view * @param [height=0] {Number} the height of the canvas view * @param [options] {Object} The optional renderer parameters * @param [options.view] {HTMLCanvasElement} the canvas to use as a view, optional * @param [options.transparent=false] {Boolean} If the render view is transparent, default false * @param [options.autoResize=false] {Boolean} If the render view is automatically resized, default false * @param [options.antialias=false] {Boolean} sets antialias (only applicable in chrome at the moment) * @param [options.preserveDrawingBuffer=false] {Boolean} enables drawing buffer preservation, enable this if you need to call toDataUrl on the webgl context * @param [options.resolution=1] {Number} the resolution of the renderer retina would be 2 */ PIXI.WebGLRenderer = function(width, height, options) { if(options) { for (var i in PIXI.defaultRenderOptions) { if (typeof options[i] === 'undefined') options[i] = PIXI.defaultRenderOptions[i]; } } else { options = PIXI.defaultRenderOptions; } if(!PIXI.defaultRenderer) { PIXI.sayHello('webGL'); PIXI.defaultRenderer = this; } /** * @property type * @type Number */ this.type = PIXI.WEBGL_RENDERER; /** * The resolution of the renderer * * @property resolution * @type Number * @default 1 */ this.resolution = options.resolution; // do a catch.. only 1 webGL renderer.. /** * Whether the render view is transparent * * @property transparent * @type Boolean */ this.transparent = options.transparent; /** * Whether the render view should be resized automatically * * @property autoResize * @type Boolean */ this.autoResize = options.autoResize || false; /** * The value of the preserveDrawingBuffer flag affects whether or not the contents of the stencil buffer is retained after rendering. * * @property preserveDrawingBuffer * @type Boolean */ this.preserveDrawingBuffer = options.preserveDrawingBuffer; /** * This sets if the WebGLRenderer will clear the context texture or not before the new render pass. If true: * If the Stage is NOT transparent, Pixi will clear to alpha (0, 0, 0, 0). * If the Stage is transparent, Pixi will clear to the target Stage's background color. * Disable this by setting this to false. For example: if your game has a canvas filling background image, you often don't need this set. * * @property clearBeforeRender * @type Boolean * @default */ this.clearBeforeRender = options.clearBeforeRender; /** * The width of the canvas view * * @property width * @type Number * @default 800 */ this.width = width || 800; /** * The height of the canvas view * * @property height * @type Number * @default 600 */ this.height = height || 600; /** * The canvas element that everything is drawn to * * @property view * @type HTMLCanvasElement */ this.view = options.view || document.createElement( 'canvas' ); // deal with losing context.. /** * @property contextLostBound * @type Function */ this.contextLostBound = this.handleContextLost.bind(this); /** * @property contextRestoredBound * @type Function */ this.contextRestoredBound = this.handleContextRestored.bind(this); this.view.addEventListener('webglcontextlost', this.contextLostBound, false); this.view.addEventListener('webglcontextrestored', this.contextRestoredBound, false); /** * @property _contextOptions * @type Object * @private */ this._contextOptions = { alpha: this.transparent, antialias: options.antialias, // SPEED UP?? premultipliedAlpha:this.transparent && this.transparent !== 'notMultiplied', stencil:true, preserveDrawingBuffer: options.preserveDrawingBuffer }; /** * @property projection * @type Point */ this.projection = new PIXI.Point(); /** * @property offset * @type Point */ this.offset = new PIXI.Point(0, 0); // time to create the render managers! each one focuses on managing a state in webGL /** * Deals with managing the shader programs and their attribs * @property shaderManager * @type WebGLShaderManager */ this.shaderManager = new PIXI.WebGLShaderManager(); /** * Manages the rendering of sprites * @property spriteBatch * @type WebGLSpriteBatch */ this.spriteBatch = new PIXI.WebGLSpriteBatch(); /** * Manages the masks using the stencil buffer * @property maskManager * @type WebGLMaskManager */ this.maskManager = new PIXI.WebGLMaskManager(); /** * Manages the filters * @property filterManager * @type WebGLFilterManager */ this.filterManager = new PIXI.WebGLFilterManager(); /** * Manages the stencil buffer * @property stencilManager * @type WebGLStencilManager */ this.stencilManager = new PIXI.WebGLStencilManager(); /** * Manages the blendModes * @property blendModeManager * @type WebGLBlendModeManager */ this.blendModeManager = new PIXI.WebGLBlendModeManager(); /** * TODO remove * @property renderSession * @type Object */ this.renderSession = {}; this.renderSession.gl = this.gl; this.renderSession.drawCount = 0; this.renderSession.shaderManager = this.shaderManager; this.renderSession.maskManager = this.maskManager; this.renderSession.filterManager = this.filterManager; this.renderSession.blendModeManager = this.blendModeManager; this.renderSession.spriteBatch = this.spriteBatch; this.renderSession.stencilManager = this.stencilManager; this.renderSession.renderer = this; this.renderSession.resolution = this.resolution; // time init the context.. this.initContext(); // map some webGL blend modes.. this.mapBlendModes(); }; // constructor PIXI.WebGLRenderer.prototype.constructor = PIXI.WebGLRenderer; /** * @method initContext */ PIXI.WebGLRenderer.prototype.initContext = function() { var gl = this.view.getContext('webgl', this._contextOptions) || this.view.getContext('experimental-webgl', this._contextOptions); this.gl = gl; if (!gl) { // fail, not able to get a context throw new Error('This browser does not support webGL. Try using the canvas renderer'); } this.glContextId = gl.id = PIXI.WebGLRenderer.glContextId ++; PIXI.glContexts[this.glContextId] = gl; PIXI.instances[this.glContextId] = this; // set up the default pixi settings.. gl.disable(gl.DEPTH_TEST); gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); // need to set the context for all the managers... this.shaderManager.setContext(gl); this.spriteBatch.setContext(gl); this.maskManager.setContext(gl); this.filterManager.setContext(gl); this.blendModeManager.setContext(gl); this.stencilManager.setContext(gl); this.renderSession.gl = this.gl; // now resize and we are good to go! this.resize(this.width, this.height); }; /** * Renders the stage to its webGL view * * @method render * @param stage {Stage} the Stage element to be rendered */ PIXI.WebGLRenderer.prototype.render = function(stage) { // no point rendering if our context has been blown up! if(this.contextLost)return; // if rendering a new stage clear the batches.. if(this.__stage !== stage) { if(stage.interactive)stage.interactionManager.removeEvents(); // TODO make this work // dont think this is needed any more? this.__stage = stage; } // update the scene graph stage.updateTransform(); var gl = this.gl; // interaction if(stage._interactive) { //need to add some events! if(!stage._interactiveEventsAdded) { stage._interactiveEventsAdded = true; stage.interactionManager.setTarget(this); } } else { if(stage._interactiveEventsAdded) { stage._interactiveEventsAdded = false; stage.interactionManager.setTarget(this); } } // -- Does this need to be set every frame? -- // gl.viewport(0, 0, this.width, this.height); // make sure we are bound to the main frame buffer gl.bindFramebuffer(gl.FRAMEBUFFER, null); if (this.clearBeforeRender) { if(this.transparent) { gl.clearColor(0, 0, 0, 0); } else { gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], 1); } gl.clear (gl.COLOR_BUFFER_BIT); } this.renderDisplayObject( stage, this.projection ); }; /** * Renders a Display Object. * * @method renderDisplayObject * @param displayObject {DisplayObject} The DisplayObject to render * @param projection {Point} The projection * @param buffer {Array} a standard WebGL buffer */ PIXI.WebGLRenderer.prototype.renderDisplayObject = function(displayObject, projection, buffer) { this.renderSession.blendModeManager.setBlendMode(PIXI.blendModes.NORMAL); // reset the render session data.. this.renderSession.drawCount = 0; // make sure to flip the Y if using a render texture.. this.renderSession.flipY = buffer ? -1 : 1; // set the default projection this.renderSession.projection = projection; //set the default offset this.renderSession.offset = this.offset; // start the sprite batch this.spriteBatch.begin(this.renderSession); // start the filter manager this.filterManager.begin(this.renderSession, buffer); // render the scene! displayObject._renderWebGL(this.renderSession); // finish the sprite batch this.spriteBatch.end(); }; /** * Resizes the webGL view to the specified width and height. * * @method resize * @param width {Number} the new width of the webGL view * @param height {Number} the new height of the webGL view */ PIXI.WebGLRenderer.prototype.resize = function(width, height) { this.width = width * this.resolution; this.height = height * this.resolution; this.view.width = this.width; this.view.height = this.height; if (this.autoResize) { this.view.style.width = this.width / this.resolution + 'px'; this.view.style.height = this.height / this.resolution + 'px'; } this.gl.viewport(0, 0, this.width, this.height); this.projection.x = this.width / 2 / this.resolution; this.projection.y = -this.height / 2 / this.resolution; }; /** * Updates and Creates a WebGL texture for the renderers context. * * @method updateTexture * @param texture {Texture} the texture to update */ PIXI.WebGLRenderer.prototype.updateTexture = function(texture) { if(!texture.hasLoaded )return; var gl = this.gl; if(!texture._glTextures[gl.id])texture._glTextures[gl.id] = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); if(texture.mipmap && PIXI.isPowerOfTwo(texture.width, texture.height)) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR_MIPMAP_LINEAR : gl.NEAREST_MIPMAP_NEAREST); gl.generateMipmap(gl.TEXTURE_2D); } else { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); } // reguler... if(!texture._powerOf2) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); } else { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); } texture._dirty[gl.id] = false; return texture._glTextures[gl.id]; }; /** * Handles a lost webgl context * * @method handleContextLost * @param event {Event} * @private */ PIXI.WebGLRenderer.prototype.handleContextLost = function(event) { event.preventDefault(); this.contextLost = true; }; /** * Handles a restored webgl context * * @method handleContextRestored * @param event {Event} * @private */ PIXI.WebGLRenderer.prototype.handleContextRestored = function() { this.initContext(); // empty all the ol gl textures as they are useless now for(var key in PIXI.TextureCache) { var texture = PIXI.TextureCache[key].baseTexture; texture._glTextures = []; } this.contextLost = false; }; /** * Removes everything from the renderer (event listeners, spritebatch, etc...) * * @method destroy */ PIXI.WebGLRenderer.prototype.destroy = function() { // remove listeners this.view.removeEventListener('webglcontextlost', this.contextLostBound); this.view.removeEventListener('webglcontextrestored', this.contextRestoredBound); PIXI.glContexts[this.glContextId] = null; this.projection = null; this.offset = null; // time to create the render managers! each one focuses on managine a state in webGL this.shaderManager.destroy(); this.spriteBatch.destroy(); this.maskManager.destroy(); this.filterManager.destroy(); this.shaderManager = null; this.spriteBatch = null; this.maskManager = null; this.filterManager = null; this.gl = null; this.renderSession = null; }; /** * Maps Pixi blend modes to WebGL blend modes. * * @method mapBlendModes */ PIXI.WebGLRenderer.prototype.mapBlendModes = function() { var gl = this.gl; if(!PIXI.blendModesWebGL) { PIXI.blendModesWebGL = []; PIXI.blendModesWebGL[PIXI.blendModes.NORMAL] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.ADD] = [gl.SRC_ALPHA, gl.DST_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.MULTIPLY] = [gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.SCREEN] = [gl.SRC_ALPHA, gl.ONE]; PIXI.blendModesWebGL[PIXI.blendModes.OVERLAY] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.DARKEN] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.LIGHTEN] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.COLOR_DODGE] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.COLOR_BURN] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.HARD_LIGHT] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.SOFT_LIGHT] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.DIFFERENCE] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.EXCLUSION] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.HUE] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.SATURATION] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.COLOR] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; PIXI.blendModesWebGL[PIXI.blendModes.LUMINOSITY] = [gl.ONE, gl.ONE_MINUS_SRC_ALPHA]; } }; PIXI.WebGLRenderer.glContextId = 0; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * @class WebGLBlendModeManager * @constructor * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.WebGLBlendModeManager = function() { /** * @property currentBlendMode * @type Number */ this.currentBlendMode = 99999; }; PIXI.WebGLBlendModeManager.prototype.constructor = PIXI.WebGLBlendModeManager; /** * Sets the WebGL Context. * * @method setContext * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.WebGLBlendModeManager.prototype.setContext = function(gl) { this.gl = gl; }; /** * Sets-up the given blendMode from WebGL's point of view. * * @method setBlendMode * @param blendMode {Number} the blendMode, should be a Pixi const, such as PIXI.BlendModes.ADD */ PIXI.WebGLBlendModeManager.prototype.setBlendMode = function(blendMode) { if(this.currentBlendMode === blendMode)return false; this.currentBlendMode = blendMode; var blendModeWebGL = PIXI.blendModesWebGL[this.currentBlendMode]; this.gl.blendFunc(blendModeWebGL[0], blendModeWebGL[1]); return true; }; /** * Destroys this object. * * @method destroy */ PIXI.WebGLBlendModeManager.prototype.destroy = function() { this.gl = null; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * @class WebGLMaskManager * @constructor * @private */ PIXI.WebGLMaskManager = function() { }; PIXI.WebGLMaskManager.prototype.constructor = PIXI.WebGLMaskManager; /** * Sets the drawing context to the one given in parameter. * * @method setContext * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.WebGLMaskManager.prototype.setContext = function(gl) { this.gl = gl; }; /** * Applies the Mask and adds it to the current filter stack. * * @method pushMask * @param maskData {Array} * @param renderSession {Object} */ PIXI.WebGLMaskManager.prototype.pushMask = function(maskData, renderSession) { var gl = renderSession.gl; if(maskData.dirty) { PIXI.WebGLGraphics.updateGraphics(maskData, gl); } if(!maskData._webGL[gl.id].data.length)return; renderSession.stencilManager.pushStencil(maskData, maskData._webGL[gl.id].data[0], renderSession); }; /** * Removes the last filter from the filter stack and doesn't return it. * * @method popMask * @param maskData {Array} * @param renderSession {Object} an object containing all the useful parameters */ PIXI.WebGLMaskManager.prototype.popMask = function(maskData, renderSession) { var gl = this.gl; renderSession.stencilManager.popStencil(maskData, maskData._webGL[gl.id].data[0], renderSession); }; /** * Destroys the mask stack. * * @method destroy */ PIXI.WebGLMaskManager.prototype.destroy = function() { this.gl = null; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * @class WebGLStencilManager * @constructor * @private */ PIXI.WebGLStencilManager = function() { this.stencilStack = []; this.reverse = true; this.count = 0; }; /** * Sets the drawing context to the one given in parameter. * * @method setContext * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.WebGLStencilManager.prototype.setContext = function(gl) { this.gl = gl; }; /** * Applies the Mask and adds it to the current filter stack. * * @method pushMask * @param graphics {Graphics} * @param webGLData {Array} * @param renderSession {Object} */ PIXI.WebGLStencilManager.prototype.pushStencil = function(graphics, webGLData, renderSession) { var gl = this.gl; this.bindGraphics(graphics, webGLData, renderSession); if(this.stencilStack.length === 0) { gl.enable(gl.STENCIL_TEST); gl.clear(gl.STENCIL_BUFFER_BIT); this.reverse = true; this.count = 0; } this.stencilStack.push(webGLData); var level = this.count; gl.colorMask(false, false, false, false); gl.stencilFunc(gl.ALWAYS,0,0xFF); gl.stencilOp(gl.KEEP,gl.KEEP,gl.INVERT); // draw the triangle strip! if(webGLData.mode === 1) { gl.drawElements(gl.TRIANGLE_FAN, webGLData.indices.length - 4, gl.UNSIGNED_SHORT, 0 ); if(this.reverse) { gl.stencilFunc(gl.EQUAL, 0xFF - level, 0xFF); gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); } else { gl.stencilFunc(gl.EQUAL,level, 0xFF); gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); } // draw a quad to increment.. gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_SHORT, ( webGLData.indices.length - 4 ) * 2 ); if(this.reverse) { gl.stencilFunc(gl.EQUAL,0xFF-(level+1), 0xFF); } else { gl.stencilFunc(gl.EQUAL,level+1, 0xFF); } this.reverse = !this.reverse; } else { if(!this.reverse) { gl.stencilFunc(gl.EQUAL, 0xFF - level, 0xFF); gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); } else { gl.stencilFunc(gl.EQUAL,level, 0xFF); gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); } gl.drawElements(gl.TRIANGLE_STRIP, webGLData.indices.length, gl.UNSIGNED_SHORT, 0 ); if(!this.reverse) { gl.stencilFunc(gl.EQUAL,0xFF-(level+1), 0xFF); } else { gl.stencilFunc(gl.EQUAL,level+1, 0xFF); } } gl.colorMask(true, true, true, true); gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); this.count++; }; /** * TODO this does not belong here! * * @method bindGraphics * @param graphics {Graphics} * @param webGLData {Array} * @param renderSession {Object} */ PIXI.WebGLStencilManager.prototype.bindGraphics = function(graphics, webGLData, renderSession) { //if(this._currentGraphics === graphics)return; this._currentGraphics = graphics; var gl = this.gl; // bind the graphics object.. var projection = renderSession.projection, offset = renderSession.offset, shader;// = renderSession.shaderManager.primitiveShader; if(webGLData.mode === 1) { shader = renderSession.shaderManager.complexPrimitiveShader; renderSession.shaderManager.setShader( shader ); gl.uniform1f(shader.flipY, renderSession.flipY); gl.uniformMatrix3fv(shader.translationMatrix, false, graphics.worldTransform.toArray(true)); gl.uniform2f(shader.projectionVector, projection.x, -projection.y); gl.uniform2f(shader.offsetVector, -offset.x, -offset.y); gl.uniform3fv(shader.tintColor, PIXI.hex2rgb(graphics.tint)); gl.uniform3fv(shader.color, webGLData.color); gl.uniform1f(shader.alpha, graphics.worldAlpha * webGLData.alpha); gl.bindBuffer(gl.ARRAY_BUFFER, webGLData.buffer); gl.vertexAttribPointer(shader.aVertexPosition, 2, gl.FLOAT, false, 4 * 2, 0); // now do the rest.. // set the index buffer! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, webGLData.indexBuffer); } else { //renderSession.shaderManager.activatePrimitiveShader(); shader = renderSession.shaderManager.primitiveShader; renderSession.shaderManager.setShader( shader ); gl.uniformMatrix3fv(shader.translationMatrix, false, graphics.worldTransform.toArray(true)); gl.uniform1f(shader.flipY, renderSession.flipY); gl.uniform2f(shader.projectionVector, projection.x, -projection.y); gl.uniform2f(shader.offsetVector, -offset.x, -offset.y); gl.uniform3fv(shader.tintColor, PIXI.hex2rgb(graphics.tint)); gl.uniform1f(shader.alpha, graphics.worldAlpha); gl.bindBuffer(gl.ARRAY_BUFFER, webGLData.buffer); gl.vertexAttribPointer(shader.aVertexPosition, 2, gl.FLOAT, false, 4 * 6, 0); gl.vertexAttribPointer(shader.colorAttribute, 4, gl.FLOAT, false,4 * 6, 2 * 4); // set the index buffer! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, webGLData.indexBuffer); } }; /** * @method popStencil * @param graphics {Graphics} * @param webGLData {Array} * @param renderSession {Object} */ PIXI.WebGLStencilManager.prototype.popStencil = function(graphics, webGLData, renderSession) { var gl = this.gl; this.stencilStack.pop(); this.count--; if(this.stencilStack.length === 0) { // the stack is empty! gl.disable(gl.STENCIL_TEST); } else { var level = this.count; this.bindGraphics(graphics, webGLData, renderSession); gl.colorMask(false, false, false, false); if(webGLData.mode === 1) { this.reverse = !this.reverse; if(this.reverse) { gl.stencilFunc(gl.EQUAL, 0xFF - (level+1), 0xFF); gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); } else { gl.stencilFunc(gl.EQUAL,level+1, 0xFF); gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); } // draw a quad to increment.. gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_SHORT, ( webGLData.indices.length - 4 ) * 2 ); gl.stencilFunc(gl.ALWAYS,0,0xFF); gl.stencilOp(gl.KEEP,gl.KEEP,gl.INVERT); // draw the triangle strip! gl.drawElements(gl.TRIANGLE_FAN, webGLData.indices.length - 4, gl.UNSIGNED_SHORT, 0 ); if(!this.reverse) { gl.stencilFunc(gl.EQUAL,0xFF-(level), 0xFF); } else { gl.stencilFunc(gl.EQUAL,level, 0xFF); } } else { // console.log("<<>>") if(!this.reverse) { gl.stencilFunc(gl.EQUAL, 0xFF - (level+1), 0xFF); gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); } else { gl.stencilFunc(gl.EQUAL,level+1, 0xFF); gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); } gl.drawElements(gl.TRIANGLE_STRIP, webGLData.indices.length, gl.UNSIGNED_SHORT, 0 ); if(!this.reverse) { gl.stencilFunc(gl.EQUAL,0xFF-(level), 0xFF); } else { gl.stencilFunc(gl.EQUAL,level, 0xFF); } } gl.colorMask(true, true, true, true); gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); } }; /** * Destroys the mask stack. * * @method destroy */ PIXI.WebGLStencilManager.prototype.destroy = function() { this.stencilStack = null; this.gl = null; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * @class WebGLShaderManager * @constructor * @private */ PIXI.WebGLShaderManager = function() { /** * @property maxAttibs * @type Number */ this.maxAttibs = 10; /** * @property attribState * @type Array */ this.attribState = []; /** * @property tempAttribState * @type Array */ this.tempAttribState = []; for (var i = 0; i < this.maxAttibs; i++) { this.attribState[i] = false; } /** * @property stack * @type Array */ this.stack = []; }; PIXI.WebGLShaderManager.prototype.constructor = PIXI.WebGLShaderManager; /** * Initialises the context and the properties. * * @method setContext * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.WebGLShaderManager.prototype.setContext = function(gl) { this.gl = gl; // the next one is used for rendering primitives this.primitiveShader = new PIXI.PrimitiveShader(gl); // the next one is used for rendering triangle strips this.complexPrimitiveShader = new PIXI.ComplexPrimitiveShader(gl); // this shader is used for the default sprite rendering this.defaultShader = new PIXI.PixiShader(gl); // this shader is used for the fast sprite rendering this.fastShader = new PIXI.PixiFastShader(gl); // the next one is used for rendering triangle strips this.stripShader = new PIXI.StripShader(gl); this.setShader(this.defaultShader); }; /** * Takes the attributes given in parameters. * * @method setAttribs * @param attribs {Array} attribs */ PIXI.WebGLShaderManager.prototype.setAttribs = function(attribs) { // reset temp state var i; for (i = 0; i < this.tempAttribState.length; i++) { this.tempAttribState[i] = false; } // set the new attribs for (i = 0; i < attribs.length; i++) { var attribId = attribs[i]; this.tempAttribState[attribId] = true; } var gl = this.gl; for (i = 0; i < this.attribState.length; i++) { if(this.attribState[i] !== this.tempAttribState[i]) { this.attribState[i] = this.tempAttribState[i]; if(this.tempAttribState[i]) { gl.enableVertexAttribArray(i); } else { gl.disableVertexAttribArray(i); } } } }; /** * Sets the current shader. * * @method setShader * @param shader {Any} */ PIXI.WebGLShaderManager.prototype.setShader = function(shader) { if(this._currentId === shader._UID)return false; this._currentId = shader._UID; this.currentShader = shader; this.gl.useProgram(shader.program); this.setAttribs(shader.attributes); return true; }; /** * Destroys this object. * * @method destroy */ PIXI.WebGLShaderManager.prototype.destroy = function() { this.attribState = null; this.tempAttribState = null; this.primitiveShader.destroy(); this.complexPrimitiveShader.destroy(); this.defaultShader.destroy(); this.fastShader.destroy(); this.stripShader.destroy(); this.gl = null; }; /** * @author Mat Groves * * Big thanks to the very clever Matt DesLauriers <mattdesl> https://github.com/mattdesl/ * for creating the original pixi version! * Also a thanks to https://github.com/bchevalier for tweaking the tint and alpha so that they now share 4 bytes on the vertex buffer * * Heavily inspired by LibGDX's WebGLSpriteBatch: * https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/g2d/WebGLSpriteBatch.java */ /** * * @class WebGLSpriteBatch * @private * @constructor */ PIXI.WebGLSpriteBatch = function() { /** * @property vertSize * @type Number */ this.vertSize = 5; /** * The number of images in the SpriteBatch before it flushes * @property size * @type Number */ this.size = 2000;//Math.pow(2, 16) / this.vertSize; //the total number of bytes in our batch var numVerts = this.size * 4 * 4 * this.vertSize; //the total number of indices in our batch var numIndices = this.size * 6; /** * Holds the vertices * * @property vertices * @type ArrayBuffer */ this.vertices = new PIXI.ArrayBuffer(numVerts); /** * View on the vertices as a Float32Array * * @property positions * @type Float32Array */ this.positions = new PIXI.Float32Array(this.vertices); /** * View on the vertices as a Uint32Array * * @property colors * @type Uint32Array */ this.colors = new PIXI.Uint32Array(this.vertices); /** * Holds the indices * * @property indices * @type Uint16Array */ this.indices = new PIXI.Uint16Array(numIndices); /** * @property lastIndexCount * @type Number */ this.lastIndexCount = 0; for (var i=0, j=0; i < numIndices; i += 6, j += 4) { this.indices[i + 0] = j + 0; this.indices[i + 1] = j + 1; this.indices[i + 2] = j + 2; this.indices[i + 3] = j + 0; this.indices[i + 4] = j + 2; this.indices[i + 5] = j + 3; } /** * @property drawing * @type Boolean */ this.drawing = false; /** * @property currentBatchSize * @type Number */ this.currentBatchSize = 0; /** * @property currentBaseTexture * @type BaseTexture */ this.currentBaseTexture = null; /** * @property dirty * @type Boolean */ this.dirty = true; /** * @property textures * @type Array */ this.textures = []; /** * @property blendModes * @type Array */ this.blendModes = []; /** * @property shaders * @type Array */ this.shaders = []; /** * @property sprites * @type Array */ this.sprites = []; /** * @property defaultShader * @type AbstractFilter */ this.defaultShader = new PIXI.AbstractFilter([ 'precision lowp float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform sampler2D uSampler;', 'void main(void) {', ' gl_FragColor = texture2D(uSampler, vTextureCoord) * vColor ;', '}' ]); }; /** * @method setContext * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.WebGLSpriteBatch.prototype.setContext = function(gl) { this.gl = gl; // create a couple of buffers this.vertexBuffer = gl.createBuffer(); this.indexBuffer = gl.createBuffer(); // 65535 is max index, so 65535 / 6 = 10922. //upload the index data gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.vertices, gl.DYNAMIC_DRAW); this.currentBlendMode = 99999; var shader = new PIXI.PixiShader(gl); shader.fragmentSrc = this.defaultShader.fragmentSrc; shader.uniforms = {}; shader.init(); this.defaultShader.shaders[gl.id] = shader; }; /** * @method begin * @param renderSession {Object} The RenderSession object */ PIXI.WebGLSpriteBatch.prototype.begin = function(renderSession) { this.renderSession = renderSession; this.shader = this.renderSession.shaderManager.defaultShader; this.start(); }; /** * @method end */ PIXI.WebGLSpriteBatch.prototype.end = function() { this.flush(); }; /** * @method render * @param sprite {Sprite} the sprite to render when using this spritebatch */ PIXI.WebGLSpriteBatch.prototype.render = function(sprite) { var texture = sprite.texture; //TODO set blend modes.. // check texture.. if(this.currentBatchSize >= this.size) { this.flush(); this.currentBaseTexture = texture.baseTexture; } // get the uvs for the texture var uvs = texture._uvs; // if the uvs have not updated then no point rendering just yet! if(!uvs)return; // TODO trim?? var aX = sprite.anchor.x; var aY = sprite.anchor.y; var w0, w1, h0, h1; if (texture.trim) { // if the sprite is trimmed then we need to add the extra space before transforming the sprite coords.. var trim = texture.trim; w1 = trim.x - aX * trim.width; w0 = w1 + texture.crop.width; h1 = trim.y - aY * trim.height; h0 = h1 + texture.crop.height; } else { w0 = (texture.frame.width ) * (1-aX); w1 = (texture.frame.width ) * -aX; h0 = texture.frame.height * (1-aY); h1 = texture.frame.height * -aY; } var index = this.currentBatchSize * 4 * this.vertSize; var resolution = texture.baseTexture.resolution; var worldTransform = sprite.worldTransform; var a = worldTransform.a / resolution; var b = worldTransform.b / resolution; var c = worldTransform.c / resolution; var d = worldTransform.d / resolution; var tx = worldTransform.tx; var ty = worldTransform.ty; var colors = this.colors; var positions = this.positions; if(this.renderSession.roundPixels) { // xy positions[index] = a * w1 + c * h1 + tx | 0; positions[index+1] = d * h1 + b * w1 + ty | 0; // xy positions[index+5] = a * w0 + c * h1 + tx | 0; positions[index+6] = d * h1 + b * w0 + ty | 0; // xy positions[index+10] = a * w0 + c * h0 + tx | 0; positions[index+11] = d * h0 + b * w0 + ty | 0; // xy positions[index+15] = a * w1 + c * h0 + tx | 0; positions[index+16] = d * h0 + b * w1 + ty | 0; } else { // xy positions[index] = a * w1 + c * h1 + tx; positions[index+1] = d * h1 + b * w1 + ty; // xy positions[index+5] = a * w0 + c * h1 + tx; positions[index+6] = d * h1 + b * w0 + ty; // xy positions[index+10] = a * w0 + c * h0 + tx; positions[index+11] = d * h0 + b * w0 + ty; // xy positions[index+15] = a * w1 + c * h0 + tx; positions[index+16] = d * h0 + b * w1 + ty; } // uv positions[index+2] = uvs.x0; positions[index+3] = uvs.y0; // uv positions[index+7] = uvs.x1; positions[index+8] = uvs.y1; // uv positions[index+12] = uvs.x2; positions[index+13] = uvs.y2; // uv positions[index+17] = uvs.; positions[index+18] = uvs.y3; // color and alpha var tint = sprite.tint; colors[index+4] = colors[index+9] = colors[index+14] = colors[index+19] = (tint >> 16) + (tint & 0xff00) + ((tint & 0xff) << 16) + (sprite.worldAlpha * 255 << 24); // increment the batchsize this.sprites[this.currentBatchSize++] = sprite; }; /** * Renders a TilingSprite using the spriteBatch. * * @method renderTilingSprite * @param sprite {TilingSprite} the tilingSprite to render */ PIXI.WebGLSpriteBatch.prototype.renderTilingSprite = function(tilingSprite) { var texture = tilingSprite.tilingTexture; // check texture.. if(this.currentBatchSize >= this.size) { //return; this.flush(); this.currentBaseTexture = texture.baseTexture; } // set the textures uvs temporarily // TODO create a separate texture so that we can tile part of a texture if(!tilingSprite._uvs)tilingSprite._uvs = new PIXI.TextureUvs(); var uvs = tilingSprite._uvs; tilingSprite.tilePosition.x %= texture.baseTexture.width * tilingSprite.tileScaleOffset.x; tilingSprite.tilePosition.y %= texture.baseTexture.height * tilingSprite.tileScaleOffset.y; var offsetX = tilingSprite.tilePosition.x/(texture.baseTexture.width*tilingSprite.tileScaleOffset.x); var offsetY = tilingSprite.tilePosition.y/(texture.baseTexture.height*tilingSprite.tileScaleOffset.y); var scaleX = (tilingSprite.width / texture.baseTexture.width) / (tilingSprite.tileScale.x * tilingSprite.tileScaleOffset.x); var scaleY = (tilingSprite.height / texture.baseTexture.height) / (tilingSprite.tileScale.y * tilingSprite.tileScaleOffset.y); uvs.x0 = 0 - offsetX; uvs.y0 = 0 - offsetY; uvs.x1 = (1 * scaleX) - offsetX; uvs.y1 = 0 - offsetY; uvs.x2 = (1 * scaleX) - offsetX; uvs.y2 = (1 * scaleY) - offsetY; uvs. = 0 - offsetX; uvs.y3 = (1 * scaleY) - offsetY; // get the tilingSprites current alpha and tint and combining them into a single color var tint = tilingSprite.tint; var color = (tint >> 16) + (tint & 0xff00) + ((tint & 0xff) << 16) + (tilingSprite.alpha * 255 << 24); var positions = this.positions; var colors = this.colors; var width = tilingSprite.width; var height = tilingSprite.height; // TODO trim?? var aX = tilingSprite.anchor.x; var aY = tilingSprite.anchor.y; var w0 = width * (1-aX); var w1 = width * -aX; var h0 = height * (1-aY); var h1 = height * -aY; var index = this.currentBatchSize * 4 * this.vertSize; var resolution = texture.baseTexture.resolution; var worldTransform = tilingSprite.worldTransform; var a = worldTransform.a / resolution;//[0]; var b = worldTransform.b / resolution;//[3]; var c = worldTransform.c / resolution;//[1]; var d = worldTransform.d / resolution;//[4]; var tx = worldTransform.tx;//[2]; var ty = worldTransform.ty;//[5]; // xy positions[index++] = a * w1 + c * h1 + tx; positions[index++] = d * h1 + b * w1 + ty; // uv positions[index++] = uvs.x0; positions[index++] = uvs.y0; // color colors[index++] = color; // xy positions[index++] = (a * w0 + c * h1 + tx); positions[index++] = d * h1 + b * w0 + ty; // uv positions[index++] = uvs.x1; positions[index++] = uvs.y1; // color colors[index++] = color; // xy positions[index++] = a * w0 + c * h0 + tx; positions[index++] = d * h0 + b * w0 + ty; // uv positions[index++] = uvs.x2; positions[index++] = uvs.y2; // color colors[index++] = color; // xy positions[index++] = a * w1 + c * h0 + tx; positions[index++] = d * h0 + b * w1 + ty; // uv positions[index++] = uvs.; positions[index++] = uvs.y3; // color colors[index++] = color; // increment the batchsize this.sprites[this.currentBatchSize++] = tilingSprite; }; /** * Renders the content and empties the current batch. * * @method flush */ PIXI.WebGLSpriteBatch.prototype.flush = function() { // If the batch is length 0 then return as there is nothing to draw if (this.currentBatchSize===0)return; var gl = this.gl; var shader; if(this.dirty) { this.dirty = false; // bind the main texture gl.activeTexture(gl.TEXTURE0); // bind the buffers gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); shader = this.defaultShader.shaders[gl.id]; // this is the same for each shader? var stride = this.vertSize * 4; gl.vertexAttribPointer(shader.aVertexPosition, 2, gl.FLOAT, false, stride, 0); gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, stride, 2 * 4); // color attributes will be interpreted as unsigned bytes and normalized gl.vertexAttribPointer(shader.colorAttribute, 4, gl.UNSIGNED_BYTE, true, stride, 4 * 4); } // upload the verts to the buffer if(this.currentBatchSize > ( this.size * 0.5 ) ) { gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.vertices); } else { var view = this.positions.subarray(0, this.currentBatchSize * 4 * this.vertSize); gl.bufferSubData(gl.ARRAY_BUFFER, 0, view); } var nextTexture, nextBlendMode, nextShader; var batchSize = 0; var start = 0; var currentBaseTexture = null; var currentBlendMode = this.renderSession.blendModeManager.currentBlendMode; var currentShader = null; var blendSwap = false; var shaderSwap = false; var sprite; for (var i = 0, j = this.currentBatchSize; i < j; i++) { sprite = this.sprites[i]; nextTexture = sprite.texture.baseTexture; nextBlendMode = sprite.blendMode; nextShader = sprite.shader || this.defaultShader; blendSwap = currentBlendMode !== nextBlendMode; shaderSwap = currentShader !== nextShader; // should I use _UIDS??? if(currentBaseTexture !== nextTexture || blendSwap || shaderSwap) { this.renderBatch(currentBaseTexture, batchSize, start); start = i; batchSize = 0; currentBaseTexture = nextTexture; if( blendSwap ) { currentBlendMode = nextBlendMode; this.renderSession.blendModeManager.setBlendMode( currentBlendMode ); } if( shaderSwap ) { currentShader = nextShader; shader = currentShader.shaders[gl.id]; if(!shader) { shader = new PIXI.PixiShader(gl); shader.fragmentSrc =currentShader.fragmentSrc; shader.uniforms =currentShader.uniforms; shader.init(); currentShader.shaders[gl.id] = shader; } // set shader function??? this.renderSession.shaderManager.setShader(shader); if(shader.dirty)shader.syncUniforms(); // both thease only need to be set if they are changing.. // set the projection var projection = this.renderSession.projection; gl.uniform2f(shader.projectionVector, projection.x, projection.y); // TODO - this is temprorary! var offsetVector = this.renderSession.offset; gl.uniform2f(shader.offsetVector, offsetVector.x, offsetVector.y); // set the pointers } } batchSize++; } this.renderBatch(currentBaseTexture, batchSize, start); // then reset the batch! this.currentBatchSize = 0; }; /** * @method renderBatch * @param texture {Texture} * @param size {Number} * @param startIndex {Number} */ PIXI.WebGLSpriteBatch.prototype.renderBatch = function(texture, size, startIndex) { if(size === 0)return; var gl = this.gl; // check if a texture is dirty.. if(texture._dirty[gl.id]) { this.renderSession.renderer.updateTexture(texture); } else { // bind the current texture gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); } // now draw those suckas! gl.drawElements(gl.TRIANGLES, size * 6, gl.UNSIGNED_SHORT, startIndex * 6 * 2); // increment the draw count this.renderSession.drawCount++; }; /** * @method stop */ PIXI.WebGLSpriteBatch.prototype.stop = function() { this.flush(); this.dirty = true; }; /** * @method start */ PIXI.WebGLSpriteBatch.prototype.start = function() { this.dirty = true; }; /** * Destroys the SpriteBatch. * * @method destroy */ PIXI.WebGLSpriteBatch.prototype.destroy = function() { this.vertices = null; this.indices = null; this.gl.deleteBuffer( this.vertexBuffer ); this.gl.deleteBuffer( this.indexBuffer ); this.currentBaseTexture = null; this.gl = null; }; /** * @author Mat Groves * * Big thanks to the very clever Matt DesLauriers <mattdesl> https://github.com/mattdesl/ * for creating the original pixi version! * * Heavily inspired by LibGDX's WebGLSpriteBatch: * https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/graphics/g2d/WebGLSpriteBatch.java */ /** * @class WebGLFastSpriteBatch * @constructor */ PIXI.WebGLFastSpriteBatch = function(gl) { /** * @property vertSize * @type Number */ this.vertSize = 10; /** * @property maxSize * @type Number */ this.maxSize = 6000;//Math.pow(2, 16) / this.vertSize; /** * @property size * @type Number */ this.size = this.maxSize; //the total number of floats in our batch var numVerts = this.size * 4 * this.vertSize; //the total number of indices in our batch var numIndices = this.maxSize * 6; /** * Vertex data * @property vertices * @type Float32Array */ this.vertices = new PIXI.Float32Array(numVerts); /** * Index data * @property indices * @type Uint16Array */ this.indices = new PIXI.Uint16Array(numIndices); /** * @property vertexBuffer * @type Object */ this.vertexBuffer = null; /** * @property indexBuffer * @type Object */ this.indexBuffer = null; /** * @property lastIndexCount * @type Number */ this.lastIndexCount = 0; for (var i=0, j=0; i < numIndices; i += 6, j += 4) { this.indices[i + 0] = j + 0; this.indices[i + 1] = j + 1; this.indices[i + 2] = j + 2; this.indices[i + 3] = j + 0; this.indices[i + 4] = j + 2; this.indices[i + 5] = j + 3; } /** * @property drawing * @type Boolean */ this.drawing = false; /** * @property currentBatchSize * @type Number */ this.currentBatchSize = 0; /** * @property currentBaseTexture * @type BaseTexture */ this.currentBaseTexture = null; /** * @property currentBlendMode * @type Number */ this.currentBlendMode = 0; /** * @property renderSession * @type Object */ this.renderSession = null; /** * @property shader * @type Object */ this.shader = null; /** * @property matrix * @type Matrix */ this.matrix = null; this.setContext(gl); }; PIXI.WebGLFastSpriteBatch.prototype.constructor = PIXI.WebGLFastSpriteBatch; /** * Sets the WebGL Context. * * @method setContext * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.WebGLFastSpriteBatch.prototype.setContext = function(gl) { this.gl = gl; // create a couple of buffers this.vertexBuffer = gl.createBuffer(); this.indexBuffer = gl.createBuffer(); // 65535 is max index, so 65535 / 6 = 10922. //upload the index data gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.vertices, gl.DYNAMIC_DRAW); }; /** * @method begin * @param spriteBatch {WebGLSpriteBatch} * @param renderSession {Object} */ PIXI.WebGLFastSpriteBatch.prototype.begin = function(spriteBatch, renderSession) { this.renderSession = renderSession; this.shader = this.renderSession.shaderManager.fastShader; this.matrix = spriteBatch.worldTransform.toArray(true); this.start(); }; /** * @method end */ PIXI.WebGLFastSpriteBatch.prototype.end = function() { this.flush(); }; /** * @method render * @param spriteBatch {WebGLSpriteBatch} */ PIXI.WebGLFastSpriteBatch.prototype.render = function(spriteBatch) { var children = spriteBatch.children; var sprite = children[0]; // if the uvs have not updated then no point rendering just yet! // check texture. if(!sprite.texture._uvs)return; this.currentBaseTexture = sprite.texture.baseTexture; // check blend mode if(sprite.blendMode !== this.renderSession.blendModeManager.currentBlendMode) { this.flush(); this.renderSession.blendModeManager.setBlendMode(sprite.blendMode); } for(var i=0,j= children.length; i<j; i++) { this.renderSprite(children[i]); } this.flush(); }; /** * @method renderSprite * @param sprite {Sprite} */ PIXI.WebGLFastSpriteBatch.prototype.renderSprite = function(sprite) { //sprite = children[i]; if(!sprite.visible)return; // TODO trim?? if(sprite.texture.baseTexture !== this.currentBaseTexture) { this.flush(); this.currentBaseTexture = sprite.texture.baseTexture; if(!sprite.texture._uvs)return; } var uvs, vertices = this.vertices, width, height, w0, w1, h0, h1, index; uvs = sprite.texture._uvs; width = sprite.texture.frame.width; height = sprite.texture.frame.height; if (sprite.texture.trim) { // if the sprite is trimmed then we need to add the extra space before transforming the sprite coords.. var trim = sprite.texture.trim; w1 = trim.x - sprite.anchor.x * trim.width; w0 = w1 + sprite.texture.crop.width; h1 = trim.y - sprite.anchor.y * trim.height; h0 = h1 + sprite.texture.crop.height; } else { w0 = (sprite.texture.frame.width ) * (1-sprite.anchor.x); w1 = (sprite.texture.frame.width ) * -sprite.anchor.x; h0 = sprite.texture.frame.height * (1-sprite.anchor.y); h1 = sprite.texture.frame.height * -sprite.anchor.y; } index = this.currentBatchSize * 4 * this.vertSize; // xy vertices[index++] = w1; vertices[index++] = h1; vertices[index++] = sprite.position.x; vertices[index++] = sprite.position.y; //scale vertices[index++] = sprite.scale.x; vertices[index++] = sprite.scale.y; //rotation vertices[index++] = sprite.rotation; // uv vertices[index++] = uvs.x0; vertices[index++] = uvs.y1; // color vertices[index++] = sprite.alpha; // xy vertices[index++] = w0; vertices[index++] = h1; vertices[index++] = sprite.position.x; vertices[index++] = sprite.position.y; //scale vertices[index++] = sprite.scale.x; vertices[index++] = sprite.scale.y; //rotation vertices[index++] = sprite.rotation; // uv vertices[index++] = uvs.x1; vertices[index++] = uvs.y1; // color vertices[index++] = sprite.alpha; // xy vertices[index++] = w0; vertices[index++] = h0; vertices[index++] = sprite.position.x; vertices[index++] = sprite.position.y; //scale vertices[index++] = sprite.scale.x; vertices[index++] = sprite.scale.y; //rotation vertices[index++] = sprite.rotation; // uv vertices[index++] = uvs.x2; vertices[index++] = uvs.y2; // color vertices[index++] = sprite.alpha; // xy vertices[index++] = w1; vertices[index++] = h0; vertices[index++] = sprite.position.x; vertices[index++] = sprite.position.y; //scale vertices[index++] = sprite.scale.x; vertices[index++] = sprite.scale.y; //rotation vertices[index++] = sprite.rotation; // uv vertices[index++] = uvs.; vertices[index++] = uvs.y3; // color vertices[index++] = sprite.alpha; // increment the batchs this.currentBatchSize++; if(this.currentBatchSize >= this.size) { this.flush(); } }; /** * @method flush */ PIXI.WebGLFastSpriteBatch.prototype.flush = function() { // If the batch is length 0 then return as there is nothing to draw if (this.currentBatchSize===0)return; var gl = this.gl; // bind the current texture if(!this.currentBaseTexture._glTextures[gl.id])this.renderSession.renderer.updateTexture(this.currentBaseTexture, gl); gl.bindTexture(gl.TEXTURE_2D, this.currentBaseTexture._glTextures[gl.id]); // upload the verts to the buffer if(this.currentBatchSize > ( this.size * 0.5 ) ) { gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.vertices); } else { var view = this.vertices.subarray(0, this.currentBatchSize * 4 * this.vertSize); gl.bufferSubData(gl.ARRAY_BUFFER, 0, view); } // now draw those suckas! gl.drawElements(gl.TRIANGLES, this.currentBatchSize * 6, gl.UNSIGNED_SHORT, 0); // then reset the batch! this.currentBatchSize = 0; // increment the draw count this.renderSession.drawCount++; }; /** * @method stop */ PIXI.WebGLFastSpriteBatch.prototype.stop = function() { this.flush(); }; /** * @method start */ PIXI.WebGLFastSpriteBatch.prototype.start = function() { var gl = this.gl; // bind the main texture gl.activeTexture(gl.TEXTURE0); // bind the buffers gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); // set the projection var projection = this.renderSession.projection; gl.uniform2f(this.shader.projectionVector, projection.x, projection.y); // set the matrix gl.uniformMatrix3fv(this.shader.uMatrix, false, this.matrix); // set the pointers var stride = this.vertSize * 4; gl.vertexAttribPointer(this.shader.aVertexPosition, 2, gl.FLOAT, false, stride, 0); gl.vertexAttribPointer(this.shader.aPositionCoord, 2, gl.FLOAT, false, stride, 2 * 4); gl.vertexAttribPointer(this.shader.aScale, 2, gl.FLOAT, false, stride, 4 * 4); gl.vertexAttribPointer(this.shader.aRotation, 1, gl.FLOAT, false, stride, 6 * 4); gl.vertexAttribPointer(this.shader.aTextureCoord, 2, gl.FLOAT, false, stride, 7 * 4); gl.vertexAttribPointer(this.shader.colorAttribute, 1, gl.FLOAT, false, stride, 9 * 4); }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * @class WebGLFilterManager * @constructor */ PIXI.WebGLFilterManager = function() { /** * @property filterStack * @type Array */ this.filterStack = []; /** * @property offsetX * @type Number */ this.offsetX = 0; /** * @property offsetY * @type Number */ this.offsetY = 0; }; PIXI.WebGLFilterManager.prototype.constructor = PIXI.WebGLFilterManager; /** * Initialises the context and the properties. * * @method setContext * @param gl {WebGLContext} the current WebGL drawing context */ PIXI.WebGLFilterManager.prototype.setContext = function(gl) { this.gl = gl; this.texturePool = []; this.initShaderBuffers(); }; /** * @method begin * @param renderSession {RenderSession} * @param buffer {ArrayBuffer} */ PIXI.WebGLFilterManager.prototype.begin = function(renderSession, buffer) { this.renderSession = renderSession; this.defaultShader = renderSession.shaderManager.defaultShader; var projection = this.renderSession.projection; this.width = projection.x * 2; this.height = -projection.y * 2; this.buffer = buffer; }; /** * Applies the filter and adds it to the current filter stack. * * @method pushFilter * @param filterBlock {Object} the filter that will be pushed to the current filter stack */ PIXI.WebGLFilterManager.prototype.pushFilter = function(filterBlock) { var gl = this.gl; var projection = this.renderSession.projection; var offset = this.renderSession.offset; filterBlock._filterArea = filterBlock.target.filterArea || filterBlock.target.getBounds(); // filter program // OPTIMISATION - the first filter is free if its a simple color change? this.filterStack.push(filterBlock); var filter = filterBlock.filterPasses[0]; this.offsetX += filterBlock._filterArea.x; this.offsetY += filterBlock._filterArea.y; var texture = this.texturePool.pop(); if(!texture) { texture = new PIXI.FilterTexture(this.gl, this.width, this.height); } else { texture.resize(this.width, this.height); } gl.bindTexture(gl.TEXTURE_2D, texture.texture); var filterArea = filterBlock._filterArea;// filterBlock.target.getBounds();///filterBlock.target.filterArea; var padding = filter.padding; filterArea.x -= padding; filterArea.y -= padding; filterArea.width += padding * 2; filterArea.height += padding * 2; // cap filter to screen size.. if(filterArea.x < 0)filterArea.x = 0; if(filterArea.width > this.width)filterArea.width = this.width; if(filterArea.y < 0)filterArea.y = 0; if(filterArea.height > this.height)filterArea.height = this.height; //gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, filterArea.width, filterArea.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); gl.bindFramebuffer(gl.FRAMEBUFFER, texture.frameBuffer); // set view port gl.viewport(0, 0, filterArea.width, filterArea.height); projection.x = filterArea.width/2; projection.y = -filterArea.height/2; offset.x = -filterArea.x; offset.y = -filterArea.y; // update projection // now restore the regular shader.. // this.renderSession.shaderManager.setShader(this.defaultShader); //gl.uniform2f(this.defaultShader.projectionVector, filterArea.width/2, -filterArea.height/2); //gl.uniform2f(this.defaultShader.offsetVector, -filterArea.x, -filterArea.y); gl.colorMask(true, true, true, true); gl.clearColor(0,0,0, 0); gl.clear(gl.COLOR_BUFFER_BIT); filterBlock._glFilterTexture = texture; }; /** * Removes the last filter from the filter stack and doesn't return it. * * @method popFilter */ PIXI.WebGLFilterManager.prototype.popFilter = function() { var gl = this.gl; var filterBlock = this.filterStack.pop(); var filterArea = filterBlock._filterArea; var texture = filterBlock._glFilterTexture; var projection = this.renderSession.projection; var offset = this.renderSession.offset; if(filterBlock.filterPasses.length > 1) { gl.viewport(0, 0, filterArea.width, filterArea.height); gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); this.vertexArray[0] = 0; this.vertexArray[1] = filterArea.height; this.vertexArray[2] = filterArea.width; this.vertexArray[3] = filterArea.height; this.vertexArray[4] = 0; this.vertexArray[5] = 0; this.vertexArray[6] = filterArea.width; this.vertexArray[7] = 0; gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.vertexArray); gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); // now set the uvs.. this.uvArray[2] = filterArea.width/this.width; this.uvArray[5] = filterArea.height/this.height; this.uvArray[6] = filterArea.width/this.width; this.uvArray[7] = filterArea.height/this.height; gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.uvArray); var inputTexture = texture; var outputTexture = this.texturePool.pop(); if(!outputTexture)outputTexture = new PIXI.FilterTexture(this.gl, this.width, this.height); outputTexture.resize(this.width, this.height); // need to clear this FBO as it may have some left over elements from a previous filter. gl.bindFramebuffer(gl.FRAMEBUFFER, outputTexture.frameBuffer ); gl.clear(gl.COLOR_BUFFER_BIT); gl.disable(gl.BLEND); for (var i = 0; i < filterBlock.filterPasses.length-1; i++) { var filterPass = filterBlock.filterPasses[i]; gl.bindFramebuffer(gl.FRAMEBUFFER, outputTexture.frameBuffer ); // set texture gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, inputTexture.texture); // draw texture.. //filterPass.applyFilterPass(filterArea.width, filterArea.height); this.applyFilterPass(filterPass, filterArea, filterArea.width, filterArea.height); // swap the textures.. var temp = inputTexture; inputTexture = outputTexture; outputTexture = temp; } gl.enable(gl.BLEND); texture = inputTexture; this.texturePool.push(outputTexture); } var filter = filterBlock.filterPasses[filterBlock.filterPasses.length-1]; this.offsetX -= filterArea.x; this.offsetY -= filterArea.y; var sizeX = this.width; var sizeY = this.height; var offsetX = 0; var offsetY = 0; var buffer = this.buffer; // time to render the filters texture to the previous scene if(this.filterStack.length === 0) { gl.colorMask(true, true, true, true);//this.transparent); } else { var currentFilter = this.filterStack[this.filterStack.length-1]; filterArea = currentFilter._filterArea; sizeX = filterArea.width; sizeY = filterArea.height; offsetX = filterArea.x; offsetY = filterArea.y; buffer = currentFilter._glFilterTexture.frameBuffer; } // TODO need to remove these global elements.. projection.x = sizeX/2; projection.y = -sizeY/2; offset.x = offsetX; offset.y = offsetY; filterArea = filterBlock._filterArea; var x = filterArea.x-offsetX; var y = filterArea.y-offsetY; // update the buffers.. // make sure to flip the y! gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); this.vertexArray[0] = x; this.vertexArray[1] = y + filterArea.height; this.vertexArray[2] = x + filterArea.width; this.vertexArray[3] = y + filterArea.height; this.vertexArray[4] = x; this.vertexArray[5] = y; this.vertexArray[6] = x + filterArea.width; this.vertexArray[7] = y; gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.vertexArray); gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); this.uvArray[2] = filterArea.width/this.width; this.uvArray[5] = filterArea.height/this.height; this.uvArray[6] = filterArea.width/this.width; this.uvArray[7] = filterArea.height/this.height; gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.uvArray); gl.viewport(0, 0, sizeX * this.renderSession.resolution, sizeY * this.renderSession.resolution); // bind the buffer gl.bindFramebuffer(gl.FRAMEBUFFER, buffer ); // set the blend mode! //gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA) // set texture gl.activeTexture(gl.TEXTURE0); gl.bindTexture(gl.TEXTURE_2D, texture.texture); // apply! this.applyFilterPass(filter, filterArea, sizeX, sizeY); // now restore the regular shader.. should happen automatically now.. // this.renderSession.shaderManager.setShader(this.defaultShader); // gl.uniform2f(this.defaultShader.projectionVector, sizeX/2, -sizeY/2); // gl.uniform2f(this.defaultShader.offsetVector, -offsetX, -offsetY); // return the texture to the pool this.texturePool.push(texture); filterBlock._glFilterTexture = null; }; /** * Applies the filter to the specified area. * * @method applyFilterPass * @param filter {AbstractFilter} the filter that needs to be applied * @param filterArea {Texture} TODO - might need an update * @param width {Number} the horizontal range of the filter * @param height {Number} the vertical range of the filter */ PIXI.WebGLFilterManager.prototype.applyFilterPass = function(filter, filterArea, width, height) { // use program var gl = this.gl; var shader = filter.shaders[gl.id]; if(!shader) { shader = new PIXI.PixiShader(gl); shader.fragmentSrc = filter.fragmentSrc; shader.uniforms = filter.uniforms; shader.init(); filter.shaders[gl.id] = shader; } // set the shader this.renderSession.shaderManager.setShader(shader); // gl.useProgram(shader.program); gl.uniform2f(shader.projectionVector, width/2, -height/2); gl.uniform2f(shader.offsetVector, 0,0); if(filter.uniforms.dimensions) { filter.uniforms.dimensions.value[0] = this.width;//width; filter.uniforms.dimensions.value[1] = this.height;//height; filter.uniforms.dimensions.value[2] = this.vertexArray[0]; filter.uniforms.dimensions.value[3] = this.vertexArray[5];//filterArea.height; } shader.syncUniforms(); gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); gl.vertexAttribPointer(shader.aVertexPosition, 2, gl.FLOAT, false, 0, 0); gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0); gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer); gl.vertexAttribPointer(shader.colorAttribute, 2, gl.FLOAT, false, 0, 0); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); // draw the filter... gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); this.renderSession.drawCount++; }; /** * Initialises the shader buffers. * * @method initShaderBuffers */ PIXI.WebGLFilterManager.prototype.initShaderBuffers = function() { var gl = this.gl; // create some buffers this.vertexBuffer = gl.createBuffer(); this.uvBuffer = gl.createBuffer(); this.colorBuffer = gl.createBuffer(); this.indexBuffer = gl.createBuffer(); // bind and upload the vertexs.. // keep a reference to the vertexFloatData.. this.vertexArray = new PIXI.Float32Array([0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0]); gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.vertexArray, gl.STATIC_DRAW); // bind and upload the uv buffer this.uvArray = new PIXI.Float32Array([0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0]); gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.uvArray, gl.STATIC_DRAW); this.colorArray = new PIXI.Float32Array([1.0, 0xFFFFFF, 1.0, 0xFFFFFF, 1.0, 0xFFFFFF, 1.0, 0xFFFFFF]); gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.colorArray, gl.STATIC_DRAW); // bind and upload the index gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([0, 1, 2, 1, 3, 2]), gl.STATIC_DRAW); }; /** * Destroys the filter and removes it from the filter stack. * * @method destroy */ PIXI.WebGLFilterManager.prototype.destroy = function() { var gl = this.gl; this.filterStack = null; this.offsetX = 0; this.offsetY = 0; // destroy textures for (var i = 0; i < this.texturePool.length; i++) { this.texturePool[i].destroy(); } this.texturePool = null; //destroy buffers.. gl.deleteBuffer(this.vertexBuffer); gl.deleteBuffer(this.uvBuffer); gl.deleteBuffer(this.colorBuffer); gl.deleteBuffer(this.indexBuffer); }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * @class FilterTexture * @constructor * @param gl {WebGLContext} the current WebGL drawing context * @param width {Number} the horizontal range of the filter * @param height {Number} the vertical range of the filter * @param scaleMode {Number} See {{#crossLink "PIXI/scaleModes:property"}}PIXI.scaleModes{{/crossLink}} for possible values */ PIXI.FilterTexture = function(gl, width, height, scaleMode) { /** * @property gl * @type WebGLContext */ this.gl = gl; // next time to create a frame buffer and texture /** * @property frameBuffer * @type Any */ this.frameBuffer = gl.createFramebuffer(); /** * @property texture * @type Any */ this.texture = gl.createTexture(); /** * @property scaleMode * @type Number */ scaleMode = scaleMode || PIXI.scaleModes.DEFAULT; gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.bindFramebuffer(gl.FRAMEBUFFER, this.frameBuffer ); gl.bindFramebuffer(gl.FRAMEBUFFER, this.frameBuffer ); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0); // required for masking a mask?? this.renderBuffer = gl.createRenderbuffer(); gl.bindRenderbuffer(gl.RENDERBUFFER, this.renderBuffer); gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, this.renderBuffer); this.resize(width, height); }; PIXI.FilterTexture.prototype.constructor = PIXI.FilterTexture; /** * Clears the filter texture. * * @method clear */ PIXI.FilterTexture.prototype.clear = function() { var gl = this.gl; gl.clearColor(0,0,0, 0); gl.clear(gl.COLOR_BUFFER_BIT); }; /** * Resizes the texture to the specified width and height * * @method resize * @param width {Number} the new width of the texture * @param height {Number} the new height of the texture */ PIXI.FilterTexture.prototype.resize = function(width, height) { if(this.width === width && this.height === height) return; this.width = width; this.height = height; var gl = this.gl; gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width , height , 0, gl.RGBA, gl.UNSIGNED_BYTE, null); // update the stencil buffer width and height gl.bindRenderbuffer(gl.RENDERBUFFER, this.renderBuffer); gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width , height ); }; /** * Destroys the filter texture. * * @method destroy */ PIXI.FilterTexture.prototype.destroy = function() { var gl = this.gl; gl.deleteFramebuffer( this.frameBuffer ); gl.deleteTexture( this.texture ); this.frameBuffer = null; this.texture = null; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * Creates a Canvas element of the given size. * * @class CanvasBuffer * @constructor * @param width {Number} the width for the newly created canvas * @param height {Number} the height for the newly created canvas */ PIXI.CanvasBuffer = function(width, height) { /** * The width of the Canvas in pixels. * * @property width * @type Number */ this.width = width; /** * The height of the Canvas in pixels. * * @property height * @type Number */ this.height = height; /** * The Canvas object that belongs to this CanvasBuffer. * * @property canvas * @type HTMLCanvasElement */ this.canvas = document.createElement("canvas"); /** * A CanvasRenderingContext2D object representing a two-dimensional rendering context. * * @property context * @type CanvasRenderingContext2D */ this.context = this.canvas.getContext("2d"); this.canvas.width = width; this.canvas.height = height; }; PIXI.CanvasBuffer.prototype.constructor = PIXI.CanvasBuffer; /** * Clears the canvas that was created by the CanvasBuffer class. * * @method clear * @private */ PIXI.CanvasBuffer.prototype.clear = function() { this.context.setTransform(1, 0, 0, 1, 0, 0); this.context.clearRect(0,0, this.width, this.height); }; /** * Resizes the canvas to the specified width and height. * * @method resize * @param width {Number} the new width of the canvas * @param height {Number} the new height of the canvas */ PIXI.CanvasBuffer.prototype.resize = function(width, height) { this.width = this.canvas.width = width; this.height = this.canvas.height = height; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * A set of functions used to handle masking. * * @class CanvasMaskManager * @constructor */ PIXI.CanvasMaskManager = function() { }; PIXI.CanvasMaskManager.prototype.constructor = PIXI.CanvasMaskManager; /** * This method adds it to the current stack of masks. * * @method pushMask * @param maskData {Object} the maskData that will be pushed * @param renderSession {Object} The renderSession whose context will be used for this mask manager. */ PIXI.CanvasMaskManager.prototype.pushMask = function(maskData, renderSession) { var context = renderSession.context; context.save(); var cacheAlpha = maskData.alpha; var transform = maskData.worldTransform; var resolution = renderSession.resolution; context.setTransform(transform.a * resolution, transform.b * resolution, transform.c * resolution, transform.d * resolution, transform.tx * resolution, transform.ty * resolution); PIXI.CanvasGraphics.renderGraphicsMask(maskData, context); context.clip(); maskData.worldAlpha = cacheAlpha; }; /** * Restores the current drawing context to the state it was before the mask was applied. * * @method popMask * @param renderSession {Object} The renderSession whose context will be used for this mask manager. */ PIXI.CanvasMaskManager.prototype.popMask = function(renderSession) { renderSession.context.restore(); }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * Utility methods for Sprite/Texture tinting. * * @class CanvasTinter * @static */ PIXI.CanvasTinter = function() { }; /** * Basically this method just needs a sprite and a color and tints the sprite with the given color. * * @method getTintedTexture * @static * @param sprite {Sprite} the sprite to tint * @param color {Number} the color to use to tint the sprite with * @return {HTMLCanvasElement} The tinted canvas */ PIXI.CanvasTinter.getTintedTexture = function(sprite, color) { var texture = sprite.texture; color = PIXI.CanvasTinter.roundColor(color); var stringColor = "#" + ("00000" + ( color | 0).toString(16)).substr(-6); texture.tintCache = texture.tintCache || {}; if(texture.tintCache[stringColor]) return texture.tintCache[stringColor]; // clone texture.. var canvas = PIXI.CanvasTinter.canvas || document.createElement("canvas"); //PIXI.CanvasTinter.tintWithPerPixel(texture, stringColor, canvas); PIXI.CanvasTinter.tintMethod(texture, color, canvas); if(PIXI.CanvasTinter.convertTintToImage) { // is this better? var tintImage = new Image(); tintImage.src = canvas.toDataURL(); texture.tintCache[stringColor] = tintImage; } else { texture.tintCache[stringColor] = canvas; // if we are not converting the texture to an image then we need to lose the reference to the canvas PIXI.CanvasTinter.canvas = null; } return canvas; }; /** * Tint a texture using the "multiply" operation. * * @method tintWithMultiply * @static * @param texture {Texture} the texture to tint * @param color {Number} the color to use to tint the sprite with * @param canvas {HTMLCanvasElement} the current canvas */ PIXI.CanvasTinter.tintWithMultiply = function(texture, color, canvas) { var context = canvas.getContext( "2d" ); var crop = texture.crop; canvas.width = crop.width; canvas.height = crop.height; context.fillStyle = "#" + ("00000" + ( color | 0).toString(16)).substr(-6); context.fillRect(0, 0, crop.width, crop.height); context.globalCompositeOperation = "multiply"; context.drawImage(texture.baseTexture.source, crop.x, crop.y, crop.width, crop.height, 0, 0, crop.width, crop.height); context.globalCompositeOperation = "destination-atop"; context.drawImage(texture.baseTexture.source, crop.x, crop.y, crop.width, crop.height, 0, 0, crop.width, crop.height); }; /** * Tint a texture using the "overlay" operation. * * @method tintWithOverlay * @static * @param texture {Texture} the texture to tint * @param color {Number} the color to use to tint the sprite with * @param canvas {HTMLCanvasElement} the current canvas */ PIXI.CanvasTinter.tintWithOverlay = function(texture, color, canvas) { var context = canvas.getContext( "2d" ); var crop = texture.crop; canvas.width = crop.width; canvas.height = crop.height; context.globalCompositeOperation = "copy"; context.fillStyle = "#" + ("00000" + ( color | 0).toString(16)).substr(-6); context.fillRect(0, 0, crop.width, crop.height); context.globalCompositeOperation = "destination-atop"; context.drawImage(texture.baseTexture.source, crop.x, crop.y, crop.width, crop.height, 0, 0, crop.width, crop.height); //context.globalCompositeOperation = "copy"; }; /** * Tint a texture pixel per pixel. * * @method tintPerPixel * @static * @param texture {Texture} the texture to tint * @param color {Number} the color to use to tint the sprite with * @param canvas {HTMLCanvasElement} the current canvas */ PIXI.CanvasTinter.tintWithPerPixel = function(texture, color, canvas) { var context = canvas.getContext( "2d" ); var crop = texture.crop; canvas.width = crop.width; canvas.height = crop.height; context.globalCompositeOperation = "copy"; context.drawImage(texture.baseTexture.source, crop.x, crop.y, crop.width, crop.height, 0, 0, crop.width, crop.height); var rgbValues = PIXI.hex2rgb(color); var r = rgbValues[0], g = rgbValues[1], b = rgbValues[2]; var pixelData = context.getImageData(0, 0, crop.width, crop.height); var pixels = pixelData.data; for (var i = 0; i < pixels.length; i += 4) { pixels[i+0] *= r; pixels[i+1] *= g; pixels[i+2] *= b; } context.putImageData(pixelData, 0, 0); }; /** * Rounds the specified color according to the PIXI.CanvasTinter.cacheStepsPerColorChannel. * * @method roundColor * @static * @param color {number} the color to round, should be a hex color */ PIXI.CanvasTinter.roundColor = function(color) { var step = PIXI.CanvasTinter.cacheStepsPerColorChannel; var rgbValues = PIXI.hex2rgb(color); rgbValues[0] = Math.min(255, (rgbValues[0] / step) * step); rgbValues[1] = Math.min(255, (rgbValues[1] / step) * step); rgbValues[2] = Math.min(255, (rgbValues[2] / step) * step); return PIXI.rgb2hex(rgbValues); }; /** * Number of steps which will be used as a cap when rounding colors. * * @property cacheStepsPerColorChannel * @type Number * @static */ PIXI.CanvasTinter.cacheStepsPerColorChannel = 8; /** * Tint cache boolean flag. * * @property convertTintToImage * @type Boolean * @static */ PIXI.CanvasTinter.convertTintToImage = false; /** * Whether or not the Canvas BlendModes are supported, consequently the ability to tint using the multiply method. * * @property canUseMultiply * @type Boolean * @static */ PIXI.CanvasTinter.canUseMultiply = PIXI.canUseNewCanvasBlendModes(); /** * The tinting method that will be used. * * @method tintMethod * @static */ PIXI.CanvasTinter.tintMethod = PIXI.CanvasTinter.canUseMultiply ? PIXI.CanvasTinter.tintWithMultiply : PIXI.CanvasTinter.tintWithPerPixel; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The CanvasRenderer draws the Stage and all its content onto a 2d canvas. This renderer should be used for browsers that do not support webGL. * Don't forget to add the CanvasRenderer.view to your DOM or you will not see anything * * @class CanvasRenderer * @constructor * @param [width=800] {Number} the width of the canvas view * @param [height=600] {Number} the height of the canvas view * @param [options] {Object} The optional renderer parameters * @param [options.view] {HTMLCanvasElement} the canvas to use as a view, optional * @param [options.transparent=false] {Boolean} If the render view is transparent, default false * @param [options.autoResize=false] {Boolean} If the render view is automatically resized, default false * @param [options.resolution=1] {Number} the resolution of the renderer retina would be 2 * @param [options.clearBeforeRender=true] {Boolean} This sets if the CanvasRenderer will clear the canvas or not before the new render pass. */ PIXI.CanvasRenderer = function(width, height, options) { if(options) { for (var i in PIXI.defaultRenderOptions) { if (typeof options[i] === "undefined") options[i] = PIXI.defaultRenderOptions[i]; } } else { options = PIXI.defaultRenderOptions; } if(!PIXI.defaultRenderer) { PIXI.sayHello("Canvas"); PIXI.defaultRenderer = this; } /** * The renderer type. * * @property type * @type Number */ this.type = PIXI.CANVAS_RENDERER; /** * The resolution of the canvas. * * @property resolution * @type Number */ this.resolution = options.resolution; /** * This sets if the CanvasRenderer will clear the canvas or not before the new render pass. * If the Stage is NOT transparent Pixi will use a canvas sized fillRect operation every frame to set the canvas background color. * If the Stage is transparent Pixi will use clearRect to clear the canvas every frame. * Disable this by setting this to false. For example if your game has a canvas filling background image you often don't need this set. * * @property clearBeforeRender * @type Boolean * @default */ this.clearBeforeRender = options.clearBeforeRender; /** * Whether the render view is transparent * * @property transparent * @type Boolean */ this.transparent = options.transparent; /** * Whether the render view should be resized automatically * * @property autoResize * @type Boolean */ this.autoResize = options.autoResize || false; /** * The width of the canvas view * * @property width * @type Number * @default 800 */ this.width = width || 800; /** * The height of the canvas view * * @property height * @type Number * @default 600 */ this.height = height || 600; this.width *= this.resolution; this.height *= this.resolution; /** * The canvas element that everything is drawn to. * * @property view * @type HTMLCanvasElement */ this.view = options.view || document.createElement( "canvas" ); /** * The canvas 2d context that everything is drawn with * @property context * @type CanvasRenderingContext2D */ this.context = this.view.getContext( "2d", { alpha: this.transparent } ); /** * Boolean flag controlling canvas refresh. * * @property refresh * @type Boolean */ this.refresh = true; this.view.width = this.width * this.resolution; this.view.height = this.height * this.resolution; /** * Internal var. * * @property count * @type Number */ this.count = 0; /** * Instance of a PIXI.CanvasMaskManager, handles masking when using the canvas renderer * @property maskManager * @type CanvasMaskManager */ this.maskManager = new PIXI.CanvasMaskManager(); /** * The render session is just a bunch of parameter used for rendering * @property renderSession * @type Object */ this.renderSession = { context: this.context, maskManager: this.maskManager, scaleMode: null, smoothProperty: null, /** * If true Pixi will Math.floor() x/y values when rendering, stopping pixel interpolation. * Handy for crisp pixel art and speed on legacy devices. * */ roundPixels: false }; this.mapBlendModes(); this.resize(width, height); if("imageSmoothingEnabled" in this.context) this.renderSession.smoothProperty = "imageSmoothingEnabled"; else if("webkitImageSmoothingEnabled" in this.context) this.renderSession.smoothProperty = "webkitImageSmoothingEnabled"; else if("mozImageSmoothingEnabled" in this.context) this.renderSession.smoothProperty = "mozImageSmoothingEnabled"; else if("oImageSmoothingEnabled" in this.context) this.renderSession.smoothProperty = "oImageSmoothingEnabled"; else if ("msImageSmoothingEnabled" in this.context) this.renderSession.smoothProperty = "msImageSmoothingEnabled"; }; // constructor PIXI.CanvasRenderer.prototype.constructor = PIXI.CanvasRenderer; /** * Renders the Stage to this canvas view * * @method render * @param stage {Stage} the Stage element to be rendered */ PIXI.CanvasRenderer.prototype.render = function(stage) { stage.updateTransform(); this.context.setTransform(1,0,0,1,0,0); this.context.globalAlpha = 1; this.renderSession.currentBlendMode = PIXI.blendModes.NORMAL; this.context.globalCompositeOperation = PIXI.blendModesCanvas[PIXI.blendModes.NORMAL]; if (navigator.isCocoonJS && this.view.screencanvas) { this.context.fillStyle = "black"; this.context.clear(); } if (this.clearBeforeRender) { if (this.transparent) { this.context.clearRect(0, 0, this.width, this.height); } else { this.context.fillStyle = stage.backgroundColorString; this.context.fillRect(0, 0, this.width , this.height); } } this.renderDisplayObject(stage); // run interaction! if(stage.interactive) { //need to add some events! if(!stage._interactiveEventsAdded) { stage._interactiveEventsAdded = true; stage.interactionManager.setTarget(this); } } }; /** * Removes everything from the renderer and optionally removes the Canvas DOM element. * * @method destroy * @param [removeView=true] {boolean} Removes the Canvas element from the DOM. */ PIXI.CanvasRenderer.prototype.destroy = function(removeView) { if (typeof removeView === "undefined") { removeView = true; } if (removeView && this.view.parent) { this.view.parent.removeChild(this.view); } this.view = null; this.context = null; this.maskManager = null; this.renderSession = null; }; /** * Resizes the canvas view to the specified width and height * * @method resize * @param width {Number} the new width of the canvas view * @param height {Number} the new height of the canvas view */ PIXI.CanvasRenderer.prototype.resize = function(width, height) { this.width = width * this.resolution; this.height = height * this.resolution; this.view.width = this.width; this.view.height = this.height; if (this.autoResize) { this.view.style.width = this.width / this.resolution + "px"; this.view.style.height = this.height / this.resolution + "px"; } }; /** * Renders a display object * * @method renderDisplayObject * @param displayObject {DisplayObject} The displayObject to render * @param context {CanvasRenderingContext2D} the context 2d method of the canvas * @private */ PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject, context) { this.renderSession.context = context || this.context; this.renderSession.resolution = this.resolution; displayObject._renderCanvas(this.renderSession); }; /** * Maps Pixi blend modes to canvas blend modes. * * @method mapBlendModes * @private */ PIXI.CanvasRenderer.prototype.mapBlendModes = function() { if(!PIXI.blendModesCanvas) { PIXI.blendModesCanvas = []; if(PIXI.canUseNewCanvasBlendModes()) { PIXI.blendModesCanvas[PIXI.blendModes.NORMAL] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.ADD] = "lighter"; //IS THIS OK??? PIXI.blendModesCanvas[PIXI.blendModes.MULTIPLY] = "multiply"; PIXI.blendModesCanvas[PIXI.blendModes.SCREEN] = "screen"; PIXI.blendModesCanvas[PIXI.blendModes.OVERLAY] = "overlay"; PIXI.blendModesCanvas[PIXI.blendModes.DARKEN] = "darken"; PIXI.blendModesCanvas[PIXI.blendModes.LIGHTEN] = "lighten"; PIXI.blendModesCanvas[PIXI.blendModes.COLOR_DODGE] = "color-dodge"; PIXI.blendModesCanvas[PIXI.blendModes.COLOR_BURN] = "color-burn"; PIXI.blendModesCanvas[PIXI.blendModes.HARD_LIGHT] = "hard-light"; PIXI.blendModesCanvas[PIXI.blendModes.SOFT_LIGHT] = "soft-light"; PIXI.blendModesCanvas[PIXI.blendModes.DIFFERENCE] = "difference"; PIXI.blendModesCanvas[PIXI.blendModes.EXCLUSION] = "exclusion"; PIXI.blendModesCanvas[PIXI.blendModes.HUE] = "hue"; PIXI.blendModesCanvas[PIXI.blendModes.SATURATION] = "saturation"; PIXI.blendModesCanvas[PIXI.blendModes.COLOR] = "color"; PIXI.blendModesCanvas[PIXI.blendModes.LUMINOSITY] = "luminosity"; } else { // this means that the browser does not support the cool new blend modes in canvas "cough" ie "cough" PIXI.blendModesCanvas[PIXI.blendModes.NORMAL] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.ADD] = "lighter"; //IS THIS OK??? PIXI.blendModesCanvas[PIXI.blendModes.MULTIPLY] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.SCREEN] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.OVERLAY] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.DARKEN] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.LIGHTEN] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.COLOR_DODGE] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.COLOR_BURN] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.HARD_LIGHT] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.SOFT_LIGHT] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.DIFFERENCE] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.EXCLUSION] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.HUE] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.SATURATION] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.COLOR] = "source-over"; PIXI.blendModesCanvas[PIXI.blendModes.LUMINOSITY] = "source-over"; } } }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * A set of functions used by the canvas renderer to draw the primitive graphics data. * * @class CanvasGraphics * @static */ PIXI.CanvasGraphics = function() { }; /* * Renders a PIXI.Graphics object to a canvas. * * @method renderGraphics * @static * @param graphics {Graphics} the actual graphics object to render * @param context {CanvasRenderingContext2D} the 2d drawing method of the canvas */ PIXI.CanvasGraphics.renderGraphics = function(graphics, context) { var worldAlpha = graphics.worldAlpha; if(graphics.dirty) { this.updateGraphicsTint(graphics); graphics.dirty = false; } for (var i = 0; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; var shape = data.shape; var fillColor = data._fillTint; var lineColor = data._lineTint; context.lineWidth = data.lineWidth; if(data.type === PIXI.Graphics.POLY) { context.beginPath(); var points = shape.points; context.moveTo(points[0], points[1]); for (var j=1; j < points.length/2; j++) { context.lineTo(points[j * 2], points[j * 2 + 1]); } if(shape.closed) { context.lineTo(points[0], points[1]); } // if the first and last point are the same close the path - much neater if(points[0] === points[points.length-2] && points[1] === points[points.length-1]) { context.closePath(); } if(data.fill) { context.globalAlpha = data.fillAlpha * worldAlpha; context.fillStyle = '#' + ('00000' + ( fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { context.globalAlpha = data.lineAlpha * worldAlpha; context.strokeStyle = '#' + ('00000' + ( lineColor | 0).toString(16)).substr(-6); context.stroke(); } } else if(data.type === PIXI.Graphics.RECT) { if(data.fillColor || data.fillColor === 0) { context.globalAlpha = data.fillAlpha * worldAlpha; context.fillStyle = '#' + ('00000' + ( fillColor | 0).toString(16)).substr(-6); context.fillRect(shape.x, shape.y, shape.width, shape.height); } if(data.lineWidth) { context.globalAlpha = data.lineAlpha * worldAlpha; context.strokeStyle = '#' + ('00000' + ( lineColor | 0).toString(16)).substr(-6); context.strokeRect(shape.x, shape.y, shape.width, shape.height); } } else if(data.type === PIXI.Graphics.CIRC) { // TODO - need to be Undefined! context.beginPath(); context.arc(shape.x, shape.y, shape.radius,0,2*Math.PI); context.closePath(); if(data.fill) { context.globalAlpha = data.fillAlpha * worldAlpha; context.fillStyle = '#' + ('00000' + ( fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { context.globalAlpha = data.lineAlpha * worldAlpha; context.strokeStyle = '#' + ('00000' + ( lineColor | 0).toString(16)).substr(-6); context.stroke(); } } else if(data.type === PIXI.Graphics.ELIP) { // ellipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas var w = shape.width * 2; var h = shape.height * 2; var x = shape.x - w/2; var y = shape.y - h/2; context.beginPath(); var kappa = 0.5522848, ox = (w / 2) * kappa, // control point offset horizontal oy = (h / 2) * kappa, // control point offset vertical xe = x + w, // x-end ye = y + h, // y-end xm = x + w / 2, // x-middle ym = y + h / 2; // y-middle context.moveTo(x, ym); context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); context.closePath(); if(data.fill) { context.globalAlpha = data.fillAlpha * worldAlpha; context.fillStyle = '#' + ('00000' + ( fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { context.globalAlpha = data.lineAlpha * worldAlpha; context.strokeStyle = '#' + ('00000' + ( lineColor | 0).toString(16)).substr(-6); context.stroke(); } } else if (data.type === PIXI.Graphics.RREC) { var rx = shape.x; var ry = shape.y; var width = shape.width; var height = shape.height; var radius = shape.radius; var maxRadius = Math.min(width, height) / 2 | 0; radius = radius > maxRadius ? maxRadius : radius; context.beginPath(); context.moveTo(rx, ry + radius); context.lineTo(rx, ry + height - radius); context.quadraticCurveTo(rx, ry + height, rx + radius, ry + height); context.lineTo(rx + width - radius, ry + height); context.quadraticCurveTo(rx + width, ry + height, rx + width, ry + height - radius); context.lineTo(rx + width, ry + radius); context.quadraticCurveTo(rx + width, ry, rx + width - radius, ry); context.lineTo(rx + radius, ry); context.quadraticCurveTo(rx, ry, rx, ry + radius); context.closePath(); if(data.fillColor || data.fillColor === 0) { context.globalAlpha = data.fillAlpha * worldAlpha; context.fillStyle = '#' + ('00000' + ( fillColor | 0).toString(16)).substr(-6); context.fill(); } if(data.lineWidth) { context.globalAlpha = data.lineAlpha * worldAlpha; context.strokeStyle = '#' + ('00000' + ( lineColor | 0).toString(16)).substr(-6); context.stroke(); } } } }; /* * Renders a graphics mask * * @static * @private * @method renderGraphicsMask * @param graphics {Graphics} the graphics which will be used as a mask * @param context {CanvasRenderingContext2D} the context 2d method of the canvas */ PIXI.CanvasGraphics.renderGraphicsMask = function(graphics, context) { var len = graphics.graphicsData.length; if(len === 0) return; if(len > 1) { len = 1; window.console.log('Pixi.js warning: masks in canvas can only mask using the first path in the graphics object'); } for (var i = 0; i < 1; i++) { var data = graphics.graphicsData[i]; var shape = data.shape; if(data.type === PIXI.Graphics.POLY) { context.beginPath(); var points = shape.points; context.moveTo(points[0], points[1]); for (var j=1; j < points.length/2; j++) { context.lineTo(points[j * 2], points[j * 2 + 1]); } // if the first and last point are the same close the path - much neater if(points[0] === points[points.length-2] && points[1] === points[points.length-1]) { context.closePath(); } } else if(data.type === PIXI.Graphics.RECT) { context.beginPath(); context.rect(shape.x, shape.y, shape.width, shape.height); context.closePath(); } else if(data.type === PIXI.Graphics.CIRC) { // TODO - need to be Undefined! context.beginPath(); context.arc(shape.x, shape.y, shape.radius,0,2*Math.PI); context.closePath(); } else if(data.type === PIXI.Graphics.ELIP) { // ellipse code taken from: http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas var w = shape.width * 2; var h = shape.height * 2; var x = shape.x - w/2; var y = shape.y - h/2; context.beginPath(); var kappa = 0.5522848, ox = (w / 2) * kappa, // control point offset horizontal oy = (h / 2) * kappa, // control point offset vertical xe = x + w, // x-end ye = y + h, // y-end xm = x + w / 2, // x-middle ym = y + h / 2; // y-middle context.moveTo(x, ym); context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); context.closePath(); } else if (data.type === PIXI.Graphics.RREC) { var pts = shape.points; var rx = pts[0]; var ry = pts[1]; var width = pts[2]; var height = pts[3]; var radius = pts[4]; var maxRadius = Math.min(width, height) / 2 | 0; radius = radius > maxRadius ? maxRadius : radius; context.beginPath(); context.moveTo(rx, ry + radius); context.lineTo(rx, ry + height - radius); context.quadraticCurveTo(rx, ry + height, rx + radius, ry + height); context.lineTo(rx + width - radius, ry + height); context.quadraticCurveTo(rx + width, ry + height, rx + width, ry + height - radius); context.lineTo(rx + width, ry + radius); context.quadraticCurveTo(rx + width, ry, rx + width - radius, ry); context.lineTo(rx + radius, ry); context.quadraticCurveTo(rx, ry, rx, ry + radius); context.closePath(); } } }; PIXI.CanvasGraphics.updateGraphicsTint = function(graphics) { if(graphics.tint === 0xFFFFFF)return; var tintR = (graphics.tint >> 16 & 0xFF) / 255; var tintG = (graphics.tint >> 8 & 0xFF) / 255; var tintB = (graphics.tint & 0xFF)/ 255; for (var i = 0; i < graphics.graphicsData.length; i++) { var data = graphics.graphicsData[i]; var fillColor = data.fillColor | 0; var lineColor = data.lineColor | 0; /* var colorR = (fillColor >> 16 & 0xFF) / 255; var colorG = (fillColor >> 8 & 0xFF) / 255; var colorB = (fillColor & 0xFF) / 255; colorR *= tintR; colorG *= tintG; colorB *= tintB; fillColor = ((colorR*255 << 16) + (colorG*255 << 8) + colorB*255); colorR = (lineColor >> 16 & 0xFF) / 255; colorG = (lineColor >> 8 & 0xFF) / 255; colorB = (lineColor & 0xFF) / 255; colorR *= tintR; colorG *= tintG; colorB *= tintB; lineColor = ((colorR*255 << 16) + (colorG*255 << 8) + colorB*255); */ // super inline cos im an optimization NAZI data._fillTint = (((fillColor >> 16 & 0xFF) / 255 * tintR*255 << 16) + ((fillColor >> 8 & 0xFF) / 255 * tintG*255 << 8) + (fillColor & 0xFF) / 255 * tintB*255); data._lineTint = (((lineColor >> 16 & 0xFF) / 255 * tintR*255 << 16) + ((lineColor >> 8 & 0xFF) / 255 * tintG*255 << 8) + (lineColor & 0xFF) / 255 * tintB*255); } }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The Graphics class contains methods used to draw primitive shapes such as lines, circles and rectangles to the display, and color and fill them. * * @class Graphics * @extends DisplayObjectContainer * @constructor */ PIXI.Graphics = function() { PIXI.DisplayObjectContainer.call( this ); this.renderable = true; /** * The alpha value used when filling the Graphics object. * * @property fillAlpha * @type Number */ this.fillAlpha = 1; /** * The width (thickness) of any lines drawn. * * @property lineWidth * @type Number */ this.lineWidth = 0; /** * The color of any lines drawn. * * @property lineColor * @type String * @default 0 */ this.lineColor = 0; /** * Graphics data * * @property graphicsData * @type Array * @private */ this.graphicsData = []; /** * The tint applied to the graphic shape. This is a hex value. Apply a value of 0xFFFFFF to reset the tint. * * @property tint * @type Number * @default 0xFFFFFF */ this.tint = 0xFFFFFF; /** * The blend mode to be applied to the graphic shape. Apply a value of PIXI.blendModes.NORMAL to reset the blend mode. * * @property blendMode * @type Number * @default PIXI.blendModes.NORMAL; */ this.blendMode = PIXI.blendModes.NORMAL; /** * Current path * * @property currentPath * @type Object * @private */ this.currentPath = null; /** * Array containing some WebGL-related properties used by the WebGL renderer. * * @property _webGL * @type Array * @private */ this._webGL = []; /** * Whether this shape is being used as a mask. * * @property isMask * @type Boolean */ this.isMask = false; /** * The bounds' padding used for bounds calculation. * * @property boundsPadding * @type Number */ this.boundsPadding = 0; this._localBounds = new PIXI.Rectangle(0,0,1,1); /** * Used to detect if the graphics object has changed. If this is set to true then the graphics object will be recalculated. * * @property dirty * @type Boolean * @private */ this.dirty = true; /** * Used to detect if the webgl graphics object has changed. If this is set to true then the graphics object will be recalculated. * * @property webGLDirty * @type Boolean * @private */ this.webGLDirty = false; /** * Used to detect if the cached sprite object needs to be updated. * * @property cachedSpriteDirty * @type Boolean * @private */ this.cachedSpriteDirty = false; }; // constructor PIXI.Graphics.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); PIXI.Graphics.prototype.constructor = PIXI.Graphics; /** * When cacheAsBitmap is set to true the graphics object will be rendered as if it was a sprite. * This is useful if your graphics element does not change often, as it will speed up the rendering of the object in exchange for taking up texture memory. * It is also useful if you need the graphics object to be anti-aliased, because it will be rendered using canvas. * This is not recommended if you are constantly redrawing the graphics element. * * @property cacheAsBitmap * @type Boolean * @default false * @private */ Object.defineProperty(PIXI.Graphics.prototype, "cacheAsBitmap", { get: function() { return this._cacheAsBitmap; }, set: function(value) { this._cacheAsBitmap = value; if(this._cacheAsBitmap) { this._generateCachedSprite(); } else { this.destroyCachedSprite(); this.dirty = true; } } }); /** * Specifies the line style used for subsequent calls to Graphics methods such as the lineTo() method or the drawCircle() method. * * @method lineStyle * @param lineWidth {Number} width of the line to draw, will update the objects stored style * @param color {Number} color of the line to draw, will update the objects stored style * @param alpha {Number} alpha of the line to draw, will update the objects stored style * @return {Graphics} */ PIXI.Graphics.prototype.lineStyle = function(lineWidth, color, alpha) { this.lineWidth = lineWidth || 0; this.lineColor = color || 0; this.lineAlpha = (alpha === undefined) ? 1 : alpha; if(this.currentPath) { if(this.currentPath.shape.points.length) { // halfway through a line? start a new one! this.drawShape( new PIXI.Polygon( this.currentPath.shape.points.slice(-2) )); return this; } // otherwise its empty so lets just set the line properties this.currentPath.lineWidth = this.lineWidth; this.currentPath.lineColor = this.lineColor; this.currentPath.lineAlpha = this.lineAlpha; } return this; }; /** * Moves the current drawing position to x, y. * * @method moveTo * @param x {Number} the X coordinate to move to * @param y {Number} the Y coordinate to move to * @return {Graphics} */ PIXI.Graphics.prototype.moveTo = function(x, y) { this.drawShape(new PIXI.Polygon([x,y])); return this; }; /** * Draws a line using the current line style from the current drawing position to (x, y); * The current drawing position is then set to (x, y). * * @method lineTo * @param x {Number} the X coordinate to draw to * @param y {Number} the Y coordinate to draw to * @return {Graphics} */ PIXI.Graphics.prototype.lineTo = function(x, y) { this.currentPath.shape.points.push(x, y); this.dirty = true; return this; }; /** * Calculate the points for a quadratic bezier curve and then draws it. * Based on: https://stackoverflow.com/questions/785097/how-do-i-implement-a-bezier-curve-in-c * * @method quadraticCurveTo * @param cpX {Number} Control point x * @param cpY {Number} Control point y * @param toX {Number} Destination point x * @param toY {Number} Destination point y * @return {Graphics} */ PIXI.Graphics.prototype.quadraticCurveTo = function(cpX, cpY, toX, toY) { if( this.currentPath ) { if(this.currentPath.shape.points.length === 0)this.currentPath.shape.points = [0,0]; } else { this.moveTo(0,0); } var xa, ya, n = 20, points = this.currentPath.shape.points; if(points.length === 0)this.moveTo(0, 0); var fromX = points[points.length-2]; var fromY = points[points.length-1]; var j = 0; for (var i = 1; i <= n; i++ ) { j = i / n; xa = fromX + ( (cpX - fromX) * j ); ya = fromY + ( (cpY - fromY) * j ); points.push( xa + ( ((cpX + ( (toX - cpX) * j )) - xa) * j ), ya + ( ((cpY + ( (toY - cpY) * j )) - ya) * j ) ); } this.dirty = true; return this; }; /** * Calculate the points for a bezier curve and then draws it. * * @method bezierCurveTo * @param cpX {Number} Control point x * @param cpY {Number} Control point y * @param cpX2 {Number} Second Control point x * @param cpY2 {Number} Second Control point y * @param toX {Number} Destination point x * @param toY {Number} Destination point y * @return {Graphics} */ PIXI.Graphics.prototype.bezierCurveTo = function(cpX, cpY, cpX2, cpY2, toX, toY) { if( this.currentPath ) { if(this.currentPath.shape.points.length === 0)this.currentPath.shape.points = [0,0]; } else { this.moveTo(0,0); } var n = 20, dt, dt2, dt3, t2, t3, points = this.currentPath.shape.points; var fromX = points[points.length-2]; var fromY = points[points.length-1]; var j = 0; for (var i=1; i<=n; i++) { j = i / n; dt = (1 - j); dt2 = dt * dt; dt3 = dt2 * dt; t2 = j * j; t3 = t2 * j; points.push( dt3 * fromX + 3 * dt2 * j * cpX + 3 * dt * t2 * cpX2 + t3 * toX, dt3 * fromY + 3 * dt2 * j * cpY + 3 * dt * t2 * cpY2 + t3 * toY); } this.dirty = true; return this; }; /* * The arcTo() method creates an arc/curve between two tangents on the canvas. * * "borrowed" from https://code.google.com/p/fxcanvas/ - thanks google! * * @method arcTo * @param x1 {Number} The x-coordinate of the beginning of the arc * @param y1 {Number} The y-coordinate of the beginning of the arc * @param x2 {Number} The x-coordinate of the end of the arc * @param y2 {Number} The y-coordinate of the end of the arc * @param radius {Number} The radius of the arc * @return {Graphics} */ PIXI.Graphics.prototype.arcTo = function(x1, y1, x2, y2, radius) { if( this.currentPath ) { if(this.currentPath.shape.points.length === 0) { this.currentPath.shape.points.push(x1, y1); } } else { this.moveTo(x1, y1); } var points = this.currentPath.shape.points; var fromX = points[points.length-2]; var fromY = points[points.length-1]; var a1 = fromY - y1; var b1 = fromX - x1; var a2 = y2 - y1; var b2 = x2 - x1; var mm = Math.abs(a1 * b2 - b1 * a2); if (mm < 1.0e-8 || radius === 0) { if( points[points.length-2] !== x1 || points[points.length-1] !== y1) { //console.log(">>") points.push(x1, y1); } } else { var dd = a1 * a1 + b1 * b1; var cc = a2 * a2 + b2 * b2; var tt = a1 * a2 + b1 * b2; var k1 = radius * Math.sqrt(dd) / mm; var k2 = radius * Math.sqrt(cc) / mm; var j1 = k1 * tt / dd; var j2 = k2 * tt / cc; var cx = k1 * b2 + k2 * b1; var cy = k1 * a2 + k2 * a1; var px = b1 * (k2 + j1); var py = a1 * (k2 + j1); var qx = b2 * (k1 + j2); var qy = a2 * (k1 + j2); var startAngle = Math.atan2(py - cy, px - cx); var endAngle = Math.atan2(qy - cy, qx - cx); this.arc(cx + x1, cy + y1, radius, startAngle, endAngle, b1 * a2 > b2 * a1); } this.dirty = true; return this; }; /** * The arc method creates an arc/curve (used to create circles, or parts of circles). * * @method arc * @param cx {Number} The x-coordinate of the center of the circle * @param cy {Number} The y-coordinate of the center of the circle * @param radius {Number} The radius of the circle * @param startAngle {Number} The starting angle, in radians (0 is at the 3 o'clock position of the arc's circle) * @param endAngle {Number} The ending angle, in radians * @param anticlockwise {Boolean} Optional. Specifies whether the drawing should be counterclockwise or clockwise. False is default, and indicates clockwise, while true indicates counter-clockwise. * @return {Graphics} */ PIXI.Graphics.prototype.arc = function(cx, cy, radius, startAngle, endAngle, anticlockwise) { anticlockwise = anticlockwise || false; if (startAngle === endAngle) { return this; } if( !anticlockwise && endAngle <= startAngle ) { endAngle += Math.PI * 2; } else if( anticlockwise && startAngle <= endAngle ) { startAngle += Math.PI * 2; } var sweep = anticlockwise ? (startAngle - endAngle) * -1 : (endAngle - startAngle); var segs = ( Math.abs(sweep) / (Math.PI * 2) ) * 40; if(sweep === 0) { return this; } var startX = cx + Math.cos(startAngle) * radius; var startY = cy + Math.sin(startAngle) * radius; if (anticlockwise && this.filling) { this.moveTo(cx, cy); } else { this.moveTo(startX, startY); } // currentPath will always exist after calling a moveTo var points = this.currentPath.shape.points; var theta = sweep/(segs*2); var theta2 = theta*2; var cTheta = Math.cos(theta); var sTheta = Math.sin(theta); var segMinus = segs - 1; var remainder = ( segMinus % 1 ) / segMinus; for(var i=0; i<=segMinus; i++) { var real = i + remainder * i; var angle = ((theta) + startAngle + (theta2 * real)); var c = Math.cos(angle); var s = -Math.sin(angle); points.push(( (cTheta * c) + (sTheta * s) ) * radius + cx, ( (cTheta * -s) + (sTheta * c) ) * radius + cy); } this.dirty = true; return this; }; /** * Specifies a simple one-color fill that subsequent calls to other Graphics methods * (such as lineTo() or drawCircle()) use when drawing. * * @method beginFill * @param color {Number} the color of the fill * @param alpha {Number} the alpha of the fill * @return {Graphics} */ PIXI.Graphics.prototype.beginFill = function(color, alpha) { this.filling = true; this.fillColor = color || 0; this.fillAlpha = (alpha === undefined) ? 1 : alpha; if(this.currentPath) { if(this.currentPath.shape.points.length <= 2) { this.currentPath.fill = this.filling; this.currentPath.fillColor = this.fillColor; this.currentPath.fillAlpha = this.fillAlpha; } } return this; }; /** * Applies a fill to the lines and shapes that were added since the last call to the beginFill() method. * * @method endFill * @return {Graphics} */ PIXI.Graphics.prototype.endFill = function() { this.filling = false; this.fillColor = null; this.fillAlpha = 1; return this; }; /** * Draws a rectangle. * * @method drawRect * * @param x {Number} The X coord of the top-left of the rectangle * @param y {Number} The Y coord of the top-left of the rectangle * @param width {Number} The width of the rectangle * @param height {Number} The height of the rectangle * @return {Graphics} */ PIXI.Graphics.prototype.drawRect = function( x, y, width, height ) { this.drawShape(new PIXI.Rectangle(x,y, width, height)); return this; }; /** * Draws a rounded rectangle. * * @method drawRoundedRect * * @param x {Number} The X coord of the top-left of the rectangle * @param y {Number} The Y coord of the top-left of the rectangle * @param width {Number} The width of the rectangle * @param height {Number} The height of the rectangle * @param radius {Number} Radius of the rectangle corners * @return {Graphics} */ PIXI.Graphics.prototype.drawRoundedRect = function( x, y, width, height, radius ) { this.drawShape(new PIXI.RoundedRectangle(x, y, width, height, radius)); return this; }; /** * Draws a circle. * * @method drawCircle * @param x {Number} The X coordinate of the center of the circle * @param y {Number} The Y coordinate of the center of the circle * @param radius {Number} The radius of the circle * @return {Graphics} */ PIXI.Graphics.prototype.drawCircle = function(x, y, radius) { this.drawShape(new PIXI.Circle(x,y, radius)); return this; }; /** * Draws an ellipse. * * @method drawEllipse * @param x {Number} The X coordinate of the center of the ellipse * @param y {Number} The Y coordinate of the center of the ellipse * @param width {Number} The half width of the ellipse * @param height {Number} The half height of the ellipse * @return {Graphics} */ PIXI.Graphics.prototype.drawEllipse = function(x, y, width, height) { this.drawShape(new PIXI.Ellipse(x, y, width, height)); return this; }; /** * Draws a polygon using the given path. * * @method drawPolygon * @param path {Array} The path data used to construct the polygon. * @return {Graphics} */ PIXI.Graphics.prototype.drawPolygon = function(path) { if(!(path instanceof Array))path = Array.prototype.slice.call(arguments); this.drawShape(new PIXI.Polygon(path)); return this; }; /** * Clears the graphics that were drawn to this Graphics object, and resets fill and line style settings. * * @method clear * @return {Graphics} */ PIXI.Graphics.prototype.clear = function() { this.lineWidth = 0; this.filling = false; this.dirty = true; this.clearDirty = true; this.graphicsData = []; return this; }; /** * Useful function that returns a texture of the graphics object that can then be used to create sprites * This can be quite useful if your geometry is complicated and needs to be reused multiple times. * * @method generateTexture * @param resolution {Number} The resolution of the texture being generated * @param scaleMode {Number} Should be one of the PIXI.scaleMode consts * @return {Texture} a texture of the graphics object */ PIXI.Graphics.prototype.generateTexture = function(resolution, scaleMode) { resolution = resolution || 1; var bounds = this.getBounds(); var canvasBuffer = new PIXI.CanvasBuffer(bounds.width * resolution, bounds.height * resolution); var texture = PIXI.Texture.fromCanvas(canvasBuffer.canvas, scaleMode); texture.baseTexture.resolution = resolution; canvasBuffer.context.scale(resolution, resolution); canvasBuffer.context.translate(-bounds.x,-bounds.y); PIXI.CanvasGraphics.renderGraphics(this, canvasBuffer.context); return texture; }; /** * Renders the object using the WebGL renderer * * @method _renderWebGL * @param renderSession {RenderSession} * @private */ PIXI.Graphics.prototype._renderWebGL = function(renderSession) { // if the sprite is not visible or the alpha is 0 then no need to render this element if(this.visible === false || this.alpha === 0 || this.isMask === true)return; if(this._cacheAsBitmap) { if(this.dirty || this.cachedSpriteDirty) { this._generateCachedSprite(); // we will also need to update the texture on the gpu too! this.updateCachedSpriteTexture(); this.cachedSpriteDirty = false; this.dirty = false; } this._cachedSprite.worldAlpha = this.worldAlpha; PIXI.Sprite.prototype._renderWebGL.call(this._cachedSprite, renderSession); return; } else { renderSession.spriteBatch.stop(); renderSession.blendModeManager.setBlendMode(this.blendMode); if(this._mask)renderSession.maskManager.pushMask(this._mask, renderSession); if(this._filters)renderSession.filterManager.pushFilter(this._filterBlock); // check blend mode if(this.blendMode !== renderSession.spriteBatch.currentBlendMode) { renderSession.spriteBatch.currentBlendMode = this.blendMode; var blendModeWebGL = PIXI.blendModesWebGL[renderSession.spriteBatch.currentBlendMode]; renderSession.spriteBatch.gl.blendFunc(blendModeWebGL[0], blendModeWebGL[1]); } // check if the webgl graphic needs to be updated if(this.webGLDirty) { this.dirty = true; this.webGLDirty = false; } PIXI.WebGLGraphics.renderGraphics(this, renderSession); // only render if it has children! if(this.children.length) { renderSession.spriteBatch.start(); // simple render children! for(var i=0, j=this.children.length; i<j; i++) { this.children[i]._renderWebGL(renderSession); } renderSession.spriteBatch.stop(); } if(this._filters)renderSession.filterManager.popFilter(); if(this._mask)renderSession.maskManager.popMask(this.mask, renderSession); renderSession.drawCount++; renderSession.spriteBatch.start(); } }; /** * Renders the object using the Canvas renderer * * @method _renderCanvas * @param renderSession {RenderSession} * @private */ PIXI.Graphics.prototype._renderCanvas = function(renderSession) { // if the sprite is not visible or the alpha is 0 then no need to render this element if(this.visible === false || this.alpha === 0 || this.isMask === true)return; if(this._cacheAsBitmap) { if(this.dirty || this.cachedSpriteDirty) { this._generateCachedSprite(); // we will also need to update the texture this.updateCachedSpriteTexture(); this.cachedSpriteDirty = false; this.dirty = false; } this._cachedSprite.alpha = this.alpha; PIXI.Sprite.prototype._renderCanvas.call(this._cachedSprite, renderSession); return; } else { var context = renderSession.context; var transform = this.worldTransform; if(this.blendMode !== renderSession.currentBlendMode) { renderSession.currentBlendMode = this.blendMode; context.globalCompositeOperation = PIXI.blendModesCanvas[renderSession.currentBlendMode]; } if(this._mask) { renderSession.maskManager.pushMask(this._mask, renderSession); } var resolution = renderSession.resolution; context.setTransform(transform.a * resolution, transform.b * resolution, transform.c * resolution, transform.d * resolution, transform.tx * resolution, transform.ty * resolution); PIXI.CanvasGraphics.renderGraphics(this, context); // simple render children! for(var i=0, j=this.children.length; i<j; i++) { this.children[i]._renderCanvas(renderSession); } if(this._mask) { renderSession.maskManager.popMask(renderSession); } } }; /** * Retrieves the bounds of the graphic shape as a rectangle object * * @method getBounds * @return {Rectangle} the rectangular bounding area */ PIXI.Graphics.prototype.getBounds = function( matrix ) { // return an empty object if the item is a mask! if(this.isMask)return PIXI.EmptyRectangle; if(this.dirty) { this.updateLocalBounds(); this.webGLDirty = true; this.cachedSpriteDirty = true; this.dirty = false; } var bounds = this._localBounds; var w0 = bounds.x; var w1 = bounds.width + bounds.x; var h0 = bounds.y; var h1 = bounds.height + bounds.y; var worldTransform = matrix || this.worldTransform; var a = worldTransform.a; var b = worldTransform.b; var c = worldTransform.c; var d = worldTransform.d; var tx = worldTransform.tx; var ty = worldTransform.ty; var x1 = a * w1 + c * h1 + tx; var y1 = d * h1 + b * w1 + ty; var x2 = a * w0 + c * h1 + tx; var y2 = d * h1 + b * w0 + ty; var = a * w0 + c * h0 + tx; var y3 = d * h0 + b * w0 + ty; var x4 = a * w1 + c * h0 + tx; var y4 = d * h0 + b * w1 + ty; var maxX = x1; var maxY = y1; var minX = x1; var minY = y1; minX = x2 < minX ? x2 : minX; minX = < minX ? : minX; minX = x4 < minX ? x4 : minX; minY = y2 < minY ? y2 : minY; minY = y3 < minY ? y3 : minY; minY = y4 < minY ? y4 : minY; maxX = x2 > maxX ? x2 : maxX; maxX = > maxX ? : maxX; maxX = x4 > maxX ? x4 : maxX; maxY = y2 > maxY ? y2 : maxY; maxY = y3 > maxY ? y3 : maxY; maxY = y4 > maxY ? y4 : maxY; this._bounds.x = minX; this._bounds.width = maxX - minX; this._bounds.y = minY; this._bounds.height = maxY - minY; return this._bounds; }; /** * Update the bounds of the object * * @method updateLocalBounds */ PIXI.Graphics.prototype.updateLocalBounds = function() { var minX = Infinity; var maxX = -Infinity; var minY = Infinity; var maxY = -Infinity; if(this.graphicsData.length) { var shape, points, x, y, w, h; for (var i = 0; i < this.graphicsData.length; i++) { var data = this.graphicsData[i]; var type = data.type; var lineWidth = data.lineWidth; shape = data.shape; if(type === PIXI.Graphics.RECT || type === PIXI.Graphics.RREC) { x = shape.x - lineWidth/2; y = shape.y - lineWidth/2; w = shape.width + lineWidth; h = shape.height + lineWidth; minX = x < minX ? x : minX; maxX = x + w > maxX ? x + w : maxX; minY = y < minY ? y : minY; maxY = y + h > maxY ? y + h : maxY; } else if(type === PIXI.Graphics.CIRC) { x = shape.x; y = shape.y; w = shape.radius + lineWidth/2; h = shape.radius + lineWidth/2; minX = x - w < minX ? x - w : minX; maxX = x + w > maxX ? x + w : maxX; minY = y - h < minY ? y - h : minY; maxY = y + h > maxY ? y + h : maxY; } else if(type === PIXI.Graphics.ELIP) { x = shape.x; y = shape.y; w = shape.width + lineWidth/2; h = shape.height + lineWidth/2; minX = x - w < minX ? x - w : minX; maxX = x + w > maxX ? x + w : maxX; minY = y - h < minY ? y - h : minY; maxY = y + h > maxY ? y + h : maxY; } else { // POLY points = shape.points; for (var j = 0; j < points.length; j+=2) { x = points[j]; y = points[j+1]; minX = x-lineWidth < minX ? x-lineWidth : minX; maxX = x+lineWidth > maxX ? x+lineWidth : maxX; minY = y-lineWidth < minY ? y-lineWidth : minY; maxY = y+lineWidth > maxY ? y+lineWidth : maxY; } } } } else { minX = 0; maxX = 0; minY = 0; maxY = 0; } var padding = this.boundsPadding; this._localBounds.x = minX - padding; this._localBounds.width = (maxX - minX) + padding * 2; this._localBounds.y = minY - padding; this._localBounds.height = (maxY - minY) + padding * 2; }; /** * Generates the cached sprite when the sprite has cacheAsBitmap = true * * @method _generateCachedSprite * @private */ PIXI.Graphics.prototype._generateCachedSprite = function() { var bounds = this.getLocalBounds(); if(!this._cachedSprite) { var canvasBuffer = new PIXI.CanvasBuffer(bounds.width, bounds.height); var texture = PIXI.Texture.fromCanvas(canvasBuffer.canvas); this._cachedSprite = new PIXI.Sprite(texture); this._cachedSprite.buffer = canvasBuffer; this._cachedSprite.worldTransform = this.worldTransform; } else { this._cachedSprite.buffer.resize(bounds.width, bounds.height); } // leverage the anchor to account for the offset of the element this._cachedSprite.anchor.x = -( bounds.x / bounds.width ); this._cachedSprite.anchor.y = -( bounds.y / bounds.height ); // this._cachedSprite.buffer.context.save(); this._cachedSprite.buffer.context.translate(-bounds.x,-bounds.y); // make sure we set the alpha of the graphics to 1 for the render.. this.worldAlpha = 1; // now render the graphic.. PIXI.CanvasGraphics.renderGraphics(this, this._cachedSprite.buffer.context); this._cachedSprite.alpha = this.alpha; }; /** * Updates texture size based on canvas size * * @method updateCachedSpriteTexture * @private */ PIXI.Graphics.prototype.updateCachedSpriteTexture = function() { var cachedSprite = this._cachedSprite; var texture = cachedSprite.texture; var canvas = cachedSprite.buffer.canvas; texture.baseTexture.width = canvas.width; texture.baseTexture.height = canvas.height; texture.crop.width = texture.frame.width = canvas.width; texture.crop.height = texture.frame.height = canvas.height; cachedSprite._width = canvas.width; cachedSprite._height = canvas.height; // update the dirty base textures texture.baseTexture.dirty(); }; /** * Destroys a previous cached sprite. * * @method destroyCachedSprite */ PIXI.Graphics.prototype.destroyCachedSprite = function() { this._cachedSprite.texture.destroy(true); // let the gc collect the unused sprite // TODO could be object pooled! this._cachedSprite = null; }; /** * Draws the given shape to this Graphics object. Can be any of Circle, Rectangle, Ellipse, Line or Polygon. * * @method drawShape * @param {Circle|Rectangle|Ellipse|Line|Polygon} shape The Shape object to draw. * @return {GraphicsData} The generated GraphicsData object. */ PIXI.Graphics.prototype.drawShape = function(shape) { if(this.currentPath) { // check current path! if(this.currentPath.shape.points.length <= 2)this.graphicsData.pop(); } this.currentPath = null; var data = new PIXI.GraphicsData(this.lineWidth, this.lineColor, this.lineAlpha, this.fillColor, this.fillAlpha, this.filling, shape); this.graphicsData.push(data); if(data.type === PIXI.Graphics.POLY) { data.shape.closed = this.filling; this.currentPath = data; } this.dirty = true; return data; }; /** * A GraphicsData object. * * @class GraphicsData * @constructor */ PIXI.GraphicsData = function(lineWidth, lineColor, lineAlpha, fillColor, fillAlpha, fill, shape) { this.lineWidth = lineWidth; this.lineColor = lineColor; this.lineAlpha = lineAlpha; this._lineTint = lineColor; this.fillColor = fillColor; this.fillAlpha = fillAlpha; this._fillTint = fillColor; this.fill = fill; this.shape = shape; this.type = shape.type; }; // SOME TYPES: PIXI.Graphics.POLY = 0; PIXI.Graphics.RECT = 1; PIXI.Graphics.CIRC = 2; PIXI.Graphics.ELIP = 3; PIXI.Graphics.RREC = 4; PIXI.Polygon.prototype.type = PIXI.Graphics.POLY; PIXI.Rectangle.prototype.type = PIXI.Graphics.RECT; PIXI.Circle.prototype.type = PIXI.Graphics.CIRC; PIXI.Ellipse.prototype.type = PIXI.Graphics.ELIP; PIXI.RoundedRectangle.prototype.type = PIXI.Graphics.RREC; /** * @author Mat Groves http://matgroves.com/ */ /** * * @class Strip * @extends DisplayObjectContainer * @constructor * @param texture {Texture} The texture to use * @param width {Number} the width * @param height {Number} the height * */ PIXI.Strip = function(texture) { PIXI.DisplayObjectContainer.call( this ); /** * The texture of the strip * * @property texture * @type Texture */ this.texture = texture; // set up the main bits.. this.uvs = new PIXI.Float32Array([0, 1, 1, 1, 1, 0, 0, 1]); this.vertices = new PIXI.Float32Array([0, 0, 100, 0, 100, 100, 0, 100]); this.colors = new PIXI.Float32Array([1, 1, 1, 1]); this.indices = new PIXI.Uint16Array([0, 1, 2, 3]); /** * Whether the strip is dirty or not * * @property dirty * @type Boolean */ this.dirty = true; /** * The blend mode to be applied to the sprite. Set to PIXI.blendModes.NORMAL to remove any blend mode. * * @property blendMode * @type Number * @default PIXI.blendModes.NORMAL; */ this.blendMode = PIXI.blendModes.NORMAL; /** * Triangles in canvas mode are automatically antialiased, use this value to force triangles to overlap a bit with each other. * * @property canvasPadding * @type Number */ this.canvasPadding = 0; this.drawMode = PIXI.Strip.DrawModes.TRIANGLE_STRIP; }; // constructor PIXI.Strip.prototype = Object.create(PIXI.DisplayObjectContainer.prototype); PIXI.Strip.prototype.constructor = PIXI.Strip; PIXI.Strip.prototype._renderWebGL = function(renderSession) { // if the sprite is not visible or the alpha is 0 then no need to render this element if(!this.visible || this.alpha <= 0)return; // render triangle strip.. renderSession.spriteBatch.stop(); // init! init! if(!this._vertexBuffer)this._initWebGL(renderSession); renderSession.shaderManager.setShader(renderSession.shaderManager.stripShader); this._renderStrip(renderSession); ///renderSession.shaderManager.activateDefaultShader(); renderSession.spriteBatch.start(); //TODO check culling }; PIXI.Strip.prototype._initWebGL = function(renderSession) { // build the strip! var gl = renderSession.gl; this._vertexBuffer = gl.createBuffer(); this._indexBuffer = gl.createBuffer(); this._uvBuffer = gl.createBuffer(); this._colorBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.vertices, gl.DYNAMIC_DRAW); gl.bindBuffer(gl.ARRAY_BUFFER, this._uvBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.uvs, gl.STATIC_DRAW); gl.bindBuffer(gl.ARRAY_BUFFER, this._colorBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.colors, gl.STATIC_DRAW); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); }; PIXI.Strip.prototype._renderStrip = function(renderSession) { var gl = renderSession.gl; var projection = renderSession.projection, offset = renderSession.offset, shader = renderSession.shaderManager.stripShader; var drawMode = this.drawMode === PIXI.Strip.DrawModes.TRIANGLE_STRIP ? gl.TRIANGLE_STRIP : gl.TRIANGLES; // gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); renderSession.blendModeManager.setBlendMode(this.blendMode); // set uniforms gl.uniformMatrix3fv(shader.translationMatrix, false, this.worldTransform.toArray(true)); gl.uniform2f(shader.projectionVector, projection.x, -projection.y); gl.uniform2f(shader.offsetVector, -offset.x, -offset.y); gl.uniform1f(shader.alpha, this.worldAlpha); if(!this.dirty) { gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.vertices); gl.vertexAttribPointer(shader.aVertexPosition, 2, gl.FLOAT, false, 0, 0); // update the uvs gl.bindBuffer(gl.ARRAY_BUFFER, this._uvBuffer); gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0); gl.activeTexture(gl.TEXTURE0); // check if a texture is dirty.. if(this.texture.baseTexture._dirty[gl.id]) { renderSession.renderer.updateTexture(this.texture.baseTexture); } else { // bind the current texture gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id]); } // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); } else { this.dirty = false; gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.vertices, gl.STATIC_DRAW); gl.vertexAttribPointer(shader.aVertexPosition, 2, gl.FLOAT, false, 0, 0); // update the uvs gl.bindBuffer(gl.ARRAY_BUFFER, this._uvBuffer); gl.bufferData(gl.ARRAY_BUFFER, this.uvs, gl.STATIC_DRAW); gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0); gl.activeTexture(gl.TEXTURE0); // check if a texture is dirty.. if(this.texture.baseTexture._dirty[gl.id]) { renderSession.renderer.updateTexture(this.texture.baseTexture); } else { gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id]); } // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); } //console.log(gl.TRIANGLE_STRIP) // // gl.drawElements(drawMode, this.indices.length, gl.UNSIGNED_SHORT, 0); }; PIXI.Strip.prototype._renderCanvas = function(renderSession) { var context = renderSession.context; var transform = this.worldTransform; if (renderSession.roundPixels) { context.setTransform(transform.a, transform.b, transform.c, transform.d, transform.tx | 0, transform.ty | 0); } else { context.setTransform(transform.a, transform.b, transform.c, transform.d, transform.tx, transform.ty); } if (this.drawMode === PIXI.Strip.DrawModes.TRIANGLE_STRIP) { this._renderCanvasTriangleStrip(context); } else { this._renderCanvasTriangles(context); } }; PIXI.Strip.prototype._renderCanvasTriangleStrip = function(context) { // draw triangles!! var vertices = this.vertices; var uvs = this.uvs; var length = vertices.length / 2; this.count++; for (var i = 0; i < length - 2; i++) { // draw some triangles! var index = i * 2; this._renderCanvasDrawTriangle(context, vertices, uvs, index, (index + 2), (index + 4)); } }; PIXI.Strip.prototype._renderCanvasTriangles = function(context) { // draw triangles!! var vertices = this.vertices; var uvs = this.uvs; var indices = this.indices; var length = indices.length; this.count++; for (var i = 0; i < length; i += 3) { // draw some triangles! var index0 = indices[i] * 2, index1 = indices[i + 1] * 2, index2 = indices[i + 2] * 2; this._renderCanvasDrawTriangle(context, vertices, uvs, index0, index1, index2); } }; PIXI.Strip.prototype._renderCanvasDrawTriangle = function(context, vertices, uvs, index0, index1, index2) { var textureSource = this.texture.baseTexture.source; var textureWidth = this.texture.width; var textureHeight = this.texture.height; var x0 = vertices[index0], x1 = vertices[index1], x2 = vertices[index2]; var y0 = vertices[index0 + 1], y1 = vertices[index1 + 1], y2 = vertices[index2 + 1]; var u0 = uvs[index0] * textureWidth, u1 = uvs[index1] * textureWidth, u2 = uvs[index2] * textureWidth; var v0 = uvs[index0 + 1] * textureHeight, v1 = uvs[index1 + 1] * textureHeight, v2 = uvs[index2 + 1] * textureHeight; if (this.canvasPadding > 0) { var paddingX = this.canvasPadding / this.worldTransform.a; var paddingY = this.canvasPadding / this.worldTransform.d; var centerX = (x0 + x1 + x2) / 3; var centerY = (y0 + y1 + y2) / 3; var normX = x0 - centerX; var normY = y0 - centerY; var dist = Math.sqrt(normX * normX + normY * normY); x0 = centerX + (normX / dist) * (dist + paddingX); y0 = centerY + (normY / dist) * (dist + paddingY); // normX = x1 - centerX; normY = y1 - centerY; dist = Math.sqrt(normX * normX + normY * normY); x1 = centerX + (normX / dist) * (dist + paddingX); y1 = centerY + (normY / dist) * (dist + paddingY); normX = x2 - centerX; normY = y2 - centerY; dist = Math.sqrt(normX * normX + normY * normY); x2 = centerX + (normX / dist) * (dist + paddingX); y2 = centerY + (normY / dist) * (dist + paddingY); } context.save(); context.beginPath(); context.moveTo(x0, y0); context.lineTo(x1, y1); context.lineTo(x2, y2); context.closePath(); context.clip(); // Compute matrix transform var delta = (u0 * v1) + (v0 * u2) + (u1 * v2) - (v1 * u2) - (v0 * u1) - (u0 * v2); var deltaA = (x0 * v1) + (v0 * x2) + (x1 * v2) - (v1 * x2) - (v0 * x1) - (x0 * v2); var deltaB = (u0 * x1) + (x0 * u2) + (u1 * x2) - (x1 * u2) - (x0 * u1) - (u0 * x2); var deltaC = (u0 * v1 * x2) + (v0 * x1 * u2) + (x0 * u1 * v2) - (x0 * v1 * u2) - (v0 * u1 * x2) - (u0 * x1 * v2); var deltaD = (y0 * v1) + (v0 * y2) + (y1 * v2) - (v1 * y2) - (v0 * y1) - (y0 * v2); var deltaE = (u0 * y1) + (y0 * u2) + (u1 * y2) - (y1 * u2) - (y0 * u1) - (u0 * y2); var deltaF = (u0 * v1 * y2) + (v0 * y1 * u2) + (y0 * u1 * v2) - (y0 * v1 * u2) - (v0 * u1 * y2) - (u0 * y1 * v2); context.transform(deltaA / delta, deltaD / delta, deltaB / delta, deltaE / delta, deltaC / delta, deltaF / delta); context.drawImage(textureSource, 0, 0); context.restore(); }; /** * Renders a flat strip * * @method renderStripFlat * @param strip {Strip} The Strip to render * @private */ PIXI.Strip.prototype.renderStripFlat = function(strip) { var context = this.context; var vertices = strip.vertices; var length = vertices.length/2; this.count++; context.beginPath(); for (var i=1; i < length-2; i++) { // draw some triangles! var index = i*2; var x0 = vertices[index], x1 = vertices[index+2], x2 = vertices[index+4]; var y0 = vertices[index+1], y1 = vertices[index+3], y2 = vertices[index+5]; context.moveTo(x0, y0); context.lineTo(x1, y1); context.lineTo(x2, y2); } context.fillStyle = '#FF0000'; context.fill(); context.closePath(); }; /* PIXI.Strip.prototype.setTexture = function(texture) { //TODO SET THE TEXTURES //TODO VISIBILITY // stop current texture this.texture = texture; this.width = texture.frame.width; this.height = texture.frame.height; this.updateFrame = true; }; */ /** * When the texture is updated, this event will fire to update the scale and frame * * @method onTextureUpdate * @param event * @private */ PIXI.Strip.prototype.onTextureUpdate = function() { this.updateFrame = true; }; /** * Returns the bounds of the mesh as a rectangle. The bounds calculation takes the worldTransform into account. * * @method getBounds * @param matrix {Matrix} the transformation matrix of the sprite * @return {Rectangle} the framing rectangle */ PIXI.Strip.prototype.getBounds = function(matrix) { var worldTransform = matrix || this.worldTransform; var a = worldTransform.a; var b = worldTransform.b; var c = worldTransform.c; var d = worldTransform.d; var tx = worldTransform.tx; var ty = worldTransform.ty; var maxX = -Infinity; var maxY = -Infinity; var minX = Infinity; var minY = Infinity; var vertices = this.vertices; for (var i = 0, n = vertices.length; i < n; i += 2) { var rawX = vertices[i], rawY = vertices[i + 1]; var x = (a * rawX) + (c * rawY) + tx; var y = (d * rawY) + (b * rawX) + ty; minX = x < minX ? x : minX; minY = y < minY ? y : minY; maxX = x > maxX ? x : maxX; maxY = y > maxY ? y : maxY; } if (minX === -Infinity || maxY === Infinity) { return PIXI.EmptyRectangle; } var bounds = this._bounds; bounds.x = minX; bounds.width = maxX - minX; bounds.y = minY; bounds.height = maxY - minY; // store a reference so that if this function gets called again in the render cycle we do not have to recalculate this._currentBounds = bounds; return bounds; }; /** * Different drawing buffer modes supported * * @property * @type {{TRIANGLE_STRIP: number, TRIANGLES: number}} * @static */ PIXI.Strip.DrawModes = { TRIANGLE_STRIP: 0, TRIANGLES: 1 }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 * @copyright Mat Groves, Rovanion Luckey */ /** * * @class Rope * @constructor * @extends Strip * @param {Texture} texture - The texture to use on the rope. * @param {Array} points - An array of {PIXI.Point}. * */ PIXI.Rope = function(texture, points) { PIXI.Strip.call( this, texture ); this.points = points; this.vertices = new PIXI.Float32Array(points.length * 4); this.uvs = new PIXI.Float32Array(points.length * 4); this.colors = new PIXI.Float32Array(points.length * 2); this.indices = new PIXI.Uint16Array(points.length * 2); this.refresh(); }; // constructor PIXI.Rope.prototype = Object.create( PIXI.Strip.prototype ); PIXI.Rope.prototype.constructor = PIXI.Rope; /* * Refreshes * * @method refresh */ PIXI.Rope.prototype.refresh = function() { var points = this.points; if(points.length < 1) return; var uvs = this.uvs; var lastPoint = points[0]; var indices = this.indices; var colors = this.colors; this.count-=0.2; uvs[0] = 0; uvs[1] = 0; uvs[2] = 0; uvs[3] = 1; colors[0] = 1; colors[1] = 1; indices[0] = 0; indices[1] = 1; var total = points.length, point, index, amount; for (var i = 1; i < total; i++) { point = points[i]; index = i * 4; // time to do some smart drawing! amount = i / (total-1); if(i%2) { uvs[index] = amount; uvs[index+1] = 0; uvs[index+2] = amount; uvs[index+3] = 1; } else { uvs[index] = amount; uvs[index+1] = 0; uvs[index+2] = amount; uvs[index+3] = 1; } index = i * 2; colors[index] = 1; colors[index+1] = 1; index = i * 2; indices[index] = index; indices[index + 1] = index + 1; lastPoint = point; } }; /* * Updates the object transform for rendering * * @method updateTransform * @private */ PIXI.Rope.prototype.updateTransform = function() { var points = this.points; if(points.length < 1)return; var lastPoint = points[0]; var nextPoint; var perp = {x:0, y:0}; this.count-=0.2; var vertices = this.vertices; var total = points.length, point, index, ratio, perpLength, num; for (var i = 0; i < total; i++) { point = points[i]; index = i * 4; if(i < points.length-1) { nextPoint = points[i+1]; } else { nextPoint = point; } perp.y = -(nextPoint.x - lastPoint.x); perp.x = nextPoint.y - lastPoint.y; ratio = (1 - (i / (total-1))) * 10; if(ratio > 1) ratio = 1; perpLength = Math.sqrt(perp.x * perp.x + perp.y * perp.y); num = this.texture.height / 2; //(20 + Math.abs(Math.sin((i + this.count) * 0.3) * 50) )* ratio; perp.x /= perpLength; perp.y /= perpLength; perp.x *= num; perp.y *= num; vertices[index] = point.x + perp.x; vertices[index+1] = point.y + perp.y; vertices[index+2] = point.x - perp.x; vertices[index+3] = point.y - perp.y; lastPoint = point; } PIXI.DisplayObjectContainer.prototype.updateTransform.call( this ); }; /* * Sets the texture that the Rope will use * * @method setTexture * @param texture {Texture} the texture that will be used */ PIXI.Rope.prototype.setTexture = function(texture) { // stop current texture this.texture = texture; //this.updateFrame = true; }; /** * @author Mat Groves http://matgroves.com/ */ /** * A tiling sprite is a fast way of rendering a tiling image * * @class TilingSprite * @extends Sprite * @constructor * @param texture {Texture} the texture of the tiling sprite * @param width {Number} the width of the tiling sprite * @param height {Number} the height of the tiling sprite */ PIXI.TilingSprite = function(texture, width, height) { PIXI.Sprite.call( this, texture); /** * The with of the tiling sprite * * @property width * @type Number */ this._width = width || 100; /** * The height of the tiling sprite * * @property height * @type Number */ this._height = height || 100; /** * The scaling of the image that is being tiled * * @property tileScale * @type Point */ this.tileScale = new PIXI.Point(1,1); /** * A point that represents the scale of the texture object * * @property tileScaleOffset * @type Point */ this.tileScaleOffset = new PIXI.Point(1,1); /** * The offset position of the image that is being tiled * * @property tilePosition * @type Point */ this.tilePosition = new PIXI.Point(0,0); /** * Whether this sprite is renderable or not * * @property renderable * @type Boolean * @default true */ this.renderable = true; /** * The tint applied to the sprite. This is a hex value * * @property tint * @type Number * @default 0xFFFFFF */ this.tint = 0xFFFFFF; /** * The blend mode to be applied to the sprite * * @property blendMode * @type Number * @default PIXI.blendModes.NORMAL; */ this.blendMode = PIXI.blendModes.NORMAL; }; // constructor PIXI.TilingSprite.prototype = Object.create(PIXI.Sprite.prototype); PIXI.TilingSprite.prototype.constructor = PIXI.TilingSprite; /** * The width of the sprite, setting this will actually modify the scale to achieve the value set * * @property width * @type Number */ Object.defineProperty(PIXI.TilingSprite.prototype, 'width', { get: function() { return this._width; }, set: function(value) { this._width = value; } }); /** * The height of the TilingSprite, setting this will actually modify the scale to achieve the value set * * @property height * @type Number */ Object.defineProperty(PIXI.TilingSprite.prototype, 'height', { get: function() { return this._height; }, set: function(value) { this._height = value; } }); PIXI.TilingSprite.prototype.setTexture = function(texture) { if (this.texture === texture) return; this.texture = texture; this.refreshTexture = true; this.cachedTint = 0xFFFFFF; }; /** * Renders the object using the WebGL renderer * * @method _renderWebGL * @param renderSession {RenderSession} * @private */ PIXI.TilingSprite.prototype._renderWebGL = function(renderSession) { if (this.visible === false || this.alpha === 0) return; var i,j; if (this._mask) { renderSession.spriteBatch.stop(); renderSession.maskManager.pushMask(this.mask, renderSession); renderSession.spriteBatch.start(); } if (this._filters) { renderSession.spriteBatch.flush(); renderSession.filterManager.pushFilter(this._filterBlock); } if (!this.tilingTexture || this.refreshTexture) { this.generateTilingTexture(true); if (this.tilingTexture && this.tilingTexture.needsUpdate) { //TODO - tweaking renderSession.renderer.updateTexture(this.tilingTexture.baseTexture); this.tilingTexture.needsUpdate = false; // this.tilingTexture._uvs = null; } } else { renderSession.spriteBatch.renderTilingSprite(this); } // simple render children! for (i=0,j=this.children.length; i<j; i++) { this.children[i]._renderWebGL(renderSession); } renderSession.spriteBatch.stop(); if (this._filters) renderSession.filterManager.popFilter(); if (this._mask) renderSession.maskManager.popMask(this._mask, renderSession); renderSession.spriteBatch.start(); }; /** * Renders the object using the Canvas renderer * * @method _renderCanvas * @param renderSession {RenderSession} * @private */ PIXI.TilingSprite.prototype._renderCanvas = function(renderSession) { if (this.visible === false || this.alpha === 0)return; var context = renderSession.context; if (this._mask) { renderSession.maskManager.pushMask(this._mask, renderSession); } context.globalAlpha = this.worldAlpha; var transform = this.worldTransform; var i,j; var resolution = renderSession.resolution; context.setTransform(transform.a * resolution, transform.b * resolution, transform.c * resolution, transform.d * resolution, transform.tx * resolution, transform.ty * resolution); if (!this.__tilePattern || this.refreshTexture) { this.generateTilingTexture(false); if (this.tilingTexture) { this.__tilePattern = context.createPattern(this.tilingTexture.baseTexture.source, 'repeat'); } else { return; } } // check blend mode if (this.blendMode !== renderSession.currentBlendMode) { renderSession.currentBlendMode = this.blendMode; context.globalCompositeOperation = PIXI.blendModesCanvas[renderSession.currentBlendMode]; } var tilePosition = this.tilePosition; var tileScale = this.tileScale; tilePosition.x %= this.tilingTexture.baseTexture.width; tilePosition.y %= this.tilingTexture.baseTexture.height; // offset - make sure to account for the anchor point.. context.scale(tileScale.x,tileScale.y); context.translate(tilePosition.x + (this.anchor.x * -this._width), tilePosition.y + (this.anchor.y * -this._height)); context.fillStyle = this.__tilePattern; context.fillRect(-tilePosition.x, -tilePosition.y, this._width / tileScale.x, this._height / tileScale.y); context.scale(1 / tileScale.x, 1 / tileScale.y); context.translate(-tilePosition.x + (this.anchor.x * this._width), -tilePosition.y + (this.anchor.y * this._height)); if (this._mask) { renderSession.maskManager.popMask(renderSession); } for (i=0,j=this.children.length; i<j; i++) { this.children[i]._renderCanvas(renderSession); } }; /** * Returns the framing rectangle of the sprite as a PIXI.Rectangle object * * @method getBounds * @return {Rectangle} the framing rectangle */ PIXI.TilingSprite.prototype.getBounds = function() { var width = this._width; var height = this._height; var w0 = width * (1-this.anchor.x); var w1 = width * -this.anchor.x; var h0 = height * (1-this.anchor.y); var h1 = height * -this.anchor.y; var worldTransform = this.worldTransform; var a = worldTransform.a; var b = worldTransform.b; var c = worldTransform.c; var d = worldTransform.d; var tx = worldTransform.tx; var ty = worldTransform.ty; var x1 = a * w1 + c * h1 + tx; var y1 = d * h1 + b * w1 + ty; var x2 = a * w0 + c * h1 + tx; var y2 = d * h1 + b * w0 + ty; var = a * w0 + c * h0 + tx; var y3 = d * h0 + b * w0 + ty; var x4 = a * w1 + c * h0 + tx; var y4 = d * h0 + b * w1 + ty; var maxX = -Infinity; var maxY = -Infinity; var minX = Infinity; var minY = Infinity; minX = x1 < minX ? x1 : minX; minX = x2 < minX ? x2 : minX; minX = < minX ? : minX; minX = x4 < minX ? x4 : minX; minY = y1 < minY ? y1 : minY; minY = y2 < minY ? y2 : minY; minY = y3 < minY ? y3 : minY; minY = y4 < minY ? y4 : minY; maxX = x1 > maxX ? x1 : maxX; maxX = x2 > maxX ? x2 : maxX; maxX = > maxX ? : maxX; maxX = x4 > maxX ? x4 : maxX; maxY = y1 > maxY ? y1 : maxY; maxY = y2 > maxY ? y2 : maxY; maxY = y3 > maxY ? y3 : maxY; maxY = y4 > maxY ? y4 : maxY; var bounds = this._bounds; bounds.x = minX; bounds.width = maxX - minX; bounds.y = minY; bounds.height = maxY - minY; // store a reference so that if this function gets called again in the render cycle we do not have to recalculate this._currentBounds = bounds; return bounds; }; /** * When the texture is updated, this event will fire to update the scale and frame * * @method onTextureUpdate * @param event * @private */ PIXI.TilingSprite.prototype.onTextureUpdate = function() { // overriding the sprite version of this! }; /** * * @method generateTilingTexture * * @param forcePowerOfTwo {Boolean} Whether we want to force the texture to be a power of two */ PIXI.TilingSprite.prototype.generateTilingTexture = function(forcePowerOfTwo) { if (!this.texture.baseTexture.hasLoaded) return; var texture = this.originalTexture || this.texture; var frame = texture.frame; var targetWidth, targetHeight; // Check that the frame is the same size as the base texture. var isFrame = frame.width !== texture.baseTexture.width || frame.height !== texture.baseTexture.height; var newTextureRequired = false; if (!forcePowerOfTwo) { if (isFrame) { if (texture.trim) { targetWidth = texture.trim.width; targetHeight = texture.trim.height; } else { targetWidth = frame.width; targetHeight = frame.height; } newTextureRequired = true; } } else { targetWidth = PIXI.getNextPowerOfTwo(frame.width); targetHeight = PIXI.getNextPowerOfTwo(frame.height); // If the BaseTexture dimensions don't match the texture frame then we need a new texture anyway because it's part of a texture atlas if (frame.width !== targetWidth || frame.height !== targetHeight || texture.baseTexture.width !== targetWidth || texture.baseTexture.height || targetHeight) newTextureRequired = true; } if (newTextureRequired) { var canvasBuffer; if (this.tilingTexture && this.tilingTexture.isTiling) { canvasBuffer = this.tilingTexture.canvasBuffer; canvasBuffer.resize(targetWidth, targetHeight); this.tilingTexture.baseTexture.width = targetWidth; this.tilingTexture.baseTexture.height = targetHeight; this.tilingTexture.needsUpdate = true; } else { canvasBuffer = new PIXI.CanvasBuffer(targetWidth, targetHeight); this.tilingTexture = PIXI.Texture.fromCanvas(canvasBuffer.canvas); this.tilingTexture.canvasBuffer = canvasBuffer; this.tilingTexture.isTiling = true; } canvasBuffer.context.drawImage(texture.baseTexture.source, texture.crop.x, texture.crop.y, texture.crop.width, texture.crop.height, 0, 0, targetWidth, targetHeight); this.tileScaleOffset.x = frame.width / targetWidth; this.tileScaleOffset.y = frame.height / targetHeight; } else { // TODO - switching? if (this.tilingTexture && this.tilingTexture.isTiling) { // destroy the tiling texture! // TODO could store this somewhere? this.tilingTexture.destroy(true); } this.tileScaleOffset.x = 1; this.tileScaleOffset.y = 1; this.tilingTexture = texture; } this.refreshTexture = false; this.originalTexture = this.texture; this.texture = this.tilingTexture; this.tilingTexture.baseTexture._powerOf2 = true; }; PIXI.TilingSprite.prototype.destroy = function () { PIXI.Sprite.prototype.destroy.call(this); this.tileScale = null; this.tileScaleOffset = null; this.tilePosition = null; if (this.tilingTexture) { this.tilingTexture.destroy(true); this.tilingTexture = null; } }; /****************************************************************************** * Spine Runtimes Software License * Version 2.1 * * Copyright (c) 2013, Esoteric Software * All rights reserved. * * You are granted a perpetual, non-exclusive, non-sublicensable and * non-transferable license to install, execute and perform the Spine Runtimes * Software (the "Software") solely for internal use. Without the written * permission of Esoteric Software (typically granted by licensing Spine), you * may not (a) modify, translate, adapt or otherwise create derivative works, * improvements of the Software or develop new applications using the Software * or ( remove, delete, alter or obscure any trademarks or any copyright, * trademark, patent or other intellectual property or proprietary rights * notices on or in the Software, including any copy thereof. Redistributions * in binary or source form must include this license and terms. * * THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL ESOTERIC SOFTARE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ var spine = { radDeg: 180 / Math.PI, degRad: Math.PI / 180, temp: [], Float32Array: (typeof(Float32Array) === 'undefined') ? Array : Float32Array, Uint16Array: (typeof(Uint16Array) === 'undefined') ? Array : Uint16Array }; spine.BoneData = function (name, parent) { this.name = name; this.parent = parent; }; spine.BoneData.prototype = { length: 0, x: 0, y: 0, rotation: 0, scaleX: 1, scaleY: 1, inheritScale: true, inheritRotation: true, flipX: false, flipY: false }; spine.SlotData = function (name, boneData) { this.name = name; this.boneData = boneData; }; spine.SlotData.prototype = { r: 1, g: 1, b: 1, a: 1, attachmentName: null, additiveBlending: false }; spine.IkConstraintData = function (name) { this.name = name; this.bones = []; }; spine.IkConstraintData.prototype = { target: null, bendDirection: 1, mix: 1 }; spine.Bone = function (boneData, skeleton, parent) { this.data = boneData; this.skeleton = skeleton; this.parent = parent; this.setToSetupPose(); }; spine.Bone.yDown = false; spine.Bone.prototype = { x: 0, y: 0, rotation: 0, rotationIK: 0, scaleX: 1, scaleY: 1, flipX: false, flipY: false, m00: 0, m01: 0, worldX: 0, // a b x m10: 0, m11: 0, worldY: 0, // c d y worldRotation: 0, worldScaleX: 1, worldScaleY: 1, worldFlipX: false, worldFlipY: false, updateWorldTransform: function () { var parent = this.parent; if (parent) { this.worldX = this.x * parent.m00 + this.y * parent.m01 + parent.worldX; this.worldY = this.x * parent.m10 + this.y * parent.m11 + parent.worldY; if (this.data.inheritScale) { this.worldScaleX = parent.worldScaleX * this.scaleX; this.worldScaleY = parent.worldScaleY * this.scaleY; } else { this.worldScaleX = this.scaleX; this.worldScaleY = this.scaleY; } this.worldRotation = this.data.inheritRotation ? (parent.worldRotation + this.rotationIK) : this.rotationIK; this.worldFlipX = parent.worldFlipX != this.flipX; this.worldFlipY = parent.worldFlipY != this.flipY; } else { var skeletonFlipX = this.skeleton.flipX, skeletonFlipY = this.skeleton.flipY; this.worldX = skeletonFlipX ? -this.x : this.x; this.worldY = (skeletonFlipY != spine.Bone.yDown) ? -this.y : this.y; this.worldScaleX = this.scaleX; this.worldScaleY = this.scaleY; this.worldRotation = this.rotationIK; this.worldFlipX = skeletonFlipX != this.flipX; this.worldFlipY = skeletonFlipY != this.flipY; } var radians = this.worldRotation * spine.degRad; var cos = Math.cos(radians); var sin = Math.sin(radians); if (this.worldFlipX) { this.m00 = -cos * this.worldScaleX; this.m01 = sin * this.worldScaleY; } else { this.m00 = cos * this.worldScaleX; this.m01 = -sin * this.worldScaleY; } if (this.worldFlipY != spine.Bone.yDown) { this.m10 = -sin * this.worldScaleX; this.m11 = -cos * this.worldScaleY; } else { this.m10 = sin * this.worldScaleX; this.m11 = cos * this.worldScaleY; } }, setToSetupPose: function () { var data = this.data; this.x = data.x; this.y = data.y; this.rotation = data.rotation; this.rotationIK = this.rotation; this.scaleX = data.scaleX; this.scaleY = data.scaleY; this.flipX = data.flipX; this.flipY = data.flipY; }, worldToLocal: function (world) { var dx = world[0] - this.worldX, dy = world[1] - this.worldY; var m00 = this.m00, m10 = this.m10, m01 = this.m01, m11 = this.m11; if (this.worldFlipX != (this.worldFlipY != spine.Bone.yDown)) { m00 = -m00; m11 = -m11; } var invDet = 1 / (m00 * m11 - m01 * m10); world[0] = dx * m00 * invDet - dy * m01 * invDet; world[1] = dy * m11 * invDet - dx * m10 * invDet; }, localToWorld: function (local) { var localX = local[0], localY = local[1]; local[0] = localX * this.m00 + localY * this.m01 + this.worldX; local[1] = localX * this.m10 + localY * this.m11 + this.worldY; } }; spine.Slot = function (slotData, bone) { this.data = slotData; this.bone = bone; this.setToSetupPose(); }; spine.Slot.prototype = { r: 1, g: 1, b: 1, a: 1, _attachmentTime: 0, attachment: null, attachmentVertices: [], setAttachment: function (attachment) { this.attachment = attachment; this._attachmentTime = this.bone.skeleton.time; this.attachmentVertices.length = 0; }, setAttachmentTime: function (time) { this._attachmentTime = this.bone.skeleton.time - time; }, getAttachmentTime: function () { return this.bone.skeleton.time - this._attachmentTime; }, setToSetupPose: function () { var data = this.data; this.r = data.r; this.g = data.g; this.b = data.b; this.a = data.a; var slotDatas = this.bone.skeleton.data.slots; for (var i = 0, n = slotDatas.length; i < n; i++) { if (slotDatas[i] == data) { this.setAttachment(!data.attachmentName ? null : this.bone.skeleton.getAttachmentBySlotIndex(i, data.attachmentName)); break; } } } }; spine.IkConstraint = function (data, skeleton) { this.data = data; this.mix = data.mix; this.bendDirection = data.bendDirection; this.bones = []; for (var i = 0, n = data.bones.length; i < n; i++) this.bones.push(skeleton.findBone(data.bones[i].name)); this.target = skeleton.findBone(data.target.name); }; spine.IkConstraint.prototype = { apply: function () { var target = this.target; var bones = this.bones; switch (bones.length) { case 1: spine.IkConstraint.apply1(bones[0], target.worldX, target.worldY, this.mix); break; case 2: spine.IkConstraint.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.mix); break; } } }; /** Adjusts the bone rotation so the tip is as close to the target position as possible. The target is specified in the world * coordinate system. */ spine.IkConstraint.apply1 = function (bone, targetX, targetY, alpha) { var parentRotation = (!bone.data.inheritRotation || !bone.parent) ? 0 : bone.parent.worldRotation; var rotation = bone.rotation; var rotationIK = Math.atan2(targetY - bone.worldY, targetX - bone.worldX) * spine.radDeg - parentRotation; bone.rotationIK = rotation + (rotationIK - rotation) * alpha; }; /** Adjusts the parent and child bone rotations so the tip of the child is as close to the target position as possible. The * target is specified in the world coordinate system. * @param child Any descendant bone of the parent. */ spine.IkConstraint.apply2 = function (parent, child, targetX, targetY, bendDirection, alpha) { var childRotation = child.rotation, parentRotation = parent.rotation; if (!alpha) { child.rotationIK = childRotation; parent.rotationIK = parentRotation; return; } var positionX, positionY, tempPosition = spine.temp; var parentParent = parent.parent; if (parentParent) { tempPosition[0] = targetX; tempPosition[1] = targetY; parentParent.worldToLocal(tempPosition); targetX = (tempPosition[0] - parent.x) * parentParent.worldScaleX; targetY = (tempPosition[1] - parent.y) * parentParent.worldScaleY; } else { targetX -= parent.x; targetY -= parent.y; } if (child.parent == parent) { positionX = child.x; positionY = child.y; } else { tempPosition[0] = child.x; tempPosition[1] = child.y; child.parent.localToWorld(tempPosition); parent.worldToLocal(tempPosition); positionX = tempPosition[0]; positionY = tempPosition[1]; } var childX = positionX * parent.worldScaleX, childY = positionY * parent.worldScaleY; var offset = Math.atan2(childY, childX); var len1 = Math.sqrt(childX * childX + childY * childY), len2 = child.data.length * child.worldScaleX; // Based on code by Ryan Juckett with permission: Copyright (c) 2008-2009 Ryan Juckett, http://www.ryanjuckett.com/ var cosDenom = 2 * len1 * len2; if (cosDenom < 0.0001) { child.rotationIK = childRotation + (Math.atan2(targetY, targetX) * spine.radDeg - parentRotation - childRotation) * alpha; return; } var cos = (targetX * targetX + targetY * targetY - len1 * len1 - len2 * len2) / cosDenom; if (cos < -1) cos = -1; else if (cos > 1) cos = 1; var childAngle = Math.acos(cos) * bendDirection; var adjacent = len1 + len2 * cos, opposite = len2 * Math.sin(childAngle); var parentAngle = Math.atan2(targetY * adjacent - targetX * opposite, targetX * adjacent + targetY * opposite); var rotation = (parentAngle - offset) * spine.radDeg - parentRotation; if (rotation > 180) rotation -= 360; else if (rotation < -180) // rotation += 360; parent.rotationIK = parentRotation + rotation * alpha; rotation = (childAngle + offset) * spine.radDeg - childRotation; if (rotation > 180) rotation -= 360; else if (rotation < -180) // rotation += 360; child.rotationIK = childRotation + (rotation + parent.worldRotation - child.parent.worldRotation) * alpha; }; spine.Skin = function (name) { this.name = name; this.attachments = {}; }; spine.Skin.prototype = { addAttachment: function (slotIndex, name, attachment) { this.attachments[slotIndex + ":" + name] = attachment; }, getAttachment: function (slotIndex, name) { return this.attachments[slotIndex + ":" + name]; }, _attachAll: function (skeleton, oldSkin) { for (var key in oldSkin.attachments) { var colon = key.indexOf(":"); var slotIndex = parseInt(key.substring(0, colon)); var name = key.substring(colon + 1); var slot = skeleton.slots[slotIndex]; if (slot.attachment && slot.attachment.name == name) { var attachment = this.getAttachment(slotIndex, name); if (attachment) slot.setAttachment(attachment); } } } }; spine.Animation = function (name, timelines, duration) { this.name = name; this.timelines = timelines; this.duration = duration; }; spine.Animation.prototype = { apply: function (skeleton, lastTime, time, loop, events) { if (loop && this.duration != 0) { time %= this.duration; lastTime %= this.duration; } var timelines = this.timelines; for (var i = 0, n = timelines.length; i < n; i++) timelines[i].apply(skeleton, lastTime, time, events, 1); }, mix: function (skeleton, lastTime, time, loop, events, alpha) { if (loop && this.duration != 0) { time %= this.duration; lastTime %= this.duration; } var timelines = this.timelines; for (var i = 0, n = timelines.length; i < n; i++) timelines[i].apply(skeleton, lastTime, time, events, alpha); } }; spine.Animation.binarySearch = function (values, target, step) { var low = 0; var high = Math.floor(values.length / step) - 2; if (!high) return step; var current = high >>> 1; while (true) { if (values[(current + 1) * step] <= target) low = current + 1; else high = current; if (low == high) return (low + 1) * step; current = (low + high) >>> 1; } }; spine.Animation.binarySearch1 = function (values, target) { var low = 0; var high = values.length - 2; if (!high) return 1; var current = high >>> 1; while (true) { if (values[current + 1] <= target) low = current + 1; else high = current; if (low == high) return low + 1; current = (low + high) >>> 1; } }; spine.Animation.linearSearch = function (values, target, step) { for (var i = 0, last = values.length - step; i <= last; i += step) if (values[i] > target) return i; return -1; }; spine.Curves = function (frameCount) { this.curves = []; // type, x, y, ... //this.curves.length = (frameCount - 1) * 19/*BEZIER_SIZE*/; }; spine.Curves.prototype = { setLinear: function (frameIndex) { this.curves[frameIndex * 19/*BEZIER_SIZE*/] = 0/*LINEAR*/; }, setStepped: function (frameIndex) { this.curves[frameIndex * 19/*BEZIER_SIZE*/] = 1/*STEPPED*/; }, /** Sets the control handle positions for an interpolation bezier curve used to transition from this keyframe to the next. * cx1 and cx2 are from 0 to 1, representing the percent of time between the two keyframes. cy1 and cy2 are the percent of * the difference between the keyframe's values. */ setCurve: function (frameIndex, cx1, cy1, cx2, cy2) { var subdiv1 = 1 / 10/*BEZIER_SEGMENTS*/, subdiv2 = subdiv1 * subdiv1, subdiv3 = subdiv2 * subdiv1; var pre1 = 3 * subdiv1, pre2 = 3 * subdiv2, pre4 = 6 * subdiv2, pre5 = 6 * subdiv3; var tmp1x = -cx1 * 2 + cx2, tmp1y = -cy1 * 2 + cy2, tmp2x = (cx1 - cx2) * 3 + 1, tmp2y = (cy1 - cy2) * 3 + 1; var dfx = cx1 * pre1 + tmp1x * pre2 + tmp2x * subdiv3, dfy = cy1 * pre1 + tmp1y * pre2 + tmp2y * subdiv3; var ddfx = tmp1x * pre4 + tmp2x * pre5, ddfy = tmp1y * pre4 + tmp2y * pre5; var dddfx = tmp2x * pre5, dddfy = tmp2y * pre5; var i = frameIndex * 19/*BEZIER_SIZE*/; var curves = this.curves; curves[i++] = 2/*BEZIER*/; var x = dfx, y = dfy; for (var n = i + 19/*BEZIER_SIZE*/ - 1; i < n; i += 2) { curves[i] = x; curves[i + 1] = y; dfx += ddfx; dfy += ddfy; ddfx += dddfx; ddfy += dddfy; x += dfx; y += dfy; } }, getCurvePercent: function (frameIndex, percent) { percent = percent < 0 ? 0 : (percent > 1 ? 1 : percent); var curves = this.curves; var i = frameIndex * 19/*BEZIER_SIZE*/; var type = curves[i]; if (type === 0/*LINEAR*/) return percent; if (type == 1/*STEPPED*/) return 0; i++; var x = 0; for (var start = i, n = i + 19/*BEZIER_SIZE*/ - 1; i < n; i += 2) { x = curves[i]; if (x >= percent) { var prevX, prevY; if (i == start) { prevX = 0; prevY = 0; } else { prevX = curves[i - 2]; prevY = curves[i - 1]; } return prevY + (curves[i + 1] - prevY) * (percent - prevX) / (x - prevX); } } var y = curves[i - 1]; return y + (1 - y) * (percent - x) / (1 - x); // Last point is 1,1. } }; spine.RotateTimeline = function (frameCount) { this.curves = new spine.Curves(frameCount); this.frames = []; // time, angle, ... this.frames.length = frameCount * 2; }; spine.RotateTimeline.prototype = { boneIndex: 0, getFrameCount: function () { return this.frames.length / 2; }, setFrame: function (frameIndex, time, angle) { frameIndex *= 2; this.frames[frameIndex] = time; this.frames[frameIndex + 1] = angle; }, apply: function (skeleton, lastTime, time, firedEvents, alpha) { var frames = this.frames; if (time < frames[0]) return; // Time is before first frame. var bone = skeleton.bones[this.boneIndex]; if (time >= frames[frames.length - 2]) { // Time is after last frame. var amount = bone.data.rotation + frames[frames.length - 1] - bone.rotation; while (amount > 180) amount -= 360; while (amount < -180) amount += 360; bone.rotation += amount * alpha; return; } // Interpolate between the previous frame and the current frame. var frameIndex = spine.Animation.binarySearch(frames, time, 2); var prevFrameValue = frames[frameIndex - 1]; var frameTime = frames[frameIndex]; var percent = 1 - (time - frameTime) / (frames[frameIndex - 2/*PREV_FRAME_TIME*/] - frameTime); percent = this.curves.getCurvePercent(frameIndex / 2 - 1, percent); var amount = frames[frameIndex + 1/*FRAME_VALUE*/] - prevFrameValue; while (amount > 180) amount -= 360; while (amount < -180) amount += 360; amount = bone.data.rotation + (prevFrameValue + amount * percent) - bone.rotation; while (amount > 180) amount -= 360; while (amount < -180) amount += 360; bone.rotation += amount * alpha; } }; spine.TranslateTimeline = function (frameCount) { this.curves = new spine.Curves(frameCount); this.frames = []; // time, x, y, ... this.frames.length = frameCount * 3; }; spine.TranslateTimeline.prototype = { boneIndex: 0, getFrameCount: function () { return this.frames.length / 3; }, setFrame: function (frameIndex, time, x, y) { frameIndex *= 3; this.frames[frameIndex] = time; this.frames[frameIndex + 1] = x; this.frames[frameIndex + 2] = y; }, apply: function (skeleton, lastTime, time, firedEvents, alpha) { var frames = this.frames; if (time < frames[0]) return; // Time is before first frame. var bone = skeleton.bones[this.boneIndex]; if (time >= frames[frames.length - 3]) { // Time is after last frame. bone.x += (bone.data.x + frames[frames.length - 2] - bone.x) * alpha; bone.y += (bone.data.y + frames[frames.length - 1] - bone.y) * alpha; return; } // Interpolate between the previous frame and the current frame. var frameIndex = spine.Animation.binarySearch(frames, time, 3); var prevFrameX = frames[frameIndex - 2]; var prevFrameY = frames[frameIndex - 1]; var frameTime = frames[frameIndex]; var percent = 1 - (time - frameTime) / (frames[frameIndex + -3/*PREV_FRAME_TIME*/] - frameTime); percent = this.curves.getCurvePercent(frameIndex / 3 - 1, percent); bone.x += (bone.data.x + prevFrameX + (frames[frameIndex + 1/*FRAME_X*/] - prevFrameX) * percent - bone.x) * alpha; bone.y += (bone.data.y + prevFrameY + (frames[frameIndex + 2/*FRAME_Y*/] - prevFrameY) * percent - bone.y) * alpha; } }; spine.ScaleTimeline = function (frameCount) { this.curves = new spine.Curves(frameCount); this.frames = []; // time, x, y, ... this.frames.length = frameCount * 3; }; spine.ScaleTimeline.prototype = { boneIndex: 0, getFrameCount: function () { return this.frames.length / 3; }, setFrame: function (frameIndex, time, x, y) { frameIndex *= 3; this.frames[frameIndex] = time; this.frames[frameIndex + 1] = x; this.frames[frameIndex + 2] = y; }, apply: function (skeleton, lastTime, time, firedEvents, alpha) { var frames = this.frames; if (time < frames[0]) return; // Time is before first frame. var bone = skeleton.bones[this.boneIndex]; if (time >= frames[frames.length - 3]) { // Time is after last frame. bone.scaleX += (bone.data.scaleX * frames[frames.length - 2] - bone.scaleX) * alpha; bone.scaleY += (bone.data.scaleY * frames[frames.length - 1] - bone.scaleY) * alpha; return; } // Interpolate between the previous frame and the current frame. var frameIndex = spine.Animation.binarySearch(frames, time, 3); var prevFrameX = frames[frameIndex - 2]; var prevFrameY = frames[frameIndex - 1]; var frameTime = frames[frameIndex]; var percent = 1 - (time - frameTime) / (frames[frameIndex + -3/*PREV_FRAME_TIME*/] - frameTime); percent = this.curves.getCurvePercent(frameIndex / 3 - 1, percent); bone.scaleX += (bone.data.scaleX * (prevFrameX + (frames[frameIndex + 1/*FRAME_X*/] - prevFrameX) * percent) - bone.scaleX) * alpha; bone.scaleY += (bone.data.scaleY * (prevFrameY + (frames[frameIndex + 2/*FRAME_Y*/] - prevFrameY) * percent) - bone.scaleY) * alpha; } }; spine.ColorTimeline = function (frameCount) { this.curves = new spine.Curves(frameCount); this.frames = []; // time, r, g, b, a, ... this.frames.length = frameCount * 5; }; spine.ColorTimeline.prototype = { slotIndex: 0, getFrameCount: function () { return this.frames.length / 5; }, setFrame: function (frameIndex, time, r, g, b, a) { frameIndex *= 5; this.frames[frameIndex] = time; this.frames[frameIndex + 1] = r; this.frames[frameIndex + 2] = g; this.frames[frameIndex + 3] = b; this.frames[frameIndex + 4] = a; }, apply: function (skeleton, lastTime, time, firedEvents, alpha) { var frames = this.frames; if (time < frames[0]) return; // Time is before first frame. var r, g, b, a; if (time >= frames[frames.length - 5]) { // Time is after last frame. var i = frames.length - 1; r = frames[i - 3]; g = frames[i - 2]; b = frames[i - 1]; a = frames[i]; } else { // Interpolate between the previous frame and the current frame. var frameIndex = spine.Animation.binarySearch(frames, time, 5); var prevFrameR = frames[frameIndex - 4]; var prevFrameG = frames[frameIndex - 3]; var prevFrameB = frames[frameIndex - 2]; var prevFrameA = frames[frameIndex - 1]; var frameTime = frames[frameIndex]; var percent = 1 - (time - frameTime) / (frames[frameIndex - 5/*PREV_FRAME_TIME*/] - frameTime); percent = this.curves.getCurvePercent(frameIndex / 5 - 1, percent); r = prevFrameR + (frames[frameIndex + 1/*FRAME_R*/] - prevFrameR) * percent; g = prevFrameG + (frames[frameIndex + 2/*FRAME_G*/] - prevFrameG) * percent; b = prevFrameB + (frames[frameIndex + 3/*FRAME_B*/] - prevFrameB) * percent; a = prevFrameA + (frames[frameIndex + 4/*FRAME_A*/] - prevFrameA) * percent; } var slot = skeleton.slots[this.slotIndex]; if (alpha < 1) { slot.r += (r - slot.r) * alpha; slot.g += (g - slot.g) * alpha; slot.b += (b - slot. * alpha; slot.a += (a - slot.a) * alpha; } else { slot.r = r; slot.g = g; slot.b = b; slot.a = a; } } }; spine.AttachmentTimeline = function (frameCount) { this.curves = new spine.Curves(frameCount); this.frames = []; // time, ... this.frames.length = frameCount; this.attachmentNames = []; this.attachmentNames.length = frameCount; }; spine.AttachmentTimeline.prototype = { slotIndex: 0, getFrameCount: function () { return this.frames.length; }, setFrame: function (frameIndex, time, attachmentName) { this.frames[frameIndex] = time; this.attachmentNames[frameIndex] = attachmentName; }, apply: function (skeleton, lastTime, time, firedEvents, alpha) { var frames = this.frames; if (time < frames[0]) { if (lastTime > time) this.apply(skeleton, lastTime, Number.MAX_VALUE, null, 0); return; } else if (lastTime > time) // lastTime = -1; var frameIndex = time >= frames[frames.length - 1] ? frames.length - 1 : spine.Animation.binarySearch1(frames, time) - 1; if (frames[frameIndex] < lastTime) return; var attachmentName = this.attachmentNames[frameIndex]; skeleton.slots[this.slotIndex].setAttachment( !attachmentName ? null : skeleton.getAttachmentBySlotIndex(this.slotIndex, attachmentName)); } }; spine.EventTimeline = function (frameCount) { this.frames = []; // time, ... this.frames.length = frameCount; this.events = []; this.events.length = frameCount; }; spine.EventTimeline.prototype = { getFrameCount: function () { return this.frames.length; }, setFrame: function (frameIndex, time, event) { this.frames[frameIndex] = time; this.events[frameIndex] = event; }, /** Fires events for frames > lastTime and <= time. */ apply: function (skeleton, lastTime, time, firedEvents, alpha) { if (!firedEvents) return; var frames = this.frames; var frameCount = frames.length; if (lastTime > time) { // Fire events after last time for looped animations. this.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha); lastTime = -1; } else if (lastTime >= frames[frameCount - 1]) // Last time is after last frame. return; if (time < frames[0]) return; // Time is before first frame. var frameIndex; if (lastTime < frames[0]) frameIndex = 0; else { frameIndex = spine.Animation.binarySearch1(frames, lastTime); var frame = frames[frameIndex]; while (frameIndex > 0) { // Fire multiple events with the same frame. if (frames[frameIndex - 1] != frame) break; frameIndex--; } } var events = this.events; for (; frameIndex < frameCount && time >= frames[frameIndex]; frameIndex++) firedEvents.push(events[frameIndex]); } }; spine.DrawOrderTimeline = function (frameCount) { this.frames = []; // time, ... this.frames.length = frameCount; this.drawOrders = []; this.drawOrders.length = frameCount; }; spine.DrawOrderTimeline.prototype = { getFrameCount: function () { return this.frames.length; }, setFrame: function (frameIndex, time, drawOrder) { this.frames[frameIndex] = time; this.drawOrders[frameIndex] = drawOrder; }, apply: function (skeleton, lastTime, time, firedEvents, alpha) { var frames = this.frames; if (time < frames[0]) return; // Time is before first frame. var frameIndex; if (time >= frames[frames.length - 1]) // Time is after last frame. frameIndex = frames.length - 1; else frameIndex = spine.Animation.binarySearch1(frames, time) - 1; var drawOrder = skeleton.drawOrder; var slots = skeleton.slots; var drawOrderToSetupIndex = this.drawOrders[frameIndex]; if (drawOrderToSetupIndex) { for (var i = 0, n = drawOrderToSetupIndex.length; i < n; i++) drawOrder[i] = drawOrderToSetupIndex[i]; } } }; spine.FfdTimeline = function (frameCount) { this.curves = new spine.Curves(frameCount); this.frames = []; this.frames.length = frameCount; this.frameVertices = []; this.frameVertices.length = frameCount; }; spine.FfdTimeline.prototype = { slotIndex: 0, attachment: 0, getFrameCount: function () { return this.frames.length; }, setFrame: function (frameIndex, time, vertices) { this.frames[frameIndex] = time; this.frameVertices[frameIndex] = vertices; }, apply: function (skeleton, lastTime, time, firedEvents, alpha) { var slot = skeleton.slots[this.slotIndex]; if (slot.attachment != this.attachment) return; var frames = this.frames; if (time < frames[0]) return; // Time is before first frame. var frameVertices = this.frameVertices; var vertexCount = frameVertices[0].length; var vertices = slot.attachmentVertices; if (vertices.length != vertexCount) alpha = 1; vertices.length = vertexCount; if (time >= frames[frames.length - 1]) { // Time is after last frame. var lastVertices = frameVertices[frames.length - 1]; if (alpha < 1) { for (var i = 0; i < vertexCount; i++) vertices[i] += (lastVertices[i] - vertices[i]) * alpha; } else { for (var i = 0; i < vertexCount; i++) vertices[i] = lastVertices[i]; } return; } // Interpolate between the previous frame and the current frame. var frameIndex = spine.Animation.binarySearch1(frames, time); var frameTime = frames[frameIndex]; var percent = 1 - (time - frameTime) / (frames[frameIndex - 1] - frameTime); percent = this.curves.getCurvePercent(frameIndex - 1, percent < 0 ? 0 : (percent > 1 ? 1 : percent)); var prevVertices = frameVertices[frameIndex - 1]; var nextVertices = frameVertices[frameIndex]; if (alpha < 1) { for (var i = 0; i < vertexCount; i++) { var prev = prevVertices[i]; vertices[i] += (prev + (nextVertices[i] - prev) * percent - vertices[i]) * alpha; } } else { for (var i = 0; i < vertexCount; i++) { var prev = prevVertices[i]; vertices[i] = prev + (nextVertices[i] - prev) * percent; } } } }; spine.IkConstraintTimeline = function (frameCount) { this.curves = new spine.Curves(frameCount); this.frames = []; // time, mix, bendDirection, ... this.frames.length = frameCount * 3; }; spine.IkConstraintTimeline.prototype = { ikConstraintIndex: 0, getFrameCount: function () { return this.frames.length / 3; }, setFrame: function (frameIndex, time, mix, bendDirection) { frameIndex *= 3; this.frames[frameIndex] = time; this.frames[frameIndex + 1] = mix; this.frames[frameIndex + 2] = bendDirection; }, apply: function (skeleton, lastTime, time, firedEvents, alpha) { var frames = this.frames; if (time < frames[0]) return; // Time is before first frame. var ikConstraint = skeleton.ikConstraints[this.ikConstraintIndex]; if (time >= frames[frames.length - 3]) { // Time is after last frame. ikConstraint.mix += (frames[frames.length - 2] - ikConstraint.mix) * alpha; ikConstraint.bendDirection = frames[frames.length - 1]; return; } // Interpolate between the previous frame and the current frame. var frameIndex = spine.Animation.binarySearch(frames, time, 3); var prevFrameMix = frames[frameIndex + -2/*PREV_FRAME_MIX*/]; var frameTime = frames[frameIndex]; var percent = 1 - (time - frameTime) / (frames[frameIndex + -3/*PREV_FRAME_TIME*/] - frameTime); percent = this.curves.getCurvePercent(frameIndex / 3 - 1, percent); var mix = prevFrameMix + (frames[frameIndex + 1/*FRAME_MIX*/] - prevFrameMix) * percent; ikConstraint.mix += (mix - ikConstraint.mix) * alpha; ikConstraint.bendDirection = frames[frameIndex + -1/*PREV_FRAME_BEND_DIRECTION*/]; } }; spine.FlipXTimeline = function (frameCount) { this.curves = new spine.Curves(frameCount); this.frames = []; // time, flip, ... this.frames.length = frameCount * 2; }; spine.FlipXTimeline.prototype = { boneIndex: 0, getFrameCount: function () { return this.frames.length / 2; }, setFrame: function (frameIndex, time, flip) { frameIndex *= 2; this.frames[frameIndex] = time; this.frames[frameIndex + 1] = flip ? 1 : 0; }, apply: function (skeleton, lastTime, time, firedEvents, alpha) { var frames = this.frames; if (time < frames[0]) { if (lastTime > time) this.apply(skeleton, lastTime, Number.MAX_VALUE, null, 0); return; } else if (lastTime > time) // lastTime = -1; var frameIndex = (time >= frames[frames.length - 2] ? frames.length : spine.Animation.binarySearch(frames, time, 2)) - 2; if (frames[frameIndex] < lastTime) return; skeleton.bones[this.boneIndex].flipX = frames[frameIndex + 1] != 0; } }; spine.FlipYTimeline = function (frameCount) { this.curves = new spine.Curves(frameCount); this.frames = []; // time, flip, ... this.frames.length = frameCount * 2; }; spine.FlipYTimeline.prototype = { boneIndex: 0, getFrameCount: function () { return this.frames.length / 2; }, setFrame: function (frameIndex, time, flip) { frameIndex *= 2; this.frames[frameIndex] = time; this.frames[frameIndex + 1] = flip ? 1 : 0; }, apply: function (skeleton, lastTime, time, firedEvents, alpha) { var frames = this.frames; if (time < frames[0]) { if (lastTime > time) this.apply(skeleton, lastTime, Number.MAX_VALUE, null, 0); return; } else if (lastTime > time) // lastTime = -1; var frameIndex = (time >= frames[frames.length - 2] ? frames.length : spine.Animation.binarySearch(frames, time, 2)) - 2; if (frames[frameIndex] < lastTime) return; skeleton.bones[this.boneIndex].flipY = frames[frameIndex + 1] != 0; } }; spine.SkeletonData = function () { this.bones = []; this.slots = []; this.skins = []; this.events = []; this.animations = []; this.ikConstraints = []; }; spine.SkeletonData.prototype = { name: null, defaultSkin: null, width: 0, height: 0, version: null, hash: null, /** @return May be null. */ findBone: function (boneName) { var bones = this.bones; for (var i = 0, n = bones.length; i < n; i++) if (bones[i].name == boneName) return bones[i]; return null; }, /** @return -1 if the bone was not found. */ findBoneIndex: function (boneName) { var bones = this.bones; for (var i = 0, n = bones.length; i < n; i++) if (bones[i].name == boneName) return i; return -1; }, /** @return May be null. */ findSlot: function (slotName) { var slots = this.slots; for (var i = 0, n = slots.length; i < n; i++) { if (slots[i].name == slotName) return slot[i]; } return null; }, /** @return -1 if the bone was not found. */ findSlotIndex: function (slotName) { var slots = this.slots; for (var i = 0, n = slots.length; i < n; i++) if (slots[i].name == slotName) return i; return -1; }, /** @return May be null. */ findSkin: function (skinName) { var skins = this.skins; for (var i = 0, n = skins.length; i < n; i++) if (skins[i].name == skinName) return skins[i]; return null; }, /** @return May be null. */ findEvent: function (eventName) { var events = this.events; for (var i = 0, n = events.length; i < n; i++) if (events[i].name == eventName) return events[i]; return null; }, /** @return May be null. */ findAnimation: function (animationName) { var animations = this.animations; for (var i = 0, n = animations.length; i < n; i++) if (animations[i].name == animationName) return animations[i]; return null; }, /** @return May be null. */ findIkConstraint: function (ikConstraintName) { var ikConstraints = this.ikConstraints; for (var i = 0, n = ikConstraints.length; i < n; i++) if (ikConstraints[i].name == ikConstraintName) return ikConstraints[i]; return null; } }; spine.Skeleton = function (skeletonData) { this.data = skeletonData; this.bones = []; for (var i = 0, n = skeletonData.bones.length; i < n; i++) { var boneData = skeletonData.bones[i]; var parent = !boneData.parent ? null : this.bones[skeletonData.bones.indexOf(boneData.parent)]; this.bones.push(new spine.Bone(boneData, this, parent)); } this.slots = []; this.drawOrder = []; for (var i = 0, n = skeletonData.slots.length; i < n; i++) { var slotData = skeletonData.slots[i]; var bone = this.bones[skeletonData.bones.indexOf(slotData.boneData)]; var slot = new spine.Slot(slotData, bone); this.slots.push(slot); this.drawOrder.push(i); } this.ikConstraints = []; for (var i = 0, n = skeletonData.ikConstraints.length; i < n; i++) this.ikConstraints.push(new spine.IkConstraint(skeletonData.ikConstraints[i], this)); this.boneCache = []; this.updateCache(); }; spine.Skeleton.prototype = { x: 0, y: 0, skin: null, r: 1, g: 1, b: 1, a: 1, time: 0, flipX: false, flipY: false, /** Caches information about bones and IK constraints. Must be called if bones or IK constraints are added or removed. */ updateCache: function () { var ikConstraints = this.ikConstraints; var ikConstraintsCount = ikConstraints.length; var arrayCount = ikConstraintsCount + 1; var boneCache = this.boneCache; if (boneCache.length > arrayCount) boneCache.length = arrayCount; for (var i = 0, n = boneCache.length; i < n; i++) boneCache[i].length = 0; while (boneCache.length < arrayCount) boneCache[boneCache.length] = []; var nonIkBones = boneCache[0]; var bones = this.bones; outer: for (var i = 0, n = bones.length; i < n; i++) { var bone = bones[i]; var current = bone; do { for (var ii = 0; ii < ikConstraintsCount; ii++) { var ikConstraint = ikConstraints[ii]; var parent = ikConstraint.bones[0]; var child= ikConstraint.bones[ikConstraint.bones.length - 1]; while (true) { if (current == child) { boneCache[ii].push(bone); boneCache[ii + 1].push(bone); continue outer; } if (child == parent) break; child = child.parent; } } current = current.parent; } while (current); nonIkBones[nonIkBones.length] = bone; } }, /** Updates the world transform for each bone. */ updateWorldTransform: function () { var bones = this.bones; for (var i = 0, n = bones.length; i < n; i++) { var bone = bones[i]; bone.rotationIK = bone.rotation; } var i = 0, last = this.boneCache.length - 1; while (true) { var cacheBones = this.boneCache[i]; for (var ii = 0, nn = cacheBones.length; ii < nn; ii++) cacheBones[ii].updateWorldTransform(); if (i == last) break; this.ikConstraints[i].apply(); i++; } }, /** Sets the bones and slots to their setup pose values. */ setToSetupPose: function () { this.setBonesToSetupPose(); this.setSlotsToSetupPose(); }, setBonesToSetupPose: function () { var bones = this.bones; for (var i = 0, n = bones.length; i < n; i++) bones[i].setToSetupPose(); var ikConstraints = this.ikConstraints; for (var i = 0, n = ikConstraints.length; i < n; i++) { var ikConstraint = ikConstraints[i]; ikConstraint.bendDirection = ikConstraint.data.bendDirection; ikConstraint.mix = ikConstraint.data.mix; } }, setSlotsToSetupPose: function () { var slots = this.slots; for (var i = 0, n = slots.length; i < n; i++) { slots[i].setToSetupPose(i); } this.resetDrawOrder(); }, /** @return May return null. */ getRootBone: function () { return this.bones.length ? this.bones[0] : null; }, /** @return May be null. */ findBone: function (boneName) { var bones = this.bones; for (var i = 0, n = bones.length; i < n; i++) if (bones[i].data.name == boneName) return bones[i]; return null; }, /** @return -1 if the bone was not found. */ findBoneIndex: function (boneName) { var bones = this.bones; for (var i = 0, n = bones.length; i < n; i++) if (bones[i].data.name == boneName) return i; return -1; }, /** @return May be null. */ findSlot: function (slotName) { var slots = this.slots; for (var i = 0, n = slots.length; i < n; i++) if (slots[i].data.name == slotName) return slots[i]; return null; }, /** @return -1 if the bone was not found. */ findSlotIndex: function (slotName) { var slots = this.slots; for (var i = 0, n = slots.length; i < n; i++) if (slots[i].data.name == slotName) return i; return -1; }, setSkinByName: function (skinName) { var skin = this.data.findSkin(skinName); if (!skin) throw "Skin not found: " + skinName; this.setSkin(skin); }, /** Sets the skin used to look up attachments before looking in the {@link SkeletonData#getDefaultSkin() default skin}. * Attachments from the new skin are attached if the corresponding attachment from the old skin was attached. If there was * no old skin, each slot's setup mode attachment is attached from the new skin. * @param newSkin May be null. */ setSkin: function (newSkin) { if (newSkin) { if (this.skin) newSkin._attachAll(this, this.skin); else { var slots = this.slots; for (var i = 0, n = slots.length; i < n; i++) { var slot = slots[i]; var name = slot.data.attachmentName; if (name) { var attachment = newSkin.getAttachment(i, name); if (attachment) slot.setAttachment(attachment); } } } } this.skin = newSkin; }, /** @return May be null. */ getAttachmentBySlotName: function (slotName, attachmentName) { return this.getAttachmentBySlotIndex(this.data.findSlotIndex(slotName), attachmentName); }, /** @return May be null. */ getAttachmentBySlotIndex: function (slotIndex, attachmentName) { if (this.skin) { var attachment = this.skin.getAttachment(slotIndex, attachmentName); if (attachment) return attachment; } if (this.data.defaultSkin) return this.data.defaultSkin.getAttachment(slotIndex, attachmentName); return null; }, /** @param attachmentName May be null. */ setAttachment: function (slotName, attachmentName) { var slots = this.slots; for (var i = 0, n = slots.length; i < n; i++) { var slot = slots[i]; if (slot.data.name == slotName) { var attachment = null; if (attachmentName) { attachment = this.getAttachmentBySlotIndex(i, attachmentName); if (!attachment) throw "Attachment not found: " + attachmentName + ", for slot: " + slotName; } slot.setAttachment(attachment); return; } } throw "Slot not found: " + slotName; }, /** @return May be null. */ findIkConstraint: function (ikConstraintName) { var ikConstraints = this.ikConstraints; for (var i = 0, n = ikConstraints.length; i < n; i++) if (ikConstraints[i].data.name == ikConstraintName) return ikConstraints[i]; return null; }, update: function (delta) { this.time += delta; }, resetDrawOrder: function() { for (var i = 0, n = this.drawOrder.length; i < n; i++) this.drawOrder[i] = i; } }; spine.EventData = function (name) { this.name = name; }; spine.EventData.prototype = { intValue: 0, floatValue: 0, stringValue: null }; spine.Event = function (data) { this.data = data; }; spine.Event.prototype = { intValue: 0, floatValue: 0, stringValue: null }; spine.AttachmentType = { region: 0, boundingbox: 1, mesh: 2, skinnedmesh: 3 }; spine.RegionAttachment = function (name) { this.name = name; this.offset = []; this.offset.length = 8; this.uvs = []; this.uvs.length = 8; }; spine.RegionAttachment.prototype = { type: spine.AttachmentType.region, x: 0, y: 0, rotation: 0, scaleX: 1, scaleY: 1, width: 0, height: 0, r: 1, g: 1, b: 1, a: 1, path: null, rendererObject: null, regionOffsetX: 0, regionOffsetY: 0, regionWidth: 0, regionHeight: 0, regionOriginalWidth: 0, regionOriginalHeight: 0, setUVs: function (u, v, u2, v2, rotate) { var uvs = this.uvs; if (rotate) { uvs[2/*X2*/] = u; uvs[3/*Y2*/] = v2; uvs[4/**/] = u; uvs[5/*Y3*/] = v; uvs[6/*X4*/] = u2; uvs[7/*Y4*/] = v; uvs[0/*X1*/] = u2; uvs[1/*Y1*/] = v2; } else { uvs[0/*X1*/] = u; uvs[1/*Y1*/] = v2; uvs[2/*X2*/] = u; uvs[3/*Y2*/] = v; uvs[4/**/] = u2; uvs[5/*Y3*/] = v; uvs[6/*X4*/] = u2; uvs[7/*Y4*/] = v2; } }, updateOffset: function () { var regionScaleX = this.width / this.regionOriginalWidth * this.scaleX; var regionScaleY = this.height / this.regionOriginalHeight * this.scaleY; var localX = -this.width / 2 * this.scaleX + this.regionOffsetX * regionScaleX; var localY = -this.height / 2 * this.scaleY + this.regionOffsetY * regionScaleY; var localX2 = localX + this.regionWidth * regionScaleX; var localY2 = localY + this.regionHeight * regionScaleY; var radians = this.rotation * spine.degRad; var cos = Math.cos(radians); var sin = Math.sin(radians); var localXCos = localX * cos + this.x; var localXSin = localX * sin; var localYCos = localY * cos + this.y; var localYSin = localY * sin; var localX2Cos = localX2 * cos + this.x; var localX2Sin = localX2 * sin; var localY2Cos = localY2 * cos + this.y; var localY2Sin = localY2 * sin; var offset = this.offset; offset[0/*X1*/] = localXCos - localYSin; offset[1/*Y1*/] = localYCos + localXSin; offset[2/*X2*/] = localXCos - localY2Sin; offset[3/*Y2*/] = localY2Cos + localXSin; offset[4/**/] = localX2Cos - localY2Sin; offset[5/*Y3*/] = localY2Cos + localX2Sin; offset[6/*X4*/] = localX2Cos - localYSin; offset[7/*Y4*/] = localYCos + localX2Sin; }, computeVertices: function (x, y, bone, vertices) { x += bone.worldX; y += bone.worldY; var m00 = bone.m00, m01 = bone.m01, m10 = bone.m10, m11 = bone.m11; var offset = this.offset; vertices[0/*X1*/] = offset[0/*X1*/] * m00 + offset[1/*Y1*/] * m01 + x; vertices[1/*Y1*/] = offset[0/*X1*/] * m10 + offset[1/*Y1*/] * m11 + y; vertices[2/*X2*/] = offset[2/*X2*/] * m00 + offset[3/*Y2*/] * m01 + x; vertices[3/*Y2*/] = offset[2/*X2*/] * m10 + offset[3/*Y2*/] * m11 + y; vertices[4/**/] = offset[4/**/] * m00 + offset[5/**/] * m01 + x; vertices[5/**/] = offset[4/**/] * m10 + offset[5/**/] * m11 + y; vertices[6/*X4*/] = offset[6/*X4*/] * m00 + offset[7/*Y4*/] * m01 + x; vertices[7/*Y4*/] = offset[6/*X4*/] * m10 + offset[7/*Y4*/] * m11 + y; } }; spine.MeshAttachment = function (name) { this.name = name; }; spine.MeshAttachment.prototype = { type: spine.AttachmentType.mesh, vertices: null, uvs: null, regionUVs: null, triangles: null, hullLength: 0, r: 1, g: 1, b: 1, a: 1, path: null, rendererObject: null, regionU: 0, regionV: 0, regionU2: 0, regionV2: 0, regionRotate: false, regionOffsetX: 0, regionOffsetY: 0, regionWidth: 0, regionHeight: 0, regionOriginalWidth: 0, regionOriginalHeight: 0, edges: null, width: 0, height: 0, updateUVs: function () { var width = this.regionU2 - this.regionU, height = this.regionV2 - this.regionV; var n = this.regionUVs.length; if (!this.uvs || this.uvs.length != n) { this.uvs = new spine.Float32Array(n); } if (this.regionRotate) { for (var i = 0; i < n; i += 2) { this.uvs[i] = this.regionU + this.regionUVs[i + 1] * width; this.uvs[i + 1] = this.regionV + height - this.regionUVs[i] * height; } } else { for (var i = 0; i < n; i += 2) { this.uvs[i] = this.regionU + this.regionUVs[i] * width; this.uvs[i + 1] = this.regionV + this.regionUVs[i + 1] * height; } } }, computeWorldVertices: function (x, y, slot, worldVertices) { var bone = slot.bone; x += bone.worldX; y += bone.worldY; var m00 = bone.m00, m01 = bone.m01, m10 = bone.m10, m11 = bone.m11; var vertices = this.vertices; var verticesCount = vertices.length; if (slot.attachmentVertices.length == verticesCount) vertices = slot.attachmentVertices; for (var i = 0; i < verticesCount; i += 2) { var vx = vertices[i]; var vy = vertices[i + 1]; worldVertices[i] = vx * m00 + vy * m01 + x; worldVertices[i + 1] = vx * m10 + vy * m11 + y; } } }; spine.SkinnedMeshAttachment = function (name) { this.name = name; }; spine.SkinnedMeshAttachment.prototype = { type: spine.AttachmentType.skinnedmesh, bones: null, weights: null, uvs: null, regionUVs: null, triangles: null, hullLength: 0, r: 1, g: 1, b: 1, a: 1, path: null, rendererObject: null, regionU: 0, regionV: 0, regionU2: 0, regionV2: 0, regionRotate: false, regionOffsetX: 0, regionOffsetY: 0, regionWidth: 0, regionHeight: 0, regionOriginalWidth: 0, regionOriginalHeight: 0, edges: null, width: 0, height: 0, updateUVs: function (u, v, u2, v2, rotate) { var width = this.regionU2 - this.regionU, height = this.regionV2 - this.regionV; var n = this.regionUVs.length; if (!this.uvs || this.uvs.length != n) { this.uvs = new spine.Float32Array(n); } if (this.regionRotate) { for (var i = 0; i < n; i += 2) { this.uvs[i] = this.regionU + this.regionUVs[i + 1] * width; this.uvs[i + 1] = this.regionV + height - this.regionUVs[i] * height; } } else { for (var i = 0; i < n; i += 2) { this.uvs[i] = this.regionU + this.regionUVs[i] * width; this.uvs[i + 1] = this.regionV + this.regionUVs[i + 1] * height; } } }, computeWorldVertices: function (x, y, slot, worldVertices) { var skeletonBones = slot.bone.skeleton.bones; var weights = this.weights; var bones = this.bones; var w = 0, v = 0, b = 0, f = 0, n = bones.length, nn; var wx, wy, bone, vx, vy, weight; if (!slot.attachmentVertices.length) { for (; v < n; w += 2) { wx = 0; wy = 0; nn = bones[v++] + v; for (; v < nn; v++, b += 3) { bone = skeletonBones[bones[v]]; vx = weights[b]; vy = weights[b + 1]; weight = weights[b + 2]; wx += (vx * bone.m00 + vy * bone.m01 + bone.worldX) * weight; wy += (vx * bone.m10 + vy * bone.m11 + bone.worldY) * weight; } worldVertices[w] = wx + x; worldVertices[w + 1] = wy + y; } } else { var ffd = slot.attachmentVertices; for (; v < n; w += 2) { wx = 0; wy = 0; nn = bones[v++] + v; for (; v < nn; v++, b += 3, f += 2) { bone = skeletonBones[bones[v]]; vx = weights[b] + ffd[f]; vy = weights[b + 1] + ffd[f + 1]; weight = weights[b + 2]; wx += (vx * bone.m00 + vy * bone.m01 + bone.worldX) * weight; wy += (vx * bone.m10 + vy * bone.m11 + bone.worldY) * weight; } worldVertices[w] = wx + x; worldVertices[w + 1] = wy + y; } } } }; spine.BoundingBoxAttachment = function (name) { this.name = name; this.vertices = []; }; spine.BoundingBoxAttachment.prototype = { type: spine.AttachmentType.boundingbox, computeWorldVertices: function (x, y, bone, worldVertices) { x += bone.worldX; y += bone.worldY; var m00 = bone.m00, m01 = bone.m01, m10 = bone.m10, m11 = bone.m11; var vertices = this.vertices; for (var i = 0, n = vertices.length; i < n; i += 2) { var px = vertices[i]; var py = vertices[i + 1]; worldVertices[i] = px * m00 + py * m01 + x; worldVertices[i + 1] = px * m10 + py * m11 + y; } } }; spine.AnimationStateData = function (skeletonData) { this.skeletonData = skeletonData; this.animationToMixTime = {}; }; spine.AnimationStateData.prototype = { defaultMix: 0, setMixByName: function (fromName, toName, duration) { var from = this.skeletonData.findAnimation(fromName); if (!from) throw "Animation not found: " + fromName; var to = this.skeletonData.findAnimation(toName); if (!to) throw "Animation not found: " + toName; this.setMix(from, to, duration); }, setMix: function (from, to, duration) { this.animationToMixTime[from.name + ":" + to.name] = duration; }, getMix: function (from, to) { var key = from.name + ":" + to.name; return this.animationToMixTime.hasOwnProperty(key) ? this.animationToMixTime[key] : this.defaultMix; } }; spine.TrackEntry = function () {}; spine.TrackEntry.prototype = { next: null, previous: null, animation: null, loop: false, delay: 0, time: 0, lastTime: -1, endTime: 0, timeScale: 1, mixTime: 0, mixDuration: 0, mix: 1, onStart: null, onEnd: null, onComplete: null, onEvent: null }; spine.AnimationState = function (stateData) { this.data = stateData; this.tracks = []; this.events = []; }; spine.AnimationState.prototype = { onStart: null, onEnd: null, onComplete: null, onEvent: null, timeScale: 1, update: function (delta) { delta *= this.timeScale; for (var i = 0; i < this.tracks.length; i++) { var current = this.tracks[i]; if (!current) continue; current.time += delta * current.timeScale; if (current.previous) { var previousDelta = delta * current.previous.timeScale; current.previous.time += previousDelta; current.mixTime += previousDelta; } var next = current.next; if (next) { next.time = current.lastTime - next.delay; if (next.time >= 0) this.setCurrent(i, next); } else { // End non-looping animation when it reaches its end time and there is no next entry. if (!current.loop && current.lastTime >= current.endTime) this.clearTrack(i); } } }, apply: function (skeleton) { skeleton.resetDrawOrder(); for (var i = 0; i < this.tracks.length; i++) { var current = this.tracks[i]; if (!current) continue; this.events.length = 0; var time = current.time; var lastTime = current.lastTime; var endTime = current.endTime; var loop = current.loop; if (!loop && time > endTime) time = endTime; var previous = current.previous; if (!previous) { if (current.mix == 1) current.animation.apply(skeleton, current.lastTime, time, loop, this.events); else current.animation.mix(skeleton, current.lastTime, time, loop, this.events, current.mix); } else { var previousTime = previous.time; if (!previous.loop && previousTime > previous.endTime) previousTime = previous.endTime; previous.animation.apply(skeleton, previousTime, previousTime, previous.loop, null); var alpha = current.mixTime / current.mixDuration * current.mix; if (alpha >= 1) { alpha = 1; current.previous = null; } current.animation.mix(skeleton, current.lastTime, time, loop, this.events, alpha); } for (var ii = 0, nn = this.events.length; ii < nn; ii++) { var event = this.events[ii]; if (current.onEvent) current.onEvent(i, event); if (this.onEvent) this.onEvent(i, event); } // Check if completed the animation or a loop iteration. if (loop ? (lastTime % endTime > time % endTime) : (lastTime < endTime && time >= endTime)) { var count = Math.floor(time / endTime); if (current.onComplete) current.onComplete(i, count); if (this.onComplete) this.onComplete(i, count); } current.lastTime = current.time; } }, clearTracks: function () { for (var i = 0, n = this.tracks.length; i < n; i++) this.clearTrack(i); this.tracks.length = 0; }, clearTrack: function (trackIndex) { if (trackIndex >= this.tracks.length) return; var current = this.tracks[trackIndex]; if (!current) return; if (current.onEnd) current.onEnd(trackIndex); if (this.onEnd) this.onEnd(trackIndex); this.tracks[trackIndex] = null; }, _expandToIndex: function (index) { if (index < this.tracks.length) return this.tracks[index]; while (index >= this.tracks.length) this.tracks.push(null); return null; }, setCurrent: function (index, entry) { var current = this._expandToIndex(index); if (current) { var previous = current.previous; current.previous = null; if (current.onEnd) current.onEnd(index); if (this.onEnd) this.onEnd(index); entry.mixDuration = this.data.getMix(current.animation, entry.animation); if (entry.mixDuration > 0) { entry.mixTime = 0; // If a mix is in progress, mix from the closest animation. if (previous && current.mixTime / current.mixDuration < 0.5) entry.previous = previous; else entry.previous = current; } } this.tracks[index] = entry; if (entry.onStart) entry.onStart(index); if (this.onStart) this.onStart(index); }, setAnimationByName: function (trackIndex, animationName, loop) { var animation = this.data.skeletonData.findAnimation(animationName); if (!animation) throw "Animation not found: " + animationName; return this.setAnimation(trackIndex, animation, loop); }, /** Set the current animation. Any queued animations are cleared. */ setAnimation: function (trackIndex, animation, loop) { var entry = new spine.TrackEntry(); entry.animation = animation; entry.loop = loop; entry.endTime = animation.duration; this.setCurrent(trackIndex, entry); return entry; }, addAnimationByName: function (trackIndex, animationName, loop, delay) { var animation = this.data.skeletonData.findAnimation(animationName); if (!animation) throw "Animation not found: " + animationName; return this.addAnimation(trackIndex, animation, loop, delay); }, /** Adds an animation to be played delay seconds after the current or last queued animation. * @param delay May be <= 0 to use duration of previous animation minus any mix duration plus the negative delay. */ addAnimation: function (trackIndex, animation, loop, delay) { var entry = new spine.TrackEntry(); entry.animation = animation; entry.loop = loop; entry.endTime = animation.duration; var last = this._expandToIndex(trackIndex); if (last) { while (last.next) last = last.next; last.next = entry; } else this.tracks[trackIndex] = entry; if (delay <= 0) { if (last) delay += last.endTime - this.data.getMix(last.animation, animation); else delay = 0; } entry.delay = delay; return entry; }, /** May be null. */ getCurrent: function (trackIndex) { if (trackIndex >= this.tracks.length) return null; return this.tracks[trackIndex]; } }; spine.SkeletonJson = function (attachmentLoader) { this.attachmentLoader = attachmentLoader; }; spine.SkeletonJson.prototype = { scale: 1, readSkeletonData: function (root, name) { var skeletonData = new spine.SkeletonData(); skeletonData.name = name; // Skeleton. var skeletonMap = root["skeleton"]; if (skeletonMap) { skeletonData.hash = skeletonMap["hash"]; skeletonData.version = skeletonMap["spine"]; skeletonData.width = skeletonMap["width"] || 0; skeletonData.height = skeletonMap["height"] || 0; } // Bones. var bones = root["bones"]; for (var i = 0, n = bones.length; i < n; i++) { var boneMap = bones[i]; var parent = null; if (boneMap["parent"]) { parent = skeletonData.findBone(boneMap["parent"]); if (!parent) throw "Parent bone not found: " + boneMap["parent"]; } var boneData = new spine.BoneData(boneMap["name"], parent); boneData.length = (boneMap["length"] || 0) * this.scale; boneData.x = (boneMap["x"] || 0) * this.scale; boneData.y = (boneMap["y"] || 0) * this.scale; boneData.rotation = (boneMap["rotation"] || 0); boneData.scaleX = boneMap.hasOwnProperty("scaleX") ? boneMap["scaleX"] : 1; boneData.scaleY = boneMap.hasOwnProperty("scaleY") ? boneMap["scaleY"] : 1; boneData.inheritScale = boneMap.hasOwnProperty("inheritScale") ? boneMap["inheritScale"] : true; boneData.inheritRotation = boneMap.hasOwnProperty("inheritRotation") ? boneMap["inheritRotation"] : true; skeletonData.bones.push(boneData); } // IK constraints. var ik = root["ik"]; if (ik) { for (var i = 0, n = ik.length; i < n; i++) { var ikMap = ik[i]; var ikConstraintData = new spine.IkConstraintData(ikMap["name"]); var bones = ikMap["bones"]; for (var ii = 0, nn = bones.length; ii < nn; ii++) { var bone = skeletonData.findBone(bones[ii]); if (!bone) throw "IK bone not found: " + bones[ii]; ikConstraintData.bones.push(bone); } ikConstraintData.target = skeletonData.findBone(ikMap["target"]); if (!ikConstraintData.target) throw "Target bone not found: " + ikMap["target"]; ikConstraintData.bendDirection = (!ikMap.hasOwnProperty("bendPositive") || ikMap["bendPositive"]) ? 1 : -1; ikConstraintData.mix = ikMap.hasOwnProperty("mix") ? ikMap["mix"] : 1; skeletonData.ikConstraints.push(ikConstraintData); } } // Slots. var slots = root["slots"]; for (var i = 0, n = slots.length; i < n; i++) { var slotMap = slots[i]; var boneData = skeletonData.findBone(slotMap["bone"]); if (!boneData) throw "Slot bone not found: " + slotMap["bone"]; var slotData = new spine.SlotData(slotMap["name"], boneData); var color = slotMap["color"]; if (color) { slotData.r = this.toColor(color, 0); slotData.g = this.toColor(color, 1); slotData.b = this.toColor(color, 2); slotData.a = this.toColor(color, 3); } slotData.attachmentName = slotMap["attachment"]; slotData.additiveBlending = slotMap["additive"] && slotMap["additive"] == "true"; skeletonData.slots.push(slotData); } // Skins. var skins = root["skins"]; for (var skinName in skins) { if (!skins.hasOwnProperty(skinName)) continue; var skinMap = skins[skinName]; var skin = new spine.Skin(skinName); for (var slotName in skinMap) { if (!skinMap.hasOwnProperty(slotName)) continue; var slotIndex = skeletonData.findSlotIndex(slotName); var slotEntry = skinMap[slotName]; for (var attachmentName in slotEntry) { if (!slotEntry.hasOwnProperty(attachmentName)) continue; var attachment = this.readAttachment(skin, attachmentName, slotEntry[attachmentName]); if (attachment) skin.addAttachment(slotIndex, attachmentName, attachment); } } skeletonData.skins.push(skin); if (skin.name == "default") skeletonData.defaultSkin = skin; } // Events. var events = root["events"]; for (var eventName in events) { if (!events.hasOwnProperty(eventName)) continue; var eventMap = events[eventName]; var eventData = new spine.EventData(eventName); eventData.intValue = eventMap["int"] || 0; eventData.floatValue = eventMap["float"] || 0; eventData.stringValue = eventMap["string"] || null; skeletonData.events.push(eventData); } // Animations. var animations = root["animations"]; for (var animationName in animations) { if (!animations.hasOwnProperty(animationName)) continue; this.readAnimation(animationName, animations[animationName], skeletonData); } return skeletonData; }, readAttachment: function (skin, name, map) { name = map["name"] || name; var type = spine.AttachmentType[map["type"] || "region"]; var path = map["path"] || name; var scale = this.scale; if (type == spine.AttachmentType.region) { var region = this.attachmentLoader.newRegionAttachment(skin, name, path); if (!region) return null; region.path = path; region.x = (map["x"] || 0) * scale; region.y = (map["y"] || 0) * scale; region.scaleX = map.hasOwnProperty("scaleX") ? map["scaleX"] : 1; region.scaleY = map.hasOwnProperty("scaleY") ? map["scaleY"] : 1; region.rotation = map["rotation"] || 0; region.width = (map["width"] || 0) * scale; region.height = (map["height"] || 0) * scale; var color = map["color"]; if (color) { region.r = this.toColor(color, 0); region.g = this.toColor(color, 1); region.b = this.toColor(color, 2); region.a = this.toColor(color, 3); } region.updateOffset(); return region; } else if (type == spine.AttachmentType.mesh) { var mesh = this.attachmentLoader.newMeshAttachment(skin, name, path); if (!mesh) return null; mesh.path = path; mesh.vertices = this.getFloatArray(map, "vertices", scale); mesh.triangles = this.getIntArray(map, "triangles"); mesh.regionUVs = this.getFloatArray(map, "uvs", 1); mesh.updateUVs(); color = map["color"]; if (color) { mesh.r = this.toColor(color, 0); mesh.g = this.toColor(color, 1); mesh.b = this.toColor(color, 2); mesh.a = this.toColor(color, 3); } mesh.hullLength = (map["hull"] || 0) * 2; if (map["edges"]) mesh.edges = this.getIntArray(map, "edges"); mesh.width = (map["width"] || 0) * scale; mesh.height = (map["height"] || 0) * scale; return mesh; } else if (type == spine.AttachmentType.skinnedmesh) { var mesh = this.attachmentLoader.newSkinnedMeshAttachment(skin, name, path); if (!mesh) return null; mesh.path = path; var uvs = this.getFloatArray(map, "uvs", 1); var vertices = this.getFloatArray(map, "vertices", 1); var weights = []; var bones = []; for (var i = 0, n = vertices.length; i < n; ) { var boneCount = vertices[i++] | 0; bones[bones.length] = boneCount; for (var nn = i + boneCount * 4; i < nn; ) { bones[bones.length] = vertices[i]; weights[weights.length] = vertices[i + 1] * scale; weights[weights.length] = vertices[i + 2] * scale; weights[weights.length] = vertices[i + 3]; i += 4; } } mesh.bones = bones; mesh.weights = weights; mesh.triangles = this.getIntArray(map, "triangles"); mesh.regionUVs = uvs; mesh.updateUVs(); color = map["color"]; if (color) { mesh.r = this.toColor(color, 0); mesh.g = this.toColor(color, 1); mesh.b = this.toColor(color, 2); mesh.a = this.toColor(color, 3); } mesh.hullLength = (map["hull"] || 0) * 2; if (map["edges"]) mesh.edges = this.getIntArray(map, "edges"); mesh.width = (map["width"] || 0) * scale; mesh.height = (map["height"] || 0) * scale; return mesh; } else if (type == spine.AttachmentType.boundingbox) { var attachment = this.attachmentLoader.newBoundingBoxAttachment(skin, name); var vertices = map["vertices"]; for (var i = 0, n = vertices.length; i < n; i++) attachment.vertices.push(vertices[i] * scale); return attachment; } throw "Unknown attachment type: " + type; }, readAnimation: function (name, map, skeletonData) { var timelines = []; var duration = 0; var slots = map["slots"]; for (var slotName in slots) { if (!slots.hasOwnProperty(slotName)) continue; var slotMap = slots[slotName]; var slotIndex = skeletonData.findSlotIndex(slotName); for (var timelineName in slotMap) { if (!slotMap.hasOwnProperty(timelineName)) continue; var values = slotMap[timelineName]; if (timelineName == "color") { var timeline = new spine.ColorTimeline(values.length); timeline.slotIndex = slotIndex; var frameIndex = 0; for (var i = 0, n = values.length; i < n; i++) { var valueMap = values[i]; var color = valueMap["color"]; var r = this.toColor(color, 0); var g = this.toColor(color, 1); var b = this.toColor(color, 2); var a = this.toColor(color, 3); timeline.setFrame(frameIndex, valueMap["time"], r, g, b, a); this.readCurve(timeline, frameIndex, valueMap); frameIndex++; } timelines.push(timeline); duration = Math.max(duration, timeline.frames[timeline.getFrameCount() * 5 - 5]); } else if (timelineName == "attachment") { var timeline = new spine.AttachmentTimeline(values.length); timeline.slotIndex = slotIndex; var frameIndex = 0; for (var i = 0, n = values.length; i < n; i++) { var valueMap = values[i]; timeline.setFrame(frameIndex++, valueMap["time"], valueMap["name"]); } timelines.push(timeline); duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]); } else throw "Invalid timeline type for a slot: " + timelineName + " (" + slotName + ")"; } } var bones = map["bones"]; for (var boneName in bones) { if (!bones.hasOwnProperty(boneName)) continue; var boneIndex = skeletonData.findBoneIndex(boneName); if (boneIndex == -1) throw "Bone not found: " + boneName; var boneMap = bones[boneName]; for (var timelineName in boneMap) { if (!boneMap.hasOwnProperty(timelineName)) continue; var values = boneMap[timelineName]; if (timelineName == "rotate") { var timeline = new spine.RotateTimeline(values.length); timeline.boneIndex = boneIndex; var frameIndex = 0; for (var i = 0, n = values.length; i < n; i++) { var valueMap = values[i]; timeline.setFrame(frameIndex, valueMap["time"], valueMap["angle"]); this.readCurve(timeline, frameIndex, valueMap); frameIndex++; } timelines.push(timeline); duration = Math.max(duration, timeline.frames[timeline.getFrameCount() * 2 - 2]); } else if (timelineName == "translate" || timelineName == "scale") { var timeline; var timelineScale = 1; if (timelineName == "scale") timeline = new spine.ScaleTimeline(values.length); else { timeline = new spine.TranslateTimeline(values.length); timelineScale = this.scale; } timeline.boneIndex = boneIndex; var frameIndex = 0; for (var i = 0, n = values.length; i < n; i++) { var valueMap = values[i]; var x = (valueMap["x"] || 0) * timelineScale; var y = (valueMap["y"] || 0) * timelineScale; timeline.setFrame(frameIndex, valueMap["time"], x, y); this.readCurve(timeline, frameIndex, valueMap); frameIndex++; } timelines.push(timeline); duration = Math.max(duration, timeline.frames[timeline.getFrameCount() * 3 - 3]); } else if (timelineName == "flipX" || timelineName == "flipY") { var x = timelineName == "flipX"; var timeline = x ? new spine.FlipXTimeline(values.length) : new spine.FlipYTimeline(values.length); timeline.boneIndex = boneIndex; var field = x ? "x" : "y"; var frameIndex = 0; for (var i = 0, n = values.length; i < n; i++) { var valueMap = values[i]; timeline.setFrame(frameIndex, valueMap["time"], valueMap[field] || false); frameIndex++; } timelines.push(timeline); duration = Math.max(duration, timeline.frames[timeline.getFrameCount() * 2 - 2]); } else throw "Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")"; } } var ikMap = map["ik"]; for (var ikConstraintName in ikMap) { if (!ikMap.hasOwnProperty(ikConstraintName)) continue; var ikConstraint = skeletonData.findIkConstraint(ikConstraintName); var values = ikMap[ikConstraintName]; var timeline = new spine.IkConstraintTimeline(values.length); timeline.ikConstraintIndex = skeletonData.ikConstraints.indexOf(ikConstraint); var frameIndex = 0; for (var i = 0, n = values.length; i < n; i++) { var valueMap = values[i]; var mix = valueMap.hasOwnProperty("mix") ? valueMap["mix"] : 1; var bendDirection = (!valueMap.hasOwnProperty("bendPositive") || valueMap["bendPositive"]) ? 1 : -1; timeline.setFrame(frameIndex, valueMap["time"], mix, bendDirection); this.readCurve(timeline, frameIndex, valueMap); frameIndex++; } timelines.push(timeline); duration = Math.max(duration, timeline.frames[timeline.getFrameCount() * 3 - 3]); } var ffd = map["ffd"]; for (var skinName in ffd) { var skin = skeletonData.findSkin(skinName); var slotMap = ffd[skinName]; for (slotName in slotMap) { var slotIndex = skeletonData.findSlotIndex(slotName); var meshMap = slotMap[slotName]; for (var meshName in meshMap) { var values = meshMap[meshName]; var timeline = new spine.FfdTimeline(values.length); var attachment = skin.getAttachment(slotIndex, meshName); if (!attachment) throw "FFD attachment not found: " + meshName; timeline.slotIndex = slotIndex; timeline.attachment = attachment; var isMesh = attachment.type == spine.AttachmentType.mesh; var vertexCount; if (isMesh) vertexCount = attachment.vertices.length; else vertexCount = attachment.weights.length / 3 * 2; var frameIndex = 0; for (var i = 0, n = values.length; i < n; i++) { var valueMap = values[i]; var vertices; if (!valueMap["vertices"]) { if (isMesh) vertices = attachment.vertices; else { vertices = []; vertices.length = vertexCount; } } else { var verticesValue = valueMap["vertices"]; var vertices = []; vertices.length = vertexCount; var start = valueMap["offset"] || 0; var nn = verticesValue.length; if (this.scale == 1) { for (var ii = 0; ii < nn; ii++) vertices[ii + start] = verticesValue[ii]; } else { for (var ii = 0; ii < nn; ii++) vertices[ii + start] = verticesValue[ii] * this.scale; } if (isMesh) { var meshVertices = attachment.vertices; for (var ii = 0, nn = vertices.length; ii < nn; ii++) vertices[ii] += meshVertices[ii]; } } timeline.setFrame(frameIndex, valueMap["time"], vertices); this.readCurve(timeline, frameIndex, valueMap); frameIndex++; } timelines[timelines.length] = timeline; duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]); } } } var drawOrderValues = map["drawOrder"]; if (!drawOrderValues) drawOrderValues = map["draworder"]; if (drawOrderValues) { var timeline = new spine.DrawOrderTimeline(drawOrderValues.length); var slotCount = skeletonData.slots.length; var frameIndex = 0; for (var i = 0, n = drawOrderValues.length; i < n; i++) { var drawOrderMap = drawOrderValues[i]; var drawOrder = null; if (drawOrderMap["offsets"]) { drawOrder = []; drawOrder.length = slotCount; for (var ii = slotCount - 1; ii >= 0; ii--) drawOrder[ii] = -1; var offsets = drawOrderMap["offsets"]; var unchanged = []; unchanged.length = slotCount - offsets.length; var originalIndex = 0, unchangedIndex = 0; for (var ii = 0, nn = offsets.length; ii < nn; ii++) { var offsetMap = offsets[ii]; var slotIndex = skeletonData.findSlotIndex(offsetMap["slot"]); if (slotIndex == -1) throw "Slot not found: " + offsetMap["slot"]; // Collect unchanged items. while (originalIndex != slotIndex) unchanged[unchangedIndex++] = originalIndex++; // Set changed items. drawOrder[originalIndex + offsetMap["offset"]] = originalIndex++; } // Collect remaining unchanged items. while (originalIndex < slotCount) unchanged[unchangedIndex++] = originalIndex++; // Fill in unchanged items. for (var ii = slotCount - 1; ii >= 0; ii--) if (drawOrder[ii] == -1) drawOrder[ii] = unchanged[--unchangedIndex]; } timeline.setFrame(frameIndex++, drawOrderMap["time"], drawOrder); } timelines.push(timeline); duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]); } var events = map["events"]; if (events) { var timeline = new spine.EventTimeline(events.length); var frameIndex = 0; for (var i = 0, n = events.length; i < n; i++) { var eventMap = events[i]; var eventData = skeletonData.findEvent(eventMap["name"]); if (!eventData) throw "Event not found: " + eventMap["name"]; var event = new spine.Event(eventData); event.intValue = eventMap.hasOwnProperty("int") ? eventMap["int"] : eventData.intValue; event.floatValue = eventMap.hasOwnProperty("float") ? eventMap["float"] : eventData.floatValue; event.stringValue = eventMap.hasOwnProperty("string") ? eventMap["string"] : eventData.stringValue; timeline.setFrame(frameIndex++, eventMap["time"], event); } timelines.push(timeline); duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]); } skeletonData.animations.push(new spine.Animation(name, timelines, duration)); }, readCurve: function (timeline, frameIndex, valueMap) { var curve = valueMap["curve"]; if (!curve) timeline.curves.setLinear(frameIndex); else if (curve == "stepped") timeline.curves.setStepped(frameIndex); else if (curve instanceof Array) timeline.curves.setCurve(frameIndex, curve[0], curve[1], curve[2], curve[3]); }, toColor: function (hexString, colorIndex) { if (hexString.length != 8) throw "Color hexidecimal length must be 8, recieved: " + hexString; return parseInt(hexString.substring(colorIndex * 2, (colorIndex * 2) + 2), 16) / 255; }, getFloatArray: function (map, name, scale) { var list = map[name]; var values = new spine.Float32Array(list.length); var i = 0, n = list.length; if (scale == 1) { for (; i < n; i++) values[i] = list[i]; } else { for (; i < n; i++) values[i] = list[i] * scale; } return values; }, getIntArray: function (map, name) { var list = map[name]; var values = new spine.Uint16Array(list.length); for (var i = 0, n = list.length; i < n; i++) values[i] = list[i] | 0; return values; } }; spine.Atlas = function (atlasText, textureLoader) { this.textureLoader = textureLoader; this.pages = []; this.regions = []; var reader = new spine.AtlasReader(atlasText); var tuple = []; tuple.length = 4; var page = null; while (true) { var line = reader.readLine(); if (line === null) break; line = reader.trim(line); if (!line.length) page = null; else if (!page) { page = new spine.AtlasPage(); page.name = line; if (reader.readTuple(tuple) == 2) { // size is only optional for an atlas packed with an old TexturePacker. page.width = parseInt(tuple[0]); page.height = parseInt(tuple[1]); reader.readTuple(tuple); } page.format = spine.Atlas.Format[tuple[0]]; reader.readTuple(tuple); page.minFilter = spine.Atlas.TextureFilter[tuple[0]]; page.magFilter = spine.Atlas.TextureFilter[tuple[1]]; var direction = reader.readValue(); page.uWrap = spine.Atlas.TextureWrap.clampToEdge; page.vWrap = spine.Atlas.TextureWrap.clampToEdge; if (direction == "x") page.uWrap = spine.Atlas.TextureWrap.repeat; else if (direction == "y") page.vWrap = spine.Atlas.TextureWrap.repeat; else if (direction == "xy") page.uWrap = page.vWrap = spine.Atlas.TextureWrap.repeat; textureLoader.load(page, line, this); this.pages.push(page); } else { var region = new spine.AtlasRegion(); region.name = line; region.page = page; region.rotate = reader.readValue() == "true"; reader.readTuple(tuple); var x = parseInt(tuple[0]); var y = parseInt(tuple[1]); reader.readTuple(tuple); var width = parseInt(tuple[0]); var height = parseInt(tuple[1]); region.u = x / page.width; region.v = y / page.height; if (region.rotate) { region.u2 = (x + height) / page.width; region.v2 = (y + width) / page.height; } else { region.u2 = (x + width) / page.width; region.v2 = (y + height) / page.height; } region.x = x; region.y = y; region.width = Math.abs(width); region.height = Math.abs(height); if (reader.readTuple(tuple) == 4) { // split is optional region.splits = [parseInt(tuple[0]), parseInt(tuple[1]), parseInt(tuple[2]), parseInt(tuple[3])]; if (reader.readTuple(tuple) == 4) { // pad is optional, but only present with splits region.pads = [parseInt(tuple[0]), parseInt(tuple[1]), parseInt(tuple[2]), parseInt(tuple[3])]; reader.readTuple(tuple); } } region.originalWidth = parseInt(tuple[0]); region.originalHeight = parseInt(tuple[1]); reader.readTuple(tuple); region.offsetX = parseInt(tuple[0]); region.offsetY = parseInt(tuple[1]); region.index = parseInt(reader.readValue()); this.regions.push(region); } } }; spine.Atlas.prototype = { findRegion: function (name) { var regions = this.regions; for (var i = 0, n = regions.length; i < n; i++) if (regions[i].name == name) return regions[i]; return null; }, dispose: function () { var pages = this.pages; for (var i = 0, n = pages.length; i < n; i++) this.textureLoader.unload(pages[i].rendererObject); }, updateUVs: function (page) { var regions = this.regions; for (var i = 0, n = regions.length; i < n; i++) { var region = regions[i]; if (region.page != page) continue; region.u = region.x / page.width; region.v = region.y / page.height; if (region.rotate) { region.u2 = (region.x + region.height) / page.width; region.v2 = (region.y + region.width) / page.height; } else { region.u2 = (region.x + region.width) / page.width; region.v2 = (region.y + region.height) / page.height; } } } }; spine.Atlas.Format = { alpha: 0, intensity: 1, luminanceAlpha: 2, rgb565: 3, rgba4444: 4, rgb888: 5, rgba8888: 6 }; spine.Atlas.TextureFilter = { nearest: 0, linear: 1, mipMap: 2, mipMapNearestNearest: 3, mipMapLinearNearest: 4, mipMapNearestLinear: 5, mipMapLinearLinear: 6 }; spine.Atlas.TextureWrap = { mirroredRepeat: 0, clampToEdge: 1, repeat: 2 }; spine.AtlasPage = function () {}; spine.AtlasPage.prototype = { name: null, format: null, minFilter: null, magFilter: null, uWrap: null, vWrap: null, rendererObject: null, width: 0, height: 0 }; spine.AtlasRegion = function () {}; spine.AtlasRegion.prototype = { page: null, name: null, x: 0, y: 0, width: 0, height: 0, u: 0, v: 0, u2: 0, v2: 0, offsetX: 0, offsetY: 0, originalWidth: 0, originalHeight: 0, index: 0, rotate: false, splits: null, pads: null }; spine.AtlasReader = function (text) { this.lines = text.split(/\r\n|\r|\n/); }; spine.AtlasReader.prototype = { index: 0, trim: function (value) { return value.replace(/^\s+|\s+$/g, ""); }, readLine: function () { if (this.index >= this.lines.length) return null; return this.lines[this.index++]; }, readValue: function () { var line = this.readLine(); var colon = line.indexOf(":"); if (colon == -1) throw "Invalid line: " + line; return this.trim(line.substring(colon + 1)); }, /** Returns the number of tuple values read (1, 2 or 4). */ readTuple: function (tuple) { var line = this.readLine(); var colon = line.indexOf(":"); if (colon == -1) throw "Invalid line: " + line; var i = 0, lastMatch = colon + 1; for (; i < 3; i++) { var comma = line.indexOf(",", lastMatch); if (comma == -1) break; tuple[i] = this.trim(line.substr(lastMatch, comma - lastMatch)); lastMatch = comma + 1; } tuple[i] = this.trim(line.substring(lastMatch)); return i + 1; } }; spine.AtlasAttachmentLoader = function (atlas) { this.atlas = atlas; }; spine.AtlasAttachmentLoader.prototype = { newRegionAttachment: function (skin, name, path) { var region = this.atlas.findRegion(path); if (!region) throw "Region not found in atlas: " + path + " (region attachment: " + name + ")"; var attachment = new spine.RegionAttachment(name); attachment.rendererObject = region; attachment.setUVs(region.u, region.v, region.u2, region.v2, region.rotate); attachment.regionOffsetX = region.offsetX; attachment.regionOffsetY = region.offsetY; attachment.regionWidth = region.width; attachment.regionHeight = region.height; attachment.regionOriginalWidth = region.originalWidth; attachment.regionOriginalHeight = region.originalHeight; return attachment; }, newMeshAttachment: function (skin, name, path) { var region = this.atlas.findRegion(path); if (!region) throw "Region not found in atlas: " + path + " (mesh attachment: " + name + ")"; var attachment = new spine.MeshAttachment(name); attachment.rendererObject = region; attachment.regionU = region.u; attachment.regionV = region.v; attachment.regionU2 = region.u2; attachment.regionV2 = region.v2; attachment.regionRotate = region.rotate; attachment.regionOffsetX = region.offsetX; attachment.regionOffsetY = region.offsetY; attachment.regionWidth = region.width; attachment.regionHeight = region.height; attachment.regionOriginalWidth = region.originalWidth; attachment.regionOriginalHeight = region.originalHeight; return attachment; }, newSkinnedMeshAttachment: function (skin, name, path) { var region = this.atlas.findRegion(path); if (!region) throw "Region not found in atlas: " + path + " (skinned mesh attachment: " + name + ")"; var attachment = new spine.SkinnedMeshAttachment(name); attachment.rendererObject = region; attachment.regionU = region.u; attachment.regionV = region.v; attachment.regionU2 = region.u2; attachment.regionV2 = region.v2; attachment.regionRotate = region.rotate; attachment.regionOffsetX = region.offsetX; attachment.regionOffsetY = region.offsetY; attachment.regionWidth = region.width; attachment.regionHeight = region.height; attachment.regionOriginalWidth = region.originalWidth; attachment.regionOriginalHeight = region.originalHeight; return attachment; }, newBoundingBoxAttachment: function (skin, name) { return new spine.BoundingBoxAttachment(name); } }; spine.SkeletonBounds = function () { this.polygonPool = []; this.polygons = []; this.boundingBoxes = []; }; spine.SkeletonBounds.prototype = { minX: 0, minY: 0, maxX: 0, maxY: 0, update: function (skeleton, updateAabb) { var slots = skeleton.slots; var slotCount = slots.length; var x = skeleton.x, y = skeleton.y; var boundingBoxes = this.boundingBoxes; var polygonPool = this.polygonPool; var polygons = this.polygons; boundingBoxes.length = 0; for (var i = 0, n = polygons.length; i < n; i++) polygonPool.push(polygons[i]); polygons.length = 0; for (var i = 0; i < slotCount; i++) { var slot = slots[i]; var boundingBox = slot.attachment; if (boundingBox.type != spine.AttachmentType.boundingbox) continue; boundingBoxes.push(boundingBox); var poolCount = polygonPool.length, polygon; if (poolCount > 0) { polygon = polygonPool[poolCount - 1]; polygonPool.splice(poolCount - 1, 1); } else polygon = []; polygons.push(polygon); polygon.length = boundingBox.vertices.length; boundingBox.computeWorldVertices(x, y, slot.bone, polygon); } if (updateAabb) this.aabbCompute(); }, aabbCompute: function () { var polygons = this.polygons; var minX = Number.MAX_VALUE, minY = Number.MAX_VALUE, maxX = Number.MIN_VALUE, maxY = Number.MIN_VALUE; for (var i = 0, n = polygons.length; i < n; i++) { var vertices = polygons[i]; for (var ii = 0, nn = vertices.length; ii < nn; ii += 2) { var x = vertices[ii]; var y = vertices[ii + 1]; minX = Math.min(minX, x); minY = Math.min(minY, y); maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); } } this.minX = minX; this.minY = minY; this.maxX = maxX; this.maxY = maxY; }, /** Returns true if the axis aligned bounding box contains the point. */ aabbContainsPoint: function (x, y) { return x >= this.minX && x <= this.maxX && y >= this.minY && y <= this.maxY; }, /** Returns true if the axis aligned bounding box intersects the line segment. */ aabbIntersectsSegment: function (x1, y1, x2, y2) { var minX = this.minX, minY = this.minY, maxX = this.maxX, maxY = this.maxY; if ((x1 <= minX && x2 <= minX) || (y1 <= minY && y2 <= minY) || (x1 >= maxX && x2 >= maxX) || (y1 >= maxY && y2 >= maxY)) return false; var m = (y2 - y1) / (x2 - x1); var y = m * (minX - x1) + y1; if (y > minY && y < maxY) return true; y = m * (maxX - x1) + y1; if (y > minY && y < maxY) return true; var x = (minY - y1) / m + x1; if (x > minX && x < maxX) return true; x = (maxY - y1) / m + x1; if (x > minX && x < maxX) return true; return false; }, /** Returns true if the axis aligned bounding box intersects the axis aligned bounding box of the specified bounds. */ aabbIntersectsSkeleton: function (bounds) { return this.minX < bounds.maxX && this.maxX > bounds.minX && this.minY < bounds.maxY && this.maxY > bounds.minY; }, /** Returns the first bounding box attachment that contains the point, or null. When doing many checks, it is usually more * efficient to only call this method if {@link #aabbContainsPoint(float, float)} returns true. */ containsPoint: function (x, y) { var polygons = this.polygons; for (var i = 0, n = polygons.length; i < n; i++) if (this.polygonContainsPoint(polygons[i], x, y)) return this.boundingBoxes[i]; return null; }, /** Returns the first bounding box attachment that contains the line segment, or null. When doing many checks, it is usually * more efficient to only call this method if {@link #aabbIntersectsSegment(float, float, float, float)} returns true. */ intersectsSegment: function (x1, y1, x2, y2) { var polygons = this.polygons; for (var i = 0, n = polygons.length; i < n; i++) if (polygons[i].intersectsSegment(x1, y1, x2, y2)) return this.boundingBoxes[i]; return null; }, /** Returns true if the polygon contains the point. */ polygonContainsPoint: function (polygon, x, y) { var nn = polygon.length; var prevIndex = nn - 2; var inside = false; for (var ii = 0; ii < nn; ii += 2) { var vertexY = polygon[ii + 1]; var prevY = polygon[prevIndex + 1]; if ((vertexY < y && prevY >= y) || (prevY < y && vertexY >= y)) { var vertexX = polygon[ii]; if (vertexX + (y - vertexY) / (prevY - vertexY) * (polygon[prevIndex] - vertexX) < x) inside = !inside; } prevIndex = ii; } return inside; }, /** Returns true if the polygon contains the line segment. */ polygonIntersectsSegment: function (polygon, x1, y1, x2, y2) { var nn = polygon.length; var width12 = x1 - x2, height12 = y1 - y2; var det1 = x1 * y2 - y1 * x2; var = polygon[nn - 2], y3 = polygon[nn - 1]; for (var ii = 0; ii < nn; ii += 2) { var x4 = polygon[ii], y4 = polygon[ii + 1]; var det2 = * y4 - y3 * x4; var width34 = - x4, height34 = y3 - y4; var det3 = width12 * height34 - height12 * width34; var x = (det1 * width34 - width12 * det2) / det3; if (((x >= && x <= x4) || (x >= x4 && x <= )) && ((x >= x1 && x <= x2) || (x >= x2 && x <= x1))) { var y = (det1 * height34 - height12 * det2) / det3; if (((y >= y3 && y <= y4) || (y >= y4 && y <= y3)) && ((y >= y1 && y <= y2) || (y >= y2 && y <= y1))) return true; } = x4; y3 = y4; } return false; }, getPolygon: function (attachment) { var index = this.boundingBoxes.indexOf(attachment); return index == -1 ? null : this.polygons[index]; }, getWidth: function () { return this.maxX - this.minX; }, getHeight: function () { return this.maxY - this.minY; } }; /* Esoteric Software SPINE wrapper for pixi.js */ spine.Bone.yDown = true; PIXI.AnimCache = {}; /** * Supporting class to load images from spine atlases as per spine spec. * * @class SpineTextureLoader * @uses EventTarget * @constructor * @param basePath {String} Tha base path where to look for the images to be loaded * @param crossorigin {Boolean} Whether requests should be treated as crossorigin */ PIXI.SpineTextureLoader = function(basePath, crossorigin) { PIXI.EventTarget.call(this); this.basePath = basePath; this.crossorigin = crossorigin; this.loadingCount = 0; }; /* constructor */ PIXI.SpineTextureLoader.prototype = PIXI.SpineTextureLoader; /** * Starts loading a base texture as per spine specification * * @method load * @param page {spine.AtlasPage} Atlas page to which texture belongs * @param file {String} The file to load, this is just the file path relative to the base path configured in the constructor */ PIXI.SpineTextureLoader.prototype.load = function(page, file) { page.rendererObject = PIXI.BaseTexture.fromImage(this.basePath + '/' + file, this.crossorigin); if (!page.rendererObject.hasLoaded) { var scope = this; ++scope.loadingCount; page.rendererObject.addEventListener('loaded', function(){ --scope.loadingCount; scope.dispatchEvent({ type: 'loadedBaseTexture', content: scope }); }); } }; /** * Unloads a previously loaded texture as per spine specification * * @method unload * @param texture {BaseTexture} Texture object to destroy */ PIXI.SpineTextureLoader.prototype.unload = function(texture) { texture.destroy(true); }; /** * A class that enables the you to import and run your spine animations in pixi. * Spine animation data needs to be loaded using the PIXI.AssetLoader or PIXI.SpineLoader before it can be used by this class * See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source * * @class Spine * @extends DisplayObjectContainer * @constructor * @param url {String} The url of the spine anim file to be used */ PIXI.Spine = function (url) { PIXI.DisplayObjectContainer.call(this); this.spineData = PIXI.AnimCache[url]; if (!this.spineData) { throw new Error('Spine data must be preloaded using PIXI.SpineLoader or PIXI.AssetLoader: ' + url); } this.skeleton = new spine.Skeleton(this.spineData); this.skeleton.updateWorldTransform(); this.stateData = new spine.AnimationStateData(this.spineData); this.state = new spine.AnimationState(this.stateData); this.slotContainers = []; for (var i = 0, n = this.skeleton.slots.length; i < n; i++) { var slot = this.skeleton.slots[i]; var attachment = slot.attachment; var slotContainer = new PIXI.DisplayObjectContainer(); this.slotContainers.push(slotContainer); this.addChild(slotContainer); if (attachment instanceof spine.RegionAttachment) { var spriteName = attachment.rendererObject.name; var sprite = this.createSprite(slot, attachment); slot.currentSprite = sprite; slot.currentSpriteName = spriteName; slotContainer.addChild(sprite); } else if (attachment instanceof spine.MeshAttachment) { var mesh = this.createMesh(slot, attachment); slot.currentMesh = mesh; slot.currentMeshName = attachment.name; slotContainer.addChild(mesh); } else { continue; } } this.autoUpdate = true; }; PIXI.Spine.prototype = Object.create(PIXI.DisplayObjectContainer.prototype); PIXI.Spine.prototype.constructor = PIXI.Spine; /** * If this flag is set to true, the spine animation will be autoupdated every time * the object id drawn. The down side of this approach is that the delta time is * automatically calculated and you could miss out on cool effects like slow motion, * pause, skip ahead and the sorts. Most of these effects can be achieved even with * autoupdate enabled but are harder to achieve. * * @property autoUpdate * @type { Boolean } * @default true */ Object.defineProperty(PIXI.Spine.prototype, 'autoUpdate', { get: function() { return (this.updateTransform === PIXI.Spine.prototype.autoUpdateTransform); }, set: function(value) { this.updateTransform = value ? PIXI.Spine.prototype.autoUpdateTransform : PIXI.DisplayObjectContainer.prototype.updateTransform; } }); /** * Update the spine skeleton and its animations by delta time (dt) * * @method update * @param dt {Number} Delta time. Time by which the animation should be updated */ PIXI.Spine.prototype.update = function(dt) { this.state.update(dt); this.state.apply(this.skeleton); this.skeleton.updateWorldTransform(); var drawOrder = this.skeleton.drawOrder; var slots = this.skeleton.slots; for (var i = 0, n = drawOrder.length; i < n; i++) this.children[i] = this.slotContainers[drawOrder[i]]; for (i = 0, n = slots.length; i < n; i++) { var slot = slots[i]; var attachment = slot.attachment; var slotContainer = this.slotContainers[i]; if (!attachment) { slotContainer.visible = false; continue; } var type = attachment.type; if (type === spine.AttachmentType.region) { if (attachment.rendererObject) { if (!slot.currentSpriteName || slot.currentSpriteName !== attachment.name) { var spriteName = attachment.rendererObject.name; if (slot.currentSprite !== undefined) { slot.currentSprite.visible = false; } slot.sprites = slot.sprites || {}; if (slot.sprites[spriteName] !== undefined) { slot.sprites[spriteName].visible = true; } else { var sprite = this.createSprite(slot, attachment); slotContainer.addChild(sprite); } slot.currentSprite = slot.sprites[spriteName]; slot.currentSpriteName = spriteName; } } var bone = slot.bone; slotContainer.position.x = bone.worldX + attachment.x * bone.m00 + attachment.y * bone.m01; slotContainer.position.y = bone.worldY + attachment.x * bone.m10 + attachment.y * bone.m11; slotContainer.scale.x = bone.worldScaleX; slotContainer.scale.y = bone.worldScaleY; slotContainer.rotation = -(slot.bone.worldRotation * spine.degRad); slot.currentSprite.tint = PIXI.rgb2hex([slot.r,slot.g,slot.b]); } else if (type === spine.AttachmentType.skinnedmesh) { if (!slot.currentMeshName || slot.currentMeshName !== attachment.name) { var meshName = attachment.name; if (slot.currentMesh !== undefined) { slot.currentMesh.visible = false; } slot.meshes = slot.meshes || {}; if (slot.meshes[meshName] !== undefined) { slot.meshes[meshName].visible = true; } else { var mesh = this.createMesh(slot, attachment); slotContainer.addChild(mesh); } slot.currentMesh = slot.meshes[meshName]; slot.currentMeshName = meshName; } attachment.computeWorldVertices(slot.bone.skeleton.x, slot.bone.skeleton.y, slot, slot.currentMesh.vertices); } else { slotContainer.visible = false; continue; } slotContainer.visible = true; slotContainer.alpha = slot.a; } }; /** * When autoupdate is set to yes this function is used as pixi's updateTransform function * * @method autoUpdateTransform * @private */ PIXI.Spine.prototype.autoUpdateTransform = function () { this.lastTime = this.lastTime || Date.now(); var timeDelta = (Date.now() - this.lastTime) * 0.001; this.lastTime = Date.now(); this.update(timeDelta); PIXI.DisplayObjectContainer.prototype.updateTransform.call(this); }; /** * Create a new sprite to be used with spine.RegionAttachment * * @method createSprite * @param slot {spine.Slot} The slot to which the attachment is parented * @param attachment {spine.RegionAttachment} The attachment that the sprite will represent * @private */ PIXI.Spine.prototype.createSprite = function (slot, attachment) { var descriptor = attachment.rendererObject; var baseTexture = descriptor.page.rendererObject; var spriteRect = new PIXI.Rectangle(descriptor.x, descriptor.y, descriptor.rotate ? descriptor.height : descriptor.width, descriptor.rotate ? descriptor.width : descriptor.height); var spriteTexture = new PIXI.Texture(baseTexture, spriteRect); var sprite = new PIXI.Sprite(spriteTexture); var baseRotation = descriptor.rotate ? Math.PI * 0.5 : 0.0; sprite.scale.set(descriptor.width / descriptor.originalWidth * attachment.scaleX, descriptor.height / descriptor.originalHeight * attachment.scaleY); sprite.rotation = baseRotation - (attachment.rotation * spine.degRad); sprite.anchor.x = sprite.anchor.y = 0.5; sprite.alpha = attachment.a; slot.sprites = slot.sprites || {}; slot.sprites[descriptor.name] = sprite; return sprite; }; PIXI.Spine.prototype.createMesh = function (slot, attachment) { var descriptor = attachment.rendererObject; var baseTexture = descriptor.page.rendererObject; var texture = new PIXI.Texture(baseTexture); var strip = new PIXI.Strip(texture); strip.drawMode = PIXI.Strip.DrawModes.TRIANGLES; strip.canvasPadding = 1.5; strip.vertices = new PIXI.Float32Array(attachment.uvs.length); strip.uvs = attachment.uvs; strip.indices = attachment.triangles; strip.alpha = attachment.a; slot.meshes = slot.meshes || {}; slot.meshes[attachment.name] = strip; return strip; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ PIXI.BaseTextureCache = {}; PIXI.BaseTextureCacheIdGenerator = 0; /** * A texture stores the information that represents an image. All textures have a base texture. * * @class BaseTexture * @uses EventTarget * @constructor * @param source {String} the source object (image or canvas) * @param scaleMode {Number} See {{#crossLink "PIXI/scaleModes:property"}}PIXI.scaleModes{{/crossLink}} for possible values */ PIXI.BaseTexture = function(source, scaleMode) { /** * The Resolution of the texture. * * @property resolution * @type Number */ this.resolution = 1; /** * [read-only] The width of the base texture set when the image has loaded * * @property width * @type Number * @readOnly */ this.width = 100; /** * [read-only] The height of the base texture set when the image has loaded * * @property height * @type Number * @readOnly */ this.height = 100; /** * The scale mode to apply when scaling this texture * * @property scaleMode * @type {Number} * @default PIXI.scaleModes.LINEAR */ this.scaleMode = scaleMode || PIXI.scaleModes.DEFAULT; /** * [read-only] Set to true once the base texture has loaded * * @property hasLoaded * @type Boolean * @readOnly */ this.hasLoaded = false; /** * The image source that is used to create the texture. * * @property source * @type Image */ this.source = source; this._UID = PIXI._UID++; /** * Controls if RGB channels should be pre-multiplied by Alpha (WebGL only) * * @property premultipliedAlpha * @type Boolean * @default true */ this.premultipliedAlpha = true; // used for webGL /** * @property _glTextures * @type Array * @private */ this._glTextures = []; /** * * Set this to true if a mipmap of this texture needs to be generated. This value needs to be set before the texture is used * Also the texture must be a power of two size to work * * @property mipmap * @type {Boolean} */ this.mipmap = false; // used for webGL texture updating... // TODO - this needs to be addressed /** * @property _dirty * @type Array * @private */ this._dirty = [true, true, true, true]; if(!source)return; if((this.source.complete || this.source.getContext) && this.source.width && this.source.height) { this.hasLoaded = true; this.width = this.source.naturalWidth || this.source.width; this.height = this.source.naturalHeight || this.source.height; this.dirty(); } else { var scope = this; this.source.onload = function() { scope.hasLoaded = true; scope.width = scope.source.naturalWidth || scope.source.width; scope.height = scope.source.naturalHeight || scope.source.height; scope.dirty(); // add it to somewhere... scope.dispatchEvent( { type: 'loaded', content: scope } ); }; this.source.onerror = function() { scope.dispatchEvent( { type: 'error', content: scope } ); }; } /** * @property imageUrl * @type String */ this.imageUrl = null; /** * @property _powerOf2 * @type Boolean * @private */ this._powerOf2 = false; }; PIXI.BaseTexture.prototype.constructor = PIXI.BaseTexture; PIXI.EventTarget.mixin(PIXI.BaseTexture.prototype); /** * Destroys this base texture * * @method destroy */ PIXI.BaseTexture.prototype.destroy = function() { if(this.imageUrl) { delete PIXI.BaseTextureCache[this.imageUrl]; delete PIXI.TextureCache[this.imageUrl]; this.imageUrl = null; if (!navigator.isCocoonJS) this.source.src = ''; } else if (this.source && this.source._pixiId) { delete PIXI.BaseTextureCache[this.source._pixiId]; } this.source = null; this.unloadFromGPU(); }; /** * Changes the source image of the texture * * @method updateSourceImage * @param newSrc {String} the path of the image */ PIXI.BaseTexture.prototype.updateSourceImage = function(newSrc) { this.hasLoaded = false; this.source.src = null; this.source.src = newSrc; }; /** * Sets all glTextures to be dirty. * * @method dirty */ PIXI.BaseTexture.prototype.dirty = function() { for (var i = 0; i < this._glTextures.length; i++) { this._dirty[i] = true; } }; /** * Removes the base texture from the GPU, useful for managing resources on the GPU. * Atexture is still 100% usable and will simply be reuploaded if there is a sprite on screen that is using it. * * @method unloadFromGPU */ PIXI.BaseTexture.prototype.unloadFromGPU = function() { this.dirty(); // delete the webGL textures if any. for (var i = this._glTextures.length - 1; i >= 0; i--) { var glTexture = this._glTextures[i]; var gl = PIXI.glContexts[i]; if(gl && glTexture) { gl.deleteTexture(glTexture); } } this._glTextures.length = 0; this.dirty(); }; /** * Helper function that creates a base texture from the given image url. * If the image is not in the base texture cache it will be created and loaded. * * @static * @method fromImage * @param imageUrl {String} The image url of the texture * @param crossorigin {Boolean} * @param scaleMode {Number} See {{#crossLink "PIXI/scaleModes:property"}}PIXI.scaleModes{{/crossLink}} for possible values * @return BaseTexture */ PIXI.BaseTexture.fromImage = function(imageUrl, crossorigin, scaleMode) { var baseTexture = PIXI.BaseTextureCache[imageUrl]; if(crossorigin === undefined && imageUrl.indexOf('data:') === -1) crossorigin = true; if(!baseTexture) { // new Image() breaks tex loading in some versions of Chrome. // See https://code.google.com/p/chromium/issues/detail?id=238071 var image = new Image();//document.createElement('img'); if (crossorigin) { image.crossOrigin = ''; } image.src = imageUrl; baseTexture = new PIXI.BaseTexture(image, scaleMode); baseTexture.imageUrl = imageUrl; PIXI.BaseTextureCache[imageUrl] = baseTexture; // if there is an @2x at the end of the url we are going to assume its a highres image if( imageUrl.indexOf(PIXI.RETINA_PREFIX + '.') !== -1) { baseTexture.resolution = 2; } } return baseTexture; }; /** * Helper function that creates a base texture from the given canvas element. * * @static * @method fromCanvas * @param canvas {Canvas} The canvas element source of the texture * @param scaleMode {Number} See {{#crossLink "PIXI/scaleModes:property"}}PIXI.scaleModes{{/crossLink}} for possible values * @return BaseTexture */ PIXI.BaseTexture.fromCanvas = function(canvas, scaleMode) { if(!canvas._pixiId) { canvas._pixiId = 'canvas_' + PIXI.TextureCacheIdGenerator++; } var baseTexture = PIXI.BaseTextureCache[canvas._pixiId]; if(!baseTexture) { baseTexture = new PIXI.BaseTexture(canvas, scaleMode); PIXI.BaseTextureCache[canvas._pixiId] = baseTexture; } return baseTexture; }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ PIXI.TextureCache = {}; PIXI.FrameCache = {}; PIXI.TextureCacheIdGenerator = 0; /** * A texture stores the information that represents an image or part of an image. It cannot be added * to the display list directly. Instead use it as the texture for a PIXI.Sprite. If no frame is provided then the whole image is used. * * @class Texture * @uses EventTarget * @constructor * @param baseTexture {BaseTexture} The base texture source to create the texture from * @param [frame] {Rectangle} The rectangle frame of the texture to show * @param [crop] {Rectangle} The area of original texture * @param [trim] {Rectangle} Trimmed texture rectangle */ PIXI.Texture = function(baseTexture, frame, crop, trim) { /** * Does this Texture have any frame data assigned to it? * * @property noFrame * @type Boolean */ this.noFrame = false; if (!frame) { this.noFrame = true; frame = new PIXI.Rectangle(0,0,1,1); } if (baseTexture instanceof PIXI.Texture) { baseTexture = baseTexture.baseTexture; } /** * The base texture that this texture uses. * * @property baseTexture * @type BaseTexture */ this.baseTexture = baseTexture; /** * The frame specifies the region of the base texture that this texture uses * * @property frame * @type Rectangle */ this.frame = frame; /** * The texture trim data. * * @property trim * @type Rectangle */ this.trim = trim; /** * This will let the renderer know if the texture is valid. If it's not then it cannot be rendered. * * @property valid * @type Boolean */ this.valid = false; /** * This will let a renderer know that a texture has been updated (used mainly for webGL uv updates) * * @property requiresUpdate * @type Boolean */ this.requiresUpdate = false; /** * The WebGL UV data cache. * * @property _uvs * @type Object * @private */ this._uvs = null; /** * The width of the Texture in pixels. * * @property width * @type Number */ this.width = 0; /** * The height of the Texture in pixels. * * @property height * @type Number */ this.height = 0; /** * This is the area of the BaseTexture image to actually copy to the Canvas / WebGL when rendering, * irrespective of the actual frame size or placement (which can be influenced by trimmed texture atlases) * * @property crop * @type Rectangle */ this.crop = crop || new PIXI.Rectangle(0, 0, 1, 1); if (baseTexture.hasLoaded) { if (this.noFrame) frame = new PIXI.Rectangle(0, 0, baseTexture.width, baseTexture.height); this.setFrame(frame); } else { baseTexture.addEventListener('loaded', this.onBaseTextureLoaded.bind(this)); } }; PIXI.Texture.prototype.constructor = PIXI.Texture; PIXI.EventTarget.mixin(PIXI.Texture.prototype); /** * Called when the base texture is loaded * * @method onBaseTextureLoaded * @private */ PIXI.Texture.prototype.onBaseTextureLoaded = function() { var baseTexture = this.baseTexture; baseTexture.removeEventListener('loaded', this.onLoaded); if (this.noFrame) this.frame = new PIXI.Rectangle(0, 0, baseTexture.width, baseTexture.height); this.setFrame(this.frame); this.dispatchEvent( { type: 'update', content: this } ); }; /** * Destroys this texture * * @method destroy * @param destroyBase {Boolean} Whether to destroy the base texture as well */ PIXI.Texture.prototype.destroy = function(destroyBase) { if (destroyBase) this.baseTexture.destroy(); this.valid = false; }; /** * Specifies the region of the baseTexture that this texture will use. * * @method setFrame * @param frame {Rectangle} The frame of the texture to set it to */ PIXI.Texture.prototype.setFrame = function(frame) { this.noFrame = false; this.frame = frame; this.width = frame.width; this.height = frame.height; this.crop.x = frame.x; this.crop.y = frame.y; this.crop.width = frame.width; this.crop.height = frame.height; if (!this.trim && (frame.x + frame.width > this.baseTexture.width || frame.y + frame.height > this.baseTexture.height)) { throw new Error('Texture Error: frame does not fit inside the base Texture dimensions ' + this); } this.valid = frame && frame.width && frame.height && this.baseTexture.source && this.baseTexture.hasLoaded; if (this.trim) { this.width = this.trim.width; this.height = this.trim.height; this.frame.width = this.trim.width; this.frame.height = this.trim.height; } if (this.valid) this._updateUvs(); }; /** * Updates the internal WebGL UV cache. * * @method _updateUvs * @private */ PIXI.Texture.prototype._updateUvs = function() { if(!this._uvs)this._uvs = new PIXI.TextureUvs(); var frame = this.crop; var tw = this.baseTexture.width; var th = this.baseTexture.height; this._uvs.x0 = frame.x / tw; this._uvs.y0 = frame.y / th; this._uvs.x1 = (frame.x + frame.width) / tw; this._uvs.y1 = frame.y / th; this._uvs.x2 = (frame.x + frame.width) / tw; this._uvs.y2 = (frame.y + frame.height) / th; this._uvs. = frame.x / tw; this._uvs.y3 = (frame.y + frame.height) / th; }; /** * Helper function that creates a Texture object from the given image url. * If the image is not in the texture cache it will be created and loaded. * * @static * @method fromImage * @param imageUrl {String} The image url of the texture * @param crossorigin {Boolean} Whether requests should be treated as crossorigin * @param scaleMode {Number} See {{#crossLink "PIXI/scaleModes:property"}}PIXI.scaleModes{{/crossLink}} for possible values * @return Texture */ PIXI.Texture.fromImage = function(imageUrl, crossorigin, scaleMode) { var texture = PIXI.TextureCache[imageUrl]; if(!texture) { texture = new PIXI.Texture(PIXI.BaseTexture.fromImage(imageUrl, crossorigin, scaleMode)); PIXI.TextureCache[imageUrl] = texture; } return texture; }; /** * Helper function that returns a Texture objected based on the given frame id. * If the frame id is not in the texture cache an error will be thrown. * * @static * @method fromFrame * @param frameId {String} The frame id of the texture * @return Texture */ PIXI.Texture.fromFrame = function(frameId) { var texture = PIXI.TextureCache[frameId]; if(!texture) throw new Error('The frameId "' + frameId + '" does not exist in the texture cache '); return texture; }; /** * Helper function that creates a new a Texture based on the given canvas element. * * @static * @method fromCanvas * @param canvas {Canvas} The canvas element source of the texture * @param scaleMode {Number} See {{#crossLink "PIXI/scaleModes:property"}}PIXI.scaleModes{{/crossLink}} for possible values * @return Texture */ PIXI.Texture.fromCanvas = function(canvas, scaleMode) { var baseTexture = PIXI.BaseTexture.fromCanvas(canvas, scaleMode); return new PIXI.Texture( baseTexture ); }; /** * Adds a texture to the global PIXI.TextureCache. This cache is shared across the whole PIXI object. * * @static * @method addTextureToCache * @param texture {Texture} The Texture to add to the cache. * @param id {String} The id that the texture will be stored against. */ PIXI.Texture.addTextureToCache = function(texture, id) { PIXI.TextureCache[id] = texture; }; /** * Remove a texture from the global PIXI.TextureCache. * * @static * @method removeTextureFromCache * @param id {String} The id of the texture to be removed * @return {Texture} The texture that was removed */ PIXI.Texture.removeTextureFromCache = function(id) { var texture = PIXI.TextureCache[id]; delete PIXI.TextureCache[id]; delete PIXI.BaseTextureCache[id]; return texture; }; PIXI.TextureUvs = function() { this.x0 = 0; this.y0 = 0; this.x1 = 0; this.y1 = 0; this.x2 = 0; this.y2 = 0; this. = 0; this.y3 = 0; }; PIXI.Texture.emptyTexture = new PIXI.Texture(new PIXI.BaseTexture()); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * A RenderTexture is a special texture that allows any Pixi display object to be rendered to it. * * __Hint__: All DisplayObjects (i.e. Sprites) that render to a RenderTexture should be preloaded otherwise black rectangles will be drawn instead. * * A RenderTexture takes a snapshot of any Display Object given to its render method. The position and rotation of the given Display Objects is ignored. For example: * * var renderTexture = new PIXI.RenderTexture(800, 600); * var sprite = PIXI.Sprite.fromImage("spinObj_01.png"); * sprite.position.x = 800/2; * sprite.position.y = 600/2; * sprite.anchor.x = 0.5; * sprite.anchor.y = 0.5; * renderTexture.render(sprite); * * The Sprite in this case will be rendered to a position of 0,0. To render this sprite at its actual position a DisplayObjectContainer should be used: * * var doc = new PIXI.DisplayObjectContainer(); * doc.addChild(sprite); * renderTexture.render(doc); // Renders to center of renderTexture * * @class RenderTexture * @extends Texture * @constructor * @param width {Number} The width of the render texture * @param height {Number} The height of the render texture * @param renderer {CanvasRenderer|WebGLRenderer} The renderer used for this RenderTexture * @param scaleMode {Number} See {{#crossLink "PIXI/scaleModes:property"}}PIXI.scaleModes{{/crossLink}} for possible values * @param resolution {Number} The resolution of the texture being generated */ PIXI.RenderTexture = function(width, height, renderer, scaleMode, resolution) { /** * The with of the render texture * * @property width * @type Number */ this.width = width || 100; /** * The height of the render texture * * @property height * @type Number */ this.height = height || 100; /** * The Resolution of the texture. * * @property resolution * @type Number */ this.resolution = resolution || 1; /** * The framing rectangle of the render texture * * @property frame * @type Rectangle */ this.frame = new PIXI.Rectangle(0, 0, this.width * this.resolution, this.height * this.resolution); /** * This is the area of the BaseTexture image to actually copy to the Canvas / WebGL when rendering, * irrespective of the actual frame size or placement (which can be influenced by trimmed texture atlases) * * @property crop * @type Rectangle */ this.crop = new PIXI.Rectangle(0, 0, this.width * this.resolution, this.height * this.resolution); /** * The base texture object that this texture uses * * @property baseTexture * @type BaseTexture */ this.baseTexture = new PIXI.BaseTexture(); this.baseTexture.width = this.width * this.resolution; this.baseTexture.height = this.height * this.resolution; this.baseTexture._glTextures = []; this.baseTexture.resolution = this.resolution; this.baseTexture.scaleMode = scaleMode || PIXI.scaleModes.DEFAULT; this.baseTexture.hasLoaded = true; PIXI.Texture.call(this, this.baseTexture, new PIXI.Rectangle(0, 0, this.width * this.resolution, this.height * this.resolution) ); /** * The renderer this RenderTexture uses. A RenderTexture can only belong to one renderer at the moment if its webGL. * * @property renderer * @type CanvasRenderer|WebGLRenderer */ this.renderer = renderer || PIXI.defaultRenderer; if(this.renderer.type === PIXI.WEBGL_RENDERER) { var gl = this.renderer.gl; this.baseTexture._dirty[gl.id] = false; this.textureBuffer = new PIXI.FilterTexture(gl, this.width, this.height, this.baseTexture.scaleMode); this.baseTexture._glTextures[gl.id] = this.textureBuffer.texture; this.render = this.renderWebGL; this.projection = new PIXI.Point(this.width*0.5, -this.height*0.5); } else { this.render = this.renderCanvas; this.textureBuffer = new PIXI.CanvasBuffer(this.width* this.resolution, this.height* this.resolution); this.baseTexture.source = this.textureBuffer.canvas; } /** * @property valid * @type Boolean */ this.valid = true; this._updateUvs(); }; PIXI.RenderTexture.prototype = Object.create(PIXI.Texture.prototype); PIXI.RenderTexture.prototype.constructor = PIXI.RenderTexture; /** * Resizes the RenderTexture. * * @method resize * @param width {Number} The width to resize to. * @param height {Number} The height to resize to. * @param updateBase {Boolean} Should the baseTexture.width and height values be resized as well? */ PIXI.RenderTexture.prototype.resize = function(width, height, updateBase) { if (width === this.width && height === this.height)return; this.valid = (width > 0 && height > 0); this.width = width; this.height = height; this.frame.width = this.crop.width = width * this.resolution; this.frame.height = this.crop.height = height * this.resolution; if (updateBase) { this.baseTexture.width = this.width * this.resolution; this.baseTexture.height = this.height * this.resolution; } if (this.renderer.type === PIXI.WEBGL_RENDERER) { this.projection.x = this.width / 2; this.projection.y = -this.height / 2; } if(!this.valid)return; this.textureBuffer.resize(this.width, this.height); }; /** * Clears the RenderTexture. * * @method clear */ PIXI.RenderTexture.prototype.clear = function() { if(!this.valid)return; if (this.renderer.type === PIXI.WEBGL_RENDERER) { this.renderer.gl.bindFramebuffer(this.renderer.gl.FRAMEBUFFER, this.textureBuffer.frameBuffer); } this.textureBuffer.clear(); }; /** * This function will draw the display object to the texture. * * @method renderWebGL * @param displayObject {DisplayObject} The display object to render this texture on * @param [matrix] {Matrix} Optional matrix to apply to the display object before rendering. * @param [clear] {Boolean} If true the texture will be cleared before the displayObject is drawn * @private */ PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, matrix, clear) { if(!this.valid)return; //TOOD replace position with matrix.. //Lets create a nice matrix to apply to our display object. Frame buffers come in upside down so we need to flip the matrix var wt = displayObject.worldTransform; wt.identity(); wt.translate(0, this.projection.y * 2); if(matrix)wt.append(matrix); wt.scale(1,-1); // setWorld Alpha to ensure that the object is renderer at full opacity displayObject.worldAlpha = 1; // Time to update all the children of the displayObject with the new matrix.. var children = displayObject.children; for(var i=0,j=children.length; i<j; i++) { children[i].updateTransform(); } // time for the webGL fun stuff! var gl = this.renderer.gl; gl.viewport(0, 0, this.width * this.resolution, this.height * this.resolution); gl.bindFramebuffer(gl.FRAMEBUFFER, this.textureBuffer.frameBuffer ); if(clear)this.textureBuffer.clear(); this.renderer.spriteBatch.dirty = true; this.renderer.renderDisplayObject(displayObject, this.projection, this.textureBuffer.frameBuffer); this.renderer.spriteBatch.dirty = true; }; /** * This function will draw the display object to the texture. * * @method renderCanvas * @param displayObject {DisplayObject} The display object to render this texture on * @param [matrix] {Matrix} Optional matrix to apply to the display object before rendering. * @param [clear] {Boolean} If true the texture will be cleared before the displayObject is drawn * @private */ PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, matrix, clear) { if(!this.valid)return; var wt = displayObject.worldTransform; wt.identity(); if(matrix)wt.append(matrix); // setWorld Alpha to ensure that the object is renderer at full opacity displayObject.worldAlpha = 1; // Time to update all the children of the displayObject with the new matrix.. var children = displayObject.children; for(var i = 0, j = children.length; i < j; i++) { children[i].updateTransform(); } if(clear)this.textureBuffer.clear(); var context = this.textureBuffer.context; var realResolution = this.renderer.resolution; this.renderer.resolution = this.resolution; this.renderer.renderDisplayObject(displayObject, context); this.renderer.resolution = realResolution; }; /** * Will return a HTML Image of the texture * * @method getImage * @return {Image} */ PIXI.RenderTexture.prototype.getImage = function() { var image = new Image(); image.src = this.getBase64(); return image; }; /** * Will return a a base64 encoded string of this texture. It works by calling RenderTexture.getCanvas and then running toDataURL on that. * * @method getBase64 * @return {String} A base64 encoded string of the texture. */ PIXI.RenderTexture.prototype.getBase64 = function() { return this.getCanvas().toDataURL(); }; /** * Creates a Canvas element, renders this RenderTexture to it and then returns it. * * @method getCanvas * @return {HTMLCanvasElement} A Canvas element with the texture rendered on. */ PIXI.RenderTexture.prototype.getCanvas = function() { if (this.renderer.type === PIXI.WEBGL_RENDERER) { var gl = this.renderer.gl; var width = this.textureBuffer.width; var height = this.textureBuffer.height; var webGLPixels = new Uint8Array(4 * width * height); gl.bindFramebuffer(gl.FRAMEBUFFER, this.textureBuffer.frameBuffer); gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, webGLPixels); gl.bindFramebuffer(gl.FRAMEBUFFER, null); var tempCanvas = new PIXI.CanvasBuffer(width, height); var canvasData = tempCanvas.context.getImageData(0, 0, width, height); canvasData.data.set(webGLPixels); tempCanvas.context.putImageData(canvasData, 0, 0); return tempCanvas.canvas; } else { return this.textureBuffer.canvas; } }; PIXI.RenderTexture.tempMatrix = new PIXI.Matrix(); /** * A texture of a [playing] Video. * * See the ["deus" demo](http://www.goodboydigital.com/pixijs/examples/deus/). * * @class VideoTexture * @extends BaseTexture * @constructor * @param source {HTMLVideoElement} * @param scaleMode {Number} See {{#crossLink "PIXI/scaleModes:property"}}PIXI.scaleModes{{/crossLink}} for possible values */ PIXI.VideoTexture = function( source, scaleMode ) { if( !source ){ throw new Error( 'No video source element specified.' ); } // hook in here to check if video is already available. // PIXI.BaseTexture looks for a source.complete boolean, plus width & height. if( (source.readyState === source.HAVE_ENOUGH_DATA || source.readyState === source.HAVE_FUTURE_DATA ) && source.width && source.height ) { source.complete = true; } PIXI.BaseTexture.call( this, source, scaleMode ); this.autoUpdate = false; this.updateBound = this._onUpdate.bind(this); if( !source.complete ) { this._onCanPlay = this.onCanPlay.bind(this); source.addEventListener( 'canplay', this._onCanPlay ); source.addEventListener( 'canplaythrough', this._onCanPlay ); // started playing.. source.addEventListener( 'play', this.onPlayStart.bind(this) ); source.addEventListener( 'pause', this.onPlayStop.bind(this) ); } }; PIXI.VideoTexture.prototype = Object.create( PIXI.BaseTexture.prototype ); PIXI.VideoTexture.constructor = PIXI.VideoTexture; PIXI.VideoTexture.prototype._onUpdate = function() { if(this.autoUpdate) { window.requestAnimationFrame(this.updateBound); this.dirty(); } }; PIXI.VideoTexture.prototype.onPlayStart = function() { if(!this.autoUpdate) { window.requestAnimationFrame(this.updateBound); this.autoUpdate = true; } }; PIXI.VideoTexture.prototype.onPlayStop = function() { this.autoUpdate = false; }; PIXI.VideoTexture.prototype.onCanPlay = function() { if( event.type === 'canplaythrough' ) { this.hasLoaded = true; if( this.source ) { this.source.removeEventListener( 'canplay', this._onCanPlay ); this.source.removeEventListener( 'canplaythrough', this._onCanPlay ); this.width = this.source.videoWidth; this.height = this.source.videoHeight; // prevent multiple loaded dispatches.. if( !this.__loaded ){ this.__loaded = true; this.dispatchEvent( { type: 'loaded', content: this } ); } } } }; PIXI.VideoTexture.prototype.destroy = function() { if( this.source && this.source._pixiId ) { PIXI.BaseTextureCache[ this.source._pixiId ] = null; delete PIXI.BaseTextureCache[ this.source._pixiId ]; this.source._pixiId = null; delete this.source._pixiId; } PIXI.BaseTexture.prototype.destroy.call( this ); }; /** * Mimic Pixi BaseTexture.from.... method. * * @static * @method baseTextureFromVideo * @param video {HTMLVideoElement} * @param scaleMode {Number} See {{#crossLink "PIXI/scaleModes:property"}}PIXI.scaleModes{{/crossLink}} for possible values * @return {VideoTexture} */ PIXI.VideoTexture.baseTextureFromVideo = function( video, scaleMode ) { if( !video._pixiId ) { video._pixiId = 'video_' + PIXI.TextureCacheIdGenerator++; } var baseTexture = PIXI.BaseTextureCache[ video._pixiId ]; if( !baseTexture ) { baseTexture = new PIXI.VideoTexture( video, scaleMode ); PIXI.BaseTextureCache[ video._pixiId ] = baseTexture; } return baseTexture; }; /** * Mimic Pixi BaseTexture.from.... method. * * @static * @method textureFromVideo * @param video {HTMLVideoElement} * @param scaleMode {Number} See {{#crossLink "PIXI/scaleModes:property"}}PIXI.scaleModes{{/crossLink}} for possible values * @return {Texture} A Texture, but not a VideoTexture. */ PIXI.VideoTexture.textureFromVideo = function( video, scaleMode ) { var baseTexture = PIXI.VideoTexture.baseTextureFromVideo( video, scaleMode ); return new PIXI.Texture( baseTexture ); }; /** * Mimic Pixi BaseTexture.from.... method. * * @static * @method fromUrl * @param videoSrc {String} The URL for the video. * @param scaleMode {Number} See {{#crossLink "PIXI/scaleModes:property"}}PIXI.scaleModes{{/crossLink}} for possible values * @return {VideoTexture} */ PIXI.VideoTexture.fromUrl = function( videoSrc, scaleMode ) { var video = document.createElement('video'); video.src = videoSrc; video.autoPlay = true; video.play(); return PIXI.VideoTexture.textureFromVideo( video, scaleMode); }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * A Class that loads a bunch of images / sprite sheet / bitmap font files. Once the * assets have been loaded they are added to the PIXI Texture cache and can be accessed * easily through PIXI.Texture.fromImage() and PIXI.Sprite.fromImage() * When all items have been loaded this class will dispatch a 'onLoaded' event * As each individual item is loaded this class will dispatch a 'onProgress' event * * @class AssetLoader * @constructor * @uses EventTarget * @param assetURLs {Array(String)} An array of image/sprite sheet urls that you would like loaded * supported. Supported image formats include 'jpeg', 'jpg', 'png', 'gif'. Supported * sprite sheet data formats only include 'JSON' at this time. Supported bitmap font * data formats include 'xml' and 'fnt'. * @param crossorigin {Boolean} Whether requests should be treated as crossorigin */ PIXI.AssetLoader = function(assetURLs, crossorigin) { /** * The array of asset URLs that are going to be loaded * * @property assetURLs * @type Array(String) */ this.assetURLs = assetURLs; /** * Whether the requests should be treated as cross origin * * @property crossorigin * @type Boolean */ this.crossorigin = crossorigin; /** * Maps file extension to loader types * * @property loadersByType * @type Object */ this.loadersByType = { 'jpg': PIXI.ImageLoader, 'jpeg': PIXI.ImageLoader, 'png': PIXI.ImageLoader, 'gif': PIXI.ImageLoader, 'webp': PIXI.ImageLoader, 'json': PIXI.JsonLoader, 'atlas': PIXI.AtlasLoader, 'anim': PIXI.SpineLoader, 'xml': PIXI.BitmapFontLoader, 'fnt': PIXI.BitmapFontLoader }; }; PIXI.EventTarget.mixin(PIXI.AssetLoader.prototype); /** * Fired when an item has loaded * @event onProgress */ /** * Fired when all the assets have loaded * @event onComplete */ // constructor PIXI.AssetLoader.prototype.constructor = PIXI.AssetLoader; /** * Given a filename, returns its extension. * * @method _getDataType * @param str {String} the name of the asset */ PIXI.AssetLoader.prototype._getDataType = function(str) { var test = 'data:'; //starts with 'data:' var start = str.slice(0, test.length).toLowerCase(); if (start === test) { var data = str.slice(test.length); var sepIdx = data.indexOf(','); if (sepIdx === -1) //malformed data URI scheme return null; //e.g. 'image/gif;base64' => 'image/gif' var info = data.slice(0, sepIdx).split(';')[0]; //We might need to handle some special cases here... //standardize text/plain to 'txt' file extension if (!info || info.toLowerCase() === 'text/plain') return 'txt'; //User specified mime type, try splitting it by '/' return info.split('/').pop().toLowerCase(); } return null; }; /** * Starts loading the assets sequentially * * @method load */ PIXI.AssetLoader.prototype.load = function() { var scope = this; function onLoad(evt) { scope.onAssetLoaded(evt.data.content); } this.loadCount = this.assetURLs.length; for (var i=0; i < this.assetURLs.length; i++) { var fileName = this.assetURLs[i]; //first see if we have a data URI scheme.. var fileType = this._getDataType(fileName); //if not, assume it's a file URI if (!fileType) fileType = fileName.split('?').shift().split('.').pop().toLowerCase(); var Constructor = this.loadersByType[fileType]; if(!Constructor) throw new Error(fileType + ' is an unsupported file type'); var loader = new Constructor(fileName, this.crossorigin); loader.on('loaded', onLoad); loader.load(); } }; /** * Invoked after each file is loaded * * @method onAssetLoaded * @private */ PIXI.AssetLoader.prototype.onAssetLoaded = function(loader) { this.loadCount--; this.emit('onProgress', { content: this, loader: loader, loaded: this.assetURLs.length - this.loadCount, total: this.assetURLs.length }); if (this.onProgress) this.onProgress(loader); if (!this.loadCount) { this.emit('onComplete', { content: this }); if(this.onComplete) this.onComplete(); } }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The json file loader is used to load in JSON data and parse it * When loaded this class will dispatch a 'loaded' event * If loading fails this class will dispatch an 'error' event * * @class JsonLoader * @uses EventTarget * @constructor * @param url {String} The url of the JSON file * @param crossorigin {Boolean} Whether requests should be treated as crossorigin */ PIXI.JsonLoader = function (url, crossorigin) { /** * The url of the bitmap font data * * @property url * @type String */ this.url = url; /** * Whether the requests should be treated as cross origin * * @property crossorigin * @type Boolean */ this.crossorigin = crossorigin; /** * [read-only] The base url of the bitmap font data * * @property baseUrl * @type String * @readOnly */ this.baseUrl = url.replace(/[^\/]*$/, ''); /** * [read-only] Whether the data has loaded yet * * @property loaded * @type Boolean * @readOnly */ this.loaded = false; }; // constructor PIXI.JsonLoader.prototype.constructor = PIXI.JsonLoader; PIXI.EventTarget.mixin(PIXI.JsonLoader.prototype); /** * Loads the JSON data * * @method load */ PIXI.JsonLoader.prototype.load = function () { if(window.XDomainRequest && this.crossorigin) { this.ajaxRequest = new window.XDomainRequest(); // XDomainRequest has a few quirks. Occasionally it will abort requests // A way to avoid this is to make sure ALL callbacks are set even if not used // More info here: http://stackoverflow.com/questions/15786966/xdomainrequest-aborts-post-on-ie-9 this.ajaxRequest.timeout = 3000; this.ajaxRequest.onerror = this.onError.bind(this); this.ajaxRequest.ontimeout = this.onError.bind(this); this.ajaxRequest.onprogress = function() {}; this.ajaxRequest.onload = this.onJSONLoaded.bind(this); } else { if (window.XMLHttpRequest) { this.ajaxRequest = new window.XMLHttpRequest(); } else { this.ajaxRequest = new window.ActiveXObject('Microsoft.XMLHTTP'); } this.ajaxRequest.onreadystatechange = this.onReadyStateChanged.bind(this); } this.ajaxRequest.open('GET',this.url,true); this.ajaxRequest.send(); }; /** * Bridge function to be able to use the more reliable onreadystatechange in XMLHttpRequest. * * @method onReadyStateChanged * @private */ PIXI.JsonLoader.prototype.onReadyStateChanged = function () { if (this.ajaxRequest.readyState === 4 && (this.ajaxRequest.status === 200 || window.location.href.indexOf('http') === -1)) { this.onJSONLoaded(); } }; /** * Invoke when JSON file is loaded * * @method onJSONLoaded * @private */ PIXI.JsonLoader.prototype.onJSONLoaded = function () { if(!this.ajaxRequest.responseText ) { this.onError(); return; } this.json = JSON.parse(this.ajaxRequest.responseText); if(this.json.frames && this.json.meta && this.json.meta.image) { // sprite sheet var textureUrl = this.json.meta.image; if (textureUrl.indexOf('data:') === -1) { textureUrl = this.baseUrl + textureUrl; } var image = new PIXI.ImageLoader(textureUrl, this.crossorigin); var frameData = this.json.frames; this.texture = image.texture.baseTexture; image.addEventListener('loaded', this.onLoaded.bind(this)); for (var i in frameData) { var rect = frameData[i].frame; if (rect) { var textureSize = new PIXI.Rectangle(rect.x, rect.y, rect.w, rect.h); var crop = textureSize.clone(); var trim = null; // Check to see if the sprite is trimmed if (frameData[i].trimmed) { var actualSize = frameData[i].sourceSize; var realSize = frameData[i].spriteSourceSize; trim = new PIXI.Rectangle(realSize.x, realSize.y, actualSize.w, actualSize.h); } PIXI.TextureCache[i] = new PIXI.Texture(this.texture, textureSize, crop, trim); } } image.load(); } else if(this.json.bones) { /* check if the json was loaded before */ if (PIXI.AnimCache[this.url]) { this.onLoaded(); } else { /* use a bit of hackery to load the atlas file, here we assume that the .json, .atlas and .png files * that correspond to the spine file are in the same base URL and that the .json and .atlas files * have the same name */ var atlasPath = this.url.substr(0, this.url.lastIndexOf('.')) + '.atlas'; var atlasLoader = new PIXI.JsonLoader(atlasPath, this.crossorigin); // save a copy of the current object for future reference // var originalLoader = this; // before loading the file, replace the "onJSONLoaded" function for our own // atlasLoader.onJSONLoaded = function() { // at this point "this" points at the atlasLoader (JsonLoader) instance // if(!this.ajaxRequest.responseText) { this.onError(); // FIXME: hmm, this is funny because we are not responding to errors yet return; } // create a new instance of a spine texture loader for this spine object // var textureLoader = new PIXI.SpineTextureLoader(this.url.substring(0, this.url.lastIndexOf('/'))); // create a spine atlas using the loaded text and a spine texture loader instance // var spineAtlas = new spine.Atlas(this.ajaxRequest.responseText, textureLoader); // now we use an atlas attachment loader // var attachmentLoader = new spine.AtlasAttachmentLoader(spineAtlas); // spine animation var spineJsonParser = new spine.SkeletonJson(attachmentLoader); var skeletonData = spineJsonParser.readSkeletonData(originalLoader.json); PIXI.AnimCache[originalLoader.url] = skeletonData; originalLoader.spine = skeletonData; originalLoader.spineAtlas = spineAtlas; originalLoader.spineAtlasLoader = atlasLoader; // wait for textures to finish loading if needed if (textureLoader.loadingCount > 0) { textureLoader.addEventListener('loadedBaseTexture', function(evt){ if (evt.content.content.loadingCount <= 0) { originalLoader.onLoaded(); } }); } else { originalLoader.onLoaded(); } }; // start the loading // atlasLoader.load(); } } else { this.onLoaded(); } }; /** * Invoke when json file loaded * * @method onLoaded * @private */ PIXI.JsonLoader.prototype.onLoaded = function () { this.loaded = true; this.dispatchEvent({ type: 'loaded', content: this }); }; /** * Invoke when error occured * * @method onError * @private */ PIXI.JsonLoader.prototype.onError = function () { this.dispatchEvent({ type: 'error', content: this }); }; /** * @author Martin Kelm http://mkelm.github.com */ /** * The atlas file loader is used to load in Texture Atlas data and parse it. When loaded this class will dispatch a 'loaded' event. If loading fails this class will dispatch an 'error' event. * * To generate the data you can use http://www.codeandweb.com/texturepacker and publish in the 'JSON' format. * * It is highly recommended to use texture atlases (also know as 'sprite sheets') as it allowed sprites to be batched and drawn together for highly increased rendering speed. * Once the data has been loaded the frames are stored in the PIXI texture cache and can be accessed though PIXI.Texture.fromFrameId() and PIXI.Sprite.fromFrameId() * * @class AtlasLoader * @uses EventTarget * @constructor * @param url {String} The url of the JSON file * @param crossorigin {Boolean} Whether requests should be treated as crossorigin */ PIXI.AtlasLoader = function (url, crossorigin) { this.url = url; this.baseUrl = url.replace(/[^\/]*$/, ''); this.crossorigin = crossorigin; this.loaded = false; }; // constructor PIXI.AtlasLoader.constructor = PIXI.AtlasLoader; PIXI.EventTarget.mixin(PIXI.AtlasLoader.prototype); /** * Starts loading the JSON file * * @method load */ PIXI.AtlasLoader.prototype.load = function () { this.ajaxRequest = new PIXI.AjaxRequest(); this.ajaxRequest.onreadystatechange = this.onAtlasLoaded.bind(this); this.ajaxRequest.open('GET', this.url, true); if (this.ajaxRequest.overrideMimeType) this.ajaxRequest.overrideMimeType('application/json'); this.ajaxRequest.send(null); }; /** * Invoked when the Atlas has fully loaded. Parses the JSON and builds the texture frames. * * @method onAtlasLoaded * @private */ PIXI.AtlasLoader.prototype.onAtlasLoaded = function () { if (this.ajaxRequest.readyState === 4) { if (this.ajaxRequest.status === 200 || window.location.href.indexOf('http') === -1) { this.atlas = { meta : { image : [] }, frames : [] }; var result = this.ajaxRequest.responseText.split(/\r?\n/); var lineCount = -3; var currentImageId = 0; var currentFrame = null; var nameInNextLine = false; var i = 0, j = 0, selfOnLoaded = this.onLoaded.bind(this); // parser without rotation support yet! for (i = 0; i < result.length; i++) { result[i] = result[i].replace(/^\s+|\s+$/g, ''); if (result[i] === '') { nameInNextLine = i+1; } if (result[i].length > 0) { if (nameInNextLine === i) { this.atlas.meta.image.push(result[i]); currentImageId = this.atlas.meta.image.length - 1; this.atlas.frames.push({}); lineCount = -3; } else if (lineCount > 0) { if (lineCount % 7 === 1) { // frame name if (currentFrame != null) { //jshint ignore:line this.atlas.frames[currentImageId][currentFrame.name] = currentFrame; } currentFrame = { name: result[i], frame : {} }; } else { var text = result[i].split(' '); if (lineCount % 7 === 3) { // position currentFrame.frame.x = Number(text[1].replace(',', '')); currentFrame.frame.y = Number(text[2]); } else if (lineCount % 7 === 4) { // size currentFrame.frame.w = Number(text[1].replace(',', '')); currentFrame.frame.h = Number(text[2]); } else if (lineCount % 7 === 5) { // real size var realSize = { x : 0, y : 0, w : Number(text[1].replace(',', '')), h : Number(text[2]) }; if (realSize.w > currentFrame.frame.w || realSize.h > currentFrame.frame.h) { currentFrame.trimmed = true; currentFrame.realSize = realSize; } else { currentFrame.trimmed = false; } } } } lineCount++; } } if (currentFrame != null) { //jshint ignore:line this.atlas.frames[currentImageId][currentFrame.name] = currentFrame; } if (this.atlas.meta.image.length > 0) { this.images = []; for (j = 0; j < this.atlas.meta.image.length; j++) { // sprite sheet var textureUrl = this.baseUrl + this.atlas.meta.image[j]; var frameData = this.atlas.frames[j]; this.images.push(new PIXI.ImageLoader(textureUrl, this.crossorigin)); for (i in frameData) { var rect = frameData[i].frame; if (rect) { PIXI.TextureCache[i] = new PIXI.Texture(this.images[j].texture.baseTexture, { x: rect.x, y: rect.y, width: rect.w, height: rect.h }); if (frameData[i].trimmed) { PIXI.TextureCache[i].realSize = frameData[i].realSize; // trim in pixi not supported yet, todo update trim properties if it is done ... PIXI.TextureCache[i].trim.x = 0; PIXI.TextureCache[i].trim.y = 0; } } } } this.currentImageId = 0; for (j = 0; j < this.images.length; j++) { this.images[j].on('loaded', selfOnLoaded); } this.images[this.currentImageId].load(); } else { this.onLoaded(); } } else { this.onError(); } } }; /** * Invoked when json file has loaded. * * @method onLoaded * @private */ PIXI.AtlasLoader.prototype.onLoaded = function () { if (this.images.length - 1 > this.currentImageId) { this.currentImageId++; this.images[this.currentImageId].load(); } else { this.loaded = true; this.emit('loaded', { content: this }); } }; /** * Invoked when an error occurs. * * @method onError * @private */ PIXI.AtlasLoader.prototype.onError = function () { this.emit('error', { content: this }); }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The sprite sheet loader is used to load in JSON sprite sheet data * To generate the data you can use http://www.codeandweb.com/texturepacker and publish in the 'JSON' format * There is a free version so thats nice, although the paid version is great value for money. * It is highly recommended to use Sprite sheets (also know as a 'texture atlas') as it means sprites can be batched and drawn together for highly increased rendering speed. * Once the data has been loaded the frames are stored in the PIXI texture cache and can be accessed though PIXI.Texture.fromFrameId() and PIXI.Sprite.fromFrameId() * This loader will load the image file that the Spritesheet points to as well as the data. * When loaded this class will dispatch a 'loaded' event * * @class SpriteSheetLoader * @uses EventTarget * @constructor * @param url {String} The url of the sprite sheet JSON file * @param crossorigin {Boolean} Whether requests should be treated as crossorigin */ PIXI.SpriteSheetLoader = function (url, crossorigin) { /** * The url of the atlas data * * @property url * @type String */ this.url = url; /** * Whether the requests should be treated as cross origin * * @property crossorigin * @type Boolean */ this.crossorigin = crossorigin; /** * [read-only] The base url of the bitmap font data * * @property baseUrl * @type String * @readOnly */ this.baseUrl = url.replace(/[^\/]*$/, ''); /** * The texture being loaded * * @property texture * @type Texture */ this.texture = null; /** * The frames of the sprite sheet * * @property frames * @type Object */ this.frames = {}; }; // constructor PIXI.SpriteSheetLoader.prototype.constructor = PIXI.SpriteSheetLoader; PIXI.EventTarget.mixin(PIXI.SpriteSheetLoader.prototype); /** * This will begin loading the JSON file * * @method load */ PIXI.SpriteSheetLoader.prototype.load = function () { var scope = this; var jsonLoader = new PIXI.JsonLoader(this.url, this.crossorigin); jsonLoader.on('loaded', function (event) { scope.json = event.data.content.json; scope.onLoaded(); }); jsonLoader.load(); }; /** * Invoke when all files are loaded (json and texture) * * @method onLoaded * @private */ PIXI.SpriteSheetLoader.prototype.onLoaded = function () { this.emit('loaded', { content: this }); }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The image loader class is responsible for loading images file formats ('jpeg', 'jpg', 'png' and 'gif') * Once the image has been loaded it is stored in the PIXI texture cache and can be accessed though PIXI.Texture.fromFrame() and PIXI.Sprite.fromFrame() * When loaded this class will dispatch a 'loaded' event * * @class ImageLoader * @uses EventTarget * @constructor * @param url {String} The url of the image * @param crossorigin {Boolean} Whether requests should be treated as crossorigin */ PIXI.ImageLoader = function(url, crossorigin) { /** * The texture being loaded * * @property texture * @type Texture */ this.texture = PIXI.Texture.fromImage(url, crossorigin); /** * if the image is loaded with loadFramedSpriteSheet * frames will contain the sprite sheet frames * * @property frames * @type Array * @readOnly */ this.frames = []; }; // constructor PIXI.ImageLoader.prototype.constructor = PIXI.ImageLoader; PIXI.EventTarget.mixin(PIXI.ImageLoader.prototype); /** * Loads image or takes it from cache * * @method load */ PIXI.ImageLoader.prototype.load = function() { if(!this.texture.baseTexture.hasLoaded) { this.texture.baseTexture.on('loaded', this.onLoaded.bind(this)); } else { this.onLoaded(); } }; /** * Invoked when image file is loaded or it is already cached and ready to use * * @method onLoaded * @private */ PIXI.ImageLoader.prototype.onLoaded = function() { this.emit('loaded', { content: this }); }; /** * Loads image and split it to uniform sized frames * * @method loadFramedSpriteSheet * @param frameWidth {Number} width of each frame * @param frameHeight {Number} height of each frame * @param textureName {String} if given, the frames will be cached in <textureName>-<ord> format */ PIXI.ImageLoader.prototype.loadFramedSpriteSheet = function(frameWidth, frameHeight, textureName) { this.frames = []; var cols = Math.floor(this.texture.width / frameWidth); var rows = Math.floor(this.texture.height / frameHeight); var i=0; for (var y=0; y<rows; y++) { for (var x=0; x<cols; x++,i++) { var texture = new PIXI.Texture(this.texture.baseTexture, { x: x*frameWidth, y: y*frameHeight, width: frameWidth, height: frameHeight }); this.frames.push(texture); if (textureName) PIXI.TextureCache[textureName + '-' + i] = texture; } } this.load(); }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The xml loader is used to load in XML bitmap font data ('xml' or 'fnt') * To generate the data you can use http://www.angelcode.com/products/bmfont/ * This loader will also load the image file as the data. * When loaded this class will dispatch a 'loaded' event * * @class BitmapFontLoader * @uses EventTarget * @constructor * @param url {String} The url of the sprite sheet JSON file * @param crossorigin {Boolean} Whether requests should be treated as crossorigin */ PIXI.BitmapFontLoader = function(url, crossorigin) { /** * The url of the bitmap font data * * @property url * @type String */ this.url = url; /** * Whether the requests should be treated as cross origin * * @property crossorigin * @type Boolean */ this.crossorigin = crossorigin; /** * [read-only] The base url of the bitmap font data * * @property baseUrl * @type String * @readOnly */ this.baseUrl = url.replace(/[^\/]*$/, ''); /** * [read-only] The texture of the bitmap font * * @property texture * @type Texture */ this.texture = null; }; // constructor PIXI.BitmapFontLoader.prototype.constructor = PIXI.BitmapFontLoader; PIXI.EventTarget.mixin(PIXI.BitmapFontLoader.prototype); /** * Loads the XML font data * * @method load */ PIXI.BitmapFontLoader.prototype.load = function() { this.ajaxRequest = new PIXI.AjaxRequest(); this.ajaxRequest.onreadystatechange = this.onXMLLoaded.bind(this); this.ajaxRequest.open('GET', this.url, true); if (this.ajaxRequest.overrideMimeType) this.ajaxRequest.overrideMimeType('application/xml'); this.ajaxRequest.send(null); }; /** * Invoked when the XML file is loaded, parses the data. * * @method onXMLLoaded * @private */ PIXI.BitmapFontLoader.prototype.onXMLLoaded = function() { if (this.ajaxRequest.readyState === 4) { if (this.ajaxRequest.status === 200 || window.location.protocol.indexOf('http') === -1) { var responseXML = this.ajaxRequest.responseXML; if(!responseXML || /MSIE 9/i.test(navigator.userAgent) || navigator.isCocoonJS) { if(typeof(window.DOMParser) === 'function') { var domparser = new DOMParser(); responseXML = domparser.parseFromString(this.ajaxRequest.responseText, 'text/xml'); } else { var div = document.createElement('div'); div.innerHTML = this.ajaxRequest.responseText; responseXML = div; } } var textureUrl = this.baseUrl + responseXML.getElementsByTagName('page')[0].getAttribute('file'); var image = new PIXI.ImageLoader(textureUrl, this.crossorigin); this.texture = image.texture.baseTexture; var data = {}; var info = responseXML.getElementsByTagName('info')[0]; var common = responseXML.getElementsByTagName('common')[0]; data.font = info.getAttribute('face'); data.size = parseInt(info.getAttribute('size'), 10); data.lineHeight = parseInt(common.getAttribute('lineHeight'), 10); data.chars = {}; //parse letters var letters = responseXML.getElementsByTagName('char'); for (var i = 0; i < letters.length; i++) { var charCode = parseInt(letters[i].getAttribute('id'), 10); var textureRect = new PIXI.Rectangle( parseInt(letters[i].getAttribute('x'), 10), parseInt(letters[i].getAttribute('y'), 10), parseInt(letters[i].getAttribute('width'), 10), parseInt(letters[i].getAttribute('height'), 10) ); data.chars[charCode] = { xOffset: parseInt(letters[i].getAttribute('xoffset'), 10), yOffset: parseInt(letters[i].getAttribute('yoffset'), 10), xAdvance: parseInt(letters[i].getAttribute('xadvance'), 10), kerning: {}, texture: PIXI.TextureCache[charCode] = new PIXI.Texture(this.texture, textureRect) }; } //parse kernings var kernings = responseXML.getElementsByTagName('kerning'); for (i = 0; i < kernings.length; i++) { var first = parseInt(kernings[i].getAttribute('first'), 10); var second = parseInt(kernings[i].getAttribute('second'), 10); var amount = parseInt(kernings[i].getAttribute('amount'), 10); data.chars[second].kerning[first] = amount; } PIXI.BitmapText.fonts[data.font] = data; image.addEventListener('loaded', this.onLoaded.bind(this)); image.load(); } } }; /** * Invoked when all files are loaded (xml/fnt and texture) * * @method onLoaded * @private */ PIXI.BitmapFontLoader.prototype.onLoaded = function() { this.emit('loaded', { content: this }); }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 * based on pixi impact spine implementation made by Eemeli Kelokorpi (@ekelokorpi) https://github.com/ekelokorpi * * Awesome JS run time provided by EsotericSoftware * https://github.com/EsotericSoftware/spine-runtimes * */ /** * The Spine loader is used to load in JSON spine data * To generate the data you need to use http://esotericsoftware.com/ and export in the "JSON" format * Due to a clash of names You will need to change the extension of the spine file from *.json to *.anim for it to load * See example 12 (http://www.goodboydigital.com/pixijs/examples/12/) to see a working example and check out the source * You will need to generate a sprite sheet to accompany the spine data * When loaded this class will dispatch a "loaded" event * * @class SpineLoader * @uses EventTarget * @constructor * @param url {String} The url of the JSON file * @param crossorigin {Boolean} Whether requests should be treated as crossorigin */ PIXI.SpineLoader = function(url, crossorigin) { /** * The url of the bitmap font data * * @property url * @type String */ this.url = url; /** * Whether the requests should be treated as cross origin * * @property crossorigin * @type Boolean */ this.crossorigin = crossorigin; /** * [read-only] Whether the data has loaded yet * * @property loaded * @type Boolean * @readOnly */ this.loaded = false; }; PIXI.SpineLoader.prototype.constructor = PIXI.SpineLoader; PIXI.EventTarget.mixin(PIXI.SpineLoader.prototype); /** * Loads the JSON data * * @method load */ PIXI.SpineLoader.prototype.load = function () { var scope = this; var jsonLoader = new PIXI.JsonLoader(this.url, this.crossorigin); jsonLoader.on('loaded', function (event) { scope.json = event.data.content.json; scope.onLoaded(); }); jsonLoader.load(); }; /** * Invoked when JSON file is loaded. * * @method onLoaded * @private */ PIXI.SpineLoader.prototype.onLoaded = function () { this.loaded = true; this.emit('loaded', { content: this }); }; /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * This is the base class for creating a PIXI filter. Currently only webGL supports filters. * If you want to make a custom filter this should be your base class. * @class AbstractFilter * @constructor * @param fragmentSrc {Array} The fragment source in an array of strings. * @param uniforms {Object} An object containing the uniforms for this filter. */ PIXI.AbstractFilter = function(fragmentSrc, uniforms) { /** * An array of passes - some filters contain a few steps this array simply stores the steps in a liniear fashion. * For example the blur filter has two passes blurX and blurY. * @property passes * @type Array(Filter) * @private */ this.passes = [this]; /** * @property shaders * @type Array(Shader) * @private */ this.shaders = []; /** * @property dirty * @type Boolean */ this.dirty = true; /** * @property padding * @type Number */ this.padding = 0; /** * @property uniforms * @type object * @private */ this.uniforms = uniforms || {}; /** * @property fragmentSrc * @type Array * @private */ this.fragmentSrc = fragmentSrc || []; }; PIXI.AbstractFilter.prototype.constructor = PIXI.AbstractFilter; /** * Syncs the uniforms between the class object and the shaders. * * @method syncUniforms */ PIXI.AbstractFilter.prototype.syncUniforms = function() { for(var i=0,j=this.shaders.length; i<j; i++) { this.shaders[i].dirty = true; } }; /* PIXI.AbstractFilter.prototype.apply = function(frameBuffer) { // TODO }; */ /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The AlphaMaskFilter class uses the pixel values from the specified texture (called the displacement map) to perform a displacement of an object. * You can use this filter to apply all manor of crazy warping effects * Currently the r property of the texture is used to offset the x and the g property of the texture is used to offset the y. * * @class AlphaMaskFilter * @extends AbstractFilter * @constructor * @param texture {Texture} The texture used for the displacement map * must be power of 2 texture at the moment */ PIXI.AlphaMaskFilter = function(texture) { PIXI.AbstractFilter.call( this ); this.passes = [this]; texture.baseTexture._powerOf2 = true; // set the uniforms this.uniforms = { mask: {type: 'sampler2D', value:texture}, mapDimensions: {type: '2f', value:{x:1, y:5112}}, dimensions: {type: '4fv', value:[0,0,0,0]} }; if(texture.baseTexture.hasLoaded) { this.uniforms.mask.value.x = texture.width; this.uniforms.mask.value.y = texture.height; } else { this.boundLoadedFunction = this.onTextureLoaded.bind(this); texture.baseTexture.on('loaded', this.boundLoadedFunction); } this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform sampler2D mask;', 'uniform sampler2D uSampler;', 'uniform vec2 offset;', 'uniform vec4 dimensions;', 'uniform vec2 mapDimensions;', 'void main(void) {', ' vec2 mapCords = vTextureCoord.xy;', ' mapCords += (dimensions.zw + offset)/ dimensions.xy ;', ' mapCords.y *= -1.0;', ' mapCords.y += 1.0;', ' mapCords *= dimensions.xy / mapDimensions;', ' vec4 original = texture2D(uSampler, vTextureCoord);', ' float maskAlpha = texture2D(mask, mapCords).r;', ' original *= maskAlpha;', //' original.rgb *= maskAlpha;', ' gl_FragColor = original;', //' gl_FragColor = gl_FragColor;', '}' ]; }; PIXI.AlphaMaskFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.AlphaMaskFilter.prototype.constructor = PIXI.AlphaMaskFilter; /** * Sets the map dimensions uniforms when the texture becomes available. * * @method onTextureLoaded */ PIXI.AlphaMaskFilter.prototype.onTextureLoaded = function() { this.uniforms.mapDimensions.value.x = this.uniforms.mask.value.width; this.uniforms.mapDimensions.value.y = this.uniforms.mask.value.height; this.uniforms.mask.value.baseTexture.off('loaded', this.boundLoadedFunction); }; /** * The texture used for the displacement map. Must be power of 2 sized texture. * * @property map * @type Texture */ Object.defineProperty(PIXI.AlphaMaskFilter.prototype, 'map', { get: function() { return this.uniforms.mask.value; }, set: function(value) { this.uniforms.mask.value = value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The ColorMatrixFilter class lets you apply a 4x4 matrix transformation on the RGBA * color and alpha values of every pixel on your displayObject to produce a result * with a new set of RGBA color and alpha values. It's pretty powerful! * * @class ColorMatrixFilter * @extends AbstractFilter * @constructor */ PIXI.ColorMatrixFilter = function() { PIXI.AbstractFilter.call( this ); this.passes = [this]; // set the uniforms this.uniforms = { matrix: {type: 'mat4', value: [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]} }; this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform float invert;', 'uniform mat4 matrix;', 'uniform sampler2D uSampler;', 'void main(void) {', ' gl_FragColor = texture2D(uSampler, vTextureCoord) * matrix;', // ' gl_FragColor = gl_FragColor;', '}' ]; }; PIXI.ColorMatrixFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.ColorMatrixFilter.prototype.constructor = PIXI.ColorMatrixFilter; /** * Sets the matrix of the color matrix filter * * @property matrix * @type Array(Number) * @default [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1] */ Object.defineProperty(PIXI.ColorMatrixFilter.prototype, 'matrix', { get: function() { return this.uniforms.matrix.value; }, set: function(value) { this.uniforms.matrix.value = value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * This greyscales the palette of your Display Objects. * * @class GrayFilter * @extends AbstractFilter * @constructor */ PIXI.GrayFilter = function() { PIXI.AbstractFilter.call( this ); this.passes = [this]; // set the uniforms this.uniforms = { gray: {type: '1f', value: 1} }; this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform sampler2D uSampler;', 'uniform float gray;', 'void main(void) {', ' gl_FragColor = texture2D(uSampler, vTextureCoord);', ' gl_FragColor.rgb = mix(gl_FragColor.rgb, vec3(0.2126*gl_FragColor.r + 0.7152*gl_FragColor.g + 0.0722*gl_FragColor., gray);', // ' gl_FragColor = gl_FragColor;', '}' ]; }; PIXI.GrayFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.GrayFilter.prototype.constructor = PIXI.GrayFilter; /** * The strength of the gray. 1 will make the object black and white, 0 will make the object its normal color. * @property gray * @type Number */ Object.defineProperty(PIXI.GrayFilter.prototype, 'gray', { get: function() { return this.uniforms.gray.value; }, set: function(value) { this.uniforms.gray.value = value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The DisplacementFilter class uses the pixel values from the specified texture (called the displacement map) to perform a displacement of an object. * You can use this filter to apply all manor of crazy warping effects * Currently the r property of the texture is used offset the x and the g property of the texture is used to offset the y. * * @class DisplacementFilter * @extends AbstractFilter * @constructor * @param texture {Texture} The texture used for the displacement map * must be power of 2 texture at the moment */ PIXI.DisplacementFilter = function(texture) { PIXI.AbstractFilter.call( this ); this.passes = [this]; texture.baseTexture._powerOf2 = true; // set the uniforms this.uniforms = { displacementMap: {type: 'sampler2D', value:texture}, scale: {type: '2f', value:{x:30, y:30}}, offset: {type: '2f', value:{x:0, y:0}}, mapDimensions: {type: '2f', value:{x:1, y:5112}}, dimensions: {type: '4fv', value:[0,0,0,0]} }; if(texture.baseTexture.hasLoaded) { this.uniforms.mapDimensions.value.x = texture.width; this.uniforms.mapDimensions.value.y = texture.height; } else { this.boundLoadedFunction = this.onTextureLoaded.bind(this); texture.baseTexture.on('loaded', this.boundLoadedFunction); } this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform sampler2D displacementMap;', 'uniform sampler2D uSampler;', 'uniform vec2 scale;', 'uniform vec2 offset;', 'uniform vec4 dimensions;', 'uniform vec2 mapDimensions;',// = vec2(256.0, 256.0);', // 'const vec2 textureDimensions = vec2(750.0, 750.0);', 'void main(void) {', ' vec2 mapCords = vTextureCoord.xy;', //' mapCords -= ;', ' mapCords += (dimensions.zw + offset)/ dimensions.xy ;', ' mapCords.y *= -1.0;', ' mapCords.y += 1.0;', ' vec2 matSample = texture2D(displacementMap, mapCords).xy;', ' matSample -= 0.5;', ' matSample *= scale;', ' matSample /= mapDimensions;', ' gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x + matSample.x, vTextureCoord.y + matSample.y));', ' gl_FragColor.rgb = mix( gl_FragColor.rgb, gl_FragColor.rgb, 1.0);', ' vec2 cord = vTextureCoord;', //' gl_FragColor = texture2D(displacementMap, cord);', // ' gl_FragColor = gl_FragColor;', '}' ]; }; PIXI.DisplacementFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.DisplacementFilter.prototype.constructor = PIXI.DisplacementFilter; /** * Sets the map dimensions uniforms when the texture becomes available. * * @method onTextureLoaded */ PIXI.DisplacementFilter.prototype.onTextureLoaded = function() { this.uniforms.mapDimensions.value.x = this.uniforms.displacementMap.value.width; this.uniforms.mapDimensions.value.y = this.uniforms.displacementMap.value.height; this.uniforms.displacementMap.value.baseTexture.off('loaded', this.boundLoadedFunction); }; /** * The texture used for the displacement map. Must be power of 2 texture. * * @property map * @type Texture */ Object.defineProperty(PIXI.DisplacementFilter.prototype, 'map', { get: function() { return this.uniforms.displacementMap.value; }, set: function(value) { this.uniforms.displacementMap.value = value; } }); /** * The multiplier used to scale the displacement result from the map calculation. * * @property scale * @type Point */ Object.defineProperty(PIXI.DisplacementFilter.prototype, 'scale', { get: function() { return this.uniforms.scale.value; }, set: function(value) { this.uniforms.scale.value = value; } }); /** * The offset used to move the displacement map. * * @property offset * @type Point */ Object.defineProperty(PIXI.DisplacementFilter.prototype, 'offset', { get: function() { return this.uniforms.offset.value; }, set: function(value) { this.uniforms.offset.value = value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * This filter applies a pixelate effect making display objects appear 'blocky'. * * @class PixelateFilter * @extends AbstractFilter * @constructor */ PIXI.PixelateFilter = function() { PIXI.AbstractFilter.call( this ); this.passes = [this]; // set the uniforms this.uniforms = { invert: {type: '1f', value: 0}, dimensions: {type: '4fv', value:new PIXI.Float32Array([10000, 100, 10, 10])}, pixelSize: {type: '2f', value:{x:10, y:10}} }; this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform vec2 testDim;', 'uniform vec4 dimensions;', 'uniform vec2 pixelSize;', 'uniform sampler2D uSampler;', 'void main(void) {', ' vec2 coord = vTextureCoord;', ' vec2 size = dimensions.xy/pixelSize;', ' vec2 color = floor( ( vTextureCoord * size ) ) / size + pixelSize/dimensions.xy * 0.5;', ' gl_FragColor = texture2D(uSampler, color);', '}' ]; }; PIXI.PixelateFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.PixelateFilter.prototype.constructor = PIXI.PixelateFilter; /** * This a point that describes the size of the blocks. x is the width of the block and y is the height. * * @property size * @type Point */ Object.defineProperty(PIXI.PixelateFilter.prototype, 'size', { get: function() { return this.uniforms.pixelSize.value; }, set: function(value) { this.dirty = true; this.uniforms.pixelSize.value = value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The BlurXFilter applies a horizontal Gaussian blur to an object. * * @class BlurXFilter * @extends AbstractFilter * @constructor */ PIXI.BlurXFilter = function() { PIXI.AbstractFilter.call( this ); this.passes = [this]; // set the uniforms this.uniforms = { blur: {type: '1f', value: 1/512} }; this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform float blur;', 'uniform sampler2D uSampler;', 'void main(void) {', ' vec4 sum = vec4(0.0);', ' sum += texture2D(uSampler, vec2(vTextureCoord.x - 4.0*blur, vTextureCoord.y)) * 0.05;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x - 3.0*blur, vTextureCoord.y)) * 0.09;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x - 2.0*blur, vTextureCoord.y)) * 0.12;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x - blur, vTextureCoord.y)) * 0.15;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y)) * 0.16;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x + blur, vTextureCoord.y)) * 0.15;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x + 2.0*blur, vTextureCoord.y)) * 0.12;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x + 3.0*blur, vTextureCoord.y)) * 0.09;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x + 4.0*blur, vTextureCoord.y)) * 0.05;', ' gl_FragColor = sum;', '}' ]; }; PIXI.BlurXFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.BlurXFilter.prototype.constructor = PIXI.BlurXFilter; /** * Sets the strength of both the blur. * * @property blur * @type Number * @default 2 */ Object.defineProperty(PIXI.BlurXFilter.prototype, 'blur', { get: function() { return this.uniforms.blur.value / (1/7000); }, set: function(value) { this.dirty = true; this.uniforms.blur.value = (1/7000) * value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The BlurYFilter applies a vertical Gaussian blur to an object. * * @class BlurYFilter * @extends AbstractFilter * @constructor */ PIXI.BlurYFilter = function() { PIXI.AbstractFilter.call( this ); this.passes = [this]; // set the uniforms this.uniforms = { blur: {type: '1f', value: 1/512} }; this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform float blur;', 'uniform sampler2D uSampler;', 'void main(void) {', ' vec4 sum = vec4(0.0);', ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - 4.0*blur)) * 0.05;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - 3.0*blur)) * 0.09;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - 2.0*blur)) * 0.12;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - blur)) * 0.15;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y)) * 0.16;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + blur)) * 0.15;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + 2.0*blur)) * 0.12;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + 3.0*blur)) * 0.09;', ' sum += texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + 4.0*blur)) * 0.05;', ' gl_FragColor = sum;', '}' ]; }; PIXI.BlurYFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.BlurYFilter.prototype.constructor = PIXI.BlurYFilter; /** * Sets the strength of both the blur. * * @property blur * @type Number * @default 2 */ Object.defineProperty(PIXI.BlurYFilter.prototype, 'blur', { get: function() { return this.uniforms.blur.value / (1/7000); }, set: function(value) { //this.padding = value; this.uniforms.blur.value = (1/7000) * value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * The BlurFilter applies a Gaussian blur to an object. * The strength of the blur can be set for x- and y-axis separately (always relative to the stage). * * @class BlurFilter * @extends AbstractFilter * @constructor */ PIXI.BlurFilter = function() { this.blurXFilter = new PIXI.BlurXFilter(); this.blurYFilter = new PIXI.BlurYFilter(); this.passes =[this.blurXFilter, this.blurYFilter]; }; PIXI.BlurFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.BlurFilter.prototype.constructor = PIXI.BlurFilter; /** * Sets the strength of both the blurX and blurY properties simultaneously * * @property blur * @type Number * @default 2 */ Object.defineProperty(PIXI.BlurFilter.prototype, 'blur', { get: function() { return this.blurXFilter.blur; }, set: function(value) { this.blurXFilter.blur = this.blurYFilter.blur = value; } }); /** * Sets the strength of the blurX property * * @property blurX * @type Number * @default 2 */ Object.defineProperty(PIXI.BlurFilter.prototype, 'blurX', { get: function() { return this.blurXFilter.blur; }, set: function(value) { this.blurXFilter.blur = value; } }); /** * Sets the strength of the blurY property * * @property blurY * @type Number * @default 2 */ Object.defineProperty(PIXI.BlurFilter.prototype, 'blurY', { get: function() { return this.blurYFilter.blur; }, set: function(value) { this.blurYFilter.blur = value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * This inverts your Display Objects colors. * * @class InvertFilter * @extends AbstractFilter * @constructor */ PIXI.InvertFilter = function() { PIXI.AbstractFilter.call( this ); this.passes = [this]; // set the uniforms this.uniforms = { invert: {type: '1f', value: 1} }; this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform float invert;', 'uniform sampler2D uSampler;', 'void main(void) {', ' gl_FragColor = texture2D(uSampler, vTextureCoord);', ' gl_FragColor.rgb = mix( (vec3(1)-gl_FragColor.rgb) * gl_FragColor.a, gl_FragColor.rgb, 1.0 - invert);', //' gl_FragColor.rgb = gl_FragColor.rgb * gl_FragColor.a;', // ' gl_FragColor = gl_FragColor * vColor;', '}' ]; }; PIXI.InvertFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.InvertFilter.prototype.constructor = PIXI.InvertFilter; /** * The strength of the invert. 1 will fully invert the colors, 0 will make the object its normal color * @property invert * @type Number */ Object.defineProperty(PIXI.InvertFilter.prototype, 'invert', { get: function() { return this.uniforms.invert.value; }, set: function(value) { this.uniforms.invert.value = value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * This applies a sepia effect to your Display Objects. * * @class SepiaFilter * @extends AbstractFilter * @constructor */ PIXI.SepiaFilter = function() { PIXI.AbstractFilter.call( this ); this.passes = [this]; // set the uniforms this.uniforms = { sepia: {type: '1f', value: 1} }; this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform float sepia;', 'uniform sampler2D uSampler;', 'const mat3 sepiaMatrix = mat3(0.3588, 0.7044, 0.1368, 0.2990, 0.5870, 0.1140, 0.2392, 0.4696, 0.0912);', 'void main(void) {', ' gl_FragColor = texture2D(uSampler, vTextureCoord);', ' gl_FragColor.rgb = mix( gl_FragColor.rgb, gl_FragColor.rgb * sepiaMatrix, sepia);', // ' gl_FragColor = gl_FragColor * vColor;', '}' ]; }; PIXI.SepiaFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.SepiaFilter.prototype.constructor = PIXI.SepiaFilter; /** * The strength of the sepia. 1 will apply the full sepia effect, 0 will make the object its normal color. * @property sepia * @type Number */ Object.defineProperty(PIXI.SepiaFilter.prototype, 'sepia', { get: function() { return this.uniforms.sepia.value; }, set: function(value) { this.uniforms.sepia.value = value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * This filter applies a twist effect making display objects appear twisted in the given direction. * * @class TwistFilter * @extends AbstractFilter * @constructor */ PIXI.TwistFilter = function() { PIXI.AbstractFilter.call( this ); this.passes = [this]; // set the uniforms this.uniforms = { radius: {type: '1f', value:0.5}, angle: {type: '1f', value:5}, offset: {type: '2f', value:{x:0.5, y:0.5}} }; this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform vec4 dimensions;', 'uniform sampler2D uSampler;', 'uniform float radius;', 'uniform float angle;', 'uniform vec2 offset;', 'void main(void) {', ' vec2 coord = vTextureCoord - offset;', ' float distance = length(coord);', ' if (distance < radius) {', ' float ratio = (radius - distance) / radius;', ' float angleMod = ratio * ratio * angle;', ' float s = sin(angleMod);', ' float c = cos(angleMod);', ' coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);', ' }', ' gl_FragColor = texture2D(uSampler, coord+offset);', '}' ]; }; PIXI.TwistFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.TwistFilter.prototype.constructor = PIXI.TwistFilter; /** * This point describes the the offset of the twist. * * @property offset * @type Point */ Object.defineProperty(PIXI.TwistFilter.prototype, 'offset', { get: function() { return this.uniforms.offset.value; }, set: function(value) { this.dirty = true; this.uniforms.offset.value = value; } }); /** * This radius of the twist. * * @property radius * @type Number */ Object.defineProperty(PIXI.TwistFilter.prototype, 'radius', { get: function() { return this.uniforms.radius.value; }, set: function(value) { this.dirty = true; this.uniforms.radius.value = value; } }); /** * This angle of the twist. * * @property angle * @type Number */ Object.defineProperty(PIXI.TwistFilter.prototype, 'angle', { get: function() { return this.uniforms.angle.value; }, set: function(value) { this.dirty = true; this.uniforms.angle.value = value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * This lowers the color depth of your image by the given amount, producing an image with a smaller palette. * * @class ColorStepFilter * @extends AbstractFilter * @constructor */ PIXI.ColorStepFilter = function() { PIXI.AbstractFilter.call( this ); this.passes = [this]; // set the uniforms this.uniforms = { step: {type: '1f', value: 5} }; this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform sampler2D uSampler;', 'uniform float step;', 'void main(void) {', ' vec4 color = texture2D(uSampler, vTextureCoord);', ' color = floor(color * step) / step;', ' gl_FragColor = color;', '}' ]; }; PIXI.ColorStepFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.ColorStepFilter.prototype.constructor = PIXI.ColorStepFilter; /** * The number of steps to reduce the palette by. * * @property step * @type Number */ Object.defineProperty(PIXI.ColorStepFilter.prototype, 'step', { get: function() { return this.uniforms.step.value; }, set: function(value) { this.uniforms.step.value = value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 * original filter: https://github.com/evanw/glfx.js/blob/master/src/filters/fun/dotscreen.js */ /** * This filter applies a dotscreen effect making display objects appear to be made out of black and white halftone dots like an old printer. * * @class DotScreenFilter * @extends AbstractFilter * @constructor */ PIXI.DotScreenFilter = function() { PIXI.AbstractFilter.call( this ); this.passes = [this]; // set the uniforms this.uniforms = { scale: {type: '1f', value:1}, angle: {type: '1f', value:5}, dimensions: {type: '4fv', value:[0,0,0,0]} }; this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform vec4 dimensions;', 'uniform sampler2D uSampler;', 'uniform float angle;', 'uniform float scale;', 'float pattern() {', ' float s = sin(angle), c = cos(angle);', ' vec2 tex = vTextureCoord * dimensions.xy;', ' vec2 point = vec2(', ' c * tex.x - s * tex.y,', ' s * tex.x + c * tex.y', ' ) * scale;', ' return (sin(point.x) * sin(point.y)) * 4.0;', '}', 'void main() {', ' vec4 color = texture2D(uSampler, vTextureCoord);', ' float average = (color.r + color.g + color. / 3.0;', ' gl_FragColor = vec4(vec3(average * 10.0 - 5.0 + pattern()), color.a);', '}' ]; }; PIXI.DotScreenFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.DotScreenFilter.prototype.constructor = PIXI.DotScreenFilter; /** * The scale of the effect. * @property scale * @type Number */ Object.defineProperty(PIXI.DotScreenFilter.prototype, 'scale', { get: function() { return this.uniforms.scale.value; }, set: function(value) { this.dirty = true; this.uniforms.scale.value = value; } }); /** * The radius of the effect. * @property angle * @type Number */ Object.defineProperty(PIXI.DotScreenFilter.prototype, 'angle', { get: function() { return this.uniforms.angle.value; }, set: function(value) { this.dirty = true; this.uniforms.angle.value = value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * A Cross Hatch effect filter. * * @class CrossHatchFilter * @extends AbstractFilter * @constructor */ PIXI.CrossHatchFilter = function() { PIXI.AbstractFilter.call( this ); this.passes = [this]; // set the uniforms this.uniforms = { blur: {type: '1f', value: 1 / 512} }; this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform float blur;', 'uniform sampler2D uSampler;', 'void main(void) {', ' float lum = length(texture2D(uSampler, vTextureCoord.xy).rgb);', ' gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);', ' if (lum < 1.00) {', ' if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) {', ' gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);', ' }', ' }', ' if (lum < 0.75) {', ' if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) {', ' gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);', ' }', ' }', ' if (lum < 0.50) {', ' if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0) {', ' gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);', ' }', ' }', ' if (lum < 0.3) {', ' if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0) {', ' gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);', ' }', ' }', '}' ]; }; PIXI.CrossHatchFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.CrossHatchFilter.prototype.constructor = PIXI.CrossHatchFilter; /** * Sets the strength of both the blur. * * @property blur * @type Number * @default 2 */ Object.defineProperty(PIXI.CrossHatchFilter.prototype, 'blur', { get: function() { return this.uniforms.blur.value / (1/7000); }, set: function(value) { //this.padding = value; this.uniforms.blur.value = (1/7000) * value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * An RGB Split Filter. * * @class RGBSplitFilter * @extends AbstractFilter * @constructor */ PIXI.RGBSplitFilter = function() { PIXI.AbstractFilter.call( this ); this.passes = [this]; // set the uniforms this.uniforms = { red: {type: '2f', value: {x:20, y:20}}, green: {type: '2f', value: {x:-20, y:20}}, blue: {type: '2f', value: {x:20, y:-20}}, dimensions: {type: '4fv', value:[0,0,0,0]} }; this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform vec2 red;', 'uniform vec2 green;', 'uniform vec2 blue;', 'uniform vec4 dimensions;', 'uniform sampler2D uSampler;', 'void main(void) {', ' gl_FragColor.r = texture2D(uSampler, vTextureCoord + red/dimensions.xy).r;', ' gl_FragColor.g = texture2D(uSampler, vTextureCoord + green/dimensions.xy).g;', ' gl_FragColor.b = texture2D(uSampler, vTextureCoord + blue/dimensions.xy).b;', ' gl_FragColor.a = texture2D(uSampler, vTextureCoord).a;', '}' ]; }; PIXI.RGBSplitFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.RGBSplitFilter.prototype.constructor = PIXI.RGBSplitFilter; /** * Red channel offset. * * @property red * @type Point */ Object.defineProperty(PIXI.RGBSplitFilter.prototype, 'red', { get: function() { return this.uniforms.red.value; }, set: function(value) { this.uniforms.red.value = value; } }); /** * Green channel offset. * * @property green * @type Point */ Object.defineProperty(PIXI.RGBSplitFilter.prototype, 'green', { get: function() { return this.uniforms.green.value; }, set: function(value) { this.uniforms.green.value = value; } }); /** * Blue offset. * * @property blue * @type Point */ Object.defineProperty(PIXI.RGBSplitFilter.prototype, 'blue', { get: function() { return this.uniforms.blue.value; }, set: function(value) { this.uniforms.blue.value = value; } }); /** * @author Mat Groves http://matgroves.com/ @Doormat23 */ if (typeof exports !== 'undefined') { if (typeof module !== 'undefined' && module.exports) { exports = module.exports = PIXI; } exports.PIXI = PIXI; } else if (typeof define !== 'undefined' && define.amd) { define(PIXI); } else { root.PIXI = PIXI; } }).call(this); libs/fpsmeter.js /*! FPSMeter 0.3.1 - 9th May 2013 | https://github.com/Darsain/fpsmeter */ (function(m, j) { function s(a, e) { for (var g in e) try { a.style[g] = e[g] } catch (j) {} return a } function H(a) { return null == a ? String(a) : "object" === typeof a || "function" === typeof a ? Object.prototype.toString.call(a).match(/\s([a-z]+)/i)[1].toLowerCase() || "object" : typeof a } function R(a, e) { if ("array" !== H(e)) return -1; if (e.indexOf) return e.indexOf(a); for (var g = 0, j = e.length; g < j; g++) if (e[g] === a) return g; return -1 } function I() { var a = arguments, e; for (e in a[1]) if (a[1].hasOwnProperty(e)) switch (H(a[1][e])) { case "object": a[0][e] = I({}, a[0][e], a[1][e]); break; case "array": a[0][e] = a[1][e].slice(0); break; default: a[0][e] = a[1][e] } return 2 < a.length ? I.apply(null, [a[0]].concat(Array.prototype.slice.call(a, 2))) : a[0] } function N(a) { a = Math.round(255 * a).toString(16); return 1 === a.length ? "0" + a : a } function S(a, e, g, j) { if (a.addEventListener) a[j ? "removeEventListener" : "addEventListener"](e, g, !1); else if (a.attachEvent) a[j ? "detachEvent" : "attachEvent"]("on" + e, g) } function D(a, e) { function g(a, b, d, c) { return y[0 | a][Math.round(Math.min((b - d) / (c - d) * J, J))] } function r() { f.legend.fps !== q && (f.legend.fps = q, f.legend[T] = q ? "FPS" : "ms"); K = q ? b.fps : b.duration; f.count[T] = 999 < K ? "999+" : K.toFixed(99 < K ? 0 : d.decimals) } function m() { z = A(); L < z - d.threshold && (b.fps -= b.fps / Math.max(1, 60 * d.smoothing / d.interval), b.duration = 1E3 / b.fps); for (c = d.history; c-- E[c] = 0 === c ? b.fps : E[c - 1], F[c] = 0 === c ? b.duration : F[c - 1]; r(); if (d.heat) { if (w.length) for (c = w.length; c-- w[c].el.style[h[w[c].name].heatOn] = q ? g(h[w[c].name].heatmap, b.fps, 0, d.maxFps) : g(h[w[c].name].heatmap, b.duration, d.threshold, 0); if (f.graph && h.column.heatOn) for (c = u.length; c-- u[c].style[h.column.heatOn] = q ? g(h.column.heatmap, E[c], 0, d.maxFps) : g(h.column.heatmap, F[c], d.threshold, 0) } if (f.graph) for (p = 0; p < d.history; p++) u[p].style.height = (q ? E[p] ? Math.round(O / d.maxFps * Math.min(E[p], d.maxFps)) : 0 : F[p] ? Math.round(O / d.threshold * Math.min(F[p], d.threshold)) : 0) + "px" } function k() { 20 > d.interval ? (x = M(k), m()) : (x = setTimeout(k, d.interval), P = M(m)) } function G(a) { a = a || window.event; a.preventDefault ? (a.preventDefault(), a.stopPropagation()) : (a.returnValue = !1, a.cancelBubble = !0); b.toggle() } function U() { d.toggleOn && S(f.container, d.toggleOn, G, 1); a.removeChild(f.container) } function V() { f.container && U(); h = D.theme[d.theme]; y = h.compiledHeatmaps || []; if (!y.length && h.heatmaps.length) { for (p = 0; p < h.heatmaps.length; p++) { y[p] = []; for (c = 0; c <= J; c++) { var b = y[p], e = c, g; g = 0.33 / J * c; var j = h.heatmaps[p].saturation, m = h.heatmaps[p].lightness, n = void 0, k = void 0, l = void 0, t = l = void 0, v = n = k = void 0, v = void 0, l = 0.5 >= m ? m * (1 + j) : m + j - m * j; 0 === l ? g = "#000" : (t = 2 * m - l, k = (l - t) / l, g *= 6, n = Math.floor(g), v = g - n, v *= l * k, 0 === n || 6 === n ? (n = l, k = t + v, l = t) : 1 === n ? (n = l - v, k = l, l = t) : 2 === n ? (n = t, k = l, l = t + v) : 3 === n ? (n = t, k = l - v) : 4 === n ? (n = t + v, k = t) : (n = l, k = t, l -= v), g = "#" + N(n) + N(k) + N(l)); b[e] = g } } h.compiledHeatmaps = y } f.container = s(document.createElement("div"), h.container); f.count = f.container.appendChild(s(document.createElement("div"), h.count)); f.legend = f.container.appendChild(s(document.createElement("div"), h.legend)); f.graph = d.graph ? f.container.appendChild(s(document.createElement("div"), h.graph)) : 0; w.length = 0; for (var q in f) f[q] && h[q].heatOn && w.push({ name: q, el: f[q] }); u.length = 0; if (f.graph) { f.graph.style.width = d.history * h.column.width + (d.history - 1) * h.column.spacing + "px"; for (c = 0; c < d.history; c++) u[c] = f.graph.appendChild(s(document.createElement("div"), h.column)), u[c].style.position = "absolute", u[c].style.bottom = 0, u[c].style.right = c * h.column.width + c * h.column.spacing + "px", u[c].style.width = h.column.width + "px", u[c].style.height = "0px" } s(f.container, d); r(); a.appendChild(f.container); f.graph && (O = f.graph.clientHeight); d.toggleOn && ("click" === d.toggleOn && (f.container.style.cursor = "pointer"), S(f.container, d.toggleOn, G)) } "object" === H(a) && a.nodeType === j && (e = a, a = document.body); a || (a = document.body); var b = this, d = I({}, D.defaults, e || {}), f = {}, u = [], h, y, J = 100, w = [], W = 0, B = d.threshold, Q = 0, L = A() - B, z, E = [], F = [], x, P, q = "fps" === d.show, O, K, c, p; b.options = d; b.fps = 0; b.duration = 0; b.isPaused = 0; b.tickStart = function() { Q = A() }; b.tick = function() { z = A(); W = z - L; B += (W - / d.smoothing; b.fps = 1E3 / B; b.duration = Q < L ? B : z - Q; L = z }; b.pause = function() { x && (b.isPaused = 1, clearTimeout(x), C(x), C(P), x = P = 0); return b }; b.resume = function() { x || (b.isPaused = 0, k()); return b }; b.set = function(a, c) { d[a] = c; q = "fps" === d.show; - 1 !== R(a, X) && V(); - 1 !== R(a, Y) && s(f.container, d); return b }; b.showDuration = function() { b.set("show", "ms"); return b }; b.showFps = function() { b.set("show", "fps"); return b }; b.toggle = function() { b.set("show", q ? "ms" : "fps"); return b }; b.hide = function() { b.pause(); f.container.style.display = "none"; return b }; b.show = function() { b.resume(); f.container.style.display = "block"; return b }; b.destroy = function() { b.pause(); U(); b.tick = b.tickStart = function() {} }; V(); k() } var A, r = m.performance; A = r && (r.now || r.webkitNow) ? r[r.now ? "now" : "webkitNow"].bind(r) : function() { return +new Date }; for (var C = m.cancelAnimationFrame || m.cancelRequestAnimationFrame, M = m.requestAnimationFrame, r = ["moz", "webkit", "o"], G = 0, k = 0, Z = r.length; k < Z && !C; ++k) M = (C = m[r[k] + "CancelAnimationFrame"] || m[r[k] + "CancelRequestAnimationFrame"]) && m[r[k] + "RequestAnimationFrame"]; C || (M = function(a) { var e = A(), g = Math.max(0, 16 - (e - G)); G = e + g; return m.setTimeout(function() { a(e + g) }, g) }, C = function(a) { clearTimeout(a) }); var T = "string" === H(document.createElement("div").textContent) ? "textContent" : "innerText"; D.extend = I; window.FPSMeter = D; D.defaults = { interval: 100, smoothing: 10, show: "fps", toggleOn: "click", decimals: 1, maxFps: 60, threshold: 100, position: "absolute", zIndex: 10, left: "5px", top: "5px", right: "auto", bottom: "auto", margin: "0 0 0 0", theme: "dark", heat: 0, graph: 0, history: 20 }; var X = ["toggleOn", "theme", "heat", "graph", "history"], Y = "position zIndex left top right bottom margin".split(" ") })(window); (function(m, j) { j.theme = {}; var s = j.theme.base = { heatmaps: [], container: { heatOn: null, heatmap: null, padding: "5px", minWidth: "95px", height: "30px", lineHeight: "30px", textAlign: "right", textShadow: "none" }, count: { heatOn: null, heatmap: null, position: "absolute", top: 0, right: 0, padding: "5px 10px", height: "30px", fontSize: "24px", fontFamily: "Consolas, Andale Mono, monospace", zIndex: 2 }, legend: { heatOn: null, heatmap: null, position: "absolute", top: 0, left: 0, padding: "5px 10px", height: "30px", fontSize: "12px", lineHeight: "32px", fontFamily: "sans-serif", textAlign: "left", zIndex: 2 }, graph: { heatOn: null, heatmap: null, position: "relative", boxSizing: "padding-box", MozBoxSizing: "padding-box", height: "100%", zIndex: 1 }, column: { width: 4, spacing: 1, heatOn: null, heatmap: null } }; j.theme.dark = j.extend({}, s, { heatmaps: [{ saturation: 0.8, lightness: 0.8 }], container: { background: "#222", color: "#fff", border: "1px solid #1a1a1a", textShadow: "1px 1px 0 #222" }, count: { heatOn: "color" }, column: { background: "#3f3f3f" } }); j.theme.light = j.extend({}, s, { heatmaps: [{ saturation: 0.5, lightness: 0.5 }], container: { color: "#666", background: "#fff", textShadow: "1px 1px 0 rgba(255,255,255,.5), -1px -1px 0 rgba(255,255,255,.5)", boxShadow: "0 0 0 1px rgba(0,0,0,.1)" }, count: { heatOn: "color" }, column: { background: "#eaeaea" } }); j.theme.colorful = j.extend({}, s, { heatmaps: [{ saturation: 0.5, lightness: 0.6 }], container: { heatOn: "backgroundColor", background: "#888", color: "#fff", textShadow: "1px 1px 0 rgba(0,0,0,.2)", boxShadow: "0 0 0 1px rgba(0,0,0,.1)" }, column: { background: "#777", backgroundColor: "rgba(0,0,0,.2)" } }); j.theme.transparent = j.extend({}, s, { heatmaps: [{ saturation: 0.8, lightness: 0.5 }], container: { padding: 0, color: "#fff", textShadow: "1px 1px 0 rgba(0,0,0,.5)" }, count: { padding: "0 5px", height: "40px", lineHeight: "40px" }, legend: { padding: "0 5px", height: "40px", lineHeight: "42px" }, graph: { height: "40px" }, column: { width: 5, background: "#999", heatOn: "backgroundColor", opacity: 0.5 } }) })(window, FPSMeter); Condividi questo messaggio Link di questo messaggio Condividi su altri siti
kaine 1858 Segnala messaggio Inviato October 1, 2015 https://www.youtube.com/watch?t=175&v=ZUQFQNk06UQ da notare che viene menzionato un convertitore per i progetti dall'ace all'mv fonte il blog di yanfly Condividi questo messaggio Link di questo messaggio Condividi su altri siti
Melosx 16 Segnala messaggio Inviato October 1, 2015 Provata la Demo anche sul tablet (Samsung Tab 3 10.1 - KitKat 4.4.2). Controlli touch Movimento: Tocco sul punto dove andare o tengo premuto e scorro il dito. Apertura menu/Torna indietro: Doppio tocco ovunque sullo schermo. Non molto fluido ma li è colpa del mio Tab3 che a RAM è messo maluccio. Se avete dispositivi più performanti provate pure voi. Condividi questo messaggio Link di questo messaggio Condividi su altri siti
Ally 205 Segnala messaggio Inviato October 1, 2015 Maledizione a me che non uso Ace <.< Provato comunque su tablet IOS, funziona a meraviglia... Condividi questo messaggio Link di questo messaggio Condividi su altri siti