본문으로 이동

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

리버티게임, 모두가 만들어가는 자유로운 게임
Jinhoftyu (토론 | 기여)
편집 요약 없음
태그: 되돌려진 기여
Jinhoftyu (토론 | 기여)
편집 요약 없음
태그: 되돌려진 기여
17번째 줄: 17번째 줄:
});
});


class Item {
function Item(type, name, value) {
  constructor(type, name, value) {
  this.type = type;
    this.type = type;
  this.name = name;
    this.name = name;
  this.value = value;
    this.value = value;
  }
}
}


class Entity {
function Entity(type, name, x, y, health) {
  constructor(type, name, x, y, health) {
  this.type = type;
    this.type = type;
  this.name = name;
    this.name = name;
  this.x = x;
    this.x = x;
  this.y = y;
    this.y = y;
  this.health = health;
    this.health = health;
  }
 
  getAttack() {
    return getAttack(this.name);
  }
}
}


const rand = new (function() {
const rand = new (function () {
   const seed = new Date().getTime();
   var seed = new Date().getTime();
   this.nextInt = (n) => Math.floor(Math.random() * n);
   this.nextInt = function (n) {
   this.seed = (s) => {};
    return Math.floor(Math.random() * n);
  };
   this.seed = function (s) {};
})();
})();


48번째 줄: 42번째 줄:
let mapY = 20;
let mapY = 20;
let mapX = 80;
let mapX = 80;
const base = new Array(mapY).fill(null).map(() => new Array(mapX).fill(null));
const base = new Array(mapY).fill(null).map(function () {
const entity = new Array(mapY).fill(null).map(() => new Array(mapX).fill(null));
  return new Array(mapX).fill(null);
});
const entity = new Array(mapY).fill(null).map(function () {
  return new Array(mapX).fill(null);
});
const entities = [];
const entities = [];
const item = [];
const item = [];
74번째 줄: 72번째 줄:
}
}


async function main() {
function main() {
   for (let i = 0; i < mapY; i++) {
   for (var i = 0; i < mapY; i++) {
     const row = [];
     var row = [];
     for (let j = 0; j < mapX; j++) {
     for (var j = 0; j < mapX; j++) {
       row.push([]);
       row.push([]);
     }
     }
83번째 줄: 81번째 줄:
   }
   }


   while (name === null) {
   askQuestion('Your name?').then(function (nameInput) {
     name = await askQuestion('Your name?');
     name = nameInput;
   }
    chooseRole();
   });
}


   while (!game) {
function chooseRole() {
     const roleInput = await askQuestion(`
   if (name === null) {
     askQuestion(`
                     Your role?
                     Your role?
                     a) Monk
                     a) Monk
                     b) Ranger
                     b) Ranger
                     c) Valkryie
                     c) Valkryie
                     d) Wizard`);
                     d) Wizard`).then(function (roleInput) {
    preset(roleInput);
       preset(roleInput);
  }
     });
 
  mapGen();
 
  while (game) {
    if (showInv) {
      inventory();
      await askQuestion('');
    } else {
      display();
      const cmd = (await askQuestion('')).split(' ');
      switch (cmd[0]) {
        case '.':
          turn();
          break;
        case 'h':
          move(pl, -1, 0);
          break;
        case 'l':
          move(pl, 1, 0);
          break;
        case 'j':
          move(pl, 0, -1);
          break;
        case 'k':
          move(pl, 0, 1);
          break;
        case 'y':
          move(pl, -1, -1);
          break;
        case 'u':
          move(pl, 1, -1);
          break;
        case 'b':
          move(pl, -1, 1);
          break;
        case 'n':
          move(pl, 1, 1);
          break;
        case '<':
          ascend();
          break;
        case ',':
          pickup();
          break;
        case 'i':
          showInv = true;
          break;
        case 'Q':
          process.exit(0);
          break;
       }
    }
  }
}
 
function updateStack(x, y, items) {
  item[y][x] = items;
}
 
