사용자:Jinhoftyu/Undungeon/플러그인: 두 판 사이의 차이

리버티게임, 모두가 만들어가는 자유로운 게임
편집 요약 없음
편집 요약 없음
13번째 줄: 13번째 줄:
{{#vardefine:code|
{{#vardefine:code|
  // 이부분에 코드 입력 //
  // 이부분에 코드 입력 //
console.log("로그라이크");
class Random {
  nextInt(max) {
    return Math.floor(Math.random() * max);
  }
}
 
class Item {
  constructor(type, name, value) {
    this.type = type;
    this.name = name;
    this.value = value;
  }
 
  getType() {
    return this.type;
  }
 
  getName() {
    return this.name;
  }
 
  getValue() {
    return this.value;
  }
 
  setName(name) {
    this.name = name;
  }
 
  setValue(value) {
    this.value = value;
  }
}
 
class Entity {
  constructor(type, name, x, y, health) {
    this.type = type;
    this.name = name;
    this.x = x;
    this.y = y;
    this.health = health;
  }
 
  getType() {
    return this.type;
  }
 
  getName() {
    return this.name;
  }
 
  getHealth() {
    return this.health;
  }
 
  getAttack() {
    return Main.getAttack(this.getName());
  }
 
  setHealth(health) {
    this.health = health;
  }
 
  getX() {
    return this.x;
  }
 
  setX(x) {
    this.x = x;
  }
 
  getY() {
    return this.y;
  }
 
  setY(y) {
    this.y = y;
  }
}
 
class StringBuilder {
  constructor() {
    this.data = [];
  }
 
  append(text) {
    this.data.push(text);
  }
 
  delete(start, end) {
    this.data.splice(start, end - start);
  }
 
  length() {
    return this.data.length;
  }
 
  charAt(index) {
    return this.data[index];
  }
 
  toString() {
    return this.data.join('');
  }
}
 
const rand = new Random();
let game = false;
const mapY = 20;
const mapX = 80;
const base = new Array(mapY);
const entity = new Array(mapY);
const entities = [];
const item = [];
 
let dl;
let xl;
let hp;
let maxhp;
let pw;
let maxpw;
let time;
 
let role;
let name = null;
let pl;
const inv = [];
const log = new StringBuilder();
let showInv = false;
 
function refLog() {
  let size = 0;
  for (let i = 0; i < log.length(); i++) {
    if (log.charAt(i) === '\n') {
      size++;
    }
  }
 
  if (size > 3) {
    let index = log.toString().indexOf("\n") + 1;
    log.delete(0, index);
  }
}
 
function main() {
  for (let i = 0; i < mapY; i++) {
    const row = new Array(mapX);
    base[i] = row;
 
    const entityRow = new Array(mapX);
    entity[i] = entityRow;
  }
 
  const readline = require('readline');
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });
 
  const askName = () => {
    rl.question("Your name? ", (answer) => {
      name = answer;
      while (!game) {
        console.log(`
        Your role?
        a) Monk
        b) Ranger
        c) Valkryie
        d) Wizard`);
        rl.question("Choose your role: ", (roleChoice) => {
          preset(roleChoice);
          mapGen();
          gameLoop();
        });
      }
    });
  };
 
  askName();
}
 
function updateStack(x, y, items) {
  const row = item[y];
  row[x] = items;
  item[y] = row;
}
 
function pickup() {
  const plx = pl.getX();
  const ply = pl.getY();
  const items = item[ply][plx];
  if (items.length > 0) {
    const item = items[0];
    inv.push(item);
    items.shift();
    updateStack(plx, ply, items);
    log.append("You picked up " + itemName(item) + ".\n");
    turn();
  } else {
    log.append("There is nothing here.\n");
  }
}
 
function ascend() {
  const plx = pl.getX();
  const ply = pl.getY();
  if (base[ply][plx] === '<') {
    console.log("You escaped from the dungeon.");
    process.exit(0);
  } else {
    log.append("You can't go up here.\n");
  }
}
 
function itemName(item) {
  return item.getValue() + " " + item.getName() + (item.getValue() > 1 ? "s" : "");
}
 
function move(en, dx, dy) {
  const x = en.getX();
  const y = en.getY();
  if (base[y + dy][x + dx] !== '#' && entity[y + dy][x + dx] === null) {
    entity[y][x] = null;
    x += dx;
    y += dy;
    en.setX(x);
    en.setY(y);
    const floor = base[y][x];
    entity[y][x] = en;
    const items = item[y][x];
 
    // log output
    if (en === pl) {
      turn();
      if (floor !== '.' && floor !== '\0') {
        log.append("You are standing in " + floorDes(floor) + ".\n");
      }
      if (items.length > 1) {
        log.append("You see here several items.\n");
      } else if (items.length > 0) {
        const item = items[0];
        log.append("You see here " + itemName(item) + ".\n");
      }
    }
  }
}
 
function turn() {
  for (let i = 0; i < entities.length; i++) {
    const e = entities[i];
    if (e !== pl) {
      if (adjacent(e, pl)) {
        attack(e, pl);
      } else {
        const randChoice = rand.nextInt(8);
        switch (randChoice) {
          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() {
  for (let y = 0; y < mapY; y++) {
    for (let x = 0; x < mapX; x++) {
 
      // old mapgen
      const xborder = (y === 1 || y === mapY - 2) && (x !== 0 && x !== mapX - 1);
      const yborder = (x === 1 || x === mapX - 2) && (y !== 0 && y !== mapY - 1);
      const floor = y > 1 && y < mapY - 2 && x > 1 && x < mapX - 2;
      const up = x === 2 && y === 2;
      const 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) {
        const items = [];
        items.push((() => {
          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);
          }
        })());
        item[y][x] = items;
      }
 
      // entity
      if (base[y][x] === '.' && rand.nextInt(100) === 0) {
        const e = (() => {
          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"));
          }
        })();
        entities.push(e);
        entity[y][x] = e;
      }
    }
  }
  pl = new Entity('@', name, 2, 2, hp);
  entity[2][2] = pl;
}
 
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 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.getX() - b.getX()) <= 1 && Math.abs(a.getY() - b.getY()) <= 1;
}
 
function attack(damager, damagee) {
  const dam = damager.getAttack();
  const health = damagee.getHealth();
  if (damagee === pl) {
    log.append("The " + damager.getName() + " hits!\n");
    hp -= dam;
  } else if (damager === pl) {
    log.append("You hit the " + damagee.getName() + "\n");
  }
  if (dam >= health) {
    death(damagee);
  } else {
    damagee.setHealth(damagee.getHealth() - dam);
  }
}
 
function death(e) {
  if (e === pl) {
    log.append("You were slain...");
    refLog();
    display();
    process.exit(0);
  } else {
    entities.splice(entities.indexOf(e), 1);
    entity[e.getY()][e.getX()] = null;
    log.append(e.getName() + " died!\n");
  }
}
 
function display() {
  const display = new StringBuilder();
  for (let y = 0; y < mapY; y++) {
    for (let x = 0; x < mapX; x++) {
      const floor = base[y][x];
      const it = item[y][x];
      const en = entity[y][x];
      let s = " ";
      if (floor !== '\0') {
        s = floor;
      }
      if (it.length > 0) {
        s = it[0].getType();
      }
      if (en !== null) {
        s = en.getType();
      }
      display.append(s);
    }
    display.append("\n");
  }
  refLog();
  console.log(log.toString());
  display.append(name + " the " + role + " t:" + time + "\nDlvl:" + dl + " Lv:" + xl + " HP:" + hp + "/" + maxhp + " Pw:" + pw + "/" + maxpw + "\n\n");
  console.log(display.toString());
}
 
function inventory() {
  const display = new StringBuilder();
  let c = 97;
  display.append("Your inventory:\n");
  if (inv.length === 0) {
    display.append("It's empty.\n");
  } else {
    for (let i = 0; i < inv.length; i++) {
      display.append(String.fromCharCode(c) + ") " + itemName(inv[i]) + "\n");
      c++;
    }
  }
  display.append("\nType any command...\n");
  console.log(display.toString());
  showInv = false;
}
 
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;
}
 
