<!--
TURN ON THE LIGHT
CREATED BY: VITRUVIAN
APRIL 05, 2018
-->
<!DOCTYPE HTML>
<html>
<head>
<style>
/*
TURN ON THE LIGHT
CREATED BY: VITRUVIAN
APRIL 05, 2018
*/
body {
font-family: 'Oswald', sans-serif;
font-size:25px;
font-weight:bold;
margin:0 0 0 0;
background-color:#f0f0f0;
}
* {
-webkit-touch-callout:none;
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
}
#game {
position:relative;
margin:auto;
width:360px;
height:460px;
}
circle,polyline,path,line {
display:none;
}
#paths path,#paths line,#paths circle {
display:block;
}
#complete circle,#complete path {
display:block;
}
.blocks {
position:absolute;
width:72px;
height:72px;
display:none;
z-index:400;
}
#complete {
position:absolute;
top:0;
left:0;
width:360px;
height:460px;
z-index:200;
display:none;
}
#lighton {
position:absolute;
top:0;
right:0;
width:120px;
height:173px;
background-image:url(https://i.imgur.com/tTabsv6.png);
}
.b_levels {
position:absolute;
width:56px;
height:47px;
border:2px solid;
background-color:#e0e0e0;
border-radius:10px;
font-size:15px;
cursor:pointer;
z-index:400;
}
.b_levels div {
position:absolute;
top:15px;
left:0;
width:100%;
font-size:21px;
}
.btn {
position:absolute;
top: 127px;
border:2px solid;
background-color:#e0e0e0;
border-radius:10px;
font-size:15px;
cursor:pointer;
padding:5px 10px 5px 10px;
display:none;
z-index:200;
}
</style>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="utf-8">
<link href="https://fonts.googleapis.com/css?family=Oswald:700" rel="stylesheet">
<title>Turn On the Light</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://hammerjs.github.io/dist/hammer.js"></script>
</head>
<body>
<div id="game">
<svg id="paths" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="360px" height="460px" viewBox="0 0 360 460" E="xMidYMid meet">
<path fill="#000000" d="M21 41l7 0 0 -14c0,-1 1,-2 2,-2 1,0 2,1 2,2l0 14 8 0 0 -14c0,-1 1,-2 2,-2 1,0 2,1 2,2l0 14 7 0c1,0 2,0 2,2l0 3c0,2 -1,3 -2,3l-1 0 0 6c0,5 -4,9 -8,9l0 3c0,1 -1,2 -2,2l-8 0c-1,0 -2,-1 -2,-2l0 -3c-4,0 -8,-4 -8,-9l0 -6 -1 0c-1,0 -2,-1 -2,-3l0 -3c0,-2 1,-2 2,-2z"/>
<line fill="none" stroke="#000000" stroke-width="4" x1="36" y1="68" x2="36" y2= "172" />
<path fill="none" stroke="#000000" stroke-width="4" stroke-linecap="round" d="M324 172l0 -16c0,-10 -9,-18 -18,-17 -3,1 -7,3 -9,2 -4,-2 -5,-9 -2,-9 2,0 16,6 14,2 0,-2 -21,-8 -19,-11 3,-3 24,8 23,3 -1,-4 -24,-7 -23,-12 1,-4 26,9 27,4 0,-4 -22,-9 -25,-11 -6,-5 -3,-13 -4,-17 -1,-3 -4,-8 -5,-10 -1,-1 -5,-4 -7,-12 -2,-9 -4,-18 4,-28 8,-10 24,-14 34,-11 10,2 25,14 23,33 -1,9 -7,15 -12,20 -12,10 -6,23 -12,24 -2,1 -4,1 -7,1 -6,-2 -3,-18 -4,-25 -1,-6 -5,-7 -8,-11 -2,-3 1,-5 5,-2 2,3 2,-1 4,-4 3,-4 6,-1 6,1 0,3 1,7 4,1 2,-4 7,-1 5,4 -3,6 -5,6 -10,9"/>
<path id="mainpath" fill="none" stroke="#000000" stroke-width="4" d="M36 68l0 104 0 216c0,20 16,36 36,36l216 0c20,0 36,-16 36,-36l0 -216"/>
<circle id="maincircle" fill="#fffd56" cx="0" cy="0" r="7">
<animateMotion dur="1.5s" calcmode="linear" repeatCount="indefinite">
<mpath xlink:href="#mainpath"/>
</circle>
</svg>
<div style="position:absolute;top:15px;left:0;width:320px;text-align:center;">TURN ON THE LIGHT </p></div>
<div style="position:absolute;top:40px;left:0;width:320px;text-align:center;">MAGMORY GAME</div>
<div id="level" style="position:absolute;top:70px;left:0;width:320px;text-align:center;font-size:21px;display:none;">Level: <span>0</span></div>
<div id="moves" style="position:absolute;top:95px;left:0;width:320px;text-align:center;font-size:21px;display:none;">Moves: <span>0</span></div>
<svg id="complete" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="360px" height="460px" viewBox="0 0 360 460" E="xMidYMid meet">
</svg>
<div id="lighton"></div>
<div id="info" style="position:absolute;top:90px;left:50px;width:220px;height:auto;font-size:18px;text-align:center;">
Click on cable<br>
segments to rotate<br>
clockwise until all<br>
the segments are in<br>
the correct position.
</div>
<div id="div_levels" style="position:absolute;top:248px;left:52px;width:260px;height:165px;font-size:18px;text-align:center;"></div>
<div class="btn" id="b_menu" style="left:85px;">MENU</div>
<div class="btn" id="b_next" style="left:150px;">NEXT LEVEL</div>
</div>
</body>
<script>
/*
TURN ON THE LIGHT
CREATED BY: VITRUVIAN
APRIL 05, 2018
*/
var playing = true;
// levels.length = 12 (number of levels)
// each element of levels array is composed of an array
// The game board is a 5x4 matrix
// I define values for the sides of
// each cell of the 5x4 matrix:
// 1 = top
// 2 = right
// 3 = bottom
// 4 = left
// each element of this sub array defines
// the piece (.blocks) of the game starting top-left
// each of the values define what to show,
// example: 141_90
// 14 indicates that the curved line
// will go from top (1) to left (4)
// the third caharacter is a 1
// this indicates where to draw the arrow
// as this 3rd character is 1,
// the arrow will be shown at top
// the underscore separates the arrow
// definition from the initial rotation (deg)
// this deg values can be 0 (no rotation al all)
// is deg===0 then the brick background is shown
// there are some special values for this elements:
// x = brick with a cross
// y = brick with top-right & bottom-left lines
// z = brick with top-left & bottom-right lines
var levels = [
["122_0","242_90","242_0","242_-90","141_0"],
["122_180","343_0","","232_0","141_90","","122_90","242_-90","141_-90"],
["x","343_90","232_-90","244_180","131_90","122_-90","242_-180","y","z","141_90","","122_-90","122_-90","141_90"],
["133_90","343_-90","232_180","242_90","141_-90","122_90","y","121_90","x","344_-90","233_90","122_-90","343_90","z","141_180","121_90","242_0","122_180","141_90"],
["122_90","343_180","232_90","242_180","141_-90","233_180","z","x","y","344_180","133_90","y","z","z","141_90","122_180","242_-90","141_180","233_180","121_-90"],
["y","242_90","343_-90","232_180","z","232_90","242_180","x","141_180","141_180","131_90","122_180","x","244_-90","344_90","122_0","244_180","144_90","122_90","144_0"],
["122_90","343_-90","232_180","242_-90","141_-90","233_180","z","z","242_90","343_90","133_180","121_180","x","344_90","133_-90","122_-90","242_90","141_180","121_180","144_90"],
["133_-90","232_90","343_180","232_180","141_90","122_0","z","y","y","344_-90","232_180","z","y","x","141_90","121_-90","144_180","121_90","144_90","144_-90"],
["122_90","242_-90","343_90","344_180","131_-90","233_90","244_90","144_180","z","141_180","133_-90","121_-90","z","y","344_90","122_-90","242_180","141_-90","122_180","141_90"],
["133_-90","233_180","344_180","232_90","141_-90","122_-90","y","x","z","343_90","233_180","z","x","141_-90","133_90","122_180","141_-90","121_90","244_180","144_-90"],
["122_180","343_-90","232_90","343_-90","131_90","233_180","144_90","131_-90","133_180","131_-90","133_90","232_00","z","z","141_180","122_90","141_-90","122_-90","141_180"],
["133_180","232_180","242_-90","343_90","131_90","122_180","x","343_90","122_-90","141_180","233_90","x","x","244_180","344_-90","122_-90","141_180","122_90","242_180","141_-90"]
];
// toverify array contain the matrix elements to be verify,
// when rotation degree for each elements of toverify iz zero
// then the level is complete - see verify() function
var toverify = [
[1,3],
[0,4,6,7,8],
[4,5,6,9,12,13],
[0,2,3,4,5,7,9,11,12,14,17,18],
[0,1,2,3,4,5,10,15,16,17],
[1,2,3,5,6,8,10,16,17],
[0,1,2,3,4,5,8,9,10,11,13,14,15,16,17,18,19],
[0,1,2,3,4,5,9,10,14,15,16,17,18],
[0,1,2,4,5,6,7,9,10,14,15,16,17,18,19],
[0,1,2,3,4,5,9,10,13,14,15,16,17,18,19],
[0,1,2,3,4,5,6,7,8,9,10,11,14,15,16,17,18,19],
[0,1,2,3,4,5,7,8,9,10,13,14,15,16,17,18,19]
];
// completed_paths is an array with SVG paths to show
// the animation when a level is completed
var completed_paths = [
'<path id="motionpath" fill="none" stroke="#000000" stroke-width="4" d="M36 68l0 104c0,20 16,36 36,36l216 0c20,0 36,-16 36,-36"/>',
'<path id="motionpath" fill="none" stroke="#000000" stroke-width="4" d="M36 68l0 104c0,20 16,36 36,36 20,0 36,16 36,36 0,20 16,36 36,36l72 0c20,0 36,-16 36,-36 0,-20 16,-36 36,-36 20,0 36,-16 36,-36"/>',
'<path id="motionpath" fill="none" stroke="#000000" stroke-width="4" d="M36 68l0 104 0 72c0,20 16,36 36,36l72 0c20,0 36,16 36,36 0,20 16,36 36,36 20,0 36,-16 36,-36m0 0c0,-20 16,-36 36,-36 20,0 36,-16 36,-36l0 -72"/>',
'<path id="motionpath" fill="none" stroke="#000000" stroke-width="4" d="M36 68l0 104 0 72c0,20 16,36 36,36 20,0 36,16 36,36 0,20 16,36 36,36 20,0 36,16 36,36 0,20 16,36 36,36 20,0 36,-16 36,-36 0,-20 16,-36 36,-36 20,0 36,-16 36,-36 0,-20 -16,-36 -36,-36l-72 0c-20,0 -36,-16 -36,-36 0,-20 16,-36 36,-36l72 0c20,0 36,-16 36,-36"/>',
'<path id="motionpath" fill="none" stroke="#000000" stroke-width="4" d="M36 68l0 104c0,20 16,36 36,36 20,0 36,16 36,36 0,20 -16,36 -36,36 -20,0 -36,16 -36,36l0 72c0,20 16,36 36,36l72 0c20,0 36,-16 36,-36 0,-20 16,-36 36,-36 20,0 36,-16 36,-36 0,-20 -16,-36 -36,-36l-72 0c-20,0 -36,16 -36,36 0,20 16,36 36,36 20,0 36,-16 36,-36l0 -72c0,-20 16,-36 36,-36l72 0c20,0 36,-16 36,-36"/>',
'<path id="motionpath" fill="none" stroke="#000000" stroke-width="4" d="M36 68l0 104c0,20 16,36 36,36l72 0c20,0 36,16 36,36l0 72 0 72c0,20 -16,36 -36,36l-72 0c-20,0 -36,-16 -36,-36l0 -72c0,-20 16,-36 36,-36l72 0 72 0c20,0 36,-16 36,-36 0,-20 16,-36 36,-36 20,0 36,-16 36,-36"/>',
'<path id="motionpath" fill="none" stroke="#000000" stroke-width="4" d="M36 68l0 104c0,20 16,36 36,36 20,0 36,16 36,36 0,20 -16,36 -36,36 -20,0 -36,16 -36,36l0 72c0,20 16,36 36,36l72 0c20,0 36,-16 36,-36l0 -72c0,-20 16,-36 36,-36l72 0c20,0 36,16 36,36l0 72c0,20 -16,36 -36,36 -20,0 -36,-16 -36,-36 0,-20 -16,-36 -36,-36l-72 0c-20,0 -36,-16 -36,-36 0,-20 16,-36 36,-36 20,0 36,-16 36,-36 0,-20 16,-36 36,-36l72 0c20,0 36,-16 36,-36"/>',
'<path id="motionpath" fill="none" stroke="#000000" stroke-width="4" d="M36 68l0 104 0 72c0,20 16,36 36,36 20,0 36,-16 36,-36 0,-20 16,-36 36,-36 20,0 36,16 36,36 0,20 16,36 36,36 20,0 36,16 36,36l0 72c0,20 -16,36 -36,36 -20,0 -36,-16 -36,-36 0,-20 -16,-36 -36,-36 -20,0 -36,16 -36,36 0,20 -16,36 -36,36 -20,0 -36,-16 -36,-36 0,-20 16,-36 36,-36 20,0 36,-16 36,-36 0,-20 16,-36 36,-36 20,0 36,16 36,36 0,20 16,36 36,36l72 0c20,0 36,-16 36,-36 0,-20 -16,-36 -36,-36 -20,0 -36,-16 -36,-36 0,-20 16,-36 36,-36 20,0 36,-16 36,-36"/>',
'<path id="motionpath" fill="none" stroke="#000000" stroke-width="4" d="M36 68l0 104c0,20 16,36 36,36l72 0c20,0 36,16 36,36 0,20 -16,36 -36,36l-72 0c-20,0 -36,16 -36,36l0 72c0,20 16,36 36,36l72 0c20,0 36,-16 36,-36 0,-20 16,-36 36,-36 20,0 36,16 36,36 0,20 16,36 36,36 20,0 36,-16 36,-36 0,-20 -16,-36 -36,-36 -20,0 -36,-16 -36,-36 0,-20 16,-36 36,-36 20,0 36,-16 36,-36l0 -72"/>',
'<path id="motionpath" fill="none" stroke="#000000" stroke-width="4" d="M36 68l0 104 0 72c0,20 16,36 36,36 20,0 36,16 36,36 0,20 -16,36 -36,36 -20,0 -36,16 -36,36 0,20 16,36 36,36 20,0 36,-16 36,-36 0,-20 16,-36 36,-36l72 0c20,0 36,-16 36,-36 0,-20 16,-36 36,-36 20,0 36,16 36,36l0 72c0,20 -16,36 -36,36l-72 0c-20,0 -36,-16 -36,-36l0 -72 0 -72c0,-20 -16,-36 -36,-36 -20,0 -36,16 -36,36 0,20 16,36 36,36l72 0c20,0 36,-16 36,-36 0,-20 16,-36 36,-36 20,0 36,-16 36,-36"/>',
'<path id="motionpath" fill="none" stroke="#000000" stroke-width="4" d="M36 68l0 104c0,20 16,36 36,36 20,0 36,16 36,36 0,20 -16,36 -36,36 -20,0 -36,16 -36,36l0 72c0,20 16,36 36,36 20,0 36,-16 36,-36 0,-20 16,-36 36,-36 20,0 36,-16 36,-36l0 -72c0,-20 16,-36 36,-36 20,0 36,16 36,36l0 72c0,20 -16,36 -36,36 -20,0 -36,16 -36,36 0,20 16,36 36,36 20,0 36,-16 36,-36 0,-20 16,-36 36,-36 20,0 36,-16 36,-36l0 -72 0 -72"/>',
'<path id="motionpath" fill="none" stroke="#000000" stroke-width="4" d="M36 68l0 104 0 72c0,20 16,36 36,36l72 0c20,0 36,16 36,36l0 72c0,20 16,36 36,36l72 0c20,0 36,-16 36,-36 0,-20 -16,-36 -36,-36l-72 0 -72 0 -72 0c-20,0 -36,16 -36,36 0,20 16,36 36,36 20,0 36,-16 36,-36l0 -72 0 -72c0,-20 16,-36 36,-36l72 0c20,0 36,16 36,36 0,20 16,36 36,36 20,0 36,-16 36,-36l0 -72"/>'
];
$(document).ready(function() {
$("body").delegate("#b_next","click",function() {
var level = parseInt($("#level span").html());
show_level(level);
});
$("body").delegate("#b_menu","click",function() {
$("body").css("background-color","#f0f0f0");
$("#complete").html("");
$("#b_menu,#b_next,#level,#moves").hide();
$("#info,#mainpath,#maincircle,#div_levels,#lighton").show();
$(".blocks").remove();
});
$("body").delegate(".b_levels","click",function() {
var level = parseInt($(this).children("div").html());
$("#info,#div_levels").hide();
$("#mainpath,#maincircle").hide();
show_level(level-1);
});
$("body").delegate(".blocks","click",function() {
// rotates the block 90 deg clockwise
if (playing) {
blocked = parseInt($(this).data("blocked"));
if (blocked===0) {
$(".blocks").css("z-index",100);
angle = parseInt($(this).data("angle"))+90;
$(this).css({
"transition":"200ms linear all",
"z-index":"101",
"transform:":"rotate("+angle+"deg)",
"-moz-transform":"rotate("+angle+"deg)",
"-webkit-transform":"rotate("+angle+"deg)",
"-o-transform":"rotate("+angle+"deg)",
"-ms-transform":"rotate("+angle+"deg)",
"-khtml-transform":"rotate("+angle+"deg)"
});
$(this).data("angle",angle);
moves = parseInt($("#moves span").html());
$("#moves span").html(moves+1);
verify();
}
}
});
show_level_buttons();
});
function show_level_buttons() {
var level = 1;
for (var i=0;i<3;i++) {
for (var j=0;j<4;j++) {
bhtml = '<div class="b_levels" style="top:'+(i*55)+'px;left:'+(2+j*65)+'px;">LEVEL<div>'+level+'</div></div>';
$("#div_levels").append(bhtml);
level++;
}
}
}
function verify() {
// see if all block's rotation angle is zero
// using javascript mod
complete = true;
var level = parseInt($("#level span").html());
var verify_paths = toverify[level-1];
for (var i=0;i<verify_paths.length;i++) {
angle = parseInt($("#block_"+verify_paths[i]).data("angle"));
mod = angle%360;
if (mod!=0) {
complete = false;
}
}
if (complete) {
playing = false;
completed();
}
}
function completed() {
// show the level completed_paths
$(".a1,.a2,.a3,.a4").hide();
$(".blocks circle,.blocks path,.blocks line").hide();
$(".blocks").css({
"cursor":"default",
"background-image":"url()"
});
var level = parseInt($("#level span").html());
$("#complete path:eq("+(level-1)+")").show();
var completed_path = completed_paths[level-1];
html = completed_path;
html += '<circle id="mover" fill="#fffd56" cx="0" cy="0" r="7">';
html += '</circle>'
$("#complete").html(html).show();
var myPath = document.getElementById("motionpath");
var length = myPath.getTotalLength();
var speed = length/400;
html = '<animateMotion dur="'+speed+'s" calcmode="linear" repeatCount="indefinite">';
html += '<mpath xlink:href="#motionpath"/>';
$("#complete circle").html(html);
var level = parseInt($("#level span").html());
$(".b_levels:eq("+(level-1)+")").css({
"border":"2px solid #006100",
"color":"#006100",
"background-color":"#ffffff"
});
if (level<12) {
$("#b_next").show();
}
$("body").css("background-color","#f0f0f0");
$("#lighton").show();
}
function show_blocks() {
var paths = '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="72px" height="72px" viewBox="0 0 72 72" E="xMidYMid meet">';
paths += '<circle fill="#9a9a9a" cx="36" cy="36" r="36"/>';
paths += '<polyline fill="none" class="a1" stroke="#000000" stroke-width="4" stroke-linecap="round" points="49,13 36,0 23,13 "/>';
paths += '<polyline fill="none" class="a2" stroke="#000000" stroke-width="4" stroke-linecap="round" points="59,23 72,36 59,49 "/>';
paths += '<polyline fill="none" class="a3" stroke="#000000" stroke-width="4" stroke-linecap="round" points="49,59 36,72 23,59 "/>';
paths += '<polyline fill="none" class="a4" stroke="#000000" stroke-width="4" stroke-linecap="round" points="13,23 0,36 13,49 "/>';
paths += '<path fill="none" class="p12" stroke="#000000" stroke-width="4" d="M36 0c0,20 16,36 36,36"/>';
paths += '<path fill="none" class="p23" stroke="#000000" stroke-width="4" d="M36 72c0,-20 16,-36 36,-36"/>';
paths += '<path fill="none" class="p34" stroke="#000000" stroke-width="4" d="M36 72c0,-20 -16,-36 -36,-36"/>';
paths += '<path fill="none" class="p14" stroke="#000000" stroke-width="4" d="M36 0c0,20 -16,36 -36,36"/>';
paths += '<line fill="none" class="p13" stroke="#000000" stroke-width="4" x1="36" y1="0" x2="36" y2= "72" />';
paths += '<line fill="none" class="p24" stroke="#000000" stroke-width="4" x1="72" y1="36" x2="0" y2= "36" />';
paths += '';
paths += '</svg>';
var c = 0;
for (var i=0;i<4;i++) {
for (var j=0;j<5;j++) {
$("#game").append("<div class='blocks' id='block_"+c+"' data-angle='0' style='top:"+(172+i*72)+"px;left:"+(j*72)+"px;'>"+paths+"</div>");
c++;
}
}
}
function show_level(level) {
// show blocks according level
$("body").css("background-color","#c0c0c0");
playing = true;
$("#complete").html("").hide();
$(".blocks").remove();
show_blocks();
$("#level span").html(level+1);
$("#moves span").html(0);
$("#level,#moves,#b_menu").show();
$("#lighton,#b_next").hide();
level_paths = levels[level];
$(".blocks").css({
"background-image":"url(https://i.imgur.com/0Fc0TuZ.png)",
"cursor":"default"
}).data("angle","0").data("blocked","1").show();
$(".blocks circle,.blocks polyline,.blocks path,.blocks line").hide();
for (var i=0;i<level_paths.length;i++) {
path = level_paths[i];
switch (path) {
case "":
break;
case "x":
$(".blocks:eq("+i+") .p13").show();
$(".blocks:eq("+i+") .p24").show();
break;
case "y":
$(".blocks:eq("+i+") .p12").show();
$(".blocks:eq("+i+") .p34").show();
break;
case "z":
$(".blocks:eq("+i+") .p23").show();
$(".blocks:eq("+i+") .p14").show();
break;
default:
arrow = path.substr(2,1);
angle = parseInt(path.substr(4));
path = path.substr(0,2);
$(".blocks:eq("+i+") .p"+path).show();
bgi = ""
if (angle!==0) {
$(".blocks:eq("+i+") .a"+arrow).show();
$(".blocks:eq("+i+") circle").show();
$(".blocks:eq("+i+")").css({
"background-image":"url()",
"cursor":"pointer"
}).data("angle",angle).data("blocked",0);
rotate_block(i,angle);
}
break;
}
}
}
function rotate_block(n,angle) {
$(".blocks:eq("+n+")").css({
"transform:":"rotate("+angle+"deg)",
"-moz-transform":"rotate("+angle+"deg)",
"-webkit-transform":"rotate("+angle+"deg)",
"-o-transform":"rotate("+angle+"deg)",
"-ms-transform":"rotate("+angle+"deg)",
"-khtml-transform":"rotate("+angle+"deg)",
}).data("angle",angle);
}
</script>
</html>