///
///
///
class ActionTalk extends Action {
public static PRIORITY_SITUATION_DIALOGUE = 9;
public static PRIORITY_POSSESSION_DIALOGUE = 7;
public static PRIORITY_LOCATION_DIALOGUE = 5;
public static PRIORITY_COMMON_DIALOGUE = 3;
public static PRIORITY_GLOBAL_DIALOGUE = 1;
public static check: Rulebook = new Rulebook("Check Talking");
public static carry: Rulebook = new Rulebook("Carry out Talking");
public static defaultCarryTalkingRule = ActionTalk.carry.createAndAddRule({
name : "Talking - Check with the AI",
firstPriority : Rule.PRIORITY_HIGHEST,
priority : Rule.PRIORITY_HIGHEST,
code : async (rulebook : RulebookRunner) => {
let action = rulebook.noun;
//let actor = action.actor;
let thing = (action.getNoun(0));
if (thing instanceof Person && action.actor instanceof Person) {
let runAndStop : Array = [];
let runAndContinue : Array = [];
let circumstantialOptions : Array = [];
await thing.AI.answerTo({greeter : action.actor, answerer : thing, options : circumstantialOptions, runAndStop : runAndStop, runFirst : runAndContinue});
if (runAndStop.length > 0) {
await runAndStop[0].execute();
return true; // must stop executing now
} else if (runAndContinue.length > 0) {
for (let i = 0; i < runAndContinue.length; i++) {
await runAndContinue[i].execute();
}
}
let investigativeOptions : Array = [];
await thing.AI.interrogateTo({greeter : action.actor, answerer : thing, options : investigativeOptions, runAndStop : runAndStop, runFirst : runAndContinue});
if (investigativeOptions.length == 0 && circumstantialOptions.length == 0) {
return;
}
let choices : Array = [];
let results = [];
if (investigativeOptions.length > 0) {
// TODO: Add more textx
choices.push(new Say(new OneOf(OneOf.PURELY_AT_RANDOM, "Ask about...")));
results.push(null);
}
for (let i = 0; i < circumstantialOptions.length; i++) {
choices.push(circumstantialOptions[i].text);
results.push(circumstantialOptions[i].tree);
}
// TODO: Add more texts
choices.push(new Say(new OneOf(OneOf.PURELY_AT_RANDOM, "Goodbye")));
results.push(undefined);
let choice = await Controls.giveChoices(true, ...choices);
if (results[choice[1]] === null) {
choices = [];
results = [];
for (let i = 0; i < investigativeOptions.length; i++) {
choices.push(investigativeOptions[i].text);
results.push(investigativeOptions[i].tree);
}
choice = await Controls.giveChoices(true, ...choices);
if (results[choice[1]] instanceof DialogueTree) {
await (results[choice[1]]).execute();
}
} else if (results[choice[1]] instanceof DialogueTree) {
await (results[choice[1]]).execute();
}
return true;
}
}
});
public static lastCarryTalkingRule = ActionTalk.carry.createAndAddRule({
name : "Talking - Doesn't want to talk",
firstPriority : -1,
priority : -1,
code : (rulebook : RulebookRunner) => {
let action = rulebook.noun;
//let actor = action.actor;
let thing = (action.getNoun(0));
if (thing instanceof Person) {
action.say = new Say(...Say.Mention(action.actor), " greet", action.actor == WorldState.player ? " " : "s ", ...Say.Mention(thing), ". There is no response.");
} else if (action.actor == WorldState.player) {
action.say = new Say("How are you going to talk to that?")
}
}
});
public getCommandText () {
return "talk to " + (this.getNoun(0) != undefined ? this.getNoun(0).getPrintedName() : "");
}
}
Elements.HyperlinkHandler.HyperlinkingRulebook.addRule(new Rule(
{
name : "Hyperlink - Talk",
firstPriority : Rule.PRIORITY_HIGHEST,
priority : Rule.PRIORITY_HIGHEST,
code : (rulebook : RulebookRunner) => {
let thing = rulebook.noun;
if (thing instanceof Person && thing.getRoom() == WorldState.player.getRoom()) {
Elements.HyperlinkHandler.addAvailableAction("Talk", new ActionTalk(WorldState.player, thing));
}
}
}
));