2021-11-04 19:58:37 +00:00
|
|
|
import State from './state';
|
|
|
|
import Room from './room';
|
|
|
|
import Player from './player';
|
|
|
|
import Output from './output';
|
|
|
|
import Input from './input';
|
|
|
|
import Commands from './commands';
|
|
|
|
|
2021-11-04 22:55:56 +00:00
|
|
|
|
2021-11-04 19:58:37 +00:00
|
|
|
export default class Game {
|
|
|
|
constructor() {
|
|
|
|
this.player = new Player();
|
|
|
|
this.state = State;
|
|
|
|
this.rooms = [];
|
|
|
|
this.items = [];
|
|
|
|
this.output = new Output();
|
|
|
|
this.commandHandler = new Commands(this);
|
2021-11-04 21:47:09 +00:00
|
|
|
this.input = new Input(this.commandHandler, this.output);
|
2021-11-04 19:58:37 +00:00
|
|
|
this.visitedRooms = new Map();
|
2021-11-04 22:55:56 +00:00
|
|
|
this.interval = null;
|
2021-11-04 19:58:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
print(string) {
|
|
|
|
this.output.say(string);
|
|
|
|
}
|
|
|
|
|
|
|
|
init(data) {
|
|
|
|
console.log(data);
|
|
|
|
this.rooms = data.rooms.map((room) => {
|
|
|
|
room.context = this;
|
|
|
|
return room;
|
|
|
|
});
|
|
|
|
this.items = data.items.map((item) => {
|
|
|
|
item.context = this;
|
|
|
|
return item;
|
|
|
|
});
|
|
|
|
this.state = data.state;
|
|
|
|
this.commandHandler.addCommands(data.commands);
|
|
|
|
this.player = new Player();
|
2021-11-04 21:47:09 +00:00
|
|
|
this.player.context = this;
|
2021-11-04 19:58:37 +00:00
|
|
|
this.move(this.player.currentRoom);
|
2021-11-04 22:55:56 +00:00
|
|
|
this.start();
|
|
|
|
}
|
|
|
|
|
|
|
|
advanceTick() {
|
|
|
|
this.items.forEach((item) => item.onTick());
|
|
|
|
this.rooms.forEach((room) => room.onTick());
|
|
|
|
}
|
|
|
|
|
|
|
|
start() {
|
|
|
|
this.interval = setInterval(() => this.advanceTick(), 1000);
|
|
|
|
}
|
|
|
|
|
|
|
|
stop() {
|
|
|
|
clearInterval(this.interval);
|
|
|
|
this.interval = null;
|
2021-11-04 19:58:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
examineRoom() {
|
|
|
|
const room = this.getRoom(this.player.currentRoom);
|
|
|
|
this.output.say(room.title);
|
|
|
|
if (!this.visitedRooms.get(this.player.currentRoom) && room.firstDescription != "") {
|
|
|
|
this.output.say(room.firstDescription);
|
|
|
|
} else {
|
|
|
|
this.output.say(room.description);
|
|
|
|
}
|
|
|
|
this.examineItems();
|
|
|
|
this.examineExits();
|
|
|
|
}
|
|
|
|
|
|
|
|
examineItems() {
|
|
|
|
const room = this.getRoom(this.player.currentRoom);
|
|
|
|
const items = room.getItems();
|
|
|
|
items.forEach((item) => this.output.say(item.name));
|
|
|
|
}
|
|
|
|
|
|
|
|
examineExits() {
|
|
|
|
const room = this.getRoom(this.player.currentRoom);
|
|
|
|
let exitDescription = "You can go ";
|
|
|
|
for (let exit of room.exits.keys()) {
|
|
|
|
exitDescription += " " + exit;
|
|
|
|
}
|
|
|
|
this.output.say(exitDescription);
|
|
|
|
}
|
|
|
|
|
|
|
|
getRoom(id) {
|
|
|
|
return this.rooms.find((room) => room.id == id);
|
|
|
|
}
|
|
|
|
|
|
|
|
getItem(id) {
|
|
|
|
return this.items.find((item) => item.id == id);
|
|
|
|
}
|
|
|
|
|
|
|
|
wait(ms) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
setTimeout(resolve, ms);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async move(roomID) {
|
|
|
|
const currentRoom = this.getRoom(this.player.currentRoom);
|
|
|
|
const newRoom = this.getRoom(roomID);
|
|
|
|
if (currentRoom.canExit() && newRoom.canEnter()) {
|
|
|
|
await currentRoom.onExit();
|
|
|
|
await newRoom.onEnter();
|
|
|
|
this.player.currentRoom = roomID;
|
|
|
|
this.examineRoom();
|
|
|
|
this.visitedRooms.set(roomID, true);
|
|
|
|
}
|
|
|
|
}
|
2021-11-04 21:19:50 +00:00
|
|
|
|
|
|
|
enableCommandInput(value) {
|
|
|
|
this.commandHandler.enabled = value;
|
|
|
|
}
|
2021-11-04 21:51:50 +00:00
|
|
|
|
|
|
|
setInputEcho(value) {
|
|
|
|
this.input.setEcho(value);
|
|
|
|
}
|
2021-11-04 19:58:37 +00:00
|
|
|
}
|