diff --git a/README.md b/README.md index 4db564b6..6d7c2601 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # The Inform App for macOS ## What's New -A new beta version of the Inform App is now available [here](https://github.com/TobyLobster/Inform/releases). The minimum requirement is now macOS 10.14.6 (Mojave). Users on older macOS versions can of course continue using previous versions from [here](http://inform7.com/downloads/). +A new version of the Inform App is now available [here](https://github.com/TobyLobster/Inform/releases). The minimum requirement is now macOS 10.14.6 (Mojave). Users of older macOS versions can of course continue using previous versions from [here](http://inform7.com/downloads/). -- The launcher screen shows the latest News from the IFTF. +- The launcher screen shows the latest News from the [IFTF](https://iftechfoundation.org). - Colour schemes have been introduced (see the new preferences pane). - Support for Dark Mode. - Support for *Basic Inform*. @@ -15,12 +15,9 @@ A new beta version of the Inform App is now available [here](https://github.com/ Many thanks to MaddTheSane for a heroic number of modernisations, tweaks and fixes. ### Known Issues -- Release with winning node marked with '***' in Skein not currently working? +- Release with a public solution (winning node marked with '***' in Skein) not currently working. ### Work in the Pipeline -- Build instructions. -- Updating to latest libraries. -- Dark mode across more views. - Mac App Store Version. - Longer term: Modernisation to Swift, and away from deprecated APIs. @@ -35,6 +32,7 @@ Inform is free, with no strings attached. What you make with it is yours, to pub App Version | Inform Version | Release Date | Description ------------ | -------------- | ------------ | :--------------------------------------- +1.82.0 | 10.1.0 | 2022-08-20 | Official release, supporting Inform 10.1.0 1.81.0‑beta1 | 10.1.0 (beta) | 2022‑07‑30 | This is a Beta. Colour Schemes, Dark mode, Basic Inform, Apple Silicon native support. 1.68.1 | 6M62 | 2019-11-14 | Release with website bug fix. 1.67.1 | 6M62 | 2019-10-25 | macOS Catalina support. @@ -48,14 +46,7 @@ App Version | Inform Version | Release Date | Description 1.50 | 6L02 | 2014-05-07 | First update, modernising Inform ### Building the Inform App. -This section is TODO. - -Before building the Inform App, there are changes required to the XCode project files found in its submodules. I therefore need to document these for this section to be useful. I am investigating possible solutions for this issue. - -Inform is currently being compiled with XCode (13.4.1) on macOS Monterey (12.4). - -### Building a release of the Inform App -This section is TODO. +See [Building the macOS Inform App](documentation/building_inform.md) ### Licensing See file 'COPYING' diff --git a/documentation/building_inform.md b/documentation/building_inform.md new file mode 100644 index 00000000..09723a7e --- /dev/null +++ b/documentation/building_inform.md @@ -0,0 +1,171 @@ +# Building the macOS Inform App + +## 0. Prerequisites + +- A recent version of macOS and XCode. + - At time of writing I'm using XCode 13.4.1 on macOS 12.4 (Monterey). +- *Apple Developer Program* membership, probably. You will need a valid *Code Signing Identity* and *Developer Team*. That means having valid *Provisioning Profiles*, *Certificates* etc configured directly from Apple. +- Python 3. +- Experience of XCode and git. + + +## 1. Clone the repo and submodules: + +``` + git clone --recurse-submodules https://github.com/TobyLobster/Inform.git +``` + +## 2. Get and install the additional tools: + +2a. Install a tool from a github repo that uses Python 3 to edit XCode project files. + +- This is required. +- It's my fork of this repo because it needed fixing to work with the ZoomCocoa project. + +``` + git clone https://github.com/TobyLobster/mod-pbxproj-fork.git + cd mod-pbxproj-fork + sudo python3 setup.py install +``` + +2b. Optionally install a repo that creates fancy disk images. The install instructions are [here](https://github.com/create-dmg/create-dmg). This is only needed when creating a disk image for release outside the Mac App Store. + +## 3. Configure a build: + +Before building the app, all project files (including those in recursive submodules), as well as some .plists and .strings files must be configured correctly. This is all automated by a python script found in the root directory. It needs to be executed once, then only when the build type changes or the version number needs to be updated. + +* Close any Inform project open in XCode. (XCode doesn't cope well when project files change underneath it.) + +* Execute `./configure.py --help` + +To see the options. Execute this script with the appropriate parameters specified. Edit the `configure.py` script itself to change the current version number of the App. + +* Open the Inform project in XCode. + +* After running the configure script always do menu `Product->Clean Build Folder`. + +* Now the Inform XCode project should build and run in XCode as normal. + +* Troubleshooting: If you're having code signing issues, there is Apple documentation that may help: + - [XCode Help: If a code signing error occurs](https://help.apple.com/xcode/mac/current/#/dev01865b392). + - [About Code Signing](https://developer.apple.com/library/archive/documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html). + - [Developer Archive: Code Signing in Depth](https://developer.apple.com/library/archive/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919). + - [Developer Forums: Manual Code Signing Example](https://developer.apple.com/forums/thread/130855/). + - [Apple Developer: Code Signing](https://developer.apple.com/support/code-signing/). + - [Developer Forums: Code Signing](https://developer.apple.com/forums/tags/code-signing/). + - [Apple Developer: Code Signing Search](https://developer.apple.com/search/?q=Code%20Signing). + - Deep Dive: + - [Inside Code Signing: Provisioning Profiles](https://developer.apple.com/documentation/technotes/tn3125-inside-code-signing-provisioning-profiles). + - [Inside Code Signing: Hashes](https://developer.apple.com/documentation/technotes/tn3126-inside-code-signing-hashes). + - [Inside Code Signing: Requirements](https://developer.apple.com/documentation/technotes/tn3127-inside-code-signing-requirements/). + + +# Distributing a build + +This whole section is a reminder for me on the procedure for doing this. + +- Test everything in the App is working first! + +- Check the copyright date in the About box includes the current year. + +- Edit `configure.py` to use the latest version numbers. + +#### Non-Mac App Store build + +- Close XCode. + +- Make sure you have installed the `create-dmg` tool as detailed in section 2b. above. + +- `./configure.py --standalone --team ...` + +- Load the Inform project into XCode. + +- In XCode choose menu `Product->Clean Build Folder` + +- Choose menu `Product->Archive` + - This will build the project and create an Archive. + - The Archiver will appear with your product - WAIT! IT IS NOT DONE YET! + - It will take a few minutes! It is running a script that: + - Exports the archive to a temporary location + - Creates a DMG from the exported Archive. + - Code Signs the DMG. + - Opens the `inform/Distribution` directory in the finder. This is how you know it's finished. + - Logs details to `~/inform_post_archive_output.txt` - check for errors there. + - FYI: + - This script is found in `Scripts/post_archive.sh` + - It is the post-action step of the Archive action in the XCode Scheme. + - This uses a third party tool to create the fancy DMG. + +- You should see file `inform/Distribution/inform.dmg` has been produced. + +- Troubleshooting: If something went wrong, check the Archive has only the things in it that are needed. If there are extra unwanted executables/libraries in there, then they can be removed by setting SKIP_INSTALL=YES in the appropriate Target. This should be done by adding to the `configure.py` script. The Archive layout should look like this: + +``` +dSYMs + Builder.dSYM + git-client.dSYM + GlkClient.framework.dSYM + GlkSound.framework.dSYM + GlkView.framework.dSYM + glulxe-client.dSYM + Inform.app.dSYM + InformQL.qlgenerator.dSYM + SFBAudioEngine.framework.dSYM + ZoomServer.dSYM + ZoomView.framework.dSYM +Info.plist +Products + Applications + Inform.app +SCMBlueprint + Inform.xcscmblueprint +SwiftSupport + macosx + libswiftAppKit.dylib + libswiftCore.dylib + libswiftCoreData.dylib + libswiftCoreFoundation.dylib + libswiftCoreGraphics.dylib + libswiftCoreImage.dylib + libswiftDarwin.dylib + libswiftDispatch.dylib + libswiftFoundation.dylib + libswiftIOKit.dylib + libswiftMetal.dylib + libswiftObjectiveC.dylib + libswiftos.dylib + libswiftQuartzCore.dylib + libswiftXPC.dylib +``` +See also Apple's documentation [Troubleshooting Application Archiving in Xcode](https://developer.apple.com/library/archive/technotes/tn2215/_index.html). + +- Notarize and staple the DMG. See Apple's documentation: + - [Notarizing macOS software before distribution](https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution?language=objc). + - [Customizing the notarization workflow](https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution/customizing_the_notarization_workflow?language=objc). + - [Testing a Notarised Product](https://developer.apple.com/forums/thread/130560). + +- Rename the DMG with a version number in this format e.g. `Inform_10_1_0_macOS_1_82_0.dmg` + +- Done! + + +#### Mac App Store build + +- Close XCode. + +- Execute `./configure.py --mas --team ...` + +- Load the Inform project into XCode. + +- Choose menu `Product->Archive` + - This will build the project and create an Archive. + +- Note that Notarisation and Stapling is not required for Mac App Store builds. + +- Validate the App in the Archiver? + +- Then there's a whole bunch more stuff around uploading the Archive to *App Store Connect*, filling in a whole bunch of forms, providing a bunch of screenshots and icons for the app in a variety of defined sizes, descriptions, declarations, etc, submitting the App to Apple for verification, and if everything is OK, finally releasing on the *Mac App Store*. + +## Updating to the latest Inform Compiler + +- TODO diff --git a/inform/Compiler/IFCompilerController.h b/inform/Compiler/IFCompilerController.h index 3e743cf7..c43750f8 100644 --- a/inform/Compiler/IFCompilerController.h +++ b/inform/Compiler/IFCompilerController.h @@ -58,7 +58,7 @@ typedef NS_ENUM(unsigned int, IFCompilerTabId) { /// (In ye olden dayes, this was a window controller as well, but now young whippersnapper /// compilers can go anywhere, so it's not any more) /// -@interface IFCompilerController : NSObject +@interface IFCompilerController : NSObject /// The default styles for the error messages + (NSDictionary*) defaultStyles; diff --git a/inform/Inform.xcodeproj/project.pbxproj b/inform/Inform.xcodeproj/project.pbxproj index 07119bf8..cda6e9a8 100644 --- a/inform/Inform.xcodeproj/project.pbxproj +++ b/inform/Inform.xcodeproj/project.pbxproj @@ -152,7 +152,6 @@ FF53963A18FEE400001715D7 /* IFToolbarProgressIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = FF53963818FEE400001715D7 /* IFToolbarProgressIndicator.m */; }; FF5D0BA51B05EB6A00BE2BD0 /* IFSkeinLinkView.m in Sources */ = {isa = PBXBuildFile; fileRef = FF5D0BA31B05EB6A00BE2BD0 /* IFSkeinLinkView.m */; }; FF671EA21B9ADEBB00246820 /* IFSkeinSplitView.m in Sources */ = {isa = PBXBuildFile; fileRef = FF671EA01B9ADEBB00246820 /* IFSkeinSplitView.m */; }; - FF671EB31B9B785200246820 /* TestingTemplate.html in Resources */ = {isa = PBXBuildFile; fileRef = FF671EB11B9B785200246820 /* TestingTemplate.html */; }; FF71A81B18F1492500CB9B31 /* IFCompiler.m in Sources */ = {isa = PBXBuildFile; fileRef = FF71A80D18F1492500CB9B31 /* IFCompiler.m */; }; FF71A81D18F1492500CB9B31 /* IFCompilerController.m in Sources */ = {isa = PBXBuildFile; fileRef = FF71A80F18F1492500CB9B31 /* IFCompilerController.m */; }; FF71A81F18F1492500CB9B31 /* IFError.l in Sources */ = {isa = PBXBuildFile; fileRef = FF71A81118F1492500CB9B31 /* IFError.l */; }; @@ -232,11 +231,6 @@ FFEBA3951B18B801008A7473 /* libicucore.A.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FFEBA3941B18B801008A7473 /* libicucore.A.dylib */; }; FFEF5D551915534400AA562F /* Changes to Inform.epub in Resources */ = {isa = PBXBuildFile; fileRef = FFEF5D511915533500AA562F /* Changes to Inform.epub */; }; FFEF5D561915534600AA562F /* Inform - A Design System for Interactive Fiction.epub in Resources */ = {isa = PBXBuildFile; fileRef = FFEF5D531915533500AA562F /* Inform - A Design System for Interactive Fiction.epub */; }; - FFF10843191511E500C6A272 /* AdviceCredits.html in Resources */ = {isa = PBXBuildFile; fileRef = FFF10839191511E500C6A272 /* AdviceCredits.html */; }; - FFF10844191511E500C6A272 /* AdviceKeyboardShortcuts.html in Resources */ = {isa = PBXBuildFile; fileRef = FFF1083B191511E500C6A272 /* AdviceKeyboardShortcuts.html */; }; - FFF10845191511E500C6A272 /* AdviceMaterialsFolder.html in Resources */ = {isa = PBXBuildFile; fileRef = FFF1083D191511E500C6A272 /* AdviceMaterialsFolder.html */; }; - FFF10846191511E500C6A272 /* AdviceNewToInform.html in Resources */ = {isa = PBXBuildFile; fileRef = FFF1083F191511E500C6A272 /* AdviceNewToInform.html */; }; - FFF10847191511E500C6A272 /* AdviceUpgrading.html in Resources */ = {isa = PBXBuildFile; fileRef = FFF10841191511E500C6A272 /* AdviceUpgrading.html */; }; FFF8628918A2AE0B00C0F344 /* App in Resources */ = {isa = PBXBuildFile; fileRef = FFF8628818A2AE0B00C0F344 /* App */; }; FFFCC7431AF7B2E100BD619E /* IFProjectPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = FFFCC7411AF7B2E100BD619E /* IFProjectPolicy.m */; }; FFFCC7471AF7B34200BD619E /* IFPolicyManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FFFCC7451AF7B34200BD619E /* IFPolicyManager.m */; }; @@ -780,7 +774,6 @@ FF5D0BA31B05EB6A00BE2BD0 /* IFSkeinLinkView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IFSkeinLinkView.m; sourceTree = ""; }; FF671E9F1B9ADEBB00246820 /* IFSkeinSplitView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IFSkeinSplitView.h; sourceTree = ""; }; FF671EA01B9ADEBB00246820 /* IFSkeinSplitView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IFSkeinSplitView.m; sourceTree = ""; }; - FF671EB21B9B785200246820 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = en; path = en.lproj/TestingTemplate.html; sourceTree = ""; }; FF71A80C18F1492500CB9B31 /* IFCompiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IFCompiler.h; sourceTree = ""; }; FF71A80D18F1492500CB9B31 /* IFCompiler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IFCompiler.m; sourceTree = ""; }; FF71A80E18F1492500CB9B31 /* IFCompilerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IFCompilerController.h; sourceTree = ""; }; @@ -921,11 +914,6 @@ FFEBA3941B18B801008A7473 /* libicucore.A.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libicucore.A.dylib; path = usr/lib/libicucore.A.dylib; sourceTree = SDKROOT; }; FFEF5D521915533500AA562F /* en */ = {isa = PBXFileReference; lastKnownFileType = file; name = en; path = "en.lproj/Changes to Inform.epub"; sourceTree = ""; }; FFEF5D541915533500AA562F /* en */ = {isa = PBXFileReference; lastKnownFileType = file; name = en; path = "en.lproj/Inform - A Design System for Interactive Fiction.epub"; sourceTree = ""; }; - FFF1083A191511E500C6A272 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = en; path = en.lproj/AdviceCredits.html; sourceTree = ""; }; - FFF1083C191511E500C6A272 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = en; path = en.lproj/AdviceKeyboardShortcuts.html; sourceTree = ""; }; - FFF1083E191511E500C6A272 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = en; path = en.lproj/AdviceMaterialsFolder.html; sourceTree = ""; }; - FFF10840191511E500C6A272 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = en; path = en.lproj/AdviceNewToInform.html; sourceTree = ""; }; - FFF10842191511E500C6A272 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = en; path = en.lproj/AdviceUpgrading.html; sourceTree = ""; }; FFF8628818A2AE0B00C0F344 /* App */ = {isa = PBXFileReference; lastKnownFileType = folder; path = App; sourceTree = ""; }; FFFCC7401AF7B2E100BD619E /* IFProjectPolicy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IFProjectPolicy.h; sourceTree = ""; }; FFFCC7411AF7B2E100BD619E /* IFProjectPolicy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IFProjectPolicy.m; sourceTree = ""; }; @@ -1055,12 +1043,6 @@ FFEF5D511915533500AA562F /* Changes to Inform.epub */, FFEF5D531915533500AA562F /* Inform - A Design System for Interactive Fiction.epub */, FF2F527A19152D9700C190F0 /* MaterialsDiagram.png */, - FFF10839191511E500C6A272 /* AdviceCredits.html */, - FFF1083B191511E500C6A272 /* AdviceKeyboardShortcuts.html */, - FFF1083D191511E500C6A272 /* AdviceMaterialsFolder.html */, - FFF1083F191511E500C6A272 /* AdviceNewToInform.html */, - FFF10841191511E500C6A272 /* AdviceUpgrading.html */, - FF671EB11B9B785200246820 /* TestingTemplate.html */, FF452CF3285BE22200EF406C /* NewsTemplate.html */, FF05092F18B4D74E004081FF /* HeadingsBrowser.xib */, FF94AB621905DF5D008BCAF5 /* Launcher.xib */, @@ -2044,13 +2026,7 @@ FF05094A18B4D74E004081FF /* StandardProjectOptions.xib in Resources */, FF47134318F18B32006717B3 /* Find.xib in Resources */, FF2F527C19152D9700C190F0 /* MaterialsDiagram.png in Resources */, - FF671EB31B9B785200246820 /* TestingTemplate.html in Resources */, - FFF10846191511E500C6A272 /* AdviceNewToInform.html in Resources */, - FFF10847191511E500C6A272 /* AdviceUpgrading.html in Resources */, FF23DC40283E20AD0070DDD6 /* BasicInformSettings.xib in Resources */, - FFF10844191511E500C6A272 /* AdviceKeyboardShortcuts.html in Resources */, - FFF10845191511E500C6A272 /* AdviceMaterialsFolder.html in Resources */, - FFF10843191511E500C6A272 /* AdviceCredits.html in Resources */, FFD2BD642819EB8E00AD36B6 /* ColourPreferences.xib in Resources */, FF452D11285BE22200EF406C /* NewsTemplate.html in Resources */, 4B7534C606286ADC00824F26 /* CompilerOutput.strings in Resources */, @@ -2627,14 +2603,6 @@ name = Source.xib; sourceTree = ""; }; - FF671EB11B9B785200246820 /* TestingTemplate.html */ = { - isa = PBXVariantGroup; - children = ( - FF671EB21B9B785200246820 /* en */, - ); - name = TestingTemplate.html; - sourceTree = ""; - }; FF94AB621905DF5D008BCAF5 /* Launcher.xib */ = { isa = PBXVariantGroup; children = ( @@ -2669,46 +2637,6 @@ name = "Inform - A Design System for Interactive Fiction.epub"; sourceTree = ""; }; - FFF10839191511E500C6A272 /* AdviceCredits.html */ = { - isa = PBXVariantGroup; - children = ( - FFF1083A191511E500C6A272 /* en */, - ); - name = AdviceCredits.html; - sourceTree = ""; - }; - FFF1083B191511E500C6A272 /* AdviceKeyboardShortcuts.html */ = { - isa = PBXVariantGroup; - children = ( - FFF1083C191511E500C6A272 /* en */, - ); - name = AdviceKeyboardShortcuts.html; - sourceTree = ""; - }; - FFF1083D191511E500C6A272 /* AdviceMaterialsFolder.html */ = { - isa = PBXVariantGroup; - children = ( - FFF1083E191511E500C6A272 /* en */, - ); - name = AdviceMaterialsFolder.html; - sourceTree = ""; - }; - FFF1083F191511E500C6A272 /* AdviceNewToInform.html */ = { - isa = PBXVariantGroup; - children = ( - FFF10840191511E500C6A272 /* en */, - ); - name = AdviceNewToInform.html; - sourceTree = ""; - }; - FFF10841191511E500C6A272 /* AdviceUpgrading.html */ = { - isa = PBXVariantGroup; - children = ( - FFF10842191511E500C6A272 /* en */, - ); - name = AdviceUpgrading.html; - sourceTree = ""; - }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ @@ -2941,7 +2869,7 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_IDENTITY = "Developer ID Application"; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1.82.0; @@ -3005,7 +2933,7 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_IDENTITY = "Developer ID Application"; CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1.82.0; diff --git a/inform/JavaScript/IFJSProject.m b/inform/JavaScript/IFJSProject.m index 006dc0d9..352fbef1 100644 --- a/inform/JavaScript/IFJSProject.m +++ b/inform/JavaScript/IFJSProject.m @@ -229,6 +229,10 @@ - (void) pasteCode: (NSString*) code { - (void) openFile: (NSString*) filename { [[NSWorkspace sharedWorkspace] openFile: filename]; + +// NSString* dir = [filename stringByDeletingLastPathComponent]; +// [[NSWorkspace sharedWorkspace] selectFile: filename +// inFileViewerRootedAtPath: dir]; } - (void) openUrl: (NSString*) url { diff --git a/inform/Resources/Base.lproj/Launcher.xib b/inform/Resources/Base.lproj/Launcher.xib index 3083a5f4..9be5ae4f 100644 --- a/inform/Resources/Base.lproj/Launcher.xib +++ b/inform/Resources/Base.lproj/Launcher.xib @@ -363,7 +363,7 @@ - + diff --git a/inform/Resources/en.lproj/AdviceCredits.html b/inform/Resources/en.lproj/AdviceCredits.html deleted file mode 100644 index fe758c06..00000000 --- a/inform/Resources/en.lproj/AdviceCredits.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Credits - - - -

Credits

-

Inform is a team effort kept alive by the enthusiasm of a community of writers.

- -The core software is by Graham Nelson, and the Examples and much of the design by Emily Short, with advice from Andrew Plotkin and others.

- -The Mac OS X application was originally written by Andrew Hunter, and was rewritten in 2014 by Toby Nelson, building on Andrew's foundations. Corresponding apps for Windows and Linux are by David Kinder and Philip Chimento, and command-line tools for Linux, on a variety of processors, are maintained by Adam Thornton. David also maintains the Inform 6 code base, now used as a code-generator within Inform 7.

- -The two virtual machines underlying Inform are the Z-machine, designed by Joel Berez, Marc Blank, Dave Lebling and others (and originally called the ZIP), and Glulx, a successor in the same general spirit, which was designed by Andrew Plotkin.

- -Many people have generously shared their Extensions to Inform, and they're credited individually. But special thanks are due to Erik Temple, Dannii Willis, Aaron Reed, Ron Newcomb, Eric Eve and Juhana Leinonen for putting together the core of the Public Library. Mark Musante has been a tireless librarian of the extensions, and Justin de Vesine a great help in organising our forum.

- -Literally thousands of people have filed bug reports or suggestions over the years. If you're one of them, sincere thanks to YOUR NAME HERE. Inform would never have got this far without you. -

- - - diff --git a/inform/Resources/en.lproj/AdviceKeyboardShortcuts.html b/inform/Resources/en.lproj/AdviceKeyboardShortcuts.html deleted file mode 100644 index 800ab92d..00000000 --- a/inform/Resources/en.lproj/AdviceKeyboardShortcuts.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - -Keyboard Shortcuts - - - - -

Keyboard Shortcuts

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
⌘LSummon/Dismiss Launcher
 
Projects
⌘OOpen...
⌘NNew Project
⌘WClose Project
⌘RGo
⌥⌘RReplay
⇧⌘RRelease
⌃⌥⌘TGo and then type "Test Me"
⌘IRefresh Index
⌘MOpen Materials Folder in Finder
 
Switching Panes
⌘1Go to Left Pane
⌘2Go to Right Pane
⌥⌘⇥Switch Panes
F1Source
F2Results
F3Story
F4Testing
F5Index
⌘3Index: Welcome Page
⌘4Index: Contents Page
⌘5Index: Actions Page
⌘6Index: Kinds Page
⌘7Index: Phrasebook Page
⌘8Index: Rules Page
⌘9Index: Scenes Page
⌘0Index: World Page
F6Documentation
F7Extensions
F8Settings
 
Within the Source Pane
⇧⌘HShow Headings
⌥⌘.Show Only This Section in Source
⌘>Show More Sections in Source
⌘<Show Fewer Sections in Source
⌥⌘,Show Entire Source
⌘⇞Shift View to Previous Section
⌘⇟Shift View to Next Section
⌥⌘NRenumber All Sections
 
Editing the Source
⌘CCopy
⌘VPaste
⌘XCut
⌘ZUndo
⇧⌘ZRedo
 
⌘ASelect All
⌘]Shift Selection Right
⌘[Shift Selection Left
⌘/Comment Out Selection
⌥⌘/Uncomment Selection
 
⌘:Show Spelling and Grammar
⌘;Check Spelling
 
Find
⌘EFind Selected Text
⌘FFind...
⇧⌘FFind In Files...
⌘GFind Next
⇧⌘GFind Previous
⌘JScroll To Selection
 
Application Control
⌘,(Inform) Preferences
⌘HHide Inform
⌥⌘HHide Others
⌥⌘MMinimize Window
⌘SSave
⇧⌘SSave As...
⌘PPrint
⇧⌘PPage Setup
⌘QQuit
- - - - diff --git a/inform/Resources/en.lproj/AdviceMaterialsFolder.html b/inform/Resources/en.lproj/AdviceMaterialsFolder.html deleted file mode 100644 index 181efa38..00000000 --- a/inform/Resources/en.lproj/AdviceMaterialsFolder.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - -Materials Folder - - - -

Materials Folder

-

Every project has a ".materials" folder, which is always stored next to it on disc. (Use ⌘M to show the current project's .materials in the Finder.) This screenshot shows how the .materials folder would look for a project which used it in every possible way. In practice, this is very unlikely.

- - - -

Project (1) and .materials folder (2) live side by side in the Finder: everything else here is inside .materials (2). The author of this story decided that it should be given to players along with a PDF booklet (3), by including this Release instruction in the source text: - -

- Release along with a file of "A Guide to Arboreal Fauna" called "A Guide to Arboreal Fauna.pdf". -

- -

Every released project needs cover art. Authors have to provide two files, full-sized at 960 by 960 (4) and reduced at 120 by 120 (18): they can either be "Cover.jpg" and "Small Cover.jpg" or "Cover.png" and "Small Cover.png".

- -

Extensions to Inform are usually centrally installed, and available to all projects. But this project has its own private copy of "Feeding Squirrels by Emily Short" (7), in its own private Extensions folder (5). This would override any installed copy of the same extension. It has to have the correct name and .i7x ending, and it has to live inside a folder with its author's name (6).

- -

Projects which include pictures as well as text need to store the necessary images, in JPEG or PNG format, in the Figures folder (8). This one was declared in the source text like so:

- -

- Figure of Red Admiral Butterfly is the file "butterfly.jpg". -

- -

Sound effects are similar, use AIFF or OGG format, and live in Sounds (19). There's one here (20), declared by:

- -

- Sound of Rustling Leaves is the file "Rustling Leaves.aiff". -

- -

Projects which read or write files of data as they play should have a Files folder (10) to hold these. This one (11) was declared by: - -

- The File of Nut Storage Locations is called "nutstorage". -

- -

Now for some expert-only features which hardly anybody needs in practice. The I6T folder (12) provides extra template files (13), or indeed replacement ones (14), and allows a project to include substantial portions of raw Inform 6 code. The Languages folder (16) is for experimenting with new language bundles, a 2014 feature still in its early stages. The Templates folder (21) is for providing the project with a non-standard Javascript engine, called an "interpreter", when it's released as a website. Here there's an intepreter called "Experimental" (22) which can be selected by putting this into the source:

- -

- Release along with the "Experimental" interpreter. -

- -

And that just leaves the Release folder (17). Inform creates this automatically if the project's Release button is clicked, and then writes into it whatever will eventually go out to players. So never store anything permanent here: it's intended to be just a holding area. -

- - - - diff --git a/inform/Resources/en.lproj/AdviceNewToInform.html b/inform/Resources/en.lproj/AdviceNewToInform.html deleted file mode 100644 index 937fd3a9..00000000 --- a/inform/Resources/en.lproj/AdviceNewToInform.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -New To Inform? - - - -

New To Inform?

-

Inform is both an application and a language for creating text-based interactive stories. Interactive fiction is an art form which evolved out of the adventure games of the 1970s, in the same way that today's graphic novels evolved out of the newspaper cartoons of the 1930s. Inform has been the design tool of choice for many, indeed most, of the world's leading writers in this genre since 1993, and is also widely used in education at a variety of levels. It's completely free, even when used to create commercial works. Thanks for downloading this copy, and we hope you'll enjoy it.

- -

As you've seen, the app begins with a launcher panel. (Bring it back or remove it by typing ⌘L.) You might like to try clicking Onyx, the smallest of the samples, under the "Open a Sample Project" list: it's a very short Russian folk-tale. Inform will ask you to choose somewhere on disc to store it, and then make a copy there. You can play with this and alter it freely, then throw it away when you're done: it's just a copy.

- -

You can have several Inform projects open at once, but each one lives in a single window which is divided in half. The left and right sides are called "panes" and you can choose what's shown in them with the side tabs: it starts out as Source on the left, Documentation on the right. (From the Launcher, you can also save out a copy of the documentation as an EPUB file to read in iBooks on Mac OS 10.9 or later, or on an iPad.)

- -

Inform "translates" the instructions in the Source into a playable story. To see that in action, click the Go button for the Onyx project. You'll have to wait just a moment - an Inform project is a surprisingly complicated thing to make, even when the instructions look short - but then the Story pane will open, and you can type in commands as if you were the player. If you're not sure what to type, try

- -

- TEST ME -

- -

which makes it show what it can do.

- -

The Launcher also offers a larger sample project called "Disenchantment Bay", a story about a boat trip in Alaska. Beyond that, there are around 450 Examples in the Documentation, and by clicking on the "save as project" icon you can get playable versions of all of those, too.

- -

- - - diff --git a/inform/Resources/en.lproj/AdviceUpgrading.html b/inform/Resources/en.lproj/AdviceUpgrading.html deleted file mode 100644 index 3d242217..00000000 --- a/inform/Resources/en.lproj/AdviceUpgrading.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - -Upgrading? - - - -

Upgrading?

-

Inform in 2015 includes several hundred bug fixes as compared with the 2014 releases. The language has only changed in minor ways, but the Inform app can now be used to make Extension projects as well as stories, and the old Skein and Transcript panels are merged into a new one called Testing. See the ebook "Changes to Inform", which you can access from the Launcher.

- -

If you haven't used Inform since before 2014, though, there are big changes. The Mac OS X application was considerably enhanced, for one thing, but the changes go deeper than that. Here are just the headlines: for the full story, see the ebook "Changes to Inform", which you can access from the Launcher.

- -

Firstly: the old "Materials" folder has been renamed ".materials". So if your project is called "Dream.inform" then it's accompanied by "Dream.materials", not "Dream Materials" as before.

- -

Secondly: the language has much better handling of text, getting rid of "indexed" text entirely, and providing grammatical adaptation - the ability to turn "You go out" automatically into "They went out", for example. There's also real number support with scientific functions (so you can perform physical calculations and have Inform check the dimensions, for example); there are named constants; there's a new ability for projects to have their own private Extensions; and so on.

- -

Thirdly: a whole pile of phrases which have been deprecated since before 2010 have finally been removed from the language. If you're still using any of those, you'll need to reword - there's advice on this in the Changes book.

- - - - diff --git a/inform/Resources/en.lproj/Launcher.strings b/inform/Resources/en.lproj/Launcher.strings index 6d2f69a8..497e9b84 100644 Binary files a/inform/Resources/en.lproj/Launcher.strings and b/inform/Resources/en.lproj/Launcher.strings differ diff --git a/inform/StagingArea/Contents/MacOS/6L02/cBlorb b/inform/StagingArea/Contents/MacOS/6L02/cBlorb index 148d56f9..e460637b 100755 Binary files a/inform/StagingArea/Contents/MacOS/6L02/cBlorb and b/inform/StagingArea/Contents/MacOS/6L02/cBlorb differ diff --git a/inform/StagingArea/Contents/MacOS/6L02/ni b/inform/StagingArea/Contents/MacOS/6L02/ni index 7c389764..78ac8227 100755 Binary files a/inform/StagingArea/Contents/MacOS/6L02/ni and b/inform/StagingArea/Contents/MacOS/6L02/ni differ diff --git a/inform/StagingArea/Contents/MacOS/6L38/cBlorb b/inform/StagingArea/Contents/MacOS/6L38/cBlorb index 15298941..a90ca117 100755 Binary files a/inform/StagingArea/Contents/MacOS/6L38/cBlorb and b/inform/StagingArea/Contents/MacOS/6L38/cBlorb differ diff --git a/inform/StagingArea/Contents/MacOS/6L38/ni b/inform/StagingArea/Contents/MacOS/6L38/ni index c39b1dee..d3cd67fb 100755 Binary files a/inform/StagingArea/Contents/MacOS/6L38/ni and b/inform/StagingArea/Contents/MacOS/6L38/ni differ diff --git a/inform/StagingArea/Contents/MacOS/6M62/cBlorb b/inform/StagingArea/Contents/MacOS/6M62/cBlorb index c5ae77b6..09d6e8b7 100755 Binary files a/inform/StagingArea/Contents/MacOS/6M62/cBlorb and b/inform/StagingArea/Contents/MacOS/6M62/cBlorb differ diff --git a/inform/StagingArea/Contents/MacOS/6M62/ni b/inform/StagingArea/Contents/MacOS/6M62/ni index b247ed53..f69f379f 100755 Binary files a/inform/StagingArea/Contents/MacOS/6M62/ni and b/inform/StagingArea/Contents/MacOS/6M62/ni differ diff --git a/inform/StagingArea/Contents/MacOS/cBlorb b/inform/StagingArea/Contents/MacOS/cBlorb index 8ec2c1c5..633fd8bc 100755 Binary files a/inform/StagingArea/Contents/MacOS/cBlorb and b/inform/StagingArea/Contents/MacOS/cBlorb differ diff --git a/inform/StagingArea/Contents/MacOS/inform6 b/inform/StagingArea/Contents/MacOS/inform6 index b2d0a0ca..bc2f2139 100755 Binary files a/inform/StagingArea/Contents/MacOS/inform6 and b/inform/StagingArea/Contents/MacOS/inform6 differ diff --git a/inform/StagingArea/Contents/MacOS/intest b/inform/StagingArea/Contents/MacOS/intest index cf7af365..12b3376b 100755 Binary files a/inform/StagingArea/Contents/MacOS/intest and b/inform/StagingArea/Contents/MacOS/intest differ diff --git a/inform/StagingArea/Contents/MacOS/ni b/inform/StagingArea/Contents/MacOS/ni index 6bddb093..2e2f3fa0 100755 Binary files a/inform/StagingArea/Contents/MacOS/ni and b/inform/StagingArea/Contents/MacOS/ni differ diff --git a/inform/StagingArea/Contents/Resources/Internal/Extensions/Graham Nelson/Basic Inform.i7x b/inform/StagingArea/Contents/Resources/Internal/Extensions/Graham Nelson/Basic Inform.i7x index add88b9a..c13c68b0 100644 --- a/inform/StagingArea/Contents/Resources/Internal/Extensions/Graham Nelson/Basic Inform.i7x +++ b/inform/StagingArea/Contents/Resources/Internal/Extensions/Graham Nelson/Basic Inform.i7x @@ -1008,7 +1008,7 @@ To add (new entry - K) to (L - list of values of kind K), if absent (documented at ph_addtolist): (- LIST_OF_TY_InsertItem({-lvalue-by-reference:L}, {new entry}, 0, 0, {phrase options}); -). -To add (new entry - K) at entry (E - number) in (L - list of values of kind K), if absent +To add (new entry - K) at entry (E - number) in/from (L - list of values of kind K), if absent (documented at ph_addatentry): (- LIST_OF_TY_InsertItem({-lvalue-by-reference:L}, {new entry}, 1, {E}, {phrase options}); -). @@ -1016,23 +1016,23 @@ To add (LX - list of Ks) to (L - list of values of kind K), if absent (documented at ph_addlisttolist): (- LIST_OF_TY_AppendList({-lvalue-by-reference:L}, {-by-reference:LX}, 0, 0, {phrase options}); -). -To add (LX - list of Ks) at entry (E - number) in (L - list of values of kind K) +To add (LX - list of Ks) at entry (E - number) in/from (L - list of values of kind K) (documented at ph_addlistatentry): (- LIST_OF_TY_AppendList({-lvalue-by-reference:L}, {-by-reference:LX}, 1, {E}, 0); -). -To remove (existing entry - K) from (L - list of values of kind K), if present +To remove (existing entry - K) in/from (L - list of values of kind K), if present (documented at ph_remfromlist): (- LIST_OF_TY_RemoveValue({-lvalue-by-reference:L}, {existing entry}, {phrase options}); -). -To remove (N - list of Ks) from (L - list of values of kind K), if present +To remove (N - list of Ks) in/from (L - list of values of kind K), if present (documented at ph_remlistfromlist): (- LIST_OF_TY_Remove_List({-lvalue-by-reference:L}, {-by-reference:N}, {phrase options}); -). -To remove entry (N - number) from (L - list of values), if present +To remove entry (N - number) in/from (L - list of values), if present (documented at ph_rementry): (- LIST_OF_TY_RemoveItemRange({-lvalue-by-reference:L}, {N}, {N}, {phrase options}); -). -To remove entries (N - number) to (N2 - number) from (L - list of values), if present +To remove entries (N - number) to (N2 - number) in/from (L - list of values), if present (documented at ph_rementries): (- LIST_OF_TY_RemoveItemRange({-lvalue-by-reference:L}, {N}, {N2}, {phrase options}); -). @@ -1050,7 +1050,7 @@ To decide what list of Ks is the list of (D - description of values of kind K) Section 4 - Length of lists -To decide what number is the number of entries in/of (L - a list of values) +To decide what number is the number of entries in/of/from (L - a list of values) (documented at ph_numberentries): (- LIST_OF_TY_GetLength({-by-reference:L}) -). To truncate (L - a list of values) to (N - a number) entries/entry diff --git a/inform/StagingArea/Contents/Resources/Internal/HTML/xrefs.txt b/inform/StagingArea/Contents/Resources/Internal/HTML/xrefs.txt index d45cbe3b..f52d158b 100644 --- a/inform/StagingArea/Contents/Resources/Internal/HTML/xrefs.txt +++ b/inform/StagingArea/Contents/Resources/Internal/HTML/xrefs.txt @@ -1,279 +1,279 @@ PM_NoStartRoom PM_StartsOutsideRooms _ doc4 "1.4" "1.4. The Go! button" -PM_CantAssertQuantifier PM_CantAssertNonKind PM_CantAssertNegatedRelations PM_CantAssertNegatedEverywhere PM_CantAssertAdjective PM_TwoLikelihoods PM_NegatedVerb1 PM_NoSuchVerbComma PM_NoSuchVerb _ doc10 "2.1" "2.1. Creating the world" -PM_EnigmaticThey PM_EnigmaticPronoun PM_WordTooLong PM_TooMuchQuotedText PM_UnendingComment PM_UnendingQuote _ doc12 "2.3" "2.3. Punctuation" -PM_BadTitleSentence PM_HeadingStopsBeforeEndOfLine PM_HeadingOverLine HEADINGS _ doc14 "2.5" "2.5. Headings" -PM_UnknownInternalTest PM_TestDoubleWith PM_TestCommandTooLong PM_TestContainsUndo PM_TestBadRequirements PM_TestDuplicate PM_TestMultiWord _ doc17 "2.8" "2.8. The TEST command" -PM_BogusExtension _ doc19 "2.10" "2.10. Installing extensions" -PM_ExtMisidentifiedEnds PM_ExtInadequateVM PM_ExtMiswordedBeginsHere PM_ExtVersionMalformed PM_IncludeExtQuoted _ doc20 "2.11" "2.11. Including extensions" -OPTIONS PM_UnknownUseOption PM_UONotNumerical _ doc21 "2.12" "2.12. Use options" -OPTIONSFILE _ doc22 "2.13" "2.13. Administering classroom use" -STORYFILES PM_BadICLIdentifier _ doc23 "2.14" "2.14. Limits and the Settings panel" -PM_DescriptionsEquated PM_SameKindEquated MAP kind_room _ doc27 "3.2" "3.2. Rooms and the map" -PM_RegionRelation PM_RegionInTwoRegions PM_ExistingRegion REGIONS kind_region _ doc29 "3.4" "3.4. Regions and the index map" -PM_KindsIncompatible PM_MiseEnAbyme PM_CantContainAndSupport PM_BothRoomAndSupporter KINDS _ doc30 "3.5" "3.5. Kinds" -PM_PropertyNotPermitted _ doc32 "3.7" "3.7. Properties depend on kind" -PM_EverywhereMisapplied PM_CantChangeEverywhere PM_EverywhereNonBackdrop kind_backdrop _ doc34 "3.9" "3.9. Backdrops" -PM_TextWithoutSubject PM_TwoAppearances _ doc36 "3.11" "3.11. Two descriptions of things" -PM_BadMapCell PM_RoomMissingDoor PM_DoorInThirdRoom PM_DoorToNonRoom PM_DoorOverconnected PM_DoorUnconnected PM_BothWaysDoor kind_door ph_frontside ph_backside ph_othersideof ph_directionofdoor _ doc37 "3.12" "3.12. Doors" -kind_device _ doc39 "3.14" "3.14. Devices and descriptions" -kind_vehicle _ doc41 "3.16" "3.16. Vehicles and pushable things" -kind_person _ doc42 "3.17" "3.17. Men, women and animals" -kind_player's _ doc46 "3.21" "3.21. The player's holdall" -PM_RoomOrDoorAsPart PM_PartOfRoom _ doc48 "3.23" "3.23. Parts of things" -ph_locationof _ doc50 "3.25" "3.25. The location of something" -PM_NamelessDirection PM_DirectionTooLong PM_ImproperlyMadeDirection PM_TooManyDirections kind_direction _ doc51 "3.26" "3.26. Directions" -NEWKINDS _ doc52 "4.1" "4.1. New kinds" -PM_PluralIsQuoted PM_PluralOfQuoted _ doc55 "4.4" "4.4. Plural assertions" -KINDSVALUE _ doc56 "4.5" "4.5. Kinds of value" -PM_ValueCantHaveVProperties PM_ValueCantHaveProperties _ doc57 "4.6" "4.6. Properties again" -PM_ThisIsEitherOr PM_MiscellaneousEOProblem PM_NonObjectCanBe PM_QualifiedCanBe PM_EitherOrAsValue _ doc58 "4.7" "4.7. New either/or properties" -PM_RedundantThatVaries PM_BadProvides PM_PropertyKindClashes PM_PropertyKindVague PM_PropertyKindUnknown PM_PropertyTooSpecific PM_BadVisibilityWhen PM_PropertyUninitialisable PM_PropertyNameForbidden PM_PropertyCalledPresence PM_PropertyCalledArticle PM_PropertyOfKind1 _ doc59 "4.8" "4.8. New value properties" -PM_EitherOnThree _ doc61 "4.10" "4.10. Conditions of things" -ph_defaultvalue _ doc62 "4.11" "4.11. Default values of kinds" -PM_EmptyKind VARIABLES var_location _ doc63 "4.12" "4.12. Values that vary" -PM_TooManyDuplicates _ doc65 "4.14" "4.14. Duplicates" -PM_ComplexEvery PM_AssemblyRegress PM_AssemblyLoop _ doc66 "4.15" "4.15. Assemblies and body parts" -PM_TSWithPunctuation _ doc69 "5.1" "5.1. Text with substitutions" -phs_bracket phs_closebracket phs_apostrophe phs_quotemark _ doc70 "5.2" "5.2. How Inform reads quoted text" -ph_say phs_a phs_A phs_the phs_The _ doc71 "5.3" "5.3. Text which names things" -phs_numwords phs_s _ doc72 "5.4" "5.4. Text with numbers" -phs_listof phs_alistof phs_Alistof phs_thelistof phs_Thelistof phs_islistof phs_isalistof phs_isthelistof phs_alistofconts _ doc73 "5.5" "5.5. Text with lists" -PM_SayEndIfWithoutSayIf PM_SayOtherwiseWithoutIf PM_SayIfNested phs_if phs_unless phs_otherwise phs_endif phs_endunless phs_elseif phs_elseunless _ doc74 "5.6" "5.6. Text with variations" -PM_ComplicatedSayStructure3 PM_ComplicatedSayStructure4 PM_ComplicatedSayStructure5 PM_ComplicatedSayStructure2 PM_ComplicatedSayStructure phs_oneof phs_or phs_purelyrandom phs_thenpurelyrandom phs_random phs_thenrandom phs_sticky phs_decreasing phs_order phs_cycling phs_stopping phs_firsttime _ doc75 "5.7" "5.7. Text with random alternatives" -phs_linebreak phs_nolinebreak phs_runparaon phs_parabreak phs_condparabreak ph_breakpending phs_clarifbreak phs_runparaonsls _ doc76 "5.8" "5.8. Line breaks and paragraph breaks" -phs_bold phs_italic phs_roman phs_fixedspacing phs_varspacing _ doc77 "5.9" "5.9. Text with type styles" -PM_MidTextUnicode PM_SayUnicode _ doc79 "5.11" "5.11. Unicode characters" -ph_boxed _ doc80 "5.12" "5.12. Displaying quotations" -DESCRIPTIONS ph_numberof _ doc82 "6.1" "6.1. What are descriptions?" -PM_ArticleAsAdjective PM_AdjDomainUnknown PM_AdjDomainSurreal PM_AdjDomainSlippery PM_DefinitionWithoutCondition PM_DefinitionBadCondition _ doc85 "6.4" "6.4. Defining new adjectives" -PM_MultiwordGrading PM_GradingWrongKOV PM_GradingUnless PM_GradingUnknownProperty PM_GradingNonLiteral PM_GradingMisphrased PM_GradingCalled PM_ComparativeMisapplied _ doc88 "6.7" "6.7. Comparatives" -PM_OutOfPlay _ doc91 "6.10" "6.10. Existence and there" -ph_roomdirof ph_doordirof ph_roomordoor ph_bestroute ph_bestroutethrough ph_bestroutelength ph_bestroutethroughlength _ doc95 "6.14" "6.14. Adjacent rooms and routes through the map" -PM_ComplexDeterminer _ doc96 "6.15" "6.15. All, each and every" -PM_NonActionIn PM_APUnknown PM_APWithNoParticiple kind_actionname ACTIONS _ doc98 "7.1" "7.1. Actions" -rules_instead _ doc99 "7.2" "7.2. Instead rules" -rules_before ph_stopaction ph_continueaction _ doc100 "7.3" "7.3. Before rules" -PM_ActionTooSpecific PM_ActionNotSpecific PM_UnknownTryAction2 PM_UnknownTryAction1 ph_try ph_trysilently _ doc101 "7.4" "7.4. Try and try silently" -rules_after _ doc102 "7.5" "7.5. After rules" -PM_APWithImmiscible PM_APWithDisjunction _ doc105 "7.8" "7.8. Rules applying to more than one action" -var_noun _ doc107 "7.10" "7.10. The noun and the second noun" -PM_APWithBadWhen PM_NonActionInPresenceOf _ doc109 "7.12" "7.12. In the presence of, and when" -PM_GoingWithoutObject PM_GoingWrongKind _ doc111 "7.14" "7.14. Going by, going through, going with" -KACTIONS PM_NamedAPWithActor _ doc112 "7.15" "7.15. Kinds of action" -var_prompt _ doc117 "8.2" "8.2. Changing the command prompt" -var_sl phs_surroundings _ doc118 "8.3" "8.3. Changing the status line" -ph_changeexit ph_changenoexit _ doc120 "8.5" "8.5. Change of properties with values" -ph_move _ doc122 "8.7" "8.7. Moving things" -ph_movebackdrop ph_updatebackdrop _ doc123 "8.8" "8.8. Moving backdrops" -ph_remove _ doc125 "8.10" "8.10. Removing things from play" -PM_RedefinedNow PM_CantChangeKind PM_CantForceCalling PM_CantForceGeneralised PM_CantForceExistence PM_CantForceRelation PM_BadNow3 PM_BadNow2 PM_BadNow1 ph_now _ doc126 "8.11" "8.11. Now..." -ph_increase ph_decrease ph_increment ph_decrement _ doc127 "8.12" "8.12. Increasing and decreasing" -PM_CalledWithDash PM_CalledThe _ doc130 "8.15" "8.15. Calling names" -ph_holder ph_firstheld ph_nextheld _ doc132 "8.17" "8.17. Looking at containment by hand" -ph_randombetween ph_randomchance ph_seed _ doc133 "8.18" "8.18. Randomness" -PM_RandomImpossible ph_randomdesc _ doc134 "8.19" "8.19. Random choices of things" -rules_wpb ROOMPLAYBEGINS _ doc135 "9.1" "9.1. When play begins" -var_score _ doc136 "9.2" "9.2. Awarding points" -rules_wpe ph_end ph_endfinally ph_endsaying ph_endfinallysaying ph_ended ph_notended ph_finallyended ph_notfinallyended ph_resume _ doc138 "9.4" "9.4. When play ends" -PM_NumberOfTurns rules_et _ doc139 "9.5" "9.5. Every turn" -var_time kind_time _ doc140 "9.6" "9.6. The time of day" -phs_timewords _ doc141 "9.7" "9.7. Telling the time" -ph_durationmins ph_durationhours _ doc142 "9.8" "9.8. Approximate times, lengths of time" -ph_shiftbefore ph_shiftafter ph_timebefore ph_timeafter _ doc143 "9.9" "9.9. Comparing and shifting times" -ph_minspart ph_hourspart _ doc144 "9.10" "9.10. Calculating times" -TIMEDEVENTS PM_UnusedTimedEvent PM_AtWithoutTime ph_timefromnow ph_turnsfromnow ph_attime _ doc145 "9.11" "9.11. Future events" -PM_PTAPTooComplex _ doc146 "9.12" "9.12. Actions as conditions" -PM_PastTableEntries PM_NonPresentTense PM_PastActionCalled PM_PastCallings PM_PastTableLookup PM_PTAPMakesCallings PM_PastSubordinate _ doc147 "9.13" "9.13. The past and perfect tenses" -kind_scene SCENESINTRO _ doc150 "10.1" "10.1. Introduction to scenes" -PM_ScenesBadCondition PM_ScenesOversetEnd PM_ScenesUnknownEnd PM_ScenesOnly PM_ScenesDisallowCalled PM_ScenesNotPlay _ doc151 "10.2" "10.2. Creating a scene" -ph_scenetimesincebegan ph_scenetimesinceended ph_scenetimewhenbegan ph_scenetimewhenended _ doc152 "10.3" "10.3. Using the Scene index" -ph_hashappened ph_hasnothappened ph_hasended ph_hasnotended _ doc153 "10.4" "10.4. During scenes" -LINKINGSCENES _ doc154 "10.5" "10.5. Linking scenes together" -PHRASES ph_nothing _ doc159 "11.1" "11.1. What are phrases?" -PM_BareTo _ doc160 "11.2" "11.2. The phrasebook" -PM_SaySlashed PM_AdjacentTokens PM_PhraseTooLong PM_TokenMisunderstood PM_BadTypeIndication PM_TokenWithNestedBrackets PM_TokenWithEmptyBrackets PM_TokenWithoutCloseBracket PM_TokenWithoutOpenBracket _ doc161 "11.3" "11.3. Pattern matching" -ph_showme _ doc162 "11.4" "11.4. The showme phrase" -PM_TruthStateToDecide kind_truthstate ph_indarkness ph_consents ph_whether _ doc163 "11.5" "11.5. Conditions and questions" -PM_IfOutsidePhrase ph_if ph_unless _ doc164 "11.6" "11.6. If" -PM_EmptyIndentedBlock PM_RunOnsInTabbedRoutine PM_MisalignedIndentation PM_NotInOldSyntax PM_BothBlockSyntaxes PM_CantUseOutsideStructure PM_WrongEnd PM_EndWithoutBegin PM_BlockNestingTooDeep PM_BeginWithoutEnd _ doc165 "11.7" "11.7. Begin and end" -PM_OtherwiseInNonIf PM_OtherwiseWithoutIf PM_CaseValueMismatch PM_CaseValueNonConstant PM_OtherwiseIfAfterOtherwise PM_DoubleOtherwise PM_MisarrangedOtherwise PM_MisalignedCase PM_MisalignedOtherwise PM_NonCaseInIf ph_otherwise ph_switch _ doc166 "11.8" "11.8. Otherwise" -ph_while _ doc167 "11.9" "11.9. While" -PM_CalledInRepeat ph_repeat _ doc168 "11.10" "11.10. Repeat" -PM_BadRepeatDomain ph_runthrough _ doc169 "11.11" "11.11. Repeat running through" -PM_CantUseOutsideLoop ph_next ph_break _ doc170 "11.12" "11.12. Next and break" -ph_stop _ doc171 "11.13" "11.13. Stop" -PM_SayWithPhraseOptions PM_NotTheOnlyPhraseOption PM_NotAPhraseOption PM_PhraseOptionsExclusive PM_TooManyPhraseOptions ph_listcontents _ doc172 "11.14" "11.14. Phrase options" -ph_let ph_letdefault _ doc173 "11.15" "11.15. Let and temporary variables" -ph_yes ph_no _ doc174 "11.16" "11.16. New conditions, new adjectives" -PM_RedundantReturnKOV PM_UnknownValueToDecide PM_ReturnWrongKind ph_decideon _ doc175 "11.17" "11.17. Phrases to decide other things" -ph_enumfirst ph_enumlast ph_enumafter ph_enumbefore _ doc176 "11.18" "11.18. The value after and the value before" -ARSUMMARY _ doc178 "12.2" "12.2. How actions are processed" -var_person_asked _ doc179 "12.3" "12.3. Giving instructions to other people" -rules_per _ doc180 "12.4" "12.4. Persuasion" -rules_fail var_reason _ doc181 "12.5" "12.5. Unsuccessful attempts" -PM_ActionMisapplied PM_ActionClauseUnknown PM_ActionBothValues PM_ActionAlreadyExists PM_GrammarMismatchesAction PM_MultiwordPastParticiple PM_MatchedAsTooLong NEWACTIONS ph_requirestouch ph_requirestouch2 ph_requirescarried ph_requirescarried2 ph_requireslight _ doc183 "12.7" "12.7. New actions" -PM_BadMatchingSyntax PM_ActionVarValue PM_ActionVarUnknownKOV PM_ActionVarOverspecific PM_ActionVarAnd PM_ActionVarsPastTense _ doc186 "12.10" "12.10. Action variables" -PM_RuleWithComma PM_DuplicateRuleName _ doc188 "12.12" "12.12. Check rules for actions by other people" -OUTOFWORLD _ doc191 "12.15" "12.15. Out of world actions" -rules_ri _ doc192 "12.16" "12.16. Reaching inside and reaching outside rules" -var_person_reaching _ doc194 "12.18" "12.18. Changing reachability" -visibility _ doc195 "12.19" "12.19. Changing visibility" -kind_storedaction ph_currentaction ph_actionpart ph_nounpart ph_secondpart ph_actorpart ph_involves ph_actionof _ doc196 "12.20" "12.20. Stored actions" -PM_KindRelatedToValue PM_EveryWrongSide PM_BadRelation PM_RelationWithEitherOrProperty PM_RelationWithBadProperty PM_PropForBadKOV VERBS _ doc198 "13.1" "13.1. Sentence verbs" -RELATIONS _ doc200 "13.3" "13.3. What are relations?" -PM_BadKOVForRelationProperty PM_RelatedKindsUnknown PM_OneToOneMiscalled PM_CantCallBoth PM_CantCallRight PM_CantCallLeft PM_BothOneAndMany PM_OneOrVariousWithWhen PM_FRFUnavailable PM_RelationExists _ doc202 "13.5" "13.5. Making new relations" -ph_showrelation _ doc204 "13.7" "13.7. Relations in groups" -PM_PrepositionLong PM_PrepositionConjugated PM_DuplicateVerbs1 PM_VerbMalformed PM_PresentPluralTwice PM_VerbRelationUnknown PM_VerbUnknownMeaning PM_VerbRelationVague _ doc206 "13.9" "13.9. Defining new assertion verbs" -ph_nextstep ph_numbersteps _ doc208 "13.11" "13.11. Indirect relations" -PM_BadRelationCondition PM_Unassertable2 _ doc209 "13.12" "13.12. Relations which express conditions" -ph_ifleft ph_ifright ph_rightlookup ph_leftlookup ph_leftlookuplist ph_rightlookuplist ph_leftdomain ph_rightdomain _ doc210 "13.13" "13.13. Relations involving values" -ph_letrelation _ doc212 "13.15" "13.15. Temporary relations" -phs_here phs_now _ doc214 "14.1" "14.1. Tense and narrative viewpoint" -kind_verb phs_adapt phs_adaptv phs_adaptt phs_adaptvt phs_negate phs_negatev phs_negatet phs_negatevt phs_infinitive phs_pastpart phs_prespart _ doc222 "14.9" "14.9. Verbs as values" -phs_response _ doc223 "14.10" "14.10. Responses" -PM_LiteralOverflow PM_ElementOverflow PM_ZMachineOverflow PM_EvenOverflow-G PM_CantEquateValues PM_InequalityFailed kind_real_number kind_number _ doc227 "15.2" "15.2. Numbers and real numbers" -ph_nearestwholenumber _ doc228 "15.3" "15.3. Real number conversions" -phs_realplaces phs_decimal phs_decimalplaces phs_scientific phs_scientificplaces _ doc229 "15.4" "15.4. Printing real numbers" -ph_plus ph_minus ph_times ph_divide ph_remainder ph_nearest ph_squareroot ph_realsquareroot ph_cuberoot _ doc230 "15.5" "15.5. Arithmetic" -ph_ceiling ph_floor ph_absolutevalue ph_reciprocal ph_power ph_exp ph_logarithmto ph_logarithm _ doc231 "15.6" "15.6. Powers and logarithms" -ph_degrees ph_sine ph_cosine ph_tangent ph_arcsine ph_arccosine ph_arctangent ph_hyperbolicsine ph_hyperboliccosine ph_hyperbolictangent ph_hyperbolicarcsine ph_hyperbolicarccosine ph_hyperbolicarctangent _ doc232 "15.7" "15.7. Trigonometry" -PM_NegationForbidden PM_NegationInternal PM_LPEnumeration PM_LPBuiltInKOV PM_LPNotKOV _ doc233 "15.8" "15.8. Units" -PM_DuplicateUnitSpec _ doc234 "15.9" "15.9. Multiple notations" -PM_LPTooLittleAccuracy PM_LPCantScaleTwice PM_LPCantScaleYet _ doc235 "15.10" "15.10. Scaling and equivalents" -PM_LPNotAllNamed PM_LPTooComplicated PM_LPTooManyElements PM_LPElementTooLarge PM_LPWithoutElement _ doc239 "15.14" "15.14. Notations including more than one number" -PM_BadLPNameOption PM_BadLPPartOption PM_LPMultipleOptional PM_LPFirstOptional _ doc240 "15.15" "15.15. The parts of a number specification" -PM_TotalTableColumn PM_TotalEitherOr ph_total _ doc242 "15.17" "15.17. Totals" -PM_EquationSymbolWrongKOV PM_EquationSymbolMissing PM_EquationInsoluble PM_EquationBadTarget PM_EquationBadArithmetic PM_EquationDimensionPower PM_EquationIncomparable PM_EquationEquatesMultiply PM_EquationEquatesBadly PM_EquationDoesntEquate PM_EquationMispunctuated PM_EquationTooComplex PM_EquationOperatorUnrecognised PM_EquationLeadingZero PM_EquationTokenUnrecognised PM_EquationSymbolSpurious PM_EquationSymbolBadSub PM_EquationSymbolNonNumeric PM_EquationSymbolEqualsKOV PM_EquationSymbolNonValue PM_EquationSymbolVague PM_EquationSymbolMalformed PM_EquationSymbolMisdeclared PM_EquationMisnamed PM_EquationMisnumbered EQUATIONS ph_letequation _ doc243 "15.18" "15.18. Equations" -ARITHMETIC PM_BadArithmetic PM_MultiplyingNonKOVs PM_BadLPOffset PM_BadLPEquivalent PM_DimensionsInconsistent PM_UnitSequenceOverflow PM_NonDimensional PM_DimensionNotBaseKOV PM_DimensionRedundant _ doc245 "15.20" "15.20. Multiplication of units" -PM_TableRowFull PM_TableColumnBrackets PM_TableKindlessColumn PM_TableEntryGeneric PM_TableWithBlankNames PM_TableDefiningObject PM_TableOfExistingKind PM_TableOfBuiltInKind PM_TableOfQuantifiedKind PM_TableUndefined PM_TableWithoutRows PM_TableColumnAlready PM_TableColumnArticle PM_TableTooManyColumns PM_TableNameAmbiguous PM_TableNameDuplicate PM_TableMisnamed PM_TableIncompatibleEntry PM_TableUnknownEntry PM_TableDescriptionEntry PM_TableVariableEntry PM_TablePlayerEntry PM_TableColumnEmptyLists PM_TableCoincidesWithKind TABLES _ doc246 "16.1" "16.1. Laying out tables" -ph_numrows _ doc247 "16.2" "16.2. Looking up entries" -ph_showmetable phs_currenttablerow phs_tablerow phs_tablecolumn _ doc249 "16.4" "16.4. Changing entries" -PM_NoRowSelected ph_chooserow ph_chooserowwith ph_chooserandomrow _ doc250 "16.5" "16.5. Choosing rows" -ph_repeattable ph_repeattablereverse ph_repeattablecol ph_repeattablecolreverse _ doc251 "16.6" "16.6. Repeating through tables" -ph_thereis ph_thereisno _ doc252 "16.7" "16.7. Blank entries" -ph_chooseblankrow ph_numblank ph_numfilled ph_blankout ph_blankoutrow ph_blankoutcol ph_blankouttable _ doc255 "16.10" "16.10. Adding and removing rows" -ph_sortrandom ph_sortcolumn ph_sortcolumnreverse _ doc256 "16.11" "16.11. Sorting" -kind_tablename _ doc260 "16.15" "16.15. Varying which table to look at" -PM_TableDefiningTheImpossible PM_TableDefiningNothing _ doc261 "16.16" "16.16. Defining things with tables" -PM_TableNotContinuation _ doc263 "16.18" "16.18. Table continuations" -PM_TableAmendmentMismatch PM_TableAmendmentMisfit _ doc264 "16.19" "16.19. Table amendments" -UNDERSTANDING someone_token PM_TextTokenRestricted PM_OverComplexToken PM_BizarreToken PM_UnknownToken PM_UnparsableKind PM_UseThingNotObject PM_UseTextNotTopic PM_ObsoleteHeldTokens PM_UnderstandAsCompoundText PM_UnderstandCommaCommand PM_UnderstandEmptyText PM_LiteralPunctuation PM_UnderstandVague PM_UnderstandAsBadValue PM_UnderstandAsActivity PM_TextlessMistake PM_UnderstandMismatch PM_NontextualUnderstand PM_NotOldCommand PM_NotNewCommand PM_UnderstandCommandWhen PM_OldVerbUsage _ doc265 "17.1" "17.1. Understand" -PM_GrammarIllFounded PM_TooManyGrammarLines PM_TooManyAliases PM_ThreeValuedLine _ doc266 "17.2" "17.2. New commands for old grammar" -TOKENS things_token _ doc268 "17.4" "17.4. Standard tokens of grammar" -text_token _ doc269 "17.5" "17.5. The text token" -var_understood _ doc273 "17.9" "17.9. Understanding kinds of value" -PM_UnderstandPluralValue PM_UnderstandAsQualified _ doc275 "17.11" "17.11. Understanding values" -PM_SlashedCommand PM_OverAmbitiousSlash _ doc276 "17.12" "17.12. This/that" -NEWTOKENS PM_TwoValuedToken PM_MixedOutcome _ doc277 "17.13" "17.13. New tokens" -PM_UnknownUnpermittedProperty PM_BadReferringProperty PM_BadUnderstandPropertyAs PM_BadUnderstandProperty PM_UnknownUnderstandProperty _ doc279 "17.15" "17.15. Understanding things by their properties" -PM_GrammarValueRelation PM_GrammarBadRelation PM_GrammarObjectlessRelation _ doc280 "17.16" "17.16. Understanding things by their relations" -PM_BadWhen _ doc281 "17.17" "17.17. Context: understanding when" -ph_setpronouns _ doc282 "17.18" "17.18. Changing the meaning of pronouns" -rules_dtpm _ doc283 "17.19" "17.19. Does the player mean..." -ph_multipleobjectlist ph_altermultipleobjectlist _ doc284 "17.20" "17.20. Multiple action processing" -PM_BadActivityName kind_activity ACTIVITIES _ doc287 "18.1" "18.1. What are activities?" -PM_BadWhenWhile _ doc290 "18.4" "18.4. While clauses" -EXTACTIVITIES ph_carryout ph_carryoutwith ph_continueactivity _ doc291 "18.5" "18.5. New activities" -PM_ActivityVarValue PM_ActivityVarUnknownKOV PM_ActivityVarOverspecific PM_ActivityVarAnd PM_ActivityVariableNameless _ doc292 "18.6" "18.6. Activity variables" -ph_beginactivity ph_beginactivitywith ph_endactivity ph_endactivitywith ph_handlingactivity ph_handlingactivitywith ph_abandonactivity ph_abandonactivitywith _ doc293 "18.7" "18.7. Beginning and ending activities manually" -var_particular act_con _ doc295 "18.9" "18.9. Deciding the concealed possessions of something" -act_pn ph_omit _ doc296 "18.10" "18.10. Printing the name of something" -act_ppn _ doc297 "18.11" "18.11. Printing the plural name of something" -act_pan _ doc298 "18.12" "18.12. Printing a number of something" -act_lc ph_group ph_groupart ph_grouptext _ doc299 "18.13" "18.13. Listing contents of something" -act_gt _ doc300 "18.14" "18.14. Grouping together something" -act_resp _ doc301 "18.15" "18.15. Issuing the response text of something" -act_details _ doc302 "18.16" "18.16. Printing room description details of something" -act_idetails _ doc303 "18.17" "18.17. Printing inventory details of something" -act_toodark _ doc304 "18.18" "18.18. Printing a refusal to act in the dark" -act_nowdark _ doc305 "18.19" "18.19. Printing the announcement of darkness" -act_nowlight _ doc306 "18.20" "18.20. Printing the announcement of light" -act_darkname _ doc307 "18.21" "18.21. Printing the name of a dark room" -act_darkdesc _ doc308 "18.22" "18.22. Printing the description of a dark room" -act_csl _ doc309 "18.23" "18.23. Constructing the status line" -act_wpa _ doc310 "18.24" "18.24. Writing a paragraph about" -act_lni _ doc311 "18.25" "18.25. Listing nondescript items of something" -act_pld _ doc312 "18.26" "18.26. Printing the locale description of something" -act_cnlo _ doc313 "18.27" "18.27. Choosing notable locale objects for something" -act_plp _ doc314 "18.28" "18.28. Printing a locale paragraph about" -act_ds ph_placeinscope ph_placecontentsinscope _ doc315 "18.29" "18.29. Deciding the scope of something" -act_clarify _ doc316 "18.30" "18.30. Clarifying the parser's choice of something" -act_which _ doc317 "18.31" "18.31. Asking which do you mean" -act_smn _ doc318 "18.32" "18.32. Supplying a missing noun/second noun" -kind_snippet var_command act_reading ph_snippetmatches ph_snippetdoesnotmatch ph_snippetincludes ph_snippetdoesnotinclude ph_rejectcommand ph_replacesnippet ph_cutsnippet ph_changecommand _ doc319 "18.33" "18.33. Reading a command" -act_implicitly _ doc320 "18.34" "18.34. Implicitly taking something" -act_parsererror _ doc321 "18.35" "18.35. Printing a parser error" -act_all _ doc322 "18.36" "18.36. Deciding whether all includes" -act_banner phs_banner _ doc323 "18.37" "18.37. Printing the banner text" -act_obit _ doc324 "18.38" "18.38. Printing the player's obituary" -act_amuse _ doc325 "18.39" "18.39. Amusing a victorious player" -act_startvm _ doc326 "18.40" "18.40. Starting the virtual machine" -PM_RulebookWithTo PM_RulebookWithDefinition PM_RulebookWithAt RULEBOOKS kind_rulebook kind_rule _ doc327 "19.1" "19.1. On rules" -PM_RuleWithoutColon PM_RuleWithDefiniteArticle PM_BadRulePreamble PM_BadRulePreambleWhen _ doc329 "19.3" "19.3. New rules" -PM_PlaceWithMissingRule PM_NoSuchRuleExists PM_UnspecifiedRulebookPlacement PM_BadRulePlacementNegation PM_ImproperRulePlacement RLISTING _ doc330 "19.4" "19.4. Listing rules explicitly" -rules_proc _ doc331 "19.5" "19.5. Changing the behaviour of rules" -NEWRULEBOOKS ph_follow _ doc334 "19.8" "19.8. New rulebooks" -ph_followfor _ doc335 "19.9" "19.9. Basis of a rulebook" -PM_RulebookVariableVague PM_RulebookVariableBadKind PM_RulebookVariableTooSpecific PM_RulebookVariableAnd _ doc336 "19.10" "19.10. Rulebook variables" -PM_BadDefaultOutcome PM_DefaultOutcomeTwice ph_succeeds ph_fails ph_nodecision ph_succeeded ph_failed _ doc337 "19.11" "19.11. Success and failure" -PM_NonOutcomeProperty PM_DuplicateOutcome PM_DefaultOutcomeAlready PM_DefaultNamedOutcomeTwice PM_BadOutcomeClarification PM_WrongEndToPhrase PM_MisplacedRulebookOutcome ph_rulebookoutcome _ doc338 "19.12" "19.12. Named outcomes" -ph_succeedswith ph_producedby ph_producedbyfor _ doc339 "19.13" "19.13. Rulebooks producing values" -ph_abide ph_abidefor ph_abideanon _ doc340 "19.14" "19.14. Abide by" -rules_internal _ doc341 "19.15" "19.15. Two rulebooks used internally" -ph_charnum ph_numchars ph_wordnum ph_numwords ph_pwordnum ph_numpwords ph_upwordnum ph_numupwords ph_linenum ph_numlines ph_paranum ph_numparas _ doc345 "20.3" "20.3. Characters, words, punctuated words, unpunctuated words, lines, paragraphs" -ph_inlower ph_inupper ph_lowercase ph_uppercase ph_titlecase ph_sentencecase _ doc346 "20.4" "20.4. Upper and lower case letters" -ph_matches ph_exactlymatches ph_nummatches _ doc347 "20.5" "20.5. Matching and exactly matching" -ph_matchesre ph_exactlymatchesre ph_nummatchesre ph_matchtext ph_subexpressiontext _ doc348 "20.6" "20.6. Regular expression matching" -ph_subform _ doc349 "20.7" "20.7. Making new text with text substitutions" -ph_replacechar ph_replaceword ph_replacepword ph_replaceupword ph_replaceline ph_replacepara ph_replace ph_replacewordin ph_replacepwordin ph_replacere _ doc350 "20.8" "20.8. Replacements" -kind_listof _ doc352 "21.1" "21.1. Lists and entries" -PM_IncompatibleConstantListEntry PM_NonconstantConstantListEntry PM_BadConstantListEntry PM_CantLetEmptyList _ doc353 "21.2" "21.2. Constant lists" -phs_listbraced phs_listdef phs_listindef _ doc354 "21.3" "21.3. Saying lists of values" -ph_islistedin ph_isnotlistedin ph_repeatlist _ doc355 "21.4" "21.4. Testing and iterating over lists" -ph_addtolist ph_addlisttolist ph_addatentry ph_addlistatentry ph_remfromlist ph_remlistfromlist ph_rementry ph_rementries _ doc356 "21.5" "21.5. Building lists" -ph_listofdesc _ doc357 "21.6" "21.6. Lists of objects" -ph_reverselist ph_sortlist ph_sortlistreverse ph_sortlistrandom ph_sortlistproperty ph_sortlistpropertyreverse ph_rotatelist ph_rotatelistback _ doc359 "21.8" "21.8. Sorting, reversing and rotating lists" -ph_numberentries _ doc360 "21.9" "21.9. Accessing entries in a list" -ph_changelength ph_truncate ph_truncatefirst ph_truncatelast ph_extend _ doc361 "21.10" "21.10. Lengthening or shortening a list" -kind_description ph_valuematch _ doc364 "22.2" "22.2. Descriptions as values" -ph_applied0 ph_applied1 ph_applied2 ph_applied3 ph_apply0 ph_apply1 ph_apply2 ph_apply3 _ doc365 "22.3" "22.3. Phrases as values" -ph_appliedlist ph_filter ph_reduction _ doc367 "22.5" "22.5. Map, filter and reduce" -PM_UnknownVirtualMachine _ doc375 "23.3" "23.3. Virtual machines and story file formats" -FIGURES kind_figurename _ doc376 "23.4" "23.4. Gathering the figures" -PM_PictureNotTextual PM_PictureDuplicate _ doc377 "23.5" "23.5. Declaring and previewing the figures" -ph_displayfigure _ doc378 "23.6" "23.6. Displaying the figures" -SOUNDS kind_soundname _ doc379 "23.7" "23.7. Recorded sounds" -PM_SoundNotTextual PM_SoundDuplicate ph_playsf _ doc380 "23.8" "23.8. Declaring and playing back sounds" -ph_figureid ph_soundid _ doc382 "23.10" "23.10. Some technicalities about figures and sounds" -EFILES _ doc383 "23.11" "23.11. Files" -PM_FilenameUnsafe PM_FilenameNotTextual PM_FilenameDuplicate PM_BadFileOwner PM_BadFileIFID kind_externalfile _ doc384 "23.12" "23.12. Declaring files" -ph_writetable ph_readtable ph_fileexists _ doc385 "23.13" "23.13. Writing and reading tables to external files" -ph_writetext ph_appendtext ph_saytext _ doc386 "23.14" "23.14. Writing, reading and appending text to files" -ph_fileready ph_markfileready ph_markfilenotready _ doc387 "23.15" "23.15. Exchanging files with other programs" -PM_BadEpisode _ doc397 "25.2" "25.2. Bibliographic data" -LCARDS _ doc399 "25.4" "25.4. The Library Card" -IFIDS _ doc400 "25.5" "25.5. The Treaty of Babel and the IFID" -release_files PM_NoSuchPublicRelease _ doc401 "25.6" "25.6. The Release button and the Materials folder" -PM_ReleaseAlong _ doc402 "25.7" "25.7. The Joy of Feelies" -release_cover _ doc403 "25.8" "25.8. Cover art" -release_postcard release_booklet _ doc404 "25.9" "25.9. An introductory booklet and postcard" -release_website _ doc405 "25.10" "25.10. A website" -release_interpreter _ doc406 "25.11" "25.11. A playable web page" -PM_RoomInIgnoredSource _ doc410 "25.15" "25.15. Republishing existing works of IF" -release_solution _ doc411 "25.16" "25.16. Walkthrough solutions" -release_card release_source _ doc412 "25.17" "25.17. Releasing the source text" -PM_MapPlacementDirection PM_MapPlacement PM_MapDirectionClue PM_MapHintUnknown PM_MapSettingTypeFailed PM_MapSettingTooLong PM_MapSettingUnknown PM_MapSettingOfUnknown PM_MapBadRubric PM_MapUnknownOffsetBase PM_MapUnknownOffset PM_MapUnknownColour PM_MapNonLateral PM_MapToNonRoom PM_MapFromNonRoom MAPHINTS _ doc413 "25.18" "25.18. Improving the index map" -EPSMAP _ doc414 "25.19" "25.19. Producing an EPS format map" -EXTENSIONS _ doc428 "27.1" "27.1. The status of extensions" -SRULES _ doc429 "27.2" "27.2. The Standard Rules" -PM_ExtNoEndsHere PM_ExtNoBeginsHere PM_ExtMultipleEndsHere PM_ExtBeginsAfterEndsHere PM_ExtMultipleBeginsHere _ doc432 "27.5" "27.5. A simple example extension" -PM_ExtVersionTooLow phs_extcredits phs_compextcredits _ doc433 "27.6" "27.6. Version numbering" -PM_UnequalHeadingInPlaceOf PM_HeadingInPlaceOfUnknown PM_HeadingInPlaceOfUnincluded _ doc436 "27.9" "27.9. Extensions can interact with other extensions" -PM_ImplicationValueProperty PM_ImplicationCertain _ doc440 "27.13" "27.13. Implications" -PM_BadInlineTag PM_BadInlineExpansion PM_InlineRule PM_InlineTooLong PM_UnendingI6 _ doc442 "27.15" "27.15. Defining phrases in Inform 6" -PM_BadObjectTranslation _ doc448 "27.21" "27.21. Inform 6 objects and classes" -PM_QuantityTranslatedAlready PM_NonQuantityTranslated PM_NonPropertyTranslated PM_TranslatedToNonIdentifier PM_TranslatedUnknownCategory PM_TranslatedTwice PM_TranslatesActionAlready PM_TranslatesNonAction _ doc449 "27.22" "27.22. Inform 6 variables, properties, actions, and attributes" -PM_GrammarTranslatedAlready _ doc450 "27.23" "27.23. Inform 6 Understand tokens" -PM_UnicodeOutOfRange PM_UnicodeNonLiteral PM_UnicodeAlready _ doc452 "27.25" "27.25. Naming Unicode characters" -PM_IncludeInsteadOf PM_WhenDefiningUnknown PM_BeforeTheLibrary PM_BadI6Inclusion _ doc453 "27.26" "27.26. Overriding definitions in kits" -PM_LabelNamespaceTooLong _ doc456 "27.29" "27.29. Invocation labels, counters and storage" +PM_CantAssertQuantifier PM_CantAssertNonKind PM_CantAssertNegatedRelations PM_CantAssertNegatedEverywhere PM_CantAssertAdjective PM_TwoLikelihoods PM_NegatedVerb1 PM_NoSuchVerbComma PM_NoSuchVerb _ doc8 "2.1" "2.1. Creating the world" +PM_EnigmaticThey PM_EnigmaticPronoun PM_WordTooLong PM_TooMuchQuotedText PM_UnendingComment PM_UnendingQuote _ doc10 "2.3" "2.3. Punctuation" +PM_BadTitleSentence PM_HeadingStopsBeforeEndOfLine PM_HeadingOverLine HEADINGS _ doc12 "2.5" "2.5. Headings" +PM_UnknownInternalTest PM_TestDoubleWith PM_TestCommandTooLong PM_TestContainsUndo PM_TestBadRequirements PM_TestDuplicate PM_TestMultiWord _ doc15 "2.8" "2.8. The TEST command" +PM_BogusExtension _ doc17 "2.10" "2.10. Installing extensions" +PM_ExtMisidentifiedEnds PM_ExtInadequateVM PM_ExtMiswordedBeginsHere PM_ExtVersionMalformed PM_IncludeExtQuoted _ doc18 "2.11" "2.11. Including extensions" +OPTIONS PM_UnknownUseOption PM_UONotNumerical _ doc19 "2.12" "2.12. Use options" +OPTIONSFILE _ doc20 "2.13" "2.13. Administering classroom use" +STORYFILES PM_BadICLIdentifier _ doc21 "2.14" "2.14. Limits and the Settings panel" +PM_DescriptionsEquated PM_SameKindEquated MAP kind_room _ doc25 "3.2" "3.2. Rooms and the map" +PM_RegionRelation PM_RegionInTwoRegions PM_ExistingRegion REGIONS kind_region _ doc27 "3.4" "3.4. Regions and the index map" +PM_KindsIncompatible PM_MiseEnAbyme PM_CantContainAndSupport PM_BothRoomAndSupporter KINDS _ doc28 "3.5" "3.5. Kinds" +PM_PropertyNotPermitted _ doc30 "3.7" "3.7. Properties depend on kind" +PM_EverywhereMisapplied PM_CantChangeEverywhere PM_EverywhereNonBackdrop kind_backdrop _ doc32 "3.9" "3.9. Backdrops" +PM_TextWithoutSubject PM_TwoAppearances _ doc34 "3.11" "3.11. Two descriptions of things" +PM_BadMapCell PM_RoomMissingDoor PM_DoorInThirdRoom PM_DoorToNonRoom PM_DoorOverconnected PM_DoorUnconnected PM_BothWaysDoor kind_door ph_frontside ph_backside ph_othersideof ph_directionofdoor _ doc35 "3.12" "3.12. Doors" +kind_device _ doc37 "3.14" "3.14. Devices and descriptions" +kind_vehicle _ doc39 "3.16" "3.16. Vehicles and pushable things" +kind_person _ doc40 "3.17" "3.17. Men, women and animals" +kind_player's _ doc44 "3.21" "3.21. The player's holdall" +PM_RoomOrDoorAsPart PM_PartOfRoom _ doc46 "3.23" "3.23. Parts of things" +ph_locationof _ doc48 "3.25" "3.25. The location of something" +PM_NamelessDirection PM_DirectionTooLong PM_ImproperlyMadeDirection PM_TooManyDirections kind_direction _ doc49 "3.26" "3.26. Directions" +NEWKINDS _ doc50 "4.1" "4.1. New kinds" +PM_PluralIsQuoted PM_PluralOfQuoted _ doc53 "4.4" "4.4. Plural assertions" +KINDSVALUE _ doc54 "4.5" "4.5. Kinds of value" +PM_ValueCantHaveVProperties PM_ValueCantHaveProperties _ doc55 "4.6" "4.6. Properties again" +PM_ThisIsEitherOr PM_MiscellaneousEOProblem PM_NonObjectCanBe PM_QualifiedCanBe PM_EitherOrAsValue _ doc56 "4.7" "4.7. New either/or properties" +PM_RedundantThatVaries PM_BadProvides PM_PropertyKindClashes PM_PropertyKindVague PM_PropertyKindUnknown PM_PropertyTooSpecific PM_BadVisibilityWhen PM_PropertyUninitialisable PM_PropertyNameForbidden PM_PropertyCalledPresence PM_PropertyCalledArticle PM_PropertyOfKind1 _ doc57 "4.8" "4.8. New value properties" +PM_EitherOnThree _ doc59 "4.10" "4.10. Conditions of things" +ph_defaultvalue _ doc60 "4.11" "4.11. Default values of kinds" +PM_EmptyKind VARIABLES var_location _ doc61 "4.12" "4.12. Values that vary" +PM_TooManyDuplicates _ doc63 "4.14" "4.14. Duplicates" +PM_ComplexEvery PM_AssemblyRegress PM_AssemblyLoop _ doc64 "4.15" "4.15. Assemblies and body parts" +PM_TSWithPunctuation _ doc67 "5.1" "5.1. Text with substitutions" +phs_bracket phs_closebracket phs_apostrophe phs_quotemark _ doc68 "5.2" "5.2. How Inform reads quoted text" +ph_say phs_a phs_A phs_the phs_The _ doc69 "5.3" "5.3. Text which names things" +phs_numwords phs_s _ doc70 "5.4" "5.4. Text with numbers" +phs_listof phs_alistof phs_Alistof phs_thelistof phs_Thelistof phs_islistof phs_isalistof phs_isthelistof phs_alistofconts _ doc71 "5.5" "5.5. Text with lists" +PM_SayEndIfWithoutSayIf PM_SayOtherwiseWithoutIf PM_SayIfNested phs_if phs_unless phs_otherwise phs_endif phs_endunless phs_elseif phs_elseunless _ doc72 "5.6" "5.6. Text with variations" +PM_ComplicatedSayStructure3 PM_ComplicatedSayStructure4 PM_ComplicatedSayStructure5 PM_ComplicatedSayStructure2 PM_ComplicatedSayStructure phs_oneof phs_or phs_purelyrandom phs_thenpurelyrandom phs_random phs_thenrandom phs_sticky phs_decreasing phs_order phs_cycling phs_stopping phs_firsttime _ doc73 "5.7" "5.7. Text with random alternatives" +phs_linebreak phs_nolinebreak phs_runparaon phs_parabreak phs_condparabreak ph_breakpending phs_clarifbreak phs_runparaonsls _ doc74 "5.8" "5.8. Line breaks and paragraph breaks" +phs_bold phs_italic phs_roman phs_fixedspacing phs_varspacing _ doc75 "5.9" "5.9. Text with type styles" +PM_MidTextUnicode PM_SayUnicode _ doc77 "5.11" "5.11. Unicode characters" +ph_boxed _ doc78 "5.12" "5.12. Displaying quotations" +DESCRIPTIONS ph_numberof _ doc80 "6.1" "6.1. What are descriptions?" +PM_ArticleAsAdjective PM_AdjDomainUnknown PM_AdjDomainSurreal PM_AdjDomainSlippery PM_DefinitionWithoutCondition PM_DefinitionBadCondition _ doc83 "6.4" "6.4. Defining new adjectives" +PM_MultiwordGrading PM_GradingWrongKOV PM_GradingUnless PM_GradingUnknownProperty PM_GradingNonLiteral PM_GradingMisphrased PM_GradingCalled PM_ComparativeMisapplied _ doc86 "6.7" "6.7. Comparatives" +PM_OutOfPlay _ doc89 "6.10" "6.10. Existence and there" +ph_roomdirof ph_doordirof ph_roomordoor ph_bestroute ph_bestroutethrough ph_bestroutelength ph_bestroutethroughlength _ doc93 "6.14" "6.14. Adjacent rooms and routes through the map" +PM_ComplexDeterminer _ doc94 "6.15" "6.15. All, each and every" +PM_NonActionIn PM_APUnknown PM_APWithNoParticiple kind_actionname ACTIONS _ doc96 "7.1" "7.1. Actions" +rules_instead _ doc97 "7.2" "7.2. Instead rules" +rules_before ph_stopaction ph_continueaction _ doc98 "7.3" "7.3. Before rules" +PM_ActionTooSpecific PM_ActionNotSpecific PM_UnknownTryAction2 PM_UnknownTryAction1 ph_try ph_trysilently _ doc99 "7.4" "7.4. Try and try silently" +rules_after _ doc100 "7.5" "7.5. After rules" +PM_APWithImmiscible PM_APWithDisjunction _ doc103 "7.8" "7.8. Rules applying to more than one action" +var_noun _ doc105 "7.10" "7.10. The noun and the second noun" +PM_APWithBadWhen PM_NonActionInPresenceOf _ doc107 "7.12" "7.12. In the presence of, and when" +PM_GoingWithoutObject PM_GoingWrongKind _ doc109 "7.14" "7.14. Going by, going through, going with" +KACTIONS PM_NamedAPWithActor _ doc110 "7.15" "7.15. Kinds of action" +var_prompt _ doc115 "8.2" "8.2. Changing the command prompt" +var_sl phs_surroundings _ doc116 "8.3" "8.3. Changing the status line" +ph_changeexit ph_changenoexit _ doc118 "8.5" "8.5. Change of properties with values" +ph_move _ doc120 "8.7" "8.7. Moving things" +ph_movebackdrop ph_updatebackdrop _ doc121 "8.8" "8.8. Moving backdrops" +ph_remove _ doc123 "8.10" "8.10. Removing things from play" +PM_RedefinedNow PM_CantChangeKind PM_CantForceCalling PM_CantForceGeneralised PM_CantForceExistence PM_CantForceRelation PM_BadNow3 PM_BadNow2 PM_BadNow1 ph_now _ doc124 "8.11" "8.11. Now..." +ph_increase ph_decrease ph_increment ph_decrement _ doc125 "8.12" "8.12. Increasing and decreasing" +PM_CalledWithDash PM_CalledThe _ doc128 "8.15" "8.15. Calling names" +ph_holder ph_firstheld ph_nextheld _ doc130 "8.17" "8.17. Looking at containment by hand" +ph_randombetween ph_randomchance ph_seed _ doc131 "8.18" "8.18. Randomness" +PM_RandomImpossible ph_randomdesc _ doc132 "8.19" "8.19. Random choices of things" +rules_wpb ROOMPLAYBEGINS _ doc133 "9.1" "9.1. When play begins" +var_score _ doc134 "9.2" "9.2. Awarding points" +rules_wpe ph_end ph_endfinally ph_endsaying ph_endfinallysaying ph_ended ph_notended ph_finallyended ph_notfinallyended ph_resume _ doc136 "9.4" "9.4. When play ends" +PM_NumberOfTurns rules_et _ doc137 "9.5" "9.5. Every turn" +var_time kind_time _ doc138 "9.6" "9.6. The time of day" +phs_timewords _ doc139 "9.7" "9.7. Telling the time" +ph_durationmins ph_durationhours _ doc140 "9.8" "9.8. Approximate times, lengths of time" +ph_shiftbefore ph_shiftafter ph_timebefore ph_timeafter _ doc141 "9.9" "9.9. Comparing and shifting times" +ph_minspart ph_hourspart _ doc142 "9.10" "9.10. Calculating times" +TIMEDEVENTS PM_UnusedTimedEvent PM_AtWithoutTime ph_timefromnow ph_turnsfromnow ph_attime _ doc143 "9.11" "9.11. Future events" +PM_PTAPTooComplex _ doc144 "9.12" "9.12. Actions as conditions" +PM_PastTableEntries PM_NonPresentTense PM_PastActionCalled PM_PastCallings PM_PastTableLookup PM_PTAPMakesCallings PM_PastSubordinate _ doc145 "9.13" "9.13. The past and perfect tenses" +kind_scene SCENESINTRO _ doc148 "10.1" "10.1. Introduction to scenes" +PM_ScenesBadCondition PM_ScenesOversetEnd PM_ScenesUnknownEnd PM_ScenesOnly PM_ScenesDisallowCalled PM_ScenesNotPlay _ doc149 "10.2" "10.2. Creating a scene" +ph_scenetimesincebegan ph_scenetimesinceended ph_scenetimewhenbegan ph_scenetimewhenended _ doc150 "10.3" "10.3. Using the Scene index" +ph_hashappened ph_hasnothappened ph_hasended ph_hasnotended _ doc151 "10.4" "10.4. During scenes" +LINKINGSCENES _ doc152 "10.5" "10.5. Linking scenes together" +PHRASES ph_nothing _ doc157 "11.1" "11.1. What are phrases?" +PM_BareTo _ doc158 "11.2" "11.2. The phrasebook" +PM_SaySlashed PM_AdjacentTokens PM_PhraseTooLong PM_TokenMisunderstood PM_BadTypeIndication PM_TokenWithNestedBrackets PM_TokenWithEmptyBrackets PM_TokenWithoutCloseBracket PM_TokenWithoutOpenBracket _ doc159 "11.3" "11.3. Pattern matching" +ph_showme _ doc160 "11.4" "11.4. The showme phrase" +PM_TruthStateToDecide kind_truthstate ph_indarkness ph_consents ph_whether _ doc161 "11.5" "11.5. Conditions and questions" +PM_IfOutsidePhrase ph_if ph_unless _ doc162 "11.6" "11.6. If" +PM_EmptyIndentedBlock PM_RunOnsInTabbedRoutine PM_MisalignedIndentation PM_NotInOldSyntax PM_BothBlockSyntaxes PM_CantUseOutsideStructure PM_WrongEnd PM_EndWithoutBegin PM_BlockNestingTooDeep PM_BeginWithoutEnd _ doc163 "11.7" "11.7. Begin and end" +PM_OtherwiseInNonIf PM_OtherwiseWithoutIf PM_CaseValueMismatch PM_CaseValueNonConstant PM_OtherwiseIfAfterOtherwise PM_DoubleOtherwise PM_MisarrangedOtherwise PM_MisalignedCase PM_MisalignedOtherwise PM_NonCaseInIf ph_otherwise ph_switch _ doc164 "11.8" "11.8. Otherwise" +ph_while _ doc165 "11.9" "11.9. While" +PM_CalledInRepeat ph_repeat _ doc166 "11.10" "11.10. Repeat" +PM_BadRepeatDomain ph_runthrough _ doc167 "11.11" "11.11. Repeat running through" +PM_CantUseOutsideLoop ph_next ph_break _ doc168 "11.12" "11.12. Next and break" +ph_stop _ doc169 "11.13" "11.13. Stop" +PM_SayWithPhraseOptions PM_NotTheOnlyPhraseOption PM_NotAPhraseOption PM_PhraseOptionsExclusive PM_TooManyPhraseOptions ph_listcontents _ doc170 "11.14" "11.14. Phrase options" +ph_let ph_letdefault _ doc171 "11.15" "11.15. Let and temporary variables" +ph_yes ph_no _ doc172 "11.16" "11.16. New conditions, new adjectives" +PM_RedundantReturnKOV PM_UnknownValueToDecide PM_ReturnWrongKind ph_decideon _ doc173 "11.17" "11.17. Phrases to decide other things" +ph_enumfirst ph_enumlast ph_enumafter ph_enumbefore _ doc174 "11.18" "11.18. The value after and the value before" +ARSUMMARY _ doc176 "12.2" "12.2. How actions are processed" +var_person_asked _ doc177 "12.3" "12.3. Giving instructions to other people" +rules_per _ doc178 "12.4" "12.4. Persuasion" +rules_fail var_reason _ doc179 "12.5" "12.5. Unsuccessful attempts" +PM_ActionMisapplied PM_ActionClauseUnknown PM_ActionBothValues PM_ActionAlreadyExists PM_GrammarMismatchesAction PM_MultiwordPastParticiple PM_MatchedAsTooLong NEWACTIONS ph_requirestouch ph_requirestouch2 ph_requirescarried ph_requirescarried2 ph_requireslight _ doc181 "12.7" "12.7. New actions" +PM_BadMatchingSyntax PM_ActionVarValue PM_ActionVarUnknownKOV PM_ActionVarOverspecific PM_ActionVarAnd PM_ActionVarsPastTense _ doc184 "12.10" "12.10. Action variables" +PM_RuleWithComma PM_DuplicateRuleName _ doc186 "12.12" "12.12. Check rules for actions by other people" +OUTOFWORLD _ doc189 "12.15" "12.15. Out of world actions" +rules_ri _ doc190 "12.16" "12.16. Reaching inside and reaching outside rules" +var_person_reaching _ doc192 "12.18" "12.18. Changing reachability" +visibility _ doc193 "12.19" "12.19. Changing visibility" +kind_storedaction ph_currentaction ph_actionpart ph_nounpart ph_secondpart ph_actorpart ph_involves ph_actionof _ doc194 "12.20" "12.20. Stored actions" +PM_KindRelatedToValue PM_EveryWrongSide PM_BadRelation PM_RelationWithEitherOrProperty PM_RelationWithBadProperty PM_PropForBadKOV VERBS _ doc196 "13.1" "13.1. Sentence verbs" +RELATIONS _ doc198 "13.3" "13.3. What are relations?" +PM_BadKOVForRelationProperty PM_RelatedKindsUnknown PM_OneToOneMiscalled PM_CantCallBoth PM_CantCallRight PM_CantCallLeft PM_BothOneAndMany PM_OneOrVariousWithWhen PM_FRFUnavailable PM_RelationExists _ doc200 "13.5" "13.5. Making new relations" +ph_showrelation _ doc202 "13.7" "13.7. Relations in groups" +PM_PrepositionLong PM_PrepositionConjugated PM_DuplicateVerbs1 PM_VerbMalformed PM_PresentPluralTwice PM_VerbRelationUnknown PM_VerbUnknownMeaning PM_VerbRelationVague _ doc204 "13.9" "13.9. Defining new assertion verbs" +ph_nextstep ph_numbersteps _ doc206 "13.11" "13.11. Indirect relations" +PM_BadRelationCondition PM_Unassertable2 _ doc207 "13.12" "13.12. Relations which express conditions" +ph_ifleft ph_ifright ph_rightlookup ph_leftlookup ph_leftlookuplist ph_rightlookuplist ph_leftdomain ph_rightdomain _ doc208 "13.13" "13.13. Relations involving values" +ph_letrelation _ doc210 "13.15" "13.15. Temporary relations" +phs_here phs_now _ doc212 "14.1" "14.1. Tense and narrative viewpoint" +kind_verb phs_adapt phs_adaptv phs_adaptt phs_adaptvt phs_negate phs_negatev phs_negatet phs_negatevt phs_infinitive phs_pastpart phs_prespart _ doc220 "14.9" "14.9. Verbs as values" +phs_response _ doc221 "14.10" "14.10. Responses" +PM_LiteralOverflow PM_ElementOverflow PM_ZMachineOverflow PM_EvenOverflow-G PM_CantEquateValues PM_InequalityFailed kind_real_number kind_number _ doc225 "15.2" "15.2. Numbers and real numbers" +ph_nearestwholenumber _ doc226 "15.3" "15.3. Real number conversions" +phs_realplaces phs_decimal phs_decimalplaces phs_scientific phs_scientificplaces _ doc227 "15.4" "15.4. Printing real numbers" +ph_plus ph_minus ph_times ph_divide ph_remainder ph_nearest ph_squareroot ph_realsquareroot ph_cuberoot _ doc228 "15.5" "15.5. Arithmetic" +ph_ceiling ph_floor ph_absolutevalue ph_reciprocal ph_power ph_exp ph_logarithmto ph_logarithm _ doc229 "15.6" "15.6. Powers and logarithms" +ph_degrees ph_sine ph_cosine ph_tangent ph_arcsine ph_arccosine ph_arctangent ph_hyperbolicsine ph_hyperboliccosine ph_hyperbolictangent ph_hyperbolicarcsine ph_hyperbolicarccosine ph_hyperbolicarctangent _ doc230 "15.7" "15.7. Trigonometry" +PM_NegationForbidden PM_NegationInternal PM_LPEnumeration PM_LPBuiltInKOV PM_LPNotKOV _ doc231 "15.8" "15.8. Units" +PM_DuplicateUnitSpec _ doc232 "15.9" "15.9. Multiple notations" +PM_LPTooLittleAccuracy PM_LPCantScaleTwice PM_LPCantScaleYet _ doc233 "15.10" "15.10. Scaling and equivalents" +PM_LPNotAllNamed PM_LPTooComplicated PM_LPTooManyElements PM_LPElementTooLarge PM_LPWithoutElement _ doc237 "15.14" "15.14. Notations including more than one number" +PM_BadLPNameOption PM_BadLPPartOption PM_LPMultipleOptional PM_LPFirstOptional _ doc238 "15.15" "15.15. The parts of a number specification" +PM_TotalTableColumn PM_TotalEitherOr ph_total _ doc240 "15.17" "15.17. Totals" +PM_EquationSymbolWrongKOV PM_EquationSymbolMissing PM_EquationInsoluble PM_EquationBadTarget PM_EquationBadArithmetic PM_EquationDimensionPower PM_EquationIncomparable PM_EquationEquatesMultiply PM_EquationEquatesBadly PM_EquationDoesntEquate PM_EquationMispunctuated PM_EquationTooComplex PM_EquationOperatorUnrecognised PM_EquationLeadingZero PM_EquationTokenUnrecognised PM_EquationSymbolSpurious PM_EquationSymbolBadSub PM_EquationSymbolNonNumeric PM_EquationSymbolEqualsKOV PM_EquationSymbolNonValue PM_EquationSymbolVague PM_EquationSymbolMalformed PM_EquationSymbolMisdeclared PM_EquationMisnamed PM_EquationMisnumbered EQUATIONS ph_letequation _ doc241 "15.18" "15.18. Equations" +ARITHMETIC PM_BadArithmetic PM_MultiplyingNonKOVs PM_BadLPOffset PM_BadLPEquivalent PM_DimensionsInconsistent PM_UnitSequenceOverflow PM_NonDimensional PM_DimensionNotBaseKOV PM_DimensionRedundant _ doc243 "15.20" "15.20. Multiplication of units" +PM_TableRowFull PM_TableColumnBrackets PM_TableKindlessColumn PM_TableEntryGeneric PM_TableWithBlankNames PM_TableDefiningObject PM_TableOfExistingKind PM_TableOfBuiltInKind PM_TableOfQuantifiedKind PM_TableUndefined PM_TableWithoutRows PM_TableColumnAlready PM_TableColumnArticle PM_TableTooManyColumns PM_TableNameAmbiguous PM_TableNameDuplicate PM_TableMisnamed PM_TableIncompatibleEntry PM_TableUnknownEntry PM_TableDescriptionEntry PM_TableVariableEntry PM_TablePlayerEntry PM_TableColumnEmptyLists PM_TableCoincidesWithKind TABLES _ doc244 "16.1" "16.1. Laying out tables" +ph_numrows _ doc245 "16.2" "16.2. Looking up entries" +ph_showmetable phs_currenttablerow phs_tablerow phs_tablecolumn _ doc247 "16.4" "16.4. Changing entries" +PM_NoRowSelected ph_chooserow ph_chooserowwith ph_chooserandomrow _ doc248 "16.5" "16.5. Choosing rows" +ph_repeattable ph_repeattablereverse ph_repeattablecol ph_repeattablecolreverse _ doc249 "16.6" "16.6. Repeating through tables" +ph_thereis ph_thereisno _ doc250 "16.7" "16.7. Blank entries" +ph_chooseblankrow ph_numblank ph_numfilled ph_blankout ph_blankoutrow ph_blankoutcol ph_blankouttable _ doc253 "16.10" "16.10. Adding and removing rows" +ph_sortrandom ph_sortcolumn ph_sortcolumnreverse _ doc254 "16.11" "16.11. Sorting" +kind_tablename _ doc258 "16.15" "16.15. Varying which table to look at" +PM_TableDefiningTheImpossible PM_TableDefiningNothing _ doc259 "16.16" "16.16. Defining things with tables" +PM_TableNotContinuation _ doc261 "16.18" "16.18. Table continuations" +PM_TableAmendmentMismatch PM_TableAmendmentMisfit _ doc262 "16.19" "16.19. Table amendments" +UNDERSTANDING someone_token PM_TextTokenRestricted PM_OverComplexToken PM_BizarreToken PM_UnknownToken PM_UnparsableKind PM_UseThingNotObject PM_UseTextNotTopic PM_ObsoleteHeldTokens PM_UnderstandAsCompoundText PM_UnderstandCommaCommand PM_UnderstandEmptyText PM_LiteralPunctuation PM_UnderstandVague PM_UnderstandAsBadValue PM_UnderstandAsActivity PM_TextlessMistake PM_UnderstandMismatch PM_NontextualUnderstand PM_NotOldCommand PM_NotNewCommand PM_UnderstandCommandWhen PM_OldVerbUsage _ doc263 "17.1" "17.1. Understand" +PM_GrammarIllFounded PM_TooManyGrammarLines PM_TooManyAliases PM_ThreeValuedLine _ doc264 "17.2" "17.2. New commands for old grammar" +TOKENS things_token _ doc266 "17.4" "17.4. Standard tokens of grammar" +text_token _ doc267 "17.5" "17.5. The text token" +var_understood _ doc271 "17.9" "17.9. Understanding kinds of value" +PM_UnderstandPluralValue PM_UnderstandAsQualified _ doc273 "17.11" "17.11. Understanding values" +PM_SlashedCommand PM_OverAmbitiousSlash _ doc274 "17.12" "17.12. This/that" +NEWTOKENS PM_TwoValuedToken PM_MixedOutcome _ doc275 "17.13" "17.13. New tokens" +PM_UnknownUnpermittedProperty PM_BadReferringProperty PM_BadUnderstandPropertyAs PM_BadUnderstandProperty PM_UnknownUnderstandProperty _ doc277 "17.15" "17.15. Understanding things by their properties" +PM_GrammarValueRelation PM_GrammarBadRelation PM_GrammarObjectlessRelation _ doc278 "17.16" "17.16. Understanding things by their relations" +PM_BadWhen _ doc279 "17.17" "17.17. Context: understanding when" +ph_setpronouns _ doc280 "17.18" "17.18. Changing the meaning of pronouns" +rules_dtpm _ doc281 "17.19" "17.19. Does the player mean..." +ph_multipleobjectlist ph_altermultipleobjectlist _ doc282 "17.20" "17.20. Multiple action processing" +PM_BadActivityName kind_activity ACTIVITIES _ doc285 "18.1" "18.1. What are activities?" +PM_BadWhenWhile _ doc288 "18.4" "18.4. While clauses" +EXTACTIVITIES ph_carryout ph_carryoutwith ph_continueactivity _ doc289 "18.5" "18.5. New activities" +PM_ActivityVarValue PM_ActivityVarUnknownKOV PM_ActivityVarOverspecific PM_ActivityVarAnd PM_ActivityVariableNameless _ doc290 "18.6" "18.6. Activity variables" +ph_beginactivity ph_beginactivitywith ph_endactivity ph_endactivitywith ph_handlingactivity ph_handlingactivitywith ph_abandonactivity ph_abandonactivitywith _ doc291 "18.7" "18.7. Beginning and ending activities manually" +var_particular act_con _ doc293 "18.9" "18.9. Deciding the concealed possessions of something" +act_pn ph_omit _ doc294 "18.10" "18.10. Printing the name of something" +act_ppn _ doc295 "18.11" "18.11. Printing the plural name of something" +act_pan _ doc296 "18.12" "18.12. Printing a number of something" +act_lc ph_group ph_groupart ph_grouptext _ doc297 "18.13" "18.13. Listing contents of something" +act_gt _ doc298 "18.14" "18.14. Grouping together something" +act_resp _ doc299 "18.15" "18.15. Issuing the response text of something" +act_details _ doc300 "18.16" "18.16. Printing room description details of something" +act_idetails _ doc301 "18.17" "18.17. Printing inventory details of something" +act_toodark _ doc302 "18.18" "18.18. Printing a refusal to act in the dark" +act_nowdark _ doc303 "18.19" "18.19. Printing the announcement of darkness" +act_nowlight _ doc304 "18.20" "18.20. Printing the announcement of light" +act_darkname _ doc305 "18.21" "18.21. Printing the name of a dark room" +act_darkdesc _ doc306 "18.22" "18.22. Printing the description of a dark room" +act_csl _ doc307 "18.23" "18.23. Constructing the status line" +act_wpa _ doc308 "18.24" "18.24. Writing a paragraph about" +act_lni _ doc309 "18.25" "18.25. Listing nondescript items of something" +act_pld _ doc310 "18.26" "18.26. Printing the locale description of something" +act_cnlo _ doc311 "18.27" "18.27. Choosing notable locale objects for something" +act_plp _ doc312 "18.28" "18.28. Printing a locale paragraph about" +act_ds ph_placeinscope ph_placecontentsinscope _ doc313 "18.29" "18.29. Deciding the scope of something" +act_clarify _ doc314 "18.30" "18.30. Clarifying the parser's choice of something" +act_which _ doc315 "18.31" "18.31. Asking which do you mean" +act_smn _ doc316 "18.32" "18.32. Supplying a missing noun/second noun" +kind_snippet var_command act_reading ph_snippetmatches ph_snippetdoesnotmatch ph_snippetincludes ph_snippetdoesnotinclude ph_rejectcommand ph_replacesnippet ph_cutsnippet ph_changecommand _ doc317 "18.33" "18.33. Reading a command" +act_implicitly _ doc318 "18.34" "18.34. Implicitly taking something" +act_parsererror _ doc319 "18.35" "18.35. Printing a parser error" +act_all _ doc320 "18.36" "18.36. Deciding whether all includes" +act_banner phs_banner _ doc321 "18.37" "18.37. Printing the banner text" +act_obit _ doc322 "18.38" "18.38. Printing the player's obituary" +act_amuse _ doc323 "18.39" "18.39. Amusing a victorious player" +act_startvm _ doc324 "18.40" "18.40. Starting the virtual machine" +PM_RulebookWithTo PM_RulebookWithDefinition PM_RulebookWithAt RULEBOOKS kind_rulebook kind_rule _ doc325 "19.1" "19.1. On rules" +PM_RuleWithoutColon PM_RuleWithDefiniteArticle PM_BadRulePreamble PM_BadRulePreambleWhen _ doc327 "19.3" "19.3. New rules" +PM_PlaceWithMissingRule PM_NoSuchRuleExists PM_UnspecifiedRulebookPlacement PM_BadRulePlacementNegation PM_ImproperRulePlacement RLISTING _ doc328 "19.4" "19.4. Listing rules explicitly" +rules_proc _ doc329 "19.5" "19.5. Changing the behaviour of rules" +NEWRULEBOOKS ph_follow _ doc332 "19.8" "19.8. New rulebooks" +ph_followfor _ doc333 "19.9" "19.9. Basis of a rulebook" +PM_RulebookVariableVague PM_RulebookVariableBadKind PM_RulebookVariableTooSpecific PM_RulebookVariableAnd _ doc334 "19.10" "19.10. Rulebook variables" +PM_BadDefaultOutcome PM_DefaultOutcomeTwice ph_succeeds ph_fails ph_nodecision ph_succeeded ph_failed _ doc335 "19.11" "19.11. Success and failure" +PM_NonOutcomeProperty PM_DuplicateOutcome PM_DefaultOutcomeAlready PM_DefaultNamedOutcomeTwice PM_BadOutcomeClarification PM_WrongEndToPhrase PM_MisplacedRulebookOutcome ph_rulebookoutcome _ doc336 "19.12" "19.12. Named outcomes" +ph_succeedswith ph_producedby ph_producedbyfor _ doc337 "19.13" "19.13. Rulebooks producing values" +ph_abide ph_abidefor ph_abideanon _ doc338 "19.14" "19.14. Abide by" +rules_internal _ doc339 "19.15" "19.15. Two rulebooks used internally" +ph_charnum ph_numchars ph_wordnum ph_numwords ph_pwordnum ph_numpwords ph_upwordnum ph_numupwords ph_linenum ph_numlines ph_paranum ph_numparas _ doc343 "20.3" "20.3. Characters, words, punctuated words, unpunctuated words, lines, paragraphs" +ph_inlower ph_inupper ph_lowercase ph_uppercase ph_titlecase ph_sentencecase _ doc344 "20.4" "20.4. Upper and lower case letters" +ph_matches ph_exactlymatches ph_nummatches _ doc345 "20.5" "20.5. Matching and exactly matching" +ph_matchesre ph_exactlymatchesre ph_nummatchesre ph_matchtext ph_subexpressiontext _ doc346 "20.6" "20.6. Regular expression matching" +ph_subform _ doc347 "20.7" "20.7. Making new text with text substitutions" +ph_replacechar ph_replaceword ph_replacepword ph_replaceupword ph_replaceline ph_replacepara ph_replace ph_replacewordin ph_replacepwordin ph_replacere _ doc348 "20.8" "20.8. Replacements" +kind_listof _ doc350 "21.1" "21.1. Lists and entries" +PM_IncompatibleConstantListEntry PM_NonconstantConstantListEntry PM_BadConstantListEntry PM_CantLetEmptyList _ doc351 "21.2" "21.2. Constant lists" +phs_listbraced phs_listdef phs_listindef _ doc352 "21.3" "21.3. Saying lists of values" +ph_islistedin ph_isnotlistedin ph_repeatlist _ doc353 "21.4" "21.4. Testing and iterating over lists" +ph_addtolist ph_addlisttolist ph_addatentry ph_addlistatentry ph_remfromlist ph_remlistfromlist ph_rementry ph_rementries _ doc354 "21.5" "21.5. Building lists" +ph_listofdesc _ doc355 "21.6" "21.6. Lists of objects" +ph_reverselist ph_sortlist ph_sortlistreverse ph_sortlistrandom ph_sortlistproperty ph_sortlistpropertyreverse ph_rotatelist ph_rotatelistback _ doc357 "21.8" "21.8. Sorting, reversing and rotating lists" +ph_numberentries _ doc358 "21.9" "21.9. Accessing entries in a list" +ph_changelength ph_truncate ph_truncatefirst ph_truncatelast ph_extend _ doc359 "21.10" "21.10. Lengthening or shortening a list" +kind_description ph_valuematch _ doc362 "22.2" "22.2. Descriptions as values" +ph_applied0 ph_applied1 ph_applied2 ph_applied3 ph_apply0 ph_apply1 ph_apply2 ph_apply3 _ doc363 "22.3" "22.3. Phrases as values" +ph_appliedlist ph_filter ph_reduction _ doc365 "22.5" "22.5. Map, filter and reduce" +PM_UnknownVirtualMachine _ doc373 "23.3" "23.3. Virtual machines and story file formats" +FIGURES kind_figurename _ doc374 "23.4" "23.4. Gathering the figures" +PM_PictureNotTextual PM_PictureDuplicate _ doc375 "23.5" "23.5. Declaring and previewing the figures" +ph_displayfigure _ doc376 "23.6" "23.6. Displaying the figures" +SOUNDS kind_soundname _ doc377 "23.7" "23.7. Recorded sounds" +PM_SoundNotTextual PM_SoundDuplicate ph_playsf _ doc378 "23.8" "23.8. Declaring and playing back sounds" +ph_figureid ph_soundid _ doc380 "23.10" "23.10. Some technicalities about figures and sounds" +EFILES _ doc381 "23.11" "23.11. Files" +PM_FilenameUnsafe PM_FilenameNotTextual PM_FilenameDuplicate PM_BadFileOwner PM_BadFileIFID kind_externalfile _ doc382 "23.12" "23.12. Declaring files" +ph_writetable ph_readtable ph_fileexists _ doc383 "23.13" "23.13. Writing and reading tables to external files" +ph_writetext ph_appendtext ph_saytext _ doc384 "23.14" "23.14. Writing, reading and appending text to files" +ph_fileready ph_markfileready ph_markfilenotready _ doc385 "23.15" "23.15. Exchanging files with other programs" +PM_BadEpisode _ doc395 "25.2" "25.2. Bibliographic data" +LCARDS _ doc397 "25.4" "25.4. The Library Card" +IFIDS _ doc398 "25.5" "25.5. The Treaty of Babel and the IFID" +release_files PM_NoSuchPublicRelease _ doc399 "25.6" "25.6. The Release button and the Materials folder" +PM_ReleaseAlong _ doc400 "25.7" "25.7. The Joy of Feelies" +release_cover _ doc401 "25.8" "25.8. Cover art" +release_postcard release_booklet _ doc402 "25.9" "25.9. An introductory booklet and postcard" +release_website _ doc403 "25.10" "25.10. A website" +release_interpreter _ doc404 "25.11" "25.11. A playable web page" +PM_RoomInIgnoredSource _ doc408 "25.15" "25.15. Republishing existing works of IF" +release_solution _ doc409 "25.16" "25.16. Walkthrough solutions" +release_card release_source _ doc410 "25.17" "25.17. Releasing the source text" +PM_MapPlacementDirection PM_MapPlacement PM_MapDirectionClue PM_MapHintUnknown PM_MapSettingTypeFailed PM_MapSettingTooLong PM_MapSettingUnknown PM_MapSettingOfUnknown PM_MapBadRubric PM_MapUnknownOffsetBase PM_MapUnknownOffset PM_MapUnknownColour PM_MapNonLateral PM_MapToNonRoom PM_MapFromNonRoom MAPHINTS _ doc411 "25.18" "25.18. Improving the index map" +EPSMAP _ doc412 "25.19" "25.19. Producing an EPS format map" +EXTENSIONS _ doc426 "27.1" "27.1. The status of extensions" +SRULES _ doc427 "27.2" "27.2. The Standard Rules" +PM_ExtNoEndsHere PM_ExtNoBeginsHere PM_ExtMultipleEndsHere PM_ExtBeginsAfterEndsHere PM_ExtMultipleBeginsHere _ doc430 "27.5" "27.5. A simple example extension" +PM_ExtVersionTooLow phs_extcredits phs_compextcredits _ doc431 "27.6" "27.6. Version numbering" +PM_UnequalHeadingInPlaceOf PM_HeadingInPlaceOfUnknown PM_HeadingInPlaceOfUnincluded _ doc434 "27.9" "27.9. Extensions can interact with other extensions" +PM_ImplicationValueProperty PM_ImplicationCertain _ doc438 "27.13" "27.13. Implications" +PM_BadInlineTag PM_BadInlineExpansion PM_InlineRule PM_InlineTooLong PM_UnendingI6 _ doc440 "27.15" "27.15. Defining phrases in Inform 6" +PM_BadObjectTranslation _ doc446 "27.21" "27.21. Inform 6 objects and classes" +PM_QuantityTranslatedAlready PM_NonQuantityTranslated PM_NonPropertyTranslated PM_TranslatedToNonIdentifier PM_TranslatedUnknownCategory PM_TranslatedTwice PM_TranslatesActionAlready PM_TranslatesNonAction _ doc447 "27.22" "27.22. Inform 6 variables, properties, actions, and attributes" +PM_GrammarTranslatedAlready _ doc448 "27.23" "27.23. Inform 6 Understand tokens" +PM_UnicodeOutOfRange PM_UnicodeNonLiteral PM_UnicodeAlready _ doc450 "27.25" "27.25. Naming Unicode characters" +PM_IncludeInsteadOf PM_WhenDefiningUnknown PM_BeforeTheLibrary PM_BadI6Inclusion _ doc451 "27.26" "27.26. Overriding definitions in kits" +PM_LabelNamespaceTooLong _ doc454 "27.29" "27.29. Invocation labels, counters and storage" diff --git a/inform/StagingArea/Contents/Resources/Internal/Inter/BasicInformExtrasKit/kit_metadata.json b/inform/StagingArea/Contents/Resources/Internal/Inter/BasicInformExtrasKit/kit_metadata.json index 631ff5cb..adc01476 100644 --- a/inform/StagingArea/Contents/Resources/Internal/Inter/BasicInformExtrasKit/kit_metadata.json +++ b/inform/StagingArea/Contents/Resources/Internal/Inter/BasicInformExtrasKit/kit_metadata.json @@ -2,7 +2,7 @@ "is": { "type": "kit", "title": "BasicInformExtrasKit", - "version": "10.1.0-beta+6V20" + "version": "10.1.0" }, "kit-details": { "has-priority": 1 diff --git a/inform/StagingArea/Contents/Resources/Internal/Inter/BasicInformKit/kit_metadata.json b/inform/StagingArea/Contents/Resources/Internal/Inter/BasicInformKit/kit_metadata.json index b15ee7fd..4c04808b 100644 --- a/inform/StagingArea/Contents/Resources/Internal/Inter/BasicInformKit/kit_metadata.json +++ b/inform/StagingArea/Contents/Resources/Internal/Inter/BasicInformKit/kit_metadata.json @@ -2,7 +2,7 @@ "is": { "type": "kit", "title": "BasicInformKit", - "version": "10.1.0-beta+6V20" + "version": "10.1.0" }, "needs": [ { "unless": { diff --git a/inform/StagingArea/Contents/Resources/Internal/Inter/CommandParserKit/kit_metadata.json b/inform/StagingArea/Contents/Resources/Internal/Inter/CommandParserKit/kit_metadata.json index 025c0ae6..f2610f75 100644 --- a/inform/StagingArea/Contents/Resources/Internal/Inter/CommandParserKit/kit_metadata.json +++ b/inform/StagingArea/Contents/Resources/Internal/Inter/CommandParserKit/kit_metadata.json @@ -2,7 +2,7 @@ "is": { "type": "kit", "title": "CommandParserKit", - "version": "10.1.0-beta+6V20" + "version": "10.1.0" }, "needs": [ { "need": { diff --git a/inform/StagingArea/Contents/Resources/Internal/Inter/EnglishLanguageKit/kit_metadata.json b/inform/StagingArea/Contents/Resources/Internal/Inter/EnglishLanguageKit/kit_metadata.json index ef03b37b..fd6437f8 100644 --- a/inform/StagingArea/Contents/Resources/Internal/Inter/EnglishLanguageKit/kit_metadata.json +++ b/inform/StagingArea/Contents/Resources/Internal/Inter/EnglishLanguageKit/kit_metadata.json @@ -2,7 +2,7 @@ "is": { "type": "kit", "title": "EnglishLanguageKit", - "version": "10.1.0-beta+6V20" + "version": "10.1.0" }, "needs": [ { "need": { diff --git a/inform/StagingArea/Contents/Resources/Internal/Inter/WorldModelKit/kit_metadata.json b/inform/StagingArea/Contents/Resources/Internal/Inter/WorldModelKit/kit_metadata.json index 695298a7..3676221f 100644 --- a/inform/StagingArea/Contents/Resources/Internal/Inter/WorldModelKit/kit_metadata.json +++ b/inform/StagingArea/Contents/Resources/Internal/Inter/WorldModelKit/kit_metadata.json @@ -2,7 +2,7 @@ "is": { "type": "kit", "title": "WorldModelKit", - "version": "10.1.0-beta+6V20" + "version": "10.1.0" }, "needs": [ { "need": { diff --git a/inform/StagingArea/Contents/Resources/Internal/Languages/English/Syntax.preform b/inform/StagingArea/Contents/Resources/Internal/Languages/English/Syntax.preform index cc4508ef..22e20349 100644 --- a/inform/StagingArea/Contents/Resources/Internal/Languages/English/Syntax.preform +++ b/inform/StagingArea/Contents/Resources/Internal/Languages/English/Syntax.preform @@ -4316,10 +4316,10 @@ language English ::= entry | - in row of | + in row in/of/from | listed in | - corresponding to of in | - of in + corresponding to of in/from | + of in/from ::= | diff --git a/inform/StagingArea/Contents/Resources/Internal/Miscellany/definitions.html b/inform/StagingArea/Contents/Resources/Internal/Miscellany/definitions.html index 58f4d2f3..563351be 100644 --- a/inform/StagingArea/Contents/Resources/Internal/Miscellany/definitions.html +++ b/inform/StagingArea/Contents/Resources/Internal/Miscellany/definitions.html @@ -1,8 +1,8 @@ *=ph_frontside=*

This phrase produces the first of the one or two rooms containing a door - first in the order given in the source text. Example: if

- -

The red rock stair is east of the Orchard and above the Undertomb. + +

The red rock stair is east of the Orchard and above the Undertomb.

@@ -11,8 +11,8 @@ *=ph_backside=*

This phrase produces the last of the one or two rooms containing a door - last in the order given in the source text. Example: if

- -

The red rock stair is east of the Orchard and above the Undertomb. + +

The red rock stair is east of the Orchard and above the Undertomb.

@@ -21,8 +21,8 @@ *=ph_othersideof=*

This phrase produces the room on the other side of the door, as seen from the given vantage point, which needs to be one of its sides. Example: if

- -

The red rock stair is east of the Orchard and above the Undertomb. + +

The red rock stair is east of the Orchard and above the Undertomb.

@@ -31,8 +31,8 @@ *=ph_directionofdoor=*

This phrase produces the direction in which the door leads, as seen from the given vantage point, which needs to be one of its sides. Example: if

- -

The red rock stair is east of the Orchard and above the Undertomb. + +

The red rock stair is east of the Orchard and above the Undertomb.

@@ -41,8 +41,8 @@ *=ph_locationof=*

This phrase produces the room which, perhaps indirectly, contains the object given. Example: if the player stands in Biblioll College and wears a waistcoat, inside which is a fob watch, then

- -

location of the fob watch + +

location of the fob watch

@@ -51,32 +51,32 @@ *=ph_defaultvalue=*

Produces the default value of the kind named. Examples:

- -

The silver repeater is here. "You catch sight of a silver repeater watch, hands immobile at [default value of time]." + +

The silver repeater is here. "You catch sight of a silver repeater watch, hands immobile at [default value of time]."

produces the output:

- -

You catch sight of a silver repeater watch, hands immobile at 9:00 am. + +

You catch sight of a silver repeater watch, hands immobile at 9:00 am.

because nine in the morning is the default time in Inform. If we have:

- -

Brightness is a kind of value. The brightnesses are guttering, weak, radiant and blazing. + +

Brightness is a kind of value. The brightnesses are guttering, weak, radiant and blazing.

then "default value of brightness" is guttering, the first brightness created. When it comes to kinds of object, we sometimes have to be a little careful. For example,

- -

default value of room + +

default value of room

is always going to be fine (it's always the first room created in the source text). But

- -

default value of vehicle + +

default value of vehicle

@@ -85,8 +85,8 @@ *=phs_bracket=*

This text substitution expands to a single open square bracket, avoiding the problem that a literal [ in text would look to Inform like the opening of a substitution. Example:

- -

"He [bracket]Lord Astor[close bracket] would, wouldn't he?" + +

"He [bracket]Lord Astor[close bracket] would, wouldn't he?"

@@ -95,8 +95,8 @@ *=phs_closebracket=*

This text substitution expands to a single close square bracket, avoiding the problem that a literal ] in text would look to Inform like the closing of a substitution. Example:

- -

"He [bracket]Lord Astor[close bracket] would, wouldn't he?" + +

"He [bracket]Lord Astor[close bracket] would, wouldn't he?"

@@ -105,20 +105,20 @@ *=phs_apostrophe=*

This text substitution expands to a single quotation mark, avoiding Inform's ordinary rule of converting literal single quotation marks to double at the edges of words. Example:

- -

Instead of going outside, say "Lucy snaps, 'What's the matter? You don't trust my cookin[apostrophe] mister?'" + +

Instead of going outside, say "Lucy snaps, 'What's the matter? You don't trust my cookin[apostrophe] mister?'"

produces:

- -

Lucy snaps, "What's the matter? You don't trust my cookin' mister?" + +

Lucy snaps, "What's the matter? You don't trust my cookin' mister?"

A more abbreviated form would be:

- -

Instead of going outside, say "Lucy snaps, 'What's the matter? You don't trust my cookin['] mister?'" + +

Instead of going outside, say "Lucy snaps, 'What's the matter? You don't trust my cookin['] mister?'"

@@ -127,8 +127,8 @@ *=phs_quotemark=*

This text substitution expands to a double quotation mark. Most of the time this is unnecessary because of Inform's rule of converting literal single quotation marks to double at the edges of words, so it's needed only if we w nt a double-quote in the middle of a word for some reason. Example:

- -

"The compass reads 41o21'23[quotation mark]E." + +

"The compass reads 41o21'23[quotation mark]E."

@@ -137,8 +137,8 @@ *=ph_say=*

This text substitution takes the value and produces a textual representation of it. Most kinds of value, and really all of the useful ones, are "sayable" - numbers, times, objects, rules, scenes, and so on. Example:

- -

The description of the wrist watch is "The dial reads [time of day]." + +

The description of the wrist watch is "The dial reads [time of day]."

@@ -147,8 +147,8 @@ *=phs_a=*

This text substitution produces the name of the object along with its indefinite article. Example:

- -

Instead of examining something (called the whatever): + +

Instead of examining something (called the whatever):
    "You can only just make out [a whatever]."

@@ -159,8 +159,8 @@ *=phs_A=*

This text substitution produces the name of the object along with its indefinite article, capitalised. Example:

- -

Instead of examining something (called the whatever): + +

Instead of examining something (called the whatever):
    "[A whatever] can be made out in the mist."

@@ -171,8 +171,8 @@ *=phs_the=*

This text substitution produces the name of the object along with its definite article. Example:

- -

Instead of examining something (called the whatever): + +

Instead of examining something (called the whatever):
    "You can only just make out [the whatever]."

@@ -183,8 +183,8 @@ *=phs_The=*

This text substitution produces the name of the object along with its definite article, capitalised. Example:

- -

Instead of examining something (called the whatever): + +

Instead of examining something (called the whatever):
    "[The whatever] may be a trick of the mist."

@@ -195,8 +195,8 @@ *=phs_numwords=*

This text substitution writes out the number in English text. Example:

- -

"You've been wandering around for [turn count in words] turns now." + +

"You've been wandering around for [turn count in words] turns now."

@@ -205,8 +205,8 @@ *=phs_s=*

This text substitution prints a letter "s" unless the last number printed was 1. Example:

- -

"You've been wandering around for [turn count in words] turn[s] now." + +

"You've been wandering around for [turn count in words] turn[s] now."

@@ -215,14 +215,14 @@ *=phs_listof=*

This text substitution produces a list, in sentence form, of everything matching the description. Example:

- -

"Mr Darcy glares proudly at you. He is wearing [list of things worn by Darcy] and carrying [list of things carried by Darcy]." + +

"Mr Darcy glares proudly at you. He is wearing [list of things worn by Darcy] and carrying [list of things carried by Darcy]."

And, if this were from a dramatisation of the novel by Miss Fielding rather than Miss Austen, we might find:

- -

Mr Darcy glares proudly at you. He is wearing a pair of Newcastle United boxer shorts and carrying a self-help book. + +

Mr Darcy glares proudly at you. He is wearing a pair of Newcastle United boxer shorts and carrying a self-help book.

@@ -231,8 +231,8 @@ *=phs_alistof=*

This text substitution produces a list, in sentence form, of everything matching the description. Each item is prefaced by its indefinite article. Example:

- -

a maritime bill of lading, some hemp rope and Falconer's Naval Dictionary + +

a maritime bill of lading, some hemp rope and Falconer's Naval Dictionary

@@ -240,8 +240,8 @@ *=phs_Alistof=*

This text substitution produces a list, in sentence form, of everything matching the description. Each item is prefaced by its indefinite article, and the first is capitalised, so that it can be used at the beginning of a sentence. Example:

- -

A maritime bill of lading, some hemp rope and Falconer's Naval Dictionary + +

A maritime bill of lading, some hemp rope and Falconer's Naval Dictionary

@@ -249,8 +249,8 @@ *=phs_thelistof=*

This text substitution produces a list, in sentence form, of everything matching the description. Each item is prefaced by its definite article. Example:

- -

the maritime bill of lading, the hemp rope and Falconer's Naval Dictionary + +

the maritime bill of lading, the hemp rope and Falconer's Naval Dictionary

@@ -258,8 +258,8 @@ *=phs_Thelistof=*

This text substitution produces a list, in sentence form, of everything matching the description. Each item is prefaced by its definite article, and the first is capitalised, so that it can be used at the beginning of a sentence. Example:

- -

The maritime bill of lading, the hemp rope and Falconer's Naval Dictionary + +

The maritime bill of lading, the hemp rope and Falconer's Naval Dictionary

@@ -267,8 +267,8 @@ *=phs_islistof=*

This text substitution produces a list, in sentence form, of everything matching the description. The whole list starts with "is" (if there's one item or none) or "are" (more than one). Examples:

- -

is marlin-spike + +

is marlin-spike
are maritime bill of lading, hemp rope and Falconer's Naval Dictionary

@@ -278,8 +278,8 @@ *=phs_isalistof=*

This text substitution produces a list, in sentence form, of everything matching the description. Each item is prefaced by its indefinite article, and the whole list starts with "is" (if there's one item or none) or "are" (more than one). Examples:

- -

is a marlin-spike + +

is a marlin-spike
are a maritime bill of lading, some hemp rope and Falconer's Naval Dictionary

@@ -289,8 +289,8 @@ *=phs_isthelistof=*

This text substitution produces a list, in sentence form, of everything matching the description. Each item is prefaced by its definite article, and the whole list starts with "is" (if there's one item or none) or "are" (more than one). Examples:

- -

is the marlin-spike + +

is the marlin-spike
are the maritime bill of lading, the hemp rope and Falconer's Naval Dictionary

@@ -304,14 +304,14 @@ *=phs_if=*

This text substitution produces no text. It's used only for a side-effect: it says that the text following should be said only if the condition is true. That continues until the end of the text, or until an "[end if]" substitution whichever comes first. If the "[otherwise]" and "[otherwise if]" substitutions are also present, they allow alternatives to be added in case the condition is false. Example:

- -

The wine cask is a container. The printed name of the cask is "[if open]broached, empty cask[otherwise]sealed wine cask". + +

The wine cask is a container. The printed name of the cask is "[if open]broached, empty cask[otherwise]sealed wine cask".

we find that the cask is described as "a broached, empty cask" when open, and "a sealed wine cask" when closed. A longer example which begins and ends with fixed text, but has two alternatives in the middle:

- -

The Customs Wharf is a room. "Amid the bustle of the quayside, [if the cask is open]many eyes stray to your broached cask. [otherwise]nobody takes much notice of a man heaving a cask about. [end if]Sleek gondolas jostle at the plank pier." + +

The Customs Wharf is a room. "Amid the bustle of the quayside, [if the cask is open]many eyes stray to your broached cask. [otherwise]nobody takes much notice of a man heaving a cask about. [end if]Sleek gondolas jostle at the plank pier."

@@ -319,8 +319,8 @@ *=phs_unless=*

This text substitution produces no text. It's used only for a side-effect: it says that the text following should be said only if the condition is false. That continues until the end of the text, or until an "[end if]" substitution, which ver comes first. If the "[otherwise]" and "[otherwise if]" substitutions are also present, they allow alternatives to be added in case the condition is true. Example:

- -

The Customs Hall is a room. "With infinite slowness, with ledgers and quill pens, the clerks ruin their eyesight.[unless the player is a woman] They barely even glance in your direction." + +

The Customs Hall is a room. "With infinite slowness, with ledgers and quill pens, the clerks ruin their eyesight.[unless the player is a woman] They barely even glance in your direction."

@@ -328,8 +328,8 @@ *=phs_otherwise=*

This text substitution produces no text, and can be used only following an "[if ...]" or "[unless ...]" text substitution. It switches from text which appears if the condition is true, to text which appears if it is false. Example:

- -

The wine cask is a container. The printed name of the cask is "[if open]broached, empty cask[otherwise]sealed wine cask". + +

The wine cask is a container. The printed name of the cask is "[if open]broached, empty cask[otherwise]sealed wine cask".

@@ -345,8 +345,8 @@ *=phs_elseif=*

This text substitution produces no text, and can be used only following an "[if ...]" or "[unless ...]" text substitution. It gives an alternative text to use if the first condition didn't apply, but this one does. Example:

- -

The wine cask is a container. The printed name of the cask is "[if open]broached, empty cask[otherwise if transparent]sealed cask half-full of sloshing wine[otherwise]sealed wine cask". + +

The wine cask is a container. The printed name of the cask is "[if open]broached, empty cask[otherwise if transparent]sealed cask half-full of sloshing wine[otherwise]sealed wine cask".

@@ -358,8 +358,8 @@ *=phs_oneof=*

This text substitution produces no text. It's used only for a side-effect: it switches between a number of alternative texts, which follow it and are divided by "[or]" substitutions, according to a strategy given in closing substitution. Example:

- -

"You flip the coin. [one of]Heads[or]Tails[purely at random]!" + +

"You flip the coin. [one of]Heads[or]Tails[purely at random]!"

@@ -368,8 +368,8 @@ *=phs_or=*

This text substitution produces no text, and can be used only in a "[one of]..." construction. It divides alternative wordings. Example:

- -

"You flip the coin. [one of]Heads[or]Tails[purely at random]!" + +

"You flip the coin. [one of]Heads[or]Tails[purely at random]!"

@@ -385,8 +385,8 @@ *=phs_random=*

This text substitution produces no text, and can be used only to end a "[one of]..." construction. It indicates that the alternatives are chosen at random except that the same choice cannot come up twice running. This is useful to avoid the deadening effect of repeating the exact same message. Example:

- -

"The light changes randomly again; now it's [one of]green[or]amber[or]red[at random]." + +

"The light changes randomly again; now it's [one of]green[or]amber[or]red[at random]."

@@ -395,8 +395,8 @@ *=phs_thenrandom=*

This text substitution produces no text, and can be used only to end a "[one of]..." construction. It indicates that the alternatives are chosen in sequence until all have been seen, and then after that, at random except that the same choice cannot come up twice running. Example:

- -

"Maybe the murderer is [one of]Colonel Mustard[or]Professor Plum[or]Cardinal Cerise[then at random]." + +

"Maybe the murderer is [one of]Colonel Mustard[or]Professor Plum[or]Cardinal Cerise[then at random]."

@@ -404,8 +404,8 @@ *=phs_sticky=*

This text substitution produces no text, and can be used only to end a "[one of]..." construction. It indicates that a random choice is made the first time the text is printed, but that it sticks from there on. Example:

- -

"The newspaper headline is: [one of]War Casualties[or]Terrorists[or]Banks[sticky random] [one of]Continue To Expand[or]Lose Out[sticky random]." + +

"The newspaper headline is: [one of]War Casualties[or]Terrorists[or]Banks[sticky random] [one of]Continue To Expand[or]Lose Out[sticky random]."

@@ -414,8 +414,8 @@ *=phs_decreasing=*

This text substitution produces no text, and can be used only to end a "[one of]..." construction. It indicates that the alternatives are chosen at random, except that the first is most likely to be chosen, the second is next most likely, and so n down to the rarest at the end. Example:

- -

"Zorro strides by, [one of]looking purposeful[or]grim-faced[or]deep in thought[or]suppressing a yawn[or]scratching his ribs[or]trying to conceal that he has cut himself shaving[as decreasingly likely outcomes]." + +

"Zorro strides by, [one of]looking purposeful[or]grim-faced[or]deep in thought[or]suppressing a yawn[or]scratching his ribs[or]trying to conceal that he has cut himself shaving[as decreasingly likely outcomes]."

@@ -424,8 +424,8 @@ *=phs_order=*

This text substitution produces no text, and can be used only to end a "[one of]..." construction. A random order is chosen for the alternative passages of text, and they are used in that order as the text is printed again an again. When one random cycle finishes, a new one begins. The effect is somewhat like the "shuffle album" feature on an iPod. Example:

- -

"You dip into the chapter on [one of]freshwater fish[or]hairless mammals[or]extinct birds[or]amphibians such as the black salamander[in random order]." + +

"You dip into the chapter on [one of]freshwater fish[or]hairless mammals[or]extinct birds[or]amphibians such as the black salamander[in random order]."

@@ -434,8 +434,8 @@ *=phs_cycling=*

This text substitution produces no text, and can be used only to end a "[one of]..." construction. It indicates that the alternatives are used one at a time, in turn: after the last one is reached, we start again from t e first. Example:

- -

"The pundits discuss [one of]the weather[or]world events[or]celebrity gossip[cycling]." + +

"The pundits discuss [one of]the weather[or]world events[or]celebrity gossip[cycling]."

@@ -443,8 +443,8 @@ *=phs_stopping=*

This text substitution produces no text, and can be used only to end a "[one of]..." construction. It indicates that the alternatives are used one at a time, in turn: once the last one is reached, it's used forever after. Example:

- -

"[one of]The phone rings[or]The phone rings a second time[or]The phone rings again[stopping]." + +

"[one of]The phone rings[or]The phone rings a second time[or]The phone rings again[stopping]."

@@ -452,14 +452,14 @@ *=phs_firsttime=*

This pair of text substitutions causes whatever is between them to be printed only the first time the text is printed. Example:

- -

"The screen door squeaks loudly as when you open it. [first time]Well, you'll get used to it eventually. [only]" + +

"The screen door squeaks loudly as when you open it. [first time]Well, you'll get used to it eventually. [only]"

This is exactly equivalent to

- -

"The screen door squeaks loudly as when you open it. [one of]Well, you'll get used to it eventually. [or][stopping]"; + +

"The screen door squeaks loudly as when you open it. [one of]Well, you'll get used to it eventually. [or][stopping]";

@@ -468,14 +468,14 @@ *=phs_linebreak=*

This text substitution produces a line break. Example:

- -

"There is an endless sense of[line break]falling and[line break]falling." + +

"There is an endless sense of[line break]falling and[line break]falling."

Line breaks are not paragraph breaks, so the result is:

- -

There is an endless sense of + +

There is an endless sense of
falling and
@@ -488,14 +488,14 @@ *=phs_nolinebreak=*

This text substitution produces no text. It's used only for a side-effect: it prevents a line break where Inform might otherwise assume one. Example:

- -

"The chorus sing [one of]Jerusalem[or]Rule, Britannia![no line break][at random]." + +

"The chorus sing [one of]Jerusalem[or]Rule, Britannia![no line break][at random]."

Here the "[no line break]" stops Inform from thinking that the exclamation mark means a sentence ending - it's part of the name of the song "Rule, Britannia!". So we get

- -

The chorus sing Rule, Britannia!. + +

The chorus sing Rule, Britannia!.

@@ -504,25 +504,25 @@ *=phs_runparaon=*

This text substitution produces no text. It's used only for a side-effect: it prevents a paragraph break occurring after the present text is printed, in case Inform might be tempted to place one there. Example:

- -

Before taking something, say "Very well. [run paragraph on]". + +

Before taking something, say "Very well. [run paragraph on]".

This allows the reply to, say, TAKE ENVELOPE to be

- -

Very well. Taken. + +

Very well. Taken.

rather than

- -

Very well. + +

Very well.

- -

Taken. + +

Taken.

@@ -531,19 +531,19 @@ *=phs_parabreak=*

This text substitution produces a paragraph break. Example:

- -

"This is not right.[paragraph break]No, something is terribly wrong." + +

"This is not right.[paragraph break]No, something is terribly wrong."

Paragraph breaks have a little vertical spacing in them, unlike mere line breaks, so the result is:

- -

This is not right. + +

This is not right.

- -

No, something is terribly wrong. + +

No, something is terribly wrong.

@@ -559,14 +559,14 @@ *=phs_clarifbreak=*

This text substitution produces a line break, and then also a paragraph break if the text immediately following is a room description brought about by having gone to to a different room and looking around, in which case a line break should be dded. In traditional IF, this is used when clarifying what Inform thinks the player intended by a given command. Example:

- -

say "(first opening [the noun])[command clarification break]"; + +

say "(first opening [the noun])[command clarification break]";

might result in

- -

(first opening the valise) + +

(first opening the valise)
You rummage through the valise for tickets, but find nothing.

@@ -580,8 +580,8 @@ *=phs_bold=*

This text substitution produces no text. It's used only for a side-effect: to make the text following it appear in bold face. "[roman type]" should be used to switch back to normal. Example:

- -

"Jane looked down. [bold type]Danger[roman type], the sign read." + +

"Jane looked down. [bold type]Danger[roman type], the sign read."

@@ -589,8 +589,8 @@ *=phs_italic=*

This text substitution produces no text. It's used only for a side-effect: to make the text following it appear in italics. "[roman type]" should be used to switch back to normal. Example:

- -

"This is [italic type]very suspicious[roman type], said Peter." + +

"This is [italic type]very suspicious[roman type], said Peter."

@@ -602,8 +602,8 @@ *=phs_fixedspacing=*

This text substitution produces no text. It's used only for a side-effect: to make the text following it appear with fixed letter spacing. In variable letter spacing, a lower case "m" is much wider than an "l", which is natural to the ey since it has been printing practice since the Renaissance. Fixed letter spacing is more like typewriting, and it is best used to reproduce typewritten text or printed notices; it can also be convenient for making simple diagrams. Example:

- -

"On the door is written: [fixed letter spacing]J45--O-O-O[variable letter spacing]." + +

"On the door is written: [fixed letter spacing]J45--O-O-O[variable letter spacing]."

@@ -615,8 +615,8 @@ *=ph_boxed=*

This phrase displays the given text on screen in an overlaid box. For reasons to do with the way such quotations are plotted onto the screen, their text is treated literally: no substitutions in square brackets are obeyed. The quota ion will only ever appear once, regardless of the number of times the "display the boxed quotation ..." phrase is reached. Rather than being shown immediately - and thus, probably, scrolling away before it can be seen - the display is held back until the next command prompt is shown to the player. Example:

- -

After looking in the Wabe, display the boxed quotation + +

After looking in the Wabe, display the boxed quotation
    "And 'the wabe' is the grass-plot round
@@ -626,8 +626,8 @@

- -

    Of course it is. It's called 'wabe,' + +

    Of course it is. It's called 'wabe,'
    you know, because it goes a long way
@@ -635,8 +635,8 @@

- -

    -- Lewis Carroll". + +

    -- Lewis Carroll".

@@ -645,8 +645,8 @@ *=ph_numberof=*

This phrase counts the number of values matching the description, which may of course be 0. Example:

- -

number of open doors + +

number of open doors

@@ -655,8 +655,8 @@ *=ph_roomdirof=*

This phrase produces the room which the given map direction leads to, or the special value "nothing" if it leads nowhere. If it leads to a door, the result is the room through that door. Examples:

- -

say "You look north into [the room north from the Garden]." + +

say "You look north into [the room north from the Garden]."
if the room north from the Garden is nothing, say "The grass leads nowhere."

@@ -666,8 +666,8 @@ *=ph_doordirof=*

This phrase produces the door which the given map direction leads to, or the special value "nothing" if it leads nowhere or to a room. Examples:

- -

let the barrier be the door north from the Garden; + +

let the barrier be the door north from the Garden;
if the barrier is a door, say "Well, [the barrier] is in the way.";

@@ -681,14 +681,14 @@ *=ph_bestroute=*

This phrase produces a direction to take in order to get from A to B by the shortest number of movements between rooms, or produces "nothing" if there is no way through at all. Example:

- -

The description of the brass compass is "The dial points quiveringly to [best route from the location to the Lodestone Room]." + +

The description of the brass compass is "The dial points quiveringly to [best route from the location to the Lodestone Room]."

Best routes are ordinarily forbidden to go through doors, but if the suffix "using doors" is added as an option then any open or openable and unlocked door may be used on the way; and if "using even locked doors" is given, then any door at all will do. Since magnetism is no respecter of property, that seems right here:

- -

The description of the brass compass is "The dial points quiveringly to [best route from the location to the Lodestone Room, using even locked doors]." + +

The description of the brass compass is "The dial points quiveringly to [best route from the location to the Lodestone Room, using even locked doors]."

@@ -696,8 +696,8 @@ *=ph_bestroutethrough=*

This phrase produces a direction to take in order to get from A to B by the shortest number of movements between rooms which match the given description, or produces "nothing" if there is no way through at all. Example:

- -

best route from the Drawbridge to the Keep through visited rooms + +

best route from the Drawbridge to the Keep through visited rooms

@@ -706,8 +706,8 @@ *=ph_bestroutelength=*

This phrase produces the number of map connections which must be followed in order to get from A to B by the shortest number of movements between rooms. If A and B are the same, the answer is 0; if there is no route at all, the answer is -1. Example:

- -

The description of the proximity gadget is "You are now [number of moves from the location to the Sundial] moves from the Sundial."; + +

The description of the proximity gadget is "You are now [number of moves from the location to the Sundial] moves from the Sundial.";

@@ -719,8 +719,8 @@ *=ph_stopaction=*

This phrase stops the current rule, stops the rulebook being worked through, and finally stops the action being processed. Example:

- -

Before taking the key: + +

Before taking the key:
    say "It seems to be soldered to the keyhole.";
@@ -732,8 +732,8 @@ *=ph_continueaction=*

This phrase ends the current rule, but in a way which keeps its rulebook going, so that the action being processed will carry on rather than being stopped. Example:

- -

Instead of taking the napkin: + +

Instead of taking the napkin:
    say "(first unfolding its delicate origami swan)[command clarification break]";
@@ -746,14 +746,14 @@ *=ph_try=*

This phrase makes the action, which has to be named literally, take effect now. Example:

- -

Instead of entering the trapdoor, try going up. + +

Instead of entering the trapdoor, try going up.

It's as if the player had typed GO UP as a command. Note that the action has to be specific:

- -

try eating something; + +

try eating something;

@@ -762,8 +762,8 @@ *=ph_trysilently=*

This phrase makes the action, which has to be named literally, take effect now, under the "silent" convention which means that routine messages aren't printed. Example:

- -

try silently taking the napkin; + +

try silently taking the napkin;

@@ -772,8 +772,8 @@ *=phs_surroundings=*

This text substitution produces a succinct description of where the player is, be this in darkness, in a lighted room or inside an opaque container such as a large packing case. Example:

- -

now the left hand status line is "You: [the player's surroundings]"; + +

now the left hand status line is "You: [the player's surroundings]";

@@ -781,14 +781,14 @@ *=ph_changeexit=*

This phrase alters the map so that the given map connection is made. Note that connections can be made to rooms, but not doors: the positions of doors are fixed. Example:

- -

change the east exit of the Closet to the Tsar's Imperial Dining Salon + +

change the east exit of the Closet to the Tsar's Imperial Dining Salon

Since "nothing" is not a room, this doesn't allow us to change the exit to nothing, so there is a separate definition of:

- -

change the west exit of the Closet to nothing + +

change the west exit of the Closet to nothing

@@ -796,8 +796,8 @@ *=ph_changenoexit=*

This phrase alters the map so that the given map connection is unmade. Example:

- -

change the west exit of the Closet to nowhere + +

change the west exit of the Closet to nowhere

@@ -805,21 +805,21 @@ *=ph_move=*

This phrase moves the first-named object to the second. Example:

- -

move the genie's lamp to Aladdin's Cave; + +

move the genie's lamp to Aladdin's Cave;

The first object named has to be a thing; the destination must be a room, as here, a container, a supporter, or a person. When something is moved, all its parts and contents (and all their contents, and so on) move with it. If the thing being moved is a person, then the destination is required to be a room or an enterable container. (In particular, a person cannot be carried by another person.)

Two options can be used if the object being moved is the player.

- -

move the player to Aladdin's Cave, without printing a room description + +

move the player to Aladdin's Cave, without printing a room description

omits the description which would otherwise be produced. A compromise is to use:

- -

move the player to Aladdin's Cave, printing an abbreviated room description + +

move the player to Aladdin's Cave, printing an abbreviated room description

@@ -828,14 +828,14 @@ *=ph_movebackdrop=*

This phrase moves the backdrop so that it is now present in every room matching the given description. Example: If we define

- -

A room can be wet or dry. A room is usually dry. The Rock Pool is wet. + +

A room can be wet or dry. A room is usually dry. The Rock Pool is wet.

then we can write

- -

move the stream backdrop to all wet rooms; + +

move the stream backdrop to all wet rooms;

@@ -844,25 +844,25 @@ *=ph_updatebackdrop=*

This phrase runs through all backdrops in the model world and makes sure they are correctly in, or not in, the current location, so that everything appears right from the player's point of view. Example:

- -

The Upper Cave is above the Rock Pool. The Ledge is east of the Pool. The stream is a backdrop. + +

The Upper Cave is above the Rock Pool. The Ledge is east of the Pool. The stream is a backdrop.

- -

When play begins: + +

When play begins:
    move the stream backdrop to all wet rooms.

- -

A lever is in the Cave. The lever is fixed in place. + +

A lever is in the Cave. The lever is fixed in place.

- -

Instead of pulling the lever when the Cave is dry: + +

Instead of pulling the lever when the Cave is dry:
    now the Cave is wet;
@@ -880,8 +880,8 @@ *=ph_remove=*

Removes the given object from play, so that it is not present in any room. We are not permitted to remove rooms, or doors, or the player, from play; but we are permitted to remove backdrops, making them disappear from all ro ms in which they are present. Example:

- -

remove the gold coin from play; + +

remove the gold coin from play;

@@ -889,8 +889,8 @@ *=ph_now=*

This phrase makes the condition become true. Examples:

- -

now the score is 100; + +

now the score is 100;
now the player is Kevin;
@@ -909,8 +909,8 @@ *=ph_increase=*

This phrase increases the variable, table entry, list entry, or property by the given amount, which must be of a compatible kind. Example:

- -

increase the score by 8; + +

increase the score by 8;
increase the time of day by 5 minutes;

@@ -920,8 +920,8 @@ *=ph_decrease=*

This phrase decreases the variable, table entry, list entry, or property by the given amount, which must be of a compatible kind. Example:

- -

decrease the score by 6; + +

decrease the score by 6;
decrease the carrying capacity of the player by 10;

@@ -931,8 +931,8 @@ *=ph_increment=*

This phrase increases the variable, table entry, list entry, or property by 1. Example:

- -

increment the score; + +

increment the score;

@@ -940,8 +940,8 @@ *=ph_decrement=*

This phrase decreases the variable, table entry, list entry, or property by 1. Example:

- -

decrement the score; + +

decrement the score;

@@ -953,8 +953,8 @@ *=ph_firstheld=*

This phrase produces the first of the list of things held by the object. Example:

- -

first thing held by Baroness Orczy + +

first thing held by Baroness Orczy

@@ -962,8 +962,8 @@ *=ph_nextheld=*

This phrase produces the next item of the list of things held by something. Example: suppose Baroness Orczy is carrying a lapdog and a string of pearls.

- -

next thing held after the lapdog + +

next thing held after the lapdog

@@ -972,22 +972,22 @@ *=ph_randombetween=*

This phrase produces a uniformly random value in the range given. Examples:

- -

a random number from 10 to 99 + +

a random number from 10 to 99
a random time from 2:31 PM to 2:57 PM

If we make a new kind of value:

- -

A cloud pattern is a kind of value. The cloud patterns are cumulus, altocumulus, cumulonimbus, stratus, cirrus, nimbus, nimbostratus. + +

A cloud pattern is a kind of value. The cloud patterns are cumulus, altocumulus, cumulonimbus, stratus, cirrus, nimbus, nimbostratus.

then we can also take random values from it:

- -

a random cloud pattern between stratus and nimbus + +

a random cloud pattern between stratus and nimbus

@@ -996,14 +996,14 @@ *=ph_randomchance=*

This condition is true X/Yths of the time, where X and Y are the numbers. Example:

- -

if a random chance of 2 in 3 succeeds, ... + +

if a random chance of 2 in 3 succeeds, ...

Here is a rule which applies only 15% of the time:

- -

Instead of waiting when a random chance of 15 in 100 succeeds: ... + +

Instead of waiting when a random chance of 15 in 100 succeeds: ...

@@ -1011,8 +1011,8 @@ *=ph_seed=*

This phrase changes the seed number as specified. Any random numbers generated after that depend only on the seed. Example: the following sentence will "fix" the process of generating these random numbers so that they are not random at all - t e same sequence of random numbers will be produced on each run.

- -

When play begins, seed the random-number generator with 1234. + +

When play begins, seed the random-number generator with 1234.

@@ -1021,8 +1021,8 @@ *=ph_randomdesc=*

This phrase makes a uniformly random choice from values satisfying the description given. Example:

- -

a random visited room + +

a random visited room
a random scene

@@ -1041,8 +1041,8 @@ *=ph_endsaying=*

This phrase ends the story at the next opportunity (typically as soon as the current rule ends), with the closing message given in the text. The end is not considered final. Example:

- -

end the story saying "You have been stymied" + +

end the story saying "You have been stymied"

@@ -1050,8 +1050,8 @@ *=ph_endfinallysaying=*

This phrase ends the story at the next opportunity (typically as soon as the current rule ends), with the closing message given in the text. The end is considered final, and any hidden menu options will be revealed. Example:

- -

end the story finally saying "You have defeated Sauron" + +

end the story finally saying "You have defeated Sauron"

@@ -1075,8 +1075,8 @@ *=ph_resume=*

This phrase causes an ended story to resume exactly as if no "end the story..." phrase had been used. Example:

- -

When play ends: + +

When play ends:
    if the story has not ended finally:
@@ -1091,14 +1091,14 @@ *=phs_timewords=*

This text substitution produces the given time written out in English sentence form. For example:

- -

"Through the glass you can see the reversed hands reading [the time of day in words]." + +

"Through the glass you can see the reversed hands reading [the time of day in words]."

might produce

- -

Through the glass you can see the reversed hands reading twenty to nine. + +

Through the glass you can see the reversed hands reading twenty to nine.

@@ -1106,14 +1106,14 @@ *=ph_durationmins=*

This phrase converts numbers into lengths of time. Example:

- -

15 minutes + +

15 minutes

Because it's a phrase, not just a notation for writing constants down, the number doesn't have to be given literally:

- -

let X be 5; + +

let X be 5;
if the player is in the Slow Room, now X is 10;
@@ -1126,8 +1126,8 @@ *=ph_durationhours=*

This phrase converts numbers into lengths of time. Example:

- -

10 hours + +

10 hours

@@ -1136,8 +1136,8 @@ *=ph_shiftbefore=*

This phrase produces a time earlier by the amount given, keeping within the 24 hour clock. Example:

- -

7 hours before 5:30 AM + +

7 hours before 5:30 AM

@@ -1146,8 +1146,8 @@ *=ph_shiftafter=*

This phrase produces a time later by the amount given, keeping within the 24 hour clock. Example:

- -

9 hours after 11 AM + +

9 hours after 11 AM

@@ -1164,8 +1164,8 @@ *=ph_minspart=*

This phrase converts a time to a number, then takes the result mod 60, which in effect produces the number of minutes after the hours are thrown away. Example:

- -

minutes part of 12:41 PM + +

minutes part of 12:41 PM

@@ -1174,8 +1174,8 @@ *=ph_hourspart=*

This phrase converts a time to a number, then divides the result by 60, which in effect produces the number of hours after minutes are thrown away. Example:

- -

hours part of 8:21 AM + +

hours part of 8:21 AM

@@ -1184,8 +1184,8 @@ *=ph_timefromnow=*

This phrase causes the given rule to be run at a given time offset from the current time of day. Example:

- -

the egg-timer clucks in 18 minutes from now; + +

the egg-timer clucks in 18 minutes from now;

@@ -1193,8 +1193,8 @@ *=ph_turnsfromnow=*

This phrase causes the given rule to be run at a given number of turns after the current one. Example:

- -

the egg-timer clucks in four turns from now; + +

the egg-timer clucks in four turns from now;

@@ -1202,8 +1202,8 @@ *=ph_attime=*

This phrase causes the given rule to be run at a given time of day. Example:

- -

the egg-timer clucks at 11:35 AM; + +

the egg-timer clucks at 11:35 AM;

@@ -1211,8 +1211,8 @@ *=ph_scenetimesincebegan=*

This phrase produces the time since the named scene began, which only makes sense, of course, if it has indeed begun. Example:

- -

time since Entire Game began + +

time since Entire Game began

@@ -1220,8 +1220,8 @@ *=ph_scenetimesinceended=*

This phrase produces the time since the named scene ended, which only makes sense, of course, if it has indeed ended. Example:

- -

time since Formal Dinner ended + +

time since Formal Dinner ended

@@ -1253,8 +1253,8 @@ *=ph_nothing=*

This phrase does nothing at all. It is very occasionally useful to make a rule which does nothing:

- -

This is the largely ineffective rule: + +

This is the largely ineffective rule:
    do nothing.

@@ -1264,26 +1264,26 @@ *=ph_showme=*

This phrase is intended for testing purposes only. If used in a story file running inside the Inform application, it prints a line of text showing the given value and its kind; in a Released story file, it does noth ng at all. Example:

- -

When play begins: showme 11. + +

When play begins: showme 11.

produces

- -

number: 11 + +

number: 11

More usefully:

- -

Every turn: showme the score. + +

Every turn: showme the score.

Now, every turn, we get a line in the story's transcript like so:

- -

"score" = number: 0 + +

"score" = number: 0

@@ -1292,8 +1292,8 @@ *=ph_indarkness=*

This condition is true if the player currently has no light to see by. Note that the test is more complicated than simply testing

- -

if the player is in a dark room, ... + +

if the player is in a dark room, ...

@@ -1302,8 +1302,8 @@ *=ph_consents=*

This condition is unusual in doing something and not simply making a silent check: it waits for the player to type YES (or Y) or NO (or N) at the keyboard, and then is true if the answer was yes. Example:

- -

say "Are you quite sure you want to kiss the Queen? "; + +

say "Are you quite sure you want to kiss the Queen? ";
if the player consents:
@@ -1315,20 +1315,20 @@ *=ph_whether=*

This phrase converts a condition into its result as a value, which is always either "true" or "false". Example:

- -

whether or not 20 is an odd number + +

whether or not 20 is an odd number

produces the truth state "false". This is mostly useful for storing up results to look at later:

- -

let victory be whether or not all the treasures are in the cabinet; + +

let victory be whether or not all the treasures are in the cabinet;

and then subsequently:

- -

if victory is true, ... + +

if victory is true, ...

@@ -1336,8 +1336,8 @@ *=ph_if=*

This phrase causes the single phrase, or block of phrases, following it to be obeyed only if the condition is true. (If the condition must contain a comma for some reason, the block form should be used.) Example:

- -

if the red door is open, say "You could try going east?" + +

if the red door is open, say "You could try going east?"

@@ -1345,8 +1345,8 @@ *=ph_unless=*

This phrase causes the single phrase, or block of phrases, following it to be obeyed only if the condition is false. (If the condition must contain a comma for some reason, the block form should be used.) Example:

- -

unless the red door is closed, say "You could try going east?" + +

unless the red door is closed, say "You could try going east?"

@@ -1354,8 +1354,8 @@ *=ph_otherwise=*

This phrase can only be used as part of an "if ...:" or "unless: ...", and provides an alternative block of phrases to follow if the first block isn't followed. Example:

- -

if N is 2: + +

if N is 2:
    ...
@@ -1366,16 +1366,16 @@

When there is only a single phrase we can use the shortened form:

- -

if N is 2, say "Hooray, N is 2!"; + +

if N is 2, say "Hooray, N is 2!";
otherwise say "Boo, N is not 2...";

We can also supply an alternative condition:

- -

if N is 1: + +

if N is 1:
    ...
@@ -1394,8 +1394,8 @@ *=ph_switch=*

This phrase switches between a variety of possible blocks of phrases to follow, depending on the value given. Example:

- -

if the dangerous item is: + +

if the dangerous item is:
    -- the electric hairbrush:
@@ -1408,8 +1408,8 @@

One alternative is allowed to be "otherwise", which is used only if none of the other cases apply, and which therefore guarantees that in any situation exactly one of the blocks will be followed.

- -

if N is: + +

if N is:
    -- 1: say "1.";
@@ -1423,8 +1423,8 @@ *=ph_while=*

This phrase causes the block of phrases following it to be repeated over and over for as long the condition is true. If it isn't even true the first time, the block is skipped over and nothing happens. Example:

- -

while someone (called the victim) is in the Crypt: + +

while someone (called the victim) is in the Crypt:
    say "A bolt of lightning strikes [the victim]!";
@@ -1436,29 +1436,29 @@ *=ph_repeat=*

This phrase causes the block of phrases following it to be repeated once for each value in the given range, storing that value in the named variable. (The variable exists only temporarily, within the repetition.) Example:

- -

repeat with counter running from 1 to 10: + +

repeat with counter running from 1 to 10:
    ...

This, and runs through the given phrases ten times. Within those phrases, a special value called "counter" has the value 1 the first time through, then the value 2, then 3 and so on up to 10. (It can of course be called whatever we like: this is only an example.) The range can be from any kind where ranges make sense - anything on which arithmetic can be done, so for instance

- -

repeat with moment running from 4 PM to 4:07 PM: + +

repeat with moment running from 4 PM to 4:07 PM:
    ...

and also any enumeration:

- -

Colour is a kind of value. The colours are red, orange, yellow, green, blue, indigo and violet. + +

Colour is a kind of value. The colours are red, orange, yellow, green, blue, indigo and violet.

- -

... + +

...
    repeat with hue running from orange to indigo:
@@ -1470,24 +1470,24 @@ *=ph_runthrough=*

This phrase causes the block of phrases following it to be repeated once for each value matching the description, storing that value in the named variable. (The variable exists only temporarily, within the repetition.) Example:

- -

repeat with item running through open containers: + +

repeat with item running through open containers:
    ...

If there are no containers, or they are all closed, the phrases will not be followed at all. Inform will issue a Problem message if the range of the loop may be infinite: for example, it won't allow:

- -

repeat with X running through odd numbers: + +

repeat with X running through odd numbers:
    ...

On the other hand it will allow:

- -

repeat with T running through times: + +

repeat with T running through times:
    ...

@@ -1498,8 +1498,8 @@ *=ph_next=*

This phrase can only be used inside a "repeat" or "while" block, and causes the current repetition of the block to finish immediately. That either means the next repetition begins, or (if we are a ready at the last one) the loop ends too. Example:

- -

repeat with X running from 1 to 10: + +

repeat with X running from 1 to 10:
    if X is 4, next;
@@ -1512,8 +1512,8 @@ *=ph_break=*

This phrase can only be used inside "repeat", "while" block, and causes both the current repetition and the entire loop to finish immediately. Example:

- -

repeat with X running from 1 to 10: + +

repeat with X running from 1 to 10:
    if X is 7, break;
@@ -1526,8 +1526,8 @@ *=ph_stop=*

This phrase causes the current rule to end immediately. It is most often used in the definition of other phrases:

- -

To judge the score: + +

To judge the score:
    if the score is 0, stop;
@@ -1541,8 +1541,8 @@ *=ph_listcontents=*

This phrase produces a list of all things whose holder is the given object, according to Inform's traditional conventions for room descriptions and inventory listings. Example:

- -

list the contents of Marley Wood, as a sentence, with newlines + +

list the contents of Marley Wood, as a sentence, with newlines
and including all contents;

@@ -1553,8 +1553,8 @@ *=ph_let=*

This phrase creates a new temporary variable, starting it with the value supplied. The variable lasts only for the present block of phrases, which certainly means that it lasts only for the current rule. Examples:

- -

let outer bull be 25; + +

let outer bull be 25;
let the current appearance be "reddish brown";
@@ -1563,20 +1563,20 @@

The kinds of these are deduced from the values given, so that, for instance,

- -

say "The outer bull scores [the outer bull in words] when you practice archery in [special room]." + +

say "The outer bull scores [the outer bull in words] when you practice archery in [special room]."

produces

- -

The outer bull scores twenty-five when you practice archery in Marley Wood. + +

The outer bull scores twenty-five when you practice archery in Marley Wood.

The variable name should be a new one; if it's the name of an existing one, then the kinds must agree. So:

- -

let outer bull be 25; + +

let outer bull be 25;
let outer bull be 50;

@@ -1587,20 +1587,20 @@ *=ph_letdefault=*

This phrase creates a new temporary variable of the given kind. The variable lasts only for the present block of phrases, which certainly means that it lasts only for the current rule. Example:

- -

let inner bull be a number; + +

let inner bull be a number;

The variable created holding the default value for that kind - in this case, the number 0. A handful of very obscure kinds have no default values, and then a problem message is produced. Inform also disallows:

- -

let the conveyance be a vehicle; + +

let the conveyance be a vehicle;

because temporary variables aren't allowed to have kinds more specific than "object". (This is a good thing: suppose there are no vehicles in the world?) It's quite safe in such cases to use

- -

let the conveyance be an object; + +

let the conveyance be an object;

@@ -1617,8 +1617,8 @@ *=ph_decideon=*

This phrase can only be used in the body of a definition of a phrase to decide a value. It causes the calculation to end immediately, with the outcome being the given value, which must be of the kind expected. Example:

- -

To decide which number is double (N - a number): + +

To decide which number is double (N - a number):
    let D be N times N;
@@ -1630,8 +1630,8 @@ *=ph_enumfirst=*

This phrase produces the first-created value of the given kind, which should be an enumeration. Example: if we have

- -

Colour is a kind of value. The colours are red, orange, yellow, green, blue, indigo and violet. + +

Colour is a kind of value. The colours are red, orange, yellow, green, blue, indigo and violet.

@@ -1640,8 +1640,8 @@ *=ph_enumlast=*

This phrase produces the last-created value of the given kind, which should be an enumeration. Example: if we have

- -

Colour is a kind of value. The colours are red, orange, yellow, green, blue, indigo and violet. + +

Colour is a kind of value. The colours are red, orange, yellow, green, blue, indigo and violet.

@@ -1650,8 +1650,8 @@ *=ph_enumafter=*

This phrase produces the next-created value of the given kind, which should be an enumeration. Example: if we have

- -

Colour is a kind of value. The colours are red, orange, yellow, green, blue, indigo and violet. + +

Colour is a kind of value. The colours are red, orange, yellow, green, blue, indigo and violet.

@@ -1660,8 +1660,8 @@ *=ph_enumbefore=*

This phrase produces the previous-created value of the given kind, which should be an enumeration. Example: if we have

- -

Colour is a kind of value. The colours are red, orange, yellow, green, blue, indigo and violet. + +

Colour is a kind of value. The colours are red, orange, yellow, green, blue, indigo and violet.

@@ -1690,8 +1690,8 @@ *=ph_currentaction=*

This phrase produces the action currently being processed as a value - it literally stores the action, and remembers, if necessary, the exact wording of the player's command at the time it was stored - so that even actions ari ing from commands like LOOK UP X100 IN THE CODE BOOK can be stored faithfully. Examples:

- -

let the present whim be the current action; + +

let the present whim be the current action;
say "How you would like to be [current action].";

@@ -1702,8 +1702,8 @@ *=ph_actionpart=*

This phrase produces the action name part of an action. Example: suppose the current actor is Algy, who is throwing the brick at Biggles. Then

- -

action name part of the current action = throwing it at action + +

action name part of the current action = throwing it at action

@@ -1711,8 +1711,8 @@ *=ph_nounpart=*

This phrase produces the (first) noun of an action. Example: suppose the current actor is Algy, who is throwing the brick at Biggles. Then

- -

noun part of the current action = the brick + +

noun part of the current action = the brick

@@ -1721,8 +1721,8 @@ *=ph_secondpart=*

This phrase produces the second noun of an action. Example: suppose the current actor is Algy, who is throwing the brick at Biggles. Then

- -

second noun part of the current action = Biggles + +

second noun part of the current action = Biggles

@@ -1731,8 +1731,8 @@ *=ph_actorpart=*

This phrase produces the person who would be carrying out the action if it were being tried. Example: suppose the current actor is Algy, who is throwing the brick at Biggles. Then

- -

actor part of the current action = Algy + +

actor part of the current action = Algy

@@ -1740,8 +1740,8 @@ *=ph_involves=*

This condition is true if the object appears as any of the actor, the noun or the second noun in the action. Example:

- -

if the current action involves Algy + +

if the current action involves Algy

@@ -1750,8 +1750,8 @@ *=ph_actionof=*

This phrase is now seldom needed. It produces a literally typed action as a value. Example:

- -

now the best idea yet is the action of pushing the button; + +

now the best idea yet is the action of pushing the button;

@@ -1764,8 +1764,8 @@ *=ph_nextstep=*

This phrase tries to find a shortest route between the two given endpoints, using the given relation of objects to determine single steps. Example:

- -

next step via the overlooking relation from the Folly to the Chinese Lake + +

next step via the overlooking relation from the Folly to the Chinese Lake

@@ -1774,8 +1774,8 @@ *=ph_numbersteps=*

This phrase tries to find the length of a shortest route between the two given endpoints, using the given relation of objects to determine single steps. Example:

- -

number of steps via the overlooking relation from the Folly to the Chinese Lake + +

number of steps via the overlooking relation from the Folly to the Chinese Lake

@@ -1784,8 +1784,8 @@ *=ph_ifleft=*

This condition is true if the value V is such that V relates to something by the given relation. Example: suppose partnership relates various texts to various texts. Then we can test

- -

if "chalk" relates to a text by the partnership relation, ... + +

if "chalk" relates to a text by the partnership relation, ...

@@ -1793,8 +1793,8 @@ *=ph_ifright=*

This condition is true if the value V is such that something relates to V by the given relation. Example: suppose partnership relates various texts to various texts. Then we can test

- -

if a text relates to "cheese" by the partnership relation, ... + +

if a text relates to "cheese" by the partnership relation, ...

@@ -1802,8 +1802,8 @@ *=ph_rightlookup=*

This phrase produces an Y such that the given value V relates to Y by the given relation. Example: suppose partnership relates various texts to various texts. Then we can obtain

- -

the text to which "chalk" relates by the partnership relation + +

the text to which "chalk" relates by the partnership relation

@@ -1812,8 +1812,8 @@ *=ph_leftlookup=*

This phrase produces an X such that X relates to the given value V by the given relation. Example: suppose partnership relates various texts to various texts. Then we can obtain

- -

the text which relates to "cheese" by the partnership relation + +

the text which relates to "cheese" by the partnership relation

@@ -1822,8 +1822,8 @@ *=ph_leftlookuplist=*

This phrase produces a list of all the X such that X relates to the given value V by the given relation. Example: suppose partnership relates various texts to various texts. Then we can obtain

- -

list of texts which relate to "cheese" by the partnership relation + +

list of texts which relate to "cheese" by the partnership relation

@@ -1832,8 +1832,8 @@ *=ph_rightlookuplist=*

This phrase produces a list of all Y such that the given value V relates to Y by the given relation. Example: suppose partnership relates various texts to various texts. Then we can obtain

- -

list of texts to which "chalk" relates by the partnership relation + +

list of texts to which "chalk" relates by the partnership relation

@@ -1842,8 +1842,8 @@ *=ph_leftdomain=*

This phrase produces a list of all X which relate to anything under the given relation. Example: suppose partnership relates various texts to various texts. Then we can obtain

- -

list of texts which the partnership relation relates + +

list of texts which the partnership relation relates

@@ -1851,8 +1851,8 @@ *=ph_rightdomain=*

This phrase produces a list of all Y which anything relates to under the given relation. Example: suppose partnership relates various texts to various texts. Then we can obtain

- -

list of texts which the partnership relation relates to + +

list of texts which the partnership relation relates to

@@ -1860,14 +1860,14 @@ *=ph_letrelation=*

This phrase creates a new temporary variable, and sets its value to the identity of a newly created and equally temporary relation. These last only for the present block of phrases, which certainly means that they exist only in the current rule. Example:

- -

let the password dictionary be a relation of texts; + +

let the password dictionary be a relation of texts;

This makes a purely temporary various-to-various relation between texts, which lasts as long as the temporary value "password dictionary" lasts. By default, relations are various-to-various, but we could instead write, say:

- -

let the nicknames catalogue be a various-to-one relation of texts; + +

let the nicknames catalogue be a various-to-one relation of texts;

@@ -1931,8 +1931,8 @@ *=ph_nearestwholenumber=*

This phrase performs signed addition on the given values, whose kinds must agree, and produces the result. Examples:

- -

1.4 to the nearest whole number = 1 + +

1.4 to the nearest whole number = 1
1.6 to the nearest whole number = 2
@@ -1941,8 +1941,8 @@

We probably ought to bear in mind that the limited range of "number" means that the nearest whole number might not be all that near. For example:

- -

6 x 10^23 to the nearest whole number = 2147483647 + +

6 x 10^23 to the nearest whole number = 2147483647

@@ -1951,8 +1951,8 @@ *=phs_realplaces=*

This text substitution writes out the number to the given number of decimal places. Examples:

- -

"The semicircle is roughly [pi to 3 decimal places] paces around." + +

"The semicircle is roughly [pi to 3 decimal places] paces around."

@@ -1961,8 +1961,8 @@ *=phs_decimal=*

This text substitution writes out the number in decimal form, that is, avoiding "x 10^n" even for very large or very small quantities. For example,

- -

"[1.23457 x 10^8 in decimal notation]" + +

"[1.23457 x 10^8 in decimal notation]"

@@ -1975,8 +1975,8 @@ *=phs_scientific=*

This text substitution writes out the number in scientific form, that is, using "x 10^n" even for easy-to-judge quantities. For example,

- -

"[the reciprocal of 137 in scientific notation]" + +

"[the reciprocal of 137 in scientific notation]"

@@ -1989,8 +1989,8 @@ *=ph_plus=*

This phrase performs signed addition on the given values, whose kinds must agree, and produces the result. Examples:

- -

200 + 1 = 201 + +

200 + 1 = 201
10:04 AM + two minutes = 10:06 AM

@@ -2000,8 +2000,8 @@ *=ph_minus=*

This phrase performs signed subtraction on the given values, whose kinds must agree, and produces the result. Examples:

- -

200 - 1 = 199 + +

200 - 1 = 199
10:04 AM - two minutes = 10:02 AM

@@ -2011,8 +2011,8 @@ *=ph_times=*

This phrase performs signed multiplication on the given values, whose kinds must be dimensionally compatible, and produces the result. Examples:

- -

201 times 3 = 603 + +

201 times 3 = 603
two minutes times 4 = eight minutes

@@ -2022,8 +2022,8 @@ *=ph_divide=*

This phrase performs signed division on the given values, whose kinds must be dimensionally compatible, and produces the result. Examples:

- -

201 divided by 3 = 67 + +

201 divided by 3 = 67
202 divided by 3 = 67
@@ -2040,8 +2040,8 @@ *=ph_remainder=*

This phrase performs signed division on the given values, whose kinds must be dimensionally compatible, and then produces the remainder. Examples:

- -

remainder after dividing 201 by 5 = 1 + +

remainder after dividing 201 by 5 = 1
remainder after dividing twenty minutes by 7 = six minutes

@@ -2052,8 +2052,8 @@ *=ph_nearest=*

This phrase rounds the given value off, rounding upward in boundary cases. Examples:

- -

201 to the nearest 5 = 200 + +

201 to the nearest 5 = 200
205 to the nearest 10 = 210
@@ -2065,8 +2065,8 @@ *=ph_squareroot=*

This phrase produces an approximate square root, to the nearest integer, of the given value, which must be of a kind which has square roots. Example:

- -

square root of 16 = 4 + +

square root of 16 = 4

@@ -2077,8 +2077,8 @@ *=ph_realsquareroot=*

This phrase produces a square root, as accurately as a real number can hold it, of the given value, which must be of a kind which has square roots. Example:

- -

real square root of 2 = 1.41421 + +

real square root of 2 = 1.41421

@@ -2087,8 +2087,8 @@ *=ph_cuberoot=*

This phrase produces an approximate cube root, to the nearest integer, of the given value, which must be of a kind which has cube roots. Example:

- -

cube root of 27 = 3 + +

cube root of 27 = 3
cube root of -27 = -3

@@ -2100,8 +2100,8 @@ *=ph_ceiling=*

Produces the smallest integer value greater than or equal to the one given. Examples:

- -

ceiling of pi = 4.0 + +

ceiling of pi = 4.0
ceiling of -16.315 = -16.0

@@ -2112,8 +2112,8 @@ *=ph_floor=*

Produces the largest integer value less than or equal to the one given. Examples:

- -

floor of pi = 3.0 + +

floor of pi = 3.0
floor of -16.315 = -17.0

@@ -2124,8 +2124,8 @@ *=ph_absolutevalue=*

Removes the sign from a value, leaving positive numbers alone but making negative ones positive. Examples:

- -

absolute value of 62.1 = 62.1 + +

absolute value of 62.1 = 62.1
absolute value of 0 = 0.0
@@ -2139,8 +2139,8 @@ *=ph_reciprocal=*

Calculates 1/x, that is, divides up 1 into this many pieces. Examples:

- -

reciprocal of -2 = -0.5 + +

reciprocal of -2 = -0.5
reciprocal of 0.1 = 10.0
@@ -2154,8 +2154,8 @@ *=ph_power=*

Computes x to the power y. Examples:

- -

2 to the power 4 = 16.0 + +

2 to the power 4 = 16.0
100 to the power 0.5 = 10.0
@@ -2170,8 +2170,8 @@ *=ph_exp=*

Computes e to the given power, where e is the base of natural logarithms. Examples:

- -

exponential of 0 = 1.0 + +

exponential of 0 = 1.0
exponential of 1 = e = 2.7182818
@@ -2187,8 +2187,8 @@ *=ph_logarithmto=*

Finds what power the base would have to be raised to in order to get this value. Examples:

- -

logarithm to base 10 of 1000000 = 6.0 + +

logarithm to base 10 of 1000000 = 6.0
logarithm to base 10 of 350 = 2.54407
@@ -2201,8 +2201,8 @@ *=ph_logarithm=*

Finds what power e would have to be raised to in order to get this value. Examples:

- -

logarithm of e = 1.0 + +

logarithm of e = 1.0
logarithm of 1 = 0.0
@@ -2217,8 +2217,8 @@ *=ph_degrees=*

Inform measures angles in radians, a convention in which the angle for a half circle is pi, and a right angle is pi divided by 2. This is better from a mathematical point of view, but in practice most people think about angles using degree , where 180 degrees is a half-circle and a right angle is 90 degrees. This phrase helps with that by converting from degrees to radians: in other words, it multiplies by 0.0174532925, since that's roughly 1/180th of pi. Examples:

- -

sine of 90 degrees = 0.0 + +

sine of 90 degrees = 0.0
cosine of 60 degrees = 0.5

@@ -2228,8 +2228,8 @@ *=ph_sine=*

The length of the upright of a right-angled triangle with this angle and a hypotenuse of length 1, where angle is measured in radians. Examples:

- -

sine of 0 = 0 + +

sine of 0 = 0
sine of 45 degrees = 0.70711
@@ -2245,8 +2245,8 @@ *=ph_cosine=*

The length of the base of a right-angled triangle with this angle and a hypotenuse of length 1, where angle is measured in radians. Examples:

- -

cosine of 0 = 1.0 + +

cosine of 0 = 1.0
cosine of 45 degrees = 0.70711
@@ -2262,8 +2262,8 @@ *=ph_tangent=*

The ratio of the upright length to the base length in a right-angled triangle with this angle and a hypotenuse of length 1, where angle is measured in radians. Examples:

- -

tangent of 0 = 0.0 + +

tangent of 0 = 0.0
tangent of 45 degrees = 1.0
@@ -2313,8 +2313,8 @@ *=ph_total=*

This phrase produces the total of some property held by all of the values matching the description. A problem message is produced if the values in question can't have that property ("the total carrying capacity of scenes"), or if it holds a kind of value which can't meaningfully be ad ed up ("the total description of open doors"). Example:

- -

total carrying capacity of people in the Deep Pool + +

total carrying capacity of people in the Deep Pool

@@ -2322,14 +2322,14 @@ *=ph_letequation=*

This phrase creates a new temporary variable, starting it with the value found by solving the given equation. The variable lasts only for the present block of phrases, which certainly means that it lasts only for the current rule. Example:

- -

let F be given by Newton's Second Law where a is the acceleration due to gravity; + +

let F be given by Newton's Second Law where a is the acceleration due to gravity;

There is also a more compact syntax, giving the equation explicitly:

- -

let KE be given by KE = mv^2/2 where KE is an energy; + +

let KE be given by KE = mv^2/2 where KE is an energy;

@@ -2337,8 +2337,8 @@ *=ph_numrows=*

This phrase produces the number of rows (including any blank rows) in the given table. Example:

- -

number of rows in the Table of Selected Elements + +

number of rows in the Table of Selected Elements

@@ -2362,8 +2362,8 @@ *=ph_chooserow=*

This phrase selects the row with the given number. Row numbers in a table start from 1, so

- -

choose row 1 from the Table of Recent Monarchs + +

choose row 1 from the Table of Recent Monarchs

@@ -2372,8 +2372,8 @@ *=ph_chooserowwith=*

This phrase selects the first row, working down from the top of the given table, in which the given column has the given value. Example:

- -

choose row with a name of "Victoria" in the Table of Recent Monarchs; + +

choose row with a name of "Victoria" in the Table of Recent Monarchs;

@@ -2386,8 +2386,8 @@ *=ph_repeattable=*

This phrase causes the block of phrases following it to be repeated once for each row in the given table, choosing each row in turn, from top to bottom. Blank rows are skipped. Example:

- -

To list the succession: + +

To list the succession:
    say "The Succession List runs as follows...";
@@ -2405,8 +2405,8 @@ *=ph_repeattablecol=*

This phrase causes the block of phrases following it to be repeated once for each row in the given table, choosing each row in turn, in order of the values in the given column. Blank rows are skipped. Example:

- -

repeat through the Table of Recent Monarchs in name order: ... + +

repeat through the Table of Recent Monarchs in name order: ...
repeat through the Table of Recent Monarchs in accession order: ...

@@ -2417,8 +2417,8 @@ *=ph_repeattablecolreverse=*

This phrase causes the block of phrases following it to be repeated once for each row in the given table, choosing each row in turn, in order of the values in the given column. Blank rows are skipped. Example:

- -

repeat through the Table of Recent Monarchs in reverse name order: ... + +

repeat through the Table of Recent Monarchs in reverse name order: ...
repeat through the Table of Recent Monarchs in reverse accession order: ...

@@ -2429,8 +2429,8 @@ *=ph_thereis=*

This condition is true if the entry referred to exists, that is, that is, the space for it in the table is not blank. Examples:

- -

if there is a symbol corresponding to an atomic number of 30 in the Table of Selected Elements ... + +

if there is a symbol corresponding to an atomic number of 30 in the Table of Selected Elements ...
if there is an atomic number in row 2 of the Table of Selected Elements ...

@@ -2440,8 +2440,8 @@ *=ph_thereisno=*

This condition is true if the entry referred to does not exist, that is, the space for it in the table is blank. Examples:

- -

if there is no symbol corresponding to an atomic number of 30 in the Table of Selected Elements ... + +

if there is no symbol corresponding to an atomic number of 30 in the Table of Selected Elements ...
if there is no atomic number in row 2 of the Table of Selected Elements ...

@@ -2451,8 +2451,8 @@ *=ph_chooseblankrow=*

This phrase chooses a row in the given table which is currently blank under every column. A run-time problem message is issued if no rows are blank. Example:

- -

choose a blank row in Table 3; + +

choose a blank row in Table 3;
now element entry is "Fluorine";
@@ -2476,8 +2476,8 @@ *=ph_blankout=*

This phrase replaces the entry referred to with a blank, erasing any value previously stored there. Example:

- -

choose row 1 in the Table of Fish Habitats; + +

choose row 1 in the Table of Fish Habitats;
blank out the salinity entry;

@@ -2487,8 +2487,8 @@ *=ph_blankoutrow=*

This phrase replaces the currently chosen row with blanks, erasing any value previously stored under any of the columns. Example:

- -

choose row 1 in the Table of Fish Habitats; + +

choose row 1 in the Table of Fish Habitats;
blank out the whole row;

@@ -2498,8 +2498,8 @@ *=ph_blankoutcol=*

This phrase replaces the currently chosen column with blanks, erasing any value previously stored in any of the rows. Example:

- -

blank out the whole salinity column in the Table of Fish Habitats; + +

blank out the whole salinity column in the Table of Fish Habitats;

@@ -2507,8 +2507,8 @@ *=ph_blankouttable=*

This phrase replaces every row of the currently chosen table with blanks, erasing any value previously stored anywhere in it. Example:

- -

blank out the whole of the Table of Fish Habitats; + +

blank out the whole of the Table of Fish Habitats;

@@ -2517,8 +2517,8 @@ *=ph_sortrandom=*

This phrase rearranges the rows of the given table so that the non-blank rows occur at the top, in a uniformly random order, and any blank rows at the bottom. Example:

- -

sort the Table of Recent Monarchs in random order; + +

sort the Table of Recent Monarchs in random order;

@@ -2526,8 +2526,8 @@ *=ph_sortcolumn=*

This phrase rearranges the rows of the given table so that the non-blank rows occur at the top, so that the given column has ascending order, and any blank rows at the bottom. Example:

- -

sort the Table of Recent Monarchs in accession order; + +

sort the Table of Recent Monarchs in accession order;

@@ -2536,8 +2536,8 @@ *=ph_sortcolumnreverse=*

This phrase rearranges the rows of the given table so that the non-blank rows occur at the top, so that the given column has descending order, and any blank rows at the bottom. Example:

- -

sort the Table of Recent Monarchs in reverse name order; + +

sort the Table of Recent Monarchs in reverse name order;

@@ -2546,8 +2546,8 @@ *=ph_setpronouns=*

This phrase adjusts the meaning of pronouns like IT, HIM, HER and THEM in the command parser as if the object mentioned has become the subject of conversation. Example: the combination of

- -

set pronouns from the key; + +

set pronouns from the key;
set pronouns from Bunny;

@@ -2566,8 +2566,8 @@ *=ph_carryout=*

This phrase carries out the given activity, which must be one not applying to any value. Example:

- -

carry out the assaying activity; + +

carry out the assaying activity;

@@ -2575,8 +2575,8 @@ *=ph_carryoutwith=*

This phrase carries out the given activity, which must apply to a kind of value matching the one supplied. Example:

- -

carry out the analysing activity with the pitchblende; + +

carry out the analysing activity with the pitchblende;
carry out the announcing activity with the score;

@@ -2590,8 +2590,8 @@ *=ph_beginactivity=*

This phrase causes the named activity to become active, and runs its "before" rulebook. The activity must be one which applies to nothing. Example:

- -

begin the assaying activity; + +

begin the assaying activity;

@@ -2600,8 +2600,8 @@ *=ph_beginactivitywith=*

This phrase causes the named activity to become active, and runs its "before" rulebook. The activity must be one which applies to a value of a matching kind. Example:

- -

begin the analysing activity with the pitchblende; + +

begin the analysing activity with the pitchblende;

@@ -2610,8 +2610,8 @@ *=ph_endactivity=*

This phrase runs the "after" rulebook of the activity and then causes it to become inactive. The activity must be one which applies to nothing. Example:

- -

end the assaying activity; + +

end the assaying activity;

@@ -2620,8 +2620,8 @@ *=ph_endactivitywith=*

This phrase runs the "after" rulebook of the activity and then causes it to become inactive. The activity must be one which applies to a value of a matching kind. Example:

- -

end the analysing activity with the pitchblende; + +

end the analysing activity with the pitchblende;

@@ -2638,8 +2638,8 @@ *=ph_abandonactivity=*

This phrase ends an activity at once (without consulting any further rulebooks, including its "after" rulebook). It can only be used with an activity which has had its "begin" but not yet its "end" phrase; it is a drastic remedy best taken o ly if it is clear that circumstances have changed so that the activity now seems inappropriate. It must not be used during one of the rules for the activity: it can only be used between the begin and for stages, or between the for and end stages.

- -

abandon the assaying activity; + +

abandon the assaying activity;

@@ -2647,8 +2647,8 @@ *=ph_abandonactivitywith=*

This phrase ends an activity at once (without consulting any further rulebooks, including its "after" rulebook). It can only be used with an activity which has had its "begin" but not yet its "end" phrase; it is a drastic remedy best taken only if it is clear that circumstan es have changed so that the activity now seems inappropriate. It must not be used during one of the rules for the activity: it can only be used between the begin and for stages, or between the for and end stages.

- -

abandon the analysing activity with the pitchblende; + +

abandon the analysing activity with the pitchblende;

@@ -2660,8 +2660,8 @@ *=ph_group=*

This phrase causes the objects described to be listed together in a single item as part of an inventory or room description. The effect is temporary, and the phrase should only be used when this list is imminent. Example:

- -

Utensil is a kind of thing. The knife, the fork and the spoon are utensils. Before listing contents: group utensils together. + +

Utensil is a kind of thing. The knife, the fork and the spoon are utensils. Before listing contents: group utensils together.

@@ -2670,8 +2670,8 @@ *=ph_groupart=*

This phrase causes the objects described to be listed together in a single item as part of an inventory or room description, but giving each individual item its indefinite article. The effect is temporary, and the phrase should only be used when this list is imminent. Example:

- -

Utensil is a kind of thing. The knife, the fork and the spoon are utensils. Before listing contents: group utensils together giving articles. + +

Utensil is a kind of thing. The knife, the fork and the spoon are utensils. Before listing contents: group utensils together giving articles.

@@ -2680,8 +2680,8 @@ *=ph_grouptext=*

This phrase causes the objects described to be listed together in a single item as part of an inventory or room description, summarised with the given text. The effect is temporary, and the phrase should only be used when this list is imminent. Example:

- -

Utensil is a kind of thing. The knife, the fork and the spoon are utensils. Before listing contents: group utensils together as "utensils". + +

Utensil is a kind of thing. The knife, the fork and the spoon are utensils. Before listing contents: group utensils together as "utensils".

@@ -2690,8 +2690,8 @@ *=ph_placeinscope=*

This phrase should only be used in rules for the "deciding the scope of..." activity. It places the given object in scope, making it accessible to the player's commands, regardless of where it is in the model world. Examples:

- -

place the distant volcano in scope; + +

place the distant volcano in scope;
place the lacquered box in scope, but not its contents;

@@ -2702,8 +2702,8 @@ *=ph_placecontentsinscope=*

This phrase should only be used in rules for the "deciding the scope of..." activity. It places the things inside or on top of the given object in scope, making them accessible to the player's commands, but it does nothing to place the object itself in scope. (It ight of course be in scope anyway, and if it is then this phrase won't remove it.) Example:

- -

place the contents of the lacquered box in scope; + +

place the contents of the lacquered box in scope;
place the contents of the Marbled Steps in scope;

@@ -2714,8 +2714,8 @@ *=ph_snippetmatches=*

This condition is true if the given snippet exactly matches the specification. Example:

- -

if the player's command matches "room [number]", ... + +

if the player's command matches "room [number]", ...

@@ -2728,8 +2728,8 @@ *=ph_snippetincludes=*

This condition is true if the given snippet includes words matching the specification, either at the beginning, in the middle, or at the end. Example:

- -

if the player's command includes "room [number]", ... + +

if the player's command includes "room [number]", ...

@@ -2746,8 +2746,8 @@ *=ph_replacesnippet=*

This phrase should be used only in "after" rules for the "reading a command" activity; it replaces the snippet of command, usually the "matched text" found immediately before, with the given text. Example:

- -

if the player's command includes "room [number]": + +

if the player's command includes "room [number]":
    replace the matched text with "office".

@@ -2757,8 +2757,8 @@ *=ph_cutsnippet=*

This phrase should be used only in "after" rules for the "reading a command" activity; it removes the snippet of command. Example:

- -

if the player's command includes "or else": + +

if the player's command includes "or else":
    cut the matched text.

@@ -2768,8 +2768,8 @@ *=ph_changecommand=*

This phrase should be used only in "after" rules for the "reading a command" activity; it replaces the current command text entirely. Example:

- -

After reading a command: + +

After reading a command:
    let T be "[the player's command]";
@@ -2788,8 +2788,8 @@ *=ph_follow=*

This phrase causes the rule to be obeyed immediately (rather than simply at predetermined times such as when a particular action is being tried, or at the end of every turn, and such). Example:

- -

follow the advance time rule; + +

follow the advance time rule;
follow the appraisal rulebook;

@@ -2799,8 +2799,8 @@ *=ph_followfor=*

This phrase causes the rule to be obeyed immediately (rather than simply at predetermined times such as when a particular action is being tried, or at the end of every turn, and such), and applies it to the value given, which must be of a matching kind. Example:

- -

follow the reaching inside rulebook for the electrified cage; + +

follow the reaching inside rulebook for the electrified cage;

@@ -2820,8 +2820,8 @@ *=ph_succeeded=*

This condition is true if the most recently followed rule or rulebook ended in success. Example:

- -

follow the hypothetical clever rule; + +

follow the hypothetical clever rule;
if rule succeeded:
@@ -2833,8 +2833,8 @@ *=ph_failed=*

This condition is true if the most recently followed rule or rulebook ended in failure. Example:

- -

follow the hypothetical clever rule; + +

follow the hypothetical clever rule;
if rule failed:
@@ -2847,8 +2847,8 @@ *=ph_rulebookoutcome=*

This phrase produces the (named) outcome of the phrase most recently followed. Example:

- -

follow the audibility rules; + +

follow the audibility rules;
if the outcome of the rulebook is the absolute silence outcome:
@@ -2872,8 +2872,8 @@ *=ph_abide=*

This phrase applies the given rule, and makes its result the result of the present rule. If the rule being abided by succeeds or fails then the original rule also stops, at once and without going on to any further i structions. Example:

- -

The omnibus rule: + +

The omnibus rule:
    abide by the first rule;
@@ -2898,8 +2898,8 @@ *=ph_charnum=*

This phrase produces the Nth character from the text, counting from 1. Characters include letters, digits, punctuation symbols, spaces or other letter-forms. Example:

- -

character number 8 in "numberless projects of social reform" + +

character number 8 in "numberless projects of social reform"

@@ -2908,8 +2908,8 @@ *=ph_numchars=*

This phrase produces the number of characters from the text. Characters include letters, digits, punctuation symbols, spaces or other letter-forms. Examples:

- -

number of characters in "War and Peace" + +

number of characters in "War and Peace"
number of characters in ""

@@ -2920,8 +2920,8 @@ *=ph_wordnum=*

This phrase produces the Nth word from the text, counting from 1. Words for this purpose are what's left after breaking the text up at punctuation or spacing (spaces, line breaks, paragraph breaks) and then removing that punctuation or spacing. Exa ple:

- -

word number 3 in "ice-hot, don't you think?" + +

word number 3 in "ice-hot, don't you think?"

@@ -2930,8 +2930,8 @@ *=ph_numwords=*

This phrase produces the number of words from the text. Words for this purpose are what's left after breaking the text up at punctuation or spacing (spaces, line breaks, paragraph breaks) and then removing that punctuation or spacing. Exam le:

- -

number of words in "ice-hot, don't you think?" + +

number of words in "ice-hot, don't you think?"

@@ -2940,8 +2940,8 @@ *=ph_pwordnum=*

This phrase produces the Nth word from the text, counting from 1. Words for this purpose are what's left after breaking the text up at punctuation or spacing (spaces, line breaks, paragraph breaks) and then removing the spacing, but leaving the punctuation as ndependent words. Example:

- -

punctuated word number 2 in "ice-hot, don't you think?" + +

punctuated word number 2 in "ice-hot, don't you think?"

@@ -2950,8 +2950,8 @@ *=ph_numpwords=*

This phrase produces the number of words from the text. Words for this purpose are what's left after breaking the text up at punctuation or spacing (spaces, line breaks, paragraph breaks) and then removing the spacing, but leaving the punctuation as i dependent words. Example:

- -

number of punctuated words in "ice-hot, don't you think?" + +

number of punctuated words in "ice-hot, don't you think?"

@@ -2960,8 +2960,8 @@ *=ph_upwordnum=*

This phrase produces the Nth word from the text, counting from 1. Words for this purpose are what's left after breaking the text up at spacing (spaces, line breaks, paragraph breaks) but including all punctuation as if it were part of the spelling of the words it joins to. Example:

- -

unpunctuated word number 1 in "ice-hot, don't you think?" + +

unpunctuated word number 1 in "ice-hot, don't you think?"

@@ -2970,8 +2970,8 @@ *=ph_numupwords=*

This phrase produces the number of words from the text. Words for this purpose are what's left after breaking the text up at spacing (spaces, line breaks, paragraph breaks) but including all punctuation as if it were part of the spelling of the words it oins to. Example:

- -

number of unpunctuated words in "ice-hot, don't you think?" + +

number of unpunctuated words in "ice-hot, don't you think?"

@@ -2984,8 +2984,8 @@ *=ph_numlines=*

This phrase produces the number of lines in the text. Unless explicit use is made of line-breaking, lines and paragraphs will be the same - it doesn't refer to lines as visible on screen, because we have no way of knowing what size screen he player might have. Example: the number of lines in

- -

"Sensational news just in![paragraph break]The Martians have invaded Miranda.[line break](One of the moons of Uranus, that is.)" + +

"Sensational news just in![paragraph break]The Martians have invaded Miranda.[line break](One of the moons of Uranus, that is.)"

@@ -2998,8 +2998,8 @@ *=ph_numparas=*

This phrase produces the number of paragraphs in the text. Example: the number of paragraphs in

- -

"Sensational news just in![paragraph break]The Martians have invaded Miranda.[line break](One of the moons of Uranus, that is.)" + +

"Sensational news just in![paragraph break]The Martians have invaded Miranda.[line break](One of the moons of Uranus, that is.)"

@@ -3016,8 +3016,8 @@ *=ph_lowercase=*

This phrase produces a new version of the given text, but with all upper case letters reduced to lower case. Example: "a ticket to Tromsø via Østfold" becomes

- -

"a ticket to tromsø via østfold" + +

"a ticket to tromsø via østfold"

@@ -3025,8 +3025,8 @@ *=ph_uppercase=*

This phrase produces a new version of the given text, but with all upper case letters reduced to lower case. Example: "a ticket to Tromsø via Østfold" becomes

- -

"A TICKET TO TROMSØ VIA ØSTFOLD" + +

"A TICKET TO TROMSØ VIA ØSTFOLD"

@@ -3034,8 +3034,8 @@ *=ph_titlecase=*

This phrase produces a new version of the given text, but with casing of words changed to title casing: this capitalises the first letter of each word, and lowers the rest. Example: "a ticket to Tromsø via Østfold" becomes

- -

"A Ticket To Tromsø Via Østfold" + +

"A Ticket To Tromsø Via Østfold"

@@ -3043,8 +3043,8 @@ *=ph_sentencecase=*

This phrase produces a new version of the given text, but with casing of words changed to sentence casing: this capitalises the first letter of each sentence and reduces the rest to lower case. Example: "a ticket to Tromsø via Østfold" bec mes

- -

"A ticket to tromsø via østfold" + +

"A ticket to tromsø via østfold"

@@ -3052,20 +3052,20 @@ *=ph_matches=*

This condition is true if the second text occurs anywhere inside the first. Examples:

- -

if "[score]" matches the text "3", ... + +

if "[score]" matches the text "3", ...

tests whether the digit 3 occurs anywhere in the score, as printed out; and

- -

if the printed name of the location matches the text "the", ... + +

if the printed name of the location matches the text "the", ...

tests to see whether "the" can be found anywhere in the current room's name. Note that the location "Smotheringly Hot Jungle" would pass this test - it's there if you look. On the other hand, "The Orangery" would not, because "The" does not match against "the". We can get around this in a variety of ways, one of which is to tell Inform to be insensitive to the case (upper or lower) of letters:

- -

if the printed name of the location matches the text "the", case insensitively: ... + +

if the printed name of the location matches the text "the", case insensitively: ...

@@ -3073,14 +3073,14 @@ *=ph_exactlymatches=*

This condition is true if the second text matches the first, starting at the beginning and finishing at the end. This appears to be the same as testing if one is equal to the other, but that's not quite true: for example,

- -

if "[score]" exactly matches the text "[best score]", ... + +

if "[score]" exactly matches the text "[best score]", ...

is true if the score and best score currently print out as the same text, which will be true if they are currently equal as numbers; but

- -

if "[score]" is "[best score]", ... + +

if "[score]" is "[best score]", ...

@@ -3089,8 +3089,8 @@ *=ph_nummatches=*

This produces the number of times the second text occurs within the first. The matches are not allowed to overlap. Example:

- -

number of times "pell-mell sally" matches the text "ll" = 3 + +

number of times "pell-mell sally" matches the text "ll" = 3
number of times "xyzzy" matches the text "Z" = 0
@@ -3104,8 +3104,8 @@ *=ph_matchesre=*

This condition is true if any contiguous part of the text can be matched against the given regular expression. Examples:

- -

if "taramasalata" matches the regular expression "a.*l", ... + +

if "taramasalata" matches the regular expression "a.*l", ...

@@ -3122,8 +3122,8 @@ *=ph_matchtext=*

This phrase is only meaningful immediately after a successful match of a regular expression against text, and it produces the text which matched. Example:

- -

if "taramasalata" matches the regular expression "m.*l": + +

if "taramasalata" matches the regular expression "m.*l":
    say "[text matching regular expression].";

@@ -3134,8 +3134,8 @@ *=ph_subexpressiontext=*

This phrase is only meaningful immediately after a successful match of a regular expression against text, and it produces the text which matched. The number must be from 1 to 9, and must correspond to one of the bracketed groups in the expression just match d. Example: after

- -

if "taramasalata" matches the regular expression "a(r.*l)a(.)": + +

if "taramasalata" matches the regular expression "a(r.*l)a(.)":

@@ -3144,14 +3144,14 @@ *=ph_subform=*

This takes a text and makes substitution occur immediately. For example,

- -

substituted form of "time of death, [time of day]" + +

substituted form of "time of death, [time of day]"

produces something like "time of death, 9:15 AM" rather than "time of death, [time of day]". It's entirely legal to apply this to text which never had any substitutions in, so

- -

substituted form of "balloon" + +

substituted form of "balloon"

@@ -3160,8 +3160,8 @@ *=ph_replacechar=*

This phrase acts on the named text by placing the given text in place of the Nth character, counting from 1. Example:

- -

let V be "mope"; + +

let V be "mope";
replace character number 3 in V with "lecul";
@@ -3174,8 +3174,8 @@ *=ph_replaceword=*

This phrase acts on the named text by placing the given text in place of the Nth word, counting from 1, and dividing words at spacing or punctuation. Example:

- -

let V be "Does the well run dry?"; + +

let V be "Does the well run dry?";
replace word number 3 in V with "jogger";
@@ -3188,8 +3188,8 @@ *=ph_replacepword=*

This phrase acts on the named text by placing the given text in place of the Nth word, counting from 1, and dividing words at spacing, counting punctuation runs as words in their own right. Example:

- -

let V be "Frankly, yes, I agree."; + +

let V be "Frankly, yes, I agree.";
replace punctuated word number 2 in V with ":";
@@ -3202,8 +3202,8 @@ *=ph_replaceupword=*

This phrase acts on the named text by placing the given text in place of the Nth word, counting from 1, and dividing words at spacing, counting punctuation as part of a word just as if it were lettering. Example:

- -

let V be "Frankly, yes, I agree."; + +

let V be "Frankly, yes, I agree.";
replace unpunctuated word number 2 in V with "of course";
@@ -3224,8 +3224,8 @@ *=ph_replace=*

This phrase acts on the named text by searching and replacing, as many non-overlapping times as possible. Example:

- -

replace the text "a" in V with "z" + +

replace the text "a" in V with "z"

@@ -3234,8 +3234,8 @@ *=ph_replacewordin=*

This phrase acts on the named text by searching and replacing, as many non-overlapping times as possible, where the search text must occur as a whole word. Example:

- -

replace the word "Bob" in V with "Robert" + +

replace the word "Bob" in V with "Robert"

@@ -3248,28 +3248,28 @@ *=ph_replacere=*

This phrase acts on the named text by matching the regular expression and replacing anything which fits it, as many non-overlapping times as possible. Example:

- -

replace the regular expression "\d+" in V with "..." + +

replace the regular expression "\d+" in V with "..."

changes "The Battle of Waterloo, 1815, rivalled Trafalgar, 1805" to "The Battle of Waterloo, ..., rivalled Trafalgar, ...". The "case insensitively" causes lower and upper case letters to be treated as if the same letter.

When replacing a regular expression, the replacement text also has a few special meanings (though, thankfully, many fewer than for the expression itself). Once again "\n" and "\t" can be used for line break and tab characters, and "\\" must be used for an actual backslash. But, very usefully, "\1" to "\9" expand as the contents of groups numbered 1 to 9, and "\0" to the exact text matched. So:

- -

replace the regular expression "\d+" in V with "roughly \0" + +

replace the regular expression "\d+" in V with "roughly \0"

adds the word "roughly" in front of any run of digits in V, because \0 becomes in turn whichever run of digits matched. And

- -

replace the regular expression "(\w+) (.*)" in V with "\2, \1" + +

replace the regular expression "(\w+) (.*)" in V with "\2, \1"

performs the transformation "Frank Booth" to "Booth, Frank".

Finally, prefixing the number by "l" or "u" forces the text it represents into lower or upper case, respectively. For instance:

- -

replace the regular expression "\b(\w)(\w*)" in X with "\u1\l2"; + +

replace the regular expression "\b(\w)(\w*)" in X with "\u1\l2";

@@ -3278,8 +3278,8 @@ *=phs_listbraced=*

This text substitution produces the list in the form of "{", then a comma-separated list, and then "}", which looks less like an English sentence but more mathematical. Example:

- -

"[list of people in brace notation]" + +

"[list of people in brace notation]"

@@ -3288,8 +3288,8 @@ *=phs_listdef=*

This text substitution writes out the list in sentence form, adding the appropriate definite articles. Example:

- -

let L be {the piano, the music stand}; + +

let L be {the piano, the music stand};
say "[L with definite articles]";

@@ -3300,8 +3300,8 @@ *=phs_listindef=*

This text substitution writes out the list in sentence form, adding the appropriate indefinite articles. Example:

- -

let L be {the piano, the music stand}; + +

let L be {the piano, the music stand};
say "[L with definite articles]";

@@ -3320,8 +3320,8 @@ *=ph_repeatlist=*

This phrase causes the block of phrases following it to be repeated once for each item in the given list, storing that value in the named variable. (The variable exists only temporarily, within the repetition.) Example:

- -

let L be {2, 3, 5, 7, 11, 13, 17, 19}; + +

let L be {2, 3, 5, 7, 11, 13, 17, 19};
repeat with prime running through L:
@@ -3334,16 +3334,16 @@ *=ph_addtolist=*

This phrase adds the given value to the end of the list. Example:

- -

let L be {60, 168}; + +

let L be {60, 168};
add 360 to L;

results in L being {60, 168, 360}. Note that the value is added even if it already occurs somewhere in L; this can be avoided with "if absent". So:

- -

add 168 to L, if absent; + +

add 168 to L, if absent;

@@ -3352,8 +3352,8 @@ *=ph_addlisttolist=*

This phrase adds the first list to the end of the second. Example:

- -

let L be {2, 3, 5, 7}; + +

let L be {2, 3, 5, 7};
add {11, 13, 17, 19} to L;

@@ -3364,8 +3364,8 @@ *=ph_addatentry=*

This phrase adds the given value so that it becomes the entry with that index number in the list. Example:

- -

let L be {1, 2, 3, 4, 8, 24}; + +

let L be {1, 2, 3, 4, 8, 24};
add 12 at entry 6 in L;

@@ -3376,8 +3376,8 @@ *=ph_addlistatentry=*

This phrase adds the first list to the second so that it begins at the given position. Example:

- -

let L be {1, 2, 3, 4}; + +

let L be {1, 2, 3, 4};
add {4, 8, 12} at entry 3 in L;

@@ -3388,8 +3388,8 @@ *=ph_remfromlist=*

This phrase removes every instance of the given value from the list. Example:

- -

let L be {3, 1, 4, 1, 5, 9, 2, 6, 5, 3}; + +

let L be {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
remove 1 from L;

@@ -3400,8 +3400,8 @@ *=ph_remlistfromlist=*

This phrase removes every instance of any value in the first list from the second. Example:

- -

let L be {3, 1, 4, 1, 5, 9, 2, 6, 5, 3}; + +

let L be {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
remove {0, 2, 4, 6, 8} from L;

@@ -3412,8 +3412,8 @@ *=ph_rementry=*

This phrase removes the entry at the given position, counting from 1 as the first entry. (Once it is removed, the other entries shuffle down.) Example:

- -

let L be {3, 1, 4, 1, 5, 9, 2, 6, 5, 3}; + +

let L be {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
remove entry 3 from L;

@@ -3424,8 +3424,8 @@ *=ph_rementries=*

This phrase removes the entries at the given range of positions, counting from 1 as the first entry. (Once they are removed, the other entries shuffle down.) Example:

- -

let L be {3, 1, 4, 1, 5, 9, 2, 6, 5, 3}; + +

let L be {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
remove entries 3 to 6 from L;

@@ -3440,8 +3440,8 @@ *=ph_reverselist=*

This phrase puts the list in reverse order. The old entry 1 becomes the new last entry, and so on: reversing an empty list or a list containing only one entry leaves it unchanged. Example:

- -

let L be {11, 12, 14, 15, 16, 17}; + +

let L be {11, 12, 14, 15, 16, 17};
reverse L;

@@ -3452,8 +3452,8 @@ *=ph_sortlist=*

This phrase puts the list into ascending order. Example:

- -

let L be {6 PM, 11:13 AM, 4:21 PM, 9:01 AM}; + +

let L be {6 PM, 11:13 AM, 4:21 PM, 9:01 AM};
sort L;

@@ -3464,8 +3464,8 @@ *=ph_sortlistreverse=*

This phrase puts the list into descending order. Example:

- -

let L be {6 PM, 11:13 AM, 4:21 PM, 9:01 AM}; + +

let L be {6 PM, 11:13 AM, 4:21 PM, 9:01 AM};
sort L in reverse order;

@@ -3476,8 +3476,8 @@ *=ph_sortlistrandom=*

This phrase puts the list into a uniformly random order, shuffling it as if it were a pack of cards. Example:

- -

let L be {1, 2, 3, 4, 5, 6}; + +

let L be {1, 2, 3, 4, 5, 6};
sort L in random order;

@@ -3488,8 +3488,8 @@ *=ph_sortlistproperty=*

This phrase puts the list into ascending order of the values of the given property for the items in the list; this is only allowed if all of those values do have the property in question. Example:

- -

let L be the list of people; + +

let L be the list of people;
sort L in carrying capacity order;

@@ -3500,8 +3500,8 @@ *=ph_sortlistpropertyreverse=*

This phrase puts the list into descending order of the values of the given property for the items in the list; this is only allowed if all of those values do have the property in question. Example:

- -

let L be the list of people; + +

let L be the list of people;
sort L in reverse carrying capacity order;

@@ -3512,8 +3512,8 @@ *=ph_rotatelist=*

This phrase shuffles the entries of the list forwards (to the right) by one place, so that the 1st becomes 2nd, the 2nd becomes 3rd, and so on until the last, which becomes the new first entry. Example:

- -

let L be { "cow", "heifer", "bullock" }; + +

let L be { "cow", "heifer", "bullock" };
rotate L;

@@ -3524,8 +3524,8 @@ *=ph_rotatelistback=*

This phrase shuffles the entries of the list backwards (to the left) by one place, so that the 3rd becomes 2nd, the 2nd becomes 1st, and so on; the previous 1st entry becomes the new last entry. Example:

- -

let L be { "cow", "heifer", "bullock" }; + +

let L be { "cow", "heifer", "bullock" };
rotate L backwards;

@@ -3536,8 +3536,8 @@ *=ph_numberentries=*

This phrase produces the number of positions in the list. Example:

- -

the number of entries in {1, 1, 1, 3, 1} + +

the number of entries in {1, 1, 1, 3, 1}

@@ -3546,8 +3546,8 @@ *=ph_changelength=*

This phrase alters the given list so that it now has exactly the number of entries given. Example:

- -

change L to have 21 entries; + +

change L to have 21 entries;

@@ -3556,14 +3556,14 @@ *=ph_truncate=*

This phrase alters the given list so that it now has no more than the number of entries given. Example:

- -

truncate L to 8 entries; + +

truncate L to 8 entries;

shortens L to length 8 if it is currently longer than that, trimming entries from the end, but would (for instance) leave a list of length 3 unchanged. Note that

- -

truncate L to 0 entries; + +

truncate L to 0 entries;

@@ -3572,8 +3572,8 @@ *=ph_truncatefirst=*

This phrase alters the given list so that it now consists only of the initial part of the list with the given length. Example:

- -

truncate L to the first 4 entries; + +

truncate L to the first 4 entries;

@@ -3582,8 +3582,8 @@ *=ph_truncatelast=*

This phrase alters the given list so that it now consists only of the final part of the list with the given length. Example:

- -

truncate L to the last 4 entries; + +

truncate L to the last 4 entries;

@@ -3592,8 +3592,8 @@ *=ph_extend=*

This phrase pads out the list with default values as needed so that it now has at least the given length. (If the list is already at least that length, nothing is done.) Example:

- -

extend L to 80 entries; + +

extend L to 80 entries;

@@ -3602,14 +3602,14 @@ *=ph_valuematch=*

This condition is true if the value matches the description; the kinds must be compatible, or Inform will issue a problem message. There is no point using this for cases where the description is given explicitly:

- -

if 4 matches even numbers, ... + +

if 4 matches even numbers, ...

because it is easier to write just:

- -

if 4 is an even number, ... + +

if 4 is an even number, ...

@@ -3650,16 +3650,16 @@ *=ph_appliedlist=*

This phrase takes the list, applies the phrase to each entry in the list, and forms a new list of the result. Example:

- -

To decide what number is double (N - a number) (this is doubling): + +

To decide what number is double (N - a number) (this is doubling):
    decide on N plus N.

Then "doubling applied to 2" produces 4, by the simpler definition of "applied to", but also:

- -

doubling applied to {2, 3, 4} + +

doubling applied to {2, 3, 4}

@@ -3668,8 +3668,8 @@ *=ph_filter=*

This phrase produces a new list which is a thinner version of the one given, so that it contains only those values which match the description given. Example:

- -

filter to even numbers of {3, 8, 4, 19, 7} + +

filter to even numbers of {3, 8, 4, 19, 7}

@@ -3678,8 +3678,8 @@ *=ph_reduction=*

This phrase works through the list and accumulates the values in it, using the phrase supplied. Example: if we have

- -

To decide what number is the sum of (N - number) and (M - number) + +

To decide what number is the sum of (N - number) and (M - number)
    (this is summing):
@@ -3688,8 +3688,8 @@

then the summing reduction of {3, 8, 4, 19, 7} is the number 41, obtained by

- -

(((3 + 8) + 4) + 19) + 7 + +

(((3 + 8) + 4) + 19) + 7

@@ -3698,8 +3698,8 @@ *=ph_displayfigure=*

This phrase causes the figure to be displayed in a way visible to the player. If the option "one time only" is used, it will have no effect if the figure has been displayed before. Example:

- -

display the Figure of Woodlands; + +

display the Figure of Woodlands;

@@ -3707,8 +3707,8 @@ *=ph_playsf=*

This phrase causes the sound effect to be played. If the option "one time only" is used, it will have no effect if the sound effect has been played before. Example:

- -

play the sound of rustling leaves; + +

play the sound of rustling leaves;

@@ -3724,8 +3724,8 @@ *=ph_writetable=*

This phrase causes the entire contents of the given table to be written out to the given file. Note that files must have been declared, and must be referred to by their Inform names, not by textual filenames. Example:

- -

write File of Glaciation Data from the Table of Antarctic Reserves + +

write File of Glaciation Data from the Table of Antarctic Reserves

@@ -3734,8 +3734,8 @@ *=ph_readtable=*

This phrase causes the entire contents of the given table to be read in from the given file. Note that files must have been declared, and must be referred to by their Inform names, not by textual filenames. Example:

- -

read File of Glaciation Data into the Table of Antarctic Reserves + +

read File of Glaciation Data into the Table of Antarctic Reserves

@@ -3744,14 +3744,14 @@ *=ph_fileexists=*

This condition is true if the file-system used by the player appears to contain a file with the right name. For example, if we declared:

- -

The binary File of Glaciation Data is called "icedata". + +

The binary File of Glaciation Data is called "icedata".

and then tested

- -

if the File of Glaciation Data exists, ... + +

if the File of Glaciation Data exists, ...

@@ -3760,8 +3760,8 @@ *=ph_writetext=*

This phrase makes the given text become the entire contents of the named file. Note that files must have been declared, and must be referred to by their Inform names, not by textual filenames. Example:

- -

write "Jackdaws love my big sphinx of quartz." to the file of Abecedary Wisdom; + +

write "Jackdaws love my big sphinx of quartz." to the file of Abecedary Wisdom;

@@ -3769,8 +3769,8 @@ *=ph_appendtext=*

This phrase adds the given text to the end of the current contents of the named file (creating it if it does not exist on disc). Note that files must have been declared, and must be referred to by their Inform names, not by textual filenames. E ample:

- -

append "Jinxed wizards pluck ivy from the big quilt." to the file of Abecedary Wisdom; + +

append "Jinxed wizards pluck ivy from the big quilt." to the file of Abecedary Wisdom;

@@ -3778,8 +3778,8 @@ *=ph_saytext=*

This text expands to the contents of the named file. Note that files must have been declared, and must be referred to by their Inform names, not by textual filenames. Example:

- -

"[text of the File of Abecedary Wisdom]" + +

"[text of the File of Abecedary Wisdom]"

@@ -3787,8 +3787,8 @@ *=ph_fileready=*

This condition is true if the file exists and is marked as being ready to read; that is, it is not in a state where another program is currently writing it. Example:

- -

if ready to read the file of Invariants, ... + +

if ready to read the file of Invariants, ...

@@ -3796,8 +3796,8 @@ *=ph_markfileready=*

This phrase marks that we have finished writing to the given file, so that any external program is welcome to read it now. Example:

- -

mark the file of Invariants as ready to read; + +

mark the file of Invariants as ready to read;

@@ -3805,8 +3805,8 @@ *=ph_markfilenotready=*

This phrase marks that we are about to start writing to the given file, so that any external program should wait until we're finished if it wants to read the file. Example:

- -

mark the file of Invariants as not ready to read; + +

mark the file of Invariants as not ready to read;

diff --git a/inform/StagingArea/Contents/Resources/en.lproj/AdviceCredits.html b/inform/StagingArea/Contents/Resources/en.lproj/AdviceCredits.html new file mode 100644 index 00000000..24d99a4c --- /dev/null +++ b/inform/StagingArea/Contents/Resources/en.lproj/AdviceCredits.html @@ -0,0 +1,892 @@ + + + + + +Credits + + +

Credits

+

Inform is a team effort kept alive by the enthusiasm of a community of writers.

+

The core software is by Graham Nelson, and the Examples and much of the design by Emily Short, with advice from Andrew Plotkin and others.

+

The Mac OS X application was originally written by Andrew Hunter, and was rewritten in 2014 by Toby Nelson, building on Andrew's foundations. Corresponding apps for Windows and Linux are by David Kinder and Philip Chimento, and command-line tools for Linux, on a variety of processors, are maintained by Adam Thornton. David also maintains the Inform 6 code base, now used as a code-generator within Inform 7.

+

Many people have generously shared their Extensions to Inform, and they're credited individually. But special thanks are due to Mark Musante, Zed Lopez, Dannii Willis, Erik Temple, Aaron Reed, Ron Newcomb, Eric Eve and Juhana Leinonen for work on the Public Library and elsewhere.

+

Literally thousands of people have filed bug reports or suggestions over the years. If you're one of them, sincere thanks to YOUR NAME HERE. Inform would never have got this far without you.

+

The Interactive Fiction Technology Foundation (IFTF), a non-profit +organisation working on behalf of the community, has done an enormous +amount to bring people and resources together. Inform is not strictly +speaking an IFTF project, but if you like using Inform and would +like to make a donation to help things along, please donate to IFTF.

+
+ + + diff --git a/inform/StagingArea/Contents/Resources/en.lproj/AdviceKeyboardShortcuts.html b/inform/StagingArea/Contents/Resources/en.lproj/AdviceKeyboardShortcuts.html new file mode 100644 index 00000000..177104de --- /dev/null +++ b/inform/StagingArea/Contents/Resources/en.lproj/AdviceKeyboardShortcuts.html @@ -0,0 +1,983 @@ + + + + + + +Keyboard Shortcuts + + +

Keyboard Shortcuts

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
⌘LSummon/Dismiss Launcher
 
Projects
⌘OOpen...
⌘NNew Project
⌘WClose Project
⌘RGo
⌥⌘RReplay
⇧⌘RRelease
⌃⌥⌘TGo and then type "Test Me"
⌘IRefresh Index
⌘MOpen Materials Folder in Finder
 
Switching Panes
⌘1Go to Left Pane
⌘2Go to Right Pane
⌥⌘⇥Switch Panes
F1Source
F2Results
F3Story
F4Testing
F5Index
⌘3Index: Welcome Page
⌘4Index: Contents Page
⌘5Index: Actions Page
⌘6Index: Kinds Page
⌘7Index: Phrasebook Page
⌘8Index: Rules Page
⌘9Index: Scenes Page
⌘0Index: World Page
F6Documentation
F7Extensions
F8Settings
 
Within the Source Pane
⇧⌘HShow Headings
⌥⌘.Show Only This Section in Source
⌘>Show More Sections in Source
⌘<Show Fewer Sections in Source
⌥⌘,Show Entire Source
⌘⇞Shift View to Previous Section
⌘⇟Shift View to Next Section
⌥⌘NRenumber All Sections
 
Editing the Source
⌘CCopy
⌘VPaste
⌘XCut
⌘ZUndo
⇧⌘ZRedo
 
⌘ASelect All
⌘]Shift Selection Right
⌘[Shift Selection Left
⌘/Comment Out Selection
⌥⌘/Uncomment Selection
 
⌘:Show Spelling and Grammar
⌘;Check Spelling
 
Find
⌘EFind Selected Text
⌘FFind...
⇧⌘FFind In Files...
⌘GFind Next
⇧⌘GFind Previous
⌘JScroll To Selection
 
Application Control
⌘,(Inform) Preferences
⌘HHide Inform
⌥⌘HHide Others
⌥⌘MMinimize Window
⌘SSave
⇧⌘SSave As...
⌘PPrint
⇧⌘PPage Setup
⌘QQuit
+
+ + + diff --git a/inform/StagingArea/Contents/Resources/en.lproj/AdviceMaterialsFolder.html b/inform/StagingArea/Contents/Resources/en.lproj/AdviceMaterialsFolder.html new file mode 100644 index 00000000..5f8c22ee --- /dev/null +++ b/inform/StagingArea/Contents/Resources/en.lproj/AdviceMaterialsFolder.html @@ -0,0 +1,928 @@ + + + + + + +Materials Folder + + +

Materials Folder

+

Every project has a ".materials" folder, which is always stored next to it on disc. (Use ⌘M to show the current project's .materials in the Finder.) This screenshot shows how the .materials folder would look for a project which used it in every possible way. In practice, this is very unlikely.

+ + + +

Project (1) and .materials folder (2) live side by side in the Finder: everything else here is inside .materials (2). The author of this story decided that it should be given to players along with a PDF booklet (3), by including this Release instruction in the source text: + +

+ Release along with a file of "A Guide to Arboreal Fauna" called "A Guide to Arboreal Fauna.pdf". +
+ +

Every released project needs cover art. Authors have to provide two files, full-sized at 960 by 960 (4) and reduced at 120 by 120 (18): they can either be "Cover.jpg" and "Small Cover.jpg" or "Cover.png" and "Small Cover.png".

+ +

Extensions to Inform are usually centrally installed, and available to all projects. But this project has its own private copy of "Feeding Squirrels by Emily Short" (7), in its own private Extensions folder (5). This would override any installed copy of the same extension. It has to have the correct name and .i7x ending, and it has to live inside a folder with its author's name (6).

+ +

Projects which include pictures as well as text need to store the necessary images, in JPEG or PNG format, in the Figures folder (8). This one was declared in the source text like so:

+ +
+ Figure of Red Admiral Butterfly is the file "butterfly.jpg". +
+ +

Sound effects are similar, use AIFF or OGG format, and live in Sounds (19). There's one here (20), declared by:

+ +
+ Sound of Rustling Leaves is the file "Rustling Leaves.aiff". +
+ +

Projects which read or write files of data as they play should have a Files folder (10) to hold these. This one (11) was declared by: + +

+ The File of Nut Storage Locations is called "nutstorage". +
+ +

Now for some expert-only features which hardly anybody needs in practice. The I6T folder (12) provides extra template files (13), or indeed replacement ones (14), and allows a project to include substantial portions of raw Inform 6 code. The Languages folder (16) is for experimenting with language bundles, a feature still in its early stages. The Templates folder (21) is for providing the project with a non-standard Javascript engine, called an "interpreter", when it's released as a website. Here there's an intepreter called "Experimental" (22) which can be selected by putting this into the source:

+ +
+ Release along with the "Experimental" interpreter. +
+ +

And that just leaves the Release folder (17). Inform creates this automatically if the project's Release button is clicked, and then writes into it whatever will eventually go out to players. So never store anything permanent here: it's intended to be just a holding area. +

+
+ + + diff --git a/inform/StagingArea/Contents/Resources/en.lproj/AdviceNewToInform.html b/inform/StagingArea/Contents/Resources/en.lproj/AdviceNewToInform.html new file mode 100644 index 00000000..6625f753 --- /dev/null +++ b/inform/StagingArea/Contents/Resources/en.lproj/AdviceNewToInform.html @@ -0,0 +1,921 @@ + + + + + +New To Inform? + + +

New To Inform?

+

Inform is both an application and a language for creating text-based +interactive stories. Interactive fiction is an art form which evolved out of the +adventure games of the 1970s, in the same way that today's graphic novels +evolved out of the newspaper cartoons of the 1930s. Inform has been the design +tool of choice for many, indeed most, of the world's leading writers in this +genre since 1993, and is also widely used in education at a variety of levels. +It's completely free, even when used to create commercial works. Thanks for +downloading this copy, and we hope you'll enjoy it.

+ +

As you've seen, the app begins with a launcher panel. (Bring it back or +remove it by typing ⌘L.) You might like to try clicking Onyx, the smallest +of the samples, under the "Open a Sample Project" list: it's a very +short Russian folk-tale. Inform will ask you to choose somewhere on disc to +store it, and then make a copy there. You can play with this and alter it +freely, then throw it away when you're done: it's just a copy.

+ +

You can have several Inform projects open at once, but each one lives in a +single window which is divided in half. The left and right sides are called +"panes" and you can choose what's shown in them with the side tabs: it +starts out as Source on the left, Documentation on the right. (From the +Launcher, you can also save out a copy of the documentation as an EPUB file to +read in iBooks on Mac OS 10.9 or later, or on an iPad.)

+ +

Inform "translates" the instructions in the Source into a playable +story. To see that in action, click the Go button for the Onyx project. You'll +have to wait just a moment - an Inform project is a surprisingly complicated +thing to make, even when the instructions look short - but then the Story pane +will open, and you can type in commands as if you were the player. If you're not +sure what to type, try typing:

+ +
+ TEST ME +
+ +

The Launcher also offers a larger sample project called "Disenchantment +Bay", a story about a boat trip in Alaska. Beyond that, there are around +450 Examples in the Documentation, and by clicking on the "save as +project" icon you can get playable versions of all of those, too.

+ +
+ + + diff --git a/inform/StagingArea/Contents/Resources/en.lproj/AdviceUpgrading.html b/inform/StagingArea/Contents/Resources/en.lproj/AdviceUpgrading.html new file mode 100644 index 00000000..11328ef8 --- /dev/null +++ b/inform/StagingArea/Contents/Resources/en.lproj/AdviceUpgrading.html @@ -0,0 +1,898 @@ + + + + + +Upgrading? + + +

Upgrading?

+ +

Between 2016 and 2022, Inform was rewritten from top to bottom, and prepared +for open-sourcing: that is, for being published as free software which anybody +can inspect, fix bugs in, or contribute to. The software changed enormously +as a result, seen from the inside, but for users it remains almost the same +(except for hundreds of bug fixes).

+ +

There are exceptions to this, however, for users who mix their Inform source +text with low-level I6 code using "Include (- ... -)". Very few users do this +themselves, but it's more common to make use of extensions which do. Quite a +few popular extensions have needed to be rewritten for the version 10 Inform, +and you may therefore need to update your copies of them. The Public Library +in this app may be a good place to start.

+ +

The archive of release notes for Inform, detailing essentially every change +since 2006, can be found at https://github.com/ganelson/inform.

+


+ + + diff --git a/inform/StagingArea/Contents/Resources/en.lproj/Rallegs.html b/inform/StagingArea/Contents/Resources/en.lproj/Rallegs.html index 87efaabe..513ca148 100644 --- a/inform/StagingArea/Contents/Resources/en.lproj/Rallegs.html +++ b/inform/StagingArea/Contents/Resources/en.lproj/Rallegs.html @@ -59,7 +59,7 @@
- WI
+ WI @@ -82,7 +82,7 @@
- WI
+ WI @@ -104,7 +104,7 @@
- WI
+ WI @@ -126,7 +126,7 @@
- WI
+ WI @@ -148,7 +148,7 @@
- WI
+ WI @@ -170,7 +170,7 @@
- WI
+ WI @@ -192,7 +192,7 @@
- WI
+ WI @@ -214,7 +214,7 @@
- WI
+ WI @@ -236,7 +236,7 @@
- WI
+ WI @@ -258,7 +258,7 @@
- WI
+ WI @@ -280,7 +280,7 @@
- WI
+ WI @@ -302,7 +302,7 @@
- WI
+ WI @@ -324,7 +324,7 @@
- WI
+ WI @@ -347,7 +347,7 @@
- WI
+ WI @@ -369,7 +369,7 @@
- WI
+ WI @@ -391,7 +391,7 @@
- WI
+ WI @@ -413,7 +413,7 @@
- WI
+ WI @@ -438,7 +438,7 @@
- WI
+ WI @@ -460,7 +460,7 @@
- WI
+ WI @@ -482,7 +482,7 @@
- WI
+ WI @@ -504,7 +504,7 @@
- WI
+ WI @@ -526,7 +526,7 @@
- WI
+ WI @@ -548,7 +548,7 @@
- WI
+ WI @@ -570,7 +570,7 @@
- WI
+ WI @@ -592,7 +592,7 @@
- WI
+ WI @@ -614,7 +614,7 @@
- WI
+ WI @@ -636,7 +636,7 @@
- WI
+ WI @@ -658,7 +658,7 @@
- WI
+ WI @@ -680,7 +680,7 @@
- WI
+ WI @@ -702,7 +702,7 @@
- WI
+ WI @@ -724,7 +724,7 @@
- WI
+ WI @@ -746,7 +746,7 @@
- WI
+ WI @@ -768,7 +768,7 @@
- WI
+ WI @@ -790,7 +790,7 @@
- WI
+ WI @@ -812,7 +812,7 @@
- WI
+ WI @@ -834,7 +834,7 @@
- WI
+ WI @@ -856,7 +856,7 @@
- WI
+ WI @@ -878,7 +878,7 @@
- WI
+ WI @@ -901,7 +901,7 @@
- WI
+ WI @@ -923,7 +923,7 @@
- WI
+ WI @@ -945,7 +945,7 @@
- WI
+ WI @@ -967,7 +967,7 @@
- WI
+ WI @@ -989,7 +989,7 @@
- WI
+ WI @@ -1011,7 +1011,7 @@
- WI
+ WI @@ -1034,7 +1034,7 @@
- WI
+ WI @@ -1056,7 +1056,7 @@
- WI
+ WI @@ -1078,7 +1078,7 @@
- WI
+ WI @@ -1100,7 +1100,7 @@
- WI
+ WI @@ -1125,7 +1125,7 @@
- WI
+ WI @@ -1147,7 +1147,7 @@
- WI
+ WI @@ -1169,7 +1169,7 @@
- WI
+ WI @@ -1191,7 +1191,7 @@
- WI
+ WI @@ -1213,7 +1213,7 @@
- WI
+ WI @@ -1235,7 +1235,7 @@
- WI
+ WI @@ -1257,7 +1257,7 @@
- WI
+ WI @@ -1279,7 +1279,7 @@
- WI
+ WI @@ -1301,7 +1301,7 @@
- WI
+ WI @@ -1324,7 +1324,7 @@
- WI
+ WI @@ -1346,7 +1346,7 @@
- WI
+ WI @@ -1368,7 +1368,7 @@
- WI
+ WI @@ -1390,7 +1390,7 @@
- WI
+ WI @@ -1412,7 +1412,7 @@
- WI
+ WI @@ -1434,7 +1434,7 @@
- WI
+ WI @@ -1456,7 +1456,7 @@
- WI
+ WI @@ -1478,7 +1478,7 @@
- WI
+ WI @@ -1500,7 +1500,7 @@
- WI
+ WI @@ -1522,7 +1522,7 @@
- WI
+ WI @@ -1545,7 +1545,7 @@
- WI
+ WI @@ -1567,7 +1567,7 @@
- WI
+ WI @@ -1590,7 +1590,7 @@
- WI
+ WI @@ -1612,7 +1612,7 @@
- WI
+ WI @@ -1634,7 +1634,7 @@
- WI
+ WI @@ -1656,7 +1656,7 @@
- WI
+ WI @@ -1678,7 +1678,7 @@
- WI
+ WI @@ -1700,7 +1700,7 @@
- WI
+ WI @@ -1722,7 +1722,7 @@
- WI
+ WI @@ -1744,7 +1744,7 @@
- WI
+ WI @@ -1767,7 +1767,7 @@
- WI
+ WI @@ -1789,7 +1789,7 @@
- WI
+ WI @@ -1811,7 +1811,7 @@
- WI
+ WI @@ -1833,7 +1833,7 @@
- WI
+ WI @@ -1855,7 +1855,7 @@
- WI
+ WI @@ -1877,7 +1877,7 @@
- WI
+ WI @@ -1899,7 +1899,7 @@
- WI
+ WI @@ -1921,7 +1921,7 @@
- WI
+ WI @@ -1943,7 +1943,7 @@
- WI
+ WI @@ -1965,7 +1965,7 @@
- WI
+ WI @@ -1987,7 +1987,7 @@
- WI
+ WI @@ -2010,7 +2010,7 @@
- WI
+ WI @@ -2032,7 +2032,7 @@
- WI
+ WI @@ -2054,7 +2054,7 @@
- WI
+ WI @@ -2076,7 +2076,7 @@
- WI
+ WI @@ -2098,7 +2098,7 @@
- WI
+ WI @@ -2121,7 +2121,7 @@
- WI
+ WI @@ -2143,7 +2143,7 @@
- WI
+ WI @@ -2165,7 +2165,7 @@
- WI
+ WI @@ -2187,7 +2187,7 @@
- WI
+ WI @@ -2209,7 +2209,7 @@
- WI
+ WI @@ -2231,7 +2231,7 @@
- WI
+ WI @@ -2253,7 +2253,7 @@
- WI
+ WI @@ -2275,7 +2275,7 @@
- WI
+ WI @@ -2297,7 +2297,7 @@
- WI
+ WI @@ -2319,7 +2319,7 @@
- WI
+ WI @@ -2341,7 +2341,7 @@
- WI
+ WI @@ -2364,7 +2364,7 @@
- WI
+ WI @@ -2386,7 +2386,7 @@
- WI
+ WI @@ -2408,7 +2408,7 @@
- WI
+ WI @@ -2431,7 +2431,7 @@
- WI
+ WI @@ -2453,7 +2453,7 @@
- WI
+ WI @@ -2475,7 +2475,7 @@
- WI
+ WI @@ -2497,7 +2497,7 @@
- WI
+ WI @@ -2519,7 +2519,7 @@
- WI
+ WI @@ -2541,7 +2541,7 @@
- WI
+ WI @@ -2566,7 +2566,7 @@
- WI
+ WI @@ -2588,7 +2588,7 @@
- WI
+ WI @@ -2610,7 +2610,7 @@
- WI
+ WI @@ -2632,7 +2632,7 @@
- WI
+ WI @@ -2654,7 +2654,7 @@
- WI
+ WI @@ -2676,7 +2676,7 @@
- WI
+ WI @@ -2698,7 +2698,7 @@
- WI
+ WI @@ -2721,7 +2721,7 @@
- WI
+ WI @@ -2743,7 +2743,7 @@
- WI
+ WI @@ -2765,7 +2765,7 @@
- WI
+ WI @@ -2787,7 +2787,7 @@
- WI
+ WI @@ -2810,7 +2810,7 @@
- WI
+ WI @@ -2832,7 +2832,7 @@
- WI
+ WI @@ -2854,7 +2854,7 @@
- WI
+ WI @@ -2877,7 +2877,7 @@
- WI
+ WI @@ -2899,7 +2899,7 @@
- WI
+ WI @@ -2921,7 +2921,7 @@
- WI
+ WI @@ -2943,7 +2943,7 @@
- WI
+ WI @@ -2966,7 +2966,7 @@
- WI
+ WI @@ -2988,7 +2988,7 @@
- WI
+ WI @@ -3011,7 +3011,7 @@
- WI
+ WI @@ -3036,7 +3036,7 @@
- WI
+ WI @@ -3058,7 +3058,7 @@
- WI
+ WI @@ -3080,7 +3080,7 @@
- WI
+ WI @@ -3103,7 +3103,7 @@
- WI
+ WI @@ -3125,7 +3125,7 @@
- WI
+ WI @@ -3147,7 +3147,7 @@
- WI
+ WI @@ -3170,7 +3170,7 @@
- WI
+ WI @@ -3192,7 +3192,7 @@
- WI
+ WI @@ -3214,7 +3214,7 @@
- WI
+ WI @@ -3237,7 +3237,7 @@
- WI
+ WI @@ -3259,7 +3259,7 @@
- WI
+ WI @@ -3282,7 +3282,7 @@
- WI
+ WI @@ -3304,7 +3304,7 @@
- WI
+ WI @@ -3326,7 +3326,7 @@
- WI
+ WI @@ -3348,7 +3348,7 @@
- WI
+ WI @@ -3371,7 +3371,7 @@
- WI
+ WI @@ -3393,7 +3393,7 @@
- WI
+ WI @@ -3415,7 +3415,7 @@
- WI
+ WI @@ -3437,7 +3437,7 @@
- WI
+ WI @@ -3462,7 +3462,7 @@
- WI
+ WI @@ -3485,7 +3485,7 @@
- WI
+ WI @@ -3507,7 +3507,7 @@
- WI
+ WI @@ -3530,7 +3530,7 @@
- WI
+ WI @@ -3552,7 +3552,7 @@
- WI
+ WI @@ -3574,7 +3574,7 @@
- WI
+ WI @@ -3596,7 +3596,7 @@
- WI
+ WI @@ -3619,7 +3619,7 @@
- WI
+ WI @@ -3641,7 +3641,7 @@
- WI
+ WI @@ -3663,7 +3663,7 @@
- WI
+ WI @@ -3685,7 +3685,7 @@
- WI
+ WI @@ -3708,7 +3708,7 @@
- WI
+ WI @@ -3730,7 +3730,7 @@
- WI
+ WI @@ -3752,7 +3752,7 @@
- WI
+ WI @@ -3774,7 +3774,7 @@
- WI
+ WI @@ -3797,7 +3797,7 @@
- WI
+ WI @@ -3819,7 +3819,7 @@
- WI
+ WI @@ -3841,7 +3841,7 @@
- WI
+ WI @@ -3863,7 +3863,7 @@
- WI
+ WI @@ -3885,7 +3885,7 @@
- WI
+ WI @@ -3907,7 +3907,7 @@
- WI
+ WI @@ -3929,7 +3929,7 @@
- WI
+ WI @@ -3951,7 +3951,7 @@
- WI
+ WI @@ -3974,7 +3974,7 @@
- WI
+ WI @@ -3996,7 +3996,7 @@
- WI
+ WI @@ -4018,7 +4018,7 @@
- WI
+ WI @@ -4040,7 +4040,7 @@
- WI
+ WI @@ -4062,7 +4062,7 @@
- WI
+ WI @@ -4084,7 +4084,7 @@
- WI
+ WI @@ -4106,7 +4106,7 @@
- WI
+ WI @@ -4128,7 +4128,7 @@
- WI
+ WI @@ -4150,7 +4150,7 @@
- WI
+ WI @@ -4172,7 +4172,7 @@
- WI
+ WI @@ -4194,7 +4194,7 @@
- WI
+ WI @@ -4216,7 +4216,7 @@
- WI
+ WI @@ -4238,7 +4238,7 @@
- WI
+ WI @@ -4260,7 +4260,7 @@
- WI
+ WI @@ -4283,7 +4283,7 @@
- WI
+ WI @@ -4305,7 +4305,7 @@
- WI
+ WI @@ -4327,7 +4327,7 @@
- WI
+ WI @@ -4350,7 +4350,7 @@
- WI
+ WI @@ -4372,7 +4372,7 @@
- WI
+ WI @@ -4394,7 +4394,7 @@
- WI
+ WI @@ -4417,7 +4417,7 @@
- WI
+ WI @@ -4440,7 +4440,7 @@
- WI
+ WI @@ -4462,7 +4462,7 @@
- WI
+ WI @@ -4484,7 +4484,7 @@
- WI
+ WI @@ -4506,7 +4506,7 @@
- WI
+ WI @@ -4528,7 +4528,7 @@
- WI
+ WI @@ -4550,7 +4550,7 @@
- WI
+ WI @@ -4573,7 +4573,7 @@
- WI
+ WI @@ -4595,7 +4595,7 @@
- WI
+ WI @@ -4617,7 +4617,7 @@
- WI
+ WI @@ -4639,7 +4639,7 @@
- WI
+ WI @@ -4661,7 +4661,7 @@
- WI
+ WI @@ -4683,7 +4683,7 @@
- WI
+ WI @@ -4706,7 +4706,7 @@
- WI
+ WI @@ -4728,7 +4728,7 @@
- WI
+ WI @@ -4750,7 +4750,7 @@
- WI
+ WI @@ -4772,7 +4772,7 @@
- WI
+ WI @@ -4794,7 +4794,7 @@
- WI
+ WI @@ -4817,7 +4817,7 @@
- WI
+ WI @@ -4839,7 +4839,7 @@
- WI
+ WI @@ -4861,7 +4861,7 @@
- WI
+ WI @@ -4886,7 +4886,7 @@
- WI
+ WI @@ -4908,7 +4908,7 @@
- WI
+ WI @@ -4930,7 +4930,7 @@
- WI
+ WI @@ -4952,7 +4952,7 @@
- WI
+ WI @@ -4974,7 +4974,7 @@
- WI
+ WI @@ -4996,7 +4996,7 @@
- WI
+ WI @@ -5019,7 +5019,7 @@
- WI
+ WI @@ -5041,7 +5041,7 @@
- WI
+ WI @@ -5063,7 +5063,7 @@
- WI
+ WI @@ -5085,7 +5085,7 @@
- WI
+ WI @@ -5108,7 +5108,7 @@
- WI
+ WI @@ -5130,7 +5130,7 @@
- WI
+ WI @@ -5152,7 +5152,7 @@
- WI
+ WI @@ -5174,7 +5174,7 @@
- WI
+ WI @@ -5196,7 +5196,7 @@
- WI
+ WI @@ -5218,7 +5218,7 @@
- WI
+ WI @@ -5240,7 +5240,7 @@
- WI
+ WI @@ -5263,7 +5263,7 @@
- WI
+ WI @@ -5285,7 +5285,7 @@
- WI
+ WI @@ -5308,7 +5308,7 @@
- WI
+ WI @@ -5330,7 +5330,7 @@
- WI
+ WI @@ -5352,7 +5352,7 @@
- WI
+ WI @@ -5374,7 +5374,7 @@
- WI
+ WI @@ -5396,7 +5396,7 @@
- WI
+ WI @@ -5418,7 +5418,7 @@
- WI
+ WI @@ -5441,7 +5441,7 @@
- WI
+ WI @@ -5463,7 +5463,7 @@
- WI
+ WI @@ -5486,7 +5486,7 @@
- WI
+ WI @@ -5508,7 +5508,7 @@
- WI
+ WI @@ -5530,7 +5530,7 @@
- WI
+ WI @@ -5552,7 +5552,7 @@
- WI
+ WI @@ -5575,7 +5575,7 @@
- WI
+ WI @@ -5597,7 +5597,7 @@
- WI
+ WI @@ -5619,7 +5619,7 @@
- WI
+ WI @@ -5641,7 +5641,7 @@
- WI
+ WI @@ -5664,7 +5664,7 @@
- WI
+ WI @@ -5686,7 +5686,7 @@
- WI
+ WI @@ -5709,7 +5709,7 @@
- WI
+ WI @@ -5731,7 +5731,7 @@
- WI
+ WI @@ -5753,7 +5753,7 @@
- WI
+ WI @@ -5775,7 +5775,7 @@
- WI
+ WI @@ -5797,7 +5797,7 @@
- WI
+ WI @@ -5820,7 +5820,7 @@
- WI
+ WI @@ -5842,7 +5842,7 @@
- WI
+ WI @@ -5864,7 +5864,7 @@
- WI
+ WI @@ -5886,7 +5886,7 @@
- WI
+ WI @@ -5909,7 +5909,7 @@
- WI
+ WI @@ -5931,7 +5931,7 @@
- WI
+ WI @@ -5953,7 +5953,7 @@
- WI
+ WI @@ -5975,7 +5975,7 @@
- WI
+ WI @@ -5997,7 +5997,7 @@
- WI
+ WI @@ -6019,7 +6019,7 @@
- WI
+ WI @@ -6042,7 +6042,7 @@
- WI
+ WI @@ -6064,7 +6064,7 @@
- WI
+ WI @@ -6086,7 +6086,7 @@
- WI
+ WI @@ -6108,7 +6108,7 @@
- WI
+ WI @@ -6130,7 +6130,7 @@
- WI
+ WI @@ -6152,7 +6152,7 @@
- WI
+ WI @@ -6174,7 +6174,7 @@
- WI
+ WI @@ -6197,7 +6197,7 @@
- WI
+ WI @@ -6219,7 +6219,7 @@
- WI
+ WI @@ -6241,7 +6241,7 @@
- WI
+ WI @@ -6263,7 +6263,7 @@
- WI
+ WI @@ -6286,7 +6286,7 @@
- WI
+ WI @@ -6308,7 +6308,7 @@
- WI
+ WI @@ -6330,7 +6330,7 @@
- WI
+ WI @@ -6352,7 +6352,7 @@
- WI
+ WI @@ -6374,7 +6374,7 @@
- WI
+ WI @@ -6396,7 +6396,7 @@
- WI
+ WI @@ -6421,7 +6421,7 @@
- WI
+ WI @@ -6443,7 +6443,7 @@
- WI
+ WI @@ -6465,7 +6465,7 @@
- WI
+ WI @@ -6487,7 +6487,7 @@
- WI
+ WI @@ -6510,7 +6510,7 @@
- WI
+ WI @@ -6532,7 +6532,7 @@
- WI
+ WI @@ -6554,7 +6554,7 @@
- WI
+ WI @@ -6576,7 +6576,7 @@
- WI
+ WI @@ -6599,7 +6599,7 @@
- WI
+ WI @@ -6621,7 +6621,7 @@
- WI
+ WI @@ -6643,7 +6643,7 @@
- WI
+ WI @@ -6666,7 +6666,7 @@
- WI
+ WI @@ -6688,7 +6688,7 @@
- WI
+ WI @@ -6710,7 +6710,7 @@
- WI
+ WI @@ -6732,7 +6732,7 @@
- WI
+ WI @@ -6754,7 +6754,7 @@
- WI
+ WI @@ -6776,7 +6776,7 @@
- WI
+ WI @@ -6798,7 +6798,7 @@
- WI
+ WI @@ -6821,7 +6821,7 @@
- WI
+ WI @@ -6843,7 +6843,7 @@
- WI
+ WI @@ -6868,7 +6868,7 @@
- WI
+ WI @@ -6890,7 +6890,7 @@
- WI
+ WI @@ -6912,7 +6912,7 @@
- WI
+ WI @@ -6934,7 +6934,7 @@
- WI
+ WI @@ -6956,7 +6956,7 @@
- WI
+ WI @@ -6979,7 +6979,7 @@
- WI
+ WI @@ -7001,7 +7001,7 @@
- WI
+ WI @@ -7023,7 +7023,7 @@
- WI
+ WI @@ -7045,7 +7045,7 @@
- WI
+ WI @@ -7067,7 +7067,7 @@
- WI
+ WI @@ -7089,7 +7089,7 @@
- WI
+ WI @@ -7111,7 +7111,7 @@
- WI
+ WI @@ -7133,7 +7133,7 @@
- WI
+ WI @@ -7156,7 +7156,7 @@
- WI
+ WI @@ -7178,7 +7178,7 @@
- WI
+ WI @@ -7200,7 +7200,7 @@
- WI
+ WI @@ -7222,7 +7222,7 @@
- WI
+ WI @@ -7244,7 +7244,7 @@
- WI
+ WI @@ -7266,7 +7266,7 @@
- WI
+ WI @@ -7289,7 +7289,7 @@
- WI
+ WI @@ -7311,7 +7311,7 @@
- WI
+ WI @@ -7333,7 +7333,7 @@
- WI
+ WI @@ -7355,7 +7355,7 @@
- WI
+ WI @@ -7377,7 +7377,7 @@
- WI
+ WI @@ -7399,7 +7399,7 @@
- WI
+ WI @@ -7422,7 +7422,7 @@
- WI
+ WI @@ -7444,7 +7444,7 @@
- WI
+ WI @@ -7466,7 +7466,7 @@
- WI
+ WI @@ -7488,7 +7488,7 @@
- WI
+ WI @@ -7510,7 +7510,7 @@
- WI
+ WI @@ -7533,7 +7533,7 @@
- WI
+ WI @@ -7555,7 +7555,7 @@
- WI
+ WI @@ -7577,7 +7577,7 @@
- WI
+ WI @@ -7599,7 +7599,7 @@
- WI
+ WI @@ -7621,7 +7621,7 @@
- WI
+ WI @@ -7643,7 +7643,7 @@
- WI
+ WI @@ -7665,7 +7665,7 @@
- WI
+ WI @@ -7688,7 +7688,7 @@
- WI
+ WI @@ -7710,7 +7710,7 @@
- WI
+ WI @@ -7732,7 +7732,7 @@
- WI
+ WI @@ -7755,7 +7755,7 @@
- WI
+ WI @@ -7777,7 +7777,7 @@
- WI
+ WI @@ -7799,7 +7799,7 @@
- WI
+ WI @@ -7821,7 +7821,7 @@
- WI
+ WI @@ -7844,7 +7844,7 @@
- WI
+ WI @@ -7866,7 +7866,7 @@
- WI
+ WI @@ -7888,7 +7888,7 @@
- WI
+ WI @@ -7910,7 +7910,7 @@
- WI
+ WI @@ -7932,7 +7932,7 @@
- WI
+ WI @@ -7955,7 +7955,7 @@
- WI
+ WI @@ -7977,7 +7977,7 @@
- WI
+ WI @@ -8000,7 +8000,7 @@
- WI
+ WI @@ -8022,7 +8022,7 @@
- WI
+ WI @@ -8044,7 +8044,7 @@
- WI
+ WI @@ -8067,7 +8067,7 @@
- WI
+ WI @@ -8089,7 +8089,7 @@
- WI
+ WI @@ -8111,7 +8111,7 @@
- WI
+ WI @@ -8133,7 +8133,7 @@
- WI
+ WI @@ -8155,7 +8155,7 @@
- WI
+ WI @@ -8180,7 +8180,7 @@
- WI
+ WI @@ -8202,7 +8202,7 @@
- WI
+ WI @@ -8224,7 +8224,7 @@
- WI
+ WI @@ -8247,7 +8247,7 @@
- WI
+ WI @@ -8269,7 +8269,7 @@
- WI
+ WI @@ -8291,7 +8291,7 @@
- WI
+ WI @@ -8313,7 +8313,7 @@
- WI
+ WI @@ -8335,7 +8335,7 @@
- WI
+ WI @@ -8357,7 +8357,7 @@
- WI
+ WI @@ -8379,7 +8379,7 @@
- WI
+ WI @@ -8401,7 +8401,7 @@
- WI
+ WI @@ -8423,7 +8423,7 @@
- WI
+ WI @@ -8445,7 +8445,7 @@
- WI
+ WI @@ -8468,7 +8468,7 @@
- WI
+ WI @@ -8490,7 +8490,7 @@
- WI
+ WI @@ -8513,7 +8513,7 @@
- WI
+ WI @@ -8535,7 +8535,7 @@
- WI
+ WI @@ -8557,7 +8557,7 @@
- WI
+ WI @@ -8579,7 +8579,7 @@
- WI
+ WI @@ -8601,7 +8601,7 @@
- WI
+ WI @@ -8624,7 +8624,7 @@
- WI
+ WI @@ -8646,7 +8646,7 @@
- WI
+ WI @@ -8668,7 +8668,7 @@
- WI
+ WI @@ -8690,7 +8690,7 @@
- WI
+ WI @@ -8712,7 +8712,7 @@
- WI
+ WI @@ -8735,7 +8735,7 @@
- WI
+ WI @@ -8757,7 +8757,7 @@
- WI
+ WI @@ -8780,7 +8780,7 @@
- WI
+ WI @@ -8802,7 +8802,7 @@
- WI
+ WI @@ -8824,7 +8824,7 @@
- WI
+ WI @@ -8847,7 +8847,7 @@
- WI
+ WI @@ -8869,7 +8869,7 @@
- WI
+ WI @@ -8891,7 +8891,7 @@
- WI
+ WI @@ -8913,7 +8913,7 @@
- WI
+ WI @@ -8936,7 +8936,7 @@
- WI
+ WI @@ -8958,7 +8958,7 @@
- WI
+ WI @@ -8980,7 +8980,7 @@
- WI
+ WI @@ -9002,7 +9002,7 @@
- WI
+ WI @@ -9025,7 +9025,7 @@
- WI
+ WI @@ -9047,7 +9047,7 @@
- WI
+ WI @@ -9069,7 +9069,7 @@
- WI
+ WI @@ -9091,7 +9091,7 @@
- WI
+ WI @@ -9114,7 +9114,7 @@
- WI
+ WI @@ -9136,7 +9136,7 @@
- WI
+ WI @@ -9158,7 +9158,7 @@
- WI
+ WI @@ -9183,7 +9183,7 @@
- WI
+ WI @@ -9205,7 +9205,7 @@
- WI
+ WI @@ -9227,7 +9227,7 @@
- WI
+ WI @@ -9250,7 +9250,7 @@
- WI
+ WI @@ -9272,7 +9272,7 @@
- WI
+ WI @@ -9295,7 +9295,7 @@
- WI
+ WI @@ -9317,7 +9317,7 @@
- WI
+ WI @@ -9339,7 +9339,7 @@
- WI
+ WI @@ -9361,7 +9361,7 @@
- WI
+ WI @@ -9383,7 +9383,7 @@
- WI
+ WI @@ -9405,7 +9405,7 @@
- WI
+ WI @@ -9427,7 +9427,7 @@
- WI
+ WI @@ -9449,7 +9449,7 @@
- WI
+ WI @@ -9472,7 +9472,7 @@
- WI
+ WI @@ -9494,7 +9494,7 @@
- WI
+ WI @@ -9516,7 +9516,7 @@
- WI
+ WI @@ -9538,7 +9538,7 @@
- WI
+ WI @@ -9560,7 +9560,7 @@
- WI
+ WI @@ -9582,7 +9582,7 @@
- WI
+ WI @@ -9605,7 +9605,7 @@
- WI
+ WI @@ -9627,7 +9627,7 @@
- WI
+ WI @@ -9649,7 +9649,7 @@
- WI
+ WI @@ -9671,7 +9671,7 @@
- WI
+ WI @@ -9693,7 +9693,7 @@
- WI
+ WI @@ -9715,7 +9715,7 @@
- WI
+ WI @@ -9740,7 +9740,7 @@
- WI
+ WI @@ -9762,7 +9762,7 @@
- WI
+ WI @@ -9784,7 +9784,7 @@
- WI
+ WI @@ -9806,7 +9806,7 @@
- WI
+ WI @@ -9829,7 +9829,7 @@
- WI
+ WI @@ -9851,7 +9851,7 @@
- WI
+ WI @@ -9873,7 +9873,7 @@
- WI
+ WI @@ -9895,7 +9895,7 @@
- WI
+ WI @@ -9917,7 +9917,7 @@
- WI
+ WI @@ -9939,7 +9939,7 @@
- WI
+ WI @@ -9961,7 +9961,7 @@
- WI
+ WI @@ -9984,7 +9984,7 @@
- WI
+ WI @@ -10007,7 +10007,7 @@
- WI
+ WI @@ -10032,7 +10032,7 @@
- WI
+ WI @@ -10054,7 +10054,7 @@
- WI
+ WI @@ -10077,7 +10077,7 @@
- WI
+ WI @@ -10099,7 +10099,7 @@
- WI
+ WI @@ -10121,7 +10121,7 @@
- WI
+ WI diff --git a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc1.html b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc1.html index ae6e1410..53dcc174 100644 --- a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc1.html +++ b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc1.html @@ -82,23 +82,23 @@

§1.1. Preface

The Inform Recipe Book is one of two interlinked books included with Inform 7: a comprehensive collection of examples, showing the practical use of Inform. The other book is Writing with Inform, a systematic manual for the software. If you are reading this within the Inform application, you will see that the Recipe Book pages are on "yellow paper", while the manual is on "white paper".

The Recipe Book assumes that the reader already knows the basics covered in Chapters 1 and 2 of Writing with Inform: enough to get simple projects working in the Inform application. It's helpful, but not necessary, to have some familiarity with the main ingredients of Inform. For instance, the reader who can play and test the following source text, and who can take a guess at what it ought to do, should be fine:

- -

"The Power of the Keys" + +

"The Power of the Keys"

- -

Afterlife is a room. "Fluffy white clouds gather round you here in the afterlife." The Pearly Gates are a door in Afterlife. "The Pearly Gates - large, white, wrought-iron and splendidly monumental - stand above you." Heaven is a room. The Gates are above the Afterlife and below Heaven. + +

Afterlife is a room. "Fluffy white clouds gather round you here in the afterlife." The Pearly Gates are a door in Afterlife. "The Pearly Gates - large, white, wrought-iron and splendidly monumental - stand above you." Heaven is a room. The Gates are above the Afterlife and below Heaven.

- -

St Peter is a man in the Afterlife. "St Peter, cheery if absent-minded, studies his celestial clipboard." + +

St Peter is a man in the Afterlife. "St Peter, cheery if absent-minded, studies his celestial clipboard."

- -

Before going through the Pearly Gates: + +

Before going through the Pearly Gates:
    say "St Peter coughs disarmingly. 'If you'd read your Bible,' he says, 'you might recall Revelation 21:21 saying that the twelve gates were twelve pearls, each gate being made from a single pearl. I really don't know why people keep imagining it like the entrance to some sort of public park - oh, well. In you go.'";
@@ -106,8 +106,8 @@

- -

Test me with "enter gates". + +

Test me with "enter gates".

@@ -150,8 +150,8 @@

In most cases, typing the single command TEST ME will play through a few moves to show off the effect being demonstrated. (You may find it convenient to create a "scratch" project file for temporary trials like this, clearing all its text and starting again with each new test.)

As part of the testing process which verifies a new build of Inform, each example in turn is extracted from this documentation, translated, played through, and the resulting transcript mechanically checked. So the examples may even work as claimed. But the flesh is weak, and there are bound to be glitches. We would welcome reports, so that future editions can be corrected.

Each example is loosely graded by difficulty: if they were exercises in a textbook, the asterisks would indicate how many marks each question scores. As a general rule:

- -

asterisk.png - A simple example, fairly easily guessed. + +

asterisk.png - A simple example, fairly easily guessed.
asterisk.png asterisk.png - A complicated or surprising example.
@@ -181,7 +181,7 @@

- WI
+ WI @@ -189,18 +189,18 @@ @@ -125,44 +125,44 @@ @@ -281,56 +281,56 @@ @@ -116,23 +116,23 @@ @@ -111,18 +111,18 @@ @@ -180,30 +180,30 @@ @@ -111,23 +111,23 @@ @@ -184,83 +184,83 @@ @@ -328,18 +328,18 @@ @@ -118,76 +118,76 @@ @@ -246,24 +246,24 @@ @@ -320,13 +320,13 @@ @@ -414,60 +414,60 @@ @@ -516,78 +516,78 @@ @@ -689,28 +689,28 @@ @@ -796,28 +796,28 @@ @@ -894,28 +894,28 @@ @@ -130,30 +130,30 @@ @@ -186,13 +186,13 @@ @@ -224,30 +224,30 @@ @@ -280,13 +280,13 @@ @@ -341,55 +341,55 @@ @@ -434,41 +434,41 @@ @@ -513,32 +513,32 @@ @@ -634,18 +634,18 @@ @@ -713,30 +713,30 @@ @@ -786,18 +786,18 @@ @@ -870,23 +870,23 @@ @@ -120,49 +120,49 @@ @@ -195,19 +195,19 @@ @@ -268,35 +268,35 @@ @@ -403,18 +403,18 @@ @@ -1569,13 +1569,13 @@ @@ -128,40 +128,40 @@ @@ -192,44 +192,44 @@ @@ -284,48 +284,48 @@ @@ -387,23 +387,23 @@ @@ -490,51 +490,51 @@ @@ -565,78 +565,78 @@ @@ -678,63 +678,63 @@ @@ -784,23 +784,23 @@

Suppose we're simulating a situation where the player needs to travel through lit areas only, but we want to give him some hints about which way might be safe. Here we'll find our best route through light-filled rooms.

The slightly tricky part is that it's not necessarily easy to tell whether a room has a lamp in it. We may say "if the Crypt is lighted", but that only tells us whether it has been declared to be inherently lighted or dark, not whether it happens to contain a light source that the player would be able to see if he went in.

The easiest way to get around this is to create an object -- the light-meter; place it in the target location; and check whether it "can see" a lit object. This preserves all the usual rules about open and closed containers, transparency, etc.

- -

paste@2x.png create@2x.png   "Unblinking" + +

paste@2x.png create@2x.png   "Unblinking"

- -

Section 1 - Procedure + +

Section 1 - Procedure

- -

The light-meter is a privately-named scenery thing. + +

The light-meter is a privately-named scenery thing.

- -

Definition: a room (called the target room) is light-filled: + +

Definition: a room (called the target room) is light-filled:
    if the target room is lighted:
@@ -821,38 +821,38 @@

That done, we're free to use our best-route phrases to choose a particular route.

- -

Section 2 - Scenario + +

Section 2 - Scenario

- -

The Tomb of Angels is a room. "This ancient underground tomb is lightless but for a few shafts from the surface. Everywhere in the shadows are carved angels, their faces worn away by water and pollution, their wings little more than nubs." + +

The Tomb of Angels is a room. "This ancient underground tomb is lightless but for a few shafts from the surface. Everywhere in the shadows are carved angels, their faces worn away by water and pollution, their wings little more than nubs."

- -

The Upward Path is above the Tomb of Angels. It is dark. "The staircase switches back on itself many times as it ascends towards the Crash Site." + +

The Upward Path is above the Tomb of Angels. It is dark. "The staircase switches back on itself many times as it ascends towards the Crash Site."

- -

A container called the sarcophagus is in the Upward Path. It is closed and openable. "A sarcophagus rests in the niche here, [if open]the lid pushed aside[otherwise]the lid firmly in place[end if]." + +

A container called the sarcophagus is in the Upward Path. It is closed and openable. "A sarcophagus rests in the niche here, [if open]the lid pushed aside[otherwise]the lid firmly in place[end if]."

- -

The Crash Site is above the Upward Path. "The ceiling has wholly caved in here, and the belly of the spaceship above you is visible -- including the escape hatch." + +

The Crash Site is above the Upward Path. "The ceiling has wholly caved in here, and the belly of the spaceship above you is visible -- including the escape hatch."

- -

A candle is a kind of thing. A candle is usually lit. The player carries four candles. + +

A candle is a kind of thing. A candle is usually lit. The player carries four candles.

- -

After looking when the location is not the Crash Site: + +

After looking when the location is not the Crash Site:
    if the best route from the location to the Crash Site through light-filled rooms is a direction (called next way):
@@ -864,8 +864,8 @@

- -

Test me with "up / drop candle / down / up / take the candle / open sarcophagus / put candle in sarcophagus / down / up / close sarcophagus / d". + +

Test me with "up / drop candle / down / up / take the candle / open sarcophagus / put candle in sarcophagus / down / up / close sarcophagus / d".

@@ -889,7 +889,7 @@
- WI
+ WI @@ -897,13 +897,13 @@ @@ -1069,30 +1069,30 @@ @@ -1338,73 +1338,73 @@ @@ -114,28 +114,28 @@ @@ -168,16 +168,16 @@ @@ -492,30 +492,30 @@ @@ -113,23 +113,23 @@ @@ -160,35 +160,35 @@ @@ -220,24 +220,24 @@ @@ -336,20 +336,20 @@ @@ -437,52 +437,52 @@ @@ -591,29 +591,29 @@

§4.1. The Passage Of Time

A story that makes heavy use of time may want to give the player a hint that time is important - and an easy way to keep track of how it's going - by adding the current time to the status line, instead of the score. To do this, we would write

- -

When play begins: + +

When play begins:
    now the right hand status line is "[time of day]".

@@ -93,18 +93,18 @@

Uptempo and The Hang of Thursdays speed up time's passage: turns take fifteen minutes in the former, or a quarter day in the latter.

Timeless makes certain actions instant, so that they don't count against the clock; this is sometimes useful in timed situations where the player needs to review the situation before going on with a tricky puzzle. Endurance systematically extends this idea to allow us to assign different durations to any action in the story. The Big Sainsbury's goes the opposite direction, and meticulously adds a minute to the clock for all implicit take actions, just so that the player isn't allowed to economize on moves.

An alternative approach to time is not to tell the player specifically what hour of the day it is at all, but to move from one general time period to another as it becomes appropriate - when the player has solved enough puzzles, or worked his way through enough of the plot. To this end we might use scenes representing, say, Thursday afternoon and then Thursday evening; then our scene rules, rather than the clock, would determine when Thursday afternoon stopped and Thursday evening began:

- -

Thursday afternoon is a scene. Thursday evening is a scene. + +

Thursday afternoon is a scene. Thursday evening is a scene.

- -

Thursday afternoon ends when the player carries the portfolio. + +

Thursday afternoon ends when the player carries the portfolio.

- -

Thursday evening begins when Thursday afternoon ends. + +

Thursday evening begins when Thursday afternoon ends.
When Thursday evening begins:
@@ -136,7 +136,7 @@

- WI
+ WI @@ -145,18 +145,18 @@ @@ -209,39 +209,39 @@ @@ -289,18 +289,18 @@ @@ -449,48 +449,48 @@ @@ -570,18 +570,18 @@ @@ -711,28 +711,28 @@ @@ -785,30 +785,30 @@ @@ -116,82 +116,82 @@ @@ -224,48 +224,48 @@ @@ -398,96 +398,96 @@ @@ -576,18 +576,18 @@ @@ -126,28 +126,28 @@ @@ -244,47 +244,47 @@ @@ -336,28 +336,28 @@ @@ -114,28 +114,28 @@ @@ -190,18 +190,18 @@ @@ -294,103 +294,103 @@ @@ -544,52 +544,52 @@ @@ -134,54 +134,54 @@ @@ -205,94 +205,94 @@

To do this, we might want to remove the standard behavior of the three actions associated with BRIEF, SUPERBRIEF, and VERBOSE, replacing them with explanatory messages about how the game behaves. We cannot use Instead to override these actions, because Instead rules do not apply to actions out of world. Instead, we will want to remove and replace the carry out rules.

We can do this easily by going to the Actions Index, looking up the detail panel for, say, "preferring abbreviated room descriptions", and click the "unlist" button to paste in the sentence that will remove this rule from the rulebook.

Let's remove all three of the carry out rules and substitute our own:

+ +

paste@2x.png create@2x.png   "Verbosity 2" +

+
+ + +

Section 1 - Procedure +

+
+ -

paste@2x.png create@2x.png   "Verbosity 2" +

The prefer unabbreviated room descriptions rule is not listed in the carry out preferring unabbreviated room descriptions rulebook.

-

Section 1 - Procedure +

The prefer sometimes abbreviated room descriptions rule is not listed in the carry out preferring sometimes abbreviated room descriptions rulebook.

-

The prefer unabbreviated room descriptions rule is not listed in the carry out preferring unabbreviated room descriptions rulebook. +

The prefer abbreviated room descriptions rule is not listed in the carry out preferring abbreviated room descriptions rulebook.

-

The prefer sometimes abbreviated room descriptions rule is not listed in the carry out preferring sometimes abbreviated room descriptions rulebook. +

Carry out preferring unabbreviated room descriptions: +
+     say "[story title] always provides full-length descriptions for your reading pleasure."

-

The prefer abbreviated room descriptions rule is not listed in the carry out preferring abbreviated room descriptions rulebook. +

Carry out preferring sometimes abbreviated room descriptions: +
+     say "For your playing protection, [story title] provides only full-length room descriptions."

-

Carry out preferring unabbreviated room descriptions: +

Carry out preferring abbreviated room descriptions:
-     say "[story title] always provides full-length descriptions for your reading pleasure." +     try preferring sometimes abbreviated room descriptions instead.

-

Carry out preferring sometimes abbreviated room descriptions: -
-     say "For your playing protection, [story title] provides only full-length room descriptions." +

The standard report preferring abbreviated room descriptions rule is not listed in the report preferring abbreviated room descriptions rulebook.

-

Carry out preferring abbreviated room descriptions: -
-     try preferring sometimes abbreviated room descriptions instead. +

The standard report preferring unabbreviated room descriptions rule is not listed in the report preferring unabbreviated room descriptions rulebook.

-

The standard report preferring abbreviated room descriptions rule is not listed in the report preferring abbreviated room descriptions rulebook. +

The standard report preferring sometimes abbreviated room descriptions rule is not listed in the report preferring sometimes abbreviated room descriptions rulebook.

-

The standard report preferring unabbreviated room descriptions rule is not listed in the report preferring unabbreviated room descriptions rulebook. +

Use full-length room descriptions.

-

The standard report preferring sometimes abbreviated room descriptions rule is not listed in the report preferring sometimes abbreviated room descriptions rulebook. +

Section 2 - Scenario

-

Use full-length room descriptions. +

The Wilkie Memorial Research Wing is a room. "The research wing was built onto the science building in 1967, when the college's finances were good but its aesthetic standards at a local minimum. A dull brown corridor recedes both north and south; drab olive doors open onto the laboratories of individual faculty members. The twitchy fluorescent lighting makes the whole thing flicker, as though it might wink out of existence at any moment.

-

Section 2 - Scenario +

The Men's Restroom is immediately west of this point."

-

The Wilkie Memorial Research Wing is a room. "The research wing was built onto the science building in 1967, when the college's finances were good but its aesthetic standards at a local minimum. A dull brown corridor recedes both north and south; drab olive doors open onto the laboratories of individual faculty members. The twitchy fluorescent lighting makes the whole thing flicker, as though it might wink out of existence at any moment. +

The Men's Restroom is west of the Research Wing. "Well, yes, you really shouldn't be in here. But the nearest women's room is on the other side of the building, and at this hour you have the labs mostly to yourself. All the same, you try not to read any of the things scrawled over the urinals which might have been intended in confidence."

-

The Men's Restroom is immediately west of this point." -

-
- - -

The Men's Restroom is west of the Research Wing. "Well, yes, you really shouldn't be in here. But the nearest women's room is on the other side of the building, and at this hour you have the labs mostly to yourself. All the same, you try not to read any of the things scrawled over the urinals which might have been intended in confidence." -

-
- - -

Test me with "west / east / brief / w / e / superbrief / w / e / verbose". +

Test me with "west / east / brief / w / e / superbrief / w / e / verbose".

diff --git a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc33.html b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc33.html index 86d90ecd..53b30382 100644 --- a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc33.html +++ b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc33.html @@ -84,8 +84,8 @@

§6.5. Examining

By default, examining an object shows its description, and - for devices - tells us whether the object is switched on or switched off.

This kind of additional information is not always what we want, so if we have a device whose on/off status we want to conceal, we may write

- -

The examine described devices rule is not listed in any rulebook. + +

The examine described devices rule is not listed in any rulebook.

@@ -112,7 +112,7 @@
- WI
+ WI @@ -122,52 +122,52 @@ @@ -199,18 +199,18 @@ @@ -288,8 +288,8 @@

Suppose that we have a game in which groups of objects can have meaning apart from their individual significance -- perhaps there are spells that can only be cast by collecting just the right items in the same place.

In this case, one of the things the player might like to be able to do is look at several items together and get a special response, different from looking at the items individually.

To make this happen, we need to do several things:

- -

(1) we need to create a version of the EXAMINE command that can apply to multiple objects at once. + +

(1) we need to create a version of the EXAMINE command that can apply to multiple objects at once.
(2) we need to correct the way Inform normally deals with multiple-object commands, because we want our group description to print only one time, and we want to avoid stubs such as "pear: ... apple: ..." before or after the group description.
@@ -297,47 +297,47 @@

- -

paste@2x.png create@2x.png   "The Left Hand of Autumn" + +

paste@2x.png create@2x.png   "The Left Hand of Autumn"

- -

Section 1 - Procedure + +

Section 1 - Procedure

- -

Understand "examine [things]" or "look at [things]" as multiply-examining. Multiply-examining is an action applying to one thing. + +

Understand "examine [things]" or "look at [things]" as multiply-examining. Multiply-examining is an action applying to one thing.

- -

Understand "examine [things inside] in/on [something]" or "look at [things inside] in/on [something]" as multiply-examining it from. Multiply-examining it from is an action applying to two things. + +

Understand "examine [things inside] in/on [something]" or "look at [things inside] in/on [something]" as multiply-examining it from. Multiply-examining it from is an action applying to two things.

- -

Group-description-complete is a truth state that varies. + +

Group-description-complete is a truth state that varies.

- -

Carry out multiply-examining it from: + +

Carry out multiply-examining it from:
    try multiply-examining the noun instead.

- -

Check multiply-examining when group-description-complete is true: + +

Check multiply-examining when group-description-complete is true:
    stop the action.

- -

Carry out multiply-examining: + +

Carry out multiply-examining:
    let L be the list of matched things;
@@ -353,21 +353,21 @@

- -

Before reading a command: + +

Before reading a command:
    now group-description-complete is false.

Now for step 2, overriding Inform's usual output of names of objects:

- -

The silently announce items from multiple object lists rule is listed instead of the announce items from multiple object lists rule in the action-processing rules. + +

The silently announce items from multiple object lists rule is listed instead of the announce items from multiple object lists rule in the action-processing rules.

- -

This is the silently announce items from multiple object lists rule: + +

This is the silently announce items from multiple object lists rule:
    unless multiply-examining or multiply-examining something from something:
@@ -375,15 +375,15 @@

- -

Definition: a thing is matched if it is listed in the multiple object list. + +

Definition: a thing is matched if it is listed in the multiple object list.

We'll save our "to describe" phrase until Section 2, when we can give the game specific instructions about how to report different lists of objects.

Now, the player might also want to be able to refer to a group of item by some kind of group name, so let's add the option of creating a Table of Collective Names which will interpret these:

- -

After reading a command: + +

After reading a command:
    repeat through the Table of Collective Names:
@@ -399,21 +399,21 @@

- -

Report taking something: + +

Report taking something:
    say "You pick up [the noun]." instead.

And as a bit of polish, because we'd like SEARCH TABLE to have the same effect as EXAMINE ALL ON TABLE:

- -

Understand "look on [something]" as searching. + +

Understand "look on [something]" as searching.

- -

Instead of searching something which supports at least two things: + +

Instead of searching something which supports at least two things:
    let L be the list of things supported by the noun;
@@ -427,34 +427,34 @@

- -

Section 2 - Scenario + +

Section 2 - Scenario

- -

Eight-Walled Chamber is a room. "A perfectly octagonal room whose walls are tinted in various hues." + +

Eight-Walled Chamber is a room. "A perfectly octagonal room whose walls are tinted in various hues."

- -

The display table is a supporter in the Chamber. A twig of rowan wood is on the table. + +

The display table is a supporter in the Chamber. A twig of rowan wood is on the table.

- -

The player carries an apple and a pear. + +

The player carries an apple and a pear.

- -

A glove is a kind of thing. A glove is always wearable. Understand "glove" as a glove. The player carries a left glove and a right glove. The left glove and the right glove are gloves. + +

A glove is a kind of thing. A glove is always wearable. Understand "glove" as a glove. The player carries a left glove and a right glove. The left glove and the right glove are gloves.

Now we define a few actual lists of items:

- -

Fruit list is a list of objects which varies. Fruit list is { apple, pear }. + +

Fruit list is a list of objects which varies. Fruit list is { apple, pear }.
Glove list is a list of objects which varies. Glove list is { right glove, left glove }.
@@ -462,8 +462,8 @@

- -

To describe (L - a list of objects): + +

To describe (L - a list of objects):
    sort L;
@@ -485,8 +485,8 @@

- -

When play begins: + +

When play begins:
    sort fruit list;
@@ -497,8 +497,8 @@

We sort the lists so that regardless of how we change the rest of the code (and the order in which objects are coded), the resulting list will always be in sorted order and ready to compare with the list of items the player wants to look at. And thanks to the "Reading a command" code we wrote earlier, we can also teach the game to understand the player's references to "the left hand of autumn" as a specific collection of items.

- -

Table of Collective Names + +

Table of Collective Names

@@ -547,8 +547,8 @@

- -

Test me with "x apple and pear / x left and right / put pear on table / put left glove on table / x all on table / put all on table / examine all on table / get apple, twig, pear / x all on table / search table". + +

Test me with "x apple and pear / x left and right / put pear on table / put left glove on table / x all on table / put all on table / examine all on table / get apple, twig, pear / x all on table / search table".

@@ -571,7 +571,7 @@
- WI
+ WI @@ -583,29 +583,29 @@

This is an ideal occasion for a new activity. We look at the action index for "examining" to identify the rule that causes the old behavior (in this case, the "standard examining rule"); replace this with a new rule that calls our activity; and write our "printing the description" activity in such a way that it uses an object's description without forcing a paragraph return afterward.

Then we will use "after printing the description" to add our line about charring, and make sure that the paragraph return does occur before the prompt.

So:

- -

paste@2x.png create@2x.png   "Crusoe" + +

paste@2x.png create@2x.png   "Crusoe"

- -

Section 1 - Creating our New Activity + +

Section 1 - Creating our New Activity

- -

The fancy examining rule is listed instead of the standard examining rule in the carry out examining rules. + +

The fancy examining rule is listed instead of the standard examining rule in the carry out examining rules.

This instruction replaces a normal piece of the examine action, the standard examining rule, with another one of our own devising. (The replacement of the standard examining rule will be explained in more detail in the chapter on rulebooks.)

- -

Printing the description of something is an activity. + +

Printing the description of something is an activity.

- -

This is the fancy examining rule: + +

This is the fancy examining rule:
    carry out the printing the description activity with the noun;
@@ -614,8 +614,8 @@

All we have done here is enclose what is usually just a rule inside an activity. This means that we can now write before and after rules for the activity, and also add special instructions like "Rule for printing the name of something while printing the description of something" -- this may not be likely to arise often, but Inform now has the concept of "printing the description of something" as a separate context of action. Next we add the modification that lets us append to the description without a new line:

- -

Rule for printing the description of something (called item): + +

Rule for printing the description of something (called item):
    if the description of the item is not "":
@@ -628,8 +628,8 @@

"run paragraph on" here will mean that we do not get a paragraph break following the description, even if it ends with a period. We also insert a space, so that our follow-on comments will be properly punctuated.

- -

After printing the description of something charred: + +

After printing the description of something charred:
    say "It is charred." instead.

@@ -638,63 +638,63 @@

The instead at the end of this line stops Inform for going on with any other "after printing the description of..." rules.

The standard library also has rules for printing additional text about containers and supporters with visible contents, and devices that are switched on; with this current system, we could add those as "after printing the description" rules as well, building up a complete paragraph if we wanted. But for simplicity we won't exemplify all of that here. The effects would be much the same as with the "charred" line.

Now, because we want to make sure that we always do get a paragraph break after our description, we add this rule last after all the other rules. "Last" and "first" rules are covered in more detail in the chapter on rulebooks.

- -

Last after printing the description of something: + +

Last after printing the description of something:
    say paragraph break.

- -

Section 2 - The Scenario + +

Section 2 - The Scenario

- -

The Desert Isle is a room. "A pale expanse of sand, here and there developing into hillocks of grass, and a small clump of palms. The water is shallow here, and there are other islands within swimming distance -- or even wading distance, perhaps -- but none of them is any larger than your island, so it doesn't seem worth the trouble of visiting. + +

The Desert Isle is a room. "A pale expanse of sand, here and there developing into hillocks of grass, and a small clump of palms. The water is shallow here, and there are other islands within swimming distance -- or even wading distance, perhaps -- but none of them is any larger than your island, so it doesn't seem worth the trouble of visiting.

- -

A few hundred feet out, the water turns darker blue, the sea floor drops away, and there is nothing to be seen all the way down to the horizon, except a couple of fluffy clouds, and an occasional bird. + +

A few hundred feet out, the water turns darker blue, the sea floor drops away, and there is nothing to be seen all the way down to the horizon, except a couple of fluffy clouds, and an occasional bird.

- -

The remains of your fire smolder in the stone-lined pit." + +

The remains of your fire smolder in the stone-lined pit."

- -

A thing can be charred or whole. A thing is usually whole. Instead of burning something: say "You hold [the noun] to the fire until it flares and chars."; now the noun is charred. + +

A thing can be charred or whole. A thing is usually whole. Instead of burning something: say "You hold [the noun] to the fire until it flares and chars."; now the noun is charred.

- -

The player carries a stick. The description of the stick is "A strip of palm from the woodiest part of the leaf, about a foot and a half long." + +

The player carries a stick. The description of the stick is "A strip of palm from the woodiest part of the leaf, about a foot and a half long."

- -

The player carries a glass bottle and a piece of paper. The description of the paper is "A single blank sheet." In the glass bottle is a grain of sand. The glass bottle is openable and open. Instead of burning the glass bottle: say "You hold the bottle to the flame, but it grows uncomfortably warm." + +

The player carries a glass bottle and a piece of paper. The description of the paper is "A single blank sheet." In the glass bottle is a grain of sand. The glass bottle is openable and open. Instead of burning the glass bottle: say "You hold the bottle to the flame, but it grows uncomfortably warm."

- -

Instead of burning the grain of sand: say "You drop the grain into the fire pit, where it becomes indistinguishable from all the others."; now the grain of sand is nowhere. Instead of dropping the grain of sand: now the grain of sand is nowhere; say "You return the grain of sand to its brethren." + +

Instead of burning the grain of sand: say "You drop the grain into the fire pit, where it becomes indistinguishable from all the others."; now the grain of sand is nowhere. Instead of dropping the grain of sand: now the grain of sand is nowhere; say "You return the grain of sand to its brethren."

The player's description is handled in an unusual way, and this will produce a space paragraph break there where it should not. Instead, therefore, we will add an instead for examining the player (probably a good idea anyway):

- -

Instead of examining the player: + +

Instead of examining the player:
    say "You are sunburned and there is sand in cracks you didn't know existed."

- -

Test me with "i / x stick / x bottle / x sand / x paper / x me / burn stick / x stick / burn paper / x paper". + +

Test me with "i / x stick / x bottle / x sand / x paper / x me / burn stick / x stick / burn paper / x paper".

diff --git a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc34.html b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc34.html index 8c93aad7..77531ce2 100644 --- a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc34.html +++ b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc34.html @@ -104,7 +104,7 @@
- WI
+ WI @@ -114,33 +114,33 @@ @@ -191,25 +191,25 @@ @@ -269,23 +269,23 @@ @@ -347,23 +347,23 @@ @@ -123,23 +123,23 @@

As we've seen in earlier examples such as "Equipment List", it is possible to vary the way Inform creates inventory listings in general (to create lists that look more like paragraphs of prose, lists divided between what the player is wearing and what he isn't, and so on). We can also use activities to alter the printing of specific objects' names and contents, as with the "omit contents in listing" feature after printing the name of something.

We may find, however, that we would like a great deal more control over Inform's printing of inventory details, not just as a special effect for a few items, but throughout the game.

We start by turning off Inform's native property writer:

- -

paste@2x.png create@2x.png   "Oyster Wide Shut" + +

paste@2x.png create@2x.png   "Oyster Wide Shut"

- -

Section 1 - Procedure + +

Section 1 - Procedure

- -

The print standard inventory rule is not listed in any rulebook. + +

The print standard inventory rule is not listed in any rulebook.

- -

Carry out taking inventory (this is the new print inventory rule): + +

Carry out taking inventory (this is the new print inventory rule):
    say "You are carrying: [line break]";
@@ -148,65 +148,65 @@

This is very much like the library's standard behavior, but with the exception that "giving inventory information" or even "giving brief inventory information" are omitted. Here's how we supplant it:

- -

After printing the name of something (called target) while taking inventory: + +

After printing the name of something (called target) while taking inventory:
    follow the property-aggregation rules for the target.

Now, our property-aggregation rulebook is going to look at a given object and decide on a list of features that should be mentioned in inventory. We'll start by producing something quite similar to Inform's default behavior:

- -

The property-aggregation rules are an object-based rulebook. + +

The property-aggregation rules are an object-based rulebook.
The property-aggregation rulebook has a list of text called the tagline.

- -

A first property-aggregation rule for an openable open thing (this is the mention open openables rule): + +

A first property-aggregation rule for an openable open thing (this is the mention open openables rule):
    add "open" to the tagline.

- -

A first property-aggregation rule for an openable closed thing (this is the mention closed openables rule): + +

A first property-aggregation rule for an openable closed thing (this is the mention closed openables rule):
    add "closed" to the tagline.

- -

A property-aggregation rule for a closed transparent container which contains nothing (this is the mention empty transparent containers rule): + +

A property-aggregation rule for a closed transparent container which contains nothing (this is the mention empty transparent containers rule):
    add "empty" to the tagline.

- -

A property-aggregation rule for an open container which contains nothing (this is the mention empty open containers rule): + +

A property-aggregation rule for an open container which contains nothing (this is the mention empty open containers rule):
    add "empty" to the tagline.

- -

A property-aggregation rule for a lit thing (this is the mention lit objects rule): + +

A property-aggregation rule for a lit thing (this is the mention lit objects rule):
    add "providing light" to the tagline.

- -

A property-aggregation rule for a thing worn by the player (this is the mention worn objects rule): + +

A property-aggregation rule for a thing worn by the player (this is the mention worn objects rule):
    add "being worn" to the tagline.

- -

The last property-aggregation rule (this is the print aggregated properties rule): + +

The last property-aggregation rule (this is the print aggregated properties rule):
    if the number of entries in the tagline is greater than 0:
@@ -220,41 +220,41 @@

Notice that we don't need to write any rules about how to print that list of text: because Inform is printing out a list, it will automatically insert commas, spaces, and the word "and" where appropriate; and it will automatically follow the "use serial comma" option, if we have it set.

Now we're free to meddle. Let's give the player a bunch of possessions that will be listed in interesting ways in inventory:

- -

Section 2 - Scenario + +

Section 2 - Scenario

- -

The Curved Beach is a room. "White sand stretches away both northeast and northwest, enclosing this attractive little bay. Gentle waves lap at the beach." + +

The Curved Beach is a room. "White sand stretches away both northeast and northwest, enclosing this attractive little bay. Gentle waves lap at the beach."

- -

The player carries a glowing plastic sack. The glowing plastic sack is lit and transparent and openable and open. It contains a rock. It is wearable. + +

The player carries a glowing plastic sack. The glowing plastic sack is lit and transparent and openable and open. It contains a rock. It is wearable.

- -

The player wears a flashlight lanyard. The flashlight lanyard is a device. + +

The player wears a flashlight lanyard. The flashlight lanyard is a device.

- -

Carry out switching on the lanyard: now the noun is lit. + +

Carry out switching on the lanyard: now the noun is lit.
Carry out switching off the lanyard: now the noun is unlit.

- -

The player carries an oyster. The oyster contains a pearl. The oyster is openable. + +

The player carries an oyster. The oyster contains a pearl. The oyster is openable.

Now suppose that we don't want the oyster to say "closed" when it's closed. Instead, we'd like it to say "clamped shut". As this is the only property the oyster will ever have, we can simply override his whole property-aggregation rulebook:

- -

A property-aggregation rule for the oyster: + +

A property-aggregation rule for the oyster:
    if the oyster is closed:
@@ -265,13 +265,13 @@

That's fine for the oyster because "clamped shut" is the only property he'll ever have. What if we'd like instead just to revise the way the sack (and only the sack) gets described as providing light?

- -

The sacklight rule is listed after the mention lit objects rule in the property-aggregation rules. + +

The sacklight rule is listed after the mention lit objects rule in the property-aggregation rules.

- -

A property-aggregation rule for the plastic sack (this is the sacklight rule): + +

A property-aggregation rule for the plastic sack (this is the sacklight rule):
    if "providing light" is listed in the tagline:
@@ -283,51 +283,51 @@

Now the flashlight (and any other regular light sources we might add to the game) will be described as "providing light", but the sack will only be said to be gently glowing -- a bit more appropriate for its rather fainter gleam.

We might also wish to add a systematic feature across the board to include a new property in the inventory list? Let's say the player can enchant his possessions, and enchanted possessions should thereafter be listed accordingly:

- -

A thing can be magical or non-magical. A thing is usually non-magical. + +

A thing can be magical or non-magical. A thing is usually non-magical.

- -

Understand "enchant [something]" as enchanting. Enchanting is an action applying to one thing. + +

Understand "enchant [something]" as enchanting. Enchanting is an action applying to one thing.

- -

Carry out enchanting something: + +

Carry out enchanting something:
    now the noun is magical.

- -

Report enchanting something: + +

Report enchanting something:
    say "Ding! You turn [the noun] magical."

- -

A property-aggregation rule for a magical thing: + +

A property-aggregation rule for a magical thing:
    add "enchanted" to the tagline.

- -

Test me with "i / close oyster / i / turn on flashlight / i / take off flashlight / i / turn off flashlight / i / close sack / i / open sack / i / take all from sack / i / close sack / i / wear sack / i / enchant sack / i / open sack / put all in sack / i / close sack / i". + +

Test me with "i / close oyster / i / turn on flashlight / i / take off flashlight / i / turn off flashlight / i / close sack / i / open sack / i / take all from sack / i / close sack / i / wear sack / i / enchant sack / i / open sack / put all in sack / i / close sack / i".

Further variations are possible as well: if we used a "before printing the name..." rather than an "after printing the name..." rule, we could automatically generate lines like "an open and empty phosphorescent plastic sack", removing some of the artificiality of the parentheses.

Or we could add more logic to the rules about which properties are mentioned, so that some features of objects were mentioned in inventory only if the player was wearing the correct detection device, like so:

- -

paste@2x.png create@2x.png   The player wears enchantment-detecting goggles. + +

paste@2x.png create@2x.png   The player wears enchantment-detecting goggles.

- -

A property-aggregation rule for a magical thing: + +

A property-aggregation rule for a magical thing:
    if the player is wearing the goggles:
@@ -354,7 +354,7 @@

- WI
+ WI @@ -375,43 +375,43 @@

"Not listing concealed items" means to omit from the list anything which is scenery.

Finally, "with extra indentation" means that the whole list should be indented slightly, in emulation of the default inventory listing.

With this information, we can try rewriting the inventory behavior to emulate the standard or to explore alternate versions:

- -

paste@2x.png create@2x.png   "Equipment List" + +

paste@2x.png create@2x.png   "Equipment List"

- -

The Watery Room is a room. The player carries a snorkel and a waterproof sack. The waterproof sack contains an undersea map, a diving guide, a cup, and 500 Argentine pesos. The cup contains a worm. The player wears a swimsuit and a pair of flippers. The sack is openable and open. + +

The Watery Room is a room. The player carries a snorkel and a waterproof sack. The waterproof sack contains an undersea map, a diving guide, a cup, and 500 Argentine pesos. The cup contains a worm. The player wears a swimsuit and a pair of flippers. The sack is openable and open.

- -

Inventory listing style is a kind of value. The inventory listing styles are tall, wide, curt, minimal, divided tall, and divided wide. Current inventory listing style is an inventory listing style that varies. + +

Inventory listing style is a kind of value. The inventory listing styles are tall, wide, curt, minimal, divided tall, and divided wide. Current inventory listing style is an inventory listing style that varies.

- -

Understand "inventory [inventory listing style]" as requesting styled inventory. Requesting styled inventory is an action applying to an inventory listing style. It is an action out of world. + +

Understand "inventory [inventory listing style]" as requesting styled inventory. Requesting styled inventory is an action applying to an inventory listing style. It is an action out of world.

- -

Carry out requesting styled inventory: + +

Carry out requesting styled inventory:
    now current inventory listing style is the inventory listing style understood.

- -

Report requesting styled inventory: + +

Report requesting styled inventory:
    say "Inventory listing is now set to [current inventory listing style]."

We begin by emulating the standard inventory listing style:

- -

Instead of taking inventory when current inventory listing style is tall: + +

Instead of taking inventory when current inventory listing style is tall:
    if the number of things enclosed by the player is 0, say "You are empty-handed." instead;
@@ -422,8 +422,8 @@

Here we offer the alternative of listing everything together as a paragraph:

- -

Instead of taking inventory when current inventory listing style is wide: + +

Instead of taking inventory when current inventory listing style is wide:
    if the number of things enclosed by the player is 0, say "You are empty-handed." instead;
@@ -436,8 +436,8 @@

This may be unsatisfactory, however. Items that are inside other items are not set off from those merely carried by the player. One way around this is to use terse listing, giving such descriptions as "a waterproof sack (in which are an undersea map, a diving guide, a cup (in which is a worm) and a 500 Argentine pesos)" as opposed to the more confusing " a waterproof sack (open), inside which are an undersea map, a diving guide, a cup, inside which is a worm and a 500 Argentine pesos".

- -

Instead of taking inventory when current inventory listing style is curt: + +

Instead of taking inventory when current inventory listing style is curt:
    if the number of things enclosed by the player is 0, say "You are empty-handed." instead;
@@ -450,8 +450,8 @@

If, using the above style, we close the sack, we will still get "(closed)" after the sack's listing. The following minimalist listing style abolishes even that nicety:

- -

Instead of taking inventory when current inventory listing style is minimal: + +

Instead of taking inventory when current inventory listing style is minimal:
    if the number of things enclosed by the player is 0, say "You are empty-handed." instead;
@@ -464,8 +464,8 @@

If we want to list worn things separately from carried things, we have occasion to put "listing marked items only" to work:

- -

Instead of taking inventory when the current inventory listing style is divided wide: + +

Instead of taking inventory when the current inventory listing style is divided wide:
    if the number of things enclosed by the player is 0, say "You are empty-handed." instead;
@@ -496,8 +496,8 @@

And similarly for a tall divided inventory:

- -

Instead of taking inventory when the current inventory listing style is divided tall: + +

Instead of taking inventory when the current inventory listing style is divided tall:
    if the number of things enclosed by the player is 0, say "You are empty-handed." instead;
@@ -523,8 +523,8 @@

- -

Test me with "i / inventory wide / i / inventory curt / i / close sack / i / open sack / inventory minimal / i / close sack / i / open sack / inventory divided wide / i / inventory divided tall / i / drop all / i / take all / take off swimsuit / take off flippers / i / i divided wide / i / wear swimsuit / drop all / i". + +

Test me with "i / inventory wide / i / inventory curt / i / close sack / i / open sack / inventory minimal / i / close sack / i / open sack / inventory divided wide / i / inventory divided tall / i / drop all / i / take all / take off swimsuit / take off flippers / i / i divided wide / i / wear swimsuit / drop all / i".

@@ -547,7 +547,7 @@
- WI
+ WI @@ -556,13 +556,13 @@ @@ -608,30 +608,30 @@ @@ -116,23 +116,23 @@ @@ -166,18 +166,18 @@ @@ -246,45 +246,45 @@ @@ -317,18 +317,18 @@ @@ -380,13 +380,13 @@ @@ -454,23 +454,23 @@ @@ -616,13 +616,13 @@ @@ -724,13 +724,13 @@ @@ -157,45 +157,45 @@ @@ -228,18 +228,18 @@ @@ -286,13 +286,13 @@ @@ -370,44 +370,44 @@ @@ -485,31 +485,31 @@ @@ -541,48 +541,48 @@ @@ -638,36 +638,36 @@ @@ -699,23 +699,23 @@ @@ -813,40 +813,40 @@ @@ -897,20 +897,20 @@ @@ -971,36 +971,36 @@ @@ -1065,13 +1065,13 @@ @@ -1153,23 +1153,23 @@

There are two aspects of Inform's handling of pushable objects that are particularly prime for modification. One is that we may want to change the language used to refuse the pushing of unpushable objects.

Second, Inform by default assumes that it is impossible to push objects in up or down directions. This makes lots of sense if the player is trying to push a wheelbarrow up a ladder; it makes less sense if instead we're pushing a ball up a slope.

We solve both problems with some syntax borrowed from the chapter on rulebooks: in the first case, we replace the old rule with a new one with more friendly phrasing; in the second, we remove the rule entirely. More about how to do this is described in the rulebooks chapter; and in general we can find out what rules contribute to any given action by looking at the Actions index. In this case, the action is "pushing it to", which has its own set of prerequisites (called check rules) that make sure the object can safely be pushed, before turning processing over to the going action.

- -

paste@2x.png create@2x.png   "Zorb" + +

paste@2x.png create@2x.png   "Zorb"

- -

Section 1 - Procedure + +

Section 1 - Procedure

- -

The new can't push unpushable things rule is listed instead of the can't push unpushable things rule in the check pushing it to rules. + +

The new can't push unpushable things rule is listed instead of the can't push unpushable things rule in the check pushing it to rules.

- -

This is the new can't push unpushable things rule: + +

This is the new can't push unpushable things rule:
    if the noun is not pushable between rooms:
@@ -1177,46 +1177,46 @@

- -

The can't push vertically rule is not listed in any rulebook. + +

The can't push vertically rule is not listed in any rulebook.

And now to provide a scenario where the player can push something up and down a hillside. Most of the rest of the example is there for local color and to provide a way to demonstrate these rule adjustments:

- -

Section 2 - Scenario + +

Section 2 - Scenario

- -

The Steep Hill is a room. The Crest is above Steep Hill. The Valley is below Steep Hill. + +

The Steep Hill is a room. The Crest is above Steep Hill. The Valley is below Steep Hill.

- -

The flat rock is a fixed in place thing in the Steep Hill. + +

The flat rock is a fixed in place thing in the Steep Hill.

- -

The Zorb is a transparent open enterable container in the Steep Hill. "[if the player props the Zorb]The Zorb rests here, kept from further rolling by your support[otherwise]The Zorb is here[end if].". It is pushable between rooms. The description of the Zorb is "A giant plastic inflatable ball, like a hamster ball for humans[if someone is in the Zorb]. Inside [is-are list of people in the Zorb][end if]." + +

The Zorb is a transparent open enterable container in the Steep Hill. "[if the player props the Zorb]The Zorb rests here, kept from further rolling by your support[otherwise]The Zorb is here[end if].". It is pushable between rooms. The description of the Zorb is "A giant plastic inflatable ball, like a hamster ball for humans[if someone is in the Zorb]. Inside [is-are list of people in the Zorb][end if]."

- -

Lucy is a woman in the Zorb. + +

Lucy is a woman in the Zorb.

- -

Carry out going with the Zorb when the Zorb contains Lucy: + +

Carry out going with the Zorb when the Zorb contains Lucy:
    say "Lucy whoops delightedly as she rides along in the Zorb."

- -

Every turn when the Zorb is not in the Valley and the player does not prop the Zorb: + +

Every turn when the Zorb is not in the Valley and the player does not prop the Zorb:
    let next room be the room down from the location of the Zorb;
@@ -1238,46 +1238,46 @@

- -

Propping relates one person to one thing. The verb to prop means the propping relation. + +

Propping relates one person to one thing. The verb to prop means the propping relation.

- -

Carry out going with the Zorb: + +

Carry out going with the Zorb:
    now the player props the Zorb.

- -

Before doing something when the action requires a touchable noun: + +

Before doing something when the action requires a touchable noun:
    if the noun is not the Zorb, now the player does not prop the Zorb.

- -

Check waving hands when the player is propping something (called casualty): + +

Check waving hands when the player is propping something (called casualty):
    try the player releasing the casualty.

- -

Carry out entering the Zorb: + +

Carry out entering the Zorb:
    now the player does not prop the Zorb.

- -

Understand "let go of [something]" or "let [something] go" or "release [something]" or "free [something]" as releasing. Releasing is an action applying to one thing. + +

Understand "let go of [something]" or "let [something] go" or "release [something]" or "free [something]" as releasing. Releasing is an action applying to one thing.

- -

Check releasing: + +

Check releasing:
    if the player carries the noun:
@@ -1285,8 +1285,8 @@

- -

Check releasing: + +

Check releasing:
    if the player does not prop the noun:
@@ -1294,22 +1294,22 @@

- -

Carry out releasing: + +

Carry out releasing:
    now the player does not prop the noun.

- -

Report releasing: + +

Report releasing:
    say "You let go of [the noun]."

- -

Test me with "d / push zorb up / look / push zorb up / wave / d / d / push zorb up / release zorb / d / push zorb up / touch rock / push the flat rock south". + +

Test me with "d / push zorb up / look / push zorb up / wave / d / d / push zorb up / release zorb / d / push zorb up / touch rock / push the flat rock south".

@@ -1332,7 +1332,7 @@
- WI
+ WI @@ -1342,18 +1342,18 @@ @@ -115,13 +115,13 @@ @@ -179,31 +179,31 @@ @@ -235,59 +235,59 @@ @@ -113,23 +113,23 @@ @@ -205,45 +205,45 @@ @@ -290,18 +290,18 @@ @@ -112,65 +112,65 @@ @@ -204,8 +204,8 @@ @@ -345,8 +345,8 @@

In mathematics, the properties most often looked for in a relation are that it should be:

(a) Reflexive: A <=> A for every A. This is not especially useful for Inform, and seldom appears in practical examples.

(b) Symmetric: A <=> B if and only if B <=> A. Generally, Inform relations are not symmetric, but there are two important cases which are:

- -

Meeting relates people to each other. + +

Meeting relates people to each other.
Marriage relates one person to another.

@@ -354,27 +354,27 @@

These are automatically symmetric, so that to assert one way round is to assert the other as well.

(c) Transitive: A <=> B and B <=> C means that A <=> C as well. Again, Inform relations are not generally transitive. In many relations, there can be long chains of things, each perhaps related to the one in front and the one behind, so that there is some indirect sense in which the two ends of the chain are connected to each other: but they are not related as such. For instance, a journey across the map might pass through ten rooms, each adjacent to the last and next, but the two ends would not themselves be adjacent. The concept we need is the "transitive closure" of the original relation, defined as the smallest transitive relation including the original. If R is a relation between "things", then the following:

- -

TC relates a thing (called A) to a thing (called B) when the number of steps via R from A to B is greater than 0. + +

TC relates a thing (called A) to a thing (called B) when the number of steps via R from A to B is greater than 0.

is the transitive closure of R. In particular,

- -

Accessibility relates a room (called A) to a room (called B) when the number of moves from B to A is greater than 0. The verb to be accessible from means the accessibility relation. + +

Accessibility relates a room (called A) to a room (called B) when the number of moves from B to A is greater than 0. The verb to be accessible from means the accessibility relation.

calculates the transitive closure of adjacency. Here, though, the way we normally understand "accessible from" suggests that it would be better to write:

- -

Accessibility relates a room (called A) to a room (called B) when the number of moves from B to A is at least 0. + +

Accessibility relates a room (called A) to a room (called B) when the number of moves from B to A is at least 0.

which is reflexive as well as transitive. The usefulness of Inform's "next step via R from A to B" construction, in a wide variety of settings, reflects the importance of transitivity as an idea.

A relation which has all three properties of being reflexive, symmetric and transitive is called an "equivalence relation". (If all the map connections are two-way, then the accessibility relation above is symmetric and therefore a full equivalence relation: but if not, it may not be.) Inform has a special construction for making equivalence relations:

- -

Nationality relates people to each other in groups. + +

Nationality relates people to each other in groups.

@@ -398,7 +398,7 @@
- WI
+ WI @@ -407,14 +407,14 @@ @@ -112,23 +112,23 @@ @@ -115,33 +115,33 @@ @@ -184,32 +184,32 @@ @@ -241,23 +241,23 @@ @@ -313,44 +313,44 @@ @@ -413,43 +413,43 @@ @@ -512,37 +512,37 @@ @@ -169,38 +169,38 @@ @@ -232,53 +232,53 @@ @@ -381,30 +381,30 @@ @@ -481,28 +481,28 @@ @@ -587,8 +587,8 @@ @@ -735,38 +735,38 @@

Occasionally it happens that we want to process an action on multiple items differently than we would if the player had just typed each of the individual actions separately. In this example, the reason is that we can only successfully GIVE items when their combined value passes a certain threshold amount; otherwise the recipient will reject them.

This works as an implementation of money, if we give value only to cash objects (though several other implementations of cash are available, most of which are simpler and more efficient). We could also imagine a mechanic like this being used for a bargaining or auction game as well, given a society that deals in objects rather than credits.

In order to consider all the items in the gift at once, we create an action that applies to multiple objects, but will in fact test the whole object collection during the first pass and print a definitive answer to whether the action succeeded. All subsequent times the game consults the rulebook will be stopped at the very beginning. No further processing will occur or output be printed.

- -

paste@2x.png create@2x.png   "The Facts Were These" + +

paste@2x.png create@2x.png   "The Facts Were These"

- -

Section 1 - Procedure + +

Section 1 - Procedure

We start by creating the idea that everything in the game has a monetary value:

- -

A price is a kind of value. $10 specifies a price. A thing has a price. + +

A price is a kind of value. $10 specifies a price. A thing has a price.

- -

Understand "give [things preferably held] to [someone]" as multiply-giving it to. Understand "give [things] to [someone]" as multiply-giving it to. Multiply-giving it to is an action applying to two things. + +

Understand "give [things preferably held] to [someone]" as multiply-giving it to. Understand "give [things] to [someone]" as multiply-giving it to. Multiply-giving it to is an action applying to two things.

A subtlety here: we say "things preferably held" to prefer items that the player is holding (so if the player has two dollars in hand and a third lies on the ground, he will use just the two he has).

The second grammar line allows Inform to match things that aren't held if it can't make up the list from things that are. If all three dollars are on the ground, the player can pick them up before spending them.

We do not, however, make multiply-giving apply to a "carried" item, because that will generate implicit takes of those items in a way that will mess up our action reporting. Instead, we're going to build the implicit takes into the system in a different way, one that permits us to collate the reports more attractively and print a short, one-sentence list of anything that the player had to pick up.

- -

A thing can be given or ungiven. A thing is usually ungiven. + +

A thing can be given or ungiven. A thing is usually ungiven.

This is for record-keeping purposes so that we can print an attractive list of what was given at the end of the turn.

- -

First check multiply-giving it to: + +

First check multiply-giving it to:
    if already gave at the office is true:
@@ -774,14 +774,14 @@

- -

Already gave at the office is a truth state that varies. + +

Already gave at the office is a truth state that varies.

"Already gave at the office" is the perhaps-excessively-named flag that keeps track of whether we've already done this action once.

- -

Check multiply-giving something to the player: + +

Check multiply-giving something to the player:
        now already gave at the office is true;
@@ -790,8 +790,8 @@

The following rule is longish because it processes the entire list at once, generating implicit takes if necessary (but processing those implicit takes silently according to its own special rule, so that the output can be managed attractively). We are also, at the same time, calculating the total value of the player's offer.

- -

Check multiply-giving it to: + +

Check multiply-giving it to:
    let L be the multiple object list;
@@ -832,8 +832,8 @@

The bit about making some items "marked for listing", above, rather than printing the list directly, is that using the "[the list of....]" syntax guarantees that Inform will respect grouping rules in writing its description. For instance, if the player has automatically taken all three dollars, the output will say "the three dollars" instead of "the dollar, the dollar, and the dollar."

- -

Carry out multiply-giving it to: + +

Carry out multiply-giving it to:
    let L be the multiple object list;
@@ -847,8 +847,8 @@

- -

Report multiply-giving it to: + +

Report multiply-giving it to:
    say "[The second noun] rather shamefacedly tucks [the list of given things] away into a pocket.[paragraph break]".

@@ -856,13 +856,13 @@

Now we create our own variation of implicitly taking in order to customize the output for the multiply-giving action. The "ungivability rules" should disallow any object that the player absolutely cannot take, because we want "carry out the implicitly taking activity" to succeed every time -- and therefore not print out any less-attractive results from implicit takes that don't succeed. Otherwise, the player's GIVE TREE AND DOG TO ATTENDANT might produce the reply "That's fixed in place" -- without specifying which object is fixed in place.

Because of the way this works, we will want to be careful: if we have any "instead of taking..." rules for special objects in the game, we should be sure to mirror those with an ungivability rule to print something more suitable in the case that the player tries taking that object as part of the multiple giving action.

- -

The ungivability rules are an object-based rulebook. + +

The ungivability rules are an object-based rulebook.

- -

An ungivability rule for a person: + +

An ungivability rule for a person:
    now already gave at the office is true;
@@ -870,8 +870,8 @@

- -

An ungivability rule for something (called the item) which is enclosed by someone who is not the player: + +

An ungivability rule for something (called the item) which is enclosed by someone who is not the player:
    now already gave at the office is true;
@@ -879,8 +879,8 @@

- -

An ungivability rule for something which encloses the player: + +

An ungivability rule for something which encloses the player:
    now already gave at the office is true;
@@ -888,8 +888,8 @@

- -

An ungivability rule for something (called the item) which is part of something: + +

An ungivability rule for something (called the item) which is part of something:
    now already gave at the office is true;
@@ -897,8 +897,8 @@

- -

An ungivability rule for something (called the item) which is scenery: + +

An ungivability rule for something (called the item) which is scenery:
    now already gave at the office is true;
@@ -906,8 +906,8 @@

- -

An ungivability rule for something (called the item) which is fixed in place: + +

An ungivability rule for something (called the item) which is fixed in place:
    now already gave at the office is true;
@@ -915,8 +915,8 @@

- -

An ungivability rule for a direction (called the item): + +

An ungivability rule for a direction (called the item):
    now already gave at the office is true;
@@ -924,8 +924,8 @@

- -

Rule for implicitly taking something (called target) while multiply-giving: + +

Rule for implicitly taking something (called target) while multiply-giving:
    silently try taking the target;
@@ -935,19 +935,19 @@

- -

The recently-collected list is a list of objects that varies. + +

The recently-collected list is a list of objects that varies.

And since we don't want to list the individual objects separately:

- -

The selectively announce items from multiple object lists rule is listed instead of the announce items from multiple object lists rule in the action-processing rules. + +

The selectively announce items from multiple object lists rule is listed instead of the announce items from multiple object lists rule in the action-processing rules.

- -

This is the selectively announce items from multiple object lists rule: + +

This is the selectively announce items from multiple object lists rule:
    if multiply-giving:
@@ -962,8 +962,8 @@

And now, since this ought to work symmetrically if the player provides just one high-value item:

- -

Check giving something to someone: + +

Check giving something to someone:
    if the price of the noun is less than the price of the second noun:
@@ -972,31 +972,31 @@

As we've seen elsewhere, the giving action by default returns a refusal, but is also written to start working if we remove the blockage. So we do that here, and revise the report rule to match the report rule we have for multiple giving.

- -

The block giving rule is not listed in any rulebook. + +

The block giving rule is not listed in any rulebook.

- -

The new report giving rule is listed instead of the standard report giving rule in the report giving it to rules. + +

The new report giving rule is listed instead of the standard report giving rule in the report giving it to rules.

- -

This is the new report giving rule: + +

This is the new report giving rule:
    say "[The second noun] rather shamefacedly tucks [the noun] away into a pocket."

After each instance of the multiply-giving action, we need to clear the variables we used to track its state. We could do this in "Before reading a command", but that's unsafe because the player might type GIVE PIE AND CAP TO ATTENDANT. GIVE DOLLARS TO ATTENDANT. all on a single line, and we would like to be able to clear the variables between one action and the next. The correct place to attach this behavior is immediately before the generate action rule, thus:

- -

The before-generation rule is listed before the generate action rule in the turn sequence rules. + +

The before-generation rule is listed before the generate action rule in the turn sequence rules.

- -

This is the before-generation rule: + +

This is the before-generation rule:
    now every thing is ungiven;
@@ -1006,63 +1006,63 @@

+ +

Section 2 - Scenario +

+
+ + +

The Morgue Office is a room. "This is not the Morgue itself; this is only its outer office. The familiar room full of silver drawers and cold air lies beyond." +

+
+ -

Section 2 - Scenario +

The Morgue Attendant is a man in the Morgue Office. "The Attendant has seen you come through a number of times, and is becoming suspicious of your abiding interest in dead people." The description is "The Morgue Attendant is fifty-four years, six months, five days, and three minutes old." The price of the Morgue Attendant is $3.

-

The Morgue Office is a room. "This is not the Morgue itself; this is only its outer office. The familiar room full of silver drawers and cold air lies beyond." +

A dollar is a kind of thing. The player carries three dollars. The price of a dollar is always $1.

-

The Morgue Attendant is a man in the Morgue Office. "The Attendant has seen you come through a number of times, and is becoming suspicious of your abiding interest in dead people." The description is "The Morgue Attendant is fifty-four years, six months, five days, and three minutes old." The price of the Morgue Attendant is $3. +

The player carries a miniature rhubarb pie. The price of the miniature rhubarb pie is $5.

-

A dollar is a kind of thing. The player carries three dollars. The price of a dollar is always $1. +

The player carries a knitted cap. The price of the knitted cap is $2.

-

The player carries a miniature rhubarb pie. The price of the miniature rhubarb pie is $5. +

Test me with "test dollars / purloin three dollars / test multi-line / purloin three dollars / purloin pie / purloin cap / test specificity / purloin three dollars / test largesse / test mixed-gift".

-

The player carries a knitted cap. The price of the knitted cap is $2. +

Test multi-line with "give dollar and pie to attendant. give dollars and cap to attendant".

-

Test me with "test dollars / purloin three dollars / test multi-line / purloin three dollars / purloin pie / purloin cap / test specificity / purloin three dollars / test largesse / test mixed-gift". +

Test dollars with "drop all / give dollar to Morgue Attendant / give dollars to Morgue Attendant / get dollars / give dollars to morgue attendant / purloin three dollars / drop dollars / give dollars to Morgue Attendant".

-

Test multi-line with "give dollar and pie to attendant. give dollars and cap to attendant". +

Test specificity with "give three dollars to Morgue Attendant".

-

Test dollars with "drop all / give dollar to Morgue Attendant / give dollars to Morgue Attendant / get dollars / give dollars to morgue attendant / purloin three dollars / drop dollars / give dollars to Morgue Attendant". +

Test largesse with "give pie to Morgue Attendant".

-

Test specificity with "give three dollars to Morgue Attendant". -

-
- - -

Test largesse with "give pie to Morgue Attendant". -

-
- - -

Test mixed-gift with "give dollar and cap to Morgue Attendant / get cap / give dollar and cap to morgue attendant / give me and dollar to attendant". +

Test mixed-gift with "give dollar and cap to Morgue Attendant / get cap / give dollar and cap to morgue attendant / give me and dollar to attendant".

diff --git a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc45.html b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc45.html index e6c3bf2d..32d8b64c 100644 --- a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc45.html +++ b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc45.html @@ -86,8 +86,8 @@

Sometimes this can be done with good rules about the assumptions Inform should make. Alpaca Farm demonstrates a USE command, always a challenge because USE can mean very different actions with different items.

There are also times when we need to ask the player for more information. Apples demonstrates how sensibly to use properties to disambiguate between similar objects, while Walls and Noses rephrases the disambiguation question when special objects are involved: examining one of the walls of the room will make the story ask "In which direction?" and EXAMINE NOSE will lead to "Whose nose do you mean, Frederica's, Betty's, Wilma's or your own?"

At other times, the player types something that is wrong in a predictable way: for instance, we might want to remove all the "with..." phrases from commands like

- -

HIT DOOR WITH FIST + +

HIT DOOR WITH FIST
KICK DRAGON WITH FOOT
@@ -117,7 +117,7 @@

- WI
+ WI @@ -126,109 +126,109 @@ @@ -262,73 +262,73 @@ @@ -404,8 +404,8 @@ @@ -495,23 +495,23 @@ @@ -648,28 +648,28 @@

The next problem, though, is that after we've edited the player's text we want to feed the corrected version back to Inform and try once more to interpret it.

This is where we have a valid reason to write a new "rule for reading a command". We will tell Inform that when we have just corrected the player's input to something new, it should not ask for a new command (by printing a prompt and waiting for another line of input); it should instead paste our stored corrected command back into "the player's command" and proceed as though that new text had just been typed.

Thanks to John Clemens for the specifics of the implementation.

- -

paste@2x.png create@2x.png   "Cave-troll" by JDC + +

paste@2x.png create@2x.png   "Cave-troll" by JDC

- -

Section 1 - The Mechanism + +

Section 1 - The Mechanism

- -

The last command is a text that varies. + +

The last command is a text that varies.

- -

The parser error flag is a truth state that varies. The parser error flag is false. + +

The parser error flag is a truth state that varies. The parser error flag is false.

- -

Rule for printing a parser error when the latest parser error is the only understood as far as error and the player's command matches the text "with": + +

Rule for printing a parser error when the latest parser error is the only understood as far as error and the player's command matches the text "with":
    now the last command is the player's command;
@@ -685,8 +685,8 @@

- -

Rule for reading a command when the parser error flag is true: + +

Rule for reading a command when the parser error flag is true:
    now the parser error flag is false;
@@ -694,33 +694,33 @@

- -

Section 2 - The Scenario + +

Section 2 - The Scenario

- -

The Cave is a room. + +

The Cave is a room.

- -

The troll is a man in the cave. + +

The troll is a man in the cave.

- -

The player carries a sword. + +

The player carries a sword.

- -

The chest is a locked lockable container in the cave. + +

The chest is a locked lockable container in the cave.

- -

Test me with "attack troll with sword / unlock chest with sword / attack troll as a test". + +

Test me with "attack troll with sword / unlock chest with sword / attack troll as a test".

diff --git a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc46.html b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc46.html index 5c7ea96b..3ec44161 100644 --- a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc46.html +++ b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc46.html @@ -107,7 +107,7 @@
- WI
+ WI @@ -118,28 +118,28 @@

Now and then in IF there is a situation where we need to ask the player for a numbered choice rather than an ordinary action command. What's more, that numbered choice might change during the game, so we don't want to just hard-wire the meanings of "1", "2", and "3" whenever the player types them.

A better trick is to keep a list or table (we'll use a table here because it involves slightly less overhead) recording what the player's numerical choices currently mean. Then every time the player selects a number, the table is consulted, and if the number corresponds to something, the player's choice is acted on.

In our example, we'll have a transporter pad that can take the player to any room in the game that he's already visited. (Just for the sake of example, we'll start him off with a few pre-visited rooms.)

- -

paste@2x.png create@2x.png   "Down in Oodville" + +

paste@2x.png create@2x.png   "Down in Oodville"

- -

Section 1 - Method + +

Section 1 - Method

- -

Understand "[number]" as selecting. + +

Understand "[number]" as selecting.

- -

Selecting is an action applying to one number. + +

Selecting is an action applying to one number.

- -

Check selecting: [assuming we don't want to be able to transport from just anywhere] + +

Check selecting: [assuming we don't want to be able to transport from just anywhere]
    if the player is not on the transporter pad:
@@ -149,8 +149,8 @@

- -

Check selecting: + +

Check selecting:
    if the number understood is greater than the number of filled rows in the Table of Transport Options or the number understood is less than one:
@@ -160,8 +160,8 @@

- -

Carry out selecting: + +

Carry out selecting:
    let N be the number understood; [not actually a necessary step, but it makes the next line easier to understand]
@@ -177,8 +177,8 @@

- -

To list the transport options: + +

To list the transport options:
    let N be 1;
@@ -192,8 +192,8 @@

- -

To empty the transport options: + +

To empty the transport options:
    repeat through the Table of Transport Options:
@@ -201,8 +201,8 @@

- -

To load the transport options: + +

To load the transport options:
    repeat with interesting room running through visited rooms which are not the Transporter Room:
@@ -212,8 +212,8 @@

- -

Table of Transport Options + +

Table of Transport Options
transport
@@ -223,13 +223,13 @@

- -

Understand "home" as homing. Homing is an action applying to nothing. + +

Understand "home" as homing. Homing is an action applying to nothing.

- -

Check homing: + +

Check homing:
    if the player is in the Transporter Room:
@@ -237,40 +237,40 @@

- -

Carry out homing: + +

Carry out homing:
    move the player to the transporter room.

- -

Section 2 - Scenario + +

Section 2 - Scenario

- -

The Transporter Room is a room. + +

The Transporter Room is a room.

- -

Oodville is a visited room. + +

Oodville is a visited room.

- -

Midnight is a visited room. The Diamond City is west of Midnight. + +

Midnight is a visited room. The Diamond City is west of Midnight.

- -

The transporter pad is an enterable supporter in the Transporter Room. "The transporter pad in the middle of the floor is currently dull blue: powered but unoccupied." + +

The transporter pad is an enterable supporter in the Transporter Room. "The transporter pad in the middle of the floor is currently dull blue: powered but unoccupied."

- -

After entering the transporter pad: + +

After entering the transporter pad:
    say "The transporter beeps and glows amber as you step onto its surface. A moment later a hologram displays your options. [run paragraph on]";
@@ -282,8 +282,8 @@

- -

Test me with "get on pad / 0 / -1 / 8 / 2 / look / w / home / get on pad / get off pad / 3". + +

Test me with "get on pad / 0 / -1 / 8 / 2 / look / w / home / get on pad / get off pad / 3".

@@ -307,7 +307,7 @@
- WI
+ WI @@ -317,19 +317,19 @@ @@ -455,18 +455,18 @@

§7.1. Getting Acquainted

Talking about characters presents some special challenges. For one thing, some characters are referred to by a proper name, but others are not: so the story might want to talk about "Jack" but also about "the drunk pedestrian". In the absence of other information, Inform attempts to divine our intentions based on the words with which we defined a new character: but we can always override its guess with an explicit statement, such as

- -

The Great Malefactor is proper-named. + +

The Great Malefactor is proper-named.

@@ -113,7 +113,7 @@
- WI
+ WI @@ -121,23 +121,23 @@ @@ -169,37 +169,37 @@ @@ -232,58 +232,58 @@ @@ -331,18 +331,18 @@ @@ -391,33 +391,33 @@ @@ -481,34 +481,34 @@ @@ -134,32 +134,32 @@ @@ -199,58 +199,58 @@ @@ -292,41 +292,41 @@ @@ -385,33 +385,33 @@ @@ -113,87 +113,87 @@ @@ -227,48 +227,48 @@ @@ -338,35 +338,35 @@ @@ -448,29 +448,29 @@ @@ -606,89 +606,89 @@ @@ -731,123 +731,123 @@ @@ -1226,325 +1226,325 @@ @@ -115,49 +115,49 @@ @@ -189,27 +189,27 @@ @@ -282,18 +282,18 @@ @@ -427,43 +427,43 @@ @@ -495,50 +495,50 @@ @@ -572,25 +572,25 @@

The most straightforward way to alter the response text for something in the standard rules is to select the Index tab, then select Actions, then pick the particular action whose text we'd like to alter. Under action details, there will be icons that look like speech bubbles.

Clicking on the speech bubble will show what the current response text is, and give us an option called "set".

If we click "set", this will automatically paste in the response name that we need to change. We can put this inside a "when play begins" rule in order to make that change take effect from the start of the game, like so:

- -

paste@2x.png create@2x.png   "Responsive" + +

paste@2x.png create@2x.png   "Responsive"

- -

An Anonymous B613 Cell is a room. "There isn't much to see in this bare room. What there is, you've already seen sometime in the last twenty years." + +

An Anonymous B613 Cell is a room. "There isn't much to see in this bare room. What there is, you've already seen sometime in the last twenty years."

- -

When play begins: + +

When play begins:
    now print empty inventory rule response (A) is "[We] [have] absolutely nothing.".

- -

Test me with "i". + +

Test me with "i".

@@ -613,7 +613,7 @@
- WI
+ WI @@ -623,28 +623,28 @@ @@ -705,23 +705,23 @@ @@ -795,13 +795,13 @@

We can now change the case of any text produced by a "to say..." phrase. This is often useful when we would like to make use of a standard say phrase in some new context. Say, for instance, that we would like to "[is-are the list...]" in a context that needs the first letter to be capitalized.

We could write a new say phrase, such as "to say is-are the list of (N - a description of objects) in sentence capitalization"; but there is an easier way, and that is to set a text variable to the output of the to say phrase, and then print that text in the case of our choice.

For example:

- -

paste@2x.png create@2x.png   "Rocket Man" + +

paste@2x.png create@2x.png   "Rocket Man"

- -

Instead of going somewhere from the spaceport when the player carries something: + +

Instead of going somewhere from the spaceport when the player carries something:
    let N be "[is-are the list of things carried by the player] really suitable gear to take to the moon?" in sentence case;
@@ -809,18 +809,18 @@

- -

The Spaceport is a room. North of the Spaceport is the Rocket Launch Pad. The player carries a stuffed bear, a chocolate cookie, and a book. + +

The Spaceport is a room. North of the Spaceport is the Rocket Launch Pad. The player carries a stuffed bear, a chocolate cookie, and a book.

- -

The description of the book is "It is entitled [italic type]Why Not To Take [sentence cased inventory] To The Moon[roman type]." + +

The description of the book is "It is entitled [italic type]Why Not To Take [sentence cased inventory] To The Moon[roman type]."

- -

To say sentence cased inventory: + +

To say sentence cased inventory:
    let N be "[a list of things carried by the player]" in title case;
@@ -828,8 +828,8 @@

- -

Test me with "n / x book". + +

Test me with "n / x book".

@@ -852,7 +852,7 @@
- WI
+ WI @@ -861,23 +861,23 @@ @@ -926,24 +926,24 @@ @@ -1005,33 +1005,33 @@ @@ -1095,51 +1095,51 @@

Mostly the Standard Rules use verbs adapted to finite forms ("he jumped", "we take the hammer", and so on). But Inform can also produce participles to describe actions that are ongoing: "he is carrying the fedora" or "taking the hammer..."

In this example, we give non-player characters actions to perform and then have Inform dynamically describe what they're doing when the player chooses to look.

We start by establishing the idea that a verb can describe a particular action:

- -

paste@2x.png create@2x.png   "Fun with Participles" + +

paste@2x.png create@2x.png   "Fun with Participles"

- -

Section 1 - Descriptive Functionality + +

Section 1 - Descriptive Functionality

- -

Describing relates various verbs to various action names. The verb to describe means the describing relation. + +

Describing relates various verbs to various action names. The verb to describe means the describing relation.

- -

To look around is a verb. The verb look around describes the looking action. + +

To look around is a verb. The verb look around describes the looking action.

- -

To stand about is a verb. The verb stand about describes the waiting action. To look bored is a verb. The verb look bored describes the waiting action. To waste time is a verb. The verb waste time describes the waiting action. + +

To stand about is a verb. The verb stand about describes the waiting action. To look bored is a verb. The verb look bored describes the waiting action. To waste time is a verb. The verb waste time describes the waiting action.

- -

To jump is a verb. To leap is a verb. To pirouette is a verb. The verb jump describes the jumping action. The verb leap describes the jumping action. The verb pirouette describes the jumping action. + +

To jump is a verb. To leap is a verb. To pirouette is a verb. The verb jump describes the jumping action. The verb leap describes the jumping action. The verb pirouette describes the jumping action.

Now we need to give every character some sort of idle activity. By default, we'll have people just be waiting, but allow for that idle activity to change into something more interesting if the player has told them to do something else.

- -

A person has an action name called the current idle. The current idle of a person is usually the waiting action. + +

A person has an action name called the current idle. The current idle of a person is usually the waiting action.

- -

Rule for writing a paragraph about someone (called chosen person) when a verb describes the current idle of the chosen person: + +

Rule for writing a paragraph about someone (called chosen person) when a verb describes the current idle of the chosen person:
    say "[The chosen person] [are] here, [present participle of a random verb that describes (the current idle of the chosen person)]."

- -

Instead of someone doing something: + +

Instead of someone doing something:
    now the current idle of the person asked is (the action name part of the current action);
@@ -1147,26 +1147,26 @@

- -

A persuasion rule: + +

A persuasion rule:
    persuasion succeeds.

- -

Section 2 - Scenario + +

Section 2 - Scenario

- -

Lab is a room. The fedora is a wearable thing in the Lab. Clark is a man in the Lab. + +

Lab is a room. The fedora is a wearable thing in the Lab. Clark is a man in the Lab.

And just to give past participles a test-drive as well, let's make Clark a bit of a drama king:

- -

After Clark doing something when a verb describes (the action name part of the current action): + +

After Clark doing something when a verb describes (the action name part of the current action):
    say "'Fine, have it your way!' Clark exclaims. 'But I have [past participle of a random verb that describes (the action name part of the current action)] for the last time!'";
@@ -1174,8 +1174,8 @@

- -

Test me with "look / Clark, jump / look / Clark, look / look / Clark, wait". + +

Test me with "look / Clark, jump / look / Clark, look / look / Clark, wait".

@@ -1198,7 +1198,7 @@
- WI
+ WI @@ -1207,48 +1207,48 @@ @@ -1316,23 +1316,23 @@ @@ -1516,28 +1516,28 @@ @@ -1630,18 +1630,18 @@

Suppose that we wanted authors to be able to indicate which relations should or should not be included in room descriptions, and have the system dynamically honor that instruction.

Inform already knows about verbs for describing supporting, containment, carrying, and wearing, so we could write a set of instructions to handle such cases. To do this, we're using the "writing a paragraph about" activity, which is described in the chapter on activities.

The following uses what is, strictly speaking, a piece of internal machinery not really intended for public use: a variable called "prior named object" which keeps track of what noun other words should agree with. It is not safe to use this variable except to clear it: "now the prior named object is nothing". In a few situations, this prevents glitches in adaptive text.

- -

paste@2x.png create@2x.png   "Relevant Relations" + +

paste@2x.png create@2x.png   "Relevant Relations"

- -

Section 1 - Procedure + +

Section 1 - Procedure

- -

Rule for writing a paragraph about something (called item): + +

Rule for writing a paragraph about something (called item):
    now the current paragraph is { };
@@ -1661,8 +1661,8 @@

- -

Rule for writing a paragraph about someone (called chosen person): + +

Rule for writing a paragraph about someone (called chosen person):
    now the current paragraph is { };
@@ -1682,13 +1682,13 @@

- -

The descriptive rules are an object-based rulebook. + +

The descriptive rules are an object-based rulebook.

- -

Definition: a container is see-through: + +

Definition: a container is see-through:
    if it is transparent:
@@ -1702,48 +1702,48 @@

- -

A descriptive rule for a see-through container (called item) (this is the describe contents rule): + +

A descriptive rule for a see-through container (called item) (this is the describe contents rule):
    describe the containment relation for item.

- -

A descriptive rule for a supporter (called item): + +

A descriptive rule for a supporter (called item):
    describe the support relation for item.

- -

A descriptive rule for a person (called item): + +

A descriptive rule for a person (called item):
    describe the wearing relation for the item.

- -

A descriptive rule for a person (called item): + +

A descriptive rule for a person (called item):
    describe the carrying relation for the item.

- -

The current paragraph is a list of things that varies. + +

The current paragraph is a list of things that varies.

- -

Before printing the name of something (called mentioned target) while writing a paragraph about something: + +

Before printing the name of something (called mentioned target) while writing a paragraph about something:
    add the mentioned target to the current paragraph, if absent.

- -

To describe (R - a relation of objects) for (item - a thing): + +

To describe (R - a relation of objects) for (item - a thing):
    if a thing to which item relates by R is a thing:
@@ -1751,15 +1751,15 @@

- -

To decide which text is the rendering of (V - verb) (this is verb rendering): + +

To decide which text is the rendering of (V - verb) (this is verb rendering):
    decide on "[adapt V]".

- -

To say (T - a thing) with pronoun: + +

To say (T - a thing) with pronoun:
    if T is the prior named object:
@@ -1771,44 +1771,44 @@

- -

Section 2 - Scenario + +

Section 2 - Scenario

- -

The Space Elevator is a room. "Mercifully, there aren't any windows. The ability to see how far up you are would almost certainly make you ill." + +

The Space Elevator is a room. "Mercifully, there aren't any windows. The ability to see how far up you are would almost certainly make you ill."

- -

The luggage rack is a supporter in the Space Elevator. The suitcase is a closed openable container on the luggage rack. The bouquet is on the luggage rack. + +

The luggage rack is a supporter in the Space Elevator. The suitcase is a closed openable container on the luggage rack. The bouquet is on the luggage rack.

- -

Clark is a man in the Space Elevator. Clark is carrying a box of cupcakes. Clark is wearing a t-shirt. The description of the box of cupcakes is "They're the latest confection from Red Velvet Planet, the Martian bakery." + +

Clark is a man in the Space Elevator. Clark is carrying a box of cupcakes. Clark is wearing a t-shirt. The description of the box of cupcakes is "They're the latest confection from Red Velvet Planet, the Martian bakery."

- -

Persuasion rule: persuasion succeeds. + +

Persuasion rule: persuasion succeeds.

We can if we like then add alternate names for these relations that will be randomly swapped in some of the time. For instance:

- -

To sport is a verb. The verb to sport means the wearing relation. + +

To sport is a verb. The verb to sport means the wearing relation.

- -

To hold up is a verb. The verb to hold up means the support relation. + +

To hold up is a verb. The verb to hold up means the support relation.

- -

Test me with "clark, drop the box / look / clark, take the suitcase / look / clark, get bouquet". + +

Test me with "clark, drop the box / look / clark, take the suitcase / look / clark, get bouquet".

@@ -1832,7 +1832,7 @@
- WI
+ WI @@ -1841,13 +1841,13 @@ @@ -1999,31 +1999,31 @@ @@ -2105,33 +2105,33 @@

As we saw in "Variety", we can associate verbs with particular actions and call them up as needed. If we do that, though, we can also store additional information about those verbs and use that information to select the ideal verb to use in a particular situation.

In this example, we create a table of verbs and their meanings, together with some connotative information. Each time we report an action, we then score all the available verbs to decide which is the most suitable to use at the moment. This allows us to change the narrator's diction change mid-game and have the action descriptions change as well.

Moreover, because we're using adaptive verbs, these responses will automatically inflect properly even if we change the story tense and viewpoint.

- -

paste@2x.png create@2x.png   "Narrative Register" + +

paste@2x.png create@2x.png   "Narrative Register"

- -

Section 1 - Descriptive Functionality + +

Section 1 - Descriptive Functionality

- -

Describing relates various verbs to various action names. The verb to describe means the describing relation. + +

Describing relates various verbs to various action names. The verb to describe means the describing relation.

- -

To take is a verb. To acquire is a verb. To get is a verb. To gain is a verb. To obtain is a verb. To pick up is a verb. To bag is a verb. To procure is a verb. To score is a verb. To grab is a verb. To snag is a verb. To snatch is a verb. To collect is a verb. + +

To take is a verb. To acquire is a verb. To get is a verb. To gain is a verb. To obtain is a verb. To pick up is a verb. To bag is a verb. To procure is a verb. To score is a verb. To grab is a verb. To snag is a verb. To snatch is a verb. To collect is a verb.

- -

To drop is a verb. To put down is a verb. To discard is a verb. To throw away is a verb. To dispose of is a verb. To set down is a verb. To toss aside is a verb. To ditch is a verb. To abandon is a verb. To dump is a verb. To jettison is a verb. To abjure is a verb. To foresake is a verb. To dispense with is a verb. + +

To drop is a verb. To put down is a verb. To discard is a verb. To throw away is a verb. To dispose of is a verb. To set down is a verb. To toss aside is a verb. To ditch is a verb. To abandon is a verb. To dump is a verb. To jettison is a verb. To abjure is a verb. To foresake is a verb. To dispense with is a verb.

- -

After an actor doing something to something when a verb describes (the action name part of the current action) (this is the apply random verbs to describing actions rule): + +

After an actor doing something to something when a verb describes (the action name part of the current action) (this is the apply random verbs to describing actions rule):
    score the relevant verbs;
@@ -2155,15 +2155,15 @@

- -

To decide which text is the rendering of (V - verb) (this is verb rendering): + +

To decide which text is the rendering of (V - verb) (this is verb rendering):
    decide on "[adapt V]".

- -

To score the relevant verbs: + +

To score the relevant verbs:
    repeat through the Table of Verb Meanings:
@@ -2183,8 +2183,8 @@

- -

To erase relevance: + +

To erase relevance:
    repeat through Table of Verb Meanings:
@@ -2192,23 +2192,23 @@

- -

A tonality is a kind of value. The tonalities are pompous, archaic, slangy, upbeat, downbeat. + +

A tonality is a kind of value. The tonalities are pompous, archaic, slangy, upbeat, downbeat.

- -

Connoting relates various verbs to various tonalities. The verb to connote means the connoting relation. + +

Connoting relates various verbs to various tonalities. The verb to connote means the connoting relation.

- -

The current register is a list of tonalities that varies. The current register is { }. + +

The current register is a list of tonalities that varies. The current register is { }.

- -

When play begins: + +

When play begins:
    repeat through the Table of Verb Meanings:
@@ -2222,8 +2222,8 @@

- -

Table of Verb Meanings + +

Table of Verb Meanings

@@ -2628,18 +2628,18 @@

- -

Section 2 - Changing Tone Mid-Game + +

Section 2 - Changing Tone Mid-Game

- -

Understand "new tone" as changing the tone. Changing the tone is an action out of world. + +

Understand "new tone" as changing the tone. Changing the tone is an action out of world.

- -

Carry out changing the tone: + +

Carry out changing the tone:
    now the current register is { };
@@ -2657,18 +2657,18 @@

- -

Section 3 - Scenario + +

Section 3 - Scenario

- -

Lab is a room. The table is here. The bat and the ball are on the table. + +

Lab is a room. The table is here. The bat and the ball are on the table.

- -

Test me with "get ball / drop ball / get bat / drop bat / new tone / get all / drop all / new tone / get all / drop all". + +

Test me with "get ball / drop ball / get bat / drop bat / new tone / get all / drop all / new tone / get all / drop all".

@@ -2691,7 +2691,7 @@
- WI
+ WI @@ -2699,30 +2699,30 @@ @@ -122,37 +122,37 @@ @@ -284,78 +284,78 @@ @@ -121,35 +121,35 @@ @@ -223,44 +223,44 @@ @@ -292,34 +292,34 @@ @@ -427,34 +427,34 @@ @@ -678,18 +678,18 @@ @@ -886,24 +886,24 @@ @@ -116,42 +116,42 @@ @@ -183,38 +183,38 @@ @@ -118,62 +118,62 @@ @@ -205,42 +205,42 @@ @@ -288,23 +288,23 @@ @@ -485,79 +485,79 @@ @@ -145,18 +145,18 @@ @@ -458,18 +458,18 @@ @@ -854,66 +854,66 @@

As we have seen, there are a number of different ways of controlling conversation in interactive fiction, and the best choice of way will depend quite a lot on what kind of work we're writing.

One common model is to replace Inform's default ASK and TELL commands with a TALK TO command. This gives the player less control than he would otherwise have: instead of asking a character about any topic under the sun, he's restricted to seeing (or not seeing) a single sequence of text that the author has written in advance. On the other hand, such a system is harder for the player to break (since he can never ask about a topic that the author hasn't implemented), and easier for the author to tie into plot developments. If we give TALK TO different output at each scene, we get conversation that is always tied to the current state of the plot.

This is a design approach that works best in a game with a large number of short, focused scenes. For other kinds of conversation system design, compare the other examples listed in the Recipe Book.

- -

paste@2x.png create@2x.png   "The Cheese-makers" by Phrynichus. + +

paste@2x.png create@2x.png   "The Cheese-makers" by Phrynichus.

- -

Chapter 1 - Replacing old talk commands and making a new one + +

Chapter 1 - Replacing old talk commands and making a new one

Here, using some techniques that will be discussed in the chapter on Understanding, we get rid of Inform's default handling of ASK and TELL, and create our own TALK TO action instead:

- -

Understand the commands "ask" and "tell" and "say" and "answer" as something new. + +

Understand the commands "ask" and "tell" and "say" and "answer" as something new.

- -

Understand "ask [text]" or "tell [text]" or "answer [text]" or "say [text]" as a mistake ("[talk to instead]"). + +

Understand "ask [text]" or "tell [text]" or "answer [text]" or "say [text]" as a mistake ("[talk to instead]").

- -

Instead of asking someone to try doing something: + +

Instead of asking someone to try doing something:
    say "[talk to instead][paragraph break]".

- -

Instead of answering someone that something: + +

Instead of answering someone that something:
    say "[talk to instead][paragraph break]".

- -

To say talk to instead: + +

To say talk to instead:
    say "(To communicate in [story title], TALK TO a character.) "

- -

Understand "talk to [someone]" as talking to. Understand "talk to [something]" as talking to. Talking to is an action applying to one visible thing. + +

Understand "talk to [someone]" as talking to. Understand "talk to [something]" as talking to. Talking to is an action applying to one visible thing.

- -

Chapter 2 - Specific scenes and talking + +

Chapter 2 - Specific scenes and talking

Now, suppose we have a situation -- say, a stage play -- in which it is appropriate to talk to different characters at different times. During the prologue of the play, no one else is on-stage, and the player is to address the audience directly:

- -

Section 1 - Prologue + +

Section 1 - Prologue

- -

When play begins: + +

When play begins:
    now right hand status line is "416 BC";
@@ -921,30 +921,30 @@

- -

Prologue is a scene. Prologue begins when play begins. + +

Prologue is a scene. Prologue begins when play begins.

- -

The Theater of Dionysus is a room. + +

The Theater of Dionysus is a room.

- -

The audience is a person in the Theater. "The usual audience looks on: the priests and judges in the front row, and then Athenians, metics, and foreigners." The audience can be prepared or unprepared. The description is "Have you ever seen such a company of perjurers, pathics, and thieves?" Understand "priest" or "priests" or "priest of dionysus" or "judge" or "judges" or "athenians" or "metics" or "foreigners" as the audience. + +

The audience is a person in the Theater. "The usual audience looks on: the priests and judges in the front row, and then Athenians, metics, and foreigners." The audience can be prepared or unprepared. The description is "Have you ever seen such a company of perjurers, pathics, and thieves?" Understand "priest" or "priests" or "priest of dionysus" or "judge" or "judges" or "athenians" or "metics" or "foreigners" as the audience.

- -

Instead of talking to the player when the Prologue is happening: + +

Instead of talking to the player when the Prologue is happening:
    say "There will be plenty of occasion for muttered asides later in the play, but for now you must prepare the audience for things to come."

- -

Instead of talking to the audience when the Prologue is happening: + +

Instead of talking to the audience when the Prologue is happening:
    say "Drawing breath, you turn to the audience, and offer them a genial, witty, colorful, and of course crude synopsis of what they are about to see; describing all the characters in unmistakable terms and not omitting the most important of them all, your august self.";
@@ -952,55 +952,55 @@

- -

Instead of talking to the audience when the Prologue has happened: + +

Instead of talking to the audience when the Prologue has happened:
    say "You may only direct monologues to the audience when the other actors are off-stage. Otherwise, their characters might have to notice."

- -

Prologue ends when the audience is prepared. + +

Prologue ends when the audience is prepared.

But there might follow a scene in which the player shouldn't talk at all:

- -

Section 2 - Parodos + +

Section 2 - Parodos

- -

Parodos is a scene. Parodos begins when Prologue ends. + +

Parodos is a scene. Parodos begins when Prologue ends.

- -

When Parodos begins: + +

When Parodos begins:
    move the chorus to the theater.

- -

Instead of talking to someone during Parodos: + +

Instead of talking to someone during Parodos:
    say "Sssh: this moment belongs to the chorus. They've worked so hard on it, after all."

- -

Parodos ends when the time since Parodos began is 4 minutes. + +

Parodos ends when the time since Parodos began is 4 minutes.

- -

The chorus is a person. The description is "They are dressed in exaggerated rural costume and feminine masks, as they are meant to represent a company of female cheese-makers from the Spartan-occupied deme of Dekeleia." Understand "cheesewives" or "cheese-makers" or "chorus-leader" as the chorus. + +

The chorus is a person. The description is "They are dressed in exaggerated rural costume and feminine masks, as they are meant to represent a company of female cheese-makers from the Spartan-occupied deme of Dekeleia." Understand "cheesewives" or "cheese-makers" or "chorus-leader" as the chorus.

- -

Every turn during Parodos: + +

Every turn during Parodos:
    repeat through Table of Choral Events:
@@ -1012,8 +1012,8 @@

- -

Table of Choral Events + +

Table of Choral Events
output
@@ -1028,26 +1028,26 @@

This last rule is a refinement borrowing from the Activities chapter, which gives characters different appearances in room descriptions depending on when we happen to look; because of the action of the play, we want to show the chorus and audience doing different things during different scenes.

- -

Rule for writing a paragraph about the chorus during Parodos: + +

Rule for writing a paragraph about the chorus during Parodos:
    say "The chorus are dancing and singing their way[if the time since Parodos began is less than 3 minutes] up the long walkways onto the stage[otherwise] into position in the orchestra[end if]. [The audience] appear to be pricing their costumes to the nearest obol: woe to the producer who cheats them of their due share of spectacle."

And now a scene in which the player can talk several times to a character (Heracles) but has no useful dialogue with the chorus, the audience, or himself. The prohibition from talking to the audience after the Prologue is already written, but we'll supply some appropriate responses for talking to the player or the chorus during this scene:

- -

Section 3 - Episode + +

Section 3 - Episode

- -

Episode is a scene. Episode begins when Parodos ends. + +

Episode is a scene. Episode begins when Parodos ends.

- -

When Episode begins: + +

When Episode begins:
    move Heracles to the theater;
@@ -1055,20 +1055,20 @@

- -

Heracles is a man. The description is "Hard to mistake in his lion skin and boots, and carrying a formidable club." Heracles wears a lion skin and boots. He carries a formidable club. Heracles can be placid or annoyed. Heracles is placid. Heracles can be satisfied, intrigued, or unsatisfied. Heracles is unsatisfied. + +

Heracles is a man. The description is "Hard to mistake in his lion skin and boots, and carrying a formidable club." Heracles wears a lion skin and boots. He carries a formidable club. Heracles can be placid or annoyed. Heracles is placid. Heracles can be satisfied, intrigued, or unsatisfied. Heracles is unsatisfied.

- -

Instead of talking to the chorus during Episode: + +

Instead of talking to the chorus during Episode:
    say "Your improvised flirtation with the chorus raises no response but a crude gesture from the chorus-leader, who seems to be modeling the role on Iambe."

- -

Instead of talking to the player during Episode: + +

Instead of talking to the player during Episode:
    if Heracles is annoyed:
@@ -1082,8 +1082,8 @@

- -

Instead of talking to Heracles when Heracles is unsatisfied during Episode: + +

Instead of talking to Heracles when Heracles is unsatisfied during Episode:
    say "'Dear Heracles, friendly Heracles,' you begin, cringing out of the way as he responds with one of his affectionate ox-killing punches to the shoulder. [paragraph break]But Heracles falls still, and looks almost thoughtful, as tell him you know how he may rout the Spartans, woo all twenty-four lactic ladies, and tame his savage gut with a bathtubful of porridge. [paragraph break]'Speak on, little man,' he says.";
@@ -1091,8 +1091,8 @@

- -

Instead of talking to Heracles when Heracles is intrigued during Episode: + +

Instead of talking to Heracles when Heracles is intrigued during Episode:
    say "It takes several exchanges for him to wrap his one-inch brain around your ten-inch plan; but in the end he embraces the scheme, the women, and your humble self.";
@@ -1100,8 +1100,8 @@

- -

Every turn when not talking to someone during Episode: + +

Every turn when not talking to someone during Episode:
    repeat through Table of Episodic Events:
@@ -1113,8 +1113,8 @@

- -

Table of Episodic Events + +

Table of Episodic Events
output
@@ -1138,20 +1138,20 @@

- -

Rule for writing a paragraph about Heracles during Episode: + +

Rule for writing a paragraph about Heracles during Episode:
    say "[Heracles] stands at the center of the orchestra, with members of [the chorus] ranged on either side. [paragraph break][The audience] appear to be reserving their judgement, though they show signs of restiveness at the usual jokes: must there be a Heracles in [italic type]every[roman type] play?"

- -

Episode ends successfully when Heracles is satisfied. + +

Episode ends successfully when Heracles is satisfied.

- -

When Episode ends successfully: + +

When Episode ends successfully:
    say "That, of course, is your cue: you're to come back on as Pan thirty verses from now, and it takes time to put on the hooves and the woolly-legged trousers.";
@@ -1159,20 +1159,20 @@

- -

Episode ends disastrously when the number of filled rows in the Table of Episodic Events is 0. + +

Episode ends disastrously when the number of filled rows in the Table of Episodic Events is 0.

- -

When Episode ends disastrously: + +

When Episode ends disastrously:
    end the story saying "The production has crashed to a halt".

- -

Test me with "ask audience about me / tell audience about me / audience, hello / audience, jump / talk to me / talk to audience / g / talk to chorus / look / x heracles / talk to me / talk to audience / z / look / talk to heracles / g". + +

Test me with "ask audience about me / tell audience about me / audience, hello / audience, jump / talk to me / talk to audience / g / talk to chorus / look / x heracles / talk to me / talk to audience / z / look / talk to heracles / g".

@@ -1195,7 +1195,7 @@
- WI
+ WI @@ -1204,13 +1204,13 @@ @@ -113,33 +113,33 @@ @@ -218,78 +218,78 @@ @@ -151,74 +151,74 @@ @@ -252,33 +252,33 @@ @@ -523,38 +523,38 @@ @@ -897,33 +897,33 @@ @@ -1123,33 +1123,33 @@ @@ -115,47 +115,47 @@ @@ -247,18 +247,18 @@ @@ -364,48 +364,48 @@ @@ -117,37 +117,37 @@ @@ -188,47 +188,47 @@ @@ -262,34 +262,34 @@ @@ -344,72 +344,72 @@ @@ -116,28 +116,28 @@ @@ -182,28 +182,28 @@ @@ -355,105 +355,105 @@ @@ -486,79 +486,79 @@ @@ -115,33 +115,33 @@ @@ -233,47 +233,47 @@ @@ -331,28 +331,28 @@ @@ -141,33 +141,33 @@

Within a room, we might have containers and supporters that a player can enter. A chair, stool, table, dais, or pedestal would be an enterable supporter (anything we would describe a person as being "on"); a cage, hammock, or booth would be an enterable container (because we would describe the person as being "inside").

When the player is in or on something, he is able to see the rest of the contents of the room, but a note such as "(in the hammock)" or "(on the poster bed)" is added to the room title when he looks around.

Here is an example to show off the possibilities:

- -

paste@2x.png create@2x.png   "Tamed" + +

paste@2x.png create@2x.png   "Tamed"

- -

The Center Ring is a room. The cage is in the Center Ring. A lion is an animal in the cage. The cage is enterable, openable, transparent, and closed. + +

The Center Ring is a room. The cage is in the Center Ring. A lion is an animal in the cage. The cage is enterable, openable, transparent, and closed.

Notice that we made the cage transparent. Strictly speaking it is not made of transparent materials, but we can see into (or out of) a closed cage due to the gaps between the bars, so that from Inform's point of view a cage behaves much like a large sturdy glass box. (If we really wanted to make a distinction between, say, an airtight container and one with perforations, we could do so, but Inform does not model such nuances by default.) If a container is not transparent, we can see into and out of it only when it is open.

Supporters are a bit more straightforward because there is no circumstance in which they separate the player from the rest of the world:

- -

The pedestal is in the Center Ring. It is enterable. + +

The pedestal is in the Center Ring. It is enterable.

And in fact we can tell Inform that the player starts on the pedestal with this line:

- -

The player is on a pedestal. + +

The player is on a pedestal.

Now the player will begin there rather than just in the Center Ring.

This last bit is an entirely unnecessary bit of local color, but if we're going to keep getting into and out of the lion's cage, we ought to expect him to take notice:

- -

Every turn when the player is in the cage: + +

Every turn when the player is in the cage:
    if a random chance of 1 in 2 succeeds, say "The lion eyes you with obvious discontent.";
@@ -177,25 +177,25 @@

Randomness is explained more completely in the chapter on Change, and every turn rules in the chapter on Time.

Finally, we might want a container whose interior is modeled as its own separate room: say, a magician's booth in which volunteers are made to disappear.

- -

The magician's booth is a container in Center Ring. "Off to one side is a magician's booth, used in disappearing acts. The exterior is covered with painted gilt stars." The booth is enterable, open, not openable, and fixed in place. + +

The magician's booth is a container in Center Ring. "Off to one side is a magician's booth, used in disappearing acts. The exterior is covered with painted gilt stars." The booth is enterable, open, not openable, and fixed in place.

Now we create our other location:

- -

Inside from the Center Ring is the Starry Vastness. + +

Inside from the Center Ring is the Starry Vastness.

...which handles the case of the player typing >IN. (We will not assume by default that he wants to get into the cage with the lion, this being obviously perilous.) But we also want to make sure that the player who types >ENTER BOOTH winds up in the same place, so we should add:

- -

Instead of entering the magician's booth: try going inside. + +

Instead of entering the magician's booth: try going inside.

- -

Test me with "get in cage / open cage / get in cage / z / close cage / out / open cage / get on pedestal / get off / look / enter booth / out". + +

Test me with "get in cage / open cage / get in cage / z / close cage / out / open cage / get on pedestal / get off / look / enter booth / out".

@@ -218,7 +218,7 @@
- WI
+ WI @@ -227,23 +227,23 @@ @@ -301,23 +301,23 @@ @@ -455,28 +455,28 @@ @@ -550,58 +550,58 @@ @@ -760,33 +760,33 @@ @@ -847,48 +847,48 @@ @@ -114,8 +114,8 @@ @@ -221,39 +221,39 @@

§9.1. Food

Inform provides an either/or property called "edible" and an action, "eating", for consuming edible things:

- -

The lardy cake is edible. After eating the lardy cake, say "Sticky but delicious." + +

The lardy cake is edible. After eating the lardy cake, say "Sticky but delicious."

@@ -109,7 +109,7 @@
- WI
+ WI @@ -118,34 +118,34 @@ @@ -193,42 +193,42 @@ @@ -263,13 +263,13 @@

To make things a little more interesting, we will postulate that different foods are differently filling, so that if the player manages to find something really caloric, he is off the hook on his hunger search for a while.

We will also implement the system so that the player gets messages when he is hungry, then dies a short time later. (The times involved are ludicrously short, but this allows us to see the effects within a simple example. In a real game we would want to allow a considerably longer timer for the hunger to play out.)

First, a little scene-setting:

- -

paste@2x.png create@2x.png   "MRE" + +

paste@2x.png create@2x.png   "MRE"

- -

When play begins: + +

When play begins:
    now the right hand status line is "[time of day]";
@@ -277,48 +277,48 @@

- -

They were wrong." + +

They were wrong."

- -

The Base Camp Larder is a room. "This room has been reinforced after each incident -- and there have been dozens in the last two months -- so that it now rivals Fort Knox. Only your new skill and speed enabled you to dodge the motion sensors, knock out the computerized security system, fool the retinal scanner, and punch a hole in the steel containment grating. But you're inside now." + +

The Base Camp Larder is a room. "This room has been reinforced after each incident -- and there have been dozens in the last two months -- so that it now rivals Fort Knox. Only your new skill and speed enabled you to dodge the motion sensors, knock out the computerized security system, fool the retinal scanner, and punch a hole in the steel containment grating. But you're inside now."

Now we define our food, and add some special instructions for what happens to our hunger counters when the food is eaten:

- -

Food is a kind of thing. Food is usually edible. Food has a time called the satisfaction period. The satisfaction period of a food is usually 5 minutes. + +

Food is a kind of thing. Food is usually edible. Food has a time called the satisfaction period. The satisfaction period of a food is usually 5 minutes.

- -

A person can be hungry or replete. The player is hungry. + +

A person can be hungry or replete. The player is hungry.

- -

The Larder contains an apple, a candy bar, and a large plate of pasta. The apple, the candy bar, and the pasta are food. The satisfaction period of the apple is 2 minutes. The satisfaction period of the pasta is 125 minutes. + +

The Larder contains an apple, a candy bar, and a large plate of pasta. The apple, the candy bar, and the pasta are food. The satisfaction period of the apple is 2 minutes. The satisfaction period of the pasta is 125 minutes.

- -

Check eating something which is not food: + +

Check eating something which is not food:
    say "[The noun] might be edible, but it's not what you'd consider really food."

- -

Check eating something when the player is not hungry: + +

Check eating something when the player is not hungry:
    say "You're not hungry right now."

- -

Carry out eating something: + +

Carry out eating something:
    now the player is replete;
@@ -327,8 +327,8 @@

The first of those two phrases, "now the player is replete", causes the player to cease to be hungry; the second one sets up a future event in which the hunger sets in again. The length of time until that event depends on how satisfying the specific food is. Now we define that event:

- -

At the time when hunger resumes: + +

At the time when hunger resumes:
    starvation occurs in three minutes from now;
@@ -336,8 +336,8 @@

- -

At the time when starvation occurs: + +

At the time when starvation occurs:
    if the player is hungry, end the story saying "You have starved".

@@ -345,8 +345,8 @@

Note "if the player is hungry": it is possible that the starvation event will be set up but the player will eat before it occurs; in that case, we want it not to take effect.

And now, since we really ought to give the player some warning of what is happening to him:

- -

Every turn when the player is hungry: + +

Every turn when the player is hungry:
    choose a random row in the Table of Hunger Complaints;
@@ -354,8 +354,8 @@

- -

Table of Hunger Complaints + +

Table of Hunger Complaints
hunger
@@ -369,8 +369,8 @@

- -

Test me with "eat apple / z / z / z / eat candy bar / z / z / z / z / z / z / z / z / z". + +

Test me with "eat apple / z / z / z / eat candy bar / z / z / z / z / z / z / z / z / z".

@@ -393,7 +393,7 @@
- WI
+ WI @@ -404,18 +404,18 @@

A thing can have a rule as a property, if we like. Here we are going to allow the player to make a soup whose effects will depend on its ingredients. Each ingredient will have its own "food effect" rule, to be followed when the food is eaten.

Note that there are other, slightly less cumbersome ways to do the same thing -- we will see in the chapter on Rulebooks that we could make a "food effects rulebook" and then write a number of rules such as "food effects rule for carrots" or "food effects rule for the stone". Nonetheless, we demonstrate rules-as-properties here for the sake of thoroughness.

So:

- -

paste@2x.png create@2x.png   "Stone" + +

paste@2x.png create@2x.png   "Stone"

- -

A food is a kind of thing that is edible. A food has a rule called the food effect. + +

A food is a kind of thing that is edible. A food has a rule called the food effect.

- -

Carry out eating a food: + +

Carry out eating a food:
    if a food is part of the noun:
@@ -427,8 +427,8 @@

- -

Report eating a food: + +

Report eating a food:
    say "You eat [the noun]. [diagnosis of the player]";
@@ -436,8 +436,8 @@

- -

To say diagnosis of (victim - a person): + +

To say diagnosis of (victim - a person):
    if the victim is ill:
@@ -468,68 +468,68 @@

And now to provide some particular foods:

+ +

Some carrots are a food. The food effect of carrots is the bright-eye rule. This is the bright-eye rule: now the player is bright-eyed. +

+
+ + +

Some potatoes are a food. The food effect of the potatoes is the sleepiness rule. This is the sleepiness rule: now the player is sleepy. +

+
+ -

Some carrots are a food. The food effect of carrots is the bright-eye rule. This is the bright-eye rule: now the player is bright-eyed. +

The broth is a food. The indefinite article of the broth is "some". The food effect of broth is the filling rule. This is the filling rule: now the player is full.

-

Some potatoes are a food. The food effect of the potatoes is the sleepiness rule. This is the sleepiness rule: now the player is sleepy. +

The hambone is a food. The food effect of the hambone is the heartiness rule. This is the heartiness rule: now the player is strong. Instead of eating the hambone: say "You cannot just eat a bone!"

-

The broth is a food. The indefinite article of the broth is "some". The food effect of broth is the filling rule. This is the filling rule: now the player is full. +

The poison ivy is a food. "Poison ivy grows nearby." The food effect of poison is the illness rule. This is the illness rule: now the player is ill.

-

The hambone is a food. The food effect of the hambone is the heartiness rule. This is the heartiness rule: now the player is strong. Instead of eating the hambone: say "You cannot just eat a bone!" +

A person can be bright-eyed or blind. The player is blind.

-

The poison ivy is a food. "Poison ivy grows nearby." The food effect of poison is the illness rule. This is the illness rule: now the player is ill. +

A person can be well or ill. The player is well.

-

A person can be bright-eyed or blind. The player is blind. +

A person can be hungry or full. The player is full.

-

A person can be well or ill. The player is well. +

A person can be strong or weak. The player is weak.

-

A person can be hungry or full. The player is full. +

A person can be awake or sleepy. The player is sleepy.

-

A person can be strong or weak. The player is weak. +

The broth is in the kettle. The kettle is on the fire. The fire is in the Clearing. The Clearing is a room.

-

A person can be awake or sleepy. The player is sleepy. +

The player carries the hambone, the potatoes, and the carrots. The ivy is in the clearing.

-

The broth is in the kettle. The kettle is on the fire. The fire is in the Clearing. The Clearing is a room. -

-
- - -

The player carries the hambone, the potatoes, and the carrots. The ivy is in the clearing. -

-
- - -

Instead of examining the broth: +

Instead of examining the broth:
    if something is part of the broth, say "In the broth, [a list of things that are part of the broth] float[if exactly one thing is part of the broth]s[end if].";
@@ -537,24 +537,24 @@

- -

Instead of inserting something into the broth: try inserting the noun into the holder of the broth. + +

Instead of inserting something into the broth: try inserting the noun into the holder of the broth.

- -

Instead of taking the broth: say "You cannot take the broth in your bare hands." + +

Instead of taking the broth: say "You cannot take the broth in your bare hands."

And the following is a relatively unimportant nicety:

- -

To sink is a verb. + +

To sink is a verb.

- -

After inserting a food which is not the broth into a container which contains the broth: + +

After inserting a food which is not the broth into a container which contains the broth:
    now the noun is part of the broth;
@@ -562,8 +562,8 @@

- -

Test me with "x broth / eat hambone / put hambone in kettle / x broth / put potatoes in broth / x broth / eat carrots / eat broth / put ivy in kettle / eat ivy". + +

Test me with "x broth / eat hambone / put hambone in kettle / x broth / put potatoes in broth / x broth / eat carrots / eat broth / put ivy in kettle / eat ivy".

@@ -586,7 +586,7 @@
- WI
+ WI @@ -595,8 +595,8 @@ @@ -148,38 +148,38 @@ @@ -211,28 +211,28 @@ @@ -299,40 +299,40 @@ @@ -384,25 +384,25 @@ @@ -435,33 +435,33 @@ @@ -535,86 +535,86 @@ @@ -747,38 +747,38 @@

In this scenario, the player starts with a bag full of unsorted letters. These can be polite or rude, but he won't know which until he has examined them. What's more, he is allowed to sort the letters, in which case a group of letters will be shown as (for instance) "two polite letters"; but a group of mixed letters, even if they have all been read, will be called "unsorted letters".

Further, the player should be allowed to refer to sorted letters by tone, but not unsorted letters.

To do this, we'll need printing the name... and printing the plural name..., as well as some special understanding rules.

- -

paste@2x.png create@2x.png   "Hudsucker Industries" + +

paste@2x.png create@2x.png   "Hudsucker Industries"

- -

Tone is a kind of value. The tones are effusive, affectionate, polite, curt, and flamingly rude. + +

Tone is a kind of value. The tones are effusive, affectionate, polite, curt, and flamingly rude.

- -

A letter is a kind of thing. The description of a letter is usually "On inspection, it turns out to be quite [tone]." A letter has a tone. The tone of a letter is usually polite. + +

A letter is a kind of thing. The description of a letter is usually "On inspection, it turns out to be quite [tone]." A letter has a tone. The tone of a letter is usually polite.

- -

A letter can be read or unread. A letter is usually unread. Carry out examining a letter: now the noun is read. + +

A letter can be read or unread. A letter is usually unread. Carry out examining a letter: now the noun is read.

- -

Before printing the name of a read letter: say "[tone] ". + +

Before printing the name of a read letter: say "[tone] ".

- -

Before printing the name of an ungrouped letter: say "random ". + +

Before printing the name of an ungrouped letter: say "random ".

- -

Before printing the plural name of a letter (called the subject): + +

Before printing the plural name of a letter (called the subject):
    if the subject is grouped:
@@ -790,8 +790,8 @@

- -

After printing the plural name of a letter (called the subject): + +

After printing the plural name of a letter (called the subject):
    if the number of read letters which are next to the subject is 0, say " (all unread, at the moment)" instead;
@@ -799,13 +799,13 @@

- -

Proximity relates a thing (called X) to a thing (called Y) when the holder of X is the holder of Y. The verb to be next to means the proximity relation. + +

Proximity relates a thing (called X) to a thing (called Y) when the holder of X is the holder of Y. The verb to be next to means the proximity relation.

- -

Definition: a letter is grouped: + +

Definition: a letter is grouped:
    if it is unread, no;
@@ -819,34 +819,34 @@

- -

Definition: a letter is ungrouped if it is not grouped. + +

Definition: a letter is ungrouped if it is not grouped.

- -

The Mailroom is a room. "Usually a thrumming hive of bee-like workers, but you got in early to get a jump on the day's work." + +

The Mailroom is a room. "Usually a thrumming hive of bee-like workers, but you got in early to get a jump on the day's work."

- -

The satchel is carried by the player. Two flamingly rude letters are in the satchel. Five polite letters are in the satchel. + +

The satchel is carried by the player. Two flamingly rude letters are in the satchel. Five polite letters are in the satchel.

- -

The mail wall are fixed in place in the mailroom. "Before you is a wall of mailboxes, including [a list of mailboxes which are part of the mail wall]." + +

The mail wall are fixed in place in the mailroom. "Before you is a wall of mailboxes, including [a list of mailboxes which are part of the mail wall]."

- -

The plural of mailbox is mailboxes. A mailbox is a kind of container. The CEO box is a mailbox. The Hold box is a mailbox. The Trash box is a mailbox. Understand "mailbox" as a mailbox. + +

The plural of mailbox is mailboxes. A mailbox is a kind of container. The CEO box is a mailbox. The Hold box is a mailbox. The Trash box is a mailbox. Understand "mailbox" as a mailbox.

Now, there's a good bit of interaction to streamline. We intend that the player will be taking letters from the satchel, reading them, and putting them (perhaps grouped) into boxes. Our interaction rules should assist in this process as much as possible. To start with, the player will be most likely to examine letters he hasn't read yet:

- -

Does the player mean examining a letter (called the subject): + +

Does the player mean examining a letter (called the subject):
    if we have examined the subject, it is very unlikely;
@@ -855,8 +855,8 @@

The rules about taking are more subtle: the player is more likely to want to take an ungrouped letter than a grouped one; he is more likely to want one from the satchel than not; and he is most unlikely to want to take a letter (grouped or ungrouped) that he is already holding.

- -

Does the player mean taking a letter (called subject) which is grouped: + +

Does the player mean taking a letter (called subject) which is grouped:
    if the player carries the subject, it is very unlikely;
@@ -866,8 +866,8 @@

- -

Does the player mean taking a letter (called subject) which is ungrouped: + +

Does the player mean taking a letter (called subject) which is ungrouped:
    if the player carries the subject, it is very unlikely;
@@ -878,8 +878,8 @@

And finally, we will assume by default that anything other than examining or taking is most likely to apply to a letter he's already identified:

- -

Does the player mean doing something other than examining or taking with a letter (called the subject): + +

Does the player mean doing something other than examining or taking with a letter (called the subject):
    if we have examined the subject, it is likely;
@@ -888,13 +888,13 @@

And we would also like to understand properties under the same circumstances as printing -- a letter will be identifiable as "polite" if it's already been read and it is either by itself or in a sorted stack of polite letters, but otherwise not. What's more, to make it possible to disambiguate commands in the other direction, we'll call any unsorted letter "random", to represent that the player doesn't know what it is.

- -

Understand the tone property as referring to a letter when the item described is grouped. Understand "random" as a letter when the item described is ungrouped. + +

Understand the tone property as referring to a letter when the item described is grouped. Understand "random" as a letter when the item described is ungrouped.

- -

When play begins: + +

When play begins:
    now every mailbox is part of the mail wall;
@@ -904,8 +904,8 @@

- -

Test me with "inventory / examine letter / get letter / i / put letter in ceo box / inventory / get letter / x letter / g / g / i / x letter / g / g / i / put letter in hold box / get letter / g / g / i". + +

Test me with "inventory / examine letter / get letter / i / put letter in ceo box / inventory / get letter / x letter / g / g / i / x letter / g / g / i / put letter in hold box / get letter / g / g / i".

@@ -929,7 +929,7 @@
- WI
+ WI @@ -939,28 +939,28 @@ @@ -115,18 +115,18 @@ @@ -173,28 +173,28 @@ @@ -269,23 +269,23 @@ @@ -318,37 +318,37 @@ @@ -115,23 +115,23 @@ @@ -196,30 +196,30 @@ @@ -380,23 +380,23 @@ @@ -427,56 +427,56 @@ @@ -698,80 +698,80 @@ @@ -804,25 +804,25 @@ @@ -143,23 +143,23 @@

Suppose the player is responsible for pricing at Widget Enterprises. Widget production entails a certain fixed cost as well as a cost per unit; and somewhere out in the world there are a number of customers interested in purchasing widgets, but the player starts without knowing what this distribution looks like.

We can express the profits as an equation: the total made by selling widgets, minus the cost thereof.

The Table of Customers holds the data about customer preferences, and whenever the player selects a widget price, we consult it to determine how many customers in total would be willing to buy at that price.

- -

paste@2x.png create@2x.png   "Widget Enterprises" + +

paste@2x.png create@2x.png   "Widget Enterprises"

- -

Widget Stand is a room. + +

Widget Stand is a room.

- -

A monetary value is a kind of value. $1.99 specifies a monetary value with parts dollars and cents. + +

A monetary value is a kind of value. $1.99 specifies a monetary value with parts dollars and cents.

- -

Equation - Profit Equation + +

Equation - Profit Equation
    P = nV - (F + nC)
@@ -167,15 +167,15 @@

- -

The fixed cost is a monetary value that varies. The fixed cost is $5.00. + +

The fixed cost is a monetary value that varies. The fixed cost is $5.00.
The unit cost is a monetary value that varies. The unit cost is $10.66.

- -

Table of Customers + +

Table of Customers

@@ -244,8 +244,8 @@

- -

To decide what number is the units sold at (V - a monetary value): + +

To decide what number is the units sold at (V - a monetary value):
    let total units be 0;
@@ -259,13 +259,13 @@

- -

Understand "set price to [monetary value]" as setting price to. Setting price to is an action applying to one monetary value. + +

Understand "set price to [monetary value]" as setting price to. Setting price to is an action applying to one monetary value.

- -

Carry out setting price to: + +

Carry out setting price to:
    let V be the monetary value understood;
@@ -291,8 +291,8 @@

- -

Test me with "set price to $0.00 / set price to $100.00 / set price to $15.00 / set price to $8.00 / set price to $25.00 / set price to $14.99". + +

Test me with "set price to $0.00 / set price to $100.00 / set price to $15.00 / set price to $8.00 / set price to $25.00 / set price to $14.99".

@@ -316,7 +316,7 @@
- WI
+ WI @@ -325,54 +325,54 @@ @@ -474,53 +474,53 @@ @@ -668,53 +668,53 @@ @@ -830,91 +830,91 @@ @@ -1335,47 +1335,47 @@ @@ -119,30 +119,30 @@ @@ -252,40 +252,40 @@ @@ -355,18 +355,18 @@ @@ -1173,34 +1173,34 @@

We've simulated a deck of cards before, but only as entries in a table. This time we're going to do it more completely, with card objects that can be drawn and discarded, and referred to by name. The tedious way to do this would be to make 52 objects by hand and laboriously write out their names and understand rules.

A more sensible way is to make 52 identical card objects, assign them ranks and suits, and allow Inform to generate and parse their names automatically.

So:

- -

paste@2x.png create@2x.png   "Tilt" + +

paste@2x.png create@2x.png   "Tilt"

- -

Section 1 - Cards + +

Section 1 - Cards

- -

Suit is a kind of value. The suits are hearts, clubs, diamonds, and spades. Understand "heart" as hearts. Understand "club" as clubs. Understand "diamond" as diamonds. Understand "spade" as spades. [Providing the singular forms means that Inform will also understand >EXAMINE SPADE, >DISCARD CLUB, and so on.] + +

Suit is a kind of value. The suits are hearts, clubs, diamonds, and spades. Understand "heart" as hearts. Understand "club" as clubs. Understand "diamond" as diamonds. Understand "spade" as spades. [Providing the singular forms means that Inform will also understand >EXAMINE SPADE, >DISCARD CLUB, and so on.]

- -

A card is a kind of thing. A card has a suit. A card has a number called rank. Understand the suit property as describing a card. Understand the rank property as describing a card. + +

A card is a kind of thing. A card has a suit. A card has a number called rank. Understand the suit property as describing a card. Understand the rank property as describing a card.

- -

52 cards are in the card repository. + +

52 cards are in the card repository.

Now, we're going to describe the higher numbers as face cards, so it helps to write a new "to say" phrase, just as we did in Jokers Wild. (A subsequent version of this example shows how to print card values with red and black symbols representing the different suits; see "Tilt 3".)

- -

To say (count - a number) as a card value: + +

To say (count - a number) as a card value:
    choose row count in the Table of Value Names;
@@ -1208,15 +1208,15 @@

- -

Rule for printing the name of a card (called target): + +

Rule for printing the name of a card (called target):
    say "[rank of the target as a card value] of [suit of the target]"

- -

Table of Value Names + +

Table of Value Names

@@ -1422,8 +1422,8 @@

This is enough already to let inform understand things like "ten clubs", but we want to add a couple of refinements. For one thing, we'd like to accept "of" when it appears in phrases such as "ten of clubs" (but not generically otherwise); for another, we'd like the player to be able to use various names for ranks. To this end, we need to borrow from the Activities chapter and modify the player's command before attempting to understand it:

- -

After reading a command: + +

After reading a command:
    if the player's command includes "of [suit]":
@@ -1443,15 +1443,15 @@

It may be a bit confusing that the Table of Value Names has both a topic column and a term column, to all appearances essentially identical. But items in the topic column can be matched against the player's input, whereas items in other kinds of text column can be printed out; the two kinds of text are not treated identically by Inform, so we need to have both. Notice that the topic column contains entries like "jack/knave," which will match either "jack" or "knave" in the player's input.

Now to set up the deck at the outset. With some intelligent looping, we avoid having to declare every combination of suit and number individually:

- -

When play begins: + +

When play begins:
    reconstitute deck.

- -

To reconstitute deck: + +

To reconstitute deck:
    let current suit be hearts;
@@ -1474,28 +1474,28 @@

And now we need a simple setting and some actions to manipulate the deck with:

- -

Section 2 - The Deck and the Discard Pile + +

Section 2 - The Deck and the Discard Pile

- -

The Empty Room is a room. "Nothing to see here." + +

The Empty Room is a room. "Nothing to see here."

- -

The deck of cards is in the Empty Room. It is a closed unopenable container. The description is "A standard poker deck." + +

The deck of cards is in the Empty Room. It is a closed unopenable container. The description is "A standard poker deck."

- -

The discard pile is a closed unopenable container. The description is "Cards in this game are discarded face-down, so the discard pile is not very interesting to see. All you can observe is that it currently contains [if the number of cards which are in the discard pile is less than ten][the number of cards which are in the discard pile in words][otherwise]about [the rounded number of cards which are in the discard pile in words][end if] card[s]." + +

The discard pile is a closed unopenable container. The description is "Cards in this game are discarded face-down, so the discard pile is not very interesting to see. All you can observe is that it currently contains [if the number of cards which are in the discard pile is less than ten][the number of cards which are in the discard pile in words][otherwise]about [the rounded number of cards which are in the discard pile in words][end if] card[s]."

- -

To decide what number is the rounded number of (described set - a description of objects): + +

To decide what number is the rounded number of (described set - a description of objects):
    let N be the number of members of the described set;
@@ -1509,48 +1509,48 @@

The above phrase rounds a number to the nearest five, because it seems unrealistic for the player to be able to count a large number of cards in the discard pile at a single glance.

This next bit is an optional borrowing from the Activities chapter: we want to prevent Inform printing things like "You can see a discard pile (closed) here.", since we don't want the player to think of the piles as containers, even though Inform thinks of them in those terms.

- -

Rule for printing room description details of something: do nothing instead. + +

Rule for printing room description details of something: do nothing instead.

Finally, we want the player to use "draw" and "discard" to manipulate his hand of cards:

- -

Section 3 - Drawing and Discarding Actions + +

Section 3 - Drawing and Discarding Actions

- -

Understand the commands "take" and "carry" and "hold" and "get" and "drop" and "throw" and "discard" as something new. + +

Understand the commands "take" and "carry" and "hold" and "get" and "drop" and "throw" and "discard" as something new.

- -

Understand "take [text]" or "get [text]" or "drop [text]" as a mistake ("Here, you only draw and discard. Nothing else matters at the moment."). + +

Understand "take [text]" or "get [text]" or "drop [text]" as a mistake ("Here, you only draw and discard. Nothing else matters at the moment.").

- -

Understand "draw" or "draw card" or "draw a card" as drawing. Drawing is an action applying to nothing. The drawing action has an object called the card drawn. + +

Understand "draw" or "draw card" or "draw a card" as drawing. Drawing is an action applying to nothing. The drawing action has an object called the card drawn.

- -

Setting action variables for drawing: + +

Setting action variables for drawing:
    now the card drawn is a random card which is in the deck of cards.

- -

Check drawing: + +

Check drawing:
    if the card drawn is nothing, say "The deck is completely depleted." instead.

- -

Check drawing: + +

Check drawing:
    if the number of cards carried by the player is greater than four,
@@ -1558,34 +1558,34 @@

- -

Carry out drawing: + +

Carry out drawing:
    move the card drawn to the player.

- -

Report drawing: + +

Report drawing:
    say "You draw [a card drawn]."

- -

Understand "discard [card]" as discarding. Discarding is an action applying to one thing. + +

Understand "discard [card]" as discarding. Discarding is an action applying to one thing.

- -

Check discarding: + +

Check discarding:
    if the player does not carry the noun, say "You can only discard cards from your own hand." instead.

- -

Carry out discarding: + +

Carry out discarding:
    now the noun is in the discard pile;
@@ -1593,20 +1593,20 @@

- -

Report discarding: + +

Report discarding:
    say "You toss [the noun] nonchalantly onto the discard pile."

- -

Seeding is an action out of world. Understand "seed" as seeding. Carry out seeding: seed the random-number generator with 5681. + +

Seeding is an action out of world. Understand "seed" as seeding. Carry out seeding: seed the random-number generator with 5681.

- -

Test me with "seed / draw / g / g / g / g / i / discard seven of spades / draw / discard six / draw / i / discard hearts / discard six of diamonds card / draw / draw / i / discard spades card / draw / discard king card". + +

Test me with "seed / draw / g / g / g / g / i / discard seven of spades / draw / discard six / draw / i / discard hearts / discard six of diamonds card / draw / draw / i / discard spades card / draw / discard king card".

@@ -1629,7 +1629,7 @@
- WI
+ WI @@ -1641,33 +1641,33 @@

Here we take on the job of writing an inventory listing for a poker hand that will reflect the real value of what the player has drawn. To do this, we create a rulebook to sort and assess the cards in the player's hand; its possible return values are limited to the kinds of poker hands that exist, from "high card" to "royal flush".

The first three sections, creating the deck of cards and the means to parse their names, are identical to those we've already seen in Tilt 1; new material begins at section 4.

For the purposes of demonstration, we're simulating something akin to five-card draw without wilds; stud or hold-em variations would add some other complexities.

- -

paste@2x.png create@2x.png   "Tilt" + +

paste@2x.png create@2x.png   "Tilt"

- -

Section 1 - Cards + +

Section 1 - Cards

- -

Suit is a kind of value. The suits are hearts, clubs, diamonds, and spades. Understand "heart" as hearts. Understand "club" as clubs. Understand "diamond" as diamonds. Understand "spade" as spades. + +

Suit is a kind of value. The suits are hearts, clubs, diamonds, and spades. Understand "heart" as hearts. Understand "club" as clubs. Understand "diamond" as diamonds. Understand "spade" as spades.

- -

A card is a kind of thing. A card has a suit. A card has a number called rank. Understand the suit property as describing a card. Understand the rank property as describing a card. + +

A card is a kind of thing. A card has a suit. A card has a number called rank. Understand the suit property as describing a card. Understand the rank property as describing a card.

- -

52 cards are in the card repository. + +

52 cards are in the card repository.

- -

To say (count - a number) as a card value: + +

To say (count - a number) as a card value:
    choose row count in the Table of Value Names;
@@ -1675,15 +1675,15 @@

- -

Rule for printing the name of a card (called target): + +

Rule for printing the name of a card (called target):
    say "[rank of the target as a card value] of [suit of the target]"

- -

Table of Value Names + +

Table of Value Names

@@ -1888,8 +1888,8 @@

- -

After reading a command: + +

After reading a command:
    if the player's command includes "of [suit]":
@@ -1905,15 +1905,15 @@

- -

When play begins: + +

When play begins:
    reconstitute deck.

- -

To reconstitute deck: + +

To reconstitute deck:
    let current suit be hearts;
@@ -1935,28 +1935,28 @@

- -

Section 2 - The Deck and the Discard Pile + +

Section 2 - The Deck and the Discard Pile

- -

The Empty Room is a room. "Nothing to see here." + +

The Empty Room is a room. "Nothing to see here."

- -

The deck of cards is in the Empty Room. It is a closed unopenable container. The description is "A standard poker deck." + +

The deck of cards is in the Empty Room. It is a closed unopenable container. The description is "A standard poker deck."

- -

The discard pile is a closed unopenable container. The description is "Cards in this game are discarded face-down, so the discard pile is not very interesting to see. All you can observe is that it currently contains [if the number of cards which are in the discard pile is less than ten][the number of cards which are in the discard pile in words][otherwise]about [the rounded number of cards which are in the discard pile in words][end if] card[s]." + +

The discard pile is a closed unopenable container. The description is "Cards in this game are discarded face-down, so the discard pile is not very interesting to see. All you can observe is that it currently contains [if the number of cards which are in the discard pile is less than ten][the number of cards which are in the discard pile in words][otherwise]about [the rounded number of cards which are in the discard pile in words][end if] card[s]."

- -

To decide what number is the rounded number of (described set - a description of objects): + +

To decide what number is the rounded number of (described set - a description of objects):
    let N be the number of members of the described set;
@@ -1968,47 +1968,47 @@

- -

Rule for printing room description details of something: do nothing instead. + +

Rule for printing room description details of something: do nothing instead.

- -

Section 3 - Drawing and Discarding Actions + +

Section 3 - Drawing and Discarding Actions

- -

Understand the commands "take" and "carry" and "hold" and "get" and "drop" and "throw" and "discard" as something new. + +

Understand the commands "take" and "carry" and "hold" and "get" and "drop" and "throw" and "discard" as something new.

- -

Understand "take [text]" or "get [text]" or "drop [text]" as a mistake ("Here, you only draw and discard. Nothing else matters at the moment."). + +

Understand "take [text]" or "get [text]" or "drop [text]" as a mistake ("Here, you only draw and discard. Nothing else matters at the moment.").

- -

Understand "draw" or "draw card" or "draw a card" as drawing. Drawing is an action applying to nothing. The drawing action has an object called the card drawn. + +

Understand "draw" or "draw card" or "draw a card" as drawing. Drawing is an action applying to nothing. The drawing action has an object called the card drawn.

- -

Setting action variables for drawing: + +

Setting action variables for drawing:
    now the card drawn is a random card which is in the deck of cards.

- -

Check drawing: + +

Check drawing:
    if the card drawn is nothing, say "The deck is completely depleted." instead.

- -

Check drawing: + +

Check drawing:
    if the number of cards carried by the player is greater than four,
@@ -2016,34 +2016,34 @@

- -

Carry out drawing: + +

Carry out drawing:
    move the card drawn to the player.

- -

Report drawing: + +

Report drawing:
    say "You draw [a card drawn]."

- -

Understand "discard [card]" as discarding. Discarding is an action applying to one thing. + +

Understand "discard [card]" as discarding. Discarding is an action applying to one thing.

- -

Check discarding: + +

Check discarding:
    if the player does not carry the noun, say "You can only discard cards from your own hand." instead.

- -

Carry out discarding: + +

Carry out discarding:
    now the noun is in the discard pile;
@@ -2051,26 +2051,26 @@

- -

Report discarding: + +

Report discarding:
    say "You toss [the noun] nonchalantly onto the discard pile."

New material begins here. We want to start by grouping cards together, but identifying poker hands only if the player holds a full five cards.

- -

Section 4 - Assessing Hands + +

Section 4 - Assessing Hands

- -

Before listing contents while taking inventory: group cards together. + +

Before listing contents while taking inventory: group cards together.

- -

Before grouping together cards: + +

Before grouping together cards:
    if the number of cards carried by the player is 5:
@@ -2092,15 +2092,15 @@

- -

Rule for grouping together cards: + +

Rule for grouping together cards:
    say "[list hand]".

- -

To say list hand: + +

To say list hand:
    let chosen card be the first thing held by the player;
@@ -2114,28 +2114,28 @@

- -

After grouping together cards: + +

After grouping together cards:
    say ")".

The ranking of poker hands traditionally depends on three features: 1) whether all the cards are of the same suit (flush); 2) whether the cards constitute a numerical run of ranks (straight); and 3) how many cards or sets of cards are of matching rank (pairs, three of a kind, and four of a kind). Here we will start by assessing our hand to determine these qualities:

- -

The hand-ranking rules is a rulebook. The hand-ranking rules have outcomes royal flush, straight flush, four of a kind, full house, flush, straight, three of a kind, two pairs, pair, high card. + +

The hand-ranking rules is a rulebook. The hand-ranking rules have outcomes royal flush, straight flush, four of a kind, full house, flush, straight, three of a kind, two pairs, pair, high card.

- -

The hand-ranking rulebook has a truth state called the flushness. + +

The hand-ranking rulebook has a truth state called the flushness.
The hand-ranking rulebook has a truth state called the straightness.

- -

The hand-ranking rulebook has a number called the pair count. + +

The hand-ranking rulebook has a number called the pair count.
The hand-ranking rulebook has a number called the triple count.
@@ -2144,20 +2144,20 @@

For convenience in identifying hand features, and for elegance when we print the hand-listing, we start by sorting the cards in the player's hand so that the high-ranked cards are listed first. It is rare that we want to concern ourselves with this, but as we saw in the section on "Looking at containment by hand" in the chapter on Change, Inform keeps an ordered list of the items inside any given container; so it does order the objects in the player's hand, and the ordering depends on which things were added to the hand most recently. By moving something to the player's hand again (even if it was already there), we change this ordering, and wind up with a sorted hand.

- -

A card can be sorted or unsorted. A card is usually unsorted. + +

A card can be sorted or unsorted. A card is usually unsorted.

- -

Definition: a card is high if its rank is 11 or more. + +

Definition: a card is high if its rank is 11 or more.
Definition: a card is low if its rank is 4 or less.

- -

A hand-ranking rule (this is the initial sort rule): + +

A hand-ranking rule (this is the initial sort rule):
    now every card is unsorted;
@@ -2175,8 +2175,8 @@

This last printing instruction is there for diagnostic purposes: later we'll add a testing command to turn debugging on and off; when it's on, the game will print out its card list at various stages in sorting, to help us trouble-shoot any problems. In normal play, however, this will be off.

Next up, a check to see whether the player has a flush:

- -

A hand-ranking rule (this is the finding flushness rule): + +

A hand-ranking rule (this is the finding flushness rule):
    let called suit be the suit of a random card carried by the player;
@@ -2185,8 +2185,8 @@

Now we check for straights; this is slightly complicated by the fact that an ace can be either the bottom of a low straight (lower than 2) or the top of a high straight (higher than king), so we explicitly check both possibilities.

- -

A hand-ranking rule (this is the finding straightness rule): + +

A hand-ranking rule (this is the finding straightness rule):
    now straightness is true;
@@ -2205,19 +2205,19 @@

And finally, we need to identify any groups of cards of the same rank. We want to know how many groups there are and how large each group is (though in practice there can only be one group of three or four in a standard-sized poker hand). We also want to mark any grouped cards so that we can move them to the front of the player's hand when we take inventory.

- -

A card can be quadrupled, tripled, paired or uncombined. + +

A card can be quadrupled, tripled, paired or uncombined.

- -

Test rank is a number that varies. Definition: a card is matching if its rank is the test rank. + +

Test rank is a number that varies. Definition: a card is matching if its rank is the test rank.

This definition is a convenience so that we don't have to write so many explicit loops in the following rule:

- -

A hand-ranking rule (this is the counting multiples rule): + +

A hand-ranking rule (this is the counting multiples rule):
    now every card is uncombined;
@@ -2250,8 +2250,8 @@

Next we tweak our sorting to reflect the make-up of the hand. There are two reasons why this might differ from the straight highest-to-lowest sort we did earlier:

1) we want to list aces as high unless they are serving as the bottom of a low straight, in which case they should appear last;

2) we want combinations to appear at the front of the list, sorted from highest value to lowest value: larger combinations first, then smaller combinations, and combinations of equal size sorted by rank.

- -

A hand-ranking rule (this is the move aces up unless there's a low straight rule): + +

A hand-ranking rule (this is the move aces up unless there's a low straight rule):
    unless the straightness is true and the lowest card carried by the player is an ace card and the rank of the highest card carried by the player is 5,
@@ -2261,8 +2261,8 @@

- -

A hand-ranking rule (this is the move pairs forward rule): + +

A hand-ranking rule (this is the move pairs forward rule):
    while the player carries a paired card:
@@ -2276,8 +2276,8 @@

- -

A hand-ranking rule (this is the raise ace pairs rule): + +

A hand-ranking rule (this is the raise ace pairs rule):
    if the player carries exactly two ace cards:
@@ -2289,8 +2289,8 @@

- -

A hand-ranking rule (this is the move multiples forward rule): + +

A hand-ranking rule (this is the move multiples forward rule):
    while the player carries a tripled card:
@@ -2312,104 +2312,104 @@

- -

Definition: a card is ace if its rank is 1. + +

Definition: a card is ace if its rank is 1.
Definition: a card is king if its rank is 13.

Now, having determined the salient qualities of our hand, we run through rules in order from the highest kind of poker combination to the lowest. Because of the order of the source, Inform will choose whichever combination applies first.

- -

A hand-ranking rule (this is the royal-flush rule): + +

A hand-ranking rule (this is the royal-flush rule):
    if flushness is true and straightness is true and the highest card carried by the player is king and the lowest card carried by the player is ace, royal flush.

- -

A hand-ranking rule (this is the straight-flushes rule): + +

A hand-ranking rule (this is the straight-flushes rule):
    if flushness is true and straightness is true, straight flush.

- -

A hand-ranking rule (this is the four-of-a-kind rule): + +

A hand-ranking rule (this is the four-of-a-kind rule):
    if the quadruple count is 1, four of a kind.

- -

A hand-ranking rule (this is the full-house rule): + +

A hand-ranking rule (this is the full-house rule):
    if the pair count is 1 and the triple count is 1, full house.

- -

A hand-ranking rule (this is the flushes rule): + +

A hand-ranking rule (this is the flushes rule):
    if flushness is true, flush.

- -

A hand-ranking rule (this is the straights rule): + +

A hand-ranking rule (this is the straights rule):
    if straightness is true, straight.

- -

A hand-ranking rule (this is the three-of-a-kind rule): + +

A hand-ranking rule (this is the three-of-a-kind rule):
    if triple count is 1, three of a kind.

- -

A hand-ranking rule (this is the two-pair rule): + +

A hand-ranking rule (this is the two-pair rule):
    if the pair count is 2, two pairs.

- -

A hand-ranking rule (this is the pair rule): + +

A hand-ranking rule (this is the pair rule):
    if the pair count is 1, pair.

- -

A hand-ranking rule (this is the default rule): + +

A hand-ranking rule (this is the default rule):
    high card.

And finally, we need to define our debugging variable here, even though we won't give the player the ability to turn it on and off except in the special testing section.

- -

Sort-debugging is a truth state that varies. + +

Sort-debugging is a truth state that varies.

For many examples, a test-me script is enough to prove that the example does what it ought. This example, though, is a bit more complicated, and hard to test randomly. The remainder of the source here shows how we might write a test to verify the desired behavior of our rulebook. Those who are only interested in the rulebook itself can stop reading at this point.

- -

Section 5 - Testing hand identification - Not for release + +

Section 5 - Testing hand identification - Not for release

For the sake of testing our rules, we provide an apparatus that will load the player's hand up with sample hands of each kind, then show the result to make sure that the hand is being correctly identified.

- -

Understand "debug sorting" as debugging hand sorting. Debugging hand sorting is an action out of world. + +

Understand "debug sorting" as debugging hand sorting. Debugging hand sorting is an action out of world.

- -

Carry out debugging hand sorting: + +

Carry out debugging hand sorting:
    if sort-debugging is false, now sort-debugging is true;
@@ -2417,21 +2417,21 @@

- -

Report debugging hand sorting: + +

Report debugging hand sorting:
    say "Sort debugging is now [if sort-debugging is true]on[otherwise]off[end if]."

- -

Test me with "draw / g / g / g / g / force hand / g / g / g / g / g / g / g / g / g / g / g / g". + +

Test me with "draw / g / g / g / g / force hand / g / g / g / g / g / g / g / g / g / g / g / g".

The somewhat rough-and-ready principle of this table is that we will overwrite the cards in the player's hand by resetting their ranks and suits; every five rows of the table represent a new poker hand for the game to attempt to sort and identify. These include one example of each of the major kinds of poker hand, plus a couple of variations involving aces which test the special sorting rules.

- -

Table of Testing Hands + +

Table of Testing Hands

@@ -3098,18 +3098,18 @@

- -

Understand "force hand" as forcing a hand. Forcing a hand is an action out of world. + +

Understand "force hand" as forcing a hand. Forcing a hand is an action out of world.

- -

Current marker is a number that varies. + +

Current marker is a number that varies.

- -

Carry out forcing a hand: + +

Carry out forcing a hand:
    repeat with item running through cards which are carried by the player:
@@ -3125,8 +3125,8 @@

- -

Report forcing a hand: + +

Report forcing a hand:
    try taking inventory.

diff --git a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc73.html b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc73.html index 0f91d038..f20735cd 100644 --- a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc73.html +++ b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc73.html @@ -83,14 +83,14 @@

§9.6. Reading Matter

Many things can be read, from warning notices to encyclopaedias, and a range of techniques is needed to provide them because the quantity of text, and how it presents itself, can vary so much. With a small amount of very large type, the player should not need any command at all to read the text:

- -

The road sign is in the Junction. The road sign is fixed in place. "A road sign points north: 'Weston on the Green - 6'." + +

The road sign is in the Junction. The road sign is fixed in place. "A road sign points north: 'Weston on the Green - 6'."

If the print is smaller, or the object portable, the player will expect to use the EXAMINE command:

- -

The business card is in the Junction. The description is "'Peter de Sèvres: consultant mnemonicist.'" + +

The business card is in the Junction. The description is "'Peter de Sèvres: consultant mnemonicist.'"

@@ -99,8 +99,8 @@

If the object is an encyclopaedic reference work, the player would consult named entries: see Costa Rican Ornithology, which allows commands like LOOK UP QUETZAL IN GUIDE.

Still larger sources of text often occur in IF: libraries or bookshelves, where many books are found together, and it is clumsy to write them as many individual items. One approach is to simulate an entire bookshelf with a single thing: see Bibliophilia. (This is much like looking up topics in a single book, except that each topic is a book in itself.) Another is to provide each book as an individual item, but have them automatically join together into a single portable collection: see AARP-Gnosis.

Signs, leaflets and encyclopaedias, being printed, have a wording which will never change during play. But sometimes the player reads something which acts of its own accord. Text substitutions are usually all that is needed to achieve this:

- -

The computer display is on the desk. The description is "Giant green digits read: [the time of day]." + +

The computer display is on the desk. The description is "Giant green digits read: [the time of day]."

@@ -125,7 +125,7 @@
- WI
+ WI @@ -133,33 +133,33 @@ @@ -192,8 +192,8 @@ @@ -465,18 +465,18 @@ @@ -643,47 +643,47 @@ @@ -835,23 +835,23 @@ @@ -991,55 +991,55 @@ @@ -1219,25 +1219,25 @@ @@ -114,43 +114,43 @@ @@ -181,31 +181,31 @@ @@ -313,92 +313,92 @@ @@ -130,52 +130,52 @@ @@ -211,28 +211,28 @@

Second, we need to make sure that our implementation handles intervening stages of assembly gracefully. The player should be able to combine string and hook first, or string and stick first, and be able to complete the assembly in either case.

Our implementation here uses a table of lists to determine which combinations of inputs should produce which result object. Because we sort our lists before comparing them, we guarantee that the player's ordering doesn't matter: COMBINE STICK WITH STRING will have the same effect as COMBINE STRING WITH STICK.

What's more, our implementation could be expanded to account for many other assemblages, if we wanted object-building to be a running theme of puzzles in our game.

- -

paste@2x.png create@2x.png   "What Makes You Tick" + +

paste@2x.png create@2x.png   "What Makes You Tick"

- -

Understand "combine [something] with [something]" as combining it with. Combining it with is an action applying to two carried things. Understand the command "connect" as "combine". + +

Understand "combine [something] with [something]" as combining it with. Combining it with is an action applying to two carried things. Understand the command "connect" as "combine".

- -

Understand the command "attach" as something new. Understand "attach [something] to [something]" as combining it with. + +

Understand the command "attach" as something new. Understand "attach [something] to [something]" as combining it with.

- -

The combining it with action has an object called the item built. + +

The combining it with action has an object called the item built.

- -

Setting action variables for combining something with something: + +

Setting action variables for combining something with something:
    let X be a list of objects;
@@ -254,8 +254,8 @@

- -

Check combining it with: + +

Check combining it with:
    if the item built is nothing or the item built is not in limbo,
@@ -263,8 +263,8 @@

- -

Carry out combining it with: + +

Carry out combining it with:
    move the item built to the holder of the noun;
@@ -274,25 +274,25 @@

- -

Report combining it with: + +

Report combining it with:
    say "You now have [an item built]."

- -

Limbo is a container. Limbo contains a hookless fishing pole, a hooked line, and a complete fishing pole. + +

Limbo is a container. Limbo contains a hookless fishing pole, a hooked line, and a complete fishing pole.

- -

Streamside is a room. The player carries a stick, a wire hook, and a string. + +

Streamside is a room. The player carries a stick, a wire hook, and a string.

- -

Table of Outcome Objects + +

Table of Outcome Objects

@@ -351,8 +351,8 @@

- -

Test me with "combine stick with string / i / combine pole with hook / i". + +

Test me with "combine stick with string / i / combine pole with hook / i".

@@ -376,7 +376,7 @@
- WI
+ WI @@ -385,18 +385,18 @@ @@ -495,34 +495,34 @@ @@ -112,35 +112,35 @@ @@ -172,33 +172,33 @@ @@ -230,62 +230,62 @@ @@ -396,98 +396,98 @@ @@ -645,23 +645,23 @@ @@ -114,43 +114,43 @@ @@ -727,44 +727,44 @@ @@ -125,28 +125,28 @@ @@ -233,44 +233,44 @@ @@ -317,90 +317,90 @@ @@ -116,25 +116,25 @@ @@ -350,33 +350,33 @@ @@ -504,38 +504,38 @@ @@ -593,23 +593,23 @@ @@ -788,50 +788,50 @@ @@ -189,44 +189,44 @@ @@ -260,41 +260,41 @@ @@ -328,20 +328,20 @@ @@ -660,47 +660,47 @@ @@ -755,18 +755,18 @@ @@ -973,19 +973,19 @@ @@ -1079,23 +1079,23 @@ @@ -1129,31 +1129,31 @@ @@ -1294,40 +1294,40 @@

There are a wide range of possible reasons to do this -- to shift the narrative emphasis, to change the mood of the game by highlighting different parts of the environment, to show the game from the perspective of different viewpoint characters -- but in the following example, our goal is to show the player only the objects that are currently useful for puzzles.

To do this, we need some notion of what puzzles are currently available and unsolved, so we make an "unsolved" adjective; we also need to know which things solve the puzzle, so we create a "resolving" relation, to indicate which objects resolve which problems.

Given that information, we can create rules about which objects in the game world are currently interesting, which are currently dull, and describe accordingly:

- -

paste@2x.png create@2x.png   "Copper River" + +

paste@2x.png create@2x.png   "Copper River"

- -

Use scoring. + +

Use scoring.

- -

Section 1 - Procedure + +

Section 1 - Procedure

- -

Resolving relates various things to various things. The verb to resolve means the resolving relation. + +

Resolving relates various things to various things. The verb to resolve means the resolving relation.

- -

Definition: a thing is interesting if it is not dull. + +

Definition: a thing is interesting if it is not dull.

- -

Definition: a person is dull: + +

Definition: a person is dull:
    no.

- -

Definition: a thing is dull: + +

Definition: a thing is dull:
    if it is unsolved, no;
@@ -1337,8 +1337,8 @@

- -

Definition: a supporter is dull: + +

Definition: a supporter is dull:
    if it is unsolved, no;
@@ -1350,8 +1350,8 @@

- -

Definition: a container is dull: + +

Definition: a container is dull:
    if it is unsolved, no;
@@ -1363,8 +1363,8 @@

- -

After choosing notable locale objects: + +

After choosing notable locale objects:
    repeat with item running through unsolved things:
@@ -1372,29 +1372,29 @@

- -

For printing a locale paragraph about a dull thing (called item): + +

For printing a locale paragraph about a dull thing (called item):
    now the item is mentioned.

- -

Before printing a locale paragraph about a supporter (called item): + +

Before printing a locale paragraph about a supporter (called item):
    now every dull thing on the item is mentioned.

- -

Before printing a locale paragraph about a container (called item): + +

Before printing a locale paragraph about a container (called item):
    now every dull thing on the item is mentioned.

- -

Instead of searching a supporter: + +

Instead of searching a supporter:
    if the noun supports something interesting:
@@ -1416,8 +1416,8 @@

- -

Instead of searching a container: + +

Instead of searching a container:
    if the noun contains something interesting:
@@ -1439,48 +1439,48 @@

+ +

Before listing contents when not taking inventory: group dull things together. +

+
+ + +

Rule for grouping together dull things: say "assorted dull items". +

+
+ -

Before listing contents when not taking inventory: group dull things together. +

Section 2 - Scenario World and Objects

-

Rule for grouping together dull things: say "assorted dull items". +

The Kitchen is a room. "Your Aunt Fiona's kitchen looks as though it has been at the eye of a glitter storm. Fine, sparkling grit dusts every surface. The appliances are slightly askew, too, as though they hadn't quite settled after a vigorous earthquake."

-

Section 2 - Scenario World and Objects +

The shelf is a scenery supporter in the Kitchen. On the shelf is a can of beans, a can of potato leek soup, and a tin of deflating powder.

-

The Kitchen is a room. "Your Aunt Fiona's kitchen looks as though it has been at the eye of a glitter storm. Fine, sparkling grit dusts every surface. The appliances are slightly askew, too, as though they hadn't quite settled after a vigorous earthquake." +

The cabinet is a scenery container in the Kitchen. In the cabinet is a book of matches, a bottle of descaling solution, a fish hook, and a rusty knife. It is openable and closed.

-

The shelf is a scenery supporter in the Kitchen. On the shelf is a can of beans, a can of potato leek soup, and a tin of deflating powder. +

The counter is a scenery supporter in the Kitchen. On the counter is an espresso machine, a blender, and a mortar. The blender and the mortar are containers. In the mortar is a pestle. Understand "countertop" as the counter.

-

The cabinet is a scenery container in the Kitchen. In the cabinet is a book of matches, a bottle of descaling solution, a fish hook, and a rusty knife. It is openable and closed. +

The stove is a scenery supporter in the Kitchen. The oven is part of the stove. The oven is a closed openable container.

-

The counter is a scenery supporter in the Kitchen. On the counter is an espresso machine, a blender, and a mortar. The blender and the mortar are containers. In the mortar is a pestle. Understand "countertop" as the counter. -

-
- - -

The stove is a scenery supporter in the Kitchen. The oven is part of the stove. The oven is a closed openable container. -

-
- - -

The refrigerator is a fixed in place container in the Kitchen. +

The refrigerator is a fixed in place container in the Kitchen.
    Understand "fridge" as the refrigerator.
@@ -1488,18 +1488,18 @@

- -

In the refrigerator are a bottle of ice wine, a bag of carrot sticks, and an egg. + +

In the refrigerator are a bottle of ice wine, a bag of carrot sticks, and an egg.

- -

Aunt Fiona is a woman in the Kitchen. Aunt Fiona can be inflated or deflated. Aunt Fiona is inflated. "[if Aunt Fiona is inflated]Aunt Fiona stands nearby. Or perhaps 'stands' is the wrong word: she has been sort of puffed up in her own skin like a balloon, and is now propped in a corner of the room with her head lolling back[otherwise]Aunt Fiona stands -- on her own two slender legs -- at the center of the room[end if]." + +

Aunt Fiona is a woman in the Kitchen. Aunt Fiona can be inflated or deflated. Aunt Fiona is inflated. "[if Aunt Fiona is inflated]Aunt Fiona stands nearby. Or perhaps 'stands' is the wrong word: she has been sort of puffed up in her own skin like a balloon, and is now propped in a corner of the room with her head lolling back[otherwise]Aunt Fiona stands -- on her own two slender legs -- at the center of the room[end if]."

- -

Every turn when Fiona is unsolved and Fiona can see the player: + +

Every turn when Fiona is unsolved and Fiona can see the player:
    if a random chance of 1 in 3 succeeds:
@@ -1507,25 +1507,25 @@

- -

There is a thing called a salmon. Understand "fish" as the salmon. The salmon can be scaly or prepared. The salmon is scaly. The description is "[if scaly]It looks delicious, but is still covered with scales[otherwise]The salmon has been scaled and is ready to eat[end if]." + +

There is a thing called a salmon. Understand "fish" as the salmon. The salmon can be scaly or prepared. The salmon is scaly. The description is "[if scaly]It looks delicious, but is still covered with scales[otherwise]The salmon has been scaled and is ready to eat[end if]."

- -

Before printing the name of the salmon when the salmon is scaly: + +

Before printing the name of the salmon when the salmon is scaly:
    say "very scaly ".

- -

Section 3 - Scenario Puzzles + +

Section 3 - Scenario Puzzles

- -

Definition: Aunt Fiona is unsolved if she is inflated. + +

Definition: Aunt Fiona is unsolved if she is inflated.
Definition: the salmon is unsolved:
@@ -1537,13 +1537,13 @@

- -

The deflating powder resolves Aunt Fiona. + +

The deflating powder resolves Aunt Fiona.

- -

Instead of putting the deflating powder on Aunt Fiona: + +

Instead of putting the deflating powder on Aunt Fiona:
    try throwing the deflating powder at Aunt Fiona.
@@ -1553,8 +1553,8 @@

- -

Instead of throwing the deflating powder at Aunt Fiona: + +

Instead of throwing the deflating powder at Aunt Fiona:
    if Aunt Fiona is inflated:
@@ -1570,8 +1570,8 @@

- -

Every turn when Aunt Fiona is deflated and the salmon is off-stage: + +

Every turn when Aunt Fiona is deflated and the salmon is off-stage:
    move the salmon to the counter;
@@ -1579,20 +1579,20 @@

- -

The bottle of descaling solution resolves the salmon. + +

The bottle of descaling solution resolves the salmon.

- -

Does the player mean putting the descaling solution on the fish hook: it is unlikely. + +

Does the player mean putting the descaling solution on the fish hook: it is unlikely.
Does the player mean putting the descaling solution on the salmon: it is very likely.

- -

Instead of putting the bottle of descaling solution on the salmon: + +

Instead of putting the bottle of descaling solution on the salmon:
    if the salmon is scaly:
@@ -1608,8 +1608,8 @@

- -

Test me with "look / get powder / drop powder / look / look in cabinet / get powder / put powder on fiona / look / open cabinet / look in cabinet / get solution / open fridge / put solution in fridge / look / get solution / put solution on salmon / look". + +

Test me with "look / get powder / drop powder / look / look in cabinet / get powder / put powder on fiona / look / open cabinet / look in cabinet / get solution / open fridge / put solution in fridge / look / get solution / put solution on salmon / look".

diff --git a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc80.html b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc80.html index bb5ae480..eb60af04 100644 --- a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc80.html +++ b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc80.html @@ -104,7 +104,7 @@
- WI
+ WI @@ -112,40 +112,40 @@ @@ -432,18 +432,18 @@ @@ -562,23 +562,23 @@ @@ -119,79 +119,79 @@ @@ -223,23 +223,23 @@ @@ -282,60 +282,60 @@

Here we want a rulebook to determine whether objects float or sink, so we create an object-based rulebook for the purpose. The more specific rules here, pertaining to corks and to inflated things, will be consulted first; then, as a default, the general flotation rule.

We also want a switch that can turn flotation off at will. The rule about the big switch will be observed before the others because the when... clause makes it more specific than the other rules in the flotation rulebook.

If we wanted, we could also put these rules into a rulebook in an explicit order, overriding Inform's automatic sorting by specificity.

+ +

paste@2x.png create@2x.png   "Flotation" +

+
+ + +

The Pumping House is a room. +

+
+ -

paste@2x.png create@2x.png   "Flotation" +

A well is a fixed in place container in the Pumping House.

-

The Pumping House is a room. +

Instead of examining the well: +
+     say "[if something is in the well]On the surface of the water you can see [a list of things in the well][otherwise]There is nothing on the surface of the water, nor can you see into the depths[end if]."

-

A well is a fixed in place container in the Pumping House. +

The well bottom is a container.

-

Instead of examining the well: -
-     say "[if something is in the well]On the surface of the water you can see [a list of things in the well][otherwise]There is nothing on the surface of the water, nor can you see into the depths[end if]." +

The cork, the rubber ring and a lead ingot are in the Pumping House.

-

The well bottom is a container. +

A big switch is a fixed in place device in the Pumping House. "A big switch labelled 'MAKE EVERYTHING SINK' is mounted on one wall[if switched on]. It crackles with electricity[otherwise]. It is currently switched off and silent[end if]."

-

The cork, the rubber ring and a lead ingot are in the Pumping House. +

A thing can be inflated or uninflated. A thing is usually uninflated. Before printing the name of an inflated thing: say "inflated ".

-

A big switch is a fixed in place device in the Pumping House. "A big switch labelled 'MAKE EVERYTHING SINK' is mounted on one wall[if switched on]. It crackles with electricity[otherwise]. It is currently switched off and silent[end if]." +

The rubber ring is inflated.

-

A thing can be inflated or uninflated. A thing is usually uninflated. Before printing the name of an inflated thing: say "inflated ". +

The flotation rules are an object-based rulebook.

-

The rubber ring is inflated. -

-
- - -

The flotation rules are an object-based rulebook. -

-
- - -

A flotation rule for the cork: rule succeeds. +

A flotation rule for the cork: rule succeeds.
A flotation rule for an inflated thing: rule succeeds.
@@ -343,8 +343,8 @@

- -

After inserting something into the well: + +

After inserting something into the well:
    follow the flotation rules for the noun;
@@ -360,13 +360,13 @@

- -

A thing can be sinking, rising, or static. A thing is usually static. + +

A thing can be sinking, rising, or static. A thing is usually static.

- -

Definition: a thing is wet: + +

Definition: a thing is wet:
    if it is in the well, yes;
@@ -376,8 +376,8 @@

- -

Every turn: + +

Every turn:
    now every thing is static;
@@ -400,23 +400,23 @@

And finally a few description rules to make things look prettier:

- -

Rule for writing a paragraph about the well when the well contains something: + +

Rule for writing a paragraph about the well when the well contains something:
    say "The chief feature of the room is a concrete-sided well in which there float[if the number of things in the well is 1]s[end if] [a list of things in the well]."

- -

Rule for writing a paragraph about the well: + +

Rule for writing a paragraph about the well:
    say "The chief feature of the room is a concrete-sided well full of water."

As we recall from the chapter on activities, "writing a paragraph about..." is an activity; activities are themselves structured as sets of object-based rulebooks. The activity "writing a paragraph about" uses three object-based rulebooks (before writing..., for writing..., after writing...). We could have made a flotation activity as well, but in general it is overkill to make an activity to make success/failure decisions. For that purpose an object-based rulebook is sufficient.

- -

Test me with "get all / put cork in well / put ring in well / put ingot in well / x well / get cork / get ring / switch switch on / put cork in well / put ring in well / x well / switch switch off / switch switch on". + +

Test me with "get all / put cork in well / put ring in well / put ingot in well / x well / get cork / get ring / switch switch on / put cork in well / put ring in well / x well / switch switch off / switch switch on".

@@ -439,7 +439,7 @@
- WI
+ WI @@ -448,25 +448,25 @@ @@ -555,50 +555,50 @@ @@ -859,72 +859,72 @@ @@ -1006,33 +1006,33 @@

Liquids, and all substances that can be mixed or broken off in partial amounts, pose a challenge to model in interactive fiction. The following example is a simple one, but adequate for many scenarios.

We start by assuming that all liquids in the game will always appear in containers. The player can pour liquids from one container to another, and the containers keep track of how full they are and describe themselves appropriately. The player can also refer to containers by content.

Mixture, however, is not allowed, nor is it possible to put liquids on other objects, pour them out on the ground, etc. These ideas would require a more complicated set-up.

- -

paste@2x.png create@2x.png   "Lemonade" + +

paste@2x.png create@2x.png   "Lemonade"

- -

A volume is a kind of value. 15.9 fl oz specifies a volume with parts ounces and tenths (optional, preamble optional). + +

A volume is a kind of value. 15.9 fl oz specifies a volume with parts ounces and tenths (optional, preamble optional).

- -

A fluid container is a kind of container. A fluid container has a volume called a fluid capacity. A fluid container has a volume called current volume. + +

A fluid container is a kind of container. A fluid container has a volume called a fluid capacity. A fluid container has a volume called current volume.

- -

The fluid capacity of a fluid container is usually 12.0 fl oz. The current volume of a fluid container is usually 0.0 fl oz. + +

The fluid capacity of a fluid container is usually 12.0 fl oz. The current volume of a fluid container is usually 0.0 fl oz.

- -

Liquid is a kind of value. The liquids are water, milk, lemonade, and iced tea. A fluid container has a liquid. + +

Liquid is a kind of value. The liquids are water, milk, lemonade, and iced tea. A fluid container has a liquid.

- -

Instead of examining a fluid container: + +

Instead of examining a fluid container:
    if the noun is empty,
@@ -1044,8 +1044,8 @@

- -

To say (amount - a volume) in rough terms: + +

To say (amount - a volume) in rough terms:
    if the amount is less than 0.5 fl oz:
@@ -1065,8 +1065,8 @@

- -

Before printing the name of a fluid container (called the target) while not drinking: + +

Before printing the name of a fluid container (called the target) while not drinking:
    if the target is empty:
@@ -1078,8 +1078,8 @@

- -

After printing the name of a fluid container (called the target) while not examining: + +

After printing the name of a fluid container (called the target) while not examining:
    unless the target is empty:
@@ -1089,25 +1089,25 @@

- -

Instead of inserting something into a fluid container: + +

Instead of inserting something into a fluid container:
    say "[The second noun] has too narrow a mouth to accept anything but liquids."

- -

Definition: a fluid container is empty if the current volume of it is 0.0 fl oz. Definition: a fluid container is full if the current volume of it is the fluid capacity of it. + +

Definition: a fluid container is empty if the current volume of it is 0.0 fl oz. Definition: a fluid container is full if the current volume of it is the fluid capacity of it.

- -

Understand "drink from [fluid container]" as drinking. + +

Understand "drink from [fluid container]" as drinking.

- -

Instead of drinking a fluid container: + +

Instead of drinking a fluid container:
    if the noun is empty:
@@ -1124,28 +1124,28 @@

We have allowed all liquids to be drunk, but it would be possible also to add checking, if we had a game where some liquids were beverages and others were, say, motor oil.

- -

Understand the command "fill" as something new. + +

Understand the command "fill" as something new.

- -

Understand "pour [fluid container] in/into/on/onto [fluid container]" as pouring it into. Understand "empty [fluid container] into [fluid container]" as pouring it into. Understand "fill [fluid container] with/from [fluid container]" as pouring it into (with nouns reversed). + +

Understand "pour [fluid container] in/into/on/onto [fluid container]" as pouring it into. Understand "empty [fluid container] into [fluid container]" as pouring it into. Understand "fill [fluid container] with/from [fluid container]" as pouring it into (with nouns reversed).

- -

Understand "pour [something] in/into/on/onto [something]" as pouring it into. Understand "empty [something] into [something]" as pouring it into. Understand "fill [something] with/from [something]" as pouring it into (with nouns reversed). + +

Understand "pour [something] in/into/on/onto [something]" as pouring it into. Understand "empty [something] into [something]" as pouring it into. Understand "fill [something] with/from [something]" as pouring it into (with nouns reversed).

- -

Pouring it into is an action applying to two things. + +

Pouring it into is an action applying to two things.

- -

Check pouring it into: + +

Check pouring it into:
    if the noun is not a fluid container, say "You can't pour [the noun]." instead;
@@ -1165,8 +1165,8 @@

- -

Carry out pouring it into: + +

Carry out pouring it into:
    let available capacity be the fluid capacity of the second noun minus the current volume of the second noun;
@@ -1178,8 +1178,8 @@

- -

Report pouring it into: + +

Report pouring it into:
    say "[if the noun is empty][The noun] is now empty;[otherwise][The noun] now contains [current volume of the noun in rough terms] of [liquid of the noun]; [end if]";
@@ -1189,59 +1189,59 @@

This is probably a drier description than we would actually want in our story, but it does allow us to see that the mechanics of the system are working, so we'll stick with this for the example.

Now we need a trick from a later chapter, which allows something to be described in terms of a property it has. This way, the story will understand not only "pitcher" and "glass" but also "pitcher of lemonade" and "glass of milk" -- and, indeed, "glass of lemonade", if we empty the glass and refill it with another substance:

- -

Understand the liquid property as describing a fluid container. Understand "of" as a fluid container. + +

Understand the liquid property as describing a fluid container. Understand "of" as a fluid container.

And now the scenario itself:

+ +

The Porch is a room. The porch swing is an enterable supporter in the Porch. "An inviting swing hangs here at the end of the porch, allowing you to enjoy the summer with a cool beverage, and watch your neighbor Ted mowing his lawn with the very last manual powerless lawnmower on the block." +

+
+ + +

The glass is a fluid container carried by the player. The liquid of the glass is milk. The current volume of the glass is 0.8 fl oz. +

+
+ -

The Porch is a room. The porch swing is an enterable supporter in the Porch. "An inviting swing hangs here at the end of the porch, allowing you to enjoy the summer with a cool beverage, and watch your neighbor Ted mowing his lawn with the very last manual powerless lawnmower on the block." +

The pitcher is a fluid container in the Porch. The fluid capacity of the pitcher is 32.0 fl oz. The current volume of the pitcher is 20.0 fl oz. The liquid of the pitcher is lemonade.

-

The glass is a fluid container carried by the player. The liquid of the glass is milk. The current volume of the glass is 0.8 fl oz. +

Ted's Lawn is outside from the Porch. Ted is a man in Ted's Lawn. "Ted has taken off his shirt, but still seems a bit oppressed by the sun." The description of Ted is "He looks hot. In all senses."

-

The pitcher is a fluid container in the Porch. The fluid capacity of the pitcher is 32.0 fl oz. The current volume of the pitcher is 20.0 fl oz. The liquid of the pitcher is lemonade. +

After deciding the scope of the player: place Ted in scope.

-

Ted's Lawn is outside from the Porch. Ted is a man in Ted's Lawn. "Ted has taken off his shirt, but still seems a bit oppressed by the sun." The description of Ted is "He looks hot. In all senses." +

Instead of doing something to Ted when the player is in the Porch: say "You can't really interact with Ted from this distance, except in the sense of eyeing him surreptitiously."

-

After deciding the scope of the player: place Ted in scope. +

Instead of giving an empty fluid container to Ted: say "Yes, taunt the poor man, why don't you?"

-

Instead of doing something to Ted when the player is in the Porch: say "You can't really interact with Ted from this distance, except in the sense of eyeing him surreptitiously." +

Instead of giving a fluid container to Ted when the liquid of the noun is milk: say "Ted looks ruefully at the milk. 'Thanks, but I'm lactose-intolerant,' he says."

-

Instead of giving an empty fluid container to Ted: say "Yes, taunt the poor man, why don't you?" +

The block giving rule is not listed in the check giving it to rules.

-

Instead of giving a fluid container to Ted when the liquid of the noun is milk: say "Ted looks ruefully at the milk. 'Thanks, but I'm lactose-intolerant,' he says." -

-
- - -

The block giving rule is not listed in the check giving it to rules. -

-
- - -

Every turn: +

Every turn:
    if Ted is in the location:
@@ -1255,8 +1255,8 @@

- -

Instead of someone drinking a fluid container: + +

Instead of someone drinking a fluid container:
    if the noun is empty:
@@ -1272,8 +1272,8 @@

- -

After someone giving something to the player: + +

After someone giving something to the player:
    say "'Here,' says [the person asked], handing [the noun] back to you. 'Thanks, I owe you one.'";
@@ -1281,13 +1281,13 @@

- -

Test me with "x milk / x lemonade / drink lemonade / drink milk / pour lemonade into glass / drink milk / x milk / drink milk / g / i / fill glass with lemonade / drink lemonade / drop glass / drink lemonade / pitcher". + +

Test me with "x milk / x lemonade / drink lemonade / drink milk / pour lemonade into glass / drink milk / x milk / drink milk / g / i / fill glass with lemonade / drink lemonade / drop glass / drink lemonade / pitcher".

- -

Test Ted with "out / give milk to ted / drink milk / g / g / g / give glass to ted / in / fill glass with lemonade / out / give lemonade to ted / wait / z / z / z ". + +

Test Ted with "out / give milk to ted / drink milk / g / g / g / give glass to ted / in / fill glass with lemonade / out / give lemonade to ted / wait / z / z / z ".

@@ -1310,7 +1310,7 @@
- WI
+ WI @@ -1320,38 +1320,38 @@ @@ -1609,33 +1609,33 @@

The implementation that follows relies on a fairly simple idea from linear algebra. Any given liquid can be expressed as a vector in N-space, where N is the number of available ingredients and the length of the vector depends on how much of each ingredient is used; then we find the recipe that best describes the liquid by taking the dot product of our liquid vector with a bunch of sample vectors and selecting the one with the largest result.

If this does not make sense, don't worry: it's not necessary to understand the idea to use the code.

Any implementation involving a large number of place values is always a bit challenging in integer arithmetic. This examples assumes that no bodies of liquid will ever be very large, and that the proportions of ingredients in a mixture will not be vastly askew. (No 20-parts-to-1 proportions, for instance.) This probably works reasonably well for the cocktails that we make the basis of the example.

- -

paste@2x.png create@2x.png   "Noisy Cricket" + +

paste@2x.png create@2x.png   "Noisy Cricket"

- -

Part 1 - Volumes and Mixtures + +

Part 1 - Volumes and Mixtures

- -

A volume is a kind of value. 15.9 fl oz specifies a volume with parts ounces and tenths (optional, preamble optional). + +

A volume is a kind of value. 15.9 fl oz specifies a volume with parts ounces and tenths (optional, preamble optional).

- -

A fluid container is a kind of container. A fluid container has a volume called a fluid capacity. A fluid container has a volume called creme de menthe volume. A fluid container has a volume called vodka volume. A fluid container has a volume called cacao volume. + +

A fluid container is a kind of container. A fluid container has a volume called a fluid capacity. A fluid container has a volume called creme de menthe volume. A fluid container has a volume called vodka volume. A fluid container has a volume called cacao volume.

- -

The fluid capacity of a fluid container is usually 12.0 fl oz. The creme de menthe volume of a fluid container is usually 0.0 fl oz. The vodka volume of a fluid container is usually 0.0 fl oz. The cacao volume of fluid container is usually 0.0 fl oz. + +

The fluid capacity of a fluid container is usually 12.0 fl oz. The creme de menthe volume of a fluid container is usually 0.0 fl oz. The vodka volume of a fluid container is usually 0.0 fl oz. The cacao volume of fluid container is usually 0.0 fl oz.

- -

To decide what volume is the current volume of (item - a fluid container): + +

To decide what volume is the current volume of (item - a fluid container):
    let total be the creme de menthe volume of the item;
@@ -1647,8 +1647,8 @@

- -

Instead of examining a fluid container: + +

Instead of examining a fluid container:
    if the noun is empty,
@@ -1660,19 +1660,19 @@

- -

Adjectival descriptor is a kind of value. The adjectival descriptors are strong, chocolatey, minty, perfect, and pure. + +

Adjectival descriptor is a kind of value. The adjectival descriptors are strong, chocolatey, minty, perfect, and pure.

- -

Nominal descriptor is a kind of value. The Nominal descriptors are creme de menthe, vodka, creme de cacao, grasshopper, chocolate vodka, mint vodka, chocolate martini, mintini, chocolate mint martini. + +

Nominal descriptor is a kind of value. The Nominal descriptors are creme de menthe, vodka, creme de cacao, grasshopper, chocolate vodka, mint vodka, chocolate martini, mintini, chocolate mint martini.

Our table of mixtures is expressed in parts: so if a recipe contains one part X and two parts Y, we would put "1" in the first column and "2" in the second column.

- -

Table of Mixtures + +

Table of Mixtures

@@ -1941,20 +1941,20 @@

- -

A fluid container has an adjectival descriptor. A fluid container has a nominal descriptor. Understand the adjectival descriptor property as describing a fluid container. Understand the nominal descriptor property as describing a fluid container. + +

A fluid container has an adjectival descriptor. A fluid container has a nominal descriptor. Understand the adjectival descriptor property as describing a fluid container. Understand the nominal descriptor property as describing a fluid container.

- -

To decide what number is (quantity - a number) squared: + +

To decide what number is (quantity - a number) squared:
    decide on quantity times quantity.

- -

To score mixtures in (item - a fluid container): + +

To score mixtures in (item - a fluid container):
    repeat through Table of Mixtures:
@@ -2056,8 +2056,8 @@

- -

To identify mixture in (item - a fluid container): + +

To identify mixture in (item - a fluid container):
    score mixtures in item;
@@ -2083,8 +2083,8 @@

- -

To decide what number is the raw quantity of (item volume - a volume): + +

To decide what number is the raw quantity of (item volume - a volume):
    let raw be item volume divided by 0.5 fl oz;
@@ -2092,8 +2092,8 @@

- -

To decide what number is calibration for (total - a number): + +

To decide what number is calibration for (total - a number):
    if total is an initial listed in the table of Multipliers, decide on result entry;
@@ -2102,8 +2102,8 @@

Here we cheat on our arithmetic. The following chart just provides values corresponding roughly to 1/(sqrt (x)), but since Inform does not deal very gracefully with square roots or fractions, we will calculate this elsewhere and just supply the answers in the code:

- -

Table of Multipliers + +

Table of Multipliers

@@ -2322,8 +2322,8 @@

- -

When play begins: + +

When play begins:
    repeat with item running through fluid containers:
@@ -2331,8 +2331,8 @@

- -

To say (amount - a volume) in rough terms: + +

To say (amount - a volume) in rough terms:
    if the amount is less than 0.6 fl oz:
@@ -2352,8 +2352,8 @@

- -

Before printing the name of a fluid container (called the target) while not drinking or pouring: + +

Before printing the name of a fluid container (called the target) while not drinking or pouring:
    if the target is empty:
@@ -2365,8 +2365,8 @@

- -

After printing the name of a fluid container (called the target) while not examining or pouring: + +

After printing the name of a fluid container (called the target) while not examining or pouring:
    unless the target is empty:
@@ -2376,25 +2376,25 @@

- -

Instead of inserting something into a fluid container: + +

Instead of inserting something into a fluid container:
    say "[The second noun] has too narrow a mouth to accept anything but liquids."

- -

Definition: a fluid container is empty if the current volume of it is 0.0 fl oz. Definition: a fluid container is full if the current volume of it is the fluid capacity of it. + +

Definition: a fluid container is empty if the current volume of it is 0.0 fl oz. Definition: a fluid container is full if the current volume of it is the fluid capacity of it.

- -

Understand "drink from [fluid container]" as drinking. + +

Understand "drink from [fluid container]" as drinking.

- -

Instead of drinking a fluid container: + +

Instead of drinking a fluid container:
    if the noun is empty:
@@ -2418,13 +2418,13 @@

- -

Sip volume is a volume that varies. Sip volume is 0.5 fl oz. + +

Sip volume is a volume that varies. Sip volume is 0.5 fl oz.

- -

To decide what volume is the consumed cacao of (item - a fluid container) out of (total consumption - a volume): + +

To decide what volume is the consumed cacao of (item - a fluid container) out of (total consumption - a volume):
    let new volume be the cacao volume of the item times 100;
@@ -2440,8 +2440,8 @@

- -

To decide what volume is the consumed creme de menthe of (item - a fluid container) out of (total consumption - a volume): + +

To decide what volume is the consumed creme de menthe of (item - a fluid container) out of (total consumption - a volume):
    let new volume be the creme de menthe volume of the item times 100;
@@ -2457,8 +2457,8 @@

- -

To decide what volume is the consumed vodka of (item - a fluid container) out of (total consumption - a volume): + +

To decide what volume is the consumed vodka of (item - a fluid container) out of (total consumption - a volume):
    let new volume be the vodka volume of the item times 100;
@@ -2474,43 +2474,43 @@

- -

Part 2 - Filling + +

Part 2 - Filling

- -

Understand the command "fill" as something new. + +

Understand the command "fill" as something new.

- -

Understand "fill [something] with/from [something]" as filling it with. + +

Understand "fill [something] with/from [something]" as filling it with.

- -

Filling it with is an action applying to two things. Carry out filling it with: try pouring the second noun into the noun instead. + +

Filling it with is an action applying to two things. Carry out filling it with: try pouring the second noun into the noun instead.

- -

Understand "pour [fluid container] in/into/on/onto [fluid container]" as pouring it into. Understand "empty [fluid container] into [fluid container]" as pouring it into. + +

Understand "pour [fluid container] in/into/on/onto [fluid container]" as pouring it into. Understand "empty [fluid container] into [fluid container]" as pouring it into.

- -

Understand "pour [something] in/into/on/onto [something]" as pouring it into. Understand "empty [something] into [something]" as pouring it into. + +

Understand "pour [something] in/into/on/onto [something]" as pouring it into. Understand "empty [something] into [something]" as pouring it into.

- -

Pouring it into is an action applying to two things. + +

Pouring it into is an action applying to two things.

- -

Check pouring it into: + +

Check pouring it into:
    if the noun is not a fluid container, say "You can't pour [the noun]." instead;
@@ -2524,8 +2524,8 @@

- -

Carry out pouring it into: + +

Carry out pouring it into:
    let available capacity be the fluid capacity of the second noun minus the current volume of the second noun;
@@ -2551,8 +2551,8 @@

- -

Report pouring it into: + +

Report pouring it into:
    identify mixture in noun;
@@ -2564,58 +2564,58 @@

+ +

Understand "of" as a fluid container. +

+
+ + +

Part 3 - Scenario +

+
+ -

Understand "of" as a fluid container. +

When play begins: say "When you decided to try Mixology WS102 (*cross-listed with Women's Studies), you envisioned yourself writing essays about gender discrimination during the Prohibition, say, or reading essays on male vs. female metabolism of alcohol. But no: MxWS102 turns out to be about... mixing the perfect chocolate mint martini."

-

Part 3 - Scenario +

The College of Mixology is a room. The bar is a supporter in the college.

-

When play begins: say "When you decided to try Mixology WS102 (*cross-listed with Women's Studies), you envisioned yourself writing essays about gender discrimination during the Prohibition, say, or reading essays on male vs. female metabolism of alcohol. But no: MxWS102 turns out to be about... mixing the perfect chocolate mint martini." +

The cocktail glass is a fluid container carried by the player. The fluid capacity of the cocktail glass is 4.0 fl oz.

-

The College of Mixology is a room. The bar is a supporter in the college. +

The flask is a fluid container carried by the player. The vodka volume of the flask is 4.0 fl oz.

-

The cocktail glass is a fluid container carried by the player. The fluid capacity of the cocktail glass is 4.0 fl oz. +

The jigger is a fluid container carried by the player. The fluid capacity of the jigger is 1.0 fl oz.

-

The flask is a fluid container carried by the player. The vodka volume of the flask is 4.0 fl oz. +

The small measure is a fluid container carried by the player. The fluid capacity of the small measure is 0.5 fl oz.

-

The jigger is a fluid container carried by the player. The fluid capacity of the jigger is 1.0 fl oz. +

The decanter is a fluid container on the bar. The fluid capacity of the decanter is 32.0 fl oz. The creme de menthe volume of the decanter is 20.0 fl oz.

-

The small measure is a fluid container carried by the player. The fluid capacity of the small measure is 0.5 fl oz. +

The bottle is a fluid container carried by the player. The cacao volume of the bottle is 10.0 fl oz.

-

The decanter is a fluid container on the bar. The fluid capacity of the decanter is 32.0 fl oz. The creme de menthe volume of the decanter is 20.0 fl oz. -

-
- - -

The bottle is a fluid container carried by the player. The cacao volume of the bottle is 10.0 fl oz. -

-
- - -

Test me with "i / pour flask in jigger / pour jigger in glass / pour bottle in jigger / pour jigger in glass / pour bottle in jigger / pour jigger in glass / pour decanter in jigger / pour jigger in glass / drink glass / g / g / x glass / pour flask in glass". +

Test me with "i / pour flask in jigger / pour jigger in glass / pour bottle in jigger / pour jigger in glass / pour bottle in jigger / pour jigger in glass / pour decanter in jigger / pour jigger in glass / drink glass / g / g / x glass / pour flask in glass".

@@ -2638,7 +2638,7 @@
- WI
+ WI @@ -2647,33 +2647,33 @@ @@ -115,44 +115,44 @@ @@ -247,23 +247,23 @@ @@ -118,18 +118,18 @@ @@ -195,18 +195,18 @@ @@ -264,23 +264,23 @@ @@ -427,38 +427,38 @@ @@ -490,8 +490,8 @@ @@ -122,55 +122,55 @@ @@ -247,23 +247,23 @@ @@ -460,58 +460,58 @@ @@ -545,23 +545,23 @@

Suppose that we have a number of objects in the game that are sized in some conventional unit (such as meters), but which we would like to describe in slightly less formal terms. To do this, we will start with measurements as defined in the built-in extension Metric Units, so we don't have to recreate all these.

We'll add our own set of "conceptual units" -- things we're familiar with in real life. As we'll see below, Inform will automatically choose a unit of the right order to express a given distance if we tell it to print a length "in conceptual units".

Note: the following will compile only if you have settings set for Glulx. (To change this, go to the Settings panel and click on the Glulx option.) The Glulx virtual machine is capable of handling larger numbers than the Z-machine.

- -

paste@2x.png create@2x.png   "The Speed of Thought" + +

paste@2x.png create@2x.png   "The Speed of Thought"

- -

Section 1 - Procedure + +

Section 1 - Procedure

- -

Include Metric Units by Graham Nelson. + +

Include Metric Units by Graham Nelson.

- -

1 quarter (in conceptual units, in quarters, singular) or 2 quarters (in conceptual units, in quarters, plural) specifies a length equivalent to 24mm. + +

1 quarter (in conceptual units, in quarters, singular) or 2 quarters (in conceptual units, in quarters, plural) specifies a length equivalent to 24mm.
1 pencil (in conceptual units, in pencils, singular) or 2 pencils (in conceptual units, in pencils, plural) specifies a length equivalent to 18cm.
@@ -573,8 +573,8 @@

- -

1 credit card (in conceptual units, in credit cards, singular) or 2 credit cards (in conceptual units, in credit cards, plural) specifies an area equivalent to 46 sq cm. + +

1 credit card (in conceptual units, in credit cards, singular) or 2 credit cards (in conceptual units, in credit cards, plural) specifies an area equivalent to 46 sq cm.
1 letter sheet (in conceptual units, in letter sheets, singular) or 2 letter sheets (in conceptual units, in letter sheets, plural) specifies an area equivalent to 603 sq cm.
@@ -584,13 +584,13 @@

- -

Understand "report [something]" as reporting. Reporting is an action applying to one thing. + +

Understand "report [something]" as reporting. Reporting is an action applying to one thing.

- -

Check reporting: + +

Check reporting:
    if the noun is not a fact:
@@ -598,15 +598,15 @@

- -

Carry out reporting: + +

Carry out reporting:
    now the noun is nowhere.

- -

Report reporting: + +

Report reporting:
    if the extent of the noun is greater than 0mm and the surface of the noun is greater than 0 sq cm:
@@ -626,15 +626,15 @@

- -

To say about: + +

To say about:
    say "[one of]roughly[or]about[or]around[or]approximately[at random]";

- -

To contextualize (chosen information - text): + +

To contextualize (chosen information - text):
    say "[one of]You turn to the camera and speak:[or][or]Turning to another camera angle, you add:[or][stopping] ";
@@ -644,39 +644,39 @@

- -

Section 2 - Scenario + +

Section 2 - Scenario

- -

The Science Journalism Desk is a room. "From here you, the Science Anchor, have the privilege of reporting the latest and most fascinating stories to an eager public." + +

The Science Journalism Desk is a room. "From here you, the Science Anchor, have the privilege of reporting the latest and most fascinating stories to an eager public."

- -

After looking: + +

After looking:
    try thinking.

- -

Instead of thinking: + +

Instead of thinking:
    say "Currently you have to report on the International Space Station. Your story could include [the list of facts carried by the player]."

- -

Instead of taking inventory: + +

Instead of taking inventory:
    say "It looks foolish to be fiddling with your possessions on camera."

- -

Instead of dropping a fact: + +

Instead of dropping a fact:
    say "You decide to omit [the noun] from your lineup.";
@@ -684,13 +684,13 @@

- -

A fact is a kind of thing. Every fact is carried by the player. A fact has a length called the extent. A fact has an area called the surface. + +

A fact is a kind of thing. Every fact is carried by the player. A fact has a length called the extent. A fact has an area called the surface.

- -

The experiment module is a fact. The extent is 1116cm. + +

The experiment module is a fact. The extent is 1116cm.
The logistics module is a fact. The extent is 421cm.
@@ -702,15 +702,15 @@

- -

Report reporting the orbit height: + +

Report reporting the orbit height:
    contextualize "'The station orbits at heights between [about] [278km in conceptual units] and [460km in conceptual units] above the earth.'" instead.

- -

Every turn: + +

Every turn:
    if the player carries no facts:
@@ -720,8 +720,8 @@

- -

Test me with "report experiment module / report logistics / report height / report array / report solar cell". + +

Test me with "report experiment module / report logistics / report height / report array / report solar cell".

@@ -744,7 +744,7 @@
- WI
+ WI @@ -753,28 +753,28 @@ @@ -114,65 +114,65 @@ @@ -749,38 +749,38 @@ @@ -114,18 +114,18 @@ @@ -199,28 +199,28 @@ @@ -282,18 +282,18 @@ @@ -119,105 +119,105 @@ @@ -338,70 +338,70 @@ @@ -469,14 +469,14 @@

The game must sensibly select and, if necessary, automatically light new matches to carry out a >BURN THING command.

The matches must burn for a set number of turns before going out, never to be used again.

And finally, the part for which the text will be useful: when several matches go out in the same turn, we want the game to print

- -

Four matches go out. + +

Four matches go out.

rather than

- -

A match goes out. + +

A match goes out.
A match goes out.
@@ -487,38 +487,38 @@

This last function appears down in Section 3, if we wish to skip ahead and look at it.

- -

paste@2x.png create@2x.png   "The Cow Exonerated" + +

paste@2x.png create@2x.png   "The Cow Exonerated"

- -

Section 1 - Simple Burning + +

Section 1 - Simple Burning

- -

Understand the commands "light" and "burn" as something new. + +

Understand the commands "light" and "burn" as something new.

- -

Understand "burn [something] with [strikable-match]" as burning it with. Understand "burn [something] with [something preferably held]" as burning it with. Burning it with is an action applying to one thing and one carried thing. + +

Understand "burn [something] with [strikable-match]" as burning it with. Understand "burn [something] with [something preferably held]" as burning it with. Burning it with is an action applying to one thing and one carried thing.

- -

Understand the command "light" as "burn". + +

Understand the command "light" as "burn".

- -

A thing can be flammable or impervious. A thing is usually impervious. + +

A thing can be flammable or impervious. A thing is usually impervious.

- -

Check burning something with something (this is the burn only with flaming matches rule): + +

Check burning something with something (this is the burn only with flaming matches rule):
    if the second noun is not a strikable-match, say "You can only light things with matches." instead;
@@ -526,15 +526,15 @@

- -

Check burning something with something (this is the burn only flammable things rule): + +

Check burning something with something (this is the burn only flammable things rule):
    if the noun is impervious, say "[The noun] cannot be burned." instead.

- -

Check burning something with something (this is the burn only things not held rule): + +

Check burning something with something (this is the burn only things not held rule):
    say "[one of]It occurs to you to set down [the noun] before burning, just for safety's sake. [or]Again, you decide to put down [the noun] prior to burning. [or]You try setting down [the noun] as usual. [stopping][run paragraph on]";
@@ -544,22 +544,22 @@

- -

Carry out burning something with something (this is the simplistic burning rule): + +

Carry out burning something with something (this is the simplistic burning rule):
    now the noun is nowhere.

- -

Report burning something with something: + +

Report burning something with something:
    say "You burn up [the noun]."

- -

Rule for implicitly taking the second noun while burning something with something which is not a strikable-match: + +

Rule for implicitly taking the second noun while burning something with something which is not a strikable-match:
    say "You can only light things with matches.";
@@ -567,53 +567,53 @@

- -

Section 2 - Matches + +

Section 2 - Matches

The word "matches" is used by Inform to compare snippets of text (see "Reading a command" in the Activities chapter). This can sometimes cause awkwardness if we also have a kind called "match", so for the occasion we will give our matches a more specialized name, never visible to the player:

- -

A strikable-match is a kind of thing. The plural of strikable-match is s-matches. + +

A strikable-match is a kind of thing. The plural of strikable-match is s-matches.

- -

A strikable-match has a number called duration. The duration of a strikable-match is usually 3. + +

A strikable-match has a number called duration. The duration of a strikable-match is usually 3.

- -

Rule for printing the name of a strikable-match: say "match". + +

Rule for printing the name of a strikable-match: say "match".
Rule for printing the plural name of a strikable-match: say "matches".

- -

Understand "match" as a strikable-match. Understand "matches" as a strikable-match. + +

Understand "match" as a strikable-match. Understand "matches" as a strikable-match.

- -

Flame-state is a kind of value. The flame-states are burnt, flaming, and new. Understand "burning" or "lit" as flaming. Understand "unused" as new. + +

Flame-state is a kind of value. The flame-states are burnt, flaming, and new. Understand "burning" or "lit" as flaming. Understand "unused" as new.

- -

A strikable-match has a flame-state. A strikable-match is usually new. Understand the flame-state property as describing a strikable-match. + +

A strikable-match has a flame-state. A strikable-match is usually new. Understand the flame-state property as describing a strikable-match.

- -

Before printing the name of a strikable-match while asking which do you mean: + +

Before printing the name of a strikable-match while asking which do you mean:
    say "[flame-state] ".

- -

Before printing the name of a strikable-match while taking inventory: + +

Before printing the name of a strikable-match while taking inventory:
    say "[flame-state] ".
@@ -623,15 +623,15 @@

- -

Before printing the name of a strikable-match while clarifying the parser's choice of something: + +

Before printing the name of a strikable-match while clarifying the parser's choice of something:
    if not taking inventory, say "[flame-state] ".

- -

After printing the name of a strikable-match (called special-target) while clarifying the parser's choice of something: + +

After printing the name of a strikable-match (called special-target) while clarifying the parser's choice of something:
    if the player carries the special-target:
@@ -647,37 +647,37 @@

- -

Understand "strike [something]" as attacking. + +

Understand "strike [something]" as attacking.

- -

Understand "strike [strikable-match]" as striking. Striking is an action applying to one carried thing. + +

Understand "strike [strikable-match]" as striking. Striking is an action applying to one carried thing.

- -

Understand "burn [strikable-match]" as striking. + +

Understand "burn [strikable-match]" as striking.

- -

Does the player mean striking a new strikable-match: + +

Does the player mean striking a new strikable-match:
    it is very likely.

- -

Does the player mean striking a burnt strikable-match: + +

Does the player mean striking a burnt strikable-match:
    it is unlikely.

- -

Check striking a strikable-match (this is the strike only new matches rule): + +

Check striking a strikable-match (this is the strike only new matches rule):
    if the noun is burnt, say "[The noun] has already burnt down and cannot be relit." instead;
@@ -685,8 +685,8 @@

- -

Carry out striking a strikable-match (this is the standard striking rule): + +

Carry out striking a strikable-match (this is the standard striking rule):
    now the noun is flaming;
@@ -694,15 +694,15 @@

- -

Report striking a strikable-match (this is the standard report striking rule): + +

Report striking a strikable-match (this is the standard report striking rule):
    say "You light [the noun]."

- -

Before burning something with a new strikable-match (this is the prior lighting rule): + +

Before burning something with a new strikable-match (this is the prior lighting rule):
    say "(first [if the player does not carry the second noun]taking and [end if]lighting [the second noun])[command clarification break]";
@@ -712,48 +712,48 @@

- -

Rule for implicitly taking a strikable-match (called target) while striking: + +

Rule for implicitly taking a strikable-match (called target) while striking:
    try silently taking the target.

- -

Does the player mean burning something with a flaming strikable-match: + +

Does the player mean burning something with a flaming strikable-match:
    it is very likely.

- -

Does the player mean burning something with a new strikable-match: + +

Does the player mean burning something with a new strikable-match:
    it is likely.

- -

Does the player mean burning something with a burnt strikable-match: + +

Does the player mean burning something with a burnt strikable-match:
    it is unlikely.

- -

Instead of burning a burnt strikable-match with something: + +

Instead of burning a burnt strikable-match with something:
    say "[The noun] is completely consumed and cannot be relit."

- -

Section 3 - Putting the Matches Out + +

Section 3 - Putting the Matches Out

- -

Every turn: + +

Every turn:
    let N be 0; [here we track how many matches are being put out during this turn, so that we don't have to mention each match individually if several go out during the same move]
@@ -791,28 +791,28 @@

- -

Section 4 - Scenario + +

Section 4 - Scenario

- -

Old Chicago is a room. + +

Old Chicago is a room.

- -

The player carries a flammable thing called a log. Understand "wooden" and "wood" as the log. + +

The player carries a flammable thing called a log. Understand "wooden" and "wood" as the log.

- -

The player carries two s-matches. The matchbox is an open openable container. It contains five s-matches. The player carries the matchbox. + +

The player carries two s-matches. The matchbox is an open openable container. It contains five s-matches. The player carries the matchbox.

- -

When play begins: + +

When play begins:
    now every strikable-match carried by the player is flaming;
@@ -820,8 +820,8 @@

- -

Test me with "i / burn match / i / i / burn log with match / burn matchbox with match / i". + +

Test me with "i / burn match / i / i / burn log with match / burn matchbox with match / i".

@@ -844,7 +844,7 @@
- WI
+ WI @@ -852,35 +852,35 @@ @@ -115,30 +115,30 @@ @@ -171,18 +171,18 @@ @@ -277,60 +277,60 @@ @@ -362,38 +362,38 @@ @@ -112,45 +112,45 @@ @@ -222,69 +222,69 @@ @@ -316,75 +316,75 @@ @@ -455,28 +455,28 @@ @@ -129,66 +129,66 @@ @@ -219,42 +219,42 @@ @@ -285,127 +285,127 @@ @@ -438,13 +438,13 @@ @@ -508,23 +508,23 @@ @@ -589,71 +589,71 @@ @@ -685,35 +685,35 @@ @@ -745,28 +745,28 @@ @@ -815,13 +815,13 @@

hexes.jpg

But following Charles S. Roberts's American Civil War designs for Avalon Hill of 1958-61 (notably "Chancellorsville" and the second edition of "Gettysburg"), a hexagonal grid became the new standard. Each hexagon is the same distance from the centre of all six of its neighbours, which are at equal angular spacings; and clumps of hexagons fit the shape of lakes, contoured hills, and so forth, much more naturally than clumps of squares do. Hexes also have a certain mystique - an air of "I don't belong in the children's department".

But hexes are tricky for IF, not least because English lacks words for "the direction 60 degrees around from front". Our cognitive view of the world tends to be square, perhaps because our two eyes both face front, in a direction at right angles to the plane of our arms, legs, pelvis and eyes. We reach out sideways at right angles to our walking. Even early hex-grid wargames called the cells "squares", though "hexes" eventually caught on. Still and all:

- -

paste@2x.png create@2x.png   "The World of Charles S. Roberts" + +

paste@2x.png create@2x.png   "The World of Charles S. Roberts"

- -

Forward is a direction. Forward has opposite backward. Understand "f" as forward. + +

Forward is a direction. Forward has opposite backward. Understand "f" as forward.
Backward is a direction. Backward has opposite forward. Understand "b" and "back" as backward.
@@ -836,82 +836,82 @@

Now to forbid the use of the compass directions:

+ +

A direction can be hexagonal or squared-off. A direction is usually squared-off. Forward, backward, forward left, forward right, backward left and backward right are hexagonal. +

+
+ + +

Before going a squared-off direction, say "In this hexagonally-divided landscape, squared-off directions are not allowed." instead. +

+
+ +

A slight nuisance is that, with things as they are above, typing BACKWARD produces the response "Which do you mean, backward, backward left or backward right?" To avoid that silly question, we write:

-

A direction can be hexagonal or squared-off. A direction is usually squared-off. Forward, backward, forward left, forward right, backward left and backward right are hexagonal. +

Does the player mean going backward: it is very likely. Does the player mean going forward: it is very likely.

+

And now a clump of 37 hexes, in six columns of six or seven rooms each. There are many ingenious ways we could put this map together automatically, but instead we will take a deep breath and write:

-

Before going a squared-off direction, say "In this hexagonally-divided landscape, squared-off directions are not allowed." instead. +

E1 is forward of E2. "Open farmland." E2 is forward of E3. "The edge of woods." E3 is forward of E4. "Deep woodland." E4 is forward of E5. "Deep woodland." E5 is forward of E6. "The rear edge of woods." E6 is forward of E7. "The start of a road leading forward right." E7 is a room. "Grassland."

-

A slight nuisance is that, with things as they are above, typing BACKWARD produces the response "Which do you mean, backward, backward left or backward right?" To avoid that silly question, we write:

-

Does the player mean going backward: it is very likely. Does the player mean going forward: it is very likely. +

F1 is forward of F2. "The edge of farmland." F2 is forward of F3. "The edge of woods." F3 is forward of F4. "Clearing in woods." F4 is forward of F5. "Deep woodland." F5 is forward of F6. "A road runs backward left to forward right." F6 is a room. "The edge of grassland."

-

And now a clump of 37 hexes, in six columns of six or seven rooms each. There are many ingenious ways we could put this map together automatically, but instead we will take a deep breath and write:

-

E1 is forward of E2. "Open farmland." E2 is forward of E3. "The edge of woods." E3 is forward of E4. "Deep woodland." E4 is forward of E5. "Deep woodland." E5 is forward of E6. "The rear edge of woods." E6 is forward of E7. "The start of a road leading forward right." E7 is a room. "Grassland." +

G1 is forward of G2. "Grassland." G2 is forward of G3. "The edge of farmland." G3 is forward of G4. "A copse of trees." G4 is forward of G5. "The backward edge of woodland." G5 is forward of G6. "A bend in the road, from backward left to backward right." G6 is forward of G7. "Open farmland." G7 is a room. "Open farmland."

-

F1 is forward of F2. "The edge of farmland." F2 is forward of F3. "The edge of woods." F3 is forward of F4. "Clearing in woods." F4 is forward of F5. "Deep woodland." F5 is forward of F6. "A road runs backward left to forward right." F6 is a room. "The edge of grassland." +

H1 is forward of H2. "Grassland, bordered by a hedge to the right." H2 is forward of H3. "The edge of farmland, with a hedge to forward right." H3 is forward of H4. "A copse of trees." H4 is forward of H5. "Open farmland." H5 is forward of H6. "A passing place on the road, which bends forward left to forward right." H6 is a room. "Open farmland."

-

G1 is forward of G2. "Grassland." G2 is forward of G3. "The edge of farmland." G3 is forward of G4. "A copse of trees." G4 is forward of G5. "The backward edge of woodland." G5 is forward of G6. "A bend in the road, from backward left to backward right." G6 is forward of G7. "Open farmland." G7 is a room. "Open farmland." +

I1 is forward of I2. "The end of a forward road, blocked by hedges on all sides except backward." I2 is forward of I3. "A straight road runs forward to backward, with long hedges to left and right." I3 is forward of I4. "A straight road runs forward to backward, alongside a long hedge to right." I4 is forward of I5. "A straight road runs forward to backward, alongside a long hedge to right." I5 is forward of I6. "Where three roads, forward, backward left and backward right, meet. Forward right is a thick hedge." I6 is forward of I7. "Open farmland." I7 is a room. "Open farmland."

-

H1 is forward of H2. "Grassland, bordered by a hedge to the right." H2 is forward of H3. "The edge of farmland, with a hedge to forward right." H3 is forward of H4. "A copse of trees." H4 is forward of H5. "Open farmland." H5 is forward of H6. "A passing place on the road, which bends forward left to forward right." H6 is a room. "Open farmland." +

J1 is forward of J2. "Dense woodland, with a hedge to left." J2 is forward of J3. "Grassland, with a hedge to left." J3 is forward of J4. "The edge of farmland, with a hedge to left." J4 is a room. "Open farmland, with a long hedge blocking movement forward left, backward left or backward." J5 is forward of J6. "A road running forward left to backward right, alongside a hedge." J6 is a room. "Open farmland."

-

I1 is forward of I2. "The end of a forward road, blocked by hedges on all sides except backward." I2 is forward of I3. "A straight road runs forward to backward, with long hedges to left and right." I3 is forward of I4. "A straight road runs forward to backward, alongside a long hedge to right." I4 is forward of I5. "A straight road runs forward to backward, alongside a long hedge to right." I5 is forward of I6. "Where three roads, forward, backward left and backward right, meet. Forward right is a thick hedge." I6 is forward of I7. "Open farmland." I7 is a room. "Open farmland." +

F1 is forward right of E2 and backward right of E1. F2 is forward right of E3 and backward right of E2. F3 is forward right of E4 and backward right of E3. F4 is forward right of E5 and backward right of E4. F5 is forward right of E6 and backward right of E5. F6 is forward right of E7 and backward right of E6.

-

J1 is forward of J2. "Dense woodland, with a hedge to left." J2 is forward of J3. "Grassland, with a hedge to left." J3 is forward of J4. "The edge of farmland, with a hedge to left." J4 is a room. "Open farmland, with a long hedge blocking movement forward left, backward left or backward." J5 is forward of J6. "A road running forward left to backward right, alongside a hedge." J6 is a room. "Open farmland." +

G1 is forward right of F1. G2 is forward right of F2 and backward right of F1. G3 is forward right of F3 and backward right of F2. G4 is forward right of F4 and backward right of F3. G5 is forward right of F5 and backward right of F4. G6 is forward right of F6 and backward right of F5.

-

F1 is forward right of E2 and backward right of E1. F2 is forward right of E3 and backward right of E2. F3 is forward right of E4 and backward right of E3. F4 is forward right of E5 and backward right of E4. F5 is forward right of E6 and backward right of E5. F6 is forward right of E7 and backward right of E6. +

H1 is forward right of G2 and backward right of G1. H2 is forward right of G3 and backward right of G2. H3 is forward right of G4 and backward right of G3. H4 is forward right of G5 and backward right of G4. H5 is forward right of G6 and backward right of G5. H6 is forward right of G7 and backward right of G6.

-

G1 is forward right of F1. G2 is forward right of F2 and backward right of F1. G3 is forward right of F3 and backward right of F2. G4 is forward right of F4 and backward right of F3. G5 is forward right of F5 and backward right of F4. G6 is forward right of F6 and backward right of F5. +

I3 is forward right of H3 and backward right of H2. I4 is forward right of H4 and backward right of H3. I5 is forward right of H5 and backward right of H4. I6 is forward right of H6 and backward right of H5.

-

H1 is forward right of G2 and backward right of G1. H2 is forward right of G3 and backward right of G2. H3 is forward right of G4 and backward right of G3. H4 is forward right of G5 and backward right of G4. H5 is forward right of G6 and backward right of G5. H6 is forward right of G7 and backward right of G6. -

-
- - -

I3 is forward right of H3 and backward right of H2. I4 is forward right of H4 and backward right of H3. I5 is forward right of H5 and backward right of H4. I6 is forward right of H6 and backward right of H5. -

-
- - -

J5 is forward right of I6 and backward right of I5. J6 is forward right of I7 and backward right of I6. +

J5 is forward right of I6 and backward right of I5. J6 is forward right of I7 and backward right of I6.

And now we have a hexagonally-gridded world. Route-finding will work; prepositional forms like "to be mapped backward left of" exist, just as they should; and in general these directions are just as good as the square ones. (The only thing which doesn't look good is the Index map, where Inform is just unable to draw a picture because it assumes a square grid. But that has no effect on play.)

The landscape is much easier to navigate with a little diagram:

- -

To say legend (D - direction): + +

To say legend (D - direction):
    let destination hex be the room D from the location;
@@ -921,21 +921,21 @@

- -

Carry out looking: + +

Carry out looking:
    say "[fixed letter spacing] \ [legend forward] /[line break][legend forward left] ---- [legend forward right][line break] / \[line break]--< [location] >--[line break] \ /[line break][legend backward left] ---- [legend backward right][line break] / [legend backward] \[variable letter spacing][line break]".

And finally:

- -

The player is in I5. + +

The player is in I5.

- -

Test me with "f / forward / backward left / bl / br / br / f". + +

Test me with "f / forward / backward left / bl / br / br / f".

@@ -958,7 +958,7 @@
- WI
+ WI @@ -967,33 +967,33 @@ @@ -113,28 +113,28 @@ @@ -184,33 +184,33 @@ @@ -277,33 +277,33 @@ @@ -121,28 +121,28 @@ @@ -175,23 +175,23 @@ @@ -270,84 +270,84 @@ @@ -119,8 +119,8 @@ @@ -154,22 +154,22 @@ @@ -118,61 +118,61 @@ @@ -234,18 +234,18 @@ @@ -407,35 +407,35 @@ @@ -615,28 +615,28 @@ @@ -670,23 +670,23 @@ @@ -841,18 +841,18 @@ @@ -1170,24 +1170,24 @@ @@ -1262,23 +1262,23 @@

Our baseline assumption is that a player may find a puzzle unsolvable for one of two reasons: he either hasn't seen the relevant clue, or he hasn't got the relevant equipment. If these are true, then he should be given hints about how to find this information, and then once he has it, more specific hints about the puzzle itself -- ending, as a last resort, with the exact command(s) he will need to use in order to bring about the solution.

In practice, there are other possibilities, but this will do for an example.

We begin by defining our relations:

- -

paste@2x.png create@2x.png   "The Unexamined Life" + +

paste@2x.png create@2x.png   "The Unexamined Life"

- -

Use scoring. + +

Use scoring.

- -

Explaining relates one thing to various things. The verb to explain means the explaining relation. + +

Explaining relates one thing to various things. The verb to explain means the explaining relation.

- -

Instead of hinting about something when something unexamined (called the clue) explains the noun: + +

Instead of hinting about something when something unexamined (called the clue) explains the noun:
    say "You're still missing some information that might be useful to understanding the problem. [More]";
@@ -1286,13 +1286,13 @@

- -

Requiring relates one thing to various things. The verb to require means the requiring relation. + +

Requiring relates one thing to various things. The verb to require means the requiring relation.

- -

Instead of hinting about something when the noun requires something (called the implement) which is not carried by the player: + +

Instead of hinting about something when the noun requires something (called the implement) which is not carried by the player:
    say "You're missing an object that might be useful to resolving this problem. [More]";
@@ -1300,14 +1300,14 @@

- -

Hinting about is an action applying to one visible thing. Understand "hint about [any thing]" as hinting about. + +

Hinting about is an action applying to one visible thing. Understand "hint about [any thing]" as hinting about.

This allows us to create the most absolutely generic sort of hint -- boring, perhaps, but in practice the player often just needs a nudge about what part of the game world he should be examining for a solution:

- -

Carry out hinting about: + +

Carry out hinting about:
    if something explains the noun, say "You might want to review [the list of things which explain the noun]. ";
@@ -1322,8 +1322,8 @@

These things cover hinting about objects that are themselves puzzles. But what if the player asks for hints about a tool or piece of information because he doesn't know how to apply it yet? We might want to give some guidance there, as well.

- -

Carry out hinting about something which explains something (called target): + +

Carry out hinting about something which explains something (called target):
    if target is unseen, say "[The noun] might prove useful information, sooner or later." instead;
@@ -1331,8 +1331,8 @@

- -

Carry out hinting about something which is required by something: + +

Carry out hinting about something which is required by something:
    say "[The noun] might be useful to have. [More]";
@@ -1345,8 +1345,8 @@

Now we have these general hints written, but we want to pre-empt them if the player has not yet fulfilled all the prerequisites.

- -

Instead of hinting about something unseen: + +

Instead of hinting about something unseen:
    if the noun is visible:
@@ -1372,8 +1372,8 @@

- -

Instead of hinting about a visited room: + +

Instead of hinting about a visited room:
    say "There's a room you've visited, but you haven't exhausted all there is to see there. [More]";
@@ -1385,8 +1385,8 @@

- -

Instead of hinting about an unvisited room: + +

Instead of hinting about an unvisited room:
    say "There's a room you haven't yet visited. [More]";
@@ -1394,8 +1394,8 @@

- -

To direct player to (goal - a room): + +

To direct player to (goal - a room):
    let way be the best route from location to the goal, using even locked doors;
@@ -1405,8 +1405,8 @@

- -

Instead of hinting about a portable seen thing which is not visible: + +

Instead of hinting about a portable seen thing which is not visible:
    if the noun is scenery, continue the action;
@@ -1419,21 +1419,21 @@

And this business of "seen" things requires, of course, that we keep track:

- -

A thing can be seen or unseen. A thing is usually unseen. The player is seen. After printing the name of something (called target): now the target is seen. + +

A thing can be seen or unseen. A thing is usually unseen. The player is seen. After printing the name of something (called target): now the target is seen.

That "After printing..." rule means that as soon as the game automatically prints the name of an object, it tags that object as having been "seen" by the player. This requires just a little care on our part, that we never mention an object without using the game's printing rules. Still, it is much easier than most other possible forms of bookkeeping.

We also need to deal with the question of whether the player has examined an object, for those objects whose descriptions carry vital information:

- -

A thing can be examined or unexamined. A thing is usually unexamined. Carry out examining something: now the noun is examined. + +

A thing can be examined or unexamined. A thing is usually unexamined. Carry out examining something: now the noun is examined.

In practice, there might be other ways of getting vital facts, and in a more sophisticated puzzle game we might need a more sophisticated model to track this. But examined or unexamined will do for now.

- -

To decide what room is the ultimate location of (item - a thing): + +

To decide what room is the ultimate location of (item - a thing):
    let place be the holder of the item;
@@ -1445,8 +1445,8 @@

- -

To decide what thing is the visible shell of (item - a thing): + +

To decide what thing is the visible shell of (item - a thing):
    if item is visible, decide on the item;
@@ -1460,23 +1460,23 @@

- -

To say more: + +

To say more:
    say "[paragraph break]Shall I go on? > ".

That covers most of the generic hints, but let's also add some slightly more precise hints about a few kinds of objects that are especially important in the model world. These hints will probably not be very interesting to a seasoned IF veteran, but a novice player who does not know the wording or cannot guess what something might be for may still find them useful:

- -

Carry out hinting about a locked lockable thing: + +

Carry out hinting about a locked lockable thing:
    say "You could unlock [the noun] with [the matching key of the noun]." instead.

- -

Instead of hinting about a locked thing when the matching key of the noun is not carried by the player: + +

Instead of hinting about a locked thing when the matching key of the noun is not carried by the player:
    if the player can see the matching key of the noun:
@@ -1490,110 +1490,110 @@

- -

Carry out hinting about a closed openable unlocked thing: + +

Carry out hinting about a closed openable unlocked thing:
    say "You could open [the noun]." instead.

- -

Carry out hinting about an open door: + +

Carry out hinting about an open door:
    say "You could enter [the noun]." instead.

- -

Carry out hinting about an unexamined thing: + +

Carry out hinting about an unexamined thing:
    say "You might find out something if you examine [the noun]." instead.

- -

Carry out hinting about an edible thing: + +

Carry out hinting about an edible thing:
    say "You could eat [the noun]." instead.

- -

Carry out hinting about a wearable thing: + +

Carry out hinting about a wearable thing:
    say "You could wear [the noun]." instead.

- -

Carry out hinting about a pushable between rooms thing: + +

Carry out hinting about a pushable between rooms thing:
    say "You could push [the noun] some direction." instead.

Now to the actual objects in the game:

- -

The Crypt is a room. "This squat, barrel-vaulted chamber runs roughly north-south. Along either side are the graves of Saxon kings and early bishops of the church long since gone to dust -- one [tomb] in particular looks undisturbed." + +

The Crypt is a room. "This squat, barrel-vaulted chamber runs roughly north-south. Along either side are the graves of Saxon kings and early bishops of the church long since gone to dust -- one [tomb] in particular looks undisturbed."

Notice that we used the bracketed tomb here: the tomb is scenery, and if we do not use the name-printing function, Inform will not register that we have mentioned it to the player.

- -

The tomb is scenery in the Crypt. The tomb is openable and closed. The silver dagger is a thing in the tomb. Understand "tombs" as the tomb. The description of the silver dagger is "Gleaming in a soft light all its own. Its blade is figured with running deer and its hilt is made of horn." The wight requires the silver dagger. The tomb requires the pry bar. + +

The tomb is scenery in the Crypt. The tomb is openable and closed. The silver dagger is a thing in the tomb. Understand "tombs" as the tomb. The description of the silver dagger is "Gleaming in a soft light all its own. Its blade is figured with running deer and its hilt is made of horn." The wight requires the silver dagger. The tomb requires the pry bar.

- -

Instead of opening the tomb when the player does not carry the pry bar: + +

Instead of opening the tomb when the player does not carry the pry bar:
    say "The lids are stone, too heavy for you to raise without some implement."

Now we can add specific hints to replace the generic ones:

- -

Carry out hinting about the tomb: + +

Carry out hinting about the tomb:
    say "The lids are heavy, but you can open them when you carry the pry bar."

The rest of the hint system ensures that the player will not see this final suggestion until he has the pry bar, since the tomb "requires" the pry bar. Having the hint there doesn't excuse us from providing some alternate wording in case the player solves this not-very-difficult conundrum on his own, though:

- -

Understand "pry [something] with [something preferably held]" as unlocking it with. Understand the commands "lever" or "prise" as "pry". + +

Understand "pry [something] with [something preferably held]" as unlocking it with. Understand the commands "lever" or "prise" as "pry".

- -

Instead of unlocking something with the pry bar, try opening the noun. + +

Instead of unlocking something with the pry bar, try opening the noun.

- -

The wight is a man in the Crypt. "[The wight] lurks near the south exit." The description of wight is "Old English [italic type]wiht[roman type]: a thing, a creature. It is little more than the memory of a life ill-lived, but it lingers here." Understand "wiht" or "creature" or "ghost" as the wight. + +

The wight is a man in the Crypt. "[The wight] lurks near the south exit." The description of wight is "Old English [italic type]wiht[roman type]: a thing, a creature. It is little more than the memory of a life ill-lived, but it lingers here." Understand "wiht" or "creature" or "ghost" as the wight.

- -

Instead of going south in the presence of wight: + +

Instead of going south in the presence of wight:
    say "The wight breathes chill into your face.

- -

Your head swims, and you are aware that you no longer have the willpower to go in that direction." + +

Your head swims, and you are aware that you no longer have the willpower to go in that direction."

- -

Fresh Air is south from the Crypt. + +

Fresh Air is south from the Crypt.

- -

After going to Fresh Air: + +

After going to Fresh Air:
    increment the score;
@@ -1603,30 +1603,30 @@

- -

The inscription is fixed in place in the Crypt. "Someone has painstakingly carved [an inscription] into the wall above the door." The description is "Squinting, you decipher the Latin text: [italic type]Silver causes harm to those that live though dead[roman type]." The inscription explains wight. + +

The inscription is fixed in place in the Crypt. "Someone has painstakingly carved [an inscription] into the wall above the door." The description is "Squinting, you decipher the Latin text: [italic type]Silver causes harm to those that live though dead[roman type]." The inscription explains wight.

- -

The Treasure Chamber is north of the Crypt. "The walls are thick, the high windows promisingly barred with iron. But for all this there is no hint of any valuable stores remaining." + +

The Treasure Chamber is north of the Crypt. "The walls are thick, the high windows promisingly barred with iron. But for all this there is no hint of any valuable stores remaining."

- -

The pry bar is in the Treasure Chamber. "One of the window bars, rusted from its place, lies in a puddle of water." Understand "window" or "bars" as the pry bar. The description of the pry bar is "A few feet long, and not entirely rusted into uselessness yet." + +

The pry bar is in the Treasure Chamber. "One of the window bars, rusted from its place, lies in a puddle of water." Understand "window" or "bars" as the pry bar. The description of the pry bar is "A few feet long, and not entirely rusted into uselessness yet."

- -

Instead of giving the dagger to wight: + +

Instead of giving the dagger to wight:
    say "The wight recoils, appalled."

- -

Carry out hinting about wight: + +

Carry out hinting about wight:
    say "You will have to find some way to get wight to come in physical contact with the silver dagger, which he will certainly not do willingly. [More]";
@@ -1636,34 +1636,34 @@

- -

Understand "touch [something] with [something]" as putting it on (with nouns reversed). Understand "hit [someone] with [something]" as putting it on (with nouns reversed). + +

Understand "touch [something] with [something]" as putting it on (with nouns reversed). Understand "hit [someone] with [something]" as putting it on (with nouns reversed).

- -

Instead of attacking the wight: + +

Instead of attacking the wight:
    say "You can't force yourself to approach close enough for hand to hand combat: if, indeed, the wight has hands."

- -

Instead of putting the dagger on wight: + +

Instead of putting the dagger on wight:
    say "The wight fades out of your way without ever coming into contact with the dagger. Perhaps a more projectile method would work better."

- -

Instead of putting something on wight: + +

Instead of putting something on wight:
    say "The wight dodges you."

- -

Instead of throwing the dagger at wight: + +

Instead of throwing the dagger at wight:
    now the wight is nowhere;
@@ -1675,20 +1675,20 @@

- -

The maximum score is 2. + +

The maximum score is 2.

- -

Test me with "hint about wight / north / get bar / south / open tomb / get dagger / south / hint about wight / read inscription / hint about wight / attack wight / throw dagger at wight / south". + +

Test me with "hint about wight / north / get bar / south / open tomb / get dagger / south / hint about wight / read inscription / hint about wight / attack wight / throw dagger at wight / south".

Note that, if using TEST ME to run through the solution on the Z-machine, we will have to answer a few yes/no questions along the way.

For Glulx, the code should instead read something like

- -

paste@2x.png create@2x.png   Test me with "hint about wight / y / north / get bar / south / open tomb / get dagger / south / hint about wight / y / read inscription / hint about wight / y / attack wight / throw dagger at wight / south". + +

paste@2x.png create@2x.png   Test me with "hint about wight / y / north / get bar / south / open tomb / get dagger / south / hint about wight / y / read inscription / hint about wight / y / attack wight / throw dagger at wight / south".

diff --git a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc94.html b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc94.html index 33939817..80ce26aa 100644 --- a/inform/StagingArea/Contents/Resources/en.lproj/Rdoc94.html +++ b/inform/StagingArea/Contents/Resources/en.lproj/Rdoc94.html @@ -83,15 +83,15 @@

§11.4. Scoring

Not every work of IF allots a numerical score to the player: for some authors, this emphasises the idea of a story rather than a narrative. The simple sentence

- -

Use scoring. + +

Use scoring.

introduces the concept. Once this is included, Inform will provide built-in support for a single number measuring progress ("score"), and will expect to measure this against a maximum possible ("maximum score", which can either be set by hand or worked out automatically from a table of ranks).

In a story in which scoring exists, the player may choose to turn score notifications (such as "[Your score has just gone up by one point.]") on or off. The commands to do this are NOTIFY ON and NOTIFY OFF; the actions are called switching score notification on and switching score notification off. In the event that we need to amend the behavior of notification, we could do so by adding, removing, or modifying the elements of the check and carry out rulebooks for these commands; as in

- -

Check switching score notification off: + +

Check switching score notification off:
    if the turn count is less than 10:
@@ -101,8 +101,8 @@

If we wish to change the wording of the default message ("[Your score has..."), we may want to use the Responses system.

An especially insidious style of bug allows the player to type the same sequence of commands over and over, earning score endlessly for the same insight, and to avoid this it is usually safest to write source like:

- -

After taking the Picasso miniature when the Picasso miniature is not handled: + +

After taking the Picasso miniature when the Picasso miniature is not handled:
    increase the score by 10;
@@ -111,8 +111,8 @@

We might also write our condition with "for the first time", like so:

- -

After jumping for the first time: + +

After jumping for the first time:
    increase the score by 5;
@@ -144,7 +144,7 @@

- WI
+ WI @@ -153,28 +153,28 @@ @@ -309,60 +309,60 @@ @@ -394,23 +394,23 @@ @@ -503,39 +503,39 @@ @@ -725,23 +725,23 @@ @@ -1586,35 +1586,35 @@ @@ -300,28 +300,28 @@ @@ -376,19 +376,19 @@ @@ -445,23 +445,23 @@ @@ -639,18 +639,18 @@ @@ -783,33 +783,33 @@ @@ -1029,28 +1029,28 @@

§12.1. Typography

Story files produced by Inform tend not to contain elaborate typographical effects. They would only distract. Like a novel, a classic work of IF is best presented in an elegant but unobtrusive font. Inform does, however, provide for italic and bold-face, and also for a typewriter-style fixed pitch of lettering:

- -

"This is an [italic type]italicised[roman type] word." + +

"This is an [italic type]italicised[roman type] word."
"This is an [bold type]emboldened[roman type] word."
@@ -92,8 +92,8 @@

Authors making very frequent use of these might like to borrow the briefer definitions in Chanel Version 1.

A very wide range of letter-forms is normally available (and even more in quoted text), so that the writer seldom needs to not worry whether, say, a sentence like

- -

A ticket to Tromsø via Østfold is in the Íslendingabók. + +

A ticket to Tromsø via Østfold is in the Íslendingabók.

@@ -119,7 +119,7 @@
- WI
+ WI @@ -129,23 +129,23 @@ @@ -217,13 +217,13 @@ @@ -279,31 +279,31 @@ @@ -1971,83 +1971,83 @@ @@ -121,30 +121,30 @@ @@ -178,13 +178,13 @@ @@ -400,18 +400,18 @@ @@ -474,20 +474,20 @@ @@ -535,18 +535,18 @@ @@ -637,13 +637,13 @@ @@ -866,35 +866,35 @@ @@ -111,38 +111,38 @@ -

*ExampleBic
+

*ExampleBic
Testing to make sure that all objects have been given descriptions.

@@ -73,11 +73,11 @@
- 3
+ 3 -

*ExampleVerbosity 1
+

*ExampleVerbosity 1
Making rooms give brief room descriptions when revisited.

@@ -95,11 +95,11 @@
- 4
+ 4 -

**ExampleSlightly Wrong
+

**ExampleSlightly Wrong
A room whose description changes slightly after our first visit there.

@@ -118,11 +118,11 @@
- 5
+ 5 -

*ExamplePort Royal 1
+

*ExamplePort Royal 1
A partial implementation of Port Royal, Jamaica, set before the earthquake of 1692 demolished large portions of the city.

@@ -140,11 +140,11 @@
- 6
+ 6 -

**ExampleUp and Up
+

**ExampleUp and Up
Adding a short message as the player approaches a room, before the room description itself appears.

@@ -162,11 +162,11 @@
- 7
+ 7 -

***ExampleStarry Void
+

***ExampleStarry Void
Creating a booth that can be seen from the outside, opened and closed, and entered as a separate room.

@@ -185,11 +185,11 @@
- 8
+ 8 -

*ExamplePort Royal 2
+

*ExamplePort Royal 2
Another part of Port Royal, with less typical map connections.

@@ -207,11 +207,11 @@
- 9
+ 9 -

*ExampleThe Unbuttoned Elevator Affair
+

*ExampleThe Unbuttoned Elevator Affair
A simple elevator connecting two floors which is operated simply by walking in and out, and has no buttons or fancy doors.

@@ -230,11 +230,11 @@
- 10
+ 10 -

*ExamplePort Royal 3
+

*ExamplePort Royal 3
Division of Port Royal into regions.

@@ -253,11 +253,11 @@
- 11
+ 11 -

*ExampleFirst Name Basis
+

*ExampleFirst Name Basis
Allowing the player to use different synonyms to refer to something.

@@ -275,11 +275,11 @@
- 12
+ 12 -

*ExampleMidsummer Day
+

*ExampleMidsummer Day
A few sentences laying out a garden together with some things which might be found in it.

@@ -298,11 +298,11 @@
- 13
+ 13 -

*ExampleTamed
+

*ExampleTamed
Examples of a container and a supporter that can be entered, as well as nested rooms.

@@ -321,11 +321,11 @@
- 14
+ 14 -

*ExampleDisenchantment Bay 1
+

*ExampleDisenchantment Bay 1
A running example in this chapter, Disenchantment Bay, involves chartering a boat. This is the first step: creating the cabin.

@@ -344,11 +344,11 @@
- 15
+ 15 -

*ExampleDisenchantment Bay 2
+

*ExampleDisenchantment Bay 2
Disenchantment Bay: creating some of the objects in the cabin's description.

@@ -366,11 +366,11 @@
- 16
+ 16 -

*ExampleReplanting
+

*ExampleReplanting
Changing the response when the player tries to take something that is scenery.

@@ -389,11 +389,11 @@
- 17
+ 17 -

*ExampleDisenchantment Bay 3
+

*ExampleDisenchantment Bay 3
Disenchantment Bay: adding a view of the glacier.

@@ -412,11 +412,11 @@
- 18
+ 18 -

*ExampleDisenchantment Bay 4
+

*ExampleDisenchantment Bay 4
Disenchantment Bay: fleshing out the descriptions of things on the boat.

@@ -434,11 +434,11 @@
- 19
+ 19 -

**ExampleLaura
+

**ExampleLaura
Some general advice about creating objects with unusual or awkward names, and a discussion of the use of printed names.

@@ -457,11 +457,11 @@
- 20
+ 20 -

*ExampleDisenchantment Bay 5
+

*ExampleDisenchantment Bay 5
Disenchantment Bay: adding the door and the deck to our charter boat.

@@ -479,11 +479,11 @@
- 21
+ 21 -

**ExampleEscape
+

**ExampleEscape
Window that can be climbed through or looked through.

@@ -501,11 +501,11 @@
- 22
+ 22 -

***ExampleGaribaldi 1
+

***ExampleGaribaldi 1
Providing a security readout device by which the player can check on the status of all doors in the game.

@@ -524,11 +524,11 @@
- 23
+ 23 -

*ExampleDisenchantment Bay 6
+

*ExampleDisenchantment Bay 6
Disenchantment Bay: locking up the charter boat's fishing rods.

@@ -546,11 +546,11 @@
- 24
+ 24 -

**ExampleNeighborhood Watch
+

**ExampleNeighborhood Watch
A locked door that can be locked or unlocked without a key from one side, but not from the other.

@@ -569,11 +569,11 @@
- 25
+ 25 -

*ExampleDisenchantment Bay 7
+

*ExampleDisenchantment Bay 7
Disenchantment Bay: making the radar and instruments switch on and off.

@@ -591,11 +591,11 @@
- 26
+ 26 -

**ExampleDown Below
+

**ExampleDown Below
A light switch which makes the room it is in dark or light.

@@ -614,11 +614,11 @@
- 27
+ 27 -

*ExamplePeugeot
+

*ExamplePeugeot
A journey from one room to another that requires the player to be on a vehicle.

@@ -636,11 +636,11 @@
- 28
+ 28 -

**ExampleDisenchantment Bay 8
+

**ExampleDisenchantment Bay 8
Disenchantment Bay: a pushable chest of ice for the boat.

@@ -658,11 +658,11 @@
- 29
+ 29 -

***ExampleHover
+

***ExampleHover
Letting the player see a modified room description when he's viewing the place from inside a vehicle.

@@ -681,11 +681,11 @@
- 30
+ 30 -

*ExampleDisenchantment Bay 9
+

*ExampleDisenchantment Bay 9
Disenchantment Bay: enter the charter boat's Captain.

@@ -704,11 +704,11 @@
- 31
+ 31 -

*ExampleBelfry
+

*ExampleBelfry
You can see a bat, a bell, some woodworm, William Snelson, the sexton's wife, a bellringer and your local vicar here.

@@ -726,11 +726,11 @@
- 32
+ 32 -

**ExampleGopher-wood
+

**ExampleGopher-wood
Changing the name of a character in the middle of play, removing the article.

@@ -749,11 +749,11 @@
- 33
+ 33 -

*ExampleDisenchantment Bay 10
+

*ExampleDisenchantment Bay 10
Disenchantment Bay: things for the player and the characters to wear and carry.

@@ -772,11 +772,11 @@
- 34
+ 34 -

*ExampleDisenchantment Bay 11
+

*ExampleDisenchantment Bay 11
Disenchantment Bay: making a holdall of the backpack.

@@ -795,11 +795,11 @@
- 35
+ 35 -

***ExampleFallout Enclosure
+

***ExampleFallout Enclosure
Adding an enclosure kind that includes both containers and supporters in order to simplify text that would apply to both.

@@ -817,11 +817,11 @@
- 36
+ 36 -

***ExampleBrown
+

***ExampleBrown
A red sticky label which can be attached to anything in the game, or removed again.

@@ -839,11 +839,11 @@
- 37
+ 37 -

****ExampleDisenchantment Bay 12
+

****ExampleDisenchantment Bay 12
A final trip to Disenchantment Bay: the scenario turned into a somewhat fuller scene, with various features that have not yet been explained.

@@ -862,11 +862,11 @@
- 38
+ 38 -

***ExampleSearch and Seizure
+

***ExampleSearch and Seizure
A smuggler who has items, some of which are hidden.

@@ -885,11 +885,11 @@
- 39
+ 39 -

**ExampleVan Helsing
+

**ExampleVan Helsing
A character who approaches the player, then follows him from room to room.

@@ -908,11 +908,11 @@
- 40
+ 40 -

**ExamplePrisoner's Dilemma
+

**ExamplePrisoner's Dilemma
A button that causes a previously non-existent exit to come into being.

@@ -930,11 +930,11 @@
- 41
+ 41 -

**ExampleThe World of Charles S. Roberts
+

**ExampleThe World of Charles S. Roberts
Replacing the ordinary compass bearings with a set of six directions to impose a hexagonal rather than square grid on the landscape.

@@ -952,11 +952,11 @@
- 42
+ 42 -

***ExampleFore
+

***ExampleFore
Understand "fore", "aft", "port", and "starboard", but only when the player is on a vessel.

@@ -977,11 +977,11 @@
- 43
+ 43 -

**ExampleVouvray
+

**ExampleVouvray
Adding synonyms to an entire kind of thing.

@@ -1000,11 +1000,11 @@
- 44
+ 44 -

*ExampleOdin
+

*ExampleOdin
Replacing "You see nothing special..." with a different default message for looking at something nondescript.

@@ -1022,11 +1022,11 @@
- 45
+ 45 -

*ExampleSomething Narsty
+

*ExampleSomething Narsty
A staircase always open and never openable.

@@ -1045,11 +1045,11 @@
- 46
+ 46 -

***ExampleGet Me to the Church on Time
+

***ExampleGet Me to the Church on Time
Using kinds of clothing to prevent the player from wearing several pairs of trousers at the same time.

@@ -1068,11 +1068,11 @@
- 47
+ 47 -

**ExampleChange of Basis
+

**ExampleChange of Basis
Implementing sleeping and wakeful states.

@@ -1091,11 +1091,11 @@
- 48
+ 48 -

*ExampleWould you...?
+

*ExampleWould you...?
Adding new properties to objects, and checking for their presence.

@@ -1113,11 +1113,11 @@
- 49
+ 49 -

**ExampleStraw Boater
+

**ExampleStraw Boater
Using text properties that apply only to some things and are not defined for others.

@@ -1136,11 +1136,11 @@
- 50
+ 50 -

*ExampleThe Undertomb 1
+

*ExampleThe Undertomb 1
A small map of dead ends, in which the sound of an underground river has different strengths in different caves.

@@ -1158,11 +1158,11 @@
- 51
+ 51 -

**ExampleThe Undertomb 2
+

**ExampleThe Undertomb 2
Flickering lantern-light effects added to the Undertomb.

@@ -1180,11 +1180,11 @@
- 52
+ 52 -

***ExampleThe Crane's Leg 1
+

***ExampleThe Crane's Leg 1
A description text that automatically highlights the ways in which the object differs from a standard member of its kind.

@@ -1202,11 +1202,11 @@
- 53
+ 53 -

***ExampleSigns and Portents
+

***ExampleSigns and Portents
Signpost that points to various destinations, depending on how the player has turned it.

@@ -1225,11 +1225,11 @@
- 54
+ 54 -

***ExampleReal Adventurers Need No Help
+

***ExampleReal Adventurers Need No Help
Allowing the player to turn off all access to hints for the duration of a game, in order to avoid the temptation to rely on them overmuch.

@@ -1248,11 +1248,11 @@
- 55
+ 55 -

***ExampleEarly Childhood
+

***ExampleEarly Childhood
A child's set of building blocks, which come in three different colours - red, green and blue - but which can be repainted during play.

@@ -1271,11 +1271,11 @@
- 56
+ 56 -

*ExampleBeing Prepared
+

*ExampleBeing Prepared
A kind for jackets, which always includes a container called a pocket.

@@ -1293,11 +1293,11 @@
- 57
+ 57 -

**ExampleModel Shop
+

**ExampleModel Shop
An "on/off button" which controls whatever device it is part of.

@@ -1315,11 +1315,11 @@
- 58
+ 58 -

***ExampleU-Stor-It
+

***ExampleU-Stor-It
A "chest" kind which consists of a container which has a lid as a supporter.

@@ -1337,11 +1337,11 @@
- 59
+ 59 -

***ExampleThe Night Before
+

***ExampleThe Night Before
Instructing Inform to prefer different interpretations of EXAMINE NOSE, depending on whether the player is alone, in company, or with Rudolph the Red-nosed Reindeer.

@@ -1362,11 +1362,11 @@
- 60
+ 60 -

***ExampleBallpark
+

***ExampleBallpark
A new "to say" definition which allows the author to say "[a number in round numbers]" and get verbal descriptions like "a couple of" or "a few" as a result.

@@ -1385,11 +1385,11 @@
- 61
+ 61 -

*ExampleControl Center
+

*ExampleControl Center
Objects which automatically include a description of their component parts whenever they are examined.

@@ -1407,11 +1407,11 @@
- 62
+ 62 -

**ExampleTiny Garden
+

**ExampleTiny Garden
A lawn made up of several rooms, with part of the description written automatically.

@@ -1430,11 +1430,11 @@
- 63
+ 63 -

*ExampleWhen?
+

*ExampleWhen?
A door whose description says "...leads east" in one place and "...leads west" in the other.

@@ -1452,11 +1452,11 @@
- 64
+ 64 -

***ExampleWhence?
+

***ExampleWhence?
A kind of door that always automatically describes the direction it opens and what lies on the far side (if that other room has been visited).

@@ -1474,11 +1474,11 @@
- 65
+ 65 -

***ExamplePersephone
+

***ExamplePersephone
Separate the player's inventory listing into two parts, so that it says "you are carrying..." and then (if the player is wearing anything) "You are also wearing...".

@@ -1497,11 +1497,11 @@
- 66
+ 66 -

*ExampleRadio Daze
+

*ExampleRadio Daze
A radio that produces a cycle of output using varying text.

@@ -1519,11 +1519,11 @@
- 67
+ 67 -

**ExampleCamp Bethel
+

**ExampleCamp Bethel
Creating characters who change their behavior from turn to turn, and a survey of other common uses for alternative texts.

@@ -1542,11 +1542,11 @@
- 68
+ 68 -

**ExampleBeekeeper's Apprentice
+

**ExampleBeekeeper's Apprentice
Making the SEARCH command examine all the scenery in the current location.

@@ -1565,11 +1565,11 @@
- 69
+ 69 -

*ExampleGaribaldi 2
+

*ExampleGaribaldi 2
Adding coloured text to the example of door-status readouts.

@@ -1588,11 +1588,11 @@
- 70
+ 70 -

***ExampleThe Über-complète clavier
+

***ExampleThe Über-complète clavier
This example provides a fairly stringent test of exotic lettering.

@@ -1611,11 +1611,11 @@
- 71
+ 71 -

*ExampleFifty Ways to Leave Your Larva
+

*ExampleFifty Ways to Leave Your Larva
Using text substitution to make characters reply differently under the same circumstances.

@@ -1633,11 +1633,11 @@
- 72
+ 72 -

***ExampleFifty Times Fifty Ways
+

***ExampleFifty Times Fifty Ways
Writing your own rules for how to carry out substitutions.

@@ -1658,11 +1658,11 @@
- 73
+ 73 -

*ExampleFinishing School
+

*ExampleFinishing School
The "another" adjective for rules such as "in the presence of another person".

@@ -1681,11 +1681,11 @@
- 74
+ 74 -

***ExampleOnly You...
+

***ExampleOnly You...
Smoke which spreads through the rooms of the map, but only every other turn.

@@ -1704,11 +1704,11 @@
- 75
+ 75 -

**ExampleVersailles
+

**ExampleVersailles
A mirror which will reflect some random object in the room.

@@ -1727,11 +1727,11 @@
- 76
+ 76 -

***ExampleLean and Hungry
+

***ExampleLean and Hungry
A thief who will identify and take any valuable thing lying around that he is able to touch.

@@ -1750,11 +1750,11 @@
- 77
+ 77 -

*ExampleMistress of Animals
+

*ExampleMistress of Animals
A person who moves randomly between rooms of the map.

@@ -1772,11 +1772,11 @@
- 78
+ 78 -

*ExampleAll Roads Lead to Mars
+

*ExampleAll Roads Lead to Mars
Layout where the player is allowed to wander any direction he likes, and the map will arrange itself in order so that he finds the correct "next" location.

@@ -1794,11 +1794,11 @@
- 79
+ 79 -

**ExampleHotel Stechelberg
+

**ExampleHotel Stechelberg
Signposts such as those provided on hiking paths in the Swiss Alps, which show the correct direction and hiking time to all other locations.

@@ -1816,11 +1816,11 @@
- 80
+ 80 -

***ExampleA View of Green Hills
+

***ExampleA View of Green Hills
A LOOK [direction] command which allows the player to see descriptions of the nearby landscape.

@@ -1838,11 +1838,11 @@
- 81
+ 81 -

***ExampleUnblinking
+

***ExampleUnblinking
Finding a best route through light-filled rooms only, leaving aside any that might be dark.

@@ -1861,11 +1861,11 @@
- 82
+ 82 -

****ExampleRevenge of the Fussy Table
+

****ExampleRevenge of the Fussy Table
A small game about resentful furniture and inconvenient objects.

@@ -1884,11 +1884,11 @@
- 83
+ 83 -

**ExampleYolk of Gold
+

**ExampleYolk of Gold
Set of drawers where the item the player seeks is always in the last drawer he opens, regardless of the order of opening.

@@ -1909,11 +1909,11 @@
- 84
+ 84 -

*ExampleGrilling
+

*ExampleGrilling
A grill, from which the player is not allowed to take anything lest he burn himself.

@@ -1931,11 +1931,11 @@
- 85
+ 85 -

*ExampleBad Hair Day
+

*ExampleBad Hair Day
Change the player's appearance in response to EXAMINE ME.

@@ -1954,11 +1954,11 @@
- 86
+ 86 -

***ExampleDemocratic Process
+

***ExampleDemocratic Process
Make PUT and INSERT commands automatically take objects if the player is not holding them.

@@ -1976,11 +1976,11 @@
- 87
+ 87 -

****ExampleSand
+

****ExampleSand
Extend PUT and INSERT handling to cases where multiple objects are intended at once.

@@ -1999,11 +1999,11 @@
- 88
+ 88 -

*ExampleFine Laid
+

*ExampleFine Laid
Making writing that can be separately examined from the paper on which it appears, but which directs all other actions to the paper.

@@ -2021,11 +2021,11 @@
- 89
+ 89 -

*ExampleHayseed
+

*ExampleHayseed
A refinement of our staircase kind which can be climbed.

@@ -2044,11 +2044,11 @@
- 90
+ 90 -

*ExampleMorning After
+

*ExampleMorning After
When the player picks something up which he hasn't already examined, the object is described.

@@ -2067,11 +2067,11 @@
- 91
+ 91 -

*ExampleSybil 1
+

*ExampleSybil 1
Direct all ASK, TELL, and ANSWER commands to ASK, and accept multiple words for certain cases.

@@ -2089,11 +2089,11 @@
- 92
+ 92 -

*ExampleLucy
+

*ExampleLucy
Redirecting a question about one topic to ask about another.

@@ -2111,11 +2111,11 @@
- 93
+ 93 -

**ExampleSybil 2
+

**ExampleSybil 2
Making the character understand YES, SAY YES TO CHARACTER, TELL CHARACTER YES, ANSWER YES, and CHARACTER, YES.

@@ -2133,11 +2133,11 @@
- 94
+ 94 -

***ExampleCosta Rican Ornithology
+

***ExampleCosta Rican Ornithology
A fully-implemented book, answering questions from a table of data, and responding to failed consultation with a custom message such as "You flip through the Guide to Central American Birds, but find no reference to penguins."

@@ -2156,11 +2156,11 @@
- 95
+ 95 -

***ExampleThe Art of Noise
+

***ExampleThe Art of Noise
Things are all assigned their own noise (or silence). Listening to the room in general reports on all the things that are currently audible.

@@ -2179,11 +2179,11 @@
- 96
+ 96 -

*ExampleZodiac
+

*ExampleZodiac
Several variations on "doing something other than...", demonstrating different degrees of restriction.

@@ -2202,11 +2202,11 @@
- 97
+ 97 -

*ExampleMing Vase
+

*ExampleMing Vase
ATTACK or DROP break and remove fragile items from play.

@@ -2225,11 +2225,11 @@
- 98
+ 98 -

*ExampleBeachfront
+

*ExampleBeachfront
An item that the player can't interact with until he has found it by searching the scenery.

@@ -2247,11 +2247,11 @@
- 99
+ 99 -

**ExampleToday Tomorrow
+

**ExampleToday Tomorrow
A few notes on "In the presence of" and how it interacts with concealed objects.

@@ -2270,11 +2270,11 @@
- 100
+ 100 -

*ExampleVeronica
+

*ExampleVeronica
An effect that occurs only when the player leaves a region entirely.

@@ -2292,11 +2292,11 @@
- 101
+ 101 -

**ExampleA&E
+

**ExampleA&E
Using regions to block access to an entire area when the player does not carry a pass, regardless of which entrance he uses.

@@ -2314,11 +2314,11 @@
- 102
+ 102 -

***ExampleBumping into Walls
+

***ExampleBumping into Walls
Offering the player a list of valid directions if he tries to go in a direction that leads nowhere.

@@ -2336,11 +2336,11 @@
- 103
+ 103 -

***ExamplePolarity
+

***ExamplePolarity
A "go back" command that keeps track of the direction from which the player came, and sends him back.

@@ -2359,11 +2359,11 @@
- 104
+ 104 -

*ExampleNo Relation
+

*ExampleNo Relation
A car which must be turned on before it can be driven, and can only go to roads.

@@ -2381,11 +2381,11 @@
- 105
+ 105 -

*ExampleMattress King
+

*ExampleMattress King
Adding extra phrasing to the action to PUSH something in a direction.

@@ -2403,11 +2403,11 @@
- 106
+ 106 -

**ExampleOne Short Plank
+

**ExampleOne Short Plank
A plank bridge which breaks if the player is carrying something when he goes across it. Pushing anything over the bridge is forbidden outright.

@@ -2425,11 +2425,11 @@
- 107
+ 107 -

***ExampleProvenance Unknown
+

***ExampleProvenance Unknown
Allowing something like PUSH TELEVISION EAST to push the cart on which the television rests.

@@ -2447,11 +2447,11 @@
- 108
+ 108 -

***ExampleZorb
+

***ExampleZorb
Replacing the message the player receives when attempting to push something that isn't pushable, and also to remove the restriction that objects cannot be pushed up or down.

@@ -2470,11 +2470,11 @@
- 109
+ 109 -

*ExampleDearth and the Maiden
+

*ExampleDearth and the Maiden
Our heroine, fallen among gentleman highwaymen, is restrained by her own modesty and seemliness.

@@ -2492,11 +2492,11 @@
- 110
+ 110 -

***ExampleMimicry
+

***ExampleMimicry
People who must be greeted before conversation can begin.

@@ -2515,11 +2515,11 @@
- 111
+ 111 -

*ExampleY ask Y?
+

*ExampleY ask Y?
Noticing when the player seems to be at a loss, and recommending the use of hints.

@@ -2537,11 +2537,11 @@
- 112
+ 112 -

****ExampleA Day For Fresh Sushi
+

****ExampleA Day For Fresh Sushi
A complete story by Emily Short, called "A Day for Fresh Sushi", rewritten using Inform 7. Noteworthy is the snarky commenter who remarks on everything the player does, but only the first time each action is performed.

@@ -2562,11 +2562,11 @@
- 113
+ 113 -

***ExampleDon Pedro's Revenge
+

***ExampleDon Pedro's Revenge
Combat scenario in which the player's footing and position changes from move to move, and the command prompt also changes to reflect that.

@@ -2585,11 +2585,11 @@
- 114
+ 114 -

*ExamplePolitics as Usual
+

*ExamplePolitics as Usual
Have the status line indicate the current region of the map.

@@ -2607,11 +2607,11 @@
- 115
+ 115 -

***ExampleCentered
+

***ExampleCentered
Replacing the two-part status line with one that centers only the room name at the top of the screen.

@@ -2630,11 +2630,11 @@
- 116
+ 116 -

*ExampleVitrine
+

*ExampleVitrine
An electrochromic window that becomes transparent or opaque depending on whether it is currently turned on.

@@ -2653,11 +2653,11 @@
- 117
+ 117 -

*ExampleThirst
+

*ExampleThirst
A waterskin that is depleted as the player drinks from it.

@@ -2675,11 +2675,11 @@
- 118
+ 118 -

*ExampleThirst 2
+

*ExampleThirst 2
A campfire added to the camp site, which can be lit using tinder.

@@ -2698,11 +2698,11 @@
- 119
+ 119 -

**ExampleMeteoric I and II
+

**ExampleMeteoric I and II
A meteor in the night sky which is visible from many rooms, so needs to be a backdrop, but which does not appear until 11:31 PM.

@@ -2721,11 +2721,11 @@
- 120
+ 120 -

***ExampleOrange Cones
+

***ExampleOrange Cones
Creating a traffic backdrop that appears in all road rooms except the one in which the player has laid down orange cones.

@@ -2744,11 +2744,11 @@
- 121
+ 121 -

***ExampleTerror of the Sierra Madre
+

***ExampleTerror of the Sierra Madre
Multiple player characters who take turns controlling the action.

@@ -2767,11 +2767,11 @@
- 122
+ 122 -

*ExampleBeverage Service
+

*ExampleBeverage Service
A potion that the player can drink.

@@ -2789,11 +2789,11 @@
- 123
+ 123 -

*ExampleSpring Cleaning
+

*ExampleSpring Cleaning
A character who sulks over objects that the player has broken (and which are now off-stage).

@@ -2811,11 +2811,11 @@
- 124
+ 124 -

**ExampleExtra Supplies
+

**ExampleExtra Supplies
A supply of red pens from which the player can take another pen only if he doesn't already have one somewhere in the game world.

@@ -2834,11 +2834,11 @@
- 125
+ 125 -

*ExampleBee Chambers
+

*ExampleBee Chambers
A maze with directions between rooms randomized at the start of play.

@@ -2856,11 +2856,11 @@
- 126
+ 126 -

**ExampleHatless
+

**ExampleHatless
It's tempting to use "now..." to distribute items randomly at the start of play, but we need to be a little cautious about how we do that.

@@ -2878,11 +2878,11 @@
- 127
+ 127 -

***ExampleTechnological Terror
+

***ExampleTechnological Terror
A ray gun which destroys objects, leaving their component parts behind.

@@ -2901,11 +2901,11 @@
- 128
+ 128 -

*ExampleHigher Calling
+

*ExampleHigher Calling
All doors in the game automatically attempt to open if the player approaches them when they are closed.

@@ -2924,11 +2924,11 @@
- 129
+ 129 -

*ExampleDo Pass Go
+

*ExampleDo Pass Go
A pair of dice which can be rolled, and are described with their current total when not carried, and have individual scores when examined.

@@ -2946,11 +2946,11 @@
- 130
+ 130 -

*ExampleLanista 1
+

*ExampleLanista 1
Very simple randomized combat in which characters hit one another for a randomized amount of damage.

@@ -2968,11 +2968,11 @@
- 131
+ 131 -

*ExampleWeathering
+

*ExampleWeathering
The automatic weather station atop Mt. Pisgah shows randomly fluctuating temperature, pressure and cloud cover.

@@ -2990,11 +2990,11 @@
- 132
+ 132 -

***ExampleUptown Girls
+

***ExampleUptown Girls
A stream of random pedestrians who go by the player.

@@ -3013,11 +3013,11 @@
- 133
+ 133 -

*ExampleCandy
+

*ExampleCandy
One of several identical candies chosen at the start of play to be poisonous.

@@ -3035,11 +3035,11 @@
- 134
+ 134 -

*ExampleZork II
+

*ExampleZork II
A "Carousel Room", as in Zork II, where moving in any direction from the room leads (at random) to one of the eight rooms nearby.

@@ -3060,11 +3060,11 @@
- 135
+ 135 -

*ExampleClueless
+

*ExampleClueless
A murderer for the mystery is selected randomly at the beginning of the game.

@@ -3083,11 +3083,11 @@
- 136
+ 136 -

**ExampleMutt's Adventure
+

**ExampleMutt's Adventure
Awarding points for visiting a room for the first time.

@@ -3105,11 +3105,11 @@
- 137
+ 137 -

***ExampleNo Place Like Home
+

***ExampleNo Place Like Home
Recording a whole table of scores for specific treasures.

@@ -3128,11 +3128,11 @@
- 138
+ 138 -

***ExampleBig Sky Country
+

***ExampleBig Sky Country
Allowing the player to continue play after a fatal accident, but penalizing him by scattering his possessions around the game map.

@@ -3151,11 +3151,11 @@
- 139
+ 139 -

***ExampleWitnessed 1
+

***ExampleWitnessed 1
A kind of battery which can be put into different devices, and which will lose power after extended use.

@@ -3173,11 +3173,11 @@
- 140
+ 140 -

****ExampleText Foosball
+

****ExampleText Foosball
A game of foosball which relies heavily on every-turn rules.

@@ -3196,11 +3196,11 @@
- 141
+ 141 -

**ExampleIPA
+

**ExampleIPA
Shops which each have opening and closing hours, so that it is impossible to go in at the wrong times, and the player is kicked out if he overstays his welcome.

@@ -3219,11 +3219,11 @@
- 142
+ 142 -

*ExampleSituation Room
+

*ExampleSituation Room
Printing the time of day in 24-hour time, as in military situations.

@@ -3242,11 +3242,11 @@
- 143
+ 143 -

*ExampleMRE
+

*ExampleMRE
Hunger that eventually kills the player, and foodstuffs that can delay the inevitable by different amounts of time.

@@ -3264,11 +3264,11 @@
- 144
+ 144 -

**ExampleTotality
+

**ExampleTotality
To schedule an eclipse of the sun, which involves a number of related events.

@@ -3286,11 +3286,11 @@
- 145
+ 145 -

**ExampleEmpire
+

**ExampleEmpire
A train which follows a schedule, stopping at a number of different locations.

@@ -3308,11 +3308,11 @@
- 146
+ 146 -

***ExampleHour of the Wren
+

***ExampleHour of the Wren
Allowing the player to make an appointment, which is then kept.

@@ -3331,11 +3331,11 @@
- 147
+ 147 -

*ExampleNight Sky
+

*ExampleNight Sky
A room which changes its description depending on whether an object has been examined.

@@ -3353,11 +3353,11 @@
- 148
+ 148 -

***ExampleZero
+

***ExampleZero
A box which called "horribly heavy box" after the player has tried to take it the first time.

@@ -3376,11 +3376,11 @@
- 149
+ 149 -

*ExampleTense Boxing
+

*ExampleTense Boxing
An overview of all the variations of past and present tenses, and how they might be used.

@@ -3398,11 +3398,11 @@
- 150
+ 150 -

**ExampleBruneseau's Journey
+

**ExampleBruneseau's Journey
A candle which reacts to lighting and blowing actions differently depending on whether it has already been lit once.

@@ -3420,11 +3420,11 @@
- 151
+ 151 -

**ExampleElsie
+

**ExampleElsie
A door that closes automatically one turn after the player opens it.

@@ -3443,11 +3443,11 @@
- 152
+ 152 -

*ExampleInfiltration
+

*ExampleInfiltration
A room whose description changes depending on the number of times the player has visited.

@@ -3466,11 +3466,11 @@
- 153
+ 153 -

*ExampleAnnoyotron Jr
+

*ExampleAnnoyotron Jr
A child who after a certain period in the car starts asking annoying questions.

@@ -3491,11 +3491,11 @@
- 154
+ 154 -

*ExamplePine 1
+

*ExamplePine 1
Pine: Using a scene to watch for the solution of a puzzle, however arrived-at by the player.

@@ -3513,11 +3513,11 @@
- 155
+ 155 -

**ExampleEntrapment
+

**ExampleEntrapment
A scene in which the player is allowed to explore as much as he likes, but another character strolls in as soon as he has gotten himself into an awkward or embarrassing situation.

@@ -3536,11 +3536,11 @@
- 156
+ 156 -

*ExampleAge of Steam
+

*ExampleAge of Steam
The railway-station examples so far put together into a short game called "Age of Steam".

@@ -3559,11 +3559,11 @@
- 157
+ 157 -

*ExampleFull Moon
+

*ExampleFull Moon
Random atmospheric events which last the duration of a scene.

@@ -3581,11 +3581,11 @@
- 158
+ 158 -

**ExampleSpace Patrol - Stranded on Jupiter!
+

**ExampleSpace Patrol - Stranded on Jupiter!
We'll be back in just a moment, with more exciting adventures of the... Space Patrol!

@@ -3603,11 +3603,11 @@
- 159
+ 159 -

***ExampleBowler Hats and Baby Geese
+

***ExampleBowler Hats and Baby Geese
Creating a category of scenes that restrict the player's behavior.

@@ -3625,11 +3625,11 @@
- 160
+ 160 -

***ExampleDay One
+

***ExampleDay One
A scene which plays through a series of events in order, then ends when the list of events is exhausted.

@@ -3648,11 +3648,11 @@
- 161
+ 161 -

***ExamplePine 2
+

***ExamplePine 2
Pine: Adding a conversation with the princess, in which a basic set of facts must be covered before the scene is allowed to end.

@@ -3671,11 +3671,11 @@
- 162
+ 162 -

*ExampleThe Prague Job
+

*ExampleThe Prague Job
Scenes used to provide pacing while the player goes through his possessions.

@@ -3693,11 +3693,11 @@
- 163
+ 163 -

***ExampleEntrevaux
+

***ExampleEntrevaux
Organizing the game by scenes, where each scene has a location and prop lists so that it can be set up automatically.

@@ -3716,11 +3716,11 @@
- 164
+ 164 -

*ExampleNight and Day
+

*ExampleNight and Day
Cycling through a sequence of scenes to represent day and night following one another during a game.

@@ -3738,11 +3738,11 @@
- 165
+ 165 -

***ExamplePine 3
+

***ExamplePine 3
Pine: Allowing the player to visit aspects of the past in memory and describe these events to the princess, as a break from the marriage-proposal scene.

@@ -3761,11 +3761,11 @@
- 166
+ 166 -

***ExamplePanache
+

***ExamplePanache
Replacing the score with a plot summary that records the events of the plot, scene by scene.

@@ -3783,11 +3783,11 @@
- 167
+ 167 -

***ExamplePine 4
+

***ExamplePine 4
Pine: Adding a flashback scene that, instead of repeating endlessly, repeats only until the Princess has understood the point.

@@ -3806,11 +3806,11 @@
- 168
+ 168 -

***ExampleCheese-makers
+

***ExampleCheese-makers
Scenes used to control the way a character reacts to conversation and comments, using a TALK TO command.

@@ -3831,11 +3831,11 @@
- 169
+ 169 -

*ExampleAhem
+

*ExampleAhem
Writing a phrase, with several variant forms, whose function is to follow a rule several times.

@@ -3853,11 +3853,11 @@
- 170
+ 170 -

**ExampleFerragamo Again
+

**ExampleFerragamo Again
Using the same phrase to produce different results with different characters.

@@ -3876,11 +3876,11 @@
- 171
+ 171 -

**ExampleProposal
+

**ExampleProposal
Asking the player a yes/no question which he must answer, and another which he may answer or not as he chooses.

@@ -3899,11 +3899,11 @@
- 172
+ 172 -

*ExampleMatreshka
+

*ExampleMatreshka
A SEARCH [room] action that will open every container the player can see, stopping only when there don't remain any that are closed, unlocked, and openable.

@@ -3921,11 +3921,11 @@
- 173
+ 173 -

*ExamplePrincess and the Pea
+

*ExamplePrincess and the Pea
The player is unable to sleep on a mattress (or stack of mattresses) because the bottom one has something uncomfortable under it.

@@ -3944,11 +3944,11 @@
- 174
+ 174 -

*ExampleNumberless
+

*ExampleNumberless
A simple exercise in printing the names of random numbers, comparing the use of "otherwise if...", a switch statement, or a table-based alternative.

@@ -3967,11 +3967,11 @@
- 175
+ 175 -

*ExampleWonka's Revenge
+

*ExampleWonka's Revenge
A lottery drum which redistributes the tickets inside whenever the player spins it.

@@ -3990,11 +3990,11 @@
- 176
+ 176 -

**ExampleStrictly Ballroom
+

**ExampleStrictly Ballroom
People who select partners for dance lessons each turn.

@@ -4013,11 +4013,11 @@
- 177
+ 177 -

**ExampleEquipment List
+

**ExampleEquipment List
Overview of all the phrase options associated with listing, and examples of how to change the inventory list into some other standard formats.

@@ -4036,11 +4036,11 @@
- 178
+ 178 -

*ExampleM. Melmoth's Duel
+

*ExampleM. Melmoth's Duel
Three basic ways to inject random or not-so-random variations into text.

@@ -4059,11 +4059,11 @@
- 179
+ 179 -

***ExampleOwen's Law
+

***ExampleOwen's Law
OUT always means "move to an outdoors room, or else to a room with more exits than this one has"; IN always means the opposite.

@@ -4082,11 +4082,11 @@
- 180
+ 180 -

*ExampleWitnessed 2
+

*ExampleWitnessed 2
A piece of ghost-hunting equipment that responds depending on whether or not the meter is on and a ghost is visible or touchable from the current location.

@@ -4104,11 +4104,11 @@
- 181
+ 181 -

***ExampleA Haughty Spirit
+

***ExampleA Haughty Spirit
Windows overlooking lower spaces which will prevent the player from climbing through if the lower space is too far below.

@@ -4127,11 +4127,11 @@
- 182
+ 182 -

*ExampleEntropy
+

*ExampleEntropy
All objects in the game have a heat, but if not kept insulated they will tend toward room temperature (and at a somewhat exaggerated rate).

@@ -4149,11 +4149,11 @@
- 183
+ 183 -

***ExampleThe Hang of Thursdays
+

***ExampleThe Hang of Thursdays
Turns take a quarter day each, and the game rotates through the days of the week.

@@ -4174,11 +4174,11 @@
- 184
+ 184 -

*ExampleVirtue
+

*ExampleVirtue
Defining certain kinds of behavior as inappropriate, so that other characters will refuse indignantly to do any such thing.

@@ -4196,11 +4196,11 @@
- 185
+ 185 -

***ExampleLatris Theon
+

***ExampleLatris Theon
A person who can accept instructions to go to new destinations and move towards them according to the most reasonable path.

@@ -4219,11 +4219,11 @@
- 186
+ 186 -

*ExampleThe Hypnotist of Blois
+

*ExampleThe Hypnotist of Blois
A hypnotist who can make people obedient and then set them free again.

@@ -4241,11 +4241,11 @@
- 187
+ 187 -

*ExamplePolice State
+

*ExamplePolice State
Several friends who obey you; a policeman who doesn't (but who takes a dim view of certain kinds of antics).

@@ -4264,11 +4264,11 @@
- 188
+ 188 -

**ExampleGeneration X
+

**ExampleGeneration X
A person who goes along with the player's instructions, but reluctantly, and will get annoyed after too many repetitions of the same kind of unsuccessful command.

@@ -4287,11 +4287,11 @@
- 189
+ 189 -

*ExampleIQ Test
+

*ExampleIQ Test
Introducing Ogg, a person who will unlock and open a container when the player tells him to get something inside.

@@ -4309,11 +4309,11 @@
- 190
+ 190 -

****ExampleBoston Cream
+

****ExampleBoston Cream
A fuller implementation of Ogg, giving him a motivation of his own and allowing him to react to the situation created by the player.

@@ -4332,11 +4332,11 @@
- 191
+ 191 -

*ExampleRed Cross
+

*ExampleRed Cross
A DIAGNOSE command which allows the player to check on the health of someone.

@@ -4354,11 +4354,11 @@
- 192
+ 192 -

***ExampleFrizz
+

***ExampleFrizz
Liquid flows within containers and soaks objects that are not waterproof; any contact with a wet object can dampen our gloves.

@@ -4376,11 +4376,11 @@
- 193
+ 193 -

***Example3 AM
+

***Example3 AM
A shake command which agitates soda and makes items thump around in boxes.

@@ -4399,11 +4399,11 @@
- 194
+ 194 -

*ExampleThe Dark Ages Revisited
+

*ExampleThe Dark Ages Revisited
An electric light kind of device which becomes lit when switched on and dark when switched off.

@@ -4421,11 +4421,11 @@
- 195
+ 195 -

**ExamplePaddington
+

**ExamplePaddington
A CUT [something] WITH [something] command which acts differently on different types of objects.

@@ -4443,11 +4443,11 @@
- 196
+ 196 -

***ExampleDelicious, Delicious Rocks
+

***ExampleDelicious, Delicious Rocks
Adding a "sanity-check" stage to decide whether an action makes any sense, which occurs before any before rules, implicit taking, or check rules.

@@ -4465,11 +4465,11 @@
- 197
+ 197 -

***ExampleNoisemaking
+

***ExampleNoisemaking
Creating a stage after the report stage of an action, during which other characters may observe and react.

@@ -4488,11 +4488,11 @@
- 198
+ 198 -

*ExampleRemoval
+

*ExampleRemoval
TAKE expanded to give responses such as "You take the book from the shelf." or "You pick up the toy from the ground."

@@ -4510,11 +4510,11 @@
- 199
+ 199 -

*ExampleFurther Reasons Why All Poets Are Liars
+

*ExampleFurther Reasons Why All Poets Are Liars
The young William Wordsworth, pushing a box about in his room, must struggle to achieve a Romantic point of view.

@@ -4532,11 +4532,11 @@
- 200
+ 200 -

*ExampleThe Second Oldest Problem
+

*ExampleThe Second Oldest Problem
Adapting the going action so that something special can happen when going from a dark room to another dark room.

@@ -4554,11 +4554,11 @@
- 201
+ 201 -

**ExamplePuff of Orange Smoke
+

**ExamplePuff of Orange Smoke
A system in which every character has a body, which is left behind when the person dies; attempts to do something to the body are redirected to the person while the person is alive.

@@ -4576,11 +4576,11 @@
- 202
+ 202 -

***ExampleCroft
+

***ExampleCroft
Adding special reporting and handling for objects dropped when the player is on a supporter, and special entering rules for moving from one supporter to another.

@@ -4599,11 +4599,11 @@
- 203
+ 203 -

**ExampleThe Man of Steel
+

**ExampleThe Man of Steel
An escaping action which means "go to any room you can reach from here", and is only useful to non-player characters.

@@ -4621,11 +4621,11 @@
- 204
+ 204 -

***ExampleTrying Taking Manhattan
+

***ExampleTrying Taking Manhattan
Replacing the inventory reporting rule with another which does something slightly different.

@@ -4643,11 +4643,11 @@
- 205
+ 205 -

****ExampleUnder Contract
+

****ExampleUnder Contract
Creating a person who accepts most instructions and reacts correctly when a request leads implicitly to inappropriate behavior.

@@ -4666,11 +4666,11 @@
- 206
+ 206 -

*ExampleGet Axe
+

*ExampleGet Axe
Changing the check rules to try automatically leaving a container before attempting to take it. (And arranging things so that other people will do likewise.)

@@ -4688,11 +4688,11 @@
- 207
+ 207 -

***ExampleBarter Barter
+

***ExampleBarter Barter
Allowing characters other than the player to give objects to one another, accounting for the possibility that some items may not be desired by the intended recipients.

@@ -4711,11 +4711,11 @@
- 208
+ 208 -

**ExampleThe Man of Steel Excuses Himself
+

**ExampleThe Man of Steel Excuses Himself
Elaborating the report rules to be more interesting than "Clark goes west."

@@ -4733,11 +4733,11 @@
- 209
+ 209 -

***ExampleFate Steps In
+

***ExampleFate Steps In
Fate entity which attempts to make things happen, by hook or by crook, including taking preliminary actions to set the player up a bit.

@@ -4756,11 +4756,11 @@
- 210
+ 210 -

*ExampleSpellbreaker
+

*ExampleSpellbreaker
P. David Lebling's classic "Spellbreaker" (1986) includes a room where the game cannot be saved: here is an Inform implementation.

@@ -4778,11 +4778,11 @@
- 211
+ 211 -

***ExampleA point for never saving the game
+

***ExampleA point for never saving the game
In some of the late 1970s "cave crawl" adventure games, an elaborate scoring system might still leave the player perplexed as to why an apparently perfect play-through resulted in a score which was still one point short of the supposed maximum. Why only 349 out of 350? The answer varied, but sometimes the last point was earned by never saving the game - in other words by playing it right through with nothing to guard against mistakes (except perhaps UNDO for the last command), and in one long session.

@@ -4801,11 +4801,11 @@
- 212
+ 212 -

**ExampleCarnivale
+

**ExampleCarnivale
An alternative to backdrops when we want something to be visible from a distance but only touchable from one room.

@@ -4824,11 +4824,11 @@
- 213
+ 213 -

**ExampleEddystone
+

**ExampleEddystone
Creating new commands involving the standard compass directions.

@@ -4846,11 +4846,11 @@
- 214
+ 214 -

***ExampleSlogar's Revenge
+

***ExampleSlogar's Revenge
Creating an amulet of tumblers that can be used to lock and unlock things even when it is worn, overriding the usual requirement that keys be carried.

@@ -4869,11 +4869,11 @@
- 215
+ 215 -

*ExampleMagneto's Revenge
+

*ExampleMagneto's Revenge
Kitty Pryde of the X-Men is able to reach through solid objects, so we might implement her with special powers that the player does not have...

@@ -4891,11 +4891,11 @@
- 216
+ 216 -

*ExampleWaterworld
+

*ExampleWaterworld
A backdrop which the player can examine, but cannot interact with in any other way.

@@ -4913,11 +4913,11 @@
- 217
+ 217 -

**ExampleDinner is Served
+

**ExampleDinner is Served
A window between two locations. When the window is open, the player can reach through into the other location; when it isn't, access is barred.

@@ -4936,11 +4936,11 @@
- 218
+ 218 -

*ExampleFlashlight
+

*ExampleFlashlight
Visibility set so that looking under objects produces no result unless the player has a light source to shine there (regardless of the light level of the room).

@@ -4959,11 +4959,11 @@
- 219
+ 219 -

*ExampleBosch
+

*ExampleBosch
Creating a list of actions that will earn the player points, and using this both to change the score and to give FULL SCORE reports.

@@ -4981,11 +4981,11 @@
- 220
+ 220 -

*ExampleCactus Will Outlive Us All
+

*ExampleCactus Will Outlive Us All
For every character besides the player, there is an action that will cause that character to wither right up and die.

@@ -5003,11 +5003,11 @@
- 221
+ 221 -

**ExampleActor's Studio
+

**ExampleActor's Studio
A video camera that records actions performed in its presence, and plays them back with time-stamps.

@@ -5025,11 +5025,11 @@
- 222
+ 222 -

**ExampleAnteaters
+

**ExampleAnteaters
The player carries a gizmo that is able to record actions performed by the player, then force him to repeat them when the gizmo is dropped. This includes storing actions that apply to topics, as in "look up anteater colonies in the guide".

@@ -5050,11 +5050,11 @@
- 223
+ 223 -

***ExampleFormal syntax of sentences
+

***ExampleFormal syntax of sentences
A more formal description of the sentence grammar used by Inform for both assertions and conditions.

@@ -5073,11 +5073,11 @@
- 224
+ 224 -

*ExampleCeladon
+

*ExampleCeladon
Using the enclosure relation to let the player drop things which he only indirectly carries.

@@ -5095,11 +5095,11 @@
- 225
+ 225 -

*ExampleInterrogation
+

*ExampleInterrogation
A wand which, when waved, reveals the concealed items carried by people the player can see.

@@ -5118,11 +5118,11 @@
- 226
+ 226 -

***ExampleFour Cheeses
+

***ExampleFour Cheeses
A system of telephones on which the player can call distant persons and have conversations.

@@ -5141,11 +5141,11 @@
- 227
+ 227 -

*ExampleTransmutations
+

*ExampleTransmutations
A machine that turns objects into other, similar objects.

@@ -5163,11 +5163,11 @@
- 228
+ 228 -

***ExampleOtranto
+

***ExampleOtranto
A kind of rope which can be tied to objects and used to anchor the player or drag items from room to room.

@@ -5186,11 +5186,11 @@
- 229
+ 229 -

*ExampleUnthinkable Alliances
+

*ExampleUnthinkable Alliances
People are to be grouped into alliances. To kiss someone is to join his or her faction, which may make a grand alliance; to strike them is to give notice of quitting, and to become a lone wolf.

@@ -5208,11 +5208,11 @@
- 230
+ 230 -

***ExampleThe Unexamined Life
+

***ExampleThe Unexamined Life
An adaptive hint system that tracks what the player needs to have seen or to possess in order to solve a given puzzle, and doles out suggestions accordingly. Handles changes in the game state with remarkable flexibility, and allows the player to decide how explicit a nudge he wants at any given moment.

@@ -5231,11 +5231,11 @@
- 231
+ 231 -

*ExampleThe Abolition of Love
+

*ExampleThe Abolition of Love
A thorough exploration of all the kinds of relations established so far, with the syntax to set and unset them.

@@ -5253,11 +5253,11 @@
- 232
+ 232 -

*ExampleSwerve left? Swerve right? Or think about it and die?
+

*ExampleSwerve left? Swerve right? Or think about it and die?
Building a marble chute track in which a dropped marble will automatically roll downhill.

@@ -5275,11 +5275,11 @@
- 233
+ 233 -

*ExampleBeneath the Surface
+

*ExampleBeneath the Surface
An "underlying" relation which adds to the world model the idea of objects hidden under other objects.

@@ -5297,11 +5297,11 @@
- 234
+ 234 -

***ExampleBogart
+

***ExampleBogart
Clothing for the player that layers, so that items cannot be taken off in the wrong order, and the player's inventory lists only the clothing that is currently visible.

@@ -5320,11 +5320,11 @@
- 235
+ 235 -

***ExampleThe Problem of Edith
+

***ExampleThe Problem of Edith
A conversation in which the main character tries to build logical connections between what the player is saying now and what went immediately before.

@@ -5343,11 +5343,11 @@
- 236
+ 236 -

*ExampleWainwright Acts
+

*ExampleWainwright Acts
A technical note about checking the location of door objects when characters other than the player are interacting with them.

@@ -5365,11 +5365,11 @@
- 237
+ 237 -

***ExampleA Humble Wayside Flower
+

***ExampleA Humble Wayside Flower
Relations track the relationships between one character and another. Whenever the player meets a relative of someone he already knows, he receives a brief introduction.

@@ -5388,11 +5388,11 @@
- 238
+ 238 -

*ExampleMeet Market
+

*ExampleMeet Market
A case in which relations give characters multiple values of the same kind.

@@ -5410,11 +5410,11 @@
- 239
+ 239 -

***ExampleFor Demonstration Purposes
+

***ExampleFor Demonstration Purposes
A character who learns new actions by watching the player performing them.

@@ -5433,11 +5433,11 @@
- 240
+ 240 -

*ExampleNumber Study
+

*ExampleNumber Study
The parity and joint magnitude relations explored.

@@ -5456,11 +5456,11 @@
- 241
+ 241 -

**ExampleMurder on the Orient Express
+

**ExampleMurder on the Orient Express
A number of sleuths (the player among them) find themselves aboard the Orient Express, where a murder has taken place, and one of them is apparently the culprit. Naturally they do not agree on whom, but there is physical evidence which may change their minds...

@@ -5478,11 +5478,11 @@
- 242
+ 242 -

**ExampleWhat Not To Wear
+

**ExampleWhat Not To Wear
A general-purpose clothing system that handles a variety of different clothing items layered in different combinations over different areas of the body.

@@ -5500,11 +5500,11 @@
- 243
+ 243 -

***ExampleMathematical view of relations
+

***ExampleMathematical view of relations
Some notes on relations from a mathematical point of view, provided only to clarify some technicalities for those who are interested.

@@ -5522,11 +5522,11 @@
- 244
+ 244 -

***ExampleGraph-theory view of relations
+

***ExampleGraph-theory view of relations
Some notes on relations from the point of view of graph theory.

@@ -5547,11 +5547,11 @@
- 245
+ 245 -

**ExampleFun with Participles
+

**ExampleFun with Participles
Creating dynamic room descriptions that contain sentences such as "Clark is here, wasting time" or "Clark is here, looking around" depending on Clark's idle activity.

@@ -5569,11 +5569,11 @@
- 246
+ 246 -

**ExampleVariety
+

**ExampleVariety
Suppose we want all of our action responses to display some randomized variety. We could do this by laboriously rewriting all of the response texts, but this example demonstrates an alternative.

@@ -5591,11 +5591,11 @@
- 247
+ 247 -

**ExampleVariety 2
+

**ExampleVariety 2
This builds on the Variety example to add responses such as "You are now carrying the fedora" that describe relations that result from a given verb, as alternate responses.

@@ -5613,11 +5613,11 @@
- 248
+ 248 -

***ExampleNarrative Register
+

***ExampleNarrative Register
Suppose we want all of our action responses to vary depending on some alterable quality of the narrator, so that sometimes they're slangy, sometimes pompous or archaic.

@@ -5636,11 +5636,11 @@
- 249
+ 249 -

*ExampleOlfactory Settings
+

*ExampleOlfactory Settings
Some adaptive text for smelling the flowers, or indeed, anything else.

@@ -5659,11 +5659,11 @@
- 250
+ 250 -

**ExampleHistory Lab
+

**ExampleHistory Lab
We create phrases such as "the box we took" and "the newspaper Clark looked at" based on what has already happened in the story.

@@ -5681,11 +5681,11 @@
- 251
+ 251 -

**ExampleRelevant Relations
+

**ExampleRelevant Relations
An example of how to create room descriptions that acknowledge particular relations using their assigned verbs, rather than by the heavily special-cased code used by the standard library.

@@ -5704,11 +5704,11 @@
- 252
+ 252 -

*ExampleResponsive
+

*ExampleResponsive
Altering the standard inventory text for when the player is carrying nothing.

@@ -5729,11 +5729,11 @@
- 253
+ 253 -

***ExampleAlias
+

***ExampleAlias
A telephone with phone numbers of the standard American seven-digit length.

@@ -5752,11 +5752,11 @@
- 254
+ 254 -

*ExamplerBGH
+

*ExamplerBGH
The player character's height is selected randomly at the start of play.

@@ -5774,11 +5774,11 @@
- 255
+ 255 -

**ExampleLethal Concentration 1
+

**ExampleLethal Concentration 1
A poisonous gas that spreads from room to room, incapacitating or killing the player when it reaches sufficient levels.

@@ -5796,11 +5796,11 @@
- 256
+ 256 -

**ExampleWonderland
+

**ExampleWonderland
Hiking Mount Rainier, with attention to which locations are higher and which lower than the present location.

@@ -5818,11 +5818,11 @@
- 257
+ 257 -

***ExampleLethal Concentration 2
+

***ExampleLethal Concentration 2
Poisonous gas again, only this time it sinks.

@@ -5841,11 +5841,11 @@
- 258
+ 258 -

**ExampleDimensions
+

**ExampleDimensions
This example draws together the previous snippets into a working implementation of the weighbridge.

@@ -5863,11 +5863,11 @@
- 259
+ 259 -

***ExampleLead Cuts Paper
+

***ExampleLead Cuts Paper
To give every container a breaking strain, that is, a maximum weight of contents which it can bear - so that to put the lead pig into a paper bag invites disaster.

@@ -5886,11 +5886,11 @@
- 260
+ 260 -

***ExampleZqlran Era 8
+

***ExampleZqlran Era 8
Creating an alternative system of time for our game, using new units.

@@ -5909,11 +5909,11 @@
- 261
+ 261 -

***ExampleSnip
+

***ExampleSnip
A string which can be cut into arbitrary lengths, and then tied back together.

@@ -5932,11 +5932,11 @@
- 262
+ 262 -

***ExampleNickel and Dimed
+

***ExampleNickel and Dimed
A more intricate system of money, this time keeping track of the individual denominations of coins and bills, specifying what gets spent at each transaction, and calculating appropriate change.

@@ -5955,11 +5955,11 @@
- 263
+ 263 -

*ExampleWidget Enterprises
+

*ExampleWidget Enterprises
Allowing the player to set a price for a widget on sale, then determining the resulting sales based on consumer demand, and the resulting profit and loss.

@@ -5978,11 +5978,11 @@
- 264
+ 264 -

*ExampleFrozen Assets
+

*ExampleFrozen Assets
A treatment of money which keeps track of how much the player has on him, and a BUY command which lets him go shopping.

@@ -6000,11 +6000,11 @@
- 265
+ 265 -

**ExampleMoney for Nothing
+

**ExampleMoney for Nothing
An OFFER price FOR command, allowing the player to bargain with a flexible seller.

@@ -6022,11 +6022,11 @@
- 266
+ 266 -

***ExampleLemonade
+

***ExampleLemonade
Containers for liquid which keep track of how much liquid they are holding and of what kind, and allow quantities to be moved from one container to another.

@@ -6044,11 +6044,11 @@
- 267
+ 267 -

***ExampleSavannah
+

***ExampleSavannah
Using the liquid implementation demonstrated in Lemonade for putting out fires.

@@ -6067,11 +6067,11 @@
- 268
+ 268 -

*ExampleDepth
+

*ExampleDepth
Receptacles that calculate internal volume and the amount of room available, and cannot be overfilled.

@@ -6089,11 +6089,11 @@
- 269
+ 269 -

**ExampleFabrication
+

**ExampleFabrication
A system of assembling clothing from a pattern and materials; both the pattern and the different fabrics have associated prices.

@@ -6111,11 +6111,11 @@
- 270
+ 270 -

**ExampleThe Speed of Thought
+

**ExampleThe Speed of Thought
Describing scientifically-measured objects in units more familiar to the casual audience.

@@ -6136,11 +6136,11 @@
- 271
+ 271 -

***ExampleDubai
+

***ExampleDubai
An elevator which connects any of 27 floors in a luxury hotel.

@@ -6159,11 +6159,11 @@
- 272
+ 272 -

**ExamplePort Royal 4
+

**ExamplePort Royal 4
A cell window through which the player can see people who were in Port Royal in the current year of game-time.

@@ -6182,11 +6182,11 @@
- 273
+ 273 -

*ExampleIf It Hadn't Been For...
+

*ExampleIf It Hadn't Been For...
A sound recording device that records the noises made by player and non-player actions, then plays them back on demand.

@@ -6205,11 +6205,11 @@
- 274
+ 274 -

**ExampleOdyssey
+

**ExampleOdyssey
A person who follows a path predetermined and stored in a table, and who can be delayed if the player tries to interact with her.

@@ -6228,11 +6228,11 @@
- 275
+ 275 -

**ExampleJokers Wild
+

**ExampleJokers Wild
A deck of cards which can be shuffled and dealt from.

@@ -6251,11 +6251,11 @@
- 276
+ 276 -

***ExampleNoisy Cricket
+

***ExampleNoisy Cricket
Implementing liquids that can be mixed, and the components automatically recognized as matching one recipe or another.

@@ -6274,11 +6274,11 @@
- 277
+ 277 -

*ExampleMerlin
+

*ExampleMerlin
A REMEMBER command which accepts any text and looks up a response in a table of recollections.

@@ -6296,11 +6296,11 @@
- 278
+ 278 -

***ExampleQuestionable Revolutions
+

***ExampleQuestionable Revolutions
An expansion on the previous idea, only this time we store information and let characters answer depending on their expertise in a given area.

@@ -6318,11 +6318,11 @@
- 279
+ 279 -

***ExampleThe Queen of Sheba
+

***ExampleThe Queen of Sheba
Allowing the player to use question words, and using that information to modify the response given by the other character.

@@ -6341,11 +6341,11 @@
- 280
+ 280 -

***ExampleGoat-Cheese and Sage Chicken
+

***ExampleGoat-Cheese and Sage Chicken
Implementing a FULL SCORE command which lists more information than the regular SCORE command, adding times and rankings, as an extension of the example given in this chapter.

@@ -6364,11 +6364,11 @@
- 281
+ 281 -

**ExampleFarewell
+

**ExampleFarewell
People who respond to conversational gambits, summarize what they said before if asked again, and provide recap of conversation that is past.

@@ -6387,11 +6387,11 @@
- 282
+ 282 -

**ExampleSweeney
+

**ExampleSweeney
A conversation where each topic may have multiple questions and answers associated with it, and where a given exchange can lead to new additions to the list.

@@ -6409,11 +6409,11 @@
- 283
+ 283 -

***ExampleIntroduction to Juggling
+

***ExampleIntroduction to Juggling
Assortment of equipment defined with price and description, in a table.

@@ -6432,11 +6432,11 @@
- 284
+ 284 -

*ExampleFood Network Interactive
+

*ExampleFood Network Interactive
Using a menu system from an extension, but adding our own material to it for this game.

@@ -6455,11 +6455,11 @@
- 285
+ 285 -

**ExampleTrieste
+

**ExampleTrieste
Table amendment to adjust HELP commands provided for the player.

@@ -6480,11 +6480,11 @@
- 286
+ 286 -

*ExampleIndirection
+

*ExampleIndirection
Renaming the directions of the compass so that "white" corresponds to north, "red" to east, "yellow" to south, and "black" to west.

@@ -6502,11 +6502,11 @@
- 287
+ 287 -

*ExampleXYZZY
+

*ExampleXYZZY
Basics of adding a new command reviewed, for the case of the simple magic word XYZZY.

@@ -6524,11 +6524,11 @@
- 288
+ 288 -

**ExampleXylan
+

**ExampleXylan
Creating a new command that does require an object to be named; and some comments about the choice of vocabulary, in general.

@@ -6547,11 +6547,11 @@
- 289
+ 289 -

*ExampleAlpaca Farm
+

*ExampleAlpaca Farm
A generic USE action which behaves sensibly with a range of different objects.

@@ -6569,11 +6569,11 @@
- 290
+ 290 -

*ExampleAnchorite
+

*ExampleAnchorite
By default, Inform understands GET OFF, GET UP, or GET OUT when the player is sitting or standing on an enterable object. We might also want to add GET DOWN and DOWN as exit commands, though.

@@ -6591,11 +6591,11 @@
- 291
+ 291 -

****ExampleCloak of Darkness
+

****ExampleCloak of Darkness
Implementation of "Cloak of Darkness", a simple example game that for years has been used to demonstrate the features of IF languages.

@@ -6614,11 +6614,11 @@
- 292
+ 292 -

*ExampleThe Trouble with Printing
+

*ExampleThe Trouble with Printing
Making a READ command, distinct from EXAMINE, for legible objects.

@@ -6636,11 +6636,11 @@
- 293
+ 293 -

**ExampleLanista 2
+

**ExampleLanista 2
Randomized combat in which the damage done depends on what weapons the characters are wielding, and in which an ATTACK IT WITH action is created to replace regular attacking. Also folds a new DIAGNOSE command into the system.

@@ -6659,11 +6659,11 @@
- 294
+ 294 -

*ExampleShawn's Bad Day
+

*ExampleShawn's Bad Day
Allowing the player to EXAMINE ALL.

@@ -6681,11 +6681,11 @@
- 295
+ 295 -

***ExampleThe Left Hand of Autumn
+

***ExampleThe Left Hand of Autumn
The possibility of using a [things] token opens up some interesting complications, because we may want actions on multiple items to be reported differently from actions on just one. Here we look at how to make a multiple examination command that describes groups in special ways.

@@ -6704,11 +6704,11 @@
- 296
+ 296 -

*ExampleIsh.
+

*ExampleIsh.
A (very) simple HELP command, using tokens to accept and interpret the player's text whatever it might be.

@@ -6726,11 +6726,11 @@
- 297
+ 297 -

**ExampleNameless
+

**ExampleNameless
ASKing someone about an object rather than about a topic.

@@ -6749,11 +6749,11 @@
- 298
+ 298 -

*ExampleSafety
+

*ExampleSafety
A safe whose dial can be turned with SPIN SAFE TO 1131, and which will open only with the correct combination.

@@ -6771,11 +6771,11 @@
- 299
+ 299 -

*ExampleTom's Midnight Garden
+

*ExampleTom's Midnight Garden
A clock kind that can be set to any time using "the time understood"; may be turned on and off; and will advance itself only when running. Time on the face is also reported differently depending on whether the clock is analog or digital.

@@ -6793,11 +6793,11 @@
- 300
+ 300 -

**ExampleIbid.
+

**ExampleIbid.
A system which allows the author to assign footnotes to descriptions, and permits the player to retrieve them again by number, using "the number understood". Footnotes will automatically number themselves, according to the order in which the player discovers them.

@@ -6816,11 +6816,11 @@
- 301
+ 301 -

*ExampleOne of Those Mornings
+

*ExampleOne of Those Mornings
A FIND command that allows the player to find a lost object anywhere

@@ -6838,11 +6838,11 @@
- 302
+ 302 -

**ExampleActaeon
+

**ExampleActaeon
A FOLLOW command allowing the player to pursue a person who has just left the room.

@@ -6861,11 +6861,11 @@
- 303
+ 303 -

*ExamplePages
+

*ExamplePages
A book with pages that can be read by number (as in "read page 3 in...") and which accepts relative page references as well (such as "read the last page of...", "read the next page", and so on).

@@ -6883,11 +6883,11 @@
- 304
+ 304 -

**ExampleDown in Oodville
+

**ExampleDown in Oodville
Offering the player a choice of numbered options at certain times, without otherwise interfering with his ability to give regular commands.

@@ -6905,11 +6905,11 @@
- 305
+ 305 -

***ExampleStraw Into Gold
+

***ExampleStraw Into Gold
Creating a Rumpelstiltskin character who is always referred to as "dwarf", "guy", "dude", or "man" -- depending on which the player last used -- until the first time the player refers to him as "Rumpelstiltskin".

@@ -6928,11 +6928,11 @@
- 306
+ 306 -

*ExampleMisadventure
+

*ExampleMisadventure
A going by name command which does respect movement rules, and accepts names of rooms as commands.

@@ -6950,11 +6950,11 @@
- 307
+ 307 -

**ExampleSafari Guide
+

**ExampleSafari Guide
The same functionality, but making the player continue to move until he reaches his destination or a barrier, handling all openable doors on the way.

@@ -6973,11 +6973,11 @@
- 308
+ 308 -

*ExamplePalette
+

*ExamplePalette
An artist's workshop in which the canvas can be painted in any colour, and where painterly names for pigments ("cerulean") are accepted alongside everyday ones ("blue").

@@ -6995,11 +6995,11 @@
- 309
+ 309 -

***ExampleBaritone, Bass
+

***ExampleBaritone, Bass
Letting the player pick a gender (or perhaps other characteristics) before starting play.

@@ -7018,11 +7018,11 @@
- 310
+ 310 -

*ExampleLies
+

*ExampleLies
Commands to allow the player to lie down in three different ways.

@@ -7041,11 +7041,11 @@
- 311
+ 311 -

*ExampleAspect
+

*ExampleAspect
Understanding aspect ratios (a unit) in the names of televisions.

@@ -7063,11 +7063,11 @@
- 312
+ 312 -

*ExampleHymenaeus
+

*ExampleHymenaeus
Understanding "flaming torch" and "extinguished torch" to refer to torches when lit and unlit.

@@ -7085,11 +7085,11 @@
- 313
+ 313 -

**ExampleChannel 1
+

**ExampleChannel 1
Understanding channels (a number) in the names of televisions.

@@ -7107,11 +7107,11 @@
- 314
+ 314 -

**ExampleTerracottissima
+

**ExampleTerracottissima
The flowerpots once again, but this time arranged so that after the first breakage all undamaged pots are said to be "unbroken", to distinguish them from the others.

@@ -7129,11 +7129,11 @@
- 315
+ 315 -

**ExamplePeers
+

**ExamplePeers
The peers of the English realm come in six flavours - Baron, Viscount, Earl, Marquess, Duke and Prince - and must always be addressed properly. While a peerage is for life, it may at the royal pleasure be promoted.

@@ -7151,11 +7151,11 @@
- 316
+ 316 -

***ExampleChannel 2
+

***ExampleChannel 2
Understanding channels (a number) in the names of televisions, with more sophisticated parsing of the change channel action.

@@ -7173,11 +7173,11 @@
- 317
+ 317 -

***ExampleTerracottissima Maxima
+

***ExampleTerracottissima Maxima
Flowerpots with textual names that might change during play.

@@ -7195,11 +7195,11 @@
- 318
+ 318 -

***ExampleTilt 1
+

***ExampleTilt 1
A deck of cards with fully implemented individual cards, which can be separately drawn and discarded, and referred to by name.

@@ -7218,11 +7218,11 @@
- 319
+ 319 -

*ExampleCinco
+

*ExampleCinco
A taco shell that can be referred to (when it contains things) in terms of its contents.

@@ -7240,11 +7240,11 @@
- 320
+ 320 -

*ExamplePuncak Jaya
+

*ExamplePuncak Jaya
When a character is not visible, responding to such commands as EXAMINE PETER and PETER, HELLO with a short note that the person in question is no longer visible.

@@ -7262,11 +7262,11 @@
- 321
+ 321 -

*ExampleWhither?
+

*ExampleWhither?
A door whose description says where it leads; and which automatically understands references such as "the west door" and "the east door" depending on which direction it leads from the location.

@@ -7284,11 +7284,11 @@
- 322
+ 322 -

**ExampleClaims Adjustment
+

**ExampleClaims Adjustment
An instant camera that spits out photographs of anything the player chooses to take a picture of.

@@ -7307,11 +7307,11 @@
- 323
+ 323 -

*ExampleQuiz Show
+

*ExampleQuiz Show
In this example by Mike Tarbert, the player can occasionally be quizzed on random data from a table; the potential answers will only be understood if a question has just been asked.

@@ -7329,11 +7329,11 @@
- 324
+ 324 -

**ExampleBibliophilia
+

**ExampleBibliophilia
A bookshelf with a number of books, where the player's command to examine something will be interpreted as an attempt to look up titles if the bookshelf is present, but otherwise given the usual response.

@@ -7352,11 +7352,11 @@
- 325
+ 325 -

*ExamplePot of Petunias
+

*ExamplePot of Petunias
Responding sensibly to a pot of petunias falling from the sky.

@@ -7375,11 +7375,11 @@
- 326
+ 326 -

*ExampleMasochism Deli
+

*ExampleMasochism Deli
Multiple potatoes, with rules to make the player drop the hot potato first and pick it up last.

@@ -7398,11 +7398,11 @@
- 327
+ 327 -

**ExampleThe Best Till Last
+

**ExampleThe Best Till Last
Reordering multiple objects for dramatic effect.

@@ -7420,11 +7420,11 @@
- 328
+ 328 -

**ExampleWestern Art History 305
+

**ExampleWestern Art History 305
Allowing EXAMINE to see multiple objects with a single command.

@@ -7443,11 +7443,11 @@
- 329
+ 329 -

*ExampleQuery
+

*ExampleQuery
Catching all questions that begin with WHO, WHAT, WHERE, and similar question words, and responding with the instruction to use commands, instead.

@@ -7465,11 +7465,11 @@
- 330
+ 330 -

*ExampleThe Gorge at George
+

*ExampleThe Gorge at George
If the player tries to TALK TO a character, suggest alternative modes of conversation.

@@ -7487,11 +7487,11 @@
- 331
+ 331 -

***ExampleHot Glass Looks Like Cold Glass
+

***ExampleHot Glass Looks Like Cold Glass
Responding to references to a property that the player isn't yet allowed to mention (or when not to use "understand as a mistake").

@@ -7510,11 +7510,11 @@
- 332
+ 332 -

*ExampleSome Assembly Required
+

*ExampleSome Assembly Required
Building different styles of shirt from component sleeves and collars.

@@ -7532,11 +7532,11 @@
- 333
+ 333 -

***ExampleLakeside Living
+

***ExampleLakeside Living
Similar to "Lemonade", but with bodies of liquid that can never be depleted, and some adjustments to the "fill" command so that it will automatically attempt to fill from a large liquid source if possible.

@@ -7557,11 +7557,11 @@
- 334
+ 334 -

*ExampleAnt-Sensitive Sunglasses
+

*ExampleAnt-Sensitive Sunglasses
What are activities good for? Controlling output when we want the same action to be able to produce very flexible text depending on the state of the world -- in this case, making highly variable room description and object description text.

@@ -7580,11 +7580,11 @@
- 335
+ 335 -

**ExampleAARP-Gnosis
+

**ExampleAARP-Gnosis
An Encyclopedia set which treats volumes in the same place as a single object, but can also be split up.

@@ -7602,11 +7602,11 @@
- 336
+ 336 -

***ExampleAftershock
+

***ExampleAftershock
Modifying the rules for examining a device so that all devices have some specific behavior when switched on, which is described at various times.

@@ -7624,11 +7624,11 @@
- 337
+ 337 -

***ExampleCrusoe
+

***ExampleCrusoe
Adding a "printing the description of something" activity.

@@ -7647,11 +7647,11 @@
- 338
+ 338 -

*ExampleHays Code
+

*ExampleHays Code
Clark Gable in a pin-striped suit and a pink thong.

@@ -7670,11 +7670,11 @@
- 339
+ 339 -

*ExampleShipping Trunk
+

*ExampleShipping Trunk
A box of baking soda whose name changes to "completely ineffective baking soda" when it is in a container with something that smells funny.

@@ -7692,11 +7692,11 @@
- 340
+ 340 -

**ExampleTrachypachidae Maturin 1803
+

**ExampleTrachypachidae Maturin 1803
Bottles with removable stoppers: when the stopper is in the bottle, the bottle is functionally closed, but the stopper can also be removed and used elsewhere. Descriptions of the bottle reflect its state intelligently.

@@ -7714,11 +7714,11 @@
- 341
+ 341 -

****ExampleChronic Hinting Syndrome
+

****ExampleChronic Hinting Syndrome
Using name-printing rules to keep track of whether the player knows about objects, and also to highlight things he might want to follow up.

@@ -7737,11 +7737,11 @@
- 342
+ 342 -

**ExampleHudsucker Industries
+

**ExampleHudsucker Industries
Letters which are described differently as a group, depending on whether the player has read none, some, or all of them, and on whether they are alike or unlike.

@@ -7760,11 +7760,11 @@
- 343
+ 343 -

*ExampleProlegomena
+

*ExampleProlegomena
Replacing precise numbers with "some" or other quantifiers when too many objects are clustered together for the player to count at a glance.

@@ -7783,11 +7783,11 @@
- 344
+ 344 -

*ExampleUnpeeled
+

*ExampleUnpeeled
Calling an onion "a single yellow onion" when (and only when) it is being listed as the sole content of a room or container.

@@ -7806,11 +7806,11 @@
- 345
+ 345 -

*ExampleWesponses
+

*ExampleWesponses
Parser messages that are delivered with a speech impediment.

@@ -7829,11 +7829,11 @@
- 346
+ 346 -

*ExampleRules of Attraction
+

*ExampleRules of Attraction
A magnet which picks up nearby metal objects, and describes itself appropriately in room descriptions and inventory listings, but otherwise goes by its ordinary name.

@@ -7852,11 +7852,11 @@
- 347
+ 347 -

***ExampleZorn of Zorna
+

***ExampleZorn of Zorna
Light levels vary depending on the number of candles the player has lit, and this determines whether or not he is able to examine detailed objects successfully.

@@ -7875,11 +7875,11 @@
- 348
+ 348 -

**ExampleHohmann Transfer
+

**ExampleHohmann Transfer
Changing the way dark rooms are described to avoid the standard Inform phrasing.

@@ -7897,11 +7897,11 @@
- 349
+ 349 -

***ExampleFour Stars 1
+

***ExampleFour Stars 1
An elaboration of the idea that when light is absent, the player should be given a description of what he can smell and hear, instead.

@@ -7920,11 +7920,11 @@
- 350
+ 350 -

*ExampleWays Out
+

*ExampleWays Out
A status line that lists the available exits from the current location.

@@ -7942,11 +7942,11 @@
- 351
+ 351 -

**ExampleGuided Tour
+

**ExampleGuided Tour
A status line that lists the available exits from the current location, changing the names of these exits depending on whether the room has been visited or not.

@@ -7965,11 +7965,11 @@
- 352
+ 352 -

*ExampleReflections
+

*ExampleReflections
Emphasizing the reflective quality of shiny objects whenever they are described in the presence of the torch.

@@ -7987,11 +7987,11 @@
- 353
+ 353 -

**ExampleEmma
+

**ExampleEmma
Social dynamics in which groups of people form and circulate during a party.

@@ -8009,11 +8009,11 @@
- 354
+ 354 -

****ExampleAir Conditioning is Standard
+

****ExampleAir Conditioning is Standard
Uses "writing a paragraph about" to make person and object descriptions that vary considerably depending on what else is going on in the room, including some randomized NPC interactions with objects or with each other.

@@ -8032,11 +8032,11 @@
- 355
+ 355 -

*ExampleRip Van Winkle
+

*ExampleRip Van Winkle
A simple way to allow objects in certain places to be described in the room description body text rather than in paragraphs following the room description.

@@ -8054,11 +8054,11 @@
- 356
+ 356 -

**ExampleHappy Hour
+

**ExampleHappy Hour
Listing visible characters as a group, then giving some followup details in the same paragraph about specific ones.

@@ -8076,11 +8076,11 @@
- 357
+ 357 -

**ExampleThe Eye of the Idol
+

**ExampleThe Eye of the Idol
A systematic way to allow objects in certain places to be described in the room description body text rather than in paragraphs following the room description, and to control whether supporters list their contents or not.

@@ -8099,11 +8099,11 @@
- 358
+ 358 -

*ExamplePriority Lab
+

*ExamplePriority Lab
A debugging rule useful for checking the priorities of objects about to be listed.

@@ -8122,11 +8122,11 @@
- 359
+ 359 -

*ExampleLow Light
+

*ExampleLow Light
An object that is only visible and manipulable when a bright light fixture is on.

@@ -8144,11 +8144,11 @@
- 360
+ 360 -

***ExampleCasino Banale
+

***ExampleCasino Banale
Creating room descriptions and object descriptions that change as the player learns new facts and pieces things together.

@@ -8167,11 +8167,11 @@
- 361
+ 361 -

*ExampleKiwi
+

*ExampleKiwi
Creating a raised supporter kind whose contents the player can't see or take from the ground.

@@ -8189,11 +8189,11 @@
- 362
+ 362 -

***ExampleCopper River
+

***ExampleCopper River
Manipulating room descriptions so that only interesting items are mentioned, while objects that are present but not currently useful to the player are ignored.

@@ -8212,11 +8212,11 @@
- 363
+ 363 -

*ExamplePeeled
+

*ExamplePeeled
Two different approaches to adjusting what the player can interact with, compared.

@@ -8234,11 +8234,11 @@
- 364
+ 364 -

*ExampleFour Stars 2
+

*ExampleFour Stars 2
Using "deciding the scope" to change the content of lists such as "the list of audible things which can be touched by the player".

@@ -8256,11 +8256,11 @@
- 365
+ 365 -

**ExampleGinger Beer
+

**ExampleGinger Beer
A portable magic telescope which allows the player to view items in another room of his choice.

@@ -8278,11 +8278,11 @@
- 366
+ 366 -

**ExampleRock Garden
+

**ExampleRock Garden
A simple open landscape where the player can see between rooms and will automatically move to touch things in distant rooms.

@@ -8300,11 +8300,11 @@
- 367
+ 367 -

***ExampleStately Gardens
+

***ExampleStately Gardens
An open landscape where the player can see landmarks in nearby areas, with somewhat more complex room descriptions than the previous example, and in which we also account for size differences between things seen at a distance.

@@ -8323,11 +8323,11 @@
- 368
+ 368 -

*ExampleApples
+

*ExampleApples
Prompting the player on how to disambiguate otherwise similar objects.

@@ -8345,11 +8345,11 @@
- 369
+ 369 -

*ExampleOriginals
+

*ExampleOriginals
Allowing the player to create models of anything in the game world; parsing the name "model [thing]" or even just "[thing]" to refer to these newly-created models; asking "which do you mean, the model [thing] or the actual [thing]" when there is ambiguity.

@@ -8367,11 +8367,11 @@
- 370
+ 370 -

***ExampleWalls and Noses
+

***ExampleWalls and Noses
Responding to "EXAMINE WALL" with "In which direction?", and to "EXAMINE NOSE" with "Whose nose do you mean, Frederica's, Betty's, Wilma's or your own?"

@@ -8390,11 +8390,11 @@
- 371
+ 371 -

*ExampleLatin Lessons
+

*ExampleLatin Lessons
Supplying missing nouns and second nouns for other characters besides the player.

@@ -8412,11 +8412,11 @@
- 372
+ 372 -

*ExampleMinimal Movement
+

*ExampleMinimal Movement
Supplying a default direction for "go", so that "leave", "go", etc., are always interpreted as "out".

@@ -8435,11 +8435,11 @@
- 373
+ 373 -

**ExampleCloves
+

**ExampleCloves
Accepting adverbs anywhere in a command, registering what the player typed but then cutting them out before interpreting the command.

@@ -8457,11 +8457,11 @@
- 374
+ 374 -

**ExampleFragment of a Greek Tragedy
+

**ExampleFragment of a Greek Tragedy
Responding to the player's input based on keywords only, and overriding the original parser entirely.

@@ -8479,11 +8479,11 @@
- 375
+ 375 -

**ExampleNorth by Northwest
+

**ExampleNorth by Northwest
Creating additional compass directions between those that already exist (for instance, NNW) -- and dealing with an awkwardness that arises when the player tries to type "north-northwest". The example demonstrates a way around the nine-character limit on parsed words.

@@ -8501,11 +8501,11 @@
- 376
+ 376 -

***ExampleComplimentary Peanuts
+

***ExampleComplimentary Peanuts
A character who responds to keywords in the player's instructions and remarks, even if there are other words included.

@@ -8524,11 +8524,11 @@
- 377
+ 377 -

*ExampleThe Big Sainsbury's
+

*ExampleThe Big Sainsbury's
Making implicit takes add a minute to the clock, just as though the player had typed TAKE THING explicitly.

@@ -8546,11 +8546,11 @@
- 378
+ 378 -

*ExamplePizza Prince
+

*ExamplePizza Prince
Providing a pizza buffet from which the player can take as many pieces as he wants.

@@ -8568,11 +8568,11 @@
- 379
+ 379 -

***ExampleLollipop Guild
+

***ExampleLollipop Guild
Overriding the rules to allow the player to show something to another character without first taking it.

@@ -8591,11 +8591,11 @@
- 380
+ 380 -

*ExampleWXPQ
+

*ExampleWXPQ
Creating a more sensible parser error than "that noun did not make sense in this context".

@@ -8613,11 +8613,11 @@
- 381
+ 381 -

***ExampleXot
+

***ExampleXot
Storing an invalid command to be repeated as text later in the game.

@@ -8636,11 +8636,11 @@
- 382
+ 382 -

*ExampleBikini Atoll
+

*ExampleBikini Atoll
Delaying the banner for later.

@@ -8659,11 +8659,11 @@
- 383
+ 383 -

*ExampleBattle of Ridgefield
+

*ExampleBattle of Ridgefield
Completely replacing the endgame text and stopping the game without giving the player a chance to restart or restore.

@@ -8681,11 +8681,11 @@
- 384
+ 384 -

*ExampleFinality
+

*ExampleFinality
Not mentioning UNDO in the final set of options.

@@ -8703,11 +8703,11 @@
- 385
+ 385 -

*ExampleJamaica 1688
+

*ExampleJamaica 1688
Adding a feature to the final question after victory, so that the player can choose to reveal notes about items in the game.

@@ -8726,11 +8726,11 @@
- 386
+ 386 -

**ExampleXerxes
+

**ExampleXerxes
Offering the player a menu of things to read after winning the game.

@@ -8749,11 +8749,11 @@
- 387
+ 387 -

*ExampleBlankness
+

*ExampleBlankness
Emptying the status line during the first screen of the game.

@@ -8774,11 +8774,11 @@
- 388
+ 388 -

*ExampleNine AM Appointment
+

*ExampleNine AM Appointment
A WAIT [number] MINUTES command which advances through an arbitrary number of turns.

@@ -8796,11 +8796,11 @@
- 389
+ 389 -

**ExampleDelayed Gratification
+

**ExampleDelayed Gratification
A WAIT UNTIL [time] command which advances until the game clock reaches the correct hour.

@@ -8819,11 +8819,11 @@
- 390
+ 390 -

*ExampleThe Crane's Leg 2
+

*ExampleThe Crane's Leg 2
A description text generated based on the propensities of the player-character, following different rulebooks for different characters.

@@ -8841,11 +8841,11 @@
- 391
+ 391 -

*ExampleStone
+

*ExampleStone
A soup to which the player can add ingredients, which will have different effects when the player eats.

@@ -8863,11 +8863,11 @@
- 392
+ 392 -

**ExampleBribery
+

**ExampleBribery
A GIVE command that gets rid of Inform's default refusal message in favor of something a bit more sophisticated.

@@ -8886,11 +8886,11 @@
- 393
+ 393 -

*ExampleSaint Eligius
+

*ExampleSaint Eligius
Adding a first look rule that comments on locations when we visit them for the first time, inserting text after objects are listed but before any "every turn" rules might occur.

@@ -8908,11 +8908,11 @@
- 394
+ 394 -

*ExampleUptempo
+

*ExampleUptempo
Adjust time advancement so the game clock moves fifteen minutes each turn.

@@ -8930,11 +8930,11 @@
- 395
+ 395 -

*ExampleVerbosity 2
+

*ExampleVerbosity 2
Making rooms give full descriptions each time we enter, even if we have visited before, and disallowing player use of BRIEF and SUPERBRIEF.

@@ -8952,11 +8952,11 @@
- 396
+ 396 -

**ExampleSlouching
+

**ExampleSlouching
A system of postures allowing the player and other characters to sit, stand, or lie down explicitly or implicitly on a variety of enterable supporters or containers, or in location.

@@ -8974,11 +8974,11 @@
- 397
+ 397 -

**ExampleSwigmore U.
+

**ExampleSwigmore U.
Adding a new kind of supporter called a perch, where everything dropped lands on the floor.

@@ -8997,11 +8997,11 @@
- 398
+ 398 -

*ExampleAccess All Areas
+

*ExampleAccess All Areas
The Pointy Hat of Liminal Transgression allows its wearer to walk clean through closed doors.

@@ -9020,11 +9020,11 @@
- 399
+ 399 -

**ExampleSolitude
+

**ExampleSolitude
Novice mode that prefaces every prompt with a list of possible commands the player could try, and highlights every important word used, to alert players to interactive items in the scenery.

@@ -9042,11 +9042,11 @@
- 400
+ 400 -

***ExampleIn Fire or in Flood
+

***ExampleIn Fire or in Flood
A BURN command; flammable objects which light other items in their vicinity and can burn for different periods of time; the possibility of having parts or contents of a flaming item which survive being burnt.

@@ -9064,11 +9064,11 @@
- 401
+ 401 -

****ExamplePatient Zero
+

****ExamplePatient Zero
People who wander around the map performing various errands, and in the process spread a disease which only the player can eradicate.

@@ -9087,11 +9087,11 @@
- 402
+ 402 -

*ExampleFlotation
+

*ExampleFlotation
Objects that can sink or float in a well, depending on their own properties and the state of the surrounding environment.

@@ -9110,11 +9110,11 @@
- 403
+ 403 -

**ExampleKyoto
+

**ExampleKyoto
Expanding the effects of the THROW something AT something command so that objects do make contact with one another.

@@ -9133,11 +9133,11 @@
- 404
+ 404 -

*ExampleBeing Peter
+

*ExampleBeing Peter
A set of rules determining the attitude a character will take when asked about certain topics.

@@ -9156,11 +9156,11 @@
- 405
+ 405 -

*ExampleFeline Behavior
+

*ExampleFeline Behavior
A cat which reacts to whatever items it has handy, returning the result of a rulebook for further processing.

@@ -9178,11 +9178,11 @@
- 406
+ 406 -

***ExampleTilt 2
+

***ExampleTilt 2
A deck of cards with fully implemented individual cards; when the player has a full poker hand, the inventory listing describes the resulting hand accordingly.

@@ -9201,11 +9201,11 @@
- 407
+ 407 -

*ExampleElectrified
+

*ExampleElectrified
Adding a rule before the basic accessibility rule that will prevent the player from touching electrified objects under the wrong circumstances.

@@ -9223,11 +9223,11 @@
- 408
+ 408 -

*ExampleTimeless
+

*ExampleTimeless
A set of actions which do not take any game time at all.

@@ -9245,11 +9245,11 @@
- 409
+ 409 -

**ExampleEndurance
+

**ExampleEndurance
Giving different actions a range of durations using a time allotment rulebook.

@@ -9267,11 +9267,11 @@
- 410
+ 410 -

**ExampleEscape from the Seraglio
+

**ExampleEscape from the Seraglio
Replacing the usual response to TAKE ALL so that instead of output such as "grapes: Taken. orange: Taken.", Inform produces variable responses in place of "grapes:".

@@ -9292,11 +9292,11 @@
- 411
+ 411 -

*ExampleCapital City
+

*ExampleCapital City
To arrange that the location information normally given on the left-hand side of the status line appears in block capitals.

@@ -9314,11 +9314,11 @@
- 412
+ 412 -

*ExampleRocket Man
+

*ExampleRocket Man
Using case changes on any text produced by a "to say..." phrase.

@@ -9337,11 +9337,11 @@
- 413
+ 413 -

*ExampleAlpha
+

*ExampleAlpha
Creating a beta-testing command that matches any line starting with punctuation.

@@ -9359,11 +9359,11 @@
- 414
+ 414 -

*ExampleAbout Inform's regular expression support
+

*ExampleAbout Inform's regular expression support
Some footnotes on Inform's regular expressions, and how they compare to those of other programming languages.

@@ -9382,11 +9382,11 @@
- 415
+ 415 -

*ExampleIdentity Theft
+

*ExampleIdentity Theft
Allowing the player to enter a name to be used for the player character during the game.

@@ -9404,11 +9404,11 @@
- 416
+ 416 -

*ExampleMirror, Mirror
+

*ExampleMirror, Mirror
The sorcerer's mirror can, when held up high, form an impression of its surroundings which it then preserves.

@@ -9426,11 +9426,11 @@
- 417
+ 417 -

**ExampleThe Cow Exonerated
+

**ExampleThe Cow Exonerated
Creating a class of matches that burn for a time and then go out, with elegant reporting when several matches go out at once.

@@ -9449,11 +9449,11 @@
- 418
+ 418 -

*ExampleBlackout
+

*ExampleBlackout
Filtering the names of rooms printed while in darkness.

@@ -9471,11 +9471,11 @@
- 419
+ 419 -

*ExampleFido
+

*ExampleFido
A dog the player can name and un-name at will.

@@ -9493,11 +9493,11 @@
- 420
+ 420 -

*ExampleIgpay Atinlay
+

*ExampleIgpay Atinlay
A pig Latin filter for the player's commands.

@@ -9515,11 +9515,11 @@
- 421
+ 421 -

**ExampleMr. Burns' Repast
+

**ExampleMr. Burns' Repast
Letting the player guess types for an unidentifiable fish.

@@ -9537,11 +9537,11 @@
- 422
+ 422 -

**ExampleNorthstar
+

**ExampleNorthstar
Making Inform understand ASK JOSH TO TAKE INVENTORY as JOSH, TAKE INVENTORY. This requires us to use a regular expression on the player's command, replacing some of the content.

@@ -9559,11 +9559,11 @@
- 423
+ 423 -

***ExampleCave-troll
+

***ExampleCave-troll
Determining that the command the player typed is invalid, editing it, and re-examining it to see whether it now reads correctly.

@@ -9584,11 +9584,11 @@
- 424
+ 424 -

*ExampleOyster Wide Shut
+

*ExampleOyster Wide Shut
Replacing Inform's default printing of properties such as "(closed)", "(open and providing light)", etc., with our own, more flexible variation.

@@ -9607,11 +9607,11 @@
- 425
+ 425 -

*ExampleRobo 1
+

*ExampleRobo 1
A robot which watches and records the player's actions, then tries to repeat them back in the same order when he is switched into play-back mode.

@@ -9630,11 +9630,11 @@
- 426
+ 426 -

*ExampleWhat Makes You Tick
+

*ExampleWhat Makes You Tick
Building a fishing pole from several component parts that the player might put together in any order.

@@ -9652,11 +9652,11 @@
- 427
+ 427 -

**ExampleFormicidae
+

**ExampleFormicidae
Manipulating the order in which items are handled after TAKE ALL.

@@ -9675,11 +9675,11 @@
- 428
+ 428 -

***ExampleRobo 2
+

***ExampleRobo 2
A robot which watches and records the player's actions, then tries to repeat them back in the same order when he is switched into play-back mode.

@@ -9698,11 +9698,11 @@
- 429
+ 429 -

*ExampleLeopard-skin
+

*ExampleLeopard-skin
A maze that the player can escape if he performs an exact sequence of actions.

@@ -9720,11 +9720,11 @@
- 430
+ 430 -

**ExampleThe Facts Were These
+

**ExampleThe Facts Were These
Creating a variant GIVE action that lets the player give multiple objects simultaneously with commands like GIVE ALL TO ATTENDANT or GIVE THREE DOLLARS TO ATTENDANT or GIVE PIE AND HAT TO ATTENDANT. The attendant accepts the gifts only if their total combined value matches some minimum amount.

@@ -9743,11 +9743,11 @@
- 431
+ 431 -

*ExampleCircle of Misery
+

*ExampleCircle of Misery
Retrieving items from an airport luggage carousel is such fun, how can we resist simulating it, using a list as a ring buffer?

@@ -9765,11 +9765,11 @@
- 432
+ 432 -

*ExampleEyes, Fingers, Toes
+

*ExampleEyes, Fingers, Toes
A safe with a multi-number combination, meant to be dialed over multiple turns, is implemented using a log of the last three numbers dialed. The log can then be compared to the safe's correct combination.

@@ -9787,11 +9787,11 @@
- 433
+ 433 -

*ExampleThe Fibonacci Sequence
+

*ExampleThe Fibonacci Sequence
The modest Leonardo Fibonacci of Pisa will be only too happy to construct his sequence on request, using an array.

@@ -9809,11 +9809,11 @@
- 434
+ 434 -

*ExampleI Didn't Come All The Way From Great Portland Street
+

*ExampleI Didn't Come All The Way From Great Portland Street
In this fiendishly difficult puzzle, which may perhaps owe some inspiration to a certain BBC Radio panel game (1967-), a list is used as a set of actions to help enforce the rule that the player must keep going for ten turns without hesitation, repetition, or deviating from the subject on the card.

@@ -9831,11 +9831,11 @@
- 435
+ 435 -

*ExampleLugubrious Pete's Delicatessen
+

*ExampleLugubrious Pete's Delicatessen
In this evocation of supermarket deli counter life, a list is used as a queue to keep track of who is waiting to be served.

@@ -9853,11 +9853,11 @@
- 436
+ 436 -

*ExampleSieve of Eratosthenes
+

*ExampleSieve of Eratosthenes
The haughty Eratosthenes of Cyrene will nevertheless consent to sieve prime numbers on request.

@@ -9875,11 +9875,11 @@
- 437
+ 437 -

*ExampleYour Mother Doesn't Work Here
+

*ExampleYour Mother Doesn't Work Here
Your hard-working mother uses a list as a stack: urgent tasks are added to the end of the list, interrupting longer-term plans.

@@ -9900,11 +9900,11 @@
- 438
+ 438 -

*ExampleCurare
+

*ExampleCurare
A phrase that chooses and names the least-recently selected item from the collection given, allowing the text to cycle semi-randomly through a group of objects.

@@ -9925,11 +9925,11 @@
- 439
+ 439 -

*ExampleAlien Invasion Part 23
+

*ExampleAlien Invasion Part 23
Keeping a preference file that could be loaded by any game in a series.

@@ -9947,11 +9947,11 @@
- 440
+ 440 -

**ExampleLabyrinth of Ghosts
+

**ExampleLabyrinth of Ghosts
Remembering the fates of all previous explorers of the labyrinth.

@@ -9969,11 +9969,11 @@
- 441
+ 441 -

***ExampleRubies
+

***ExampleRubies
A scoreboard that keeps track of the ten highest-scoring players from one playthrough to the next, adding the player's name if he has done well enough.

@@ -9992,11 +9992,11 @@
- 442
+ 442 -

*ExampleThe Fourth Body
+

*ExampleThe Fourth Body
Notebooks in which the player can record assorted notes throughout play.

@@ -10014,11 +10014,11 @@
- 443
+ 443 -

**ExampleThe Fifth Body
+

**ExampleThe Fifth Body
An expansion on the notebook, allowing the player somewhat more room in which to type his recorded remark.

@@ -10037,11 +10037,11 @@
- 444
+ 444 -

***ExampleFlathead News Network
+

***ExampleFlathead News Network
Using external files, together with a simple Unix script running in the background, to provide live news headlines inside a story file.

@@ -10062,11 +10062,11 @@
- 445
+ 445 -

*ExampleBaedeker
+

*ExampleBaedeker
Creating a floorplan of the cathedral using the locations from previous examples.

@@ -10084,11 +10084,11 @@
- 446
+ 446 -

*ExamplePort Royal 5
+

*ExamplePort Royal 5
Port Royal scenario given instructions for an EPS map.

@@ -10106,11 +10106,11 @@
- 447
+ 447 -

*ExampleBay Leaves and Honey Wine
+

*ExampleBay Leaves and Honey Wine
Creating a map of Greece using the locations from previous examples.

@@ -10131,11 +10131,11 @@
- 448
+ 448 -

**ExampleModern Conveniences
+

**ExampleModern Conveniences
Exemplifying the kind of source we might use in writing extensions for kitchen and bathroom appliances.

@@ -10154,11 +10154,11 @@
- 449
+ 449 -

**ExampleTilt 3
+

**ExampleTilt 3
Displaying the card suits from our deck of cards with red and black colored unicode symbols.

@@ -10177,11 +10177,11 @@
- 450
+ 450 -

***ExamplePink or Blue
+

***ExamplePink or Blue
Asking the player to select a gender to begin play.

@@ -10200,11 +10200,11 @@
- 451
+ 451 -

*ExampleStatus line with centered text, the hard way
+

*ExampleStatus line with centered text, the hard way
A status line which has only the name of the location, centered.

@@ -10223,11 +10223,11 @@
- 452
+ 452 -

*ExampleChanel Version 1
+

*ExampleChanel Version 1
Making paired italic and boldface tags like those used by HTML for web pages.

@@ -10246,11 +10246,11 @@
- 453
+ 453 -

*ExampleBlink
+

*ExampleBlink
Making a "by atmosphere" token, allowing us to design our own text variations such as "[one of]normal[or]gloomy[or]scary[by atmosphere]".

@@ -10268,11 +10268,11 @@
- 454
+ 454 -

**ExampleUncommon Ground
+

**ExampleUncommon Ground
Making a "by viewpoint" token, allowing us to design our own text variations such as "[show to yourself]quaint[to Lolita]thrilling[to everyone else]squalid[end show]" depending on the identity of the player at the moment.

diff --git a/inform/StagingArea/Contents/Resources/en.lproj/doc1.html b/inform/StagingArea/Contents/Resources/en.lproj/doc1.html index b311d8c6..6dee098e 100644 --- a/inform/StagingArea/Contents/Resources/en.lproj/doc1.html +++ b/inform/StagingArea/Contents/Resources/en.lproj/doc1.html @@ -89,13 +89,13 @@

Writing with Inform is one of two interlinked books included with Inform: a concise but complete guide to the system. The other book is The Inform Recipe Book, a comprehensive collection of examples, showing its practical use. If you are reading this within the Inform application, you will see that the Writing with Inform pages are on "white paper", while the Recipe Book is on "yellow paper".

These notes are arranged so that the reader can, in principle, write whole works of fiction as early as the end of Chapter 3. Each subsequent chapter then extends the range of techniques available to make livelier and more intriguing situations.

-

This new release of Inform ("Inform 7", the seventh major version since 1993) is a radical departure from most previous approaches to interactive fiction. In particular, it is very different from Inform 6, which newcomers will not need to know anything about. Inform 6 sits inside Inform 7, and is part of the inner workings, but is not visible from the outside. For information about Inform 6, see www.inform-fiction.org.

+

Today's Inform language (sometimes called "Inform 7") is very different from its 20th-century predecessor, which was called Inform 6. A few advanced sections of this book show how unusual effects can be achieved by mixing low-level coding in Inform 6 notation with more usual Inform text. However, most users will never need this. For information about Inform 6, see www.inform-fiction.org.

+

This book is also a guide to the Inform language, rather than a manual on how to use its supporting tools. Those tools, when used at the command line rather than inside the Inform app, have numerous features not covered here. Manuals for them are all available online: see github.com/ganelson/inform.

Programming is best regarded as the process of creating works of literature, which are meant to be read... so we ought to address them to people, not to machines. (Donald Knuth, "Literate Programming", 1981)

-

* See Acknowledgements for a chance to try out the cross-referencing links in Writing with Inform - click on the red asterisk or the name of the destination to go there


diff --git a/inform/StagingArea/Contents/Resources/en.lproj/doc10.html b/inform/StagingArea/Contents/Resources/en.lproj/doc10.html index 1ca6a0fb..9ddfd65a 100644 --- a/inform/StagingArea/Contents/Resources/en.lproj/doc10.html +++ b/inform/StagingArea/Contents/Resources/en.lproj/doc10.html @@ -4,7 +4,7 @@ - 2.1. Creating the world + 2.3. Punctuation - - - + + + +
@@ -79,22 +80,84 @@
-

§2.1. Creating the world

-

Designing an interactive fiction can be divided into two related activities. One is the creation of the world as it appears at the start of play: where and what everything is. The other is to specify the rules of play, which shape how the player interacts with that initially created world. A new Inform project is void and without form, so to speak, with nothing created: but it starts with hundreds of standard rules already in place.

-

The same division between creating things, and laying down rules, is visible in Inform source text. The creation of the world is done by making unconditional factual statements about it. For example,

- -

The wood-slatted crate is in the Gazebo. The crate is a container. + +

§2.3. Punctuation

+

An example rule from the previous section demonstrates one of Inform's conventions about punctuation, and is worth pausing to look at again.

+ +

Instead of taking the crate, say "It's far too heavy to lift." +

+
+ +

In English grammar, it's usual to regard a full stop as closing its sentence even when it occurs inside quotation marks, provided there is no indication to the contrary, and this is also the rule used by Inform. Thus:

+ +

The description is "Shiny." It is valuable. +

+
+ +

is read as equivalent to

+ +

The description is "Shiny.". It is valuable. +

+
+ +

Sentence breaks like this occur only when the final character of the quoted text is a full stop, question mark or exclamation mark (or one of these three followed by a close bracket) and the next word begins, in the source code, with a capital letter. A paragraph break also divides sentences, behaving as if it were a full stop.

+

Material in square brackets [like so] is "comment", in computing jargon: it is considered as being an aside, a private note by the author, and not read in by Inform. This allows us to make notes to ourselves like so:

+ +

The China Shop is a room. [Remember to work out what happens if the bull gets in here!] +

+
+ +

Inform is all about text, so pieces of text are often quoted in Inform source. This example is typical:

+ +

The description is "Shiny." It is valuable. +

+
+ +

Quotations always use double-quotation marks, which aren't part of the text. So the description here is just the five letters and full stop in between the marks:

+ +

Shiny. +

+
+ +

That seems straightforward, but there are three conventions to watch out for.

+

1. Square brackets [ and ] inside quoted text don't literally mean [ and ]. They're used to describe what Inform should say, but in a non-literal way. For example,

+ +

"Your watch reads [time of day]." +

+
+ +

might produce

+ +

Your watch reads 9:02 AM. +

+
+ +

These are called "text substitutions". They're highly flexible, and they can take many different forms.

+

2. Single quotation marks at the edges of words are printed as double. So:

+ +

"Simon says, 'It's far too heavy to lift.'" +

+
+ +

produces

+ +

Simon says, "It's far too heavy to lift."

-

Inform calls sentences like these "assertions". The verb is always written in the present tense (thus the crate "is", not "will be"). Further examples are:

- -

Mr Jones wears a top hat. The crate contains a croquet mallet. +

3. Texts which end with sentence-ending punctuation - full stop, question mark, exclamation mark - are printed with a line break after them. So:

+ +

say "i don't know how this ends"; +
+ say "I know just how this ends!";

-

The words "is", "wears" and "contains" are forms of three of the basic verbs built in to Inform. There are only a few built-in assertion verbs, of which the most important are to be, to have, to carry, to wear, to contain and to support. (As we shall see, further assertion verbs can be created if needed.)

-

The world described by these assertions is the starting condition of the story: what happens when play begins is another matter. If somebody picks up the crate and walks off with it, then it will no longer be in the Gazebo. Mr Jones may remove his hat.

+

would come out quite differently - this doesn't affect the appearance of the text, but only the position where the next text will appear. Something to be careful about is that this only applies when the punctuation occurs at the end of a "say", as in these examples. (It doesn't apply when a varying textual value is printed, using some text substitution, because then the pattern of where line breaks occur would be unpredictable - sometimes the value might end in a punctuation mark, sometimes not.)

+

These three punctuation rules for texts feel very natural with practice, and Inform users sometimes don't realise the third rule is even there, because it just seems the right thing to happen. But occasionally the rules get in the way of what we want to do. (For instance, how do we get a literal [ or ]? What if we want a single quote mark where Inform thinks we want a double, or vice versa?) So we'll come back to these rules in more detail in the chapter on Text.

+

Inform also reads other punctuation marks. Colon ":" and semicolon ";" turned up in the previous section, in the writing of rules. It also has the more exotic "|" (not a capital I, a vertical stroke) for paragraph breaks outside of quoted text, but people hardly ever need this.

+

As these examples begin to show, Inform source imitates the conventions of printed books and newspapers whenever there is a question of how to write something not easily fitting into words. The first example of this is how Inform handles headings, but to see why these are so useful we first look at Problems.

+

* See How Inform reads quoted text for a fuller exploration of the punctuation rules for text


diff --git a/inform/StagingArea/Contents/Resources/en.lproj/doc100.html b/inform/StagingArea/Contents/Resources/en.lproj/doc100.html index 447c5f54..17b264ef 100644 --- a/inform/StagingArea/Contents/Resources/en.lproj/doc100.html +++ b/inform/StagingArea/Contents/Resources/en.lproj/doc100.html @@ -4,7 +4,7 @@ - 7.3. Before rules + 7.5. After rules - - - + + +
@@ -81,247 +81,97 @@
-

§7.3. Before rules

-

Despite what was said in the previous section, instead rules do not quite bypass all of the usual rules. Inform knows that certain actions require light: for instance,

- -

examining the napkin; looking; looking under the dining table +

§7.5. After rules

+

There is pleasantly little to be said about "after" rules. If an action has survived all the rules in its way, and has actually succeeded, then we need to give the player a response which acknowledges this. Inform's normal rules will be sufficient to say something undramatic: for instance, if "taking the napkin" has succeeded then it will reply "Taken." to the player.

+

An after rule is an opportunity to say something more interesting:

+ +

After taking the diamonds, say "Taken!"

-

and if it is dark then none of these actions will be allowed, and any instead rules about them will not even be reached. Similarly, Inform knows that most actions require physical access to their objects: so "taking the napkin" would be blocked if the napkin were, say, inside a closed glass bottle, whereas "examining the napkin" would not. So an instead rule can only take effect if the action has already passed these basic reasonability tests.

-

"Before" rules genuinely precede checking of any kind. They also differ from instead rules in that they do not automatically stop the action in its tracks. Rather, they are provided as an opportunity to ensure that something else is done first. For example:

- -

Before taking the napkin, say "(first unfolding its delicate origami swan)". +

(Well, slightly more interesting.) After rules automatically end the action (as a success), which is what we would want in the above case. Allowing it to continue would simply result in "Taken." being printed as well. However, should we really need to do something and then carry on:

+ +

After taking the diamonds: say "(Mr Beebe looks up sharply.) "; continue the action.

-

whence

- -

>GET NAPKIN -
- (first unfolding its delicate origami swan) -
- Taken. -

-
- -

We have seen that instead rules automatically stop actions, whereas before rules automatically allow them to continue. We sometimes want to change this. The magic word "instead" can therefore be tacked on to any instruction in a before rule, and will have the effect of immediately stopping the action at that instruction. Thus the following two rules are (almost) equivalent:

- -

Before taking the key, instead say "It seems to be soldered to the keyhole." -

-
- - -

Instead of taking the key, say "It seems to be soldered to the keyhole." -

-
- -

It is also possible to be explicit about stopping the action:

- -
-

stop the action

- - - - -

This phrase stops the current rule, stops the rulebook being worked through, and finally stops the action being processed. Example:

- -

Before taking the key: -
-     say "It seems to be soldered to the keyhole."; -
-     stop the action. -

-
- - - -
- -

Finally, we can prevent Inform from stopping the action when it otherwise might:

- -
-

continue the action

- - - - -

This phrase ends the current rule, but in a way which keeps its rulebook going, so that the action being processed will carry on rather than being stopped. Example:

- -

Instead of taking the napkin: -
-     say "(first unfolding its delicate origami swan)[command clarification break]"; -
-     continue the action. -

-
- -

An "instead" rule ordinarily stops the action when it finishes, so the "continue the action" is needed to make things carry on. (This rule would have been better written as a "before" rule, in fact, but it shows the idea.)

- - -
- -

As a general principle, it is good style to use instead rules whenever blocking actions, and before rules only when it is genuinely necessary to do something first but then to continue: in fact, it is good style to use "stop the action" or "continue the action" as little as possible.


- - + +
- 86
+ 90
-

***ExampleDemocratic Process
- Make PUT and INSERT commands automatically take objects if the player is not holding them.

+

*ExampleMorning After
+ When the player picks something up which he hasn't already examined, the object is described.

- RB
+ RB
-