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); });