// turnOver.js
(function () {
/* global adventurejs A */
/**
* @augments {adventurejs.Verb}
* @class turnOver
* @ajsnode game.dictionary.verbs.turnOver
* @ajsconstruct MyGame.createVerb({ "name": "turnOver", [...] });
* @ajsconstructedby adventurejs.Dictionary#createVerb
* @hideconstructor
* @ajsinstanceof Verb
* @ajsnavheading ManipulationVerbs
* @summary Verb meaning turn over, as in "turn over turtle".
* @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">> turn over turtle</span>
* The turtoise lays on its back, its belly baking in the hot sun, beating its legs, trying to turn itself over but it can't, not without for your help. But you're not helping. Why is that Leon?
* </pre>
* <p>
* <strong>TurnOver</strong> requires that the
* {@link adventurejs.Tangible|Tangible}
* {@link adventurejs.Asset|Asset} to be turned over has
* asset.dov.turnOver.enabled set to true.
* "Turn off" is a distinct verb from "turn".
* Authors wanting to make use of turn off
* may wish to use verb hooks. See
* <a href="/doc/Verbs_PhaseHooks.html">Verb Phases</a>
* to learn more.
* </p>
* @ajsverbreactions
* @ajsverbphases doBeforeTry, doAfterTry, doBeforeSuccess, doAfterSuccess
*/
A.Preverbs.turnOver = {
name: "turnOver",
prettyname: "turn over",
past_tense: "turned over",
verb_noun_prep: ["turn over"], // turn turtle over
verb_prep_noun: ["turn over"], // turn over turtle
synonyms: ["flip"],
gerund: "turning over",
/**
* @ajsadverbs
* @memberof remove
*/
accepts_adverbs: [],
/**
* @ajsverbstructures
* @memberof remove
*/
accepts_structures: [
"verb noun", // turnOver turtle
"verb noun preposition noun", // turnOver turtle with stick
],
/**
* @memberof turn
* @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 turn
* @ajsverbphrase
* phrase2:
* {
* accepts_noun: true,
* requires_noun: true,
* noun_must_be:
* {
* known: true,
* tangible: true,
* present: true,
* visible: true,
* reachable: true,
* },
* accepts_preposition: true,
* requires_preposition: true,
* preposition_must_be: ["with"],
* },
*/
phrase2: {
accepts_noun: true,
requires_noun: true,
noun_must_be: {
known: true,
tangible: true,
present: true,
visible: true,
reachable: true,
},
accepts_preposition: true,
requires_preposition: true,
preposition_must_be: ["with"],
},
/**
* @memberof turn
* @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 direct_preposition = input.getPreposition(1);
var indirect_preposition = input.getPreposition(2);
var indirect_inferred;
var adverb = input.getAdverb();
var msg = "";
var results;
if (!direct_object.isDOV(this.name)) {
this.game.debug(
`D1454 | ${this.name}.js | ${direct_object.id}.dov.${this.name}.enabled is unset `
);
msg += `${direct_object.Articlename} can't be ${this.past_tense}${
direct_preposition ? " " + direct_preposition : ""
}. `;
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(
`D1456 | ${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(
`D1458 | ${this.name}.js | ${direct_object.id}.dov.${this.name}.with_nothing is false `
);
msg += `{We} {don't} know of a way to ${this.prettyname} ${direct_object.articlename}. `;
this.handleFailure(msg);
return null;
}
// infer indirect object?
results = this.tryToInferIndirectObject({
direct_object: direct_object,
context: subject,
handle_input: true,
});
if (results.prompt) {
// indirect object required?
if (direct_object.allowVerbWithNothing(this.name, "dov")) {
return true;
}
this.game.debug(`D1459 | ${this.name}.js | soft prompt for noun2 `);
msg += `What would {we} like to ${this.prettyname} ${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
// ex: turn nut with wrench
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.prettyname} ${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(
`D1472 | ${this.name}.js | ${direct_object.id}.dov.${this.name}.with_assets/with_classes does not include ${indirect_object.id} `
);
msg += `{We} can't ${this.prettyname} ${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(
`D1476 | ${this.name}.js | ${indirect_object.id}.iov.${this.name} is unset `
);
msg += `${indirect_object.Articlename} can't be used to ${this.prettyname} anything. `;
this.handleFailure(msg);
return null;
}
// single use indirect object?
if (
indirect_object.allowVerbOnce(this.name, "iov") &&
indirect_object.iDidVerb(this.name, "iov")
) {
this.game.debug(
`D1481 | ${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.prettyname} 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 adverb = input.getAdverb();
var results;
var msg = "";
// apply state changes
// this.setState(direct_object, false);
// compose output
msg +=
`{We} ${this.agree("turn")} over` +
`${direct_object ? " " + direct_object.articlename : ""}` +
`${indirect_preposition ? " " + indirect_preposition : ""}` +
`${indirect_object ? " " + indirect_object.articlename : ""}` +
`. `;
// --------------------------------------------------
// print output
// --------------------------------------------------
return this.handleSuccess(msg);
},
};
})(); // turn