! ----------------------------------------------------------------------------
! PluralObj - an Inform library to allow plural nouns. For example, a pair of
!             gloves, some adverts, or a pile of magazines. Give an object the
!             attribute 'pluralobj' and the correct messages will appear.
!
!             #include it just before VerbLib.
!             (c) Andrew Clover, 1995, but freely usable. Release 2.
!             Compatible with Inform 5.5, library 5/12
! ----------------------------------------------------------------------------

! NB. This library provides LibraryMessages in order to change the library
!     responses to plural-aware ones. If you want to provide your own library
!     messages, call the LibraryMessages object LibraryMessages2.

! This library gives you some commands to use instead of just printing 'it' or
! such like. They are itthey, itthem, doesntdont, isntarent, thatthose,
! thisthese (lower case initials); ittheyc, itstheyrec, thatthosec,
! thisthesec, thatstheyre, thattheyc (upper case). Also verbsuf, which just
! prints 's' for singular-form verbs. The commands also print the correct
! pronoun for animates. One parameter is necessary, an object number to check
! for pluralobj. With anything else, your printing commands will have to check
! for the pluralobj flag themselves.

attribute pluralobj;

object LibraryMessages "lm"
 with before [ i;
        #IFDEF LibraryMessages2;
          i=runroutines(LibraryMessages2,before);
          if (i~=0)
            return i;
        #ENDIF;
        i=action;            ! pointless statements to stop a compiler warning
        i=action;            ! 'unused variable' appearing if lm2 object absent
        Take:
          if (lm_n==5)
            {
            print "You already have ";
            thatthose(noun);
            ".";
            }
          if (lm_n==6)
            {
            thatthosec(noun);
            print " seem";
            verbsuf(noun);
            " to belong to ";
            defart(lm_o);
            ".";
            }
          if (lm_n==7)
            {
            thatthosec(noun);
            print " seem";
            verbsuf(noun);
            " to be a part of ";
            defart(lm_o);
            ".";
            }
          if (lm_n==8)
            {
            thatthosec(noun);
            print " ";
            isntarent(noun);
            " available.";
            }
          if (lm_n==10)
            {
            thatstheyrec(noun);
            " hardly portable.";
            }
          if (lm_n==11)
            {
            thatstheyrec(noun);
            " fixed in place.";
            }
        Drop:
          if (lm_n==2)
            {
            print "You haven't got ";
            thatthose(noun);
            ".";
            }
        Remove:
          if (lm_n==1)
            {
            ittheyc(second);
            print " ";
            if (second has pluralobj)
              print " are";
            else
              print " is";
            " unfortunately closed.";
            }
          if (lm_n==2)
            {
            print "But ";
            itthey(noun);
            print " ";
            isntarent(noun);
            " there now.";
            }
        PutOn:
          if (lm_n==5)
            {
            print "(first taking ";
            itthem(noun);
            " off)^";
            }
        Insert:
          if (lm_n==1)
            {
            print "You need to be holding ";
            itthem(noun);
            print " before you can put ";
            itthem(noun);
            " into something else.";
            }
          if (lm_n==2)
            {
            thattheyc(second);
            " can't contain things.";
            }
          if (lm_n==3)
            {
            print "Alas, ";
            itthey(second);
            if (second has pluralobj)
              print " are";
            else
              print " is";
            " closed.";
            }
          if (lm_n==4)
            {
            print "You'll need to take ";
            itthem(second);
            " off first.";
            }
          if (lm_n==6)
            {
            print "(first taking ";
            itthem(noun);
            " off)^";
            }
        Transfer:
          if (lm_n==1)
            {
            thatthose(noun);
            print " ";
            isntarent(noun);
            " in your possession.";
            }
          if (lm_n==2)
            {
            print "First pick ";
            itthem(noun);
            " up.";
            }
        Enter:
          if (lm_n==2)
            {
            thatstheyrec(noun);
            " not something you can enter.";
            }
        Search:
          if (lm_n==5)
            {
            print "You can't see inside, since ";
            itthey(noun);
            if (noun has pluralobj)
              print " are";
            else
              print " is";
            " closed.";
            }
          if (lm_n==6)
            {
            cdefart(lm_o);
            if (second has pluralobj)
              print " are";
            else
              print " is";
            " closed.";
            }
        Unlock:
          if (lm_n==1)
            {
            thattheyc(noun);
            print " ";
            doesntdont(noun);
            " seem to be something you can unlock.";
            }
          if (lm_n==2)
            {
            itstheyrec(noun);
            " unlocked at the moment.";
            }
          if (lm_n==3)
            {
            thatthosec(second);
            print " ";
            doesntdont(second);
            " seem to fit the lock.";
            }
        Lock:
          if (lm_n==1)
            {
            thattheyc(noun);
            print " ";
            doesntdont(noun);
            " seem to be something you can lock.";
            }
          if (lm_n==2)
            {
            itstheyrec(noun);
            " locked at the moment.";
            }
          if (lm_n==3)
            {
            print "First you'll have to close ";
            itthem(noun);
            ".";
            }
          if (lm_n==4)
            {
            thatthose(second);
            print " ";
            doesntdont(second);
            " seem to fit the lock.";
            }
        SwitchOn:
          if (lm_n==1)
            {
            thatstheyrec(noun);
            " not something you can switch.";
            }
          if (lm_n==2)
            {
            thatstheyrec(noun);
            " already on.";
            }
        SwitchOff:
          if (lm_n==1)
            {
            thatstheyrec(noun);
            " not something you can switch.";
            }
          if (lm_n==2)
            {
            thatstheyrec(noun);
            " already off.";
            }
        Open:
          if (lm_n==1)
            {
            thatstheyrec(noun);
            " not something you can open.";
            }
          if (lm_n==2)
            {
            ittheyc(noun);
            print " seem";
            verbsuf(noun);
            " to be locked.";
            }
          if (lm_n==3)
            {
            itstheyrec(noun);
            " already open.";
            }
        Close:
          if (lm_n==1)
            {
            thatstheyrec(noun);
            " not something you can close.";
            }
          if (lm_n==2)
            {
            itstheyrec(noun);
            " already closed.";
            }
        Disrobe:
          if (lm_n==1)
            {
            print "You're not wearing ";
            thatthose(noun);
            ".";
            }
        Wear:
          if (lm_n==1)
            {
            print "You can't wear ";
            thatthose(noun);
            "!";
            }
          if (lm_n==2)
            {
            print "You're not holding ";
            itthem(noun);
            ".";
            }
          if (lm_n==3)
            {
            print "You're already wearing ";
            thatthose(noun);
            "!";
            }
        Eat:
          if (lm_n==1);
            {
            thatstheyrec(noun);
            " plainly inedible.";
            }
        Cut:
          print "Cutting ";
          thatthose(noun);
          " would achieve little.";
        Blow:
          print "You can't usefully blow ";
          thatthose(noun);
          ".";
        Set:
          print "No, you can't set ";
          thatthose(noun);
          ".";
        SetTo:
          print "No, you can't set ";
          thatthose(noun);
          " to anything.";
        Wave:
          if (lm_n==1)
            {
            print "But you aren't holding ";
            thatthose(noun);
            ".";
            }
        Push, Pull, Turn:
          if (lm_n==1)
            {
            itstheyrec(noun);
            " fixed in place.";
            }
      ];

