summary refs log tree commit diff stats
path: root/test
Commit message (Expand)AuthorAgeFilesLines
* added documentation, clean uphut2009-12-312-7/+7
* removed test/stuff directoryhut2009-12-306-236/+0
* fixed a few things~hut2009-12-301-11/+0
* updated testhut2009-12-291-2/+2
* test case for keyapi.Wrapperhut2009-12-271-0/+24
* fixed colorschemes, added unittest for colorschemeshut2009-12-171-0/+31
* extended history by a couple of methodshut2009-12-171-7/+10
* fixed directory testhut2009-12-141-0/+3
* updated / added testshut2009-12-135-4/+213
* clean ups, commentshut2009-12-132-5/+8
* clean upshut2009-12-113-8/+5
* run all tests with a single executablehut2009-12-111-0/+5
* Reorganization of gui/widget hierarchy and directory structurehut2009-12-111-1/+1
* restructurationshut2009-12-111-2/+2
* moved/fixed testshut2009-12-117-1/+209
* fixed directory testhut2009-12-061-19/+0
* History Object + Test Casehut2009-12-051-0/+44
* random improvementshut2009-11-291-17/+18
* more VROOMhut2009-11-272-12/+22
* implemented more stuffhut2009-11-252-9/+10
* corrected test, added some stuffhut2009-11-242-5/+50
* stuffhut2009-11-241-1/+2
* better implementation of directories/fileshut2009-11-243-25/+54
* test cases for directory.pyhut2009-11-233-0/+68
Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
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);
});