#charset "us-ascii" #include "adv3.h" #include "en_us.h" //--------------------------------------------------------------- // MSG_CUSTOM.T // by Greg Boettcher // Version 2.2 released 18 May 2019 // First version released 18 November 2007 // // Version 2.2 Verification of compatibility with TADS 3.1.3 // Slight changes for 3.1.3. Removal of unnecessary // code that added an unnecessary slight risk of // compatibility problems. 2019-05-18 // Version 2.1 (very slight bug fix) released 23 Jun 2010 // // Copyright 2006-2007 Greg Boettcher. // // This file is freeware. You may use it for any purpose without // permission, but please credit me appropriately. // // My email address: // //--------------------------------------------------------------- ModuleID name = 'Msg_custom.t' byLine = 'by Greg Boettcher' htmlByLine = 'by Greg Boettcher' version = '2.2' //showCredit { "<> <>"; } ; /* -------------------- ABOUT THIS EXTENSION -------------------- With this file, you can change the standard TADS 3 messages in any or all of the following ways: 1. You can deal with "smart quotes" as follows: - sometimes use smart quotes (TADS 3.0.9 default) - always use smart quotes (TADS 3.0.10+ default) - never use smart quotes 2. You can deal with contractions as follows: - sometimes use contractions (TADS 3 default) - usually use contractions - always use contractions - or you can use contractions even less often than the standard library does. Not recommended unless your game's narrator and/or its NPCs are supposed to speak like Lieutenant Commander Data of Star Trek. 3. You can, if you want, make the standard messages less formal and more casual. If you do, then "appears" is replaced with "seems"; "you see no" is replaced with "you don't see any"; etc. 4. You can make it so that when your TADS 3 project refers to itself as "the story," this phrase is changed to any of the following: - "the story" - "this story" - "the game" - "this game" 5. You can adjust the phrasing in cases where TADS 3 tells you something "you must" do. You can do this in any of five ways, exemplified as follows: - "You must stand up before you can do that." (TADS 3 default) - "You'll have to stand up before you can do that." - "You'd have to stand up before you could do that." - "You'll need to stand up before you can do that." - "You'd need to stand up before you could do that." These changes should work correctly even if you are doing something unusual, such as putting your game in the past tense or if your game is in the first person or third person. Msg_custom.t should produce the exact same output as msg_neu.t until you adjust its settings to suit your taste. Also, just to be clear, all of its settings are independent of each other. So you can certainly use it even if only one of its features interests you. Although I tested this extension quite thoroughly and it seems relatively bug-free, it is very complicated, so I'm sure there could be some bugs lurking in it. As such, I will need people's help in reporting any and all bugs they may may find. While I can't make any promises for the future, I at least *intend* to maintain this file as needed. ------------------------- HOW TO USE THIS EXTENSION ------------------------- Put msg_custom.t into your project after the standard library files, but before your own files. (And you do need to include the standard library files. Msg_custom.t is not meant to replace msg_neu.t or en_us.t.) Then put something into your project that looks like this: modify libGlobal thisStoryNotTheStory = sometimes gameNotStory = nil youMustPref = youMust useContractions = sometimes preferCasual = true useSmartQuotes = always ; The above example sets each of the variables to their default settings, and as such accomplishes nothing. But you can adjust the values of each of those variables, as described below in the "message variables" comments. The TADS 3 library should respond accordingly. For more details on how to do this for each of the individual variables, see directly below in my "message variables" comments. Have fun! And by all means email me with any bugs you may find. Greg */ /////////////////////////////////////////////////////////// // MESSAGE VARIABLES /////////////////////////////////////////////////////////// modify libGlobal // thisStoryNotTheStory: // = sometimes "*The* story has never referred (T3 default) // to any such footnote." // "*This* story has no ABOUT // information." // = always "*This* story has never referred (my preference) // to any such footnote." // "*This* story has no ABOUT // information." // = never "*The* story has never referred // to any such footnote." // "*The* story has no ABOUT // information." thisStoryNotTheStory = sometimes // gameNotStory: // = nil "This story has no ABOUT information." (T3 default) // = true "This game has no ABOUT information." (my preference) gameNotStory = nil // youMustPref: (when the game is in present tense) // = youMust "You must stand up before (T3 default) // you can do that." // = youllHaveTo "You'll have to stand up before (my preference) // you can do that." // = youdHaveTo "You'd have to stand up before // you could do that." // = youllNeedTo "You'll need to stand up before // you can do that." // = youdNeedTo "You'd need to stand up before // you could do that." // youMustPref: (when the game is in past tense) // = youMust "You had to stand up before (T3 default) // you could do that." // = youllHaveTo "You would have had to stand (my preference) // OR youdHaveTo up before you can do that." // = youllNeedTo "You needed to stand up before // you could do that. // = youdNeedTo "You would have needed to stand // up before you could do that." youMustPref = youMust // useContractions: // = always (always use contractions, even "YOU'VE DIED," etc.) // = usually (my preference) // = sometimes (T3 default) // = seldom (narrator talks like Lt. Cmdr. Data) // = never (narrator and all NPCs talk like Lt. Cmdr. Data) useContractions = sometimes // preferCasual: // = nil "You *see no* box here." (T3 default) // "Bob does not *appear* interested." // [give a "must" example?] // = true "You *don't see any* box here." (my preference) // "Bob does not *seem* interested." // [give a "must" example?] preferCasual = nil // useSmartQuotes: // = always Replace: (my preference, // (1) all double quotes, and TADS 3.0.10+ // (2) all single quotes, and default) // (3) all apostrophes // with // (1) '', '', // (2) '’', '‘', and // (3) '’'. // = sometimes (Default TADS 3.0.9 (TADS 3.0.9 // usage, using smart default) // quotes only sometimes.) // = never (Never use any smart // quotes.) useSmartQuotes = always ; /////////////////////////////////////////////////////////// // ENUMS /////////////////////////////////////////////////////////// #ifndef never enum never; #endif #ifndef seldom enum seldom; #endif #ifndef sometimes enum sometimes; #endif #ifndef usually enum usually; #endif #ifndef always enum always; #endif #ifndef youMust enum youMust; #endif #ifndef youllHaveTo enum youllHaveTo; #endif #ifndef youdHaveTo enum youdHaveTo; #endif #ifndef youllNeedTo enum youllNeedTo; #endif #ifndef youdNeedTo enum youdNeedTo; #endif /////////////////////////////////////////////////////////// // MISC. MODIFICATIONS FOR TADS 3.0.8 /////////////////////////////////////////////////////////// // 2019-05-17 GWB: This section was included to make this extension work equally well // with both TADS 3.0.8 as with 3.0.9+. This section never did any harm for games written // in recent versions of TADS 3, although I'm not sure if my previous comments in this // section truly made that clear (sigh). Either way, this section, allowing the use // of this extension with TADS 3.0.8 is now absurdly unnecessary. //// This extension was originally designed to run on games //// compiled with TADS 3.0.9+. With some modifications, however, //// we can make sure it works with 3.0.8 as well. // //modify GameMainDef // usePastTense = nil //; // //// In TADS 3.0.9, tSel() is defined as a macro rather than //// a function. I don't know why, but I can't help thinking //// that a function would work too, and would also provide //// a better across-the-board solution for all the files //// in a project. //#ifndef tSel ////#define tSel(presVal, pastVal) \ //// (gameMain.usePastTense ? (pastVal) : (presVal)) //tSel(presVal, pastVal) { // return (gameMain.usePastTense ? pastVal : presVal); //} //#endif // //modify langMessageBuilder // pastEnding_ = nil //; // //modify Thing // verbEndingSD = (tSel(verbEndingS, 'd')) // verbEndingSEd = (tSel(verbEndingS, 'ed')) // verbEndingSMessageBuilder_ = // (tSel(verbEndingS, langMessageBuilder.pastEnding_)) // verbToDo = (tSel('do' + verbEndingEs, 'did')) // nameDoes = (theName + ' ' + verbToDo) // verbToGo = (tSel('go' + verbEndingEs, 'went')) // verbToCome = (tSel('come' + verbEndingS, 'came')) // verbToLeave = (tSel('leave' + verbEndingS, 'left')) // verbToSee = (tSel('see' + verbEndingS, 'saw')) // nameSees = (theName + ' ' + verbToSee) // verbToSay = (tSel('say' + verbEndingS, 'said')) // nameSays = (theName + ' ' + verbToSay) // verbMust = (tSel('must', 'had to')) // verbCan = (tSel('can', 'could')) // verbCannot = (tSel('cannot', 'could not')) // verbCant = (tSel('can’t', 'couldn’t')) // verbWill = (tSel('will', 'would')) // verbWont = (tSel('won’t', 'wouldn’t')) //; // //modify NameAsOther // verbEndingSD = (targetObj.verbEndingSD) // verbEndingSEd = (targetObj.verbEndingSEd) // verbToDo = (targetObj.verbToDo) // nameDoes = (targetObj.nameDoes) // verbToGo = (targetObj.verbToGo) // verbToCome = (targetObj.verbToCome) // verbToLeave = (targetObj.verbToLeave) // verbToSee = (targetObj.verbToSee) // nameSees = (targetObj.nameSees) // verbToSay = (targetObj.verbToSay) // nameSays = (targetObj.nameSays) // verbMust = (targetObj.verbMust) // verbCan = (targetObj.verbCan) // verbCannot = (targetObj.verbCannot) // verbCant = (targetObj.verbCant) // verbWill = (targetObj.verbWill) // verbWont = (targetObj.verbWont) //; /////////////////////////////////////////////////////////// // CUSTOM MESSAGE OBJECT /////////////////////////////////////////////////////////// custMsgObj: object // Used only when "you" means the player; not when "you" means // the player character. youllStr() { if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) return 'you will'; else return 'you' + custMsgObj.rsquoPlainStr + 'll'; } youWillStr() { if (libGlobal.useContractions == usually || libGlobal.useContractions == always) return 'you' + custMsgObj.rsquoPlainStr + 'll'; else return 'you will'; } youveStr() { if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) return 'you have'; else return 'you' + custMsgObj.rsquoPlainStr + 've'; } youreStr() { if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) return 'you are'; else return 'you' + custMsgObj.rsquoPlainStr + 're'; } youdStr() { if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) return 'you would'; else return 'you' + custMsgObj.rsquoPlainStr + 'd'; } cantStr() { if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) return 'cannot'; else return 'can' + custMsgObj.rsquoPlainStr + 't'; } storyStr() { //return 'storyStr'; if (libGlobal.gameNotStory) return 'game'; else return 'story'; } theStoryStrFunc(caps, theNotThis) { local str; // str = 'story' or 'game' str = storyStr(); switch (libGlobal.thisStoryNotTheStory) { // Add 'he ' or 'his ' depending on whether it's // 'the' or 'this' case never: str = 'he ' + str; break; case always: str = 'his ' + str; break; default: if (theNotThis) str = 'he ' + str; else str = 'his ' + str; break; } if (caps) str = 'T' + str; else str = 't' + str; return str; } theStoryStr() { return theStoryStrFunc(nil , true); } thisStoryStr() { return theStoryStrFunc(nil , nil ); } TheStoryStr() { return theStoryStrFunc(true, true); } ThisStoryStr() { return theStoryStrFunc(true, nil ); } // Use this when saying something that will never be in the // past tense, e.g. "You, the player, cannot do something." // Do not use for PCs or NPCs, where the verb "cannot" // would change depending on whether the game is in the // past tense. cannotStr() { if (libGlobal.useContractions != usually && libGlobal.useContractions != always) return 'cannot'; else if (libGlobal.useSmartQuotes == always) return 'can’t'; else return 'can\'t'; } // For use only when a given clause is always in the // past tense. wereNotStr() { if (libGlobal.useContractions != usually && libGlobal.useContractions != always) return 'were not'; else if (libGlobal.useSmartQuotes == always) return 'weren’t'; else return 'weren\'t'; } appearStr() { if (libGlobal.preferCasual) return 'seem'; else return 'appear'; } lsquoStr() { if (libGlobal.useSmartQuotes == never) return '\''; else return '‘'; } rsquoStr() { if (libGlobal.useSmartQuotes == never) return '\''; else return '’'; } lsquoPlainStr() { if (libGlobal.useSmartQuotes == always) return '‘'; else return '\''; } rsquoPlainStr() { if (libGlobal.useSmartQuotes == always) return '’'; else return '\''; } ldquoStr() { if (libGlobal.useSmartQuotes == never) return '\"'; //return '\"'; else return '“'; //return '“'; } rdquoStr() { if (libGlobal.useSmartQuotes == never) return '\"'; //return '\"'; else return '”'; //return '”'; } ldquoPlainStr() { if (libGlobal.useSmartQuotes == always) return '“'; //return '“'; else return '\"'; //return '\"'; } rdquoPlainStr() { if (libGlobal.useSmartQuotes == always) return '”'; //return '”'; else return '\"'; //return '\"'; } sOrWasStr() { if (gameMain.usePastTense) return ' was'; else if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) return ' is'; else return rsquoPlainStr + 's'; } _not() { if (libGlobal.useContractions == usually || libGlobal.useContractions == always) return 'n' + rsquoPlainStr + 't'; else return ' not'; } ntAbbr() { if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) return ' not'; else return 'n' + rsquoPlainStr + 't'; } ; /////////////////////////////////////////////////////////// // LANGMESSAGEBUILDER MODIFICATIONS /////////////////////////////////////////////////////////// // I tried to append to langMessageBuilder.paramList_, but // I found it more difficult than I expected. So I had to // replace the list, rather than modify it. modify langMessageBuilder // 2019-05-17 GWB: I've verified that the version of the list below // is still the correct modification as per TADS 3.1.3. // // I was wanted to append to this list, but I failed to // find a way to make this happen before the list is // processed. Therefore, I had to replace the entire list. paramList_ = [ // parameters that imply the actor as the target object ['you/he', &theName, 'actor', nil, true], ['you/she', &theName, 'actor', nil, true], ['you\'re/he\'s', &itIsContraction, 'actor', nil, true], ['you\'re/she\'s', &itIsContraction, 'actor', nil, true], ['you\'re', &itIsContraction, 'actor', nil, true], ['you/him', &theNameObj, 'actor', &itReflexive, nil], ['you/her', &theNameObj, 'actor', &itReflexive, nil], ['your/her', &theNamePossAdj, 'actor', nil, nil], ['your/his', &theNamePossAdj, 'actor', nil, nil], ['your', &theNamePossAdj, 'actor', nil, nil], ['yours/hers', &theNamePossNoun, 'actor', nil, nil], ['yours/his', &theNamePossNoun, 'actor', nil, nil], ['yours', &theNamePossNoun, 'actor', nil, nil], ['yourself/himself', &itReflexive, 'actor', nil, nil], ['yourself/herself', &itReflexive, 'actor', nil, nil], ['yourself', &itReflexive, 'actor', nil, nil], // parameters that don't imply any target object ['the/he', &theName, nil, nil, true], ['the/she', &theName, nil, nil, true], ['the/him', &theNameObj, nil, &itReflexive, nil], ['the/her', &theNameObj, nil, &itReflexive, nil], ['the\'s/her', &theNamePossAdj, nil, &itPossAdj, nil], ['the\'s/hers', &theNamePossNoun, nil, &itPossNoun, nil], // Verb 's' endings. In most cases, you should use 's/d', 's/ed', // or 's/?ed' rather than 's', except in places where you know you // will never need the past tense form, because 's' doesn't handle // the past tense. Don't use 's/?ed' with a literal question // mark; put a consonant in place of the question mark instead. ['s', &verbEndingS, nil, nil, true], ['s/d', &verbEndingSD, nil, nil, true], ['s/ed', &verbEndingSEd, nil, nil, true], ['s/?ed', &verbEndingSMessageBuilder_, nil, nil, true], ['es', &verbEndingEs, nil, nil, true], ['es/ed', &verbEndingEs, nil, nil, true], ['ies', &verbEndingIes, nil, nil, true], ['ies/ied', &verbEndingIes, nil, nil, true], ['is', &verbToBe, nil, nil, true], ['are', &verbToBe, nil, nil, true], ['was', &verbWas, nil, nil, true], ['were', &verbWas, nil, nil, true], ['has', &verbToHave, nil, nil, true], ['have', &verbToHave, nil, nil, true], ['does', &verbToDo, nil, nil, true], ['do', &verbToDo, nil, nil, true], ['goes', &verbToGo, nil, nil, true], ['go', &verbToGo, nil, nil, true], ['comes', &verbToCome, nil, nil, true], ['come', &verbToCome, nil, nil, true], ['leaves', &verbToLeave, nil, nil, true], ['leave', &verbToLeave, nil, nil, true], ['sees', &verbToSee, nil, nil, true], ['see', &verbToSee, nil, nil, true], ['says', &verbToSay, nil, nil, true], ['say', &verbToSay, nil, nil, true], ['must', &verbMust, nil, nil, true], ['can', &verbCan, nil, nil, true], ['cannot', &verbCannot, nil, nil, true], ['can\'t', &verbCant, nil, nil, true], ['will', &verbWill, nil, nil, true], ['won\'t', &verbWont, nil, nil, true], ['a/he', &aName, nil, nil, true], ['an/he', &aName, nil, nil, true], ['a/she', &aName, nil, nil, true], ['an/she', &aName, nil, nil, true], ['a/him', &aNameObj, nil, &itReflexive, nil], ['an/him', &aNameObj, nil, &itReflexive, nil], ['a/her', &aNameObj, nil, &itReflexive, nil], ['an/her', &aNameObj, nil, &itReflexive, nil], ['it/he', &itNom, nil, nil, true], ['it/she', &itNom, nil, nil, true], ['it/him', &itObj, nil, &itReflexive, nil], ['it/her', &itObj, nil, &itReflexive, nil], // note that we don't have its/his, because that leaves // ambiguous whether we want an adjective or noun form - so we // only use the feminine pronouns with these, to make the // meaning unambiguous ['its/her', &itPossAdj, nil, nil, nil], ['its/hers', &itPossNoun, nil, nil, nil], ['it\'s/he\'s', &itIsContraction, nil, nil, true], ['it\'s/she\'s', &itIsContraction, nil, nil, true], ['it\'s', &itIsContraction, nil, nil, true], ['that/he', &thatNom, nil, nil, true], ['that/she', &thatNom, nil, nil, true], ['that/him', &thatObj, nil, &itReflexive, nil], ['that/her', &thatObj, nil, &itReflexive, nil], ['that\'s', &thatIsContraction, nil, nil, true], ['itself', &itReflexive, nil, nil, nil], ['itself/himself', &itReflexive, nil, nil, nil], ['itself/herself', &itReflexive, nil, nil, nil], // default preposition for standing in/on something ['on', &actorInName, nil, nil, nil], ['in', &actorInName, nil, nil, nil], ['outof', &actorOutOfName, nil, nil, nil], ['offof', &actorOutOfName, nil, nil, nil], ['onto', &actorIntoName, nil, nil, nil], ['into', &actorIntoName, nil, nil, nil], // The special invisible subject marker - this can be used to // mark the subject in sentences that vary from the // subject-verb-object structure that most English sentences // take. The usual SVO structure allows the message builder to // see the subject first in most sentences naturally, but in // unusual sentence forms it is sometimes useful to be able to // mark the subject explicitly. This doesn't actually result in // any output; it's purely for marking the subject for our // internal book-keeping. // // (The main reason the message builder wants to know the subject // in the first place is so that it can use a reflexive pronoun // if the same object ends up being used as a direct or indirect // object: "you can't open yourself" rather than "you can't open // you.") ['subj', &dummyName, nil, nil, true] //MSG_CUSTOM ADDITIONS ,['n\'t', &ntAbbr, nil, nil, nil] ,['_not', &_not, nil, nil, nil] ,['that_isn\'t', &thatIsnt, nil, nil, true] ,['that_is_not', &thatIsNot, nil, nil, true] ,['you_would_have_to', &nameWouldHaveTo, 'actor', nil, true] //,['you_will_have_to', &nameWillHaveTo, 'actor', nil, true] ,['you_could', &itCould, 'actor', nil, true] ,['you_see_no', &nameSeesNo, 'actor', nil, true] ,['you_are', &nameIs, 'actor', nil, true] ] ; // The following just didn't work, so I resorted to replacing // the entire set of values for langMessageBuilder.paramList_ //custMsgPreinit: PreinitObject // execute() { // langMessageBuilder.paramList_.append( // ['n\'t', &ntAbbr, nil, nil, true], // ['_not', &_not, nil, nil, true] // ); // } // execAfterMe = [adv3LibPreinit] //; /////////////////////////////////////////////////////////// // THING MODIFICATIONS /////////////////////////////////////////////////////////// modify Thing thatIsContraction { if (gameMain.usePastTense) return thatNom + ' ' + verbToBe; // From now on, we assume present tense. else if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) // Lt. Cmdr. Data scenario return thatNom + ' ' + verbToBe; else if (isPlural) return thatNom + ' are'; else return thatNom + custMsgObj.rsquoPlainStr + 's'; } itIsContraction { if (gameMain.usePastTense) return itNom + ' ' + verbToBe; // "it was"/"they were" // From now on, we assume present tense. else if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) // Lt. Cmdr. Data scenario return itNom + ' ' + verbToBe; // "it is"/"they are" else if (isPlural) return itNom + custMsgObj.rsquoPlainStr + 're'; // "they're" else return itNom + custMsgObj.rsquoPlainStr + 's'; // "it's" } theNamePossAdj { return theName + (isPlural && theName.endsWith('s') ? custMsgObj.rsquoPlainStr : custMsgObj.rsquoPlainStr + 's'); } pluralNameFrom(str) { local len; local lastChar; local lastPair; if (isPlural) return str; //// The following will become part of TADS 3 in the version //// that follows 3.0.9. //if (rexMatch(patOfPhrase, str) != nil) { // local ofSuffix; // str = rexGroup(1)[3]; // ofSuffix = rexGroup(2)[3]; // return pluralNameFrom(str) + ofSuffix; //} len = str.length(); if (len == 0) return ''; if (len == 1) { if (rexMatch(patSingleApostropheS, str) != nil) return str + custMsgObj.rsquoPlainStr + 's'; else return str + 's'; } lastChar = str.substr(len, 1); lastPair = (len == 1 ? lastChar : str.substr(len - 1, 2)); if (rexMatch(patUpperOrDigit, lastChar) != nil) return str + 's'; if (lastChar == '.') return str + custMsgObj.rsquoPlainStr + 's'; if (rexMatch(patVowelY, lastPair) != nil) return str.substr(1, len - 1) + 'ies'; if ('sxzh'.find(lastChar) != nil) return str + 'es'; return str + 's'; } nameIsnt { if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) // Lt. Cmdr. Data scenario return nameIs + ' not'; else return nameIs + 'n' + custMsgObj.rsquoPlainStr + 't'; } nameIsNot { if (libGlobal.useContractions == usually || libGlobal.useContractions == always) return theName + ' ' + verbToBe + custMsgObj.ntAbbr; else return theName + ' ' + verbToBe + ' not'; } verbCant() { if (gameMain.usePastTense) { if (libGlobal.useContractions != never && libGlobal.useContractions != seldom) return 'couldn' + custMsgObj.rsquoPlainStr + 't'; else return 'could not'; } else { // use present tense if (libGlobal.useContractions != never && libGlobal.useContractions != seldom) return 'can' + custMsgObj.rsquoPlainStr + 't'; else return 'cannot'; } } verbWont() { if(gameMain.usePastTense) { if (libGlobal.useContractions != never && libGlobal.useContractions != seldom) return 'wouldn' + custMsgObj.rsquoPlainStr + 't'; else return 'would not'; } else { // use present tense if (libGlobal.useContractions != never && libGlobal.useContractions != seldom) return 'won' + custMsgObj.rsquoPlainStr + 't'; else return 'will not'; } } verbCannot() { if (gameMain.usePastTense) { if (libGlobal.useContractions == usually || libGlobal.useContractions == always) return 'couldn' + custMsgObj.rsquoPlainStr + 't'; else return 'could not'; } else { // use present tense if (libGlobal.useContractions == usually || libGlobal.useContractions == always) return 'can' + custMsgObj.rsquoPlainStr + 't'; else return 'cannot'; } } // Presumably in all relevant cases // Thing.nameWouldHaveTo is overridden by // Actor.nameWouldHaveTo. But just in case... nameWouldHaveTo { if (libGlobal.youMustPref == youMust) return theName + ' ' + verbMust; else if (gameMain.usePastTense) { if (libGlobal.youMustPref == youllNeedTo) return theName + ' needed to'; if (libGlobal.youMustPref == youdNeedTo) return theName + ' would have needed to'; else return theName + ' would have had to'; } else { // present tense switch (libGlobal.youMustPref) { case youllHaveTo: return theName + ' will have to'; case youdHaveTo: return theName + ' would have to'; case youllNeedTo: return theName + ' will need to'; case youdNeedTo: return theName + ' would need to'; default: return theName + ' ' + verbMust; // should never happen; covered above } } } // Use this when it makes no sense to use the subjective, // so you want to, e.g., substitute "would" with "will". nameWillHaveTo { if (gameMain.usePastTense) { switch (libGlobal.youMustPref) { case youllHaveTo: case youdHaveTo: return theName + ' had to'; case youllNeedTo: case youdNeedTo: return theName + ' needed to'; default: return theName + ' had to'; } } // present tense switch (libGlobal.youMustPref) { case youllHaveTo: case youdHaveTo: return theName + ' will have to'; case youllNeedTo: case youdNeedTo: return theName + ' will need to'; default: return theName + ' must'; } } itCould { if (gameMain.usePastTense || libGlobal.youMustPref == youdHaveTo || libGlobal.youMustPref == youdNeedTo) return itNom + ' could'; else return itNom + ' can'; } nameSeesNo { if (!libGlobal.preferCasual) return theName + ' ' + verbToSee + ' no'; else return nameDoes + custMsgObj.ntAbbr + ' see any'; } hasNo { if (!libGlobal.preferCasual) return verbToHave + ' no'; else return verbToDo + custMsgObj.ntAbbr + ' have any'; } thatIsNot { if (libGlobal.useContractions == usually || libGlobal.useContractions == always) return thatIsnt; else return thatNom + ' ' + verbToBe + ' not'; } thatIsnt { if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) { return thatNom + ' ' + verbToBe + ' not'; } // I prefer "That's not" to "That isn't." Therefore, do // it that way whenever possible if libGlobal.useContractions // is usually or always. else if (libGlobal.useContractions == usually || libGlobal.useContractions == always) { if (!isPlural && !gameMain.usePastTense) return thatIsContraction + ' not'; // "that's not" else // "those aren't", "that wasn't", "those weren't" return thatNom + ' ' + verbToBe + custMsgObj.ntAbbr; } else { // libGlobal.useContractions == sometimes (default) return thatNom + ' ' + verbToBe + custMsgObj.ntAbbr; } } _not() { if (libGlobal.useContractions == usually || libGlobal.useContractions == always) return 'n' + custMsgObj.rsquoPlainStr + 't'; else return ' not'; } ntAbbr() { if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) return ' not'; else return 'n' + custMsgObj.rsquoPlainStr + 't'; } ; //This function proved unnecessary. //function ltCmdrData(str1, str2) { // if (libGlobal.useContractions == seldom || // libGlobal.useContractions == never) // return str2; // else // return str1; //} //Unused portions of code which for some reason I don't want //to throw away: //modify Thing // verbCannotCant() { // if (!libGlobal.preferContractions) // return tSel('cannot', 'could not'); // else if (libGlobal.useSmartQuotes == always) // return tSel('can’t', 'couldn’t'); // else // return tSel('can\'t', 'couldn\'t'); // } // verbDoesNot() { // if (!libGlobal.preferContractions) // return tSel('do' + verbEndingEs + ' not', 'did not'); // else if (libGlobal.useSmartQuotes == always) // return tSel('do' + verbEndingEs + 'n’t', 'didn’t'); // else // return tSel('do' + verbEndingEs + 'n\'t', 'didn\'t'); // } // verbIsNot() { // if (!libGlobal.preferContractions) // return tSel(isPlural ? 'are not' : 'is not', // isPlural ? 'were not' : 'was not'); // else if (libGlobal.useSmartQuotes == always) // return tSel(isPlural ? 'aren’t' : 'isn’t', // isPlural ? 'weren’t' : 'wasn’t'); // else // return tSel(isPlural ? 'aren\'t' : 'isn\'t', // isPlural ? 'weren\'t' : 'wasn\'t'); // } // verbSeesNo() { // if (!libGlobal.preferCasual) // return verbToSee + ' no'; // else // return verbToDo + custMsgObj.ntAbbr + ' see any'; // } //; /////////////////////////////////////////////////////////// // ACTOR MODIFICATIONS /////////////////////////////////////////////////////////// modify Actor thatIsContraction { if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) // Lt. Cmdr. Data scenario return thatNom + ' ' + verbToBe; else return thatNom + tSel([custMsgObj.rsquoPlainStr + 'm', custMsgObj.rsquoPlainStr + 're', custMsgObj.rsquoPlainStr + 's', custMsgObj.rsquoPlainStr + 're', custMsgObj.rsquoPlainStr + 're', ' are'][conjugationSelector], ' ' + verbToBe); } itIsContraction { if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) // Lt. Cmdr. Data scenario return itNom + ' ' + verbToBe; else return itNom + tSel(custMsgObj.rsquoPlainStr + ['m', 're', 's', 're', 're', 're'][conjugationSelector], ' ' + verbToBe); } nameIs { if (referralPerson == ThirdPerson) return theName + ' ' + verbToBe; else if (libGlobal.useContractions == usually || libGlobal.useContractions == always) // Do thatIsContraction in order to get the proper contractions // whenever appropriate. return thatIsContraction; else return theName + ' ' + verbToBe; } nameIsnt { if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) // Lt. Cmdr. Data scenario return nameIs + ' not'; // I think, e.g., "you're not" sounds more natural than "you aren't", // so if the author picks my settings -- namely, if they set it so // libGlobal.useContractions == usually -- then change this appropriately. else if (libGlobal.useContractions == usually || libGlobal.useContractions == always) return tSel(['I' + custMsgObj.rsquoPlainStr + 'm not', 'you' + custMsgObj.rsquoPlainStr + 're not', nameIs + 'n' + custMsgObj.rsquoPlainStr + 't', 'we' + custMsgObj.rsquoPlainStr + 're not', 'you' + custMsgObj.rsquoPlainStr + 're not', nameIs + 'n' + custMsgObj.rsquoPlainStr + 't'][conjugationSelector], nameIs + 'n' + custMsgObj.rsquoPlainStr + 't'); else return (conjugationSelector == 1 && !gameMain.usePastTense ? 'I' + custMsgObj.rsquoPlainStr + 'm not' : inherited); } nameIsNot { if (libGlobal.useContractions == usually || libGlobal.useContractions == always) return nameIsnt; else return theName + ' ' + verbToBe + ' not'; } thatIsnt { // This is complicated, but fortunately, whenever // referralPerson is FirstPerson or SecondPerson, // what we want is identical with nameIsnt, so that // makes it easier. if (referralPerson == FirstPerson || referralPerson == SecondPerson) return nameIsnt; // All remaining stuff is ThirdPerson. else if (libGlobal.useContractions == seldom || libGlobal.useContractions == never) return thatNom + ' ' + verbToBe + ' not'; // All remaining cases will do the contraction // (and are in ThirdPerson). else if (!isPlural && !gameMain.usePastTense) // "that's not", "he's not", "she's not" return thatNom + custMsgObj.sOrWasStr + ' not'; else // "those aren't", "those weren't", // "that wasn't", "he wasn't", "she wasn't" return thatNom + ' ' + verbToBe + custMsgObj.ntAbbr; } // Commented out because this should be the same as Thing.thatIsNot //thatIsNot { // if (libGlobal.useContractions == usually || // libGlobal.useContractions == always) // return thatIsnt; // else // return thatNom + ' ' + verbToBe + ' not'; //} nameWouldHaveTo { // Actor.nameWouldHaveTo is in large measure similar to // Thing.nameWouldHaveTo... if (libGlobal.youMustPref == youMust) return theName + ' ' + verbMust; else if (gameMain.usePastTense) { if (libGlobal.youMustPref == youllNeedTo || libGlobal.youMustPref == youdNeedTo) return theName + ' would have needed to'; else return theName + ' would have had to'; } // ... butActor.nameWouldHaveTo differs from // Thing.nameWouldHaveTo in its use of contractions. // The following are all present tense. else if (referralPerson == 3) { switch (libGlobal.youMustPref) { case youllHaveTo: return theName + ' will have to'; case youdHaveTo: return theName + ' would have to'; case youllNeedTo: return theName + ' will need to'; case youdNeedTo: return theName + ' would need to'; default: return theName + ' ' + verbMust; // should never happen; covered above } } // All other cases involve the use of a pronoun followed // by a contraction. else { switch (libGlobal.youMustPref) { case youllHaveTo: return theName + custMsgObj.rsquoStr + 'll have to'; case youdHaveTo: return theName + custMsgObj.rsquoStr + 'd have to'; case youllNeedTo: return theName + custMsgObj.rsquoStr + 'll need to'; case youdNeedTo: return theName + custMsgObj.rsquoStr + 'd need to'; default: return theName + ' ' + verbMust; // should never happen; covered above } } } // Use this when it makes no sense to use the subjective, // so you want to, e.g., substitute "would" with "will". nameWillHaveTo { if (gameMain.usePastTense) { switch (libGlobal.youMustPref) { case youllHaveTo: case youdHaveTo: return theName + ' had to'; case youllNeedTo: case youdNeedTo: return theName + ' needed to'; default: return theName + ' had to'; } } // present tense switch (libGlobal.youMustPref) { case youllHaveTo: case youdHaveTo: if (referralPerson == 3) return theName + ' will have to'; else return theName + custMsgObj.rsquoStr + 'll have to'; case youllNeedTo: case youdNeedTo: if (referralPerson == 3) return theName + ' will need to'; else return theName + custMsgObj.rsquoStr + 'll need to'; default: return theName + ' must'; } } // The following Actor modifications are to correct an inconsistency // (a bug?) in the TADS 3.0.9 library, whereby 1st person plural // comes out as "I" instead of "we" in some cases (even though // 1st person plural does work in other cases). As of right now // (the morning of April 8, 2006), I don't know whether this will // be corrected in the T3 library, but I am correcting it here. theName { return (referralPerson == ThirdPerson ? inherited : itNom); } theNameObj { return (referralPerson == ThirdPerson ? inherited : itObj); } theNamePossAdj { return (referralPerson == ThirdPerson ? inherited : itPossAdj); } theNamePossNoun { return (referralPerson == ThirdPerson ? inherited : itPossNoun); } aName { return (referralPerson == ThirdPerson ? inherited : itNom); } aNameObj { return (referralPerson == ThirdPerson ? inherited : itObj); } ; /////////////////////////////////////////////////////////// // MSG_NEU.T MODIFICATIONS /////////////////////////////////////////////////////////// //buildParam(typeString, nm) { // return '{' + typeString + ' ' + nm + '}'; //} //buildSynthParam(typeString, obj) { // return '{' + typeString + ' ' + gSynthMessageParam(obj) + '}'; //} modify libMessages //superclass is MessageHelper noAboutInfo { "<.parser><> has no ABOUT information.<./parser> "; // I was going to do it the following way, but decided I actually // prefer a version that more closely resembles the original. //"<.parser><> "; //if (!libGlobal.preferCasual) // "has no"; //else // "does<> have any"; //" ABOUT information.<./parser> "; } thingFeelDesc(obj) { "{You/he} "; if (!libGlobal.preferCasual) "{feel[s actor]|felt} no"; else "<><> feel any"; "thing out of the ordinary. "; } dimReadDesc(obj) { gMessageParams(obj); "There<> not enough light to read {that obj/him}. "; } showScoreMessage(points, maxPoints, turns) { "In <> move<>, <> scored <> of a possible <> point<< maxPoints == 1 ? '' : 's'>>. "; } showScoreNoMaxMessage(points, turns) { "In <> move<>, <> scored <> point<>. "; } //// Changed down below now in the "modify tips" section: //firstScoreChange(delta) //{ // "<.commandsep><.notification><< // basicScoreChange(delta)>><./notification> // \n<.notification>If <> // prefer not to be notified about // score changes in the future, type << // aHref('notify off', 'NOTIFY OFF', 'Turn off score notifications') // >>.<./notification> "; //} noSuchFootnote(num) { "<.parser><> has never referred to any such footnote.<./parser> "; } showFootnoteStatus(stat) { "The current setting is FOOTNOTES "; switch(stat) { case FootnotesOff: "OFF, which hides all footnote references. Type <> to show references to footnotes except those <> already seen, or <> to show all footnote references. "; break; case FootnotesMedium: "MEDIUM, which shows references to unread footnotes, but hides references to those <> already read. Type <> to hide footnote references entirely, or <> to show every reference, even to notes <> already read. "; break; case FootnotesFull: "FULL, which shows every footnote reference, even to notes <> already read. Type <> to show only references to notes you have<> yet read, or <> to hide footnote references entirely. "; break; } } invalidCommandToken(ch) { "<.parser><> does<> know how to use the character <><><> in a command.<./parser> "; } oopsOutOfContext = "<.parser>You can only use OOPS to correct a misspelling immediately after the <> points out a word it does<> know.<./parser> " announceDefaultObject(obj, whichObj, action, resolvedAllObjects) { return '<.assume>' + action.announceDefaultObject(obj, whichObj, resolvedAllObjects) + '<./assume>\n'; } noCommandForAgain() { "<.parser>There<<(libGlobal.useContractions == seldom || libGlobal.useContractions == never) ? ' is' : custMsgObj.rsquoPlainStr + 's' >> nothing to repeat.<./parser> "; } againCannotChangeActor() { "<.parser>To repeat a command like <>turtle, go north,<> just say <>again,<> not <>turtle, again.<><./parser> "; } againNotPossible(issuer) { "That command <> be repeated now. "; } systemActionToNPC() { "<.parser>This command cannot be directed to another character in <>.<./parser> "; } notTerminating() { "<.parser>Continuing the <>.<./parser> "; } notRestarting() { "<.parser>Continuing the <>.<./parser> "; } //finishDeathMsg = ('YOU' // + tSel((libGlobal.useContractions == always // ? custMsgObj.rsquoPlainStr + 'VE' : ' HAVE'), '') // + ' DIED') finishDeathMsg = (gPlayerChar.theName.toUpper + tSel( (libGlobal.useContractions == always ? (gPlayerChar.referralPerson != ThirdPerson ? '’VE' : ' HAVE') : ' HAVE' ) , '') + ' DIED') finishVictoryMsg = ('YOU' + tSel((libGlobal.useContractions == always ? custMsgObj.rsquoPlainStr + 'VE' : ' HAVE'), '') + ' WON') finishFailureMsg = ('YOU' + tSel((libGlobal.useContractions == always ? custMsgObj.rsquoPlainStr + 'VE' : ' HAVE'), '') + ' FAILED') saveOkay() { "<.parser>Saved.<./parser> "; } saveCanceled() { "<.parser>Canceled.<./parser> "; } saveFailed(exc) { "<.parser>Failed; your computer might be running low on disk space, or you might not have the necessary permissions to write this file.<./parser> "; } restoreInvalidMatch() { "<.parser>Failed: the file was not saved by <> (or was saved by an incompatible version of <>).<./parser> "; } pausePrompt() { "<.parser><> is now paused. Please press the space bar when you are ready to resume the <>, or press the <>S<> key to save the current position.<./parser><.p>"; } pauseSaving() { "<.parser>Saving the <>...<./parser><.p>"; } pauseEnded() { "<.parser>Resuming the <>.<./parser> "; } inputScriptOkay(fname) { "<.parser>Reading commands from <><><>...<./parser>\n "; } scriptingOkay() { "<.parser>Text will now be saved to the script file. Type <> to discontinue scripting.<./parser> "; } undoOkay(actor, cmd) { "<.parser>Taking back one turn: <>"; if (actor != nil) "<>, "; "<><>.<./parser><.p>"; } undoFailed() { "<.parser>No more undo information is available.<./parser> "; } noteWithScript = "<.parser>Comment recorded.<./parser> " noteWithoutScript = "<.parser>Comment not recorded.<./parser> " noteWithoutScriptWarning = "<.parser>Comment not recorded. Use <> if you want to start recording the transcript.<./parser> " invalidFinishOption(resp) { "\bThat is<> one of the options. "; } exitsOnOffOkay(stat, look) { if (stat && look) "<.parser>The list of exits will now be shown in both the status line and in each room description.<./parser> "; else if (!stat && !look) "<.parser>The list of exits will no longer be shown in either the status line or room description.<./parser> "; else "<.parser>The list of exits <> be shown in the status line, and <> be included in room descriptions.<./parser> "; } sorryHintsDisabled() { return '<.parser>Sorry, but hints have been disabled for this session, as you requested. If ' + custMsgObj.youveStr + ' changed your mind, ' + custMsgObj.youllStr + ' have to save your current position, exit the TADS interpreter, and start a new interpreter session.<./parser> '; } hintsNotPresent = '<.parser>Sorry, ' + custMsgObj.thisStoryStr + ' does' + custMsgObj.ntAbbr + ' have any built-in hints.<./parser> ' showHintWarning = "<.notification>Warning: Some people do<> like built-in hints, since the temptation to ask for help prematurely can become overwhelming when hints are so close at hand. If <> worried that your willpower <<(libGlobal.useContractions == seldom || libGlobal.useContractions == never) ? 'will not' : 'won' + custMsgObj.rsquoPlainStr + 't' >> hold up, you can disable hints for the rest of this session by typing <>. If you still want to see the hints now, type <>.<./notification> " commandNotPresent = "<.parser>That command is<> needed in <>.<./parser> " scoreNotPresent = "<.parser><> does<> use scoring.<./parser> " defaultsFileNotSupported = "<.parser>Sorry, but the version of the TADS interpreter <> using does<> support saving or restoring defaults. You must install a more recent version in order to use this feature.<./parser> " textMenuMainPrompt(keylist) { "\bSelect a topic number, or press <><< keylist[M_PREV][1]>><> for the previous menu or <><< keylist[M_QUIT][1]>><> to quit:\ "; } textMenuTopicPrompt() { "\bPress the space bar to display the next line, <>P<> to go to the previous menu, or <>Q<> to quit.\b"; } menuNextChapter(keylist, title, hrefNext, hrefUp) { "Next: <></a>; <b>\^<<keylist[M_PREV][1]>></b>=<a href='<<hrefUp>>'>Menu</a>"; } soundIsFromWithin(obj, loc) { "\^<<obj.theName>> <<custMsgObj.appearStr>><<obj.verbEndingSEd>> to be coming from inside <<loc.theNameObj>>. "; } soundIsFromWithout(obj, loc) { "\^<<obj.theName>> <<custMsgObj.appearStr>><<obj.verbEndingSEd>> to be coming from outside <<loc.theNameObj>>. "; } smellIsFromWithin(obj, loc) { "\^<<obj.theName>> <<custMsgObj.appearStr>><<obj.verbEndingSEd>> to be coming from inside <<loc.theNameObj>>. "; } smellIsFromWithout(obj, loc) { "\^<<obj.theName>> <<custMsgObj.appearStr>><<obj.verbEndingSEd>> to be coming from outside <<loc.theNameObj>>. "; } roomDarkDesc = "It<<custMsgObj.sOrWasStr>> pitch black. " notOnboardShip = "That direction {is|was}<<custMsgObj.ntAbbr>> meaningful {|t}here. " ; modify playerMessages // superclass = libMessages commandNotUnderstood(actor) { "<.parser><<custMsgObj.TheStoryStr>> does<<custMsgObj.ntAbbr>> understand that command.<./parser> "; } specialTopicInactive(actor) { "<.parser>That command <<custMsgObj.cantStr>> be used right now.<./parser> "; } noMatchCannotSee(actor, txt) { "\^<<gActor.nameSeesNo>> <<txt>> {|t}here. "; } noMatchNotAware(actor, txt) { "\^<<gActor.nameIsNot>> aware of any <<txt>> {|t}here. "; } //"cannot" is permitted here, because it feels right to me //in this case. allNotAllowed(actor) { //"<.parser><q>All</q> <<custMsgObj.cannotStr>> be used with that verb.<./parser> "; "<.parser><<custMsgObj.ldquoStr>>All<<custMsgObj.rdquoStr>> <<(libGlobal.useContractions == usually || libGlobal.useContractions == always) ? 'can' + custMsgObj.rsquoPlainStr + 't' : 'cannot'>> be used with that verb.<./parser> "; } noMatchForAll(actor) { "<.parser>\^<<gActor.nameSeesNo>>thing suitable {|t}here.<./parser> "; } noMatchForAllBut(actor) { "<.parser>\^<<gActor.nameSeesNo>>thing else {|t}here.<./parser> "; } noMatchForPronoun(actor, typ, pronounWord) { "<.parser>The word <<custMsgObj.ldquoStr>><<pronounWord>><<custMsgObj.rdquoStr>> does<<custMsgObj.ntAbbr>> refer to anything right now.<./parser> "; } missingObject(actor, action, which) { "<.parser>"; switch (libGlobal.youMustPref) { case youllHaveTo: case youdHaveTo: "You<<custMsgObj.rsquoPlainStr>>ll have"; break; case youllNeedTo: case youdNeedTo: "You<<custMsgObj.rsquoPlainStr>>ll need"; break; default: "You need"; break; } " to be more specific about <<action.whatObj(which)>> you want <<actor.referralPerson == ThirdPerson ? actor.theName : ''>> to <<action.getQuestionInf(which)>>.<./parser> "; } missingLiteral(actor, action, which) { "<.parser>Please be more specific about <<action.whatObj(which)>> to <<action.getQuestionInf(which)>>. Try, for example, <<action.getQuestionInf(which)>> <<custMsgObj.ldquoStr>>something<<custMsgObj.rdquoStr>>.<./parser> "; } reflexiveNotAllowed(actor, typ, pronounWord) { "<.parser><<custMsgObj.TheStoryStr>> does<<custMsgObj.ntAbbr>> understand how to use the word <<custMsgObj.ldquoStr>><<pronounWord>><<custMsgObj.rdquoStr>> like that.<./parser> "; } wrongReflexive(actor, typ, pronounWord) { "<.parser><<custMsgObj.TheStoryStr>> does<<custMsgObj.ntAbbr>> understand what the word <<custMsgObj.ldquoStr>><<pronounWord>><<custMsgObj.rdquoStr>> refers to.<./parser> "; } noMatchForPossessive(actor, owner, txt) { "<.parser>\^<<owner.nameDoes>> not <<custMsgObj.appearStr>> to have any such thing.<./parser> "; } noMatchForPluralPossessive(actor, txt) { "<.parser>\^They <<tSel('do', 'did')>> not <<custMsgObj.appearStr>> to have any such thing.<./parser> "; } noMatchForLocation(actor, loc, txt) { "<.parser>\^<<actor.nameSeesNo>> <<loc.childInName(txt)>>.<./parser> "; } noMatchDisambig(actor, origPhrase, disambigResponse) { "<.parser>That was not one of the choices. "; } insufficientQuantity(actor, txt, matchList, requiredNum) { "<.parser>\^<<actor.nameDoes>><<custMsgObj.ntAbbr>> see that many <<txt>> <<tSel('here', 'there')>>.<./parser> "; } uniqueObjectRequired(actor, txt, matchList) { "<.parser>You <<custMsgObj.cantStr>> use multiple objects there.<./parser> "; } singleObjectRequired(actor, txt) { "<.parser>Multiple objects are<<custMsgObj.ntAbbr>> allowed with that command.<./parser> "; } disambigOrdinalOutOfRange(actor, ordinalWord, originalText) { "<.parser>There <<custMsgObj.wereNotStr>> that many choices. "; } ambiguousNounPhrase(actor, originalText, matchList, fullMatchList) { "<.parser><<custMsgObj.TheStoryStr>> does<<custMsgObj.ntAbbr>> know which <<originalText>> you mean.<./parser> "; } cannotChangeActor() { "<.parser>You <<custMsgObj.cannotStr>> address more than one character on a single command line in <<custMsgObj.thisStoryStr>>.<./parser> "; } askUnknownWord(actor, txt) { "<.parser>The word <<custMsgObj.ldquoStr>><<txt>><<custMsgObj.rdquoStr>> is<<custMsgObj._not>> necessary in <<custMsgObj.thisStoryStr>>.<./parser> "; oopsNote(); } wordIsUnknown(actor, txt) { "<.parser><<custMsgObj.TheStoryStr>> does<<custMsgObj.ntAbbr>> understand that command.<./parser> "; } cannotAddressMultiple(actor) { "<.parser>\^<<actor.theName>> <<actor.verbCannot>> address multiple people at once.<./parser> "; } ; modify npcMessages // superclass = playerMessages commandNotHeard(actor) { "\^<<actor.nameDoes>><<custMsgObj._not>> respond. "; } noMatchCannotSee(actor, txt) { "\^<<actor.nameSeesNo>> <<txt>>. "; } noMatchNotAware(actor, txt) { "\^<<actor.nameIsNot>> aware of any <<txt>>. "; } noMatchForAll(actor) { "<.parser>\^<<actor.nameDoes>><<custMsgObj.ntAbbr>> see anything suitable.<./parser> "; } noMatchForAllBut(actor) { "<.parser>\^<<actor.nameSeesNo>>thing else.<./parser> "; } insufficientQuantity(actor, txt, matchList, requiredNum) { "<.parser>\^<<actor.nameDoes>><<custMsgObj.ntAbbr>> see that many <<txt>>.<./parser> "; } ambiguousNounPhrase(actor, originalText, matchList, fullMatchList) { "<.parser>\^<<actor.nameDoes>><<custMsgObj.ntAbbr>> know which <<originalText>> you mean<<tSel('', 't')>>.<./parser> "; } missingLiteral(actor, action, which) { "<.parser>You must be more specific about <<action.whatObj(which)>> you want <<actor.theNameObj>> to <<action.getQuestionInf(which)>>. For example: <<actor.theName>>, <<action.getQuestionInf(which)>> <<custMsgObj.ldquoStr>>something<<custMsgObj.rdquoStr>>.<./parser> "; } ; // This default implementation simply doesn't report deferred errors at // all. modify npcDeferredMessages // superclass = object ; modify npcMessagesDirect // superclass = npcMessages noMatchCannotSee(actor, txt) { "\^<<actor.nameVerb('look')>> around. <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'do not' : 'don' + custMsgObj.rsquoPlainStr + 't'>> see any <<txt>>.<<custMsgObj.rdquoStr>> "; } noMatchNotAware(actor, txt) { "<<custMsgObj.ldquoStr>><<libGlobal.useContractions == never ? 'I am' : 'I' + custMsgObj.rsquoPlainStr + 'm'>> not aware of any <<txt>>,<<custMsgObj.rdquoStr>> <<actor.nameSays>>. "; } noMatchForAll(actor) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'do not' : 'don' + custMsgObj.rsquoPlainStr + 't'>> see anything suitable.<<custMsgObj.rdquoStr>> "; } noMatchForAllBut(actor) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I "; if (!libGlobal.preferCasual) "see no"; else "<<libGlobal.useContractions == never ? 'do not' : 'don' + custMsgObj.rsquoPlainStr + 't'>> see any"; "thing else here.<<custMsgObj.rdquoStr>> "; } zeroQuantity(actor, txt) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'cannot' : 'can' + custMsgObj.rsquoPlainStr + 't'>> do that to zero of something.<<custMsgObj.rdquoStr>> "; } insufficientQuantity(actor, txt, matchList, requiredNum) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'do not' : 'don' + custMsgObj.rsquoPlainStr + 't'>> see that many <<txt>> here.<<custMsgObj.rdquoStr>> "; } uniqueObjectRequired(actor, txt, matchList) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'cannot' : 'can' + custMsgObj.rsquoPlainStr + 't'>> use multiple objects like that.<<custMsgObj.rdquoStr>> "; } singleObjectRequired(actor, txt) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'cannot' : 'can' + custMsgObj.rsquoPlainStr + 't'>> use multiple objects like that.<<custMsgObj.rdquoStr>> "; } noMatchDisambig(actor, origPhrase, disambigResponse) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>That was<<custMsgObj._not>> one of the choices. "; } disambigOrdinalOutOfRange(actor, ordinalWord, originalText) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>There <<libGlobal.useContractions == never ? 'were not' : 'weren' + custMsgObj.rsquoPlainStr + 't'>> that many choices. "; } askDisambig(actor, originalText, matchList, fullMatchList, requiredNum, askingAgain, dist) { reportQuestion(''); if (requiredNum == 1) { if (!askingAgain) "\^<<actor.nameVerb('ask')>>, <<custMsgObj.ldquoStr>>"; "Which <<originalText>> do you mean, << askDisambigList(matchList, fullMatchList, nil, dist)>>?<<custMsgObj.rdquoStr>> "; } else { if (!askingAgain) "\^<<actor.nameVerb('ask')>>, <<custMsgObj.ldquoStr>>"; "Which <<spellInt(requiredNum)>> (of << askDisambigList(matchList, fullMatchList, true, dist)>>) do you mean?<<custMsgObj.rdquoStr>> "; } } ambiguousNounPhrase(actor, originalText, matchList, fullMatchList) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'do not' : 'don' + custMsgObj.rsquoPlainStr + 't'>> know which <<originalText>> you mean.<<custMsgObj.rdquoStr>> "; } askMissingObject(actor, action, which) { reportQuestion('\^' + actor.nameSays + ', ' + custMsgObj.ldquoStr + '\^' + action.whatObj(which) + ' do you want me to ' + action.getQuestionInf(which) + '?' + custMsgObj.rdquoStr + ' '); } missingObject(actor, action, which) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'do not' : 'don' + custMsgObj.rsquoPlainStr + 't'>> know <<action.whatObj(which)>> you want me to <<action.getQuestionInf(which)>>.<<custMsgObj.rdquoStr>> "; } missingLiteral(actor, action, which) { missingObject(actor, action, which); } askUnknownWord(actor, txt) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'do not' : 'don' + custMsgObj.rsquoPlainStr + 't'>> know the word <<custMsgObj.lsquoPlainStr>><<txt>><<custMsgObj.rsquoPlainStr >>.<<custMsgObj.rdquoStr>> "; } wordIsUnknown(actor, txt) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>You used a word I <<libGlobal.useContractions == never ? 'do not' : 'don' + custMsgObj.rsquoPlainStr + 't'>> know.<<custMsgObj.rdquoStr>> "; } ; modify npcDeferredMessagesDirect// superclass = npcDeferredMessages commandNotUnderstood(actor) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'did not' : 'didn' + custMsgObj.rsquoPlainStr + 't'>> understand what you meant.<<custMsgObj.rdquoStr>> "; } noMatchCannotSee(actor, txt) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'did not' : 'didn' + custMsgObj.rsquoPlainStr + 't'>> see any <<txt>>.<<custMsgObj.rdquoStr>> "; } noMatchNotAware(actor, txt) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>><<libGlobal.useContractions == never ? 'I am' : 'I' + custMsgObj.rsquoPlainStr + 'm'>> not aware of any <<txt>>.<<custMsgObj.rdquoStr>> "; } noMatchForAll(actor) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'did not' : 'didn' + custMsgObj.rsquoPlainStr + 't'>> see anything suitable.<<custMsgObj.rdquoStr>> "; } noMatchForAllBut(actor) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'did not' : 'didn' + custMsgObj.rsquoPlainStr + 't'>> see what you meant.<<custMsgObj.rdquoStr>> "; } emptyNounPhrase(actor) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>You left some words out.<<custMsgObj.rdquoStr>> "; } zeroQuantity(actor, txt) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'did not' : 'didn' + custMsgObj.rsquoPlainStr + 't'>> understand what you meant.<<custMsgObj.rdquoStr>> "; } insufficientQuantity(actor, txt, matchList, requiredNum) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'did not' : 'didn' + custMsgObj.rsquoPlainStr + 't'>> see enough <<txt>>.<<custMsgObj.rdquoStr>> "; } uniqueObjectRequired(actor, txt, matchList) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'did not' : 'didn' + custMsgObj.rsquoPlainStr + 't'>> understand what you meant.<<custMsgObj.rdquoStr>> "; } singleObjectRequired(actor, txt) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'did not' : 'didn' + custMsgObj.rsquoPlainStr + 't'>> understand what you meant.<<custMsgObj.rdquoStr>> "; } ambiguousNounPhrase(actor, originalText, matchList, fullMatchList) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>I <<libGlobal.useContractions == never ? 'could not' : 'couldn' + custMsgObj.rsquoPlainStr + 't'>> tell which <<originalText>> you meant.<<custMsgObj.rdquoStr>> "; } askMissingObject(actor, action, which) { local didntStr; if (libGlobal.useContractions == never) didntStr = 'did not'; else didntStr = 'didn' + custMsgObj.rsquoPlainStr + 't'; reportQuestion('\^' + actor.nameSays + ', ' + custMsgObj.ldquoStr + 'I ' + didntStr + ' know ' + action.whatObj(which) + ' you wanted me to ' + action.getQuestionInf(which) + '.' + custMsgObj.rdquoStr + ' '); } wordIsUnknown(actor, txt) { "\^<<actor.nameSays>>, <<custMsgObj.ldquoStr>>You used a word I <<libGlobal.useContractions == never ? 'do not' : 'don' + custMsgObj.rsquoPlainStr + 't'>> know.<<custMsgObj.rdquoStr>> "; } ; // 2019-05-18: This one's done modify playerActionMessages // superclass = MessageHelper mustBeHoldingMsg(obj) { gMessageParams(obj); return '{You_would_have_to} be holding {the obj/him} to do that. '; } tooDarkMsg = 'It' + custMsgObj.sOrWasStr + ' too dark to do that. ' cannotBeWearingMsg(obj) { gMessageParams(obj); return '{You_would_have_to} take off {the obj/him} before {you_could} do that. '; } mustBeEmptyMsg(obj) { gMessageParams(obj); return '{You_would_have_to} take everything out of {the obj/him} before {you_could} do that. '; } mustBeOpenMsg(obj) { gMessageParams(obj); return '{You_would_have_to} open {the obj/him} before {you_could} do that. '; } mustBeClosedMsg(obj) { gMessageParams(obj); return '{You_would_have_to} close {the obj/him} before {you_could} do that. '; } mustBeUnlockedMsg(obj) { gMessageParams(obj); return '{You_would_have_to} unlock {the obj/him} before {you_could} do that. '; } noKeyNeededMsg = '{The dobj/he} {does}{_not} ' + custMsgObj.appearStr + ' to take a key. ' mustBeStandingMsg = '{You_would_have_to} stand up before {you_could} do that. ' mustSitOnMsg(obj) { gMessageParams(obj); return '{You_would_have_to} sit {in obj} first. '; } mustLieOnMsg(obj) { gMessageParams(obj); return '{You_would_have_to} lie {in obj} first. '; } mustGetOnMsg(obj) { gMessageParams(obj); return '{You_would_have_to} get {in obj} first. '; } mustBeInMsg(obj, loc) { gMessageParams(obj, loc); return '{You_would_have_to} be {in loc} before {you_could} do that. '; } mustBeCarryingMsg(obj, actor) { // Note that gActor.itCould actually fixes a bug in TADS 3.0.9 // whereby a third-person Actor's name could be mentioned in both // the subject and predicate. gMessageParams(obj, actor); return '{You_would_have_to} be holding {the obj/him} before {you_could} do that. '; } decorationNotImportantMsg(obj) { gMessageParams(obj); return '{The obj/he} {is}{n\'t} important. '; } unthingNotHereMsg(obj) { gMessageParams(obj); return '{You/he} {does}{n\'t} see {that obj/him} {|t}here. '; } thingDescMsg(obj) { gMessageParams(obj); return '{You_see_no}thing unusual about ' + '{it obj/him}. '; } thingSoundDescMsg(obj) { local hearNo; // As a fail-safe, if gActor is nil, return an empty string. // This will prevent the game from crashing in this unlikely // scenario. if (!gActor) return ''; if (!libGlobal.preferCasual) hearNo = 'hear' + gActor.verbEndingSD + ' no'; else hearNo = gActor.verbToDo + custMsgObj.ntAbbr + ' hear any'; return '{You/he} ' + hearNo + 'thing out of the ordinary. '; } thingSmellDescMsg(obj) { local smellNo; // As a fail-safe, if gActor is nil, return an empty string. // This will prevent the game from crashing in this unlikely // scenario. if (!gActor) return ''; if (!libGlobal.preferCasual) smellNo = 'smell' + gActor.verbEndingSEd + ' no'; else smellNo = gActor.verbToDo + custMsgObj.ntAbbr + ' smell any'; return '{You/he} ' + smellNo + 'thing out of the ordinary. '; } npcDescMsg(npc) { gMessageParams(npc); return '{You_see_no}thing unusual about ' + '{the npc/him}. '; } nothingInsideMsg = 'There' + custMsgObj.sOrWasStr + ' nothing unusual in {the dobj/him}. ' nothingUnderMsg = '{You_see_no}thing unusual under {the dobj/him}. ' nothingBehindMsg = '{You_see_no}thing unusual behind {the dobj/him}. ' nothingThroughMsg { if (!libGlobal.preferCasual) return '{You/he} {can} see nothing through {the dobj/him}. '; else return '{You/he} {can\'t} see anything through {the dobj/him}. '; } nothingToSmellMsg { local smellNo; // As a fail-safe, if gActor is nil, return an empty string. // This will prevent the game from crashing in this unlikely // scenario. if (!gActor) return ''; if (!libGlobal.preferCasual) smellNo = 'smell' + gActor.verbEndingSEd + ' no'; else smellNo = gActor.verbToDo + custMsgObj.ntAbbr + ' smell any'; return '{You/he} ' + smellNo + 'thing out of the ordinary. '; } nothingToHearMsg { local hearNo; // As a fail-safe, if gActor is nil, return an empty string. // This will prevent the game from crashing in this unlikely // scenario. if (!gActor) return ''; if (!libGlobal.preferCasual) hearNo = 'hear' + gActor.verbEndingSD + ' no'; else hearNo = gActor.verbToDo + custMsgObj.ntAbbr + ' hear any'; return '{You/he} ' + hearNo + 'thing out of the ordinary. '; } notWearableMsg { return '{That_isn\'t dobj} something {you/he} {can} wear. '; } notDoffableMsg { return '{That_isn\'t dobj} something {you/he} {can} remove. '; } cannotDigWithMsg = '{You_see_no} way to use {that iobj/him} as a shovel. ' alreadyHoldingMsg() { return '{You_are} already carrying {the dobj/him}. '; } cannotMovePushableMsg = 'It would' + custMsgObj.ntAbbr + ' {|have} accomplish{|ed} anything to move {the dobj/him} around aimlessly, but {it actor/he} might {be|have been} able to push {it dobj/him} in a specific direction. ' cannotTakeActorMsg = '{The dobj/he} {won\'t} let {you/him} do that. ' cannotMoveActorMsg = '{The dobj/he} {won\'t} let {you/him} do that. ' cannotPutActorMsg = '{The dobj/he} {won\'t} let {you/him} do that. ' cannotTasteActorMsg = '{The dobj/he} {won\'t} let {you/him} do that. ' cannotTakePersonMsg = '{The dobj/he} probably would{n\'t} {|have} like{|d} that. ' cannotMovePersonMsg = '{The dobj/he} probably would{n\'t} {|have} like{|d} that. ' cannotPutPersonMsg = '{The dobj/he} probably would{n\'t} {|have} like{|d} that. ' cannotTastePersonMsg = '{The dobj/he} probably would{n\'t} {|have} like{|d} that. ' totalTooHeavyForMsg(obj) { local youWill; // As a fail-safe, if gActor is nil, return an empty string. // This will prevent the game from crashing in this unlikely // scenario. if (!gActor) return ''; gMessageParams(obj); if ( (libGlobal.useContractions == usually || libGlobal.useContractions == always) && gActor.referralPerson != ThirdPerson) { // "I'll", "you'll", "we'll" youWill = gActor.theName + custMsgObj.rsquoPlainStr + 'll'; } else youWill = gActor.theName + ' ' + gActor.verbWill; return '{The obj/he} {is} too heavy; ' + youWill + ' have to put something else down first. '; } surfaceTooFullMsg(obj, cont) { gMessageParams(obj, cont); return 'There' + custMsgObj.sOrWasStr + ' no room for {the obj/him} on ' + '{the cont/him}. '; } undersideTooFullMsg(obj, cont) { gMessageParams(obj, cont); return 'There' + custMsgObj.sOrWasStr + ' no room for {the obj/him} under ' + '{the cont/him}. '; } rearTooFullMsg(obj, cont) { gMessageParams(obj, cont); return 'There' + custMsgObj.sOrWasStr + ' no room for {the obj/him} behind ' + '{the cont/him}. '; } notASurfaceMsg = 'There' + custMsgObj.sOrWasStr + ' no good surface on {the iobj/him}. ' objNotForKeyringMsg = '{The dobj/he} {does}{n\'t} fit on {the iobj/him}. ' keyNotOnKeyringMsg = '{The dobj/he} {is}{_not} attached to {the iobj/him}. ' keyNotDetachableMsg = '{The dobj/he} {is}{n\'t} attached to anything. ' takeFromNotInMsg = '{The dobj/he} {is}{n\'t} in {that iobj/him}. ' takeFromNotOnMsg = '{The dobj/he} {is}{n\'t} on {that iobj/him}. ' takeFromNotUnderMsg = '{The dobj/he} {is}{n\'t} under {that iobj/him}. ' takeFromNotBehindMsg = '{The dobj/he} {is}{n\'t} behind {that iobj/him}. ' takeFromNotInActorMsg = '{The iobj/he} {does}{n\'t} have {that dobj/him}. ' whereToGoMsg () { return '\^' + custMsgObj.youllStr + ' have to say which way to go. '; } cannotGoThatWayInDarkMsg = 'It' + custMsgObj.sOrWasStr + ' too dark; {you/he} {can\'t} see where {you\'re} going. ' cannotGoBackMsg = '{You/he} {does}{n\'t} know how to return from {|t}here. ' nestedRoomTooHighToExitMsg(obj) { return 'It' + custMsgObj.sOrWasStr + ' too long a drop to do that from {|t}here. '; } mustOpenDoorMsg(obj) { gMessageParams(obj); return '{You_would_have_to} open {the obj/him} first. '; } addressingNoOneMsg { return '\^' + custMsgObj.youWillStr + ' have to be more specific about ' + libMessages.whomPronoun + ' {it actor/he} want{s/ed} to talk to. '; } cannotJumpOffHereMsg = 'There' + custMsgObj.sOrWasStr + ' nowhere to jump from {|t}here. ' refuseCommand(targetActor, issuingActor) { gMessageParams(targetActor, issuingActor); return '{The targetActor/he} refuse{s/ed} {your/his} request. '; } noResponseFromMsg(other) { gMessageParams(other); return '{The other/he} {does}{_not} respond. '; } cannotTalkToSelf = 'Talking to {yourself/himself} {won\'t} accomplish anything. ' cannotTalkToSelfMsg = 'Talking to {yourself/himself} {won\'t} accomplish anything. ' cannotAskSelfMsg = 'Talking to {yourself/himself} {won\'t} accomplish anything. ' cannotAskSelfForMsg = 'Talking to {yourself/himself} {won\'t} accomplish anything. ' cannotTellSelfMsg = 'Talking to {yourself/himself} {won\'t} accomplish anything. ' cannotGiveToSelfMsg = 'Giving {the dobj/him} to {yourself/himself} {won\'t} accomplish anything. ' cannotGiveToItselfMsg = 'Giving {the dobj/him} to {itself} {won\'t} accomplish anything. ' cannotShowToSelfMsg = 'Showing {the dobj/him} to {yourself/himself} {won\'t} accomplish anything. ' cannotShowToItselfMsg = 'Showing {the dobj/him} to {itself} {won\'t} accomplish anything. ' notInterestedMsg(actor) { return '\^' + actor.nameDoes + custMsgObj._not + ' ' + custMsgObj.appearStr + ' interested. '; } askVagueMsg = '<.parser>The story doesn' + custMsgObj.rsquoStr + 't understand that command. Please use ASK ACTOR ABOUT TOPIC (or just A TOPIC).<./parser> ' tellVagueMsg = '<.parser>The story doesn' + custMsgObj.rsquoStr + 't understand that command. Please use TELL ACTOR ABOUT TOPIC (or just T TOPIC).<./parser> ' objCannotHearActorMsg(obj) { return '\^' + obj.nameDoes + custMsgObj._not + ' ' + custMsgObj.appearStr + ' to hear {you/him}. '; } actorCannotSeeMsg(actor, obj) { return '\^' + actor.nameDoes + custMsgObj._not + ' ' + custMsgObj.appearStr + ' to be able to see ' + obj.theNameObj + '. '; } setToInvalidMsg { return '{The dobj/he} {has} no such setting. '; // I was going to do the following, but I think I prefer the // message as it originally stood. //return '{The dobj/he} ' + gDobj.hasNo + ' such setting. '; } mustSpecifyTurnToMsg() { return '\^' + custMsgObj.youWillStr + ' have to specify the setting to turn {it dobj/him} to. '; } turnToInvalidMsg { return '{The dobj/he} {has} no such setting. '; // I was going to do the following, but I think I prefer the // message as it originally stood. //return '{The dobj/he} ' + gDobj.hasNo + ' such setting. '; } mustBeBurningMsg(obj) { return '{You_would_have_to} light ' + obj.theNameObj + ' before {you_could} do that. '; } matchNotLitMsg = '{The dobj/he} {is}{n\'t} lit. ' candleNotLitMsg = '{The dobj/he} {is}{_not} lit. ' cannotConsultMsg { return '{That_is_not dobj} something {you/he} {can} consult. '; } cannotTurnOnMsg { return '{That_isn\'t dobj} something {you/he} {can} turn on. '; } cannotTurnOffMsg { return '{That_isn\'t dobj} something {you/he} {can} turn off. '; } cannotBurnMsg { return '{That_is_not dobj} something {you/he} {can} burn. '; } cannotPourMsg { return '{That_is_not dobj} something {you/he} {can} pour. '; } mustDetachMsg(obj) { // Note that gActor.itCould actually fixes a bug in TADS 3.0.9 // whereby a third-person Actor's name could be mentioned in both // the subject and predicate. gMessageParams(obj); return '{You_would_have_to} detach {the obj/him} before {you_could} do that. '; } cannotDetachPermanentMsg = 'There' + custMsgObj.sOrWasStr + ' no obvious way to detach {that dobj/him}. ' notAttachedToMsg = '{The dobj/he} {is}{n\'t} attached to {that iobj/him}. ' shouldNotBreakMsg = 'Breaking {that dobj/him} would {|have} serve{|ed} no purpose. ' cannotClimbMsg { return '{That_is_not dobj} something {you/he} {can} climb. '; } cannotOpenMsg { return '{That_is_not dobj} something {you/he} {can} open. '; } cannotCloseMsg { return '{That_is_not dobj} something {you/he} {can} close. '; } cannotLockMsg { return '{That_is_not dobj} something {you/he} {can} lock. '; } cannotUnlockMsg { return '{That_is_not dobj} something {you/he} {can} unlock. '; } cannotLockWithMsg = '{The iobj/he} {does}{n\'t} look suitable for locking that. ' cannotUnlockWithMsg = '{The iobj/he} {does}{n\'t} look suitable for unlocking that. ' unknownHowToLockMsg = 'It' + custMsgObj.sOrWasStr + ' not clear how to lock {the dobj/him}. ' unknownHowToUnlockMsg = 'It' + custMsgObj.sOrWasStr + ' not clear how to unlock {the dobj/him}. ' keyDoesNotFitLockMsg = '{The iobj/he} {does}{n\'t} fit the lock. ' cannotEatMsg = '{The dobj/he} {does}{_not} ' + custMsgObj.appearStr + ' to be edible. ' cannotDrinkMsg = '{That dobj/he} {does}{_not} ' + custMsgObj.appearStr + ' to be something {you/he} {can} drink. ' cannotCleanMsg = '{You/he} would{n\'t} {|have} know{|n} how to clean {that dobj/him}. ' cannotSleepMsg = '{You/he} {does}{n\'t} need to sleep right now. ' cannotSitOnMsg { return '{That_isn\'t dobj} something {you/he} {can} sit on. '; } cannotLieOnMsg { return '{That_isn\'t dobj} something {you/he} {can} lie on. '; } noRoomToStandMsg = 'There' + custMsgObj.sOrWasStr + ' no room for {you/him} to stand {on dobj}. ' noRoomToSitMsg = 'There' + custMsgObj.sOrWasStr + ' no room for {you/him} to sit {on dobj}. ' noRoomToLieMsg = 'There' + custMsgObj.sOrWasStr + ' no room for {you/him} to lie {on dobj}. ' okayPostureChangeMsg(posture) { return 'Okay, {you\'re} now ' + posture.participle + '. '; } cannotPlugInMsg = '{You_see_no} way to plug in {the dobj/him}. ' cannotPlugInToMsg = '{You_see_no} way to plug anything into {the iobj/him}. ' cannotUnplugMsg = '{You_see_no} way to unplug {the dobj/him}. ' cannotUnplugFromMsg = '{You_see_no} way to unplug anything from {the iobj/him}. ' cannotScrewMsg = '{You_see_no} way to screw {the dobj/him}. ' cannotUnscrewMsg = '{You_see_no} way to unscrew {the dobj/him}. ' cannotUnscrewWithMsg = '{You/he} {cannot} unscrew anything with {the iobj/him}. ' cannotEnterMsg { return '{That_is_not dobj} something {you/he} {can} enter. '; } cannotGoThroughMsg { return '{That_is_not dobj} something {you/he} {can} go through. '; } cannotThrowAtSelfMsg = '{You/he} {can\'t} throw {that dobj/him} at {itself}. ' cannotThrowAtContentsMsg() { return '{You_would_have_to} remove {the iobj/him} from {the dobj/him} before {you_could} do that. '; } willNotCatchMsg(catcher) { return '\^' + catcher.nameDoes + custMsgObj.ntAbbr + ' look like ' + catcher.itNom + ' want' + catcher.verbEndingSEd + ' to catch anything. '; } cannotKissActorMsg = '{The dobj/he} probably would{n\'t} {|have} like{|d} that. ' newlyDarkMsg() { local isOrWas; if (gameMain.usePastTense) isOrWas = ' was'; else if (libGlobal.useContractions == usually || libGlobal.useContractions == always) isOrWas = custMsgObj.rsquoPlainStr + 's'; else isOrWas = ' is'; return 'It' + isOrWas + ' now pitch black. '; } ; modify npcActionMessages // superclass = playerActionMessages cannotRemoveHeldMsg = 'There' + custMsgObj.sOrWasStr + ' nothing to remove {the dobj/him} from. ' whereToGoMsg() { return '\^' + custMsgObj.youllStr + ' have to say which way {you/he} should {|have} go{|ne}. '; } surfaceTooFullMsg(obj, cont) { gMessageParams(obj, cont); return '{You/he} {cannot} do that because there' + custMsgObj.sOrWasStr + ' no room for {the obj/him} on {the cont/him}. '; } objNotForKeyringMsg = '{You/he} {cannot} do that because {that dobj/he} {does}{n\'t} fit on {the iobj/him}. ' takeFromNotInMsg = '{You/he} {cannot} do that because {the dobj/he} {is}{n\'t} in {that iobj/him}. ' takeFromNotOnMsg = '{You/he} {cannot} do that because {the dobj/he} {is}{n\'t} on {that iobj/him}. ' takeFromNotUnderMsg = '{You/he} {cannot} do that because {the dobj/he} {is}{n\'t} under {that iobj/him}. ' takeFromNotBehindMsg = '{You/he} {cannot} do that because {the dobj/he} {is}{n\'t} behind {that iobj/him}. ' cannotJumpOffHereMsg = 'There' + custMsgObj.sOrWasStr + ' nowhere for {you/him} to jump. ' shouldNotBreakMsg = '{You/he} {does}{n\'t} want to break {that dobj/him}. ' keyDoesNotFitLockMsg = '{You/he} tr{ies/ied} {the iobj/he}, but {it iobj/he} {does}{n\'t} fit the lock. ' okayFollowModeMsg() { local iWill; if (libGlobal.useContractions == usually || libGlobal.useContractions == always) iWill = 'I' + custMsgObj.rsquoPlainStr + 'll'; else iWill = 'I will'; return custMsgObj.ldquoPlainStr + 'Okay, ' + iWill + ' follow {the dobj/him}.' + custMsgObj.rdquoPlainStr + ' '; } alreadyFollowModeMsg = custMsgObj.ldquoStr + 'I' + custMsgObj.rsquoPlainStr + 'm already following {the dobj/him}.' + custMsgObj.rdquoStr + ' ' ; // Tip modifications: modify scoreChangeTip desc = "If <<custMsgObj.youdStr>> prefer not to be notified about score changes in the future, type << aHref('notify off', 'NOTIFY OFF', 'Turn off score notifications') >>." ; modify footnotesTip desc = "A number in [square brackets] like the one above refers to a footnote, which you can read by typing FOOTNOTE followed by the number: <<aHref('footnote 1', 'FOOTNOTE 1', 'Show footnote [1]')>>, for example. Footnotes usually contain added background information that might be interesting but is<<custMsgObj.ntAbbr>> essential to the story. If <<custMsgObj.youdStr>> prefer not to see footnotes at all, you can control their appearance by typing <<aHref('footnotes', 'FOOTNOTES', 'Control footnote appearance')>>.<./notification> " ; // no need to modify oopsTip // no need to modify fullScoreTip // no need to modify exitsTip modify undoTip desc() { local didntStr; if (libGlobal.useContractions == never) didntStr = 'did not'; else didntStr = 'didn' + custMsgObj.rsquoPlainStr + 't'; "If this <<didntStr>> turn out quite the way you expected, note that you can always take back a turn by typing <<aHref('undo', 'UNDO', 'Take back the most recent command')>>. You can even use UNDO repeatedly to take back several turns in a row. "; } ; // Only a few of msg_neu.t's listers had to be modified. modify actorInventoryLister // superclass = DividedInventoryLister showInventoryWearingOnly(parent, wearing) { //if (libGlobal.preferCasual) // "\^<<parent.nameIsnt>> carrying anything, // and <<parent.verbToBe>> wearing <<wearing>>. "; //else // "<<buildSynthParam('The/he', parent)>> {is} carrying // nothing, and {is} wearing <<wearing>>. "; if (libGlobal.preferCasual) "\^<<parent.nameIsnt>> carrying anything, and "; else "\^<<parent.nameIs>> carrying nothing, and "; // "You're carrying nothing, and you're wearing a hat", rather than // "You're carrying nothing, and are wearing a hat." if ((libGlobal.useContractions == usually || libGlobal.useContractions == always) && (parent.referralPerson == FirstPerson || parent.referralPerson == SecondPerson)) "<<parent.itIsContraction>> "; else "<<parent.verbToBe>> "; "wearing <<wearing>>. "; } ; modify thingLookInLister // superclass = DescContentsLister, BaseThingContentsLister showListEmpty(pov, parent) { gMessageParams(parent); defaultDescReport('\^' + gActor.nameSeesNo + 'thing unusual in {the parent/him}. '); } ; modify surfaceLookInLister // superclass = DescContentsLister, BaseSurfaceContentsLister showListEmpty(pov, parent) { gMessageParams(parent); defaultDescReport('\^' + gActor.nameSeesNo + 'thing on {the parent/him}. '); } ; modify undersideLookUnderLister // superclass = DescContentsLister, BaseUndersideContentsLister showListEmpty(pov, parent) { gMessageParams(parent); defaultDescReport('\^' + gActor.nameSeesNo + 'thing under {the parent/him}. '); } ; modify rearLookBehindLister // superclass = DescContentsLister, BaseRearContentsLister showListEmpty(pov, parent) { gMessageParams(parent); defaultDescReport('\^' + gActor.nameSeesNo + 'thing behind {the parent/him}. '); } ; modify SuggestedTopicLister showListEmpty(pov, parent) { if (isExplicit) { gMessageParams(askingActor, targetActor); "<<isExplicit ? '' : '('>>\^<<libGlobal.preferCasual ? askingActor.theName + ' ' + askingActor.verbToDo + custMsgObj.ntAbbr + ' have any' : askingActor.theName + ' ' + askingActor.verbToHave + ' no' >>thing specific in mind right now to discuss with {the targetActor/him}.<<isExplicit ? '' : ')'>> "; } } ;