[ itthey i;
 if (i has pluralobj)
   print "they";
 else
   {
   if (i has animate)
     {
     if (i has female)
       print "she";
     else
       print "he";
     }
   else
     print "it";
   }
];

[ thattheyc i;
 if (i has pluralobj)
   print "They";
 else
   {
   if (i has animate)
     {
     if (i has female)
       print "She";
     else
       print "He";
     }
   else
     print "That";
   }
];

[ itthem i;
 if (i has pluralobj)
   print "them";
 else
   {
   if (i has animate)
     {
     if (i has female)
       print "her";
     else
       print "him";
     }
   else
     print "it";
   }
];

[ ittheyc i;
 if (i has pluralobj)
   print "They";
 else
   {
   if (i has animate)
     {
     if (i has female)
       print "She";
     else
       print "He";
     }
   else
     print "It";
   }
];

[ itstheyrec i;
 if (i has pluralobj)
   print "They're";
 else
   {
   if (i has animate)
     {
     if (i has female)
       print "She's";
     else
       print "He's";
     }
   else
     print "It's";
   }
];

[ thatstheyrec i;
 if (i has pluralobj)
   print "They're";
 else
   {
   if (i has animate)
     {
     if (i has female)
       print "She's";
     else
       print "He's";
     }
   else
     print "That's";
   }
];

[ doesntdont i;
 if (i hasnt pluralobj)
   print "doesn't";
 else
   print "don't";
];

[ isntarent i;
 if (i hasnt pluralobj)
   print "isn't";
 else
   print "aren't";
];

[ thatthose i;
 if (i hasnt pluralobj)
   print "that";
 else
   print "those";
];

[ thatthosec i;
 if (i hasnt pluralobj)
   print "That";
 else
   print "Those";
];

[ thisthese i;
 if (i hasnt pluralobj)
   print "this";
 else
   print "these";
];

[ thisthesec i;
 if (i hasnt pluralobj)
   print "This";
 else
   print "These";
];

[ verbsuf i;
 if (i hasnt pluralobj)
   print "s";
];