js13kgames2014-futris/submission/fuTris.js

1 line
5.5 KiB
JavaScript

function shape(a,b){var c=shapes[a];switch(c.length){case 1:return c[0];case 2:return c[b%2];case 4:return c[b]}}function rect(a,b,c,d,e,f){context.fillStyle="#"+f,context.fillRect(a*e,b*e,c*e,d*e)}function draw_shape(a,b,c,d,e){for(var f=0;f<shape(d,e)[0].length;f++)for(var g=0;g<shape(d,e).length;g++)0!==shape(d,e)[g][f]&&draw_brick(a+f,b+g,c,d)}function draw_text(a,b,c,d){context.fillStyle="#fff",context.font=b+"px Verdana, DejaVu Sans",context.fillText(a,c,d)}function draw_brick(a,b,c,d){var e=d>1?2:0;rect(20*a+1,20*b+1,18,18,c,colors[e+1]),rect(20*a+2,20*b+2,16,16,c,colors[e]),-1!=[0,3,5].indexOf(d)&&(rect(20*a+5,20*b+5,10,10,c,colors[{0:2,3:0,5:4}[d]]),rect(20*a+8,20*b+8,4,4,c,colors[{0:0,3:2,5:0}[d]])),1==d&&rect(20*a+5,20*b+5,10,10,c,colors[4]),4==d&&rect(20*a+8,20*b+8,4,4,c,colors[4]),2==d&&(rect(20*a+5,20*b+5,8,8,c,colors[0]),rect(20*a+7,20*b+7,8,8,c,colors[4]),rect(20*a+7,20*b+7,6,6,c,colors[2])),6==d&&(rect(20*a+5,20*b+6,3,3,c,colors[0]),rect(20*a+5,20*b+12,3,3,c,colors[0]),rect(20*a+11,20*b+4,3,3,c,colors[0]),rect(20*a+13,20*b+12,3,3,c,colors[0]))}function draw(){rect(0,0,canvas.width,canvas.height,1,"000");for(var a=0;10>a;a++)for(var b=0;16>b;b++)rect(20*a,20*b,20,20,2,background[a][b]),0!==field[a][b]&&draw_brick(a,b,2,field[a][b]-1);draw_shape(pos.left,pos.top,2,current_shape_type,angle),draw_shape(21,1,1,next_shape_type,0),draw_text(points,30,420,130),draw_text("Points",13,420,150),draw_text(level,30,420,230),draw_text("Level",13,420,250),game_running||(draw_text("Game over",60,40,250),draw_text("Press R for a new game",20,140,270))}function noice(a,b){return a+~~(Math.random()*b)}function freeze(){for(var a=0;a<shape(current_shape_type,angle)[0].length;a++)for(var b=0;b<shape(current_shape_type,angle).length;b++)0!==shape(current_shape_type,angle)[b][a]&&(field[pos.left+a][pos.top+b]=shape(current_shape_type,angle)[b][a])}function clear_full_lines(){for(var a=0,b=1;16>b;b++){var c=!0;for(x=0;10>x;x++)0===field[x][b]&&(c=!1);if(c){a++;for(var d=b;d>0;d--)for(var e=0;10>e;e++)field[e][d]=field[e][d-1];for(var e=0;10>e;e++)field[e][0]=0}}1==a&&(points+=10),2==a&&(points+=25),3==a&&(points+=50),4==a&&(points+=100),a>0&&play_sound("point")}function play_sound(a){for(var b=0;b<audio_chanels.length;b++)now=new Date,audio_chanels[b].finished<now.getTime()&&(audio_chanels[b].finished=now.getTime()+1e3*assets[a].duration,audio_chanels[b].channel.src=assets[a].src,audio_chanels[b].channel.play(),audio_chanels[b].channel.volume=.1)}function next_shape(){stones++,stones>20&&(level++,stones=0),pos.left=4,pos.top=0,current_shape_type=next_shape_type,next_shape_type=Math.ceil(Math.random()*shapes.length-1),current_shape=shapes[current_shape_type]}function will_collide(a,b){for(var c=0;c<shape(current_shape_type,a)[0].length;c++)for(var d=0;d<shape(current_shape_type,a).length;d++)if(pos.top+shape(current_shape_type,a).length>=16||0!==shape(current_shape_type,a)[d][c]&&0!==field[b.left+c][b.top+d+1])return!0}function init(){speed=100,points=0,level=0,stones=0,game_running=!0,subframe=0,moved_steps=0;for(var a=0;10>a;a++)for(var b=0;16>b;b++)field[a][b]=0;next_shape(),loop()}function loop(){subframe++,subframe-speed>0&&(subframe=0,speed=100-15*level,+function(){return will_collide(angle,pos)?(freeze(),clear_full_lines(),next_shape(),(0===moved_steps||will_collide(0,{left:4,top:0}))&&(game_running=!1),moved_steps=0,!0):!1}()||pos.top++&&moved_steps++,draw()),game_running&&setTimeout(loop,5)}function setup(){assets.rotate.load(),assets.drop.load(),assets.move.load(),assets.point.load();for(var a=0;10>a;a++)audio_chanels[a]={channel:new Audio,finished:-1};for(var b=0;10>b;b++){field[b]=[],background[b]=[];for(var c=0;16>c;c++){var d=noice(15,15);background[b][c]=""+d+d+d,field[b][c]=0}}}var canvas=document.getElementById("fuTris"),context=canvas.getContext("2d");canvas.width=510,canvas.height=640;var field=[],background=[],game_running=!0,subframe=0,moved_steps=0,speed=100,points=0,level=0,stones=0,pos={left:4,top:0},angle=0,shapes=[[[[0,1],[0,1],[1,1]],[[1,0,0],[1,1,1]],[[1,1],[1,0],[1,0]],[[1,1,1],[0,0,1]]],[[[2,2],[2,2]]],[[[3,3,3],[0,3,0]],[[0,3],[3,3],[0,3]],[[0,3,0],[3,3,3]],[[3,0],[3,3],[3,0]]],[[[4,4],[0,4],[0,4]],[[0,0,4],[4,4,4]],[[4,0],[4,0],[4,4]],[[4,4,4],[4,0,0]]],[[[0,5,5],[5,5,0]],[[5,0],[5,5],[0,5]]],[[[6,6,0],[0,6,6]],[[0,6],[6,6],[6,0]]],[[[7,7,7,7]],[[7],[7],[7],[7]]]],colors=["c1e184","4f6c19","699021","8fc32e","1a2308"],assets={rotate:document.getElementById("rotate-sound"),drop:document.getElementById("drop-sound"),move:document.getElementById("move-sound"),point:document.getElementById("point-sound")},audio_chanels=[],current_shape_type=0,next_shape_type=Math.ceil(Math.random()*shapes.length-1),current_shape=shapes[current_shape_type];addEventListener("keydown",function(a){if(game_running){if((37==a.keyCode||72==a.keyCode)&&pos.left>0&&!will_collide(angle,{left:pos.left-1,top:pos.top})&&(pos.left--,play_sound("move"),draw()),(39==a.keyCode||76==a.keyCode)&&pos.left<10-shape(current_shape_type,angle)[0].length&&!will_collide(angle,{left:pos.left+1,top:pos.top})&&(pos.left++,play_sound("move"),draw()),38==a.keyCode||75==a.keyCode){var b=0===angle?3:angle-1;pos.left+shape(current_shape_type,b)[0].length<=10&&!will_collide(b,pos)&&(angle=b),play_sound("rotate"),draw()}if(40==a.keyCode||74==a.keyCode){for(;!will_collide(angle,{left:pos.left,top:pos.top+1});)pos.top++;pos.top++,points+=2,freeze(),clear_full_lines(),next_shape(),play_sound("drop"),draw()}}(13==a.keyCode||80==a.keyCode)&&(game_running=!game_running,game_running&&loop()),82!=a.keyCode||game_running||init()}),setup(),init();