function floorDes(c) {
  switch (c) {
    case '<':
      return "staircase leading upward";
    case '>':
      return "staircase leading downward";
    default:
      return "nothing";
  }
}
 
main();
 
}}
}}



2023년 10월 18일 (수) 14:55 판

요령 => 아래 변수들의 첫번째 인자들을 내용에 맞게 자르고 붙여넣어주세요

!!!!!!!!!!!!!!!! 플러그인 정보 입력 구간 윗부분은 만지지 마시오 절대로!!!!!!!!!!!!!!!!!






!!!!!!!!!!!!!!!! 플러그인 정보 입력 구간 끝 아래는 만지지 마시오!!!!!!!!!!!!!!!!!

이 플러그인에 대한 설명문서는 사용자:Jinhoftyu/Undungeon/플러그인/설명문서에서 만들 수 있습니다.

		 // 이부분에 코드 입력 //
class Random {
  nextInt(max) {
    return Math.floor(Math.random() * max);
  }
}

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

  getType() {
    return this.type;
  }

  getName() {
    return this.name;
  }

  getValue() {
    return this.value;
  }

  setName(name) {
    this.name = name;
  }

  setValue(value) {
    this.value = value;
  }
}

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

  getType() {
    return this.type;
  }

  getName() {
    return this.name;
  }

  getHealth() {
    return this.health;
  }

  getAttack() {
    return Main.getAttack(this.getName());
  }

  setHealth(health) {
    this.health = health;
  }

  getX() {
    return this.x;
  }

  setX(x) {
    this.x = x;
  }

  getY() {
    return this.y;
  }

  setY(y) {
    this.y = y;
  }
}

