!---------------------------------------------------------------------------
!     YesNo                     An Inform 6 library to ask a semi-rhetorical
!                               Yes or no question, by L. Ross Raszewski
!                               ([email protected])
!
! Several infocom games have asked the player yes or no questions which are
! partially rhetorical (Take Hitchhiker's for example)  While Inform's library
! provides for askinga question and demanding an answer, it makes no such
! allowance for non-manditory yes or no questions.  This does exactly that.
! send the message YesNo.Ask(ifyes,ifno,ifneither);, where IfYes and IfNo
! are routines to run or messages to print if the player answers yes or no.
! Ifneither is the string or routine that is printed if the player says
! neither yes nor no in the next move.
!
! This is my first fully object-oriented library extension, but it seems to
! work anyway.
!
! You can omit any of the three arguments (actually, you have to put a zero in
! to hold the place if you want to assign an action to ifno, but not ifyes.
!
! The answer is only accepted druing the next turn after the question is asked,
! and uses a timer, so if you're pushing the limit, sorry.
!
! If you like it, or if you don't, e-mail me and say so!

Object YesNo
       with react_before [;  Yes: if (self has on) return self.ifAff();
                             No: if (self has on) return self.ifNeg();
                             default: self.ifNeither();
                         ],
            ifAff 0,
            ifNeg 0,
            ifNeither 0,
            Ask [ ifyes ifno ifnone;
                       self.ifAff=ifyes;
                       self.ifNeg=ifno;
                       self.ifNeither=ifnone;
                       StartTimer(self,1);
                       give self on;
                ],
            time_left 1,
            time_out [; self.ifAff=0; self.ifNeg=0;
                        self.ifNeither=0;
                       give self ~on;],
            found_in [; rtrue;],
        has concealed;