-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathalleg.js
47 lines (47 loc) · 26.6 KB
/
alleg.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function install_allegro(){Date.now||(Date.now=function(){return(new Date).getTime()});log("Allegro installed!")}function allegro_init(){install_allegro()}function allegro_init_all(a,b,c,d,e){install_allegro();set_gfx_mode(a,b,c);install_mouse(d);install_keyboard(e);install_sound()}function END_OF_MAIN(){window.addEventListener("load",main)}
var mouse_b=0,mouse_pressed=0,mouse_released=0,mouse_x=-1,mouse_y=-1,mouse_z=-1,mouse_mx=0,mouse_my=0,mouse_mz=0,_mouse_installed=!1,_last_mouse_x=-1,_last_mouse_y=-1,_last_mouse_z=-1,_menu=!1;
function install_mouse(a){if(!canvas)return _error("You must call set_gfx_mode before install_mouse"),-1;if(_mouse_installed)return _allog("Mouse already installed"),-1;canvas.canvas.addEventListener("mouseup",_mouseup);canvas.canvas.addEventListener("mousedown",_mousedown);canvas.canvas.addEventListener("mousemove",_mousemove);canvas.canvas.addEventListener("wheel",_mousewheel);a?_menu_supress=!0:(canvas.canvas.addEventListener("contextmenu",_mousemenu),_menu_supress=!1);_mouse_installed=!0;log("Mouse installed!");
return 0}function remove_mouse(){if(!_mouse_installed)return _error("You must call install_mouse before remove_mouse"),-1;canvas.canvas.removeEventListener("mouseup",_mouseup);canvas.canvas.removeEventListener("mousedown",_mousedown);canvas.canvas.removeEventListener("mousemove",_mousemove);canvas.canvas.removeEventListener("wheel",_mousewheel);_menu_supress&&canvas.canvas.removeEventListener("contextmenu",_mousemenu);_mouse_installed=!1;log("Mouse removed!");return 0}
function show_mouse(){if(!_mouse_installed)return _error("You must call install_mouse before show_mouse"),-1;canvas.canvas.style.cursor="auto";return 0}function hide_mouse(){if(!_mouse_installed)return _error("You must call install_mouse before hide_mouse"),-1;canvas.canvas.style.cursor="none";return 0}function _mousemenu(a){a.preventDefault()}function _mouseup(a){mouse_b&=~(1<<a.which-1);mouse_released|=1<<a.which-1;a.preventDefault()}
function _mousedown(a){mouse_b|=1<<a.which-1;mouse_pressed|=1<<a.which-1;a.preventDefault()}function _mousemove(a){mouse_x=a.offsetX;mouse_y=a.offsetY;a.preventDefault()}function _mousewheel(a){mouse_z+=a.deltaY;a.preventDefault()}function TOUCH_OBJECT(a,b,c,d,e,f,g,h,k,p,l){}var _touch_installed=!1,touch=[],touch_pressed=[],touch_released=[];
function install_touch(){if(!canvas)return _error("You must call set_gfx_mode before install_touch"),-1;if(_touch_installed)return _allog("Touch already installed"),-1;canvas.canvas.addEventListener("touchstart",_touchstart);canvas.canvas.addEventListener("touchend",_touchend);canvas.canvas.addEventListener("touchcancel",_touchend);canvas.canvas.addEventListener("touchmove",_touchmove);_touch_installed=!0;log("Touch installed!")}
function remove_touch(){if(!canvas)return _error("You must call set_gfx_mode before install_touch"),-1;if(!_touch_installed)return _allog("Touch not installed"),-1;canvas.canvas.removeEventListener("touchstart",_touchstart);canvas.canvas.removeEventListener("touchend",_touchend);canvas.canvas.removeEventListener("touchcancel",_touchend);canvas.canvas.removeEventListener("touchmove",_touchmove);_touch_installed=!1;log("Touch removed!")}
function _get_touch(a){for(var b=0;b<touch.length;b++)if(touch[b].id==a)return touch[b];return null}function _touchstart(a){for(var b=a.target.getBoundingClientRect(),c=0;c<a.changedTouches.length;c++){var d=a.changedTouches.item(c),d={sx:d.clientX-b.left,sx:d.clientY-b.top,mx:0,my:0,px:d.clientX-b.left,py:d.clientY-b.top,x:d.clientX-b.left,y:d.clientY-b.top,id:d.identifier,dead:!1,age:0};touch.push(d);touch_pressed.push(d)}a.preventDefault()}
function _touchend(a){for(var b=0;b<a.changedTouches.length;b++){var c=a.changedTouches.item(b);if(c=_get_touch(c.identifier))touch.splice(touch.indexOf(c),1),touch_released.push(c),c.dead=!0}a.preventDefault()}function _touchmove(a){for(var b=a.target.getBoundingClientRect(),c=0;c<a.changedTouches.length;c++){var d=a.changedTouches.item(c),e=_get_touch(d.identifier);if(e){var f=d.clientX-b.left,d=d.clientY-b.top;e.mx+=e.x-f;e.my+=e.y-d;e.x=f;e.y=d}}a.preventDefault()}
var _downloadables=[],_installed_timers=[];function _timer_lookup(a){for(var b=0;b<_installed_timers.length;b++)if(_installed_timers[b].timer==a)return _installed_timers[b];return-1}function SECS_TO_TIMER(a){return 1E3*a}function MSEC_TO_TIMER(a){return a}function BPS_TO_TIMER(a){return 1E3/a}function BPM_TO_TIMER(a){return 6E4/a}function install_timer(){}function time(){return Date.now()}function install_int(a,b){return install_int_ex(a,MSEC_TO_TIMER(b))}
function install_int_ex(a,b){var c=window.setInterval(a,b);_installed_timers.push({timer:a,id:c});log("Added insterrupt #"+c+" at "+b+"msec isntervals!")}var _loopproc,camera_x=0,camera_y=0;
function _uberloop(){canvas.context.setTransform(1,0,0,1,-camera_x,-camera_y);_mouse_installed&&(mouse_mx=mouse_x-_last_mouse_x,mouse_my=mouse_y-_last_mouse_y,mouse_mz=mouse_z-_last_mouse_z);_loopproc();if(_keyboard_installed)for(var a=0;128>a;a++)pressed[a]=!1,released[a]=!1;_mouse_installed&&(mouse_mz=mosue_my=mouse_mx=mouse_released=mouse_pressed=0,_last_mouse_x=mouse_x,_last_mouse_y=mouse_y,_last_mouse_z=mouse_z);if(_touch_installed)for(touch_released=[],touch_pressed=[],a=0;a<touch.length;a++)touch[a].mx=
0,touch[a].my=0,touch[a].px=touch[a].x,touch[a].py=touch[a].y,touch[a].age++}function loop(a,b){_loopproc=a;window.setInterval(_uberloop,b);log("Game loop initialised!")}var _loader_init_time,_ready_proc,_bar_proc;
function _progress_check(){for(var a=0,b=0,c=0;c<_downloadables.length;c++)a++,"snd"==_downloadables[c].type&&_downloadables[c].element.readyState>=_downloadables[c].element.HAVE_FUTURE_DATA&&(_downloadables[c].ready=!0),_downloadables[c].ready&&b++;_bar_proc&&_bar_proc(a/b);b<a?window.setTimeout(_progress_check,100):(log("Loading complete! Took "+((time()-_loader_init_time)/1E3).toFixed(1)+" seconds!"),_ready_proc())}
function loading_bar(a){rectfill(canvas,5,SCREEN_H-55,SCREEN_W-10,50,makecol(0,0,0));rectfill(canvas,10,SCREEN_H-50,SCREEN_W-20,40,makecol(255,255,255));rectfill(canvas,15,SCREEN_H-45,SCREEN_W-30,30,makecol(0,0,0));rectfill(canvas,20,SCREEN_H-40,scaleclamp(a,0,1,0,SCREEN_W-40),20,makecol(255,255,255))}function ready(a,b){_loader_init_time=time();_ready_proc=a;log("Loader initialised!");_bar_proc=b?b:loading_bar;window.setTimeout(_progress_check,100)}
function remove_int(a){for(a=0;a<_installed_timers.length;a++)if(_installed_timers[a].timer==_installed_timers){log("Removing interrupt "+_installed_timers[a].id+"!");window.clearInterval(_installed_timers[a].id);_installed_timers.splice(a,1);break}}function remove_all_ints(){for(var a=0;a<_installed_timers.length;a++)window.clearInterval(_installed_timers[a].id);_installed_timers=[];log("Removed all interrupts!")}
var KEY_A=65,KEY_B=66,KEY_C=67,KEY_D=68,KEY_E=69,KEY_F=70,KEY_G=71,KEY_H=72,KEY_I=73,KEY_J=74,KEY_K=75,KEY_L=76,KEY_M=77,KEY_N=78,KEY_O=79,KEY_P=80,KEY_Q=81,KEY_R=82,KEY_S=83,KEY_T=84,KEY_U=85,KEY_V=86,KEY_W=87,KEY_X=88,KEY_Y=89,KEY_Z=90,KEY_0=48,KEY_1=49,KEY_2=50,KEY_3=51,KEY_4=52,KEY_5=53,KEY_6=54,KEY_7=55,KEY_8=56,KEY_9=57,KEY_0_PAD=96,KEY_1_PAD=97,KEY_2_PAD=98,KEY_3_PAD=99,KEY_4_PAD=100,KEY_5_PAD=101,KEY_6_PAD=102,KEY_7_PAD=103,KEY_8_PAD=104,KEY_9_PAD=105,KEY_F1=112,KEY_F2=113,KEY_F3=114,KEY_F4=
115,KEY_F5=116,KEY_F6=117,KEY_F7=118,KEY_F8=119,KEY_F9=120,KEY_F10=121,KEY_F11=122,KEY_F12=123,KEY_ESC=27,KEY_TILDE=192,KEY_MINUS=189,KEY_EQUALS=187,KEY_BACKSPACE=8,KEY_TAB=9,KEY_OPENBRACE=219,KEY_CLOSEBRACE=221,KEY_ENTER=13,KEY_COLON=186,KEY_QUOTE=222,KEY_BACKSLASH=220,KEY_COMMA=188,KEY_STOP=190,KEY_SLASH=191,KEY_SPACE=32,KEY_INSERT=45,KEY_DEL=46,KEY_HOME=36,KEY_END=35,KEY_PGUP=33,KEY_PGDN=34,KEY_LEFT=37,KEY_RIGHT=39,KEY_UP=38,KEY_DOWN=40,KEY_SLASH_PAD=111,KEY_ASTERISK=106,KEY_MINUS_PAD=109,KEY_PLUS_PAD=
107,KEY_ENTER_PAD=13,KEY_PRTSCR=44,KEY_PAUSE=19,KEY_EQUALS_PAD=12,KEY_LSHIFT=16,KEY_RSHIFT=16,KEY_LCONTROL=17,KEY_RCONTROL=17,KEY_ALT=18,KEY_ALTGR=18,KEY_LWIN=91,KEY_RWIN=92,KEY_MENU=93,KEY_SCRLOCK=157,KEY_NUMLOCK=144,KEY_CAPSLOCK=20,key=[],pressed=[],released=[],_keyboard_installed=!1,_default_enabled_keys=[KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5,KEY_F6,KEY_F7,KEY_F8,KEY_F9,KEY_F10,KEY_F11,KEY_F12],_enabled_keys=[];
function install_keyboard(a){if(_keyboard_installed)return _allog("Keyboard already installed"),-1;_enabled_keys=a?a:_default_enabled_keys;for(a=0;128>a;a++)key[a]=!1,pressed[a]=!1,released[a]=!1;document.addEventListener("keyup",_keyup);document.addEventListener("keydown",_keydown);_keyboard_installed=!0;log("Keyboard installed!");return 0}
function remove_keyboard(){if(!_keyboard_installed)return _allog("Keyboard not installed"),-1;document.removeEventListener("keyup",_keyup);document.removeEventListener("keydown",_keydown);_keyboard_installed=!1;log("Keyboard removed!");return 0}function _keydown(a){key[a.keyCode]||(pressed[a.keyCode]=!0);key[a.keyCode]=!0;-1==_enabled_keys.indexOf(a.keyCode)&&a.preventDefault()}function _keyup(a){key[a.keyCode]=!1;released[a.keyCode]=!0;-1==_enabled_keys.indexOf(a.keyCode)&&a.preventDefault()}
function BITMAP_OBJECT(a,b,c,d,e,f){}function create_bitmap(a,b){log("Creating bitmap at "+a+" x "+b+"!");var c=document.createElement("canvas");c.width=a;c.height=b;var d=c.getContext("2d");return{w:a,h:b,canvas:c,context:d,ready:!0,type:"bmp"}}
function load_bitmap(a){log("Loading bitmap "+a+"...");var b=new Image;b.src=a;time();var c=document.createElement("canvas"),d=c.getContext("2d"),e={canvas:c,context:d,w:-1,h:-1,ready:!1,type:"bmp"};_downloadables.push(e);b.onload=function(){log("Bitmap "+a+" loaded, size: "+b.width+" x "+b.height+"!");e.canvas.width=b.width;e.canvas.height=b.height;e.context.drawImage(b,0,0);e.w=b.width;e.h=b.height;e.ready=!0};return e}function load_bmp(a){return load_bitmap(a)}
function load_sheet(a,b,c){log("Loading spritesheet "+a+"...");var d=new Image;d.src=a;time();var e=document.createElement("canvas"),f=e.getContext("2d"),g={canvas:e,context:f,w:-1,h:-1,ready:!1,type:"bmp"},h=[];_downloadables.push(g);d.onload=function(){log("Sheet "+a+" loaded, size: "+d.width+" x "+d.height+"!");g.canvas.width=d.width;g.canvas.height=d.height;g.context.drawImage(d,0,0);g.w=d.width;g.h=d.height;g.ready=!0;for(var e=Math.floor(g.w/b),f=Math.floor(g.h/c),l=0;l<f;l++)for(var m=0;m<
e;m++){var n=create_bitmap(b,c);blit(g,n,m*b,l*c,0,0,b,c);h.push(n)}log("Created "+n.length+" frames, each is "+b+"x"+c+"!")};return h}var canvas,_gfx_installed=!1,SCREEN_W=0,SCREEN_H=0,font;
function set_gfx_mode(a,b,c,d){d="undefined"!==typeof d?d:!0;var e=document.getElementById(a);if(!e)return _error("Can't find canvas with id "+a),-1;a=e.getBoundingClientRect();b||(b=a.width);c||(c=a.height);e.width=b;e.height=c;a=e.getContext("2d");a.mozImageSmoothingEnabled=d;a.webkitImageSmoothingEnabled=d;a.imageSmoothingEnabled=d;SCREEN_W=b;SCREEN_H=c;canvas={w:b,h:c,canvas:e,context:a,ready:!0};font=load_base64_font(_cartoon_woff);_gfx_installed=!0;log("Graphics mode set to "+b+" x "+c);return 0}
var PI=3.14159265,PI2=6.2831853,PI_2=1.570796325,PI_3=3.14159265/3,PI_4=.7853981625;function RAD(a){return-a*PI/180}function DEG(a){return 180*-a/PI}function _fillstyle(a,b){a.context.fillStyle="rgba("+getr(b)+","+getg(b)+","+getb(b)+","+getaf(b)+")"}function _strokestyle(a,b,c){c||(c=1);a.context.lineWidth=c;a.context.strokeStyle="rgba("+getr(b)+","+getg(b)+","+getb(b)+","+getaf(b)+")"}function makecol(a,b,c,d){return("undefined"!==typeof d?d:255)<<24|(a&255)<<16|(b&255)<<8|c&255}
function makecolf(a,b,c,d){return makecol(255*a,255*b,255*c,255*("undefined"!==typeof d?d:1))}function getr(a){return a>>16&255}function getg(a){return a>>8&255}function getb(a){return a&255}function geta(a){return a>>>24}function getrf(a){return a>>16&1}function getgf(a){return a>>8&1}function getbf(a){return a&1}function getaf(a){return(a>>>24)/255}function getpixel(a,b,c){a=a.context.getImageData(b,c,1,1).data;return a[3]<<24|(a[0]&255)<<16|(a[1]&255)<<8|a[2]&255}
function putpixel(a,b,c,d){_fillstyle(a,d);a.context.fillRect(b,c,1,1)}function clear_bitmap(a){a.context.clearRect(0,0,a.w,a.h)}function clear_to_color(a,b){a.context.clearRect(0,0,a.w,a.h);_fillstyle(a,b);a.context.fillRect(0,0,a.w,a.h)}function line(a,b,c,d,e,f,g){_strokestyle(a,f,g);a.context.beginPath();a.context.moveTo(b,c);a.context.lineTo(d,e);a.context.stroke()}function vline(a,b,c,d,e,f){f="undefined"!==typeof f?f:1;_fillstyle(a,e);a.context.fillRect(b-f/2,c,f,d-c)}
function hline(a,b,c,d,e,f){f="undefined"!==typeof f?f:1;_fillstyle(a,e);a.context.fillRect(b,c-f/2,d-b,f)}function triangle(a,b,c,d,e,f,g,h,k){_strokestyle(a,h,k);a.context.beginPath();a.context.moveTo(b,c);a.context.lineTo(d,e);a.context.lineTo(f,g);a.context.closePath();a.context.stroke()}function trianglefill(a,b,c,d,e,f,g,h){_fillstyle(a,h);a.context.beginPath();a.context.moveTo(b,c);a.context.lineTo(d,e);a.context.lineTo(f,g);a.context.closePath();a.context.fill()}
function polygon(a,b,c,d,e){_strokestyle(a,d,e);a.context.beginPath();for(d=0;d<b;d++)d?a.context.lineTo(c[2*d],c[2*d+1]):a.context.moveTo(c[2*d],c[2*d+1]);a.context.closePath();a.context.stroke()}function polygonfill(a,b,c,d){_fillstyle(a,d);a.context.beginPath();for(d=0;d<b;d++)d?a.context.lineTo(c[2*d],c[2*d+1]):a.context.moveTo(c[2*d],c[2*d+1]);a.context.closePath();a.context.fill()}function rect(a,b,c,d,e,f,g){_strokestyle(a,f,g);a.context.strokeRect(b,c,d,e)}
function rectfill(a,b,c,d,e,f){_fillstyle(a,f);a.context.fillRect(b,c,d,e)}function circle(a,b,c,d,e,f){_strokestyle(a,e,f);a.context.beginPath();a.context.arc(b,c,d,0,PI2);a.context.stroke()}function circlefill(a,b,c,d,e){_fillstyle(a,e);a.context.beginPath();a.context.arc(b,c,d,0,PI2);a.context.fill()}function arc(a,b,c,d,e,f,g,h){_strokestyle(a,g,h);a.context.beginPath();a.context.arc(b,c,f,RAD(d),RAD(e));a.context.stroke()}
function arcfill(a,b,c,d,e,f,g){_fillstyle(a,g);a.context.beginPath();a.context.arc(b,c,f,RAD(d),RAD(e));a.context.fill()}function draw_sprite(a,b,c,d){a.context.drawImage(b.canvas,c-b.w/2,d-b.h/2)}function scaled_sprite(a,b,c,d,e,f){f="undefined"!==typeof f?f:e;var g=e*b.w/2,h=f*b.h/2;a.context.save();a.context.translate(c-g,d-h);a.context.scale(e,f);a.context.drawImage(b.canvas,0,0);a.context.restore()}
function rotate_sprite(a,b,c,d,e){var f=b.w/2,g=b.h/2;a.context.save();a.context.translate(c,d);a.context.rotate(RAD(e));a.context.translate(-f,-g);a.context.drawImage(b.canvas,0,0);a.context.restore()}function pivot_sprite(a,b,c,d,e,f,g){a.context.save();a.context.translate(c,d);a.context.rotate(RAD(g));a.context.translate(-e,-f);a.context.drawImage(b.canvas,0,0);a.context.restore()}
function rotate_scaled_sprite(a,b,c,d,e,f,g){g="undefined"!==typeof g?g:f;var h=f*b.w/2,k=g*b.h/2;a.context.save();a.context.translate(c,d);a.context.rotate(RAD(e));a.context.translate(-h,-k);a.context.scale(f,g);a.context.drawImage(b.canvas,0,0);a.context.restore()}
function pivot_scaled_sprite(a,b,c,d,e,f,g,h,k){k="undefined"!==typeof k?k:h;e*=h;f*=k;a.context.save();a.context.translate(c,d);a.context.rotate(RAD(g));a.context.translate(-e,-f);a.context.scale(h,k);a.context.drawImage(b.canvas,0,0);a.context.restore()}function blit(a,b,c,d,e,f,g,h){b.context.drawImage(a.canvas,c,d,g,h,e,f,g,h)}function simple_blit(a,b,c,d){b.context.drawImage(a.canvas,c,d)}function stretch_blit(a,b,c,d,e,f,g,h,k,p){b.context.drawImage(a.canvas,c,d,e,f,g,h,k,p)}
var _cartoon_woff="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",
_num_fonts=0;function FONT_OBJECT(a,b,c,d){}function load_base64_font(a){var b=document.createElement("style"),c="font"+_num_fonts++;b.id=c;b.type="text/css";document.head.appendChild(b);b.textContent="@font-face { font-family: "+c+"; src:url('data:application/font-woff;base64,"+a+"') format('woff');}";return{element:b,file:"",name:c,type:"fnt"}}
function load_font(a){var b=document.createElement("style"),c="font"+_num_fonts++;b.id=c;b.type="text/css";document.head.appendChild(b);b.textContent="@font-face { font-family: "+c+"; src:url('"+a+"');}";return{element:b,file:a,name:c,type:"fnt"}}function create_font(a){return{element:null,file:"",name:a,type:"fnt"}}
function textout(a,b,c,d,e,f,g,h,k){a.context.font=f.toFixed()+"px "+b.name;a.context.textAlign="left";_fillstyle(a,g);a.context.fillText(c,d,e);h&&(_strokestyle(a,h,k),a.context.strokeText(c,d,e))}function textout_centre(a,b,c,d,e,f,g,h,k){a.context.font=f.toFixed()+"px "+b.name;a.context.textAlign="center";_fillstyle(a,g);a.context.fillText(c,d,e);h&&(_strokestyle(a,h,k),a.context.strokeText(c,d,e))}
function textout_right(a,b,c,d,e,f,g,h,k){a.context.font=f.toFixed()+"px "+b.name;a.context.textAlign="right";_fillstyle(a,g);a.context.fillText(c,d,e);h&&(_strokestyle(a,h,k),a.context.strokeText(c,d,e))}var _volume=1,_samples=[];function SAMPLE_OBJECT(a,b,c,d,e){}function install_sound(){}function set_volume(a){_volume=a;for(a=0;a<_samples.length;a++)_samples[a].element.volume=_samples[a].volume*_volume}function get_volume(){return _volume}
function load_sample(a){var b=document.createElement("audio");b.src=a;var c={element:b,file:a,volume:1,ready:!1,type:"snd"};_downloadables.push(c);_samples.push(c);log("Loading sample "+a+"...");b.onloadeddata=function(){c.ready||(c.ready=!0,log("Sample "+a+" loaded!"))};return c}function destroy_sample(a){}function play_sample(a,b,c,d){b="undefined"!==typeof b?b:1;adjust_sample(a,b,"undefined"!==typeof c?b:1,"undefined"!==typeof d?d:!1);a.element.currentTime=0;a.element.play()}
function adjust_sample(a,b,c,d){a.volume=b;a.element.volume=a.volume*_volume;a.element.loop=d;a.element.playbackRate=c}function stop_sample(a){a.element.pause();a.element.currentTime=0}function pause_sample(a){a.element.pause()}function rand(){return Math.floor(65536*Math.random())}function rand32(){return rand()|rand()<<16}function frand(){return Math.random()}function abs(a){return 0>a?-a:a}function length(a,b){return Math.sqrt(a*a+b*b)}
function distance(a,b,c,d){return Math.sqrt((c-a)*(c-a)+(d-b)*(d-b))}function distance2(a,b,c,d){return(c-a)*(c-a)+(d-b)*(d-b)}function linedist(a,b,c,d,e,f){c-=a;d-=b;var g=((e-a)*c+(f-b)*d)/(c*c+d*d);1<g?g=1:0>g&&(g=0);a=a+g*c-e;b=b+g*d-f;return Math.sqrt(a*a+b*b)}function lerp(a,b,c){return a+(b-a)*c}function dot(a,b,c,d){return a*c+b*d}function sgn(a){return 0>a?-1:0<a?1:0}function angle(a,b,c,d){a=DEG(Math.atan2(d-b,c-a));return 0>a?a+360:a}
function anglediff(a,b){var c;c=(b-a)/360;c=360*(c-floor(c));180<c&&(c-=360);return c}function clamp(a,b,c){return c>b?a<b?b:a>c?c:a:a<c?c:a>b?b:a}function scale(a,b,c,d,e){return d+(a-b)/(c-b)*(e-d)}function scaleclamp(a,b,c,d,e){a=d+(a-b)/(c-b)*(e-d);if(e>d)return a=a<e?a:e,a>d?a:d;a=a<d?a:d;return a>e?a:e}var _debug_enabled=!1,_debug_element,ALLEGRO_CONSOLE=!1;function _error(a){log("[ERROR] "+a)}
function _onerror(a){var b=a.filename.split("/");b.reverse();log("["+b[0]+":"+a.lineno+":"+a.colno+"] "+a.message)}function enable_debug(a){_debug_element=document.getElementById(a);window.addEventListener("error",_onerror);_debug_element&&(_debug_enabled=!0)}function log(a){ALLEGRO_CONSOLE&&console&&console.log(a);_debug_enabled&&(_debug_element.innerHTML=_debug_element.innerHTML+a+"<br/>")}function wipe_log(){_debug_enabled&&(_debug_element.innerHTML="")};