'use strict' var sqmod_test = function(sq_node){ var that = this; var index_node = new vus.node('index'); var j_index_page = $('#index_page'); sq_node.url_chg = function(direct,url_upart,url_dpart,param){ if(direct == 'in'){ if(url_dpart.length == 0){ com.url_update('/toj/' + url_upart.join('/') + '/index/'); return 'stop'; } } return 'cont'; } index_node.url_chg = function(direct,url_upart,url_dpart,param){ if(direct == 'in'){ com.loadpage('/toj/sqmod/sqmod_test/html/index.html').done(function(){ run(); }); } return 'cont'; }; sq_node.child_set(index_node); that.unload = function(){ }; var keymap = {'4':[0,0],'5':[0,1],'6':[0,2],'7':[0,3], 'R':[1,0],'T':[1,1],'Y':[1,2],'U':[1,3], 'F':[2,0],'G':[2,1],'H':[2,2],'J':[2,3], 'V':[3,0],'B':[3,1],'N':[3,2],'M':[3,3]}; var expfunc = new Object(); var j_stage_bottom; var j_stage; var j_stage_top; var j_butts; var ctx_bottom; var ctx; var ctx_top; var eng_bottom; var eng; var eng_top; var audio_ctx; var g_out; var curr_src = null; var mouse_pos = null; var butts; var update_top_reen = false; var imgmap = new Object(); var audiomap = new Object(); var param_auto = false; function load_image(filename){ var defer = $.Deferred(); var image; if((image = imgmap[filename]) != undefined){ defer.resolve(image) } image = new Image(); image.onload = function(){ imgmap[filename] = image; defer.resolve(image); } image.src = '/toj/sqmod/sqmod_test/html/' + filename; return defer.promise(); } function load_audio(filename){ var defer = $.Deferred(); var buffer; var xhr; if((buffer = audiomap[filename]) != undefined){ defer.resolve(buffer); } xhr = new XMLHttpRequest(); xhr.open('GET','/toj/sqmod/sqmod_test/html/' + filename,true); xhr.responseType = 'arraybuffer'; xhr.onload = function(){ audio_ctx.decodeAudioData(xhr.response,function(buffer){ audiomap[filename] = buffer; defer.resolve(buffer); }); } xhr.send(); return defer.promise(); } function audio_play(buffer,ds){ var src = audio_ctx.createBufferSource(); var delay = audio_ctx.createDelay(10); var proc = audio_ctx.createScriptProcessor(16384,1,1); if(typeof(buffer) == 'string'){ buffer = audiomap[buffer]; } if(curr_src != null){ curr_src.stop(0); } src.buffer = buffer; src.connect(proc); proc.onaudioprocess = function(e){ console.log(e.inputBuffer.duration); src.disconnect(0); src.connect(g_out); proc.disconnect(0); console.log(new Date().getTime()); expfunc.test(); } proc.connect(g_out); if(ds != undefined){ //delay.delayTime.value = ds; //delay.connect(g_out); //src.connect(delay); }else{ //src.connect(g_out); } src.start(0); curr_src = src; } function run(){ var i; var j; var j_div; var j_box; var j_fps; var st; function _scale(){ var i; var j; var w; var h; var sw; var sh; var ratio; w = j_div.width(); h = j_div.height(); if(w * 3 >= h * 4){ sw = h * 4 / 3; sh = h; }else{ sw = w; sh = w * 3 / 4; } ratio = sw / 1920; for(i = 0;i < 4;i++){ for(j = 0;j < 4;j++){ j_butts[i][j].css('top',(32 + i * 352) * ratio); j_butts[i][j].css('left',(272 + j * 352) * ratio); j_butts[i][j].width(320 * ratio); j_butts[i][j].height(320 * ratio); } } j_box.width(sw); j_box.height(sh); j_stage_bottom.attr('width',sw); j_stage_bottom.attr('height',sh); j_stage.attr('width',sw); j_stage.attr('height',sh); j_stage_top.attr('width',sw); j_stage_top.attr('height',sh); ctx_bottom.scale(sw / 1920,sh / 1440); ctx.scale(sw / 1920,sh / 1440); ctx_top.scale(sw / 1920,sh / 1440); } function _audio(){ window.AudioContext = window.AudioContext || window.webkitAudioContext; audio_ctx = new AudioContext(); g_out = audio_ctx.createGain(); g_out.connect(audio_ctx.destination); g_out.gain.value = 0.2; } function _update(){ var et = new Date().getTime(); var fps = Math.floor(1 / (et - st) * 1000); st = et; j_fps.text(fps); if(fps < 40){ console.log(fps); } window.requestAnimationFrame(_update); eng_bottom.update(); eng.update(); eng_top.update(); } $(window).on('resize',function(e){ _scale(); update_top(); }); $(window).on('keydown',function(e){ var chr = String.fromCharCode(e.keyCode); var pos; if((pos = keymap[chr]) != undefined){ update_butt(pos[0],pos[1],true); }else if(chr == 'Z' || chr == 'X'){ if(mouse_pos != null){ update_butt(mouse_pos[0],mouse_pos[1],true); } }else if(chr == 'A'){ param_auto ^= true; } }); $(window).on('keyup',function(e){ var chr = String.fromCharCode(e.keyCode); var pos; if((pos = keymap[chr]) != undefined){ update_butt(pos[0],pos[1],false); }else if(chr == 'Z' || chr == 'X'){ if(mouse_pos != null){ update_butt(mouse_pos[0],mouse_pos[1],false); } } }); j_div = j_index_page.find('div.stage'); j_box = j_div.find('div.box'); j_fps = j_box.find('span.fps'); j_stage_bottom = j_box.find('canvas.bottom'); j_stage = j_box.find('canvas.main'); j_stage_top = j_box.find('canvas.top'); ctx_bottom = j_stage_bottom[0].getContext('2d'); ctx = j_stage[0].getContext('2d'); ctx_top = j_stage_top[0].getContext('2d'); j_butts = new Array(3); butts = new Array(3); for(i = 0;i < 4;i++){ j_butts[i] = new Array(3); butts[i] = new Array(3); for(j = 0;j < 4;j++){ butts[i][j] = new Object(); butts[i][j].x = 272 + (j * 352); butts[i][j].y = 32 + (i * 352); butts[i][j].touch = false; j_butts[i][j] = $('
') j_butts[i][j].data('row',i); j_butts[i][j].data('col',j); j_butts[i][j].on('mousedown',function(e){ var j_this = $(this); var row; var col; row = j_this.data('row'); col = j_this.data('col'); update_butt(row,col,true); }); j_butts[i][j].on('mouseup',function(e){ var j_this = $(this); var row; var col; row = j_this.data('row'); col = j_this.data('col'); update_butt(row,col,false); }); j_butts[i][j].on('mouseover',function(e){ var j_this = $(this); var row; var col; row = j_this.data('row'); col = j_this.data('col'); mouse_pos = [row,col]; }); j_butts[i][j].on('mouseout',function(e){ var j_this = $(this); var row; var col; row = j_this.data('row'); col = j_this.data('col'); mouse_pos = null; update_butt(row,col,false); }); j_box.append(j_butts[i][j]); } } _scale(); _audio(); expfunc.audio_play = audio_play; eng_bottom = new engine(ctx_bottom,expfunc); eng = new engine(ctx,expfunc); eng_top = new engine(ctx_top,expfunc); ctx.fillStyle = '#1C1C1C'; ctx.font = '100px Saucer-Regular'; ctx.fillText('LOADING...',272 + 352 + 32,272 + 353 + 32); $.when(preload()).done(function(){ update_top(); window.requestAnimationFrame(_update); play(); }) /*setTimeout(function(){ _audio(); _audio_play(ab_select); st = new Date().getTime(); window.requestAnimationFrame(_ani); },2000);*/ } function preload(){ return $.when( load_image('door_blue.png'), load_image('wave1.png'), load_image('wave2.png'), load_image('top.png'), load_image('light.png'), load_audio('select.ogg'), load_audio('result.ogg') ); } function update_butt(row,col,touch){ if(butts[row][col].touch != touch){ butts[row][col].touch = touch; update_top(); } } function update_top(){ var i_top = imgmap['top.png']; var i_light = imgmap['light.png']; if(update_top_reen == true){ return; } update_top_reen = true; eng_top.add_draw(0,function(ctx){ var i; var j; for(i = 0;i < 4;i++){ for(j = 0;j < 4;j++){ if(butts[i][j].touch == true){ ctx.drawImage(i_light,butts[i][j].x,butts[i][j].y); } } } ctx.drawImage(i_top,0,0); update_top_reen = false; }); } function back(){ var i_wave1 = imgmap['wave1.png']; var i_wave2 = imgmap['wave2.png']; var wave1_off = 0; var wave2_off = -1920; function _wave(){ wave1_off -= 4; if(wave1_off < -i_wave1.width){ wave1_off = -(wave1_off + i_wave1.width); } wave2_off -= 3; if(wave2_off < -i_wave1.width){ wave2_off = -(wave2_off + i_wave1.width); } eng_bottom.add_draw(0,function(ctx){ ctx.drawImage(i_wave1,wave1_off,1440 - i_wave1.height); ctx.drawImage(i_wave1,wave1_off + i_wave1.width,1440 - i_wave1.height); ctx.drawImage(i_wave1,wave2_off,1440 - i_wave1.height); ctx.drawImage(i_wave1,wave2_off + i_wave1.width,1440 - i_wave1.height); }); eng_bottom.add_work(_wave); } eng_bottom.add_work(_wave); } function play(){ var defer = $.Deferred(); var end = false; var i_marks = new Array(); var timemap = new Array(); var st = null; var curr = 0; var poslist = new Array(); var note_score; var last_touch; var curr_combo = 0; var score = { 'score':0, 'perfect':0, 'great':0, 'good':0, 'bad':0, 'miss':0, 'max_combo':0, 'total_note':0 }; function _judge(time){ var ret; time = Math.abs(time); if(time > 500){ score.miss += 1; ret = 4; }else if(time > 200){ score.bad += 1; score.score += note_score * 0.1; ret = 3; }else if(time > 100){ score.good += 1; score.score += note_score * 0.4; ret = 2; }else if(time > 50){ score.great += 1; score.score += note_score * 0.7; ret = 1; }else{ score.perfect += 1; score.score += note_score; ret = 0; } if(ret <= 2){ curr_combo += 1; score.max_combo = Math.max(score.max_combo,curr_combo); }else{ curr_combo = 0; } return ret; } function _draw(ctx){ var i; var j; var pos; var row; var col; var time; function __drawmark(ctx,x,y,time){ var image = i_marks[Math.floor(time / 36.36364)]; ctx.drawImage(image,x + 8,y + 8,304,304); } for(i = 0;i < poslist.length;i++){ pos = poslist[i]; time = (eng.ts - st) - pos.time; if(time >= -509 && time < 291){ row = pos.pos[0]; col = pos.pos[1]; __drawmark(ctx,butts[row][col].x,butts[row][col].y,time + 509); } } } function _update(){ var i; var j; var ct; var map; var poss; var pos; var row; var col; var time; var next_poslist; ct = eng.ts - st; if(curr == timemap.length){ if((ct - timemap[curr - 1].time) > 3000){ end = true; j_stage_bottom.css('background-color','transparent'); result(score); return; } }else{ map = timemap[curr]; if((ct + 509) >= map.time){ poss = map.pos; for(i = 0;i < poss.length;i++){ poslist.push({'judge':-1,'time':map.time,'pos':poss[i]}); } curr +=1; } } next_poslist = new Array(); for(i = 0;i < poslist.length;i++){ pos = poslist[i]; time = ct - pos.time; if(time >= 500){ if(pos.judge == -1){ pos.judge = _judge(time); } continue; } row = pos.pos[0]; col = pos.pos[1]; if(param_auto == true){ if(time > - 40 && time < 0){ update_butt(row,col,true); }else if(time > 40 && time < 100){ update_butt(row,col,false); } } if(butts[row][col].touch == true && last_touch[row][col] == false){ pos.judge = _judge(time); } next_poslist.push(pos); } poslist = next_poslist; for(i = 0;i < 4;i++){ for(j = 0;j < 4;j++){ last_touch[i][j] = butts[i][j].touch; } } eng.add_draw(10,_draw); eng.add_work(_update); } function _combo(){ var last_combo = curr_combo; var ani_st = -1; var m_combo; function __draw(ctx){ var m; var move = 0; if(ani_st != -1){ if((move = eng.beat_ease(150,10,eng.ts - ani_st)) == null){ ani_st = -1; }else{ ctx.transform(1,0,0,1,0,-move); } } ctx.fillStyle = '#D9D9D9'; ctx.font = '300px Saucer-Mono'; m = ctx.measureText(curr_combo); ctx.fillText(curr_combo,272 + 352 * 3 - 64 - m.width,32 + 352 * 2 - 64); ctx.font = '60px Saucer-Mono'; ctx.fillText('combo',272 + 352 * 3 - 64 - m_combo.width,32 + 352 * 2 + 64); last_combo = curr_combo; } function __update(){ if(end == true){ return; } if(curr_combo > 0 || ani_st != -1){ if(curr_combo != last_combo && ani_st == -1){ ani_st = eng.ts; } eng.add_draw(0,__draw); } eng.add_work(__update); } ctx.font = '60px Saucer-Mono'; m_combo = ctx.measureText('combo') eng.add_work(__update); } function _score(){ var m_otua; var i_door = imgmap['door_blue.png']; function __draw(){ var text; var m; if(end == true){ return; } var ratio = score.max_combo / score.total_note; var move = eng.beat_ease(307,40,(eng.ts - st) % 307); var dw = 3840 * ratio + move; var dh = 2880 * ratio + move; ctx.drawImage(i_door,-dw / 2,-dh / 2,1920 + dw,1440 + dh); ctx.fillStyle='rgba(0,0,0,' + (0.9 - (0.7 * ratio)) + ')'; ctx.fillRect(0,0,1920,1440); text = Math.ceil(score.score).toString(); ctx.fillStyle = '#D9D9D9'; ctx.font = '100px Saucer-Mono'; m = ctx.measureText(text); ctx.fillText(text,272 + 352 * 3 - 64 - m.width,32 + 352 - 64); if(param_auto == true){ ctx.font = '60px Saucer-Mono'; ctx.fillText('Player: OTUA',272 + 352 * 3 - 64 - m_otua.width,32 + 352 * 3 + 64); } eng.add_draw(0,__draw); } ctx.font = '60px Saucer-Mono'; m_otua = ctx.measureText('Player: OTUA'); eng.add_draw(0,__draw); } /* expfunc.play_draw = function(ctx,x,y,time){ var image = i_marks[Math.floor(time / 36.36364)]; ctx.drawImage(image,x + 8,y + 8,304,304); };*/ expfunc.play_draw = function(ctx,poslist,ct){ var i; var pos; var row; var col; var time; function __drawmark(x,y,time){ var image = i_marks[Math.floor(time / 36.36364)]; ctx.drawImage(image,x + 8,y + 8,304,304); } for(i = 0;i < poslist.length;i++){ pos = poslist[i]; time = ct - pos.time; if(time >= -509 && time < 327){ row = pos.pos[0]; col = pos.pos[1]; __drawmark(butts[row][col].x,butts[row][col].y,time + 509); } } } expfunc.test = function(){ st = eng.ts; console.log(new Date().getTime()); eng.add_work(_update); _combo(); _score(); }; $.get('/toj/sqmod/sqmod_test/html/JOMANDA.ju',function(data){ var i; var j; var k; var lines; var line; var parts; var tpb; var lbeat; var beat; var map; var ltime; var time; var pos; var total_note; var defers = new Array(); lines = data.split('\n'); //Find start for(i = 0;i < lines.length;i++){ line = lines[i]; if(line == '#start#'){ i++; break; } } //Read beatmap tpb = 0; lbeat = 0; ltime = 200; total_note = 0; for(;i < lines.length;i++){ if((line = lines[i]) == ''){ continue; } parts = line.split(' '); beat = parts[0]; time = ltime + (beat - lbeat) * tpb / 1000; if(parts[1].charAt(0) == 't'){ tpb = 60000 / parseInt(parts[1].split('=')[1]); }else{ map = parseInt(parts[1]); pos = new Array(); for(j = 0;j < 4;j++){ for(k = 0;k < 4;k++){ if((map & 1) == 1){ pos.push([j,k]); total_note += 1; } map = map >> 1; } } timemap.push({'time':time,'pos':pos}); } lbeat = beat; ltime = time; } note_score = 900000 / total_note; score.total_note = total_note; if(timemap.length == 0){ return; } last_touch = new Array(4); for(i = 0;i < 4;i++){ last_touch[i] = new Array(4); for(j = 0;j < 4;j++){ last_touch[i][j] = butts[i][j].touch; } } j_stage_bottom.css('background-color','#1C1C1C'); defers.push(load_audio('JOMANDA.ogg')); for(i = 0;i < 22;i++){ defers.push(load_image('mark/mal_' + i + '.png')); } //defers.push(load_image('mark/clearmark.png')); $.when.apply($,defers).done(function(ab_song){ var i; for(i = 0;i < 22;i++){ i_marks[i] = arguments[i + 1]; } defer.resolve(); //Start console.log(ab_song.sampleRate); console.log(ab_song.length); audio_play(ab_song); }); }); return defer.promise(); } expfunc.result_draw = function(ctx,offx,offy,score){ ctx.font = '150px Saucer-Regular'; ctx.fillText('Result',offx,offy); ctx.font = '120px Saucer-Regular'; ctx.fillText(score.score,offx,offy + 200); ctx.font = '100px Saucer-Regular'; ctx.fillText('Perfect',offx,offy + 350); ctx.fillText(score.perfect,offx + 600,offy + 350); ctx.fillText('Great',offx,offy + 450); ctx.fillText(score.great,offx + 600,offy + 450); ctx.fillText('Good',offx,offy + 550); ctx.fillText(score.good,offx + 600,offy + 550); ctx.fillText('Bad',offx,offy + 650); ctx.fillText(score.bad,offx + 600,offy + 650); ctx.fillText('Miss',offx,offy + 750); ctx.fillText(score.miss,offx + 600,offy + 750); ctx.fillText('Max Combo',offx,offy + 900); ctx.fillText(score.max_combo,offx + 600,offy + 900); }; function result(score){ var offx = 272 + 352 + 32; var offy = 32 + 256; function _draw(ctx){ if(score.max_combo == score.total_note){ ctx.fillStyle = "#F9BF45"; ctx.font = '130px Saucer-Regular'; ctx.fillText('FULL COMBO',offx + 32,offy + 72); ctx.fillStyle = '#1C1C1C'; } ctx.font = '150px Saucer-Regular'; ctx.fillText('Result',offx,offy); ctx.font = '120px Saucer-Regular'; ctx.fillText(score.score,offx,offy + 200); ctx.font = '100px Saucer-Regular'; ctx.fillText('Perfect',offx,offy + 350); ctx.fillText(score.perfect,offx + 600,offy + 350); ctx.fillText('Great',offx,offy + 450); ctx.fillText(score.great,offx + 600,offy + 450); ctx.fillText('Good',offx,offy + 550); ctx.fillText(score.good,offx + 600,offy + 550); ctx.fillText('Bad',offx,offy + 650); ctx.fillText(score.bad,offx + 600,offy + 650); ctx.fillText('Miss',offx,offy + 750); ctx.fillText(score.miss,offx + 600,offy + 750); ctx.fillText('Max Combo',offx,offy + 900); ctx.fillText(score.max_combo,offx + 600,offy + 900); } function _update(){ eng.add_draw(0,_draw); eng.add_work(_update); } score.score = Math.ceil(score.score); audio_play('result.ogg'); eng.add_work(_update); back(); } /* function test(){ var i; var j; var st; var j_div; var j_box; var j_fps; var j_stage_bottom; var j_stage; var j_stage_top; var ctx_bottom; var eng_bottom; var ctx; var eng; var ctx_top; var eng_top; var audio; var ab_select; var ab_song2; var ab_song3; var ab_song4; var i_top = new Image(); var i_light = new Image(); var i_wave1 = new Image(); var i_cover2 = new Image(); var i_cover3 = new Image(); var i_cover4 = new Image(); var i_marks = new Array(); function _load(){ var i; var image; i_top.src = '/toj/sqmod/sqmod_test/html/top.png'; i_light.src = '/toj/sqmod/sqmod_test/html/light.png'; i_wave1.src = '/toj/sqmod/sqmod_test/html/wave1.png'; i_cover2.src = '/toj/sqmod/sqmod_test/html/IMSOHAPPY.jpg'; i_cover3.src = '/toj/sqmod/sqmod_test/html/JOMANDA.jpg'; i_cover4.src = '/toj/sqmod/sqmod_test/html/MOTHERSHIP.png'; for(i = 0;i < 15;i++){ image = new Image(); image.src = '/toj/sqmod/sqmod_test/html/mark/mal_' + i + '.png'; i_marks.push(image); } for(i = 0;i < 7;i++){ image = new Image(); image.src = '/toj/sqmod/sqmod_test/html/mark/malpassed_' + i + '.png'; i_marks.push(image); } _load_audio('select.ogg',function(buffer){ ab_select = buffer; }); _load_audio('IMSOHAPPY.ogg',function(buffer){ ab_song2 = buffer; }); _load_audio('JOMANDA.ogg',function(buffer){ ab_song3 = buffer; }); _load_audio('MOTHERSHIP.ogg',function(buffer){ ab_song4 = buffer; }); } function _pro(){ var curr_song = null; var start_cd = null; function __draw(){ eng.add_draw(function(ctx){ var title; function _draw_pro(i,j,title,cover){ var x,y; x = butts[i][j].x; y = butts[i][j].y; if(cover != undefined){ ctx.drawImage(cover,x + 8,y + 8,304,304); }else{ ctx.fillStyle = '#1C1C1C'; ctx.font = '40px Saucer-Bold'; ctx.fillText(title,x + 32,y + 290); } } _draw_pro(0,0,'A+B Problem'); _draw_pro(0,1,'I\'m so happy',i_cover2); _draw_pro(0,2,'JOMANDA',i_cover3); _draw_pro(0,3,'Mother Ship',i_cover4); ctx.fillStyle = '#1C1C1C'; ctx.font = '60px Saucer-Regular'; if(curr_song != null){ if(start_cd == null){ start_cd = eng.ts; } ctx.fillText('BACK',1002,1344); ctx.fillText('START',1360,1344); ctx.font = '48px Saucer-Regular'; ctx.fillText(new Number(60 - ((eng.ts - start_cd) / 1000)).toFixed(2),1360,1244); title = curr_song; }else{ ctx.fillText('PREV',1002,1344); ctx.fillText('NEXT',1360,1344); title = 'SELECT PROBLEM'; } ctx.rotate(Math.PI / 2); ctx.font = '100px Saucer-Regular'; ctx.fillText(title,32,-100); }); eng.add_work(__draw); } butts[0][1].on('click',function(e){ _audio_play(ab_song2); curr_song = 'I\'m so happy'; }); butts[0][2].on('click',function(e){ _audio_play(ab_song3); curr_song = 'JOMANDA'; }); butts[0][3].on('click',function(e){ _audio_play(ab_song4); curr_song = 'Mother Ship'; }); butts[3][2].on('click',function(e){ if(curr_song != null){ _audio_play(ab_select); start_cd = null; curr_song = null; } }); butts[3][3].on('click',function(e){ _test(); }); __draw(); } function _test(){ function _ani(){ var et = new Date().getTime(); j_fps.text(Math.floor(1 / (et - st) * 1000)); st = et; window.requestAnimationFrame(_ani); eng_bottom.update(); eng.update(); eng_top.update(); } }*/ }; var engine = function(ctx,expfunc){ var that = this; var workq = new Array(); var drawq = new Array(); var st = null; //var worker = new Worker('/toj/sqmod/sqmod_test/js/worker.js'); that.ts = new Date().getTime(); /*worker.onmessage = function(e){ var data = e.data; if(data.type == 0){ console.log(data.data); }else if(data.type == 2){ data.param[0] = ctx; drawq.push(data); }else if(data.type == 3){ expfunc[data.func].apply(null,data.param); } }*/ that.add_work = function(work){ workq.push({'work':work}); }; that.run_back = function(funcname){ var i; var param = new Array(); for(i = 1;i < arguments.length;i++){ param.push(arguments[i]); } worker.postMessage({'type':1,'ts':that.ts,'func':funcname,'param':param}); }; that.add_draw = function(z,draw){ if(z == undefined){ z = 0; } drawq.push({'z':z,'draw':draw}); }; that.update = function(){ var i; var worktq; var drawtq; that.ts = new Date().getTime() - st; //worker.postMessage({'type':0,'ts':that.ts}); if(workq.length > 0){ worktq = workq.slice(0); workq = new Array(); for(i = 0;i < worktq.length;i++){ worktq[i].work(); } } if(drawq.length > 0){ ctx.clearRect(0,0,1920,1440); drawtq = drawq.slice(0); drawq = new Array(); drawtq.sort(function(a,b){ return a.z - b.z; }); for(i = 0;i < drawtq.length;i++){ ctx.save(); if(drawtq[i].func == undefined){ drawtq[i].draw(ctx); }else{ expfunc[drawtq[i].func].apply(null,drawtq[i].param); } ctx.restore(); } } }; that.beat_ease = function(dur,max,off){ if(off > dur){ return null; } if(off * 2 < dur){ return max * (off * 2 / dur); }else{ return max * (2 - off * 2 / dur); } } };