///
///
///
///
///
///
class ActionRemove extends Action {
public static check: Rulebook = new Rulebook("Check Removing");
public static carry: Rulebook = new Rulebook("Carry out Removing");
/**
* 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 off " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : "");
}
public getClothing () : Clothing{
return this.getNoun(0);
}
public static checkIsWearable = ActionRemove.check.createAndAddRule({
name : "Is noun a clothing",
firstPriority : Rule.PRIORITY_HIGHEST,
code : (runner : RulebookRunner) => {
let action = runner.noun;
let noun = action.getClothing();
if (!(noun instanceof Clothing)) {
if (action.actor == WorldState.player) {
action.say.add("You can only remove Clothing.");
}
return false;
}
}
});
public static checkIsHeld = ActionRemove.check.createAndAddRule({
name : "Is noun worn",
firstPriority : Rule.PRIORITY_HIGH,
code : async (runner : RulebookRunner) => {
let action = runner.noun;
let noun = action.getClothing();
if (!Thing.WearRelation.isRight(action.actor, noun)) {
if (action.actor == WorldState.player) {
action.say.add("You are not wearing it.");
}
return false;
}
}
});
public static carryDefault = ActionRemove.carry.createAndAddRule({
name : "Set Clothing as Carried",
firstPriority : Rule.PRIORITY_MEDIUM,
code : (runner : RulebookRunner) => {
let action = runner.noun;
let noun = action.getClothing();
Thing.CarryRelation.setRelation(action.actor, noun);
let actor = action.actor;
let thing = (action.getNoun(0));
if (actor == WorldState.player) {
action.say.add(new SayBold(thing, ": "), "Removed.");
} else {
action.say.add(new SayThe(), actor, " takes off ", new SayThe(), thing, ".");
}
}
});
}
/**
* Hyperlinking
*/
Elements.HyperlinkHandler.HyperlinkingRulebook.addRule(new Rule(
{
name : "Hyperlink - Remove",
firstPriority : Rule.PRIORITY_HIGHEST,
code : (rulebook : RulebookRunner) => {
let thing = rulebook.noun;
if (thing instanceof Clothing && (Thing.WearRelation.isRight(WorldState.player, thing))) {
Elements.HyperlinkHandler.addAvailableAction("Remove", new ActionRemove(WorldState.player, thing));
}
}
}
));
/**
Inventory
*/
Elements.InventoryHandler.LinkingThing.addRule(new Rule(
{
name : "Inventory - Remove",
firstPriority : Rule.PRIORITY_LOWEST,
code : (rulebook : RulebookRunner) => {
let thing = rulebook.noun;
if (thing instanceof Clothing && (Thing.WearRelation.isRight(WorldState.player, thing))) {
Elements.InventoryHandler.printThingLink("R", new ActionRemove(WorldState.player, thing));
}
}
}
));