#ifndef CHECKS #define CHECKS /* ** As TADS has been updated, it's gained a lot of capabilities. ** Unfortunately, many players are using older interpreters which don't ** support all of these nifty bells and whistles. This module checks the ** interpreter's version number, as well as whether the game is running ** on a HTML runtime and whether or not the interpreter can handle ** graphics. All results are saved in variables in the global object, ** and the module will optionally print an error message if it's running ** on an old version of the interpreter. ** ** There are also some helper functions. graphicsOn() returns true if ** the interpreter is capable of handling graphics and the user has the ** "graphics on" option selected. Ditto soundsOn() and musicOn(). ** ** Copyright (c) 1999, Stephen Granade. All rights reserved. ** ** Version history: ** 19 Oct 99 -- Initial release */ /* Use C operators */ #pragma C+ /* So here's what you do: 1. #include this file *after* you define the global object, which is normally in std.t or some variation thereof. 2. In your own definition of the global object, set minVersionNumber to be the minimum interpreter version under which your game will run. It should be a string: minVersionNumber = '2.5' 3. In either init() or (if you use it) commonInit(), place a call to getSysInfo(); This will set the variables defined below in the "global" object and perform version checking by calling giveVersionWarning(). 4. If you don't like having a version warning printed at the start of a game, set dontPrintWarning to true in your global object: dontPrintWarning = true 5. If you want to use a different warning message than the one below, replace the giveVersionWarning() function. If you want the game to quit if the wrong interpreter is used, add terminate(); quit(); to the function. A suggestion: if you're using HTML mode (that is, you've printed "\H+"), then somewhere in your commonInit() function, put the following: if (global.isHTMLRuntime) { "Information about your game"; "Title of your game"; } This will set the text which is displayed in the title bar of many interpreters and the text which is printed when "About this game" is selected from the "Help" menu of HTML TADS interpreters. */ /* I'm going to assume that you define the global object in one of your own files. If you don't, change "modify global" to "global: object" */ modify global // dontPrintWarning = true // Ignore version warning // minVersionNumber = '2.5' // Our minimum version number versionNumber = '' // Interpreter version we're running under isHTMLRuntime = true // Are we running in an HTML runtime? canDoGraphics = true // Set to true if our runtime can handle // graphics canDoSoundFX = true // Ditto if runtime can do sound effects canDoMusic = true // Ditto if runtime can do music ; /* This version of giveVersionWarning() just prints a warning message. */ giveVersionWarning: function { if (!global.dontPrintWarning && compareVersionNumbers(global.versionNumber, global.minVersionNumber) == -1) { "\b\(WARNING: The TADS interpreter that you are using is a version that is earlier than <>. Because of this, this game will not work as it should. I recommend that you get an updated version of the TADS interpreter from ftp://ftp.gmd.de/if-archive/programming/tads/executables.\)\b"; } } /* Get system-dependent info, such as "what interpreter is this" and "is this an HTML-capable interpreter" &c. All information is stored in variables held in the "global" object. */ getSysInfo: function { if (systemInfo(__SYSINFO_SYSINFO) == true) { global.isHTMLRuntime = (systemInfo(__SYSINFO_HTML) == 1); global.canDoGraphics = (systemInfo(__SYSINFO_JPEG) == 1) || (systemInfo(__SYSINFO_PNG) == 1);// True if we can do PNG or JPEG global.canDoSoundFX = (systemInfo(__SYSINFO_MPEG_AUDIO) == 1) || (systemInfo(__SYSINFO_WAV) == 1); global.canDoMusic = (systemInfo(__SYSINFO_MIDI) == 1); // Check our version number global.versionNumber = systemInfo(__SYSINFO_VERSION); } else { global.isHTMLRuntime = nil; // This interpreter's not HTML global.canDoGraphics = nil; // capable. Assume the version global.canDoSoundFX = nil; // number is 2.2.3, as that's global.canDoMusic = nil; // the last version which global.versionNumber = '2.2.3'; // lacks systemInfo() } giveVersionWarning(); } /* graphicsOn() returns true if the user has the "graphics" option selected and the runtime is capable of showing graphics. */ graphicsOn: function { return (global.canDoGraphics && systemInfo(__SYSINFO_PREF_IMAGES)); } /* soundsOn() returns true if the user has the "sound effects" option selected and the runtime is capable of playing them */ soundsOn: function { return (global.canDoSoundFX && systemInfo(__SYSINFO_PREF_SOUNDS)); } /* musicOn() returns true if the user has the "music" options selected and the runtime is capable of playing music. */ musicOn: function { return (global.canDoMusic && systemInfo(__SYSINFO_PREF_MUSIC)); } /* Compare two version numbers (e.g. '2.2.6'), starting with the major number, then minor, then final. Returns -1 if the first number is less than the second, 0 if they are equal, or 1 if the first is greater */ compareVersionNumbers: function(one, two) { local firstStr, secondStr, i, j, firstLoc, secondLoc; firstStr = one; secondStr = two; do { firstLoc = find(firstStr, '.'); secondLoc = find(secondStr, '.'); if (firstLoc) { i = cvtnum(substr(firstStr, 1, firstLoc - 1)); firstStr = substr(firstStr, firstLoc + 1, length(firstStr) - firstLoc); } else i = cvtnum(firstStr); if (secondLoc) { j = cvtnum(substr(secondStr, 1, secondLoc - 1)); secondStr = substr(secondStr, secondLoc + 1, length(secondStr) - secondLoc); } else j = cvtnum(secondStr); if (i < j) return -1; if (i > j) return 1; } while (firstLoc && secondLoc) if (firstLoc) return 1; // This handles '2.5.1' vs '2.5' if (secondLoc) return -1; // while this handles '2.5' vs '2.5.1' return 0; } #endif /* CHECKS */