// teleport.js
(function () {
/*global adventurejs A*/
/**
* @augments {adventurejs.Verb}
* @class teleport
* @ajsnode game.dictionary.verbs.teleport
* @ajsconstruct MyGame.createVerb({ "name": "teleport", [...] });
* @ajsconstructedby adventurejs.Dictionary#createVerb
* @hideconstructor
* @ajsinstanceof Verb
* @ajsnavheading UtilityVerbs
* @summary Verb meaning teleport, as in "teleport to moonbase".
* @tutorial Scripting_VerbSubscriptions
* @tutorial Verbs_VerbAnatomy
* @tutorial Verbs_VerbProcess
* @tutorial Verbs_ModifyVerbs
* @tutorial Verbs_WriteVerbs
* @classdesc
* <pre class="display border outline">
* <span class="input">> teleport to planet</span>
* You beam down to the planet. Or, at least, someone identical to
* you does. But is it really <b>you</b> that arrives at the other end of
* the teleportation beam?
* </pre>
* <p>
* <strong>Teleport to</strong> another
* {@link adventurejs.Tangible|Tangible}.
* This is included chiefly as a debug tool, though it
* could also be tweaked into a useful game verb, for
* instance with use of a teleportation device.
* Authors may want to disable it through the use of
* {@link adventurejs.Game#disableVerbs|disableVerbs}.
* To learn more, see
* <a href="/doc/Verbs_ModifyVerbs.html">Modify Verbs</a>
* </p>
*/
A.Preverbs.teleport = {
name: "teleport",
prettyname: "teleport",
synonyms: ["teleport"],
gerund: "teleporting",
/**
* @ajsverbstructures
* @memberof teleport
*/
accepts_structures: ["verb preposition noun"],
/**
* @memberof teleport
* @ajsverbphrase
* phrase1:
* {
* accepts_noun:true,
* requires_noun:true,
* noun_must_be:
* {
* tangible: true,
* present: false,
* // known: true, // false for debug, would be true if used as player verb
* },
* accepts_preposition: true,
* requires_preposition: true,
* accepts_these_prepositions: ["to"],
* },
*/
phrase1: {
accepts_noun: true,
requires_noun: true,
noun_must_be: {
tangible: true,
present: false,
// known: true,
},
accepts_preposition: true,
requires_preposition: true,
accepts_these_prepositions: ["to"],
},
/**
* @memberof teleport
* @ajsverbparams
* with_params: {},
*/
with_params: {},
doTry: function () {
var input = this.game.getInput();
var verb_phrase = input.verb_phrase;
var direct_object = input.getAsset(1);
var player = this.game.getPlayer();
var nest_preposition = player.getNestPreposition();
var nest_asset = player.getNestAsset();
var currentRoom = this.game.getCurrentRoom();
var msg = "";
if (
direct_object instanceof adventurejs.Room &&
direct_object.id == currentRoom.id
) {
this.game.debug(
`D1437 | teleport.js | player is in " + ${currentRoom.id} + " `
);
msg += `$(We're) already there. `;
this.handleFailure(msg);
return null;
}
if (nest_asset && nest_asset.id === direct_object.id) {
this.game.debug(
`D1438 | teleport.js | player is nested in ${nest_asset.id}`
);
msg += `$(We're) already ${nest_preposition} ${direct_object.articlename}. `;
this.handleFailure(msg);
return null;
}
if (direct_object.getRoomId() === currentRoom.id) {
this.game.debug(`D1439 | teleport.js | player is in ${currentRoom.id}`);
msg = `$(We're) already there. `;
this.handleFailure(msg);
return null;
}
return true;
},
doSuccess: function () {
var input = this.game.getInput();
var verb_phrase = input.verb_phrase;
var direct_object = input.getAsset(1);
var player = this.game.getPlayer();
var nest_asset = player.getNestAsset();
var newRoom;
var results;
var msg = "";
// is direct_object a room?
if (direct_object instanceof adventurejs.Room) {
newRoom = direct_object;
} else {
newRoom = this.game.getAsset(direct_object.getRoomId());
}
// if player is nested, unnest from old nest
// unless it's a simple vehicle
if (nest_asset && !nest_asset.isWithin(player)) {
results = player.onUnnestThisFromThat(nest_asset);
if ("undefined" !== typeof results) return results;
}
this.game.setPlayerRoom(newRoom, input);
msg += `$(We) teleport to ${direct_object.definite_name}. `;
// print output
return this.handleSuccess(msg, direct_object);
},
};
})(); // teleport