#charset "us-ascii"

/*
* Yes No Maybe
*
* Credits: This is a routine by Scott Steinfath found at:
*  ftp://ftp.ifarchive.org/if-archive/programming/tads2/examples/answerme.t
*
* Creation Date: 25JAN1994
*
* Converted from Tads 2.0 to Tads 3.0.17 by Cleo Kraft
* Contact on the board here if any questions: http://www.tfgamessite.com
*
* Conversion Date: 22NOV2008
*
* Description: The parser/narrator can ask the player a
*          yes/no/maybe question and if the player actually
*          answers it back, an answer can be given.
*
* Example:
*          Player: "attack dragon"
*          Parser: "What, are you crazy or something?"
*          Player: "yes"
*          Parser: "That's what I thought!"
*
* Set up:
*          If you have the parser ask the player an arbitrary question:
*          1. set the variable myNarrator.questionAsked=true
*          2. set single quoted string values for myNarrator.qYes, qNo and qMaybe
*             using the myNarrator.setNarratorQuestion(yes,no,maybe) function.
*
* Example:
*   someMethod{
*            "Ooooh. How cute. You\'re going to awaken the frost giant.
*            Are you sure or shall I call the undertaker? ";
*            local sYes = 'Seems like you have this well thought out. At least you\'ve got a plan. ';
*            local sNo = 'Good idea. Let\'s let sleeping giants lie. ';
*            local sMaybe = 'I can see you\'re quite decisive. ';
*            myNarrator.setNarratorQuestion(sYes,sNo,sMaybe);
*   }
*
* File Order: Put near the end of your file order in the Tads workbench
*             as this file modifies actor.t, actions.t, etc.
*
*/

#pragma once

#ifndef ADV3_H
#include <adv3.h>
#endif

#ifndef singleDir
#include <en_us.h>
#endif

myNarrator: object
   questionAsked = nil // nil or true - was a question asked to the player?
   questionTurn = nil// nil or turn number this was set
   qYes=nil // nil or a single quoted string value ''
   qNo=nil  // nil or a single quoted string value ''
   qMaybe=nil // nil or a single quoted string value ''
   // This function sets all the string values and flags ready
   setNarratorQuestion(yestext,notext,maybetext){
       myNarrator.questionAsked=true;
       myNarrator.questionTurn=libGlobal.totalTurns;
       myNarrator.qYes=yestext;
       myNarrator.qNo=notext;
       myNarrator.qMaybe=maybetext;
   }
;

// see actions.t
modify YesAction
 execAction(){
    if((myNarrator.questionAsked!=nil) &&
       (myNarrator.questionTurn!=nil)){
        if((libGlobal.totalTurns-1)==(myNarrator.questionTurn)){
           say(myNarrator.qYes);
           myNarrator.questionAsked=nil;
           exit;
        }
    }
    gIssuingActor.sayYes(gActor);// default in actions.t
 }
;

// see actions.t
modify NoAction
 execAction(){
   if((myNarrator.questionAsked!=nil) &&
       (myNarrator.questionTurn!=nil)){
        if((libGlobal.totalTurns-1)==(myNarrator.questionTurn)){
           say(myNarrator.qNo);
           myNarrator.questionAsked=nil;
           exit;
        }
    }
    gIssuingActor.sayNo(gActor);// default in actions.t
 }
;


VerbRule(Maybe)
   'maybe' | 'possibly' | 'say' 'maybe' | 'could' 'be' | 'say' 'could' 'be' | 'say' 'possibly'
   : MaybeAction
   verbPhrase = 'say/saying maybe'
;

DefineConvIAction(Maybe)
 execAction(){
   if((myNarrator.questionAsked!=nil) &&
       (myNarrator.questionTurn!=nil)){
        if((libGlobal.totalTurns-1)==(myNarrator.questionTurn)){
           say(myNarrator.qMaybe);
           myNarrator.questionAsked=nil;
           exit;
        }
    }
    gIssuingActor.sayMaybe(gActor);
 }
;


SuggestedMaybeTopic
   name = 'maybe'
   fullName = 'say maybe'
;

modify Actor
 sayMaybe(actor) { sayToActor(actor, maybeTopicObj, maybeConvType); }

 defaultMaybeResponse(fromActor)
       { mainReport(&noResponseFromMsg, self); } // where "no" doesn't mean logical yes/no but no as in "The actor does not respond. "
;

class SuggestedMaybeTopic: SuggestedTopic
   suggestionGroup = [suggestionYesNoMaybeGroup]// see: actor.t
;

maybeConvType: ConvType
   unknownMsg = &sayMaybeMsg
   topicListProp = &miscTopics
   defaultResponseProp = &defaultMaybeResponse
   defaultResponse(db, other, topic)
       { db.defaultMaybeResponse(other); }
;

class YesNoMaybeTopic: MiscTopic
   includeInList = [&miscTopics]
   matchList = [yesTopicObj, noTopicObj, maybeTopicObj]
;

class MaybeTopic: YesNoTopic
   matchList = [maybeTopicObj]
;

maybeTopicObj: object;

modify playerActionMessages
 sayMaybeMsg = (addressingNoOneMsg)
;

// YES/NO/MAYBE suggestion group - see msg_neu.t
suggestionYesNoMaybeGroup: SuggestionListGroup
   showGroupList(pov, lister, lst, options, indent, infoTab)
   {
       /*
        *   if we have one each of YES and NO responses, make the entire
        *   list "say yes or no"; otherwise, use the default behavior
        */
       if (lst.length() == 2
           && lst.indexWhich({x: x.ofKind(SuggestedYesTopic)}) != nil
           && lst.indexWhich({x: x.ofKind(SuggestedNoTopic)}) != nil
           && lst.indexWhich({x: x.ofKind(SuggestedMaybeTopic)}) != nil)
       {
           /* we have a [yes, no] group - use the simple message */
           "say yes, no or maybe";
       }
       else
       {
           /* inherit the default behavior */
           inherited(pov, lister, lst, options, indent, infoTab);
       }
   }
   groupPrefix = "say";
;