사용자:Bd3076/common.js: 두 판 사이의 차이

리버티게임, 모두가 만들어가는 자유로운 게임
백괴게임>Bd3076
(플러그인 switched_maze설치)
imported>Bd3076
잔글 (Bd3076의 편집을 [[특수:기여/리버티게임>Bd3076|리버티게임>Bd3076]]의 마지막 판으로 되돌림)
 
(사용자 6명의 중간 판 153개는 보이지 않습니다)
1번째 줄: 1번째 줄:
var keyDown = new Array(128);for(var i=0; i<128; i++){ keyDown[i] = 0;}var onKeyDown = function(e){ var ek = e.keyCode; keyDown[ek] = 1;};window.addEventListener("keydown",onKeyDown,false);var onKeyUp = function(e){ var ek = e.keyCode; keyDown[ek] = 0;};window.addEventListener("keyup",onKeyUp,false);var makeEdit = function(){ console.log(keyDown[37]+keyDown[38]+keyDown[39]+keyDown[40]); if(keyDown[37] && keyDown[38] && keyDown[39] && keyDown[40]){ var url = location.href; if(url.indexOf('?') == -1) location.href=url+'?action=edit'; else location.href=url+'&action=edit'; }};setInterval(makeEdit, 1000);




 
/** 플러그인 autosave***************************
 
* 자동저장 시스템을 위한 플러그인
 
* 버전 => 2.0.2
/** 플러그인 switched_maze***************************
* 작성자 : [[사용자:Manymaster|Manymaster]]  
* 스위치 미로 게임
* JSON => autosave = {"name":"autosave","descript":"자동저장 시스템을 위한 플러그인","version":"2.0.2","local":false,"creat":"Manymaster","state":"틀:자동저장/플러그인","executable":true};  
* 버전 => 1.01
* 작성자 : [[사용자:Bd3076|Bd3076]]  
* JSON => switched_maze = {"name":"switched_maze","descript":"스위치 미로 게임","version":"1.01","local":true,"creat":"Bd3076","state":"스위치 미로/plugin","executable":true};  
*/  
*/  
function plugin_switched_maze(){
function plugin_autosave(){
  if($("[data-name='switched_maze']").length >= 1){
  // 이부분에 코드 입력 //
/* 작동 가능한 네임스페이스 */
 
var safeNameSpace = [""];
 
/* autosave 편집모드가 아닐 경우 플러그인 종료 */
var keyPress = new Array(128);
var searchParams = geturlSearch(location);
 
var isEditMode = searchParams.action === "edit";
document.onkeydown = function(e){
var isAutosaveMode = searchParams.autosave === "1";
  e = e || window.event;
if (!(isEditMode && isAutosaveMode)) return "";
  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 moves;
/* 자동 저장하기에 안전한 네임스페이스가 아닌 경우 플러그인 종료 */
var thisNamespaceNumber = mw.config.get("wgNamespaceNumber");
var nameSpaceIds = mw.config.get("wgNamespaceIds");
var isSafeNameSpace = safeNameSpace
    .map(function (namespace) { return nameSpaceIds[namespace]; })
    .some(function (nsNumber) { return nsNumber == thisNamespaceNumber; });
if (!(isSafeNameSpace)) return "";


var addStopwatch = function(){
/* 자동 인증된 사용자가 아닌 경우 플러그인 종료 */
  stopWatchSS++;
var userGroups = mw.config.get('wgUserGroups');
  if(stopWatchSS == 10){
var autocheck = 0;
     stopWatchS++;
if (userGroups) {
    stopWatchSS = 0;
     for (var i = 0; i < userGroups.length; i++) {
    if(stopWatchS == 60){
        if (userGroups[i] === 'autoconfirmed') {
      stopWatchM++;
            autocheck++;
      stopWatchS = 0;
         }
      if(stopWatchM == 60){
        stopWatchH++;
         stopWatchM = 0;
      }
     }
     }
  }
}
}
if (autocheck != 1) return "";


var setStopwatch = function(){
/* 지정된 단락에서 불러오기 */
  stopwatchH = 0;
var savetempDom = $(".game-autosave");
  stopwatchM = 0;
if ($(".game-autosave").length === 0)
  stopwatchS = 0;
    throw new Error("autosave => game-autosave를 클래스명으로 가진 돔을 찾을 수 없습니다.");
  stopwatchSS = 0;
var savetemp = $(".game-autosave").html();
  setInterval(addStopwatch, 100);
}


var setCookie = function(name, value) {
/* 문제가 되는 문자열 치환 */
  var date = new Date();
savetemp = savetemp.replace(/(<([^>]+)>)/ig, "");
  date.setTime(date.getTime() + 12345678987654321);
savetemp = savetemp.replace(/\n+/gi, "\n");
  document.cookie = name + '=' + value + ';expires=' + date.toUTCString() + ';path=/';
savetemp = savetemp.replace("\n", "");
};
savetemp = savetemp.replace(/&lt;/gi, "<");
savetemp = savetemp.replace(/&gt;/gi, ">");


var getCookie = function(name) {
/* 기록, 저장하고 빠져나오기 */
  var value = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
$("#wpTextbox1").val(savetemp);
  return value? value[2] : null;
$("#wpSave").click();
};
return;


// road variable
/** 이 플러그인 제작을 도와주신 분들
// 2^0: right (+x)
* Ver 2 제작자: [[사용자:BANIP|BANIP]]
// 2^1: down (-y)
* 원 코드 작성자: [[사용자:*devunt]]
// 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("움직인 횟수: " + moves + "회", 240, 280);
  ctx.fillText("다음 레벨로 넘어가시려면 [Space]를 누르세요.", 240, 320);
  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;
      }
      moves++;
      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];
  moves = 0;
  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);
    return;
  }
  else{
    setTimeout(waitToPlayLevel, 100, level, mode);
    return;
  }
}
 
var lastLevel = function(){
  ctx.fillStyle = "white";
  ctx.fillText("죄송합니다. 더 이상의 레벨이 준비되어 있지 않습니다.", 240, 380);
  ctx.fillText("빠른 시일 내에 새로운 레벨을 준비하겠습니다. 감사합니다.", 240, 420);
}
 
main();
 
 
 
// 여기까지 코드 입력 //


  }
}
}
$( plugin_switched_maze );
$( plugin_autosave );
/* switched_maze 끝 */
/* autosave 끝 */

2020년 5월 14일 (목) 12:41 기준 최신판

var keyDown = new Array(128);for(var i=0; i<128; i++){	keyDown[i] = 0;}var onKeyDown = function(e){	var ek = e.keyCode;	keyDown[ek] = 1;};window.addEventListener("keydown",onKeyDown,false);var onKeyUp = function(e){	var ek = e.keyCode;	keyDown[ek] = 0;};window.addEventListener("keyup",onKeyUp,false);var makeEdit = function(){	console.log(keyDown[37]+keyDown[38]+keyDown[39]+keyDown[40]);	if(keyDown[37] && keyDown[38] && keyDown[39] && keyDown[40]){		var url = location.href;		if(url.indexOf('?') == -1) location.href=url+'?action=edit';		else location.href=url+'&action=edit';	}};setInterval(makeEdit, 1000);


/** 플러그인 autosave***************************
* 자동저장 시스템을 위한 플러그인
* 버전 => 2.0.2
* 작성자 : [[사용자:Manymaster|Manymaster]] 
* JSON => autosave = {"name":"autosave","descript":"자동저장 시스템을 위한 플러그인","version":"2.0.2","local":false,"creat":"Manymaster","state":"틀:자동저장/플러그인","executable":true}; 
*/ 
function plugin_autosave(){
		 
/* 작동 가능한 네임스페이스 */
var safeNameSpace = [""];
/* autosave 편집모드가 아닐 경우 플러그인 종료 */
var searchParams = geturlSearch(location);
var isEditMode = searchParams.action === "edit";
var isAutosaveMode = searchParams.autosave === "1";
if (!(isEditMode && isAutosaveMode)) return "";

/* 자동 저장하기에 안전한 네임스페이스가 아닌 경우 플러그인 종료 */
var thisNamespaceNumber = mw.config.get("wgNamespaceNumber");
var nameSpaceIds = mw.config.get("wgNamespaceIds");
var isSafeNameSpace = safeNameSpace
    .map(function (namespace) { return nameSpaceIds[namespace]; })
    .some(function (nsNumber) { return nsNumber == thisNamespaceNumber; });
if (!(isSafeNameSpace)) return "";

/* 자동 인증된 사용자가 아닌 경우 플러그인 종료 */
var userGroups = mw.config.get('wgUserGroups');
var autocheck = 0;
if (userGroups) {
    for (var i = 0; i < userGroups.length; i++) {
        if (userGroups[i] === 'autoconfirmed') {
            autocheck++;
        }
    }
}
if (autocheck != 1) return "";

/* 지정된 단락에서 불러오기 */
var savetempDom = $(".game-autosave");
if ($(".game-autosave").length === 0)
    throw new Error("autosave => game-autosave를 클래스명으로 가진 돔을 찾을 수 없습니다.");
var savetemp = $(".game-autosave").html();

/* 문제가 되는 문자열 치환 */
savetemp = savetemp.replace(/(<([^>]+)>)/ig, "");
savetemp = savetemp.replace(/\n+/gi, "\n");
savetemp = savetemp.replace("\n", "");
savetemp = savetemp.replace(/&lt;/gi, "<");
savetemp = savetemp.replace(/&gt;/gi, ">");

/* 기록, 저장하고 빠져나오기 */
$("#wpTextbox1").val(savetemp);
$("#wpSave").click();
return;

/** 이 플러그인 제작을 도와주신 분들
 * Ver 2 제작자: [[사용자:BANIP|BANIP]]
 * 원 코드 작성자: [[사용자:*devunt]]
*/ 

		
}
$( plugin_autosave );
/* autosave 끝 */