async function pickup() {
  const plx = pl.x;
  const ply = pl.y;
  const items = item[ply][plx];
  if (items.length > 0) {
    const i = items[0];
     inv.push(i);
    items.shift();
    updateStack(plx, ply, items);
    log.push(`You picked up ${itemName(i)}.`);
    turn();
   } else {
   } else {
     log.push('There is nothing here.');
     preset(null);
   }
   }
}
}


function ascend() {
function preset(s) {
   const plx = pl.x;
   switch (s) {
  const ply = pl.y;
    case 'a':
  if (base[ply][plx] === '<') {
      role = 'Monk';
     console.log('You escaped from the dungeon.');
      maxhp = 20;
    process.exit(0);
      maxpw = 10;
  } else {
      break;
     log.push("You can't go up here.");
    case 'b':
      role = 'Ranger';
      maxhp = 15;
      maxpw = 5;
      break;
    case 'c':
      role = 'Valkriye';
      maxhp = 20;
      maxpw = 5;
      break;
     case 'd':
      role = 'Wizard';
      maxhp = 15;
      maxpw = 15;
      break;
     default:
      return;
   }
   }
}
   xl = 1;
 
   hp = maxhp;
function itemName(i) {
   pw = maxpw;
   return `${i.value} ${i.name}${i.value > 1 ? 's' : ''}`;
   game = true;
}
   mapGen();
 
async function move(en, dx, dy) {
   const x = en.x;
   const y = en.y;
   if (base[y + dy][x + dx] !== '#' && entity[y + dy][x + dx] === null) {
    entity[y][x] = null;
    en.x += dx;
    en.y += dy;
    const floor = base[en.y][en.x];
    entity[en.y][en.x] = en;
    const items = item[en.y][en.x];
 
    // log output
    if (en === pl) {
      turn();
      if (floor !== '.' && floor !== '\0') {
        log.push(`You are standing in ${floorDes(floor)}.`);
      }
      if (items.length > 1) {
        log.push('You see here several items.');
      } else if (items.length > 0) {
        const i = items[0];
        log.push(`You see here ${itemName(i)}.`);
      }
    }
   }
}
 
async function turn() {
  for (const e of entities) {
    if (e !== pl) {
      if (adjacent(e, pl)) {
        attack(e, pl);
      } else {
        switch (rand.nextInt(8)) {
          case 0:
            move(e, -1, 0);
            break;
          case 1:
            move(e, 1, 0);
            break;
          case 2:
            move(e, 0, -1);
            break;
          case 3:
            move(e, 0, 1);
            break;
          case 4:
            move(e, -1, -1);
            break;
          case 5:
            move(e, 1, -1);
            break;
          case 6:
            move(e, -1, 1);
            break;
          case 7:
            move(e, 1, 1);
            break;
        }
      }
    }
  }
  time++;
}
}


