// hit.js
(function () {
/* global adventurejs A */
/**
* @augments {adventurejs.Verb}
* @class hit
* @ajsnode game.dictionary.verbs.hit
* @ajsconstruct MyGame.createVerb({ "name": "hit", [...] });
* @ajsconstructedby adventurejs.Dictionary#createVerb
* @hideconstructor
* @ajsinstanceof Verb
* @ajsnavheading AltercationVerbs
* @summary Verb meaning hit asset.
* @ajssynonyms hit, attack
* @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">> hit dragon</span>
* You hit the dragon. It's a curious way to commit suicide. The dragon lunges to bite you while at the same time whipping its tail in your direction, and clumsily manages to latch onto its own tail instead of you. The dragon screams in pain!
* </pre>
* <p>
* <strong>Hit</strong> a
* {@link adventurejs.Tangible|Tangible}
* {@link adventurejs.Asset|Asset}.
* Requires that the Asset to be hit has
* asset.dov.hit.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
* </div>
*/
A.Preverbs.hit = {
name: "hit",
prettyname: "hit",
past_tense: "hit",
synonyms: ["hit", "attack", "rochambeau"],
gerund: "hitting",
/**
* @ajsverbstructures
* @memberof hit
*/
accepts_structures: ["verb noun", "verb noun preposition noun"],
/**
* @memberof hit
* @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 hit
* @ajsverbphrase
* phrase2:
* {
* accepts_noun: true,
* noun_must_be:
* {
* in_inventory: true,
* known: true,
* },
* accepts_preposition: true,
* requires_preposition: true,
* },
*/
phrase2: {
accepts_noun: true,
noun_must_be: { in_inventory: true, known: true },
accepts_preposition: true,
requires_preposition: true,
},
/**
* @memberof hit
* @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(this.name)) {
this.game.debug(
`D1307 | ${this.name}.js | ${direct_object.id}.dov.${this.name}.enabled is false `
);
msg += `{We} can't ${this.name} ${direct_object.articlename}. `;
this.handleFailure(msg);
return null;
}
// verb state? skip
// single use direct object?
if (
direct_object.allowVerbOnce(this.name, "dov") &&
direct_object.didVerb(this.name, "dov")
) {
this.game.debug(
`D1957 | ${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(
`D1697 | ${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(`D1701 | ${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")) {
if ("with" === indirect_preposition) {
// is subject holding asset?
if (!this.game.parser.selectInHands(indirect_object.id).length) {
this.game.debug(
`D2133 | ${this.name}.js | ${indirect_object.id}.$is("inhands") is false `
);
msg += `{We're} not holding ${indirect_object.articlename}. `;
this.handleFailure(msg);
return null;
}
}
// 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(
`D1309 | ${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(
`D1958 | ${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(
`D2136 | ${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);
},
};
})(); // hit