aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpzread <netfirewall@gmail.com>2013-07-09 02:57:43 +0800
committerpzread <netfirewall@gmail.com>2013-07-09 02:57:43 +0800
commit0d25481f72f12eaf0ccfc3172829f0d138a1143c (patch)
tree517c107aa5c14d1f4952a666d9a1ef217834fd3f
parentecf3bc0ac8021fc872f60fa2ce74a1fcf43bc5d8 (diff)
downloadtaiwan-online-judge-0d25481f72f12eaf0ccfc3172829f0d138a1143c.tar
taiwan-online-judge-0d25481f72f12eaf0ccfc3172829f0d138a1143c.tar.gz
taiwan-online-judge-0d25481f72f12eaf0ccfc3172829f0d138a1143c.tar.bz2
taiwan-online-judge-0d25481f72f12eaf0ccfc3172829f0d138a1143c.tar.lz
taiwan-online-judge-0d25481f72f12eaf0ccfc3172829f0d138a1143c.tar.xz
taiwan-online-judge-0d25481f72f12eaf0ccfc3172829f0d138a1143c.tar.zst
taiwan-online-judge-0d25481f72f12eaf0ccfc3172829f0d138a1143c.zip
Add door
-rw-r--r--src/sqmod/sqmod_test/js/sqmod_test.js1383
1 files changed, 910 insertions, 473 deletions
diff --git a/src/sqmod/sqmod_test/js/sqmod_test.js b/src/sqmod/sqmod_test/js/sqmod_test.js
index cf95ca9..d5e7065 100644
--- a/src/sqmod/sqmod_test/js/sqmod_test.js
+++ b/src/sqmod/sqmod_test/js/sqmod_test.js
@@ -19,7 +19,7 @@ var sqmod_test = function(sq_node){
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();
+ run();
});
}
@@ -34,95 +34,121 @@ var sqmod_test = function(sq_node){
- 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 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 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 j_stage_bottom;
+ var j_stage;
+ var j_stage_top;
+ var j_butts;
- var audio;
- var ab_select;
- var ab_song2;
- var ab_song3;
- var ab_song4;
+ var ctx_bottom;
+ var ctx;
+ var ctx_top;
+ var eng_bottom;
+ var eng;
+ var eng_top;
- 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 audio_ctx;
+ var g_out;
+ var curr_src = null;
- var i_marks = new Array();
+ 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(){
- var i;
- var image;
+ function load_image(filename){
+ var defer = $.Deferred();
+ 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();
- }
+ 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;
- 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';
+ return defer.promise();
+ }
+ function load_audio(filename){
+ var defer = $.Deferred();
+ var buffer;
+ var xhr;
- 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;
+ if((buffer = audiomap[filename]) != undefined){
+ defer.resolve(buffer);
+ }
- 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;
+ 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;
@@ -147,28 +173,234 @@ var sqmod_test = function(sq_node){
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_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] = $('<div class="butt"></div>')
+ 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){
@@ -179,7 +411,7 @@ var sqmod_test = function(sq_node){
wave2_off = -(wave2_off + i_wave1.width);
}
- eng_bottom.add_draw(function(ctx){
+ 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);
@@ -188,26 +420,555 @@ var sqmod_test = function(sq_node){
eng_bottom.add_work(_wave);
}
+
+ eng_bottom.add_work(_wave);
+ }
- var lights;
- function _top(){
- eng_top.add_draw(function(ctx){
- var i;
- var j;
+ 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 < 4;i++){
+ 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++){
- if(butts[i][j].touch == true){
- ctx.drawImage(i_light,butts[i][j].x,butts[i][j].y);
+ 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();
- ctx.drawImage(i_top,0,0);
+ //Start
+ console.log(ab_song.sampleRate);
+ console.log(ab_song.length);
+ audio_play(ab_song);
});
- eng_top.add_work(_top);
+ });
+
+
+
+ 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;
@@ -294,255 +1055,7 @@ var sqmod_test = function(sq_node){
}
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));
@@ -555,134 +1068,48 @@ var sqmod_test = function(sq_node){
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 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.add_draw = function(draw,z){
+ 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;
}
@@ -695,25 +1122,34 @@ var engine = function(ctx){
that.ts = new Date().getTime() - st;
- worktq = workq.slice(0);
- workq = new Array();
- for(i = 0;i < worktq.length;i++){
- worktq[i].work();
+ //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();
+ }
}
- drawtq = drawq.slice(0);
- drawq = new Array();
- drawtq.sort(function(a,b){
- return a.z - b.z;
- });
- if(drawtq.length > 0){
+ 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();
+ }
}
- for(i = 0;i < drawtq.length;i++){
- ctx.save();
- drawtq[i].draw(ctx);
- ctx.restore();
- }
};
that.beat_ease = function(dur,max,off){
@@ -727,4 +1163,5 @@ var engine = function(ctx){
return max * (2 - off * 2 / dur);
}
}
+
};