class StringBuilder {
  constructor() {
    this.data = [];
  }

  append(text) {
    this.data.push(text);
  }

  delete(start, end) {
    this.data.splice(start, end - start);
  }

  length() {
    return this.data.length;
  }

  charAt(index) {
    return this.data[index];
  }

  toString() {
    return this.data.join();
  }
}

const rand = new Random();
let game = false;
const mapY = 20;
const mapX = 80;
const base = new Array(mapY);
const entity = new Array(mapY);
const entities = [];
const item = [];

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

let role;
let name = null;
let pl;
const inv = [];
const log = new StringBuilder();
let showInv = false;

function refLog() {
  let size = 0;
  for (let i = 0; i < log.length(); i++) {
    if (log.charAt(i) === '\n') {
      size++;
    }
  }

  if (size > 3) {
    let index = log.toString().indexOf("\n") + 1;
    log.delete(0, index);
  }
}

function main() {
  for (let i = 0; i < mapY; i++) {
    const row = new Array(mapX);
    base[i] = row;

    const entityRow = new Array(mapX);
    entity[i] = entityRow;
  }

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

  const askName = () => {
    rl.question("Your name? ", (answer) => {
      name = answer;
      while (!game) {
        console.log(`
        Your role?
        a) Monk
        b) Ranger
        c) Valkryie
        d) Wizard`);
        rl.question("Choose your role: ", (roleChoice) => {
          preset(roleChoice);
          mapGen();
          gameLoop();
        });
      }
    });
  };

  askName();
}

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

function pickup() {
  const plx = pl.getX();
  const ply = pl.getY();
  const items = item[ply][plx];
  if (items.length > 0) {
    const item = items[0];
    inv.push(item);
    items.shift();
    updateStack(plx, ply, items);
    log.append("You picked up " + itemName(item) + ".\n");
    turn();
  } else {
    log.append("There is nothing here.\n");
  }
}

function ascend() {
  const plx = pl.getX();
  const ply = pl.getY();
  if (base[ply][plx] === '<') {
    console.log("You escaped from the dungeon.");
    process.exit(0);
  } else {
    log.append("You can't go up here.\n");
  }
}

function itemName(item) {
  return item.getValue() + " " + item.getName() + (item.getValue() > 1 ? "s" : "");
}

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

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

function turn() {
  for (let i = 0; i < entities.length; i++) {
    const e = entities[i];
    if (e !== pl) {
      if (adjacent(e, pl)) {
        attack(e, pl);
      } else {
        const randChoice = rand.nextInt(8);
        switch (randChoice) {
          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() {
  for (let y = 0; y < mapY; y++) {
    for (let x = 0; x < mapX; x++) {

      // old mapgen
      const xborder = (y === 1