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

리버티게임, 모두가 만들어가는 자유로운 게임
백괴게임>Bd3076
(플러그인 SimMD5설치)
백괴게임>Bd3076
(내용을 "→‎* DB기능 초기화 * [[틀:DB]]를 사용 가능하게 해 줍니다. * [[사용자:BANIP|BANIP]]: function enableLocalStorage() { // 문서 미리보기..."(으)로 바꿈)
1번째 줄: 1번째 줄:
/** DB기능 초기화
* [[틀:DB]]를 사용 가능하게 해 줍니다.
* [[사용자:BANIP|BANIP]]
*/


function enableLocalStorage() {
    // 문서 미리보기 상태일 시 종료
    if (location.pathname === "/w/index.php") return;


    //플러그인의 모든 키 순회
    function forEach(object, callback) {
        for (var key in object) {
            var variable = object[key];
            callback(variable, key);
        }
    }


    function setLocalStorage(parentKey, datas) {
        var stringKeys = JSON.stringify(Object.keys(datas));
        localStorage.setItem(parentKey + "/__keys__", stringKeys);
        forEach(datas, function(v, i) {
            if (i === "action") return;
            localStorage.setItem(parentKey + "/" + i, v);
        });
    }




/** 플러그인 switched_maze***************************
    function getLocalStorage(parentKey) {
* 스위치 미로 게임
        var datas = {};
* 버전 => 1.01
        var stringKeys = localStorage.getItem(parentKey + "/__keys__");
* 작성자 : [[사용자:Bd3076|Bd3076]]
        if (stringKeys === null) return null;
* JSON => switched_maze = {"name":"switched_maze","descript":"스위치 미로 게임","version":"1.01","local":true,"creat":"Bd3076","state":"스위치 미로/plugin","executable":true};
        var keys = JSON.parse(stringKeys);
*/
        keys.forEach(function(key) {
function plugin_switched_maze(){
            datas[key] = localStorage.getItem(parentKey + "/" + key);
  if($("[data-name='switched_maze']").length >= 1){
        })
  // 이부분에 코드 입력 //
        return datas;
 
    }
 
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 moves;


var addStopwatch = function(){
    function clearLocalStorage(parentKey) {
  stopWatchSS++;
        var datas = {};
  if(stopWatchSS == 10){
        var stringKeys = localStorage.getItem(parentKey + "/__keys__");
    stopWatchS++;
        if (stringKeys === null) return null;
    stopWatchSS = 0;
        var keys = JSON.parse(stringKeys);
    if(stopWatchS == 60){
        keys.forEach(function(key) {
      stopWatchM++;
            datas[key] = localStorage.removeItem(parentKey + "/" + key);
      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) {
     function getSearch() {
  var date = new Date();
        return geturlSearch();
  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("움직인 횟수: " + 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;
function searchParamToString(searchParamsObj){
 
var params = "?" + Object.entries(searchParamsObj)
var waitForKey = function(level, x, y, road){
.map(function(v){ return v.join("=") })
  counter++;
.join("&");
  var canPressSpace;
return encodeURI(params);
  if(levelData[level].switch_num[y][x] == 0 && levelData[level].lever[y][x] == 0){
}
    canPressSpace = 0;
  }
     function setSearch(datas) {
  else{
        var searchParams = getSearch();
    canPressSpace = 1;
        forEach(datas, function(v, i) {
  }
            searchParams[i] = v;
 
         });
  if((!keyPress[32] || !canPressSpace) &&
         location.search = searchParamToString(searchParams);
    (!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){
    function hasSearch() {
  var thisLevelData = levelData[level];
        return !(location.search === "");
  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(){
    $(".controlLocalStorage").each(function() {
  ctx.fillStyle = "white";
        var parentKey = $(this).data("key");
  ctx.fillText("죄송합니다. 더 이상의 레벨이 준비되어 있지 않습니다.", 240, 380);
        var behavior = $(this).data("behavior");
  ctx.fillText("빠른 시일 내에 새로운 레벨을 준비하겠습니다. 감사합니다.", 240, 420);
        switch (behavior) {
}
            case "세이브":
 
                if (!hasSearch()) return;
main();
                var datas = getSearch();
 
                clearLocalStorage(parentKey);
 
                setLocalStorage(parentKey, datas);
 
                break;
// 여기까지 코드 입력 //
            case "로드":
 
                if (hasSearch()) return;
                var datas = getLocalStorage(parentKey, datas);
  }
                if (datas === null) return;
 
                setSearch(datas);
}
                break;
$( plugin_switched_maze );
            case "초기화":
/* switched_maze 끝 */
            clearLocalStorage(parentKey);
 
            break;
 
        }
/** 플러그인 SimMD5***************************
    })
* 마법의 MD-5 시뮬레이터 게임에 사용되는 스크립트로, 인터페이스와 배틀시스템을 구현합니다.
* 버전 => 1.2
* 작성자 : [[사용자:Gustmd7410|Gustmd7410]]
* JSON => SimMD5 = {"name":"SimMD5","descript":"마법의 MD-5 시뮬레이터 게임에 사용되는 스크립트로, 인터페이스와 배틀시스템을 구현합니다.","version":"1.2","local":true,"creat":"Gustmd7410","state":"마법의 MD-5 시뮬레이터/플러그인","executable":true};
*/
function plugin_SimMD5(){
  if($("[data-name='SimMD5']").length >= 1){
  // 이부분에 코드 입력 //
mw.loader.using('oojs-ui-widgets').done(function() {
function prepare() {
function responsible(event) {
var button = $('#input-time .oo-ui-numberInputWidget-plusButton, #input-time .oo-ui-numberInputWidget-minusButton');
if(event.matches) {
button.css('display', 'none');
input.time.$label.css('margin-right', null);
} else {
button.css('display', 'null');
input.time.$label.css('margin-right', '30px');
}
}
function encode(string) {
return string
.replace(/&/g, '&#38;')
.replace(/</g, '&#60;')
.replace(/>/g, '&#62;')
.replace(/{/g, '&#123;')
.replace(/\|/g, '&#124;')
.replace(/=/g, '&#61;')
.replace(/}/g, '&#125;')
.replace(/\[/g, '&#91;')
.replace(/\]/g, '&#93;')
.replace(/_/g, '&#95;');
}
function cancel(btn) {
if(stat.length) {
battle.done = null;
battle.turn = 0;
battle.attack = null;
battle.sequence = null;
battle.total = null;
battle.temp = null;
bar = [];
bar[0] = new OO.ui.ProgressBarWidget({
progress: 100
});
bar[1] = new OO.ui.ProgressBarWidget({
progress: 100
});
bar[0].$bar.css({
background: '#3366CC'
});
bar[0].$element.css({
'border-right': 'none',
'border-top-right-radius': 0,
'border-bottom-right-radius': 0
});
bar[1].$bar.css({
background: '#FF5500'
});
bar[1].$element.css({
'border-left': 'none',
'border-top-left-radius': 0,
'border-bottom-left-radius': 0
});
input.start.setLabel('재시작');
input.reset.setLabel('초기화');
$('#stat-turn').text(0);
$('.stat-0.stat-currentHP').data('value', stat[0].HP).text(stat[0].HP.toFixed(2)).css('color', '#3366CC');
$('.stat-1.stat-currentHP').data('value', stat[1].HP).text(stat[1].HP.toFixed(2)).css('color', '#FF5500');
$('.stat-0.stat-HPbar').html(bar[0].$element);
$('.stat-1.stat-HPbar').html(bar[1].$element);
if(btn) $('#log')[0].innerText += '\n다시 시작하려면 재시작 버튼을 눌러주세요.';
}
}
function stop() {
clearInterval(battle.work);
$('#input-stop').hide();
$('#input-start').show();
input.reset.setDisabled(false);
input[0].setDisabled(false);
input[1].setDisabled(false);
input.time.setDisabled(false);
input.swap.setDisabled(false);
}
var input = {};
input[0] = new OO.ui.TextInputWidget({
placeholder: '선',
title: '후',
value: new URLSearchParams(location.search).get('p0') || ''
});
input.start = new OO.ui.ButtonInputWidget({
type: 'submit',
flags: ['primary', 'progressive'],
label: '시작'
});
input.stop = new OO.ui.ButtonInputWidget({
flags: ['primary', 'destructive'],
label: '정지'
});
input[1] = new OO.ui.TextInputWidget({
placeholder: '후',
title: '후',
value: new URLSearchParams(location.search).get('p1') || ''
});
input.time = new OO.ui.NumberInputWidget({
value: 1,
min: 0,
label: '초 간격'
});
input.reset = new OO.ui.ButtonInputWidget({
type: 'reset',
flags: ['destructive'],
label: '초기화'
});
input.swap = new OO.ui.ButtonInputWidget({
label: $('<div />').css({
height: '20px',
width: '20px',
'background-image': 'url("/wiki/Special:Redirect/file/Ambox_move_black.svg")',
'background-size': 'cover'
}),
title: '교체',
framed: false
});
input.table = new OO.ui.ToggleSwitchWidget({
value: true
});
input.icon = new OO.ui.ButtonWidget({
framed: false,
icon: $('#mw-customcollapsible-input-option').hasClass('mw-collapsed')? 'expand' : 'collapse'
});
input.log = new OO.ui.ButtonWidget({
label: '기록 복사'
});
input.url = new OO.ui.ButtonWidget({
label: 'URL 복사'
});
input.box = new OO.ui.MultilineTextInputWidget();
var media = matchMedia('(max-width: 800px)');
var stat = [];
var bar = [];
var battle = {
turn: 0,
attack: null,
done: null,
work: null,
sequence: null,
total: null,
temp: null
};
$('#input').wrap('<form />');
$('#input-0').html(input[0].$element);
$('#input-start').html(input.start.$element);
$('#input-stop').html(input.stop.$element);
$('#input-1').html(input[1].$element);
$('#input-time').html(input.time.$element);
$('#input-reset').html(input.reset.$element);
$('#input-swap').html(input.swap.$element);
$('#input-table').html(input.table.$element).append(' 스탯');
$('#input-icon').html(input.icon.$element);
$('#stat-load').html(new OO.ui.ProgressBarWidget().$element);
$('#log').text('시작하시려면 상단에 대결할 상대의 이름을 입력해 주세요.');
$('#share-log').html(input.log.$element);
$('#share-url').html(input.url.$element);
$('#share-cvbox').html(input.box.$element);
input.box.$input.attr('readonly', '').css('height', '2.5em');
$('#stat-bar').hide();
$('#share').hide();
responsible(media);
media.addListener(responsible);
new MutationObserver(function(mutation) {
input.icon.setIcon($(mutation[0].target).hasClass('mw-collapsed')? 'expand' : 'collapse');
}).observe($('#mw-customcollapsible-input-option')[0], {
attributes: true,
attributeFilter: ['class']
});
input.swap.$element.click(function() {
if(!input.swap.disabled) {
var val = [input[1].value, input[0].value];
input[0].setValue(val[0]);
input[1].setValue(val[1]);
if(stat.length) {
stat = [stat[1], stat[0]];
$('#stat-turn').text(0);
$('.stat-0').each(function() {
if($(this).hasClass('stat-name')) $(this).text(stat[0].name);
else if($(this).hasClass('stat-attack')) $(this).text(stat[0].attack);
else if($(this).hasClass('stat-quick')) $(this).text(stat[0].quick);
else if($(this).hasClass('stat-defense')) $(this).text(stat[0].defense);
else if($(this).hasClass('stat-hit')) $(this).text(stat[0].hit);
else if($(this).hasClass('stat-luck')) $(this).text(stat[0].luck);
else if($(this).hasClass('stat-fullHP')) $(this).text(stat[0].HP);
else if($(this).hasClass('stat-currentHP')) $(this).data('value', stat[0].HP).text(stat[0].HP.toFixed(2));
else if($(this).hasClass('stat-HPbar')) $(this).html(bar[0].$element);
});
$('.stat-1').each(function() {
if($(this).hasClass('stat-name')) $(this).text(stat[1].name);
else if($(this).hasClass('stat-attack')) $(this).text(stat[1].attack);
else if($(this).hasClass('stat-quick')) $(this).text(stat[1].quick);
else if($(this).hasClass('stat-defense')) $(this).text(stat[1].defense);
else if($(this).hasClass('stat-hit')) $(this).text(stat[1].hit);
else if($(this).hasClass('stat-luck')) $(this).text(stat[1].luck);
else if($(this).hasClass('stat-fullHP')) $(this).text(stat[1].HP);
else if($(this).hasClass('stat-currentHP')) $(this).data('value', stat[1].HP).text(stat[1].HP.toFixed(2));
else if($(this).hasClass('stat-HPbar')) $(this).html(bar[1].$element);
});
var url = new URL(location);
url.searchParams.set('p0', input[0].value);
url.searchParams.set('p1', input[1].value);
history.replaceState(null, '', url);
cancel();
input.start.setLabel('시작');
}
}
});
input.table.$element.click(function() {
if(input.table.value) {
if($('#stat-turn').text()) $('#stat-table').show(500);
} else {
$('#stat-table').hide(500);
}
});
input.reset.$button[0].form.addEventListener('reset', function(event) {
event.preventDefault();
if(!input.reset.disabled) {
if(battle.done || battle.done === null) {
var url = new URL(location);
url.searchParams['delete']('p0');
url.searchParams['delete']('p1');
history.replaceState(null, '', url);
stat = [];
input[0].setValue();
input[1].setValue();
input.time.setValue(1);
input.table.setValue(true);
input.start.setLabel('시작');
$('#share').hide();
$('#share-cvbox').hide();
$('#stat-table').hide(500);
$('#stat-bar').hide(500);
$('#stat-turn, .stat-0, .stat-1').text('');
$('#log-time').hide();
$('#log').show();
$('#log').text('시작하시려면 상단에 대결할 상대의 이름을 입력해 주세요.');
$('.stat-HPbar').html('');
} else cancel(true);
}
});
input.start.$button[0].form.addEventListener('submit', function(event) {
function last() {
$('#input-stop').show();
$('#input-start').hide();
input.reset.setLabel('취소');
input[0].setDisabled(true);
input[1].setDisabled(true);
input.time.setDisabled(true);
input.reset.setDisabled(true);
input.swap.setDisabled(true);
input.start.setLabel('재개');
battle.work = start(battle, stat.map(function(obj, index) {
return new Proxy(obj, {
get: function(target, key, receiver) {
if(key === 'HP') return +$('.stat-' + index + '.stat-currentHP').data('value');
else return Reflect.get(target, key, receiver);
},
set: function(target, key, value) {
if(key === 'HP') {
if(value < 0) {
value = 0;
$('.stat-' + index + '.stat-currentHP').css('color', '#000000');
}
$('.stat-' + index + '.stat-currentHP').data('value', value).text(value.toFixed(2));
bar[index].setProgress(value / target.HP * 100);
}
}
});
}), input.time.value * 1000, function(msg) {
$('#log')[0].innerText += msg;
$('#log').scrollTop($('#log')[0].scrollHeight);
if(battle.sequence === 0) {
$('#stat-turn').text(battle.turn);
$('.stat-' + battle.attack + '.stat-name').css({
background: battle.attack? '#FF5500' : '#3366CC',
color: '#FFFFFF'
});
$('.stat-' + (battle.attack ^ 1) + '.stat-name').css({
background: '#EAECF0',
color: battle.attack? '#3366CC' : '#FF5500'
});
}
}, function(msg) {
$('#log')[0].innerText += msg;
$('#log')[0].innerText += '\n\n백괴스러운 MD-5 시뮬레이터 [https://game.uncyclopedia.kr/wiki/마법의_MD-5_시뮬레이터]';
$('#log').scrollTop($('#log')[0].scrollHeight);
$('#share').show();
stop();
battle.done = true;
battle.turn = 0;
battle.attack = null;
battle.sequence = null;
battle.total = null;
battle.temp = null;
input.start.setLabel('재시작');
input.reset.setLabel('초기화');
});
}
event.preventDefault();
if(!input.start.disabled) {
$('#share').hide();
$('#share-cvbox').hide();
if(input.time.value >= 0) {
$('#log-time').hide();
$('#log').show();
if(!stat.length) $.get({
url: '/w/api.php',
data: {
action: 'parse',
format: 'json',
title: '마법의 MD-5 시뮬레이터',
text: '[{{#invoke:SimMD5|stat|' + encode(input[0].value) + '|AJAX}},{{#invoke:SimMD5|stat|' + encode(input[1].value) + '|AJAX}}]',
prop: 'text',
disablelimitreport: true,
formatversion: 2
},
beforeSend: function() {
if($('#stat-bar').html()) {
$('#stat-bar').hide();
$('#stat-load').show();
} else $('#stat-load').show(500);
$('#log').text('스탯 계산중입니다. 잠시만 기다려 주세요.');
var url = new URL(location);
url.searchParams.set('p0', input[0].value);
url.searchParams.set('p1', input[1].value);
history.replaceState(null, '', url);
},
success: function(callback) {
stat = JSON.parse($(callback.parse.text).text());
bar = [];
bar[0] = new OO.ui.ProgressBarWidget({
progress: 100
});
bar[1] = new OO.ui.ProgressBarWidget({
progress: 100
});
bar[0].$bar.css({
background: '#3366CC'
});
bar[0].$element.css({
'border-right': 'none',
'border-top-right-radius': 0,
'border-bottom-right-radius': 0
});
bar[1].$bar.css({
background: '#FF5500'
});
bar[1].$element.css({
'border-left': 'none',
'border-top-left-radius': 0,
'border-bottom-left-radius': 0
});
$('#stat-turn').text(0);
$('.stat-0').each(function() {
if($(this).hasClass('stat-name')) $(this).text(stat[0].name);
else if($(this).hasClass('stat-attack')) $(this).text(stat[0].attack);
else if($(this).hasClass('stat-quick')) $(this).text(stat[0].quick);
else if($(this).hasClass('stat-defense')) $(this).text(stat[0].defense);
else if($(this).hasClass('stat-hit')) $(this).text(stat[0].hit);
else if($(this).hasClass('stat-luck')) $(this).text(stat[0].luck);
else if($(this).hasClass('stat-fullHP')) $(this).text(stat[0].HP);
else if($(this).hasClass('stat-currentHP')) $(this).data('value', stat[0].HP).text(stat[0].HP.toFixed(2));
else if($(this).hasClass('stat-HPbar')) $(this).html(bar[0].$element);
});
$('.stat-1').each(function() {
if($(this).hasClass('stat-name')) $(this).text(stat[1].name);
else if($(this).hasClass('stat-attack')) $(this).text(stat[1].attack);
else if($(this).hasClass('stat-quick')) $(this).text(stat[1].quick);
else if($(this).hasClass('stat-defense')) $(this).text(stat[1].defense);
else if($(this).hasClass('stat-hit')) $(this).text(stat[1].hit);
else if($(this).hasClass('stat-luck')) $(this).text(stat[1].luck);
else if($(this).hasClass('stat-fullHP')) $(this).text(stat[1].HP);
else if($(this).hasClass('stat-currentHP')) $(this).data('value', stat[1].HP).text(stat[1].HP.toFixed(2));
else if($(this).hasClass('stat-HPbar')) $(this).html(bar[1].$element);
});
$('.stat-0.stat-currentHP').css('color', '#3366CC');
$('.stat-1.stat-currentHP').css('color', '#FF5500');
$('#stat-load').hide();
if(input.table.value) $('#stat-table').show(500);
$('#stat-bar').show();
$('#log').text('');
$('#log')[0].innerText += '[' + stat[0].name + '] 공격력: ' + stat[0].attack + ' / 방어력: ' + stat[0].defense + ' / 민첩: ' + stat[0].quick + ' / 명중: ' + stat[0].quick + ' / 운: ' + stat[0].luck + ' / HP: ' + stat[0].HP + '\n';
$('#log')[0].innerText += '[' + stat[1].name + '] 공격력: ' + stat[1].attack + ' / 방어력: ' + stat[1].defense + ' / 민첩: ' + stat[1].quick + ' / 명중: ' + stat[1].quick + ' / 운: ' + stat[1].luck + ' / HP: ' + stat[1].HP + '\n';
$('#log')[0].innerText += '\n';
battle.turn = 1;
battle.done = false;
battle.attack = 0;
battle.sequence = 0;
battle.total = [50, 50];
battle.temp = {};
last();
},
error: function(error) {
$('#stat-load').hide(500);
$('#log').text('스탯 계산에 오류가 발생하였습니다. 다시 시도해 주십시오. (' + error.status + ')');
}
});
else if(battle.done || battle.done === null) {
if(battle.done) cancel();
$('#log').text('');
$('#log')[0].innerText += '[' + stat[0].name + '] 공격력: ' + stat[0].attack + ' / 방어력: ' + stat[0].defense + ' / 민첩: ' + stat[0].quick + ' / 명중: ' + stat[0].quick + ' / 운: ' + stat[0].luck + ' / HP: ' + stat[0].HP + '\n';
$('#log')[0].innerText += '[' + stat[1].name + '] 공격력: ' + stat[1].attack + ' / 방어력: ' + stat[1].defense + ' / 민첩: ' + stat[1].quick + ' / 명중: ' + stat[1].quick + ' / 운: ' + stat[1].luck + ' / HP: ' + stat[1].HP + '\n';
$('#log')[0].innerText += '\n';
battle.turn = 1;
battle.done = false;
battle.attack = 0;
battle.sequence = 0;
battle.total = [50, 50];
battle.temp = {};
last();
} else last();
} else {
$('#log-time').show();
$('#log').hide();
}
}
});
input.stop.$element.click(function() {
if(!input.stop.disabled) stop();
});
input[0].$input.focus(function() {
cancel();
stat = [];
input.start.setLabel('시작');
$(this).select();
});
input[1].$input.focus(function() {
cancel();
stat = [];
input.start.setLabel('시작');
$(this).select();
});
input.log.$button.click(function() {
input.box.setValue($('#log').text());
$('#share-cvbox').show();
input.box.$input.select();
document.execCommand('copy');
});
input.url.$button.click(function() {
input.box.setValue(location);
$('#share-cvbox').show();
input.box.$input.select();
document.execCommand('copy');
});
input.box.$input.click(function() {
$(this).select();
});
}
function start(battle, stat, time, each, last) {
function rand(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}
function range(weight) {
        var range = [-0.5, -0.25, 0, 0.25, 0.5].map(function(ratio, index) {
        return 20 + (weight - 50) * ratio;
        });
        range.reduce(function(acc, current, index, prob) {
        return prob[index] += acc;
        });
        return range;
}
    function rank(range, val) {
        return range.findIndex(function(current, index) {
        return (index === 0 || range[index - 1] < val) && val <= current;
        });
    }
   
function power(stat, rank) {
    return stat * (((rank === 0)? 0 : rand(1 + 25 * (rank - 1), 25 * rank)) / 100);
}
function bonus(plus, minus, rank) {
rank -= 2;
if(rank === 0) return 0;
    return ((rank)? plus : minus) * (rand(1 + 50 * (rank - 1), 50 * rank) / 100);
}
function josa(text, exist, not, only) {
text = text.normalize('NFD');
var code = text.charCodeAt(text.length - 1);
if(0x1161 <= code && code <= 0x11A7) return ((only)? '' : text) + not;
else if(0x11A8 <= code && code <= 0x11FF) return ((only)? '' : text) + exist;
else return ((only)? '' : text) + exist + '(' + not + ')';
}
return setInterval(function() {
var attacker = battle.attack;
var defender = attacker ^ 1;
if(stat[0].HP > 0 && stat[1].HP > 0) {
switch(battle.sequence) {
case 0:
var scale = range(stat[attacker].luck);
var adv = bonus(stat[attacker].hit, stat[defender].quick, rank(range(50), battle.total[attacker]));
var grade = {
attack: rank(scale, rand(1, 100)),
defense: rank(range(stat[defender].luck), rand(1, 100)),
bonus: adv === 0 && 0 || (adv)? 1 : -1
};
var damage = power(stat[attacker].attack, grade.attack) - power(stat[defender].defense, grade.defense) + adv;
battle.temp = {
rank: rank(scale, damage),
damage: (damage > 0)? damage : 0
};
if(battle.temp.damage > stat[attacker].attack) battle.temp.rank = 5;
if(battle.temp.damage > 0) {
if(battle.total[attacker] > 50) {
battle.total[attacker] = 50;
battle.total[defender] = 50;
} else {
battle.total[attacker]--;
battle.total[defender]++;
}
} else {
if(battle.total[attacker] < 50) {
battle.total[attacker] = 50;
battle.total[defender] = 50;
} else {
battle.total[attacker]++;
battle.total[defender]--;
}
}
each('[' + stat[attacker].name + ']의 공격 ');
battle.sequence++;
break;
case 1:
var rankText = ['MISS', 'HIT', 'GOOD', 'NICE', 'PERFECT', 'CRITICAL'][battle.temp.rank];
each(rankText + '! ');
battle.sequence++;
break;
case 2:
stat[defender].HP -= battle.temp.damage;
var msg = (battle.temp.rank === 0)? '공격을 피했다.' : (+battle.temp.damage.toFixed(2)) + '의 대미지를 받았다.';
each('[' + stat[defender].name + ']' + josa(stat[defender].name, '은', '는', true) + ' ' + msg + ' (남은 HP: ' + (+stat[defender].HP.toFixed(2)) + ')\n');
if(attacker === 1) battle.turn++;
battle.sequence = 0;
battle.attack = defender;
break;
}
} else last('\n[' + stat[defender].name + '] 승! (' + battle.turn + '턴)');
}, time);
}
$(prepare);
});
// 여기까지 코드 입력 //


  }


}
}
$( plugin_SimMD5 );
$(enableLocalStorage);
/* SimMD5 끝 */

2018년 11월 1일 (목) 18:06 판

/** DB기능 초기화
 * [[틀:DB]]를 사용 가능하게 해 줍니다.
 * [[사용자:BANIP|BANIP]]
 */

function enableLocalStorage() {
    // 문서 미리보기 상태일 시 종료
    if (location.pathname === "/w/index.php") return;

    //플러그인의 모든 키 순회
    function forEach(object, callback) {
        for (var key in object) {
            var variable = object[key];
            callback(variable, key);
        }
    }

    function setLocalStorage(parentKey, datas) {
        var stringKeys = JSON.stringify(Object.keys(datas));
        localStorage.setItem(parentKey + "/__keys__", stringKeys);
        forEach(datas, function(v, i) {
            if (i === "action") return;
            localStorage.setItem(parentKey + "/" + i, v);
        });
    }


    function getLocalStorage(parentKey) {
        var datas = {};
        var stringKeys = localStorage.getItem(parentKey + "/__keys__");
        if (stringKeys === null) return null;
        var keys = JSON.parse(stringKeys);
        keys.forEach(function(key) {
            datas[key] = localStorage.getItem(parentKey + "/" + key);
        })
        return datas;
    }

    function clearLocalStorage(parentKey) {
        var datas = {};
        var stringKeys = localStorage.getItem(parentKey + "/__keys__");
        if (stringKeys === null) return null;
        var keys = JSON.parse(stringKeys);
        keys.forEach(function(key) {
            datas[key] = localStorage.removeItem(parentKey + "/" + key);
        })
    }

    function getSearch() {
        return geturlSearch();
    }

	function searchParamToString(searchParamsObj){
		var params = "?" + Object.entries(searchParamsObj)
			.map(function(v){ return v.join("=") })
			.join("&");
		return encodeURI(params);
	}
	
    function setSearch(datas) {
        var searchParams = getSearch();
        forEach(datas, function(v, i) {
            searchParams[i] = v;
        });
        location.search = searchParamToString(searchParams);
    }

    function hasSearch() {
        return !(location.search === "");
    }

    $(".controlLocalStorage").each(function() {
        var parentKey = $(this).data("key");
        var behavior = $(this).data("behavior");
        switch (behavior) {
            case "세이브":
                if (!hasSearch()) return;
                var datas = getSearch();
                clearLocalStorage(parentKey);
                setLocalStorage(parentKey, datas);
                break;
            case "로드":
                if (hasSearch()) return;
                var datas = getLocalStorage(parentKey, datas);
                if (datas === null) return;
                setSearch(datas);
                break;
            case "초기화":
            	clearLocalStorage(parentKey);
            	break;
        }
    })


}
$(enableLocalStorage);