/// /// /// /// class ActionTake extends Action { public static check : Rulebook = new Rulebook("Check Taking"); public static carry : Rulebook = new Rulebook("Carry out Taking"); /** * 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 {Say} */ public getCommandText () { return "take " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : ""); } public static defaultCarryTakingRule = new Rule({ name : "Taking - Add the thing to your inventory", code : (rulebook : RulebookRunner) => { let action = rulebook.noun; let actor = action.actor; let thing = (action.getNoun(0)); if (thing.getEnclosedOne() != undefined) { // Remove Part Of, Carried or Wielded. It's essentially stealing. Thing.EnclosedRelation.unsetRight(thing); } else { thing.removeFromRoom(); } Thing.CarryRelation.setRelation(actor, action.getNoun(0)); if (actor == WorldState.player) { action.say.add(new SayBold(( action.getNoun(0)).getPrintedName() + ": "), "Taken."); } else { action.say.add(new SayThe(), actor, " takes ", new SayThe(undefined, true), ( action.getNoun(0)), "."); } } }); } ActionTake.check.addRule( new Rule({ name : "Check Taking - Who has it, really?", priority : Rule.PRIORITY_HIGHEST, code : (rulebook : RulebookRunner) => { let action = rulebook.noun; let actor = action.actor; let thing = (action.getNoun(0)); let owner = thing.getEnclosedOne(); if (owner == actor){ if (owner == WorldState.player) { action.say.add("You already have it."); } return false; } } }) ); ActionTake.check.addRule( new Rule({ name : "Check Taking - Donut steal", code : (rulebook : RulebookRunner) => { let action = rulebook.noun; let actor = action.actor; let thing = (action.getNoun(0)); let owner = thing.getEnclosedOne(); if (owner != undefined && owner.animated){ if (actor == WorldState.player) { action.say.add(owner.getPrintedName() + " wouldn't like that."); } return false; } } }) ); ActionTake.check.addRule( new Rule({ name : "Check Taking - Can't take fixed in place", code : (rulebook : RulebookRunner) => { let action = rulebook.noun; let actor = action.actor; let thing = (action.getNoun(0)); if (thing.fixedInPlace){ if (actor == WorldState.player) { action.say.add("You can't take that."); } return false; } } }) ); ActionTake.carry.addRule( ActionTake.defaultCarryTakingRule ); Elements.HyperlinkHandler.HyperlinkingRulebook.addRule(new Rule( { name : "Hyperlink - Take", firstPriority : Rule.PRIORITY_HIGHEST, code : (rulebook : RulebookRunner) => { let thing = rulebook.noun; if (!thing.animated && !thing.fixedInPlace && thing.getRoom() == WorldState.player.getRoom() && thing.getEnclosedOne() instanceof Room) { Elements.HyperlinkHandler.addAvailableAction("Take", new ActionTake(WorldState.player, thing)); } } } ));