90 lines
1.7 KiB
JavaScript
Executable File
90 lines
1.7 KiB
JavaScript
Executable File
export const defaultLegend = {
|
|
" ": {
|
|
type: "empty",
|
|
},
|
|
// Default Wall
|
|
"#": {
|
|
minimap: "#",
|
|
occupied: true,
|
|
type: "wall",
|
|
},
|
|
|
|
// Column
|
|
"◯": {
|
|
minimap: "◯",
|
|
occupied: true,
|
|
type: "statue",
|
|
},
|
|
|
|
// Closed Door
|
|
"░": {
|
|
minimap: "░",
|
|
occupied: true,
|
|
type: "sprite?????",
|
|
},
|
|
|
|
// Where the player starts
|
|
"@": {
|
|
type: "playerStart",
|
|
},
|
|
|
|
// TRAP!
|
|
"☠": {
|
|
type: "trap",
|
|
},
|
|
|
|
// Monster
|
|
"!": {
|
|
type: "monster",
|
|
},
|
|
};
|
|
export class Tile {
|
|
/** @param {object} options */
|
|
constructor(options) {
|
|
for (let [k, v] of Object.entries(options)) {
|
|
this[k] = v;
|
|
}
|
|
}
|
|
}
|
|
export class TileMap {
|
|
/** @param {string} str */
|
|
static fromText(str) {
|
|
const lines = str.split("\n");
|
|
|
|
const longestLine = lines.reduce((acc, line) => Math.max(acc, line.length), 0);
|
|
|
|
const tiles = new Array(lines.length).fill().map(() => new Array(longestLine));
|
|
|
|
lines.forEach((line, y) => {
|
|
line = line.padEnd(longestLine, "#");
|
|
|
|
line.split("").forEach((char, x) => {
|
|
const options = defaultLegend[char] ?? defaultLegend[" "];
|
|
tiles[y][x] = new Tile(options);
|
|
});
|
|
});
|
|
|
|
return new TileMap(tiles);
|
|
}
|
|
|
|
/**
|
|
* @param {Tile[]} tiles
|
|
*/
|
|
constructor(tiles) {
|
|
this.height = tiles.length;
|
|
this.width = tiles[0].length;
|
|
this.tiles = tiles;
|
|
}
|
|
}
|
|
|
|
const str = `
|
|
kim
|
|
har en
|
|
# meje #
|
|
stor pikkemand
|
|
`;
|
|
|
|
const tm = TileMap.fromText(str);
|
|
|
|
console.log(tm.tiles);
|