aboutsummaryrefslogtreecommitdiffstats
path: root/src/sqmod/sqmod_test/js/sqmod_test.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/sqmod/sqmod_test/js/sqmod_test.js')
-rw-r--r--src/sqmod/sqmod_test/js/sqmod_test.js730
1 files changed, 730 insertions, 0 deletions
diff --git a/src/sqmod/sqmod_test/js/sqmod_test.js b/src/sqmod/sqmod_test/js/sqmod_test.js
new file mode 100644
index 0000000..cf95ca9
--- /dev/null
+++ b/src/sqmod/sqmod_test/js/sqmod_test.js
@@ -0,0 +1,730 @@
+'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(){
+ test();
+ });
+ }
+
+ return 'cont';
+ };
+ sq_node.child_set(index_node);
+
+ that.unload = function(){
+
+ };
+
+
+
+
+ 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 butts;
+ 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 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;
+
+ function _load_audio(filename,callback){
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET','/toj/sqmod/sqmod_test/html/' + filename,true);
+ xhr.responseType = 'arraybuffer';
+ xhr.onload = function(){
+ audio.decodeAudioData(xhr.response,callback);
+ }
+ xhr.send();
+ }
+
+ 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);
+ }
+
+ window.AudioContext = window.AudioContext || window.webkitAudioContext;
+
+ audio = new AudioContext();
+
+ _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 _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++){
+ butts[i][j].css('top',(32 + i * 352) * ratio);
+ butts[i][j].css('left',(272 + j * 352) * ratio);
+ butts[i][j].width(320 * ratio);
+ 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);
+ }
+
+ 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(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);
+ }
+
+ var lights;
+ function _top(){
+ eng_top.add_draw(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);
+ });
+ eng_top.add_work(_top);
+ }
+
+ 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(){
+ var timemap = new Array();
+ var st = null;
+ var curr = 0;
+ var poslist = new Array();
+ var last_touch;
+
+ var curr_combo = 0;
+ var score = {
+ 'perfect':0,
+ 'great':0,
+ 'good':0,
+ 'badd':0,
+ 'miss':0,
+ 'max_combo':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;
+ ret = 3;
+ }else if(time > 100){
+ score.good += 1;
+ ret = 2;
+ }else if(time > 50){
+ score.great += 1;
+ ret = 1;
+ }else{
+ score.perfect += 1;
+ ret = 0;
+ }
+
+ if(ret <= 4){
+ curr_combo += 1;
+ score.max_combo = Math.max(score.max_combo,curr_combo);
+ }else{
+ curr_combo = 0;
+ }
+
+ return ret;
+ }
+ function __play(){
+ 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;
+
+ 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;
+ if(curr >= timemap.length){
+ return;
+ }
+ }
+
+ 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;
+ }
+
+ if(Math.abs(time) < 50 && pos.judge == -1){
+ pos.judge = __judge(time);
+ }
+
+ row = pos.pos[0];
+ col = pos.pos[1];
+ 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_work(__play);
+ }
+ function __drawmark(ctx,x,y,time){
+ var image = i_marks[Math.floor(time / 36.36364)];
+ ctx.drawImage(image,x + 8,y + 8,304,304);
+ }
+ function __draw(ctx){
+ var i;
+ var j;
+ var pos;
+ var row;
+ var col;
+ var time;
+
+ ctx.fillStyle = '#C3C3C3';
+ 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);
+ }
+ }
+ eng.add_draw(__draw,10);
+ }
+
+ function __combo(){
+ var last_combo = curr_combo;
+ var ani_st = -1;
+
+ function ___draw(ctx){
+ var m;
+ var move = 0;
+
+ if(curr_combo != last_combo && ani_st == -1){
+ ani_st = eng.ts;
+ }
+
+ 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';
+ m = ctx.measureText('combo');
+ ctx.fillText('combo',272 + 352 * 3 - 64 - m.width,32 + 352 * 2 + 64);
+
+ last_combo = curr_combo;
+
+ eng.add_draw(___draw,0);
+ }
+
+ eng.add_draw(___draw,0);
+ }
+
+ $.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;
+
+ 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 = 570;
+ 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]);
+ }
+ map = map >> 1;
+ }
+ }
+
+ timemap.push({'time':time,'pos':pos});
+ }
+
+ lbeat = beat;
+ ltime = time;
+ }
+
+ 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');
+
+ st = eng.ts;
+ _audio_play(ab_song3,1);
+ eng.add_work(__play);
+ eng.add_draw(__draw,10);
+ __combo();
+ });
+ }
+
+ 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 g_out;
+ function _audio(){
+ g_out = audio.createGain();
+ g_out.connect(audio.destination);
+ g_out.gain.value = 0.2;
+ }
+ var curr_src = null;
+ function _audio_play(buffer,delay){
+ var src = audio.createBufferSource();
+ var delay = audio.createDelay();
+
+ if(curr_src != null){
+ curr_src.stop(0);
+ }
+
+
+ src.buffer = buffer;
+ if(delay != undefined){
+ delay.delayTime.value = delay;
+ delay.connect(g_out);
+ src.connect(delay);
+ }else{
+ src.connect(g_out);
+ }
+ src.start(0);
+
+ curr_src = src;
+ }
+
+ $(window).on('resize',function(e){
+ _scale();
+ });
+ $(window).on('keydown',function(e){
+ var chr = String.fromCharCode(e.keyCode);
+ var pos;
+
+ if((pos = keymap[chr]) != undefined){
+ butts[pos[0]][pos[1]].touch = true;
+ }
+ });
+ $(window).on('keyup',function(e){
+ var chr = String.fromCharCode(e.keyCode);
+ var pos;
+
+ if((pos = keymap[chr]) != undefined){
+ butts[pos[0]][pos[1]].touch = 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');
+
+ butts = new Array(3);
+ for(i = 0;i < 4;i++){
+ butts[i] = new Array(3);
+ for(j = 0;j < 4;j++){
+ butts[i][j] = $('<div class="butt"></div>')
+ butts[i][j].data('row',i);
+ butts[i][j].data('col',j);
+ butts[i][j].x = 272 + (j * 352);
+ butts[i][j].y = 32 + (i * 352);
+ butts[i][j].touch = false;
+
+ j_box.append(butts[i][j]);
+ }
+ }
+
+ lights = new Array(3);
+ for(i = 0;i < 4;i++){
+ lights[i] = new Array(3);
+ for(j = 0;j < 4;j++){
+ lights[i][j] = 0;
+
+ butts[i][j].on('mousedown',function(e){
+ lights[$(this).data('row')][$(this).data('col')] = 1;
+ });
+ butts[i][j].on('mouseup',function(e){
+ lights[$(this).data('row')][$(this).data('col')] = 0;
+ });
+ }
+ }
+
+ _scale();
+ _load();
+
+ eng_bottom = new engine(ctx_bottom);
+ //eng_bottom.add_work(_wave);
+ eng = new engine(ctx);
+ eng.add_work(_test);
+ eng_top = new engine(ctx_top);
+ eng_top.add_work(_top);
+
+
+ eng_top.update();
+ ctx.fillStyle = '#1C1C1C';
+ ctx.font = '100px Saucer-Regular';
+ ctx.fillText('LOADING...',272 + 352 + 32,272 + 353 + 32);
+
+ setTimeout(function(){
+ _audio();
+ _audio_play(ab_select);
+
+ st = new Date().getTime();
+ window.requestAnimationFrame(_ani);
+ },2000);
+ }
+};
+
+var engine = function(ctx){
+ var that = this;
+ var workq = new Array();
+ var drawq = new Array();
+ var st = null;
+
+ that.ts = new Date().getTime();
+
+ that.add_work = function(work){
+ workq.push({'work':work});
+ };
+ that.add_draw = function(draw,z){
+ 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;
+
+ worktq = workq.slice(0);
+ workq = new Array();
+ for(i = 0;i < worktq.length;i++){
+ worktq[i].work();
+ }
+
+ drawtq = drawq.slice(0);
+ drawq = new Array();
+ drawtq.sort(function(a,b){
+ return a.z - b.z;
+ });
+ if(drawtq.length > 0){
+ ctx.clearRect(0,0,1920,1440);
+ }
+ for(i = 0;i < drawtq.length;i++){
+ ctx.save();
+ drawtq[i].draw(ctx);
+ 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);
+ }
+ }
+};