blob: be11f0ec8fd4c84530222a36839e7fbd36b723e1 (
plain) (
tree)
|
|
const fs = require('fs');
class Room {
constructor(name, description, items, animals, connections) {
this.name = name;
this.description = description;
this.items = items;
this.animals = animals;
this.connections = connections;
}
}
class Item {
constructor(name, description, action) {
this.name = name;
this.description = description;
this.action = action;
}
}
class Animal {
constructor(name, description, action) {
this.name = name;
this.description = description;
this.action = action;
}
}
class Interpreter {
constructor() {
this.rooms = {};
this.currentRoom = null;
this.history = [];
}
parseDSLFile(filePath) {
const dsl = fs.readFileSync(filePath, 'utf8');
this.parseDSL(dsl);
}
parseDSL(dsl) {
const lines = dsl.split('\n');
let currentRoom = null;
let currentItem = null;
let currentAnimal = null;
for (const line of lines) {
const trimmed = line.trim();
if (trimmed.startsWith('room')) {
const name = trimmed.split('"')[1];
currentRoom = new Room(name);
this.rooms[name] = currentRoom;
} else if (trimmed.startsWith('description')) {
const description = trimmed.split('"')[1];
if (currentItem) {
currentItem.description = description;
} else if (currentAnimal) {
currentAnimal.description = description;
} else {
currentRoom.description = description;
}
} else if (trimmed.startsWith('item')) {
const name = trimmed.split('"')[1];
currentItem = new Item(name);
currentRoom.items[name] = currentItem;
} else if (trimmed.startsWith('animal')) {
const name = trimmed.split('"')[1];
currentAnimal = new Animal(name);
currentRoom.animals[name] = currentAnimal;
} else if (trimmed.startsWith('action')) {
const action = trimmed.split('"')[1];
if (currentItem) {
currentItem.action = action;
} else {
currentAnimal.action = action;
}
} else if (trimmed.startsWith('connection')) {
const direction = trimmed.split('"')[1];
const roomName = trimmed.split('"')[3];
currentRoom.connections[direction] = roomName;
}
}
}
interpretCommand(command) {
const tokens = command.split(' ');
const action = tokens[0];
const object = tokens[1];
if (action === 'go') {
this.currentRoom = this.rooms[this.currentRoom.connections[object]];
} else if (action === 'take') {
if (this.currentRoom.items[object]) {
console.log(this.currentRoom.items[object].action);
this.inventory.push(this.currentRoom.items[object]);
delete this.currentRoom.items[object];
}
} else if (action === 'drop') {
if (this.inventory.includes(object)) {
this.currentRoom.items[object] = object;
this.inventory = this.inventory.filter(item => item !== object);
console.log(`You dropped the ${object}.`);
}
} else if (action === 'examine') {
if (this.currentRoom.items[object]) {
console.log(this.currentRoom.items[object].description);
} else if (this.inventory.includes(object)) {
console.log(object.description);
} else {
console.log(`There is no ${object} here to examine.`);
}
} else if (this.currentRoom.animals[object]) {
console.log(this.currentRoom.animals[object].action);
}
this.history.push(command);
}
}
// Create a new interpreter
const interpreter = new Interpreter();
// Parse the DSL file
interpreter.parseDSLFile(process.argv[2]);
// Start a command line interface
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
readline.on('line', (line) => {
interpreter.interpretCommand(line);
});
|