/// /// /// module Elements.RoomHandler { export var currentRoomTab = document.getElementById("currentRoomTab"); export var currentRoomDescription = document.getElementById("roomDescription"); export var currentRoomExits = document.getElementById("roomExits"); export var currentRoomName : Text = document.createTextNode(""); document.getElementById("roomName").appendChild(currentRoomName); export function linkObjects () { let objs = currentRoomTab.getElementsByClassName("roomObject"); for (let i = 0; i < objs.length; i++) { let linkKeyCode = Controls.KeyHandler.getFirstKeyCode(); Controls.KeyHandler.applyCode( objs[i], linkKeyCode); } } export function emptyRoom () { while (currentRoomDescription.firstChild) { currentRoomDescription.removeChild(currentRoomDescription.firstChild); } while (currentRoomExits.firstChild) { currentRoomExits.removeChild(currentRoomExits.firstChild); } currentRoomName.nodeValue = ""; } export async function updateRoom () { emptyRoom(); let room = WorldState.player.getRoom(); if (room != undefined) { currentRoomName.nodeValue = room.getPrintedName(); let description = room.description.getHTML("p", ["roomDescription"]); await description.then(value => { for (let i = 0, p = value[i]; p != undefined; p = value[++i]) { currentRoomDescription.appendChild(p); } }); let things = room.getContainedAndVisible(); if (things.length > 0) { let thingList = document.createElement("p"); thingList.classList.add("roomDescription"); await PrintingVisibleThingsRulebook.execute({ noun : { things : things, container : thingList } }); currentRoomDescription.appendChild(thingList); } for (let index = 0, value = room.connections[index]; index < room.connections.length; value = room.connections[++index]) { if (value != undefined) { let p = document.createElement("p"); p.classList.add("roomExit"); let link = document.createElement("a"); link.classList.add("roomDirection"); link.appendChild(document.createTextNode(DirectionNames[Direction[index]])); Controls.Links.makeLink(link, new ActionGo(WorldState.player, index)); Controls.KeyHandler.applyCode(link, Controls.KeyHandler.getDirectionCodeByIndex(index)); p.appendChild(link); let directionResult = ": "; if (value.visited || await WorldState.isRoomRemembered(value)) { directionResult += value.getPrintedName(); } else { directionResult += "A new place"; } p.appendChild(document.createTextNode(directionResult)); currentRoomExits.appendChild(p); } } } } export interface VisibleThingsOptions { container : HTMLElement, things : Array } /** * Noun = VisibleThingsOptions * @type {Rulebook} */ export var PrintingVisibleThingsRulebook = new Rulebook("Printing the name of visible things in a room"); export var PrintIntroToVisibleThingsRule = new Rule({ name : "Print \"You can see\" text", firstPriority : Rule.PRIORITY_HIGH, code : (rulebook : RulebookRunner) => { let noun = rulebook.noun; noun.container.appendChild(document.createTextNode("You can see ")); } }); PrintingVisibleThingsRulebook.addRule(PrintIntroToVisibleThingsRule); export var PrintVisibleThingsRule = new Rule({ name : "Print all visible things", code : async (rulebook : RulebookRunner) => { let noun = rulebook.noun; for (let i = 0; i < noun.things.length; i++) { let value = noun.things[i]; let link = document.createElement("a"); link.classList.add("roomObject"); let say : Say if (value instanceof Thing && value.unique) { say = new Say(new SayThe(false), value); } else { say = new Say(new SayAn(false), value); } await say.getPureElements().then(value2 => { for (let i = 0, element = value2[i]; element != undefined; element = value2[++i]) { link.appendChild(element); } }); Controls.Links.makeLink(link, new ActionExamine(WorldState.player, value)); Controls.KeyHandler.applyCode(link, Controls.KeyHandler.getFirstKeyCode()); noun.container.appendChild(link); if ((i + 1) < noun.things.length) { noun.container.appendChild(document.createTextNode(", ")); } } } }); PrintingVisibleThingsRulebook.addRule(PrintVisibleThingsRule); export var PrintOutroToVisibleThingsRule = new Rule({ name : "Print \"... here\" text", firstPriority : Rule.PRIORITY_LOW, code : (rulebook : RulebookRunner) => { let noun = rulebook.noun; noun.container.appendChild(document.createTextNode(" here.")); } }); PrintingVisibleThingsRulebook.addRule(PrintOutroToVisibleThingsRule); }