// slap.js
(function () {
/* global adventurejs A */
/**
* @augments {adventurejs.Verb}
* @class slap
* @ajsnode game.dictionary.verbs.slap
* @ajsconstruct MyGame.createVerb({ "name": "slap", [...] });
* @ajsconstructedby adventurejs.Dictionary#createVerb
* @hideconstructor
* @ajsinstanceof Verb
* @ajsnavheading AltercationVerbs
* @summary Verb meaning slap, as in "slap knight with gauntlet".
* @tutorial Verbs_Subscriptions
* @tutorial AdvancedVerbs_VerbAnatomy
* @tutorial AdvancedVerbs_VerbProcess
* @tutorial AdvancedVerbs_ModifyVerbs
* @tutorial AdvancedVerbs_ModifyVerbs
* @classdesc
* <pre class="display border outline">
* <span class="ajs-player-input">> slap salami</span>
* You slap the salami as much as the next guy, but right now is neither the time nor the place. In thirteen minutes the Prime Minister is going to walk through that door and if you haven't got the perfect sandwich prepared and waiting, your career as Head Sandwich Maker at 10 Downing Street will be done before it's begun. Best prepare your secret weapon: the sweet baby gherkins. You whip out the jar and jerk open the lid.
* </pre>
* <p>
* <strong>Slap</strong> a
* {@link adventurejs.Tangible|Tangible}
* {@link adventurejs.Asset|Asset}.
* Requires that the Asset to be slapped has
* asset.dov.slap.enabled
* set to true. By default, no special results will occur.
* Authors wanting to make use of it may need to use a method such
* as verb hooks. See
* <a href="/doc/Verbs_PhaseHooks.html">Verb Phases</a>
* to learn more.
* </p>
* @ajsverbreactions
* @ajsverbphases doBeforeTry, doAfterTry, doBeforeSuccess, doAfterSuccess
*/
A.Preverbs.slap = {
name: "slap",
prettyname: "slap",
past_tense: "slapped",
synonyms: ["slap"],
gerund: "slapping",
/**
* @ajsverbstructures
* @memberof slap
*/
accepts_structures: ["verb noun", "verb noun preposition noun"],
/**
* @memberof slap
* @ajsverbphrase
* phrase1:
* {
* accepts_noun:true,
* requires_noun:true,
* noun_must_be:
* {
* known: true,
* tangible: true,
* present: true,
* visible: true,
* reachable: true,
* },
* },
*/
phrase1: {
accepts_noun: true,
requires_noun: true,
noun_must_be: {
known: true,
tangible: true,
present: true,
visible: true,
reachable: true,
},
},
/**
* @memberof slap
* @ajsverbphrase
* phrase2:
* {
* accepts_noun:true,
* noun_must_be:
* {
* known: true,
* tangible: true,
* in_inventory: true,
* },
* accepts_preposition:true,
* requires_preposition:true,
* preposition_must_be: ['with'],
* },
*/
phrase2: {
accepts_noun: true,
noun_must_be: {
known: true,
tangible: true,
in_inventory: true,
},
accepts_preposition: true,
requires_preposition: true,
preposition_must_be: ["with"],
},
/**
* @memberof slap
* @ajsverbparams
* with_params: {},
*/
with_params: {},
doTry: function () {
var input = this.game.getInput();
var subject = input.getSubject();
var direct_object = input.getAsset(1);
var indirect_object = input.getAsset(2);
var indirect_preposition = input.getPreposition(2);
var indirect_inferred;
var results;
var msg = "";
// verb enabled?
if (!direct_object.isDOV("slap")) {
this.game.debug(
`D1407 | ${this.name}.js | ${direct_object.id}.dov.slap.enabled is false`
);
msg += `{We} can't slap ${direct_object.articlename}. `;
this.handleFailure(msg);
return null;
}
// single use direct object?
if (
direct_object.allowVerbOnce(this.name, "dov") &&
direct_object.didVerb(this.name, "dov")
) {
this.game.debug(
`D1983 | ${this.name}.js | ${direct_object.id}.dov.${this.name}.once and ${direct_object.id}.did.${this.name}.directly `
);
msg += `${direct_object.Articlename} has already been ${this.past_tense}. `;
this.handleFailure(msg);
return false;
}
if (input.hasStructure("verb noun")) {
// indirect objects available?
if (
!direct_object.hasIndirectObjects(this.name) &&
!direct_object.allowVerbWithNothing(this.name, "dov")
) {
this.game.debug(
`D1984 | ${this.name}.js | ${direct_object.id}.dov.${this.name}.with_nothing is false `
);
msg += `{We} {don't} know of a way to ${this.name} ${direct_object.articlename}. `;
this.handleFailure(msg);
return false;
}
// infer indirect object?
results = this.tryToInferIndirectObject({
direct_object: direct_object,
context: subject,
handle_input: true,
});
if (results.prompt) {
// can verb act without an indirect object?
if (direct_object.allowVerbWithNothing(this.name, "dov")) {
return true;
}
this.game.debug(`D1985 | ${this.name}.js | soft prompt for noun2 `);
msg += `What would {we} like to ${this.name} ${direct_object.articlename} with? `;
this.handleFailure(msg);
return false;
} else if (results.success) {
indirect_object = results.indirect_object;
indirect_preposition = "with";
indirect_inferred = true;
input.setAsset(2, indirect_object);
input.setPreposition(2, indirect_preposition);
input.setStructure("verb noun preposition noun");
this.game.printInferred(
`${indirect_preposition} ${indirect_object.articlename}`
);
}
} // verb noun
// sentence structure: verb noun preposition noun
if (input.hasStructure("verb noun preposition noun")) {
// works with any indirect object?
if (direct_object.allowVerbWithAnything(this.name, "dov")) {
return true;
}
// indirect object not required?
// if( direct_object.allowVerbWithNothing(this.name, "dov") )
// {
// this.game.debug(` | ${this.name}.js | ${direct_object.id}.dov.${this.name}.with_nothing `);
// msg += `{We} can't ${this.name} ${direct_object.articlename} ${indirect_preposition} ${indirect_object.articlename}. `;
// this.handleFailure(msg);
// return null;
// }
// indirect object usable with direct object?
if (
!direct_object.allowVerbWithAsset({
verb: this.name,
asset: indirect_object,
ov: "dov",
})
) {
this.game.debug(
`D1986 | ${this.name}.js | ${direct_object.id}.dov.${this.name}.with_assets/with_classes does not include ${indirect_object.id} `
);
msg += `{We} can't ${this.name} ${direct_object.articlename} ${indirect_preposition} ${indirect_object.articlename}. `;
this.handleFailure(msg);
return null;
}
// can indirect object be used?
if (!indirect_object.isIOV(this.name)) {
this.game.debug(
`D1987 | ${this.name}.js | ${indirect_object.id}.iov.${this.name}.enabled is false `
);
msg += `{We} can't ${this.name} anything ${indirect_preposition} ${indirect_object.articlename}. `;
this.handleFailure(msg);
return false;
}
// single use indirect object?
if (
indirect_object.allowVerbOnce(this.name, "iov") &&
indirect_object.iDidVerb(this.name, "iov")
) {
this.game.debug(
`D1988 | ${this.name}.js | ${indirect_object.id}.iov.${
this.name
}.once and ${indirect_object.id}.did.${this.name}.indirectly is ${
indirect_object.did[this.name].indirectly
} `
);
msg += `${indirect_object.Articlename} has already been used to ${this.name} something. `;
this.handleFailure(msg);
return null;
}
}
return true;
},
doSuccess: function () {
var input = this.game.getInput();
var subject = input.getSubject();
var direct_object = input.getAsset(1);
var direct_preposition = input.getPreposition(1);
var indirect_object = input.getAsset(2);
var indirect_preposition = input.getPreposition(2);
var results;
var msg = "";
// compose output
msg +=
`{We} ${this.agree()}` +
`${direct_preposition ? " " + direct_preposition : ""}` +
`${direct_object ? " " + direct_object.articlename : ""}` +
`${indirect_preposition ? " " + indirect_preposition : ""}` +
`${indirect_object ? " " + indirect_object.articlename : ""}` +
`. `;
// --------------------------------------------------
// print output
// --------------------------------------------------
return this.handleSuccess(msg);
},
};
})(); // slap