function mapGen() {
function mapGen() {
   for (let y = 0; y < mapY; y++) {
   for (var y = 0; y < mapY; y++) {
     for (let x = 0; x < mapX; x++) {
     for (var x = 0; x < mapX; x++) {
       // old mapgen
       // old mapgen
       const xborder = (y === 1 || y === mapY - 2) && (x !== 0 && x !== mapX - 1);
       var xborder = (y === 1 || y === mapY - 2) && (x !== 0 && x !== mapX - 1);
       const yborder = (x === 1 || x === mapX - 2) && (y !== 0 && y !== mapY - 1);
       var yborder = (x === 1 || x === mapX - 2) && (y !== 0 && y !== mapY - 1);
       const floor = y > 1 && y < mapY - 2 && x > 1 && x < mapX - 2;
       var floor = y > 1 && y < mapY - 2 && x > 1 && x < mapX - 2;
       const up = x === 2 && y === 2;
       var up = x === 2 && y === 2;
       const down = x === mapX - 3 && y === mapY - 3;
       var down = x === mapX - 3 && y === mapY - 3;
       if (xborder || yborder) {
       if (xborder || yborder) {
         base[y][x] = '#';
         base[y][x] = '#';
272번째 줄: 155번째 줄:
       // item
       // item
       if (base[y][x] === '.' && rand.nextInt(80) === 0) {
       if (base[y][x] === '.' && rand.nextInt(80) === 0) {
         const items = [];
         var items = [];
         items.push(
         items.push(
           (() => {
           (function () {
             switch (rand.nextInt(6)) {
             switch (rand.nextInt(6)) {
               case 0:
               case 0:
298번째 줄: 181번째 줄:
       // entity
       // entity
       if (base[y][x] === '.' && rand.nextInt(100) === 0) {
       if (base[y][x] === '.' && rand.nextInt(100) === 0) {
         const e = (() => {
         var e = (function () {
           switch (rand.nextInt(5)) {
           switch (rand.nextInt(5)) {
             case 0:
             case 0:
321번째 줄: 204번째 줄:
   pl = new Entity('@', name, 2, 2, hp);
   pl = new Entity('@', name, 2, 2, hp);
   entity[2][2] = pl;
   entity[2][2] = pl;
  startGame();
}
}


340번째 줄: 224번째 줄:
}
}


function getAttack(s) {
function startGame() {
   switch (s) {
   var showInv = false;
     case 'bat':
 
    case 'goblin':
  function updateStack(x, y, items) {
    case 'kobold':
     item[y][x] = items;
      return 4;
    case 'sewer rat':
      return 3;
    case 'Demogorgon':
      return 48;
    default:
      return 1;
   }
   }
}


function adjacent(a, b) {
  function pickup() {
  return Math.abs(a.x - b.x) <= 1 && Math.abs(a.y - b.y) <= 1;
    var plx = pl.x;
}
    var ply = pl.y;
    var items = item[ply][plx];
    if (items.length > 0) {
      var i = items[0];
      inv.push(i);
      items.shift();
      updateStack(plx, ply, items);
      log.push('You picked up ' + itemName(i) + '.');
      turn();
    } else {
      log.push('There is nothing here.');
    }
  }


function attack(damager, damagee) {
  function ascend() {
  const dam = damager.getAttack();
    var plx = pl.x;
  const health = damagee.health;
    var ply = pl.y;
  if (damagee === pl) {
    if (base[ply][plx] === '<') {
    log.push(`The ${damager.name} hits!`);
      console.log('You escaped from the dungeon.');
    hp -= dam;
      process.exit(0);
  } else if (damager === pl) {
    } else {
    log.push(`You hit the ${damagee.name}`);
      log.push("You can't go up here.");
    }
   }
   }
   if (dam >= health) {
 
     death(damagee);
   function itemName(i) {
  } else {
     return i.value + ' ' + i.name + (i.value > 1 ? 's' : '');
    damagee.health -= dam;
   }
   }
}


function death(e) {
  function move(en, dx, dy) {
  if (e === pl) {
    var x = en.x;
    log.push('You were slain...');
    var y = en.y;
    refLog();
    if (base[y + dy][x + dx] !== '#' && entity[y + dy][x + dx] === null) {
    display();
      entity[y][x] = null;
    process.exit(0);
      en.x += dx;
  } else {
      en.y += dy;
    entities.splice(entities.indexOf(e), 1);
      var floor = base[en.y][en.x];
    entity[e.y][e.x] = null;
      entity[en.y][en.x] = en;
    log.push(`${e.name} died!`);
      var items = item[en.y][en.x];
 
      // log output
      if (en === pl) {
        turn();
        if (floor !== '.' && floor !== '\0') {
          log.push('You are standing in ' + floorDes(floor) + '.');
        }
        if (items.length > 1) {
          log.push('You see here several items.');
        } else if (items.length > 0) {
          var i = items[0];
          log.push('You see here ' + itemName(i) + '.');
        }
      }
    }
   }
   }
}


async function display() {
  function turn() {
  await clearConsole();
     for (var i = 0; i < entities.length; i++) {
  let display = '';
       var e = entities[i];
  for (let y = 0; y < mapY; y++) {
       if (e !== pl) {
     for (let x = 0; x < mapX; x++) {
        if (adjacent(e, pl)) {
       const floor = base[y][x];
          attack(e, pl);
       const it = item[y][x];
        } else {
      const en = entity[y][x];
          switch (rand.nextInt(8)) {
      let s = ' ';
            case 0:
      if (floor !== '\0') {
              move(e, -1, 0);
         s = floor;
              break;
            case 1:
              move(e, 1, 0);
              break;
            case 2:
              move(e, 0, -1);
              break;
            case 3:
              move(e, 0, 1);
              break;
            case 4:
              move(e, -1, -1);
              break;
            case 5:
              move(e, 1, -1);
              break;
            case 6:
              move(e, -1, 1);
              break;
            case 7:
              move(e, 1, 1);
              break;
          }
         }
       }
       }
      if (it.length > 0) {
        s = it[0].type;
      }
      if (en !== null) {
        s = en.type;
      }
      display += s;
     }
     }
     display += '\n';
     time++;
  }
 
  function floorDes(c) {
    switch (c) {
      case '<':
        return 'staircase leading upward';
      case '>':
        return 'staircase leading downward';
      default:
        return 'nothing';
    }
  }
 
  function getAttack(s) {
    switch (s) {
      case 'bat':
      case 'goblin':
      case 'kobold':
        return 4;
      case 'sewer rat':
        return 3;
      case 'Demogorgon':
        return 48;
      default:
        return 1;
    }
  }
 
  function adjacent(a, b) {
    return Math.abs(a.x - b.x) <= 1 && Math.abs(a.y - b.y) <= 1;
  }
 
  function attack(damager, damagee) {
    var dam = damager.getAttack();
    var health = damagee.health;
    if (damagee === pl) {
      log.push('The ' + damager.name + ' hits!');
      hp -= dam;
    } else if (damager === pl) {
      log.push('You hit the ' + damagee.name);
    }
    if (dam >= health) {
      death(damagee);
    } else {
      damagee.health -= dam;
    }
   }
   }
  refLog();
  log.forEach((line) => {
    display += line + '\n';
  });
  display += `${name} the ${role} t:${time}\nDlvl:${dl} Lv:${xl} HP:${hp}/${maxhp} Pw:${pw}/${maxpw}\n\n`;
  console.log(display);
}


async function inventory() {
  function death(e) {
  await clearConsole();
    if (e === pl) {
  let display = '';
      log.push('You were slain...');
  let c = 97;
      refLog();
  display += 'Your inventory:\n';
      display();
  if (inv.length === 0) {
      process.exit(0);
     display += "It's empty.\n";
     } else {
  } else {
      entities.splice(entities.indexOf(e), 1);
    for (const i of inv) {
       entity[e.y][e.x] = null;
       display += `${String.fromCharCode(c)}) ${itemName(i)}\n`;
       log.push(e.name + ' died!');
       c++;
     }
     }
   }
   }
  display += '\nType any command...\n';
  console.log(display);
  showInv = false;
}


function preset(s) {
  function display() {
  switch (s) {
    clearConsole().then(function () {
    case 'a':
      var display = '';
       role = 'Monk';
       for (var y = 0; y < mapY; y++) {
      maxhp = 20;
        for (var x = 0; x < mapX; x++) {
      maxpw = 10;
          var floor = base[y][x];
      break;
          var it = item[y][x];
    case 'b':
          var en = entity[y][x];
       role = 'Ranger';
          var s = ' ';
       maxhp = 15;
          if (floor !== '\0') {
       maxpw = 5;
            s = floor;
       break;
          }
     case 'c':
          if (it.length > 0) {
       role = 'Valkriye';
            s = it[0].type;
       maxhp = 20;
          }
       maxpw = 5;
          if (en !== null) {
      break;
            s = en.type;
    case 'd':
          }
       role = 'Wizard';
          display += s;
       maxhp = 15;
        }
       maxpw = 15;
        display += '\n';
      break;
      }
     default:
      refLog();
      return;
       log.forEach(function (line) {
        display += line + '\n';
       });
       display +=
        name +
        ' the ' +
        role +
        ' t:' +
        time +
        '\nDlvl:' +
        dl +
        ' Lv:' +
        xl +
        ' HP:' +
        hp +
        '/' +
        maxhp +
        ' Pw:' +
        pw +
        '/' +
        maxpw +
        '\n\n';
       console.log(display);
     });
  }
 
  function inventory() {
    clearConsole().then(function () {
      var display = '';
      var c = 97;
       display += 'Your inventory:\n';
       if (inv.length === 0) {
        display += "It's empty.\n";
       } else {
        for (var i = 0; i < inv.length; i++) {
          var item = inv[i];
          display += String.fromCharCode(c) + ') ' + itemName(item) + '\n';
          c++;
        }
      }
       display += '\nType any command...\n';
       console.log(display);
       showInv = false;
     });
   }
   }
  xl = 1;
  hp = maxhp;
  pw = maxpw;
  game = true;
}


function floorDes(c) {
  function askQuestion(question) {
  switch (c) {
    return new Promise(function (resolve) {
    case '<':
      rl.question(question, function (answer) {
      return 'staircase leading upward';
        resolve(answer);
    case '>':
       });
       return 'staircase leading downward';
     });
     default:
      return 'nothing';
   }
   }
}


function askQuestion(question) {
  function clearConsole() {
  return new Promise((resolve) => {
    return new Promise(function (resolve) {
    rl.question(question, (answer) => {
      console.clear();
       resolve(answer);
       resolve();
     });
     });
   });
   }
}
 
  function updateStack(x, y, items) {
    item[y][x] = items;
  }


function clearConsole() {
   main();
   return new Promise((resolve) => {
    console.clear();
    resolve();
  });
}
}
main();


}
}

2023년 10월 18일 (수) 15:12 판

/** 플러그인 uncydungeon***************************
* uncydungeon 실행
* 버전 => 0.1
* 작성자 : [[사용자:Jinhoftyu|Jinhoftyu]] 
* JSON => uncydungeon = {"name":"uncydungeon","descript":"uncydungeon 실행","version":"0.1","local":true,"creat":"Jinhoftyu","state":"사용자:Jinhoftyu/Undungeon/플러그인","executable":true}; 
*/ 
function plugin_uncydungeon(){
  if($("[data-name='uncydungeon']").length >= 1){
		 // 이부분에 코드 입력 //
		 const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

function Item(type, name, value) {
  this.type = type;
  this.name = name;
  this.value = value;
}

function Entity(type, name, x, y, health) {
  this.type = type;
  this.name = name;
  this.x = x;
  this.y = y;
  this.health = health;
}

const rand = new (function () {
  var seed = new Date().getTime();
  this.nextInt = function (n) {
    return Math.floor(Math.random() * n);
  };
  this.seed = function (s) {};
})();

let game = false;
let mapY = 20;
let mapX = 80;
const base = new Array(mapY).fill(null).map(function () {
  return new Array(mapX).fill(null);
});
const entity = new Array(mapY).fill(null).map(function () {
  return new Array(mapX).fill(null);
});
const entities = [];
const item = [];

let dl = 0;
let xl = 0;
let hp = 0;
let maxhp = 0;
let pw = 0;
let maxpw = 0;
let time = 0;

let role;
let name = null;
let pl;
const inv = [];

const log = [];

function refLog() {
  while (log.length > 3) {
    log.shift();
  }
}

function main() {
  for (var i = 0; i < mapY; i++) {
    var row = [];
    for (var j = 0; j < mapX; j++) {
      row.push([]);
    }
    item.push(row);
  }

  askQuestion('Your name?').then(function (nameInput) {
    name = nameInput;
    chooseRole();
  });
}

function chooseRole() {
  if (name === null) {
    askQuestion(`
                    Your role?
                    a) Monk
                    b) Ranger
                    c) Valkryie
                    d) Wizard`).then(function (roleInput) {
      preset(roleInput);
    });
  } else {
    preset(null);
  }
}

function preset(s) {
  switch (s) {
    case 'a':
      role = 'Monk';
      maxhp = 20;
      maxpw = 10;
      break;
    case 'b':
      role = 'Ranger';
      maxhp = 15;
      maxpw = 5;
      break;
    case 'c':
      role = 'Valkriye';
      maxhp = 20;
      maxpw = 5;
      break;
    case 'd':
      role = 'Wizard';
      maxhp = 15;
      maxpw = 15;
      break;
    default:
      return;
  }
  xl = 1;
  hp = maxhp;
  pw = maxpw;
  game = true;
  mapGen();
}

function mapGen() {
  for (var y = 0; y < mapY; y++) {
    for (var x = 0; x < mapX; x++) {
      // old mapgen
      var xborder = (y === 1 || y === mapY - 2) && (x !== 0 && x !== mapX - 1);
      var yborder = (x === 1 || x === mapX - 2) && (y !== 0 && y !== mapY - 1);
      var floor = y > 1 && y < mapY - 2 && x > 1 && x < mapX - 2;
      var up = x === 2 && y === 2;
      var down = x === mapX - 3 && y === mapY - 3;
      if (xborder || yborder) {
        base[y][x] = '#';
      } else if (up) {
        base[y][x] = '<';
      } else if (down) {
        base[y][x] = '>';
      } else if (floor) {
        base[y][x] = '.';
      }

      // item
      if (base[y][x] === '.' && rand.nextInt(80) === 0) {
        var items = [];
        items.push(
          (function () {
            switch (rand.nextInt(6)) {
              case 0:
                return new Item('%', 'food ration', 1);
              case 1:
                return new Item('$', 'gold piece', 25);
              case 2:
                return new Item(')', 'dagger', 1);
              case 3:
                return new Item('[', 'leather armor', 1);
              case 4:
                return new Item('?', 'scroll of upgrade', 1);
              case 5:
                return new Item('!', 'potion of healing', 1);
              default:
                return null;
            }
          })()
        );
        item[y][x] = items;
      }

      // entity
      if (base[y][x] === '.' && rand.nextInt(100) === 0) {
        var e = (function () {
          switch (rand.nextInt(5)) {
            case 0:
              return new Entity('B', 'bat', x, y, getHP('bat'));
            case 1:
              return new Entity('r', 'sewer rat', x, y, getHP('sewer rat'));
            case 2:
              return new Entity('k', 'kobold', x, y, getHP('kobold'));
            case 3:
              return new Entity('o', 'goblin', x, y, getHP('goblin'));
            case 4:
              return new Entity('&', 'Demogorgon', x, y, getHP('Demogorgon'));
            default:
              return null;
          }
        })();
        entities.push(e);
        entity[y][x] = e;
      }
    }
  }
  pl = new Entity('@', name, 2, 2, hp);
  entity[2][2] = pl;
  startGame();
}

function getHP(name) {
  switch (name) {
    case 'bat':
      return 2;
    case 'sewer rat':
      return 4;
    case 'kobold':
      return 5;
    case 'goblin':
      return 8;
    case 'Demogorgon':
      return 456;
    default:
      return 1;
  }
}

function startGame() {
  var showInv = false;

  function updateStack(x, y, items) {
    item[y][x] = items;
  }

  function pickup() {
    var plx = pl.x;
    var ply = pl.y;
    var items = item[ply][plx];
    if (items.length > 0) {
      var i = items[0];
      inv.push(i);
      items.shift();
      updateStack(plx, ply, items);
      log.push('You picked up ' + itemName(i) + '.');
      turn();
    } else {
      log.push('There is nothing here.');
    }
  }

  function ascend() {
    var plx = pl.x;
    var ply = pl.y;
    if (base[ply][plx] === '<') {
      console.log('You escaped from the dungeon.');
      process.exit(0);
    } else {
      log.push("You can't go up here.");
    }
  }

  function itemName(i) {
    return i.value + ' ' + i.name + (i.value > 1 ? 's' : '');
  }

  function move(en, dx, dy) {
    var x = en.x;
    var y = en.y;
    if (base[y + dy][x + dx] !== '#' && entity[y + dy][x + dx] === null) {
      entity[y][x] = null;
      en.x += dx;
      en.y += dy;
      var floor = base[en.y][en.x];
      entity[en.y][en.x] = en;
      var items = item[en.y][en.x];

      // log output
      if (en === pl) {
        turn();
        if (floor !== '.' && floor !== '\0') {
          log.push('You are standing in ' + floorDes(floor) + '.');
        }
        if (items.length > 1) {
          log.push('You see here several items.');
        } else if (items.length > 0) {
          var i = items[0];
          log.push('You see here ' + itemName(i) + '.');
        }
      }
    }
  }

  function turn() {
    for (var i = 0; i < entities.length; i++) {
      var e = entities[i];
      if (e !== pl) {
        if (adjacent(e, pl)) {
          attack(e, pl);
        } else {
          switch (rand.nextInt(8)) {
            case 0:
              move(e, -1, 0);
              break;
            case 1:
              move(e, 1, 0);
              break;
            case 2:
              move(e, 0, -1);
              break;
            case 3:
              move(e, 0, 1);
              break;
            case 4:
              move(e, -1, -1);
              break;
            case 5:
              move(e, 1, -1);
              break;
            case 6:
              move(e, -1, 1);
              break;
            case 7:
              move(e, 1, 1);
              break;
          }
        }
      }
    }
    time++;
  }

  function floorDes(c) {
    switch (c) {
      case '<':
        return 'staircase leading upward';
      case '>':
        return 'staircase leading downward';
      default:
        return 'nothing';
    }
  }

  function getAttack(s) {
    switch (s) {
      case 'bat':
      case 'goblin':
      case 'kobold':
        return 4;
      case 'sewer rat':
        return 3;
      case 'Demogorgon':
        return 48;
      default:
        return 1;
    }
  }

  function adjacent(a, b) {
    return Math.abs(a.x - b.x) <= 1 && Math.abs(a.y - b.y) <= 1;
  }

  function attack(damager, damagee) {
    var dam = damager.getAttack();
    var health = damagee.health;
    if (damagee === pl) {
      log.push('The ' + damager.name + ' hits!');
      hp -= dam;
    } else if (damager === pl) {
      log.push('You hit the ' + damagee.name);
    }
    if (dam >= health) {
      death(damagee);
    } else {
      damagee.health -= dam;
    }
  }

  function death(e) {
    if (e === pl) {
      log.push('You were slain...');
      refLog();
      display();
      process.exit(0);
    } else {
      entities.splice(entities.indexOf(e), 1);
      entity[e.y][e.x] = null;
      log.push(e.name + ' died!');
    }
  }

  function display() {
    clearConsole().then(function () {
      var display = '';
      for (var y = 0; y < mapY; y++) {
        for (var x = 0; x < mapX; x++) {
          var floor = base[y][x];
          var it = item[y][x];
          var en = entity[y][x];
          var s = ' ';
          if (floor !== '\0') {
            s = floor;
          }
          if (it.length > 0) {
            s = it[0].type;
          }
          if (en !== null) {
            s = en.type;
          }
          display += s;
        }
        display += '\n';
      }
      refLog();
      log.forEach(function (line) {
        display += line + '\n';
      });
      display +=
        name +
        ' the ' +
        role +
        ' t:' +
        time +
        '\nDlvl:' +
        dl +
        ' Lv:' +
        xl +
        ' HP:' +
        hp +
        '/' +
        maxhp +
        ' Pw:' +
        pw +
        '/' +
        maxpw +
        '\n\n';
      console.log(display);
    });
  }

  function inventory() {
    clearConsole().then(function () {
      var display = '';
      var c = 97;
      display += 'Your inventory:\n';
      if (inv.length === 0) {
        display += "It's empty.\n";
      } else {
        for (var i = 0; i < inv.length; i++) {
          var item = inv[i];
          display += String.fromCharCode(c) + ') ' + itemName(item) + '\n';
          c++;
        }
      }
      display += '\nType any command...\n';
      console.log(display);
      showInv = false;
    });
  }

  function askQuestion(question) {
    return new Promise(function (resolve) {
      rl.question(question, function (answer) {
        resolve(answer);
      });
    });
  }

  function clearConsole() {
    return new Promise(function (resolve) {
      console.clear();
      resolve();
    });
  }

  function updateStack(x, y, items) {
    item[y][x] = items;
  }

  main();
}

}
}
$( plugin_uncydungeon );
/* uncydungeon 끝 */