사용자:Bd3076/common.js
참고: 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.
- 파이어폭스 / 사파리: Shift 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5 또는 Ctrl-R을 입력 (Mac에서는 ⌘-R)
- 구글 크롬: Ctrl-Shift-R키를 입력 (Mac에서는 ⌘-Shift-R)
- 인터넷 익스플로러 / 엣지: Ctrl 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5를 입력.
- 오페라: Ctrl-F5를 입력.
/** 플러그인 switched_maze***************************
* 스위치 미로 게임
* 버전 => 1.0
* 작성자 : [[사용자:Bd3076|Bd3076]]
* JSON => switched_maze = {"name":"switched_maze","descript":"스위치 미로 게임","version":"1.0","local":true,"creat":"Bd3076","state":"스위치 미로/plugin","executable":true};
*/
function plugin_switched_maze(){
if($("[data-name='switched_maze']").length >= 1){
// 이부분에 코드 입력 //
var keyPress = new Array(128);
document.onkeydown = function(e){
e = e || window.event;
keyPress[e.keyCode] = 1;
}
document.onkeyup = function(e){
e = e || window.event;
keyPress[e.keyCode] = 0;
}
var cvs = document.getElementById("cvs");
cvs.innerHTML = ('<canvas id="canvas" width="480" height="480"></canvas>')
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.fillStyle = "black";
ctx.fillRect(0, 0, 500, 500);
var stopWatchH = 0;
var stopWatchM = 0;
var stopWatchS = 0;
var stopWatchSS = 0;
var addStopwatch = function(){
stopWatchSS++;
if(stopWatchSS == 10){
stopWatchS++;
stopWatchSS = 0;
if(stopWatchS == 60){
stopWatchM++;
stopWatchS = 0;
if(stopWatchM == 60){
stopWatchH++;
stopWatchM = 0;
}
}
}
}
var setStopwatch = function(){
stopwatchH = 0;
stopwatchM = 0;
stopwatchS = 0;
stopwatchSS = 0;
setInterval(addStopwatch, 100);
}
var setCookie = function(name, value) {
var date = new Date();
date.setTime(date.getTime() + 12345678987654321);
document.cookie = name + '=' + value + ';expires=' + date.toUTCString() + ';path=/';
};
var getCookie = function(name) {
var value = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return value? value[2] : null;
};
// road variable
// 2^0: right (+x)
// 2^1: down (-y)
// 2^2: left (-x)
// 2^3: up (+y)
var levelCount = 1;
var levelData = new Array(levelCount);
levelData[0] = {
x: 4,
y: 4,
startX: 0,
startY: 0,
finishX: 1,
finishY: 0,
road: [
[8, 3, 5, 12],
[11, 4, 1, 14],
[10, 8, 1, 6],
[2, 3, 5, 4]
],
switch_road: [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[[{dir:1, num:2}], [{dir:4, num:2}],0,0]
],
switch_num: [
[0, 0, 0, 0],
[0, 0, 0, 0],
[2, 0, 0, 0],
[0, 0, 0, 0]
],
lever_road: [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, [{dir:8, num:2}], 0],
[0, 0, [{dir:2, num:2}], 0]
],
lever: [
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 2]
],
lever_point: [
0, 0, 3
],
switch_open: [
0, 0, 0
],
lever_open: [
0, 0, 0
]
};
var levelClear = function(level){
ctx.fillStyle = "white";
ctx.fillText("레벨 " + level + " 클리어!", 240, 200);
ctx.fillText("걸린 시간: " + stopWatchH + "시간 " + stopWatchM + "분 " + stopWatchS + "." + stopWatchSS + "초", 240, 240);
ctx.fillText("다음 레벨로 넘어가시려면 [Space]를 누르세요.", 240, 280);
setCookie("level", level+1);
waitToPlayLevel(level+1);
}
var displayRoom = function(level, x, y){
ctx.fillStyle = "black";
ctx.fillRect(0, 0, 500, 500);
console.log("x: " + x + ", y: " + y + ", road: " + levelData[level].road[y][x]);
if(x == levelData[level].finishX && y == levelData[level].finishY){
levelClear(level);
return;
}
var road = levelData[level].road[y][x];
var switch_road = levelData[level].switch_road[y][x];
var switch_num = levelData[level].switch_num[y][x];
var lever_road = levelData[level].lever_road[y][x];
var lever = levelData[level].lever[y][x];
var roadRight = (road & 1);
var roadDown = (road & 2) / 2;
var roadLeft = (road & 4) / 4;
var roadUp = (road & 8) / 8;
for(var i=0; i<switch_road.length; i++){
var t_sdir = switch_road[i].dir;
if(t_sdir & 1) roadRight = levelData[level].switch_open[switch_road[i].num] ? 1 : 2;
if(t_sdir & 2) roadDown = levelData[level].switch_open[switch_road[i].num] ? 1 : 2;
if(t_sdir & 4) roadLeft = levelData[level].switch_open[switch_road[i].num] ? 1 : 2;
if(t_sdir & 8) roadUp = levelData[level].switch_open[switch_road[i].num] ? 1 : 2;
}
for(var i=0; i<lever_road.length; i++){
var t_ldir = lever_road[i].dir;
if(t_ldir & 1) roadRight = levelData[level].lever_open[lever_road[i].num] ? 1 : 3;
if(t_ldir & 2) roadDown = levelData[level].lever_open[lever_road[i].num] ? 1 : 3;
if(t_ldir & 4) roadLeft = levelData[level].lever_open[lever_road[i].num] ? 1 : 3;
if(t_ldir & 8) roadUp = levelData[level].lever_open[lever_road[i].num] ? 1 : 3;
}
ctx.fillStyle = "white";
ctx.fillRect(120, 120, 240, 240);
if(roadRight){
ctx.fillStyle = roadRight == 1 ? "white" : roadRight == 2 ? "blue" : "purple";
ctx.fillRect(360, 180, 120, 120);
}
if(roadDown){
ctx.fillStyle = roadDown == 1 ? "white" : roadDown == 2 ? "blue" : "purple";
ctx.fillRect(180, 360, 120, 120);
}
if(roadLeft){
ctx.fillStyle = roadLeft == 1 ? "white" : roadLeft == 2 ? "blue" : "purple";
ctx.fillRect(0, 180, 120, 120);
}
if(roadUp){
ctx.fillStyle = roadUp == 1 ? "white" : roadUp == 2 ? "blue" : "purple";
ctx.fillRect(180, 0, 120, 120);
}
if(roadRight == 1) road |= 1;
if(roadDown == 1) road |= 2;
if(roadLeft == 1) road |= 4;
if(roadUp == 1) road |= 8;
setTimeout(waitForKey, 200, level, x, y, road);
if(levelData[level].switch_num[y][x]){
ctx.fillStyle = "blue";
if(levelData[level].switch_open[levelData[level].switch_num[y][x]]){
ctx.fillRect(130, 130, 50, 220);
}
else{
ctx.fillRect(140, 140, 30, 200);
}
}
if(levelData[level].lever[y][x]){
ctx.fillStyle = "purple";
if(levelData[level].lever_open[levelData[level].lever[y][x]]){
ctx.fillRect(300, 130, 50, 220);
}
else{
ctx.fillRect(310, 140, 30, 200);
}
}
}
var counter = 0;
var waitForKey = function(level, x, y, road){
counter++;
var canPressSpace;
if(levelData[level].switch_num[y][x] == 0 && levelData[level].lever[y][x] == 0){
canPressSpace = 0;
}
else{
canPressSpace = 1;
}
if((!keyPress[32] || !canPressSpace) &&
(!keyPress[37] || x==0 || !(road&4)) &&
(!keyPress[38] || y==levelData[level].y-1 || !(road&8)) &&
(!keyPress[39] || x==levelData[level].x-1 || !(road&1)) &&
(!keyPress[40] || y==0 || !(road&2))){
setTimeout(waitForKey, 30, level, x, y, road);
counter--;
return;
}
else{
if(keyPress[32] && canPressSpace){
console.log("pressed space");
keyPress[32] = 0;
if(levelData[level].switch_num[y][x] > 0){
levelData[level].switch_open[levelData[level].switch_num[y][x]] = 1 - levelData[level].switch_open[levelData[level].switch_num[y][x]];
displayRoom(level, x, y);
return;
}
if(levelData[level].lever[y][x] > 0){
levelData[level].lever_open[levelData[level].lever[y][x]] = levelData[level].lever_point[levelData[level].lever[y][x]];
displayRoom(level, x, y);
return;
}
counter--;
return;
}
else{
for(var i=0; i<levelData[level].lever_open.length; i++){
levelData[level].lever_open[i]--;
if(levelData[level].lever_open[i] < 0) levelData[level].lever_open[i] = 0;
}
if(keyPress[37] && x!=0 && road&4){
console.log("pressed left");
displayRoom(level, x-1, y);
keyPress[37] = 0;
counter--;
return;
}
else if(keyPress[38] && y!=levelData[level].y-1 && road&8){
console.log("pressed up");
displayRoom(level, x, y+1);
keyPress[38] = 0;
counter--;
return;
}
else if(keyPress[39] && x!=levelData[level].x-1 && road&1){
console.log("pressed down");
displayRoom(level, x+1, y);
keyPress[39] = 0;
counter--;
return;
}
else if(keyPress[40] && y!=0 && road&2){
console.log("pressed right");
displayRoom(level, x, y-1);
keyPress[40] = 0;
counter--;
return;
}
}
}
}
var playLevel = function(level){
var thisLevelData = levelData[level];
setStopwatch();
addStopwatch();
console.log(thisLevelData);
displayRoom(level, thisLevelData.startX, thisLevelData.startY);
}
var main = function(){
ctx.font = "15px Dotum";
ctx.textAlign = "center";
ctx.fillStyle = "white";
var level = getCookie("level");
if(level != null){
ctx.fillText("저장된 파일이 있습니다. 이어 플레이하시겠습니까?", 240, 200);
ctx.fillText("예: [Space], 아니오: [↑]", 240, 240);
waitToPlayLevel(level, 1);
}
else{
level = 0;
ctx.fillText("스위치 미로", 240, 120);
ctx.fillText("Bd3076", 240, 150);
ctx.fillText("움직이려면 [방향키]를 누르세요.", 240, 240);
ctx.fillText("스위치나 레버를 누르려면 [Space]를 누르세요.", 240, 270);
ctx.fillText("플레이하려면 [Space]를 누르세요.", 240, 360);
}
waitToPlayLevel(level, 0);
}
var waitToPlayLevel = function(level, mode){
if(keyPress[32]){
if(levelCount <= level){
lastLevel();
return;
}
playLevel(level);
}
else if(mode==1 && keyPress[38]) playLevel(0);
else setTimeout(waitToPlayLevel, 100, level, mode);
}
var lastLevel = function(){
ctx.fillStyle = "white";
ctx.fillText("죄송합니다. 더 이상의 레벨이 준비되어 있지 않습니다.", 240, 300);
ctx.fillText("빠른 시일 내에 새로운 레벨을 준비하겠습니다. 감사합니다.", 240, 340);
}
main();
// 여기까지 코드 입력 //
}
}
$( plugin_switched_maze );
/* switched_maze 끝 */