/// /// /// class ActionGo extends Action { public static check = new Rulebook("Check Going"); public static carry = new Rulebook("Carry out Going"); public roomGoneFrom : Room; public roomGoneTo : Room; public originalTarget : Room | number; public constructor (actor : Thing, ...nouns : Array) { super(actor, ...nouns); this.originalTarget = nouns[0]; this.requiresNoun = false; this.requiresVisibility = false; } /** * Needs to return a string explaining what the player will do if he does this action. * For instance, ActionTaking should return something like return "take " + this.nouns[0].getName(), * which would read as "take thing". * remember that things implement PRINTABLE interface, so you can get their names. * @returns {string} */ public getCommandText () { let name; if (typeof this.originalTarget == "number") { name = DirectionNames[Direction[this.originalTarget]]; } else if (this.originalTarget instanceof Room) { name = "to " + ( this.originalTarget).getPrintedName(); } return "go " + name; } public static ruleCheckRestoreOriginalNoun = ActionGo.check.createAndAddRule({ firstPriority : Rule.PRIORITY_HIGHEST, priority : Rule.PRIORITY_HIGHEST, name : "Check Going - Restore original noun", code : (rulebook) => { let action = rulebook.noun; action.setNoun(0, action.originalTarget); } }); public static ruleCheckIsthereactor = ActionGo.check.createAndAddRule({ firstPriority : Rule.PRIORITY_HIGHEST, priority : Rule.PRIORITY_HIGHEST, name : "Check Going - Is there an actor?", code : (rulebook) => { let action = rulebook.noun; if (action.actor == undefined) { return false; // Rule fails } } }); public static ruleCheckConvertRoomToDirection = ActionGo.check.createAndAddRule({ firstPriority : Rule.PRIORITY_HIGHEST, priority : Rule.PRIORITY_HIGH, name : "Change Room to Direction", code : (rulebook) => { let action = rulebook.noun; // Someone asked for a room... if (action.getNoun(0) instanceof RoomRandom) { let actor = action.actor; let cRoom = actor.getRoom(); if (cRoom instanceof RoomRandom) { let dRoom = action.getNoun(0); if (cRoom == dRoom) { if (actor.isPlayer()) { action.say.add("You are already there!"); } action.stop(); return false; } let code; if (actor == WorldState.player) { code = (room: Room) => { return WorldState.isRoomRemembered(room); } } let direction = cRoom.getAStarBestDirectionTo(dRoom, code); if (direction == undefined) { if (actor.isPlayer()) { action.say.add("You don't remember how to get there."); } return false; } else { action.setNoun(0, direction); } } } } }); public static ruleCheckIstheredirectionandroom = ActionGo.check.createAndAddRule({ name : "Check Going - is there a direction? Does it lead anywhere?", code : (rulebook) => { let action = rulebook.noun; let cRoom = action.actor.getRoom(); if (cRoom == undefined) { return false; // Rule fails, actor is out of world } let direction = action.getNoun(0); if (direction == undefined) { return false; // Rule fails, no direction } let nextRoom = cRoom.connections[direction]; if (nextRoom == undefined) { return false; // Rule fails, can't go direction that doesn't have a room } action.roomGoneFrom = action.actor.getRoom(); action.roomGoneTo = nextRoom; } }); public static ruleCarryMove = ActionGo.carry.createAndAddRule({ name : "Going - Move Actor to Next Room", code : (rulebook) => { let action = rulebook.noun; let roomGoneFrom = action.actor.getRoom(); let direction = action.getNoun(0); let roomGoneInto = roomGoneFrom.connections[direction]; roomGoneInto.place(action.actor); let actor = action.actor; if (actor == WorldState.player) { action.say.add("You go " + DirectionNames[Direction[direction]].toLowerCase() + "."); } else { if (roomGoneFrom == WorldState.player.getRoom()) { action.say.add(new SayThe(), actor, " goes " + DirectionNames[Direction[direction]].toLowerCase() + "."); } else { let oppositeName = DirectionNames[ OppositeDirection[direction] ]; action.say.add(new SayThe(), actor, " arrives from the " + oppositeName.toLowerCase() + "."); } } } }); public static ruleCarryRememberRooms = ActionGo.carry.createAndAddRule({ name : "Going - Remember the involved rooms", code : (rulebook) => { let action = rulebook.noun; let actor = action.actor; let roomGoneInto = action.actor.getRoom(); let direction = action.getNoun(0); let roomGoneFrom = roomGoneInto.connections[OppositeDirection[Direction[direction]]]; if (actor.isPlayer()) { WorldState.rememberRoom(roomGoneFrom, roomGoneInto); } } }); }