///
///
///
///
class ActionInventory extends Action {
public requiresTurn = false;
public requiresNoun = false;
public requiresVisibility = false;
public static check : Rulebook = new Rulebook("Check Taking Inventory");
public static carry : Rulebook = new Rulebook("Carry out Taking Inventory");
/**
* 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 inventory";
}
public static async createButton (thing : Thing, resolve : (t : Thing) => void) {
let p = document.createElement("p");
p.classList.add("choice");
p.classList.add("small");
let elements = await ((new Say(thing)).getPureElements());
elements.forEach(ele => {
p.appendChild(ele);
});
p.addEventListener("click", () => {
resolve(thing);
});
Controls.KeyHandler.applyCode(p, Controls.KeyHandler.getFirstKeyCode());
return p;
}
public static checkInventoryRule = ActionInventory.check.createAndAddRule({
name : "List inventory as options",
code : async (rulebook : RulebookRunner) => {
let player = WorldState.player;
let wielded = Thing.WieldRelation.getRight(player).sort(Elements.InventoryHandler.thingSort);
let worn = Thing.WearRelation.getRight(player).sort(Elements.InventoryHandler.thingSort);
let carried = Thing.CarryRelation.getRight(player).sort(Elements.InventoryHandler.thingSort);
let buttons;
let chosenPromise = new Promise((async resolve => {
Controls.KeyHandler.reset();
let say = new Say();
if (wielded.length > 0) {
say.add(new SayBold("Wielded:"), Say.PARAGRAPH_BREAK);
for (let i = 0; i < wielded.length; i++) {
say.add(await ActionInventory.createButton(wielded[i], resolve));
}
}
if (worn.length > 0) {
if (say.sequence.length > 0) {
say.add(Say.PARAGRAPH_BREAK);
}
say.add(new SayBold("Worn:"), Say.LINE_BREAK);
for (let i = 0; i < worn.length; i++) {
say.add(await ActionInventory.createButton(worn[i], resolve));
}
}
if (carried.length > 0) {
if (say.sequence.length > 0) {
say.add(Say.PARAGRAPH_BREAK);
}
say.add(new SayBold("Carried:"), Say.LINE_BREAK);
for (let i = 0; i < carried.length; i++) {
say.add(await ActionInventory.createButton(carried[i], resolve));
}
}
if (say.sequence.length == 0) {
return resolve(undefined);
}
buttons = await say.getHTMLContent();
Elements.CurrentTurnHandler.print(...(buttons));
}));
let chosenThing = await chosenPromise;
rulebook.noun.setNoun(0, chosenThing);
if (chosenThing != undefined) {
Elements.CurrentTurnHandler.unprint(...buttons);
Controls.KeyHandler.reset();
return new ActionExamine(WorldState.player, chosenThing);
} else {
rulebook.noun.say.add("You have nothing.");
return false;
}
}
});
}
Elements.HyperlinkHandler.CommonActionsRulebook.addRule(new Rule({
name : "Add Take Inventory Command Rule",
firstPriority : Rule.PRIORITY_LOWEST,
priority : Rule.PRIORITY_MEDIUM,
code : (rulebook : RulebookRunner) => {
Elements.HyperlinkHandler.addCommonAction("Inventory", new ActionInventory(WorldState.player));
}
}));