/// /// /// class ActionGoThrough extends Action { public static check = new Rulebook("Check Going Through"); public static carry = new Rulebook("Carry out Going Through"); public constructor (actor : Thing, ...nouns : Array) { super(actor, ...nouns); this.requiresNoun = true; this.requiresVisibility = true; } public getCommandText () { return "go through " + ( this.getDoor()).getPrintedName(); } public getDoor () : Door { return this.getNoun(0); } public static checkLocked = ActionGoThrough.check.createAndAddRule({ firstPriority : Rule.PRIORITY_HIGHEST, priority : Rule.PRIORITY_HIGHEST, name : "Check Going Through - Is it locked?", code : async (runner: RulebookRunner) => { let actor = runner.noun.actor; let door = runner.noun.getDoor(); let isPlayer = WorldState.isPlayer(actor); if (door.locked) { let actorThings = actor.getEnclosed(); if (actorThings.includes(door.key)) { if (isPlayer) { Elements.CurrentTurnHandler.printAsContent(new Say(Say.Mention(door), " is locked, but you can unlock it with ", Say.Mention(door.key), ". Do you want to unlock it?")); if (!(await Controls.askForConsent())) { return false; } } door.locked = false; } else { if (isPlayer) { runner.noun.say.add("It's locked, and you don't have the key to unlock it..."); } // TODO: Reconsider whether taking a turn on failed open checks is good. return false; } } } }); public static carryGoThrough = ActionGoThrough.check.createAndAddRule({ name: "Carry Going Through - Go Through!", code: async (runner: RulebookRunner) => { let actor = runner.noun.actor; let door = runner.noun.getDoor(); let isPlayer = WorldState.isPlayer(actor); if (isPlayer) { runner.noun.say.add("You go through ", Say.Mention(door), "."); if (actor.isPlayer()) { WorldState.rememberRoom(actor.getRoom(), door.destination); } } else { let oldRoom = actor.getRoom(); let playerRoom = WorldState.player.getRoom(); if (oldRoom == playerRoom) { runner.noun.say.add(Say.Mention(actor), " goes through ", Say.Mention(door), "."); } else { runner.noun.say.add(Say.Mention(actor), " arrives through ", Say.Mention(door), "."); } } door.destination.place(actor); } }); } Elements.HyperlinkHandler.HyperlinkingRulebook.addRule(new Rule( { name : "Hyperlink - Go through", firstPriority : Rule.PRIORITY_HIGHEST, code : (rulebook : RulebookRunner) => { let thing = rulebook.noun; if (thing instanceof Door && thing.isVisibleTo(WorldState.player)) { Elements.HyperlinkHandler.addAvailableAction("Go through", new ActionGoThrough(WorldState.player, thing)); } } } ));