home *** CD-ROM | disk | FTP | other *** search
/ PC-Online 1998 February / PCOnline_02_1998.iso / filesbbs / dos / nbeta087.exe / UFO.DOC < prev   
Text File  |  1996-10-27  |  143KB  |  4,223 lines

  1.  
  2.  
  3.          ▄█████▄  ▄█████▄  ▄█████▄   ▄████▄  ▄█████▄  ▄█████▄   ▄████▄
  4.          ▄▄▄ ▀███ ▄▄▄ ▀███ ▄▄▄ ▀███ ▄▄▄ ▀███ ▄▄▄  ██▀ ▄▄▄  ██▀ ▄▄▄  ▀▀▀
  5.          ███  ███ ███  ███ ███  ███ ███  ███ ██████▄  ██████▄   ▀████▄
  6.          ███  ███ ████████ ███  ███ ███▄ ███ ███  ███ ███  ███ ▄▄▄  ███
  7.          ███  ███ ███  ███ ███  ███  ▀████▀  ██████▀  ██████▀   ▀████▀
  8.  
  9.                                 NanoBBS 2.00
  10.                   Copyright 1994,1996 Whirlwind Software
  11.                              All Rights Reserved
  12.  
  13.                   Program and Documentation by Gerald Albion
  14.  
  15.                              Additional Code by
  16.                           Mark Dignam and Mark May
  17.  
  18.        ╔═══════════════════════════════════════════════════════════════╗
  19.        ║ ┌─┐   ┌─┐┌──────┐┌───────┐                                    ║
  20.        ║ │ │   │ ││ ┌────┘│ ┌───┐ │      Universal Flexible Online:    ║
  21.        ║ │ │   │ ││ └─┐   │ │   │ │      The UFO Scripting Language    ║
  22.        ║ │ └───┘ ││ ┌─┘   │ └───┘ │                                    ║
  23.        ║ └───────┘└─┘     └───────┘                                    ║
  24.        ╚═══════════════════════════════════════════════════════════════╝
  25.  
  26.     UFO is an acronym standing for Universal Flexible Online.
  27.     Let's just say I was really into some Michael Schenker music
  28.         when I coined that one.
  29.  
  30.         The UFO scripting language is made up of keywords in a flat
  31.     ASCII text file.  In order to turn the keywords into tokens that
  32.     NanoBBS can understand, you must run the UFO script compiler
  33.     (UFO.EXE) with your script file.
  34.  
  35.     There are three kinds of keywords.
  36.  
  37.     ┌───────┐
  38.     │ VERBS │ are action keywords; they actually do something.  They
  39.     └───────┘ might change a colour or invoke a canned option or
  40.     perform some arcane logical program flow function, at your
  41.     disposal.
  42.  
  43.     ┌───────┐
  44.     │ NOUNS │ are variables and other "things" in the BBS.  A noun
  45.     └───────┘ might be part of a user's record such as name or
  46.     password, or perhaps a system variable like number of calls or
  47.         current baud rate. Many verbs act on nouns, and most verbs can
  48.         act on ALL nouns. This ability to combine actions with any
  49.         system noun instantly gives you incredible power to customize
  50.         your system, but there is third dimension to this syntactic
  51.         structure...
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.         NanoBBS - UFO Language Documentation                    Page 1
  59.  
  60.  
  61.         ┌────────────┐
  62.     │ ADJECTIVES │ are modifiers which change the form or
  63.     └────────────┘ content of nouns before a verb acts on them.  You
  64.     might, for example, want to display a noun but in upper case;
  65.     for this you would use an [uppercase] adjective between the verb
  66.     and the noun.
  67.  
  68.     Here is the basic syntax:
  69.  
  70.     [verb]    This is a simple action with no parameters.
  71.  
  72.     [verb noun]  This is the simplest form of a verb that performs
  73.     an action on a noun.
  74.  
  75.     [verb noun noun]  Some verbs perform the action on more than one
  76.     noun, or perform the action on one noun and need another as
  77.     input to decide how to perform the action.
  78.  
  79.     [noun] A noun by itself will simply be displayed to the user.
  80.     Sort of like:  Spot.  This is Spot.  See Spot.    You get the
  81.     picture.
  82.  
  83.     [adjective noun] An adjective followed by a noun, without a
  84.     verb, will cause the noun to be displayed after the changes
  85.     specified by the adjective are made.
  86.  
  87.     [verb adjective noun] This will perform the action with the
  88.     adjective-modified noun.
  89.  
  90.     [verb adjective1 adjective2 .... adjectiveX noun] You may
  91.     string as many adjectives as you need to get a desired effect
  92.     on a noun.
  93.  
  94.     [verb adjective noun adjective adjective2 noun] Verbs which
  95.     require more than one noun can also use any number of
  96.     adjectives.  One thing, where a verb specifies a noun to be
  97.     changed, it is pointless and invalid to specify an adjective
  98.     for the "destination" noun.  Results of such an operation are
  99.     unknown.
  100.  
  101.     If all this sounds remarkably like programming in plain
  102.     English, well, that's how I intended it to be.  There is, of
  103.     course, a caveat: in order to distunguish keywords from the
  104.     regular text in your UFO files, keywords are enclosed in
  105.     [square brackets], also called braces.    Anything not enclosed
  106.     in braces is treated as plain text and is displayed to the user
  107.     as it appears.
  108.  
  109.         You can also use the embedded colour commands (the ones that
  110.     start with the tilde ~ character, as discussed in the chapter
  111.     on embedded commands), and you may even find it easier to type
  112.     these embedded colours directly rather than using their
  113.     full-syntax equivalents.  Either way is fine.
  114.  
  115.  
  116.  
  117.  
  118.         NanoBBS - UFO Language Documentation                    Page 2
  119.  
  120.  
  121.         As in English, some combinations make no sense.  Just as a
  122.     pink-with-purple-polka-dot frog is something only an acid freak
  123.     ever sees, likewise a sillycased download count is not of this
  124.     particular world either.  I cannot be responsible for what
  125.     happens to your sanity if you try anything immensely kinky in
  126.     UFO (grin)...
  127.  
  128.     Unlike some script langauges, you can stack as many UFO
  129.         keywords between a set of braces as you want.  You can put as
  130.     much whitespace before, after and between each keyword as you
  131.     like, and you can span keywords across multiple lines of text
  132.     without having blank lines show up when the compiled UFO file
  133.     is run. In short, it's pretty danged forgiving.
  134.  
  135.  
  136.     Here is an example of a basic verb:
  137.  
  138.     [green]This is green text!
  139.  
  140.     The above example will change the foreground colour to green and
  141.     display the message "This is green text!" to the user in green!
  142.  
  143.  
  144.     Another example:
  145.  
  146.     [white]Go Sweden! [yellow on blue]─┼──[background black cleol]
  147.  
  148.     The above example changes the foreground colour to white,
  149.     then displays the message "Go Sweden!" and then changes colours
  150.     to yellow on a blue background, and uses some nifty IBM line
  151.     drawing characters to draw a cute little blue and yellow Swedish
  152.     flag... using a background colour keyword to change the
  153.     background colour back to black and then a [cleol] to clear to
  154.     the end of line.
  155.  
  156.  
  157.     Let's see another example, using adjectives!
  158.  
  159.     [magenta]Welcome back, [lightcyan sillycase username magenta]!
  160.  
  161.     This example first changes the colour to magenta and says
  162.     "Welcome back, " to the user.  It then changes the colour to
  163.     light cyan and displays the user's name, in "Silly Case" which
  164.     is one of many special effects in UFO's repertoire.
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.         NanoBBS - UFO Language Documentation                    Page 3
  179.  
  180.  
  181.         I should point out at this time that there is a [display] verb
  182.     which is theoretically supposed to be used to display a noun
  183.     such as the username, but if the UFO.EXE program detects a noun
  184.     or adjective where there ought to be a verb, it assumes the verb
  185.     is [display] and continues on its merry way.  Therefore, the
  186.     [sillycase username] above is really the same as [display
  187.     sillycase username].
  188.  
  189.         Anyhow, we should see something like this:
  190.  
  191.     Welcome back, GeRaLd aLbIoN!
  192.  
  193.     Pretty cool, eh?
  194.  
  195.     Here is an example with conditionals and the [mark] keyword:
  196.  
  197.     [ifeq useraccess 50000 pageplay "SYSOP.PPL" goto EN mark
  198.         pageplay "LAMER.PPL"][label EN]
  199.  
  200.     This tests to see if the user's access is exactly 50000, no
  201.     higher or lower.  If it is 50000, the pageplay file "SYSOP.PPL"
  202.     is played on the local speaker, otherwise the file "LAMER.PPL" is
  203.     played.  How it works is this: UFO sees the IFEQ keyword and
  204.     then compares USERACCESS with 50000.  50000 is a numeric
  205.     constant and numeric constants don't need quotes.  If USERACCESS
  206.     and 50000 compare true (i.e. if they're the same) then all the
  207.     code up to the MARK keyword is processed, otherwise it is
  208.     skipped.  OK, let's say the user does have 50000 access.   We
  209.     continue on to pageplay the "SYSOP.PPL" file (in quotes because
  210.     it is a non-numeric constant) and then we jump directly to the
  211.     EN label (labels have two characters only, see the label verb
  212.     later in this chapter).  Now, if the user's access was not
  213.     50000, UFO would skip everything until the MARK keyword and
  214.     would then see the pageplay keyword, and would play the
  215.     "LAMER.PPL" file.  After that it would be at the same place, the
  216.     EN label.
  217.  
  218.         ╔══─────────────────────────────────────────────────────────────══╗
  219.         ║ Constants in UFO:                                               ║
  220.     │                                  │
  221.     │ Most verbs allow you to specify a constant as a read-only noun  │
  222.     │ in most places.  Numerical constants (those which are meant to  │
  223.     │ be numbers) can just be entered verbatim.  However, in order      │
  224.     │ to distinguish non-numerical constants from keywords,       │
  225.     │ non-numerical (or text) constants must be enclosed in quotes.   │
  226.     │                                  │
  227.     │ These are valid commands in UFO:                  │
  228.     │                                  │
  229.         │ [display 1000]   [display "1000"]                               │
  230.         │ [display "Kilroy Was Here!"]   [copy var01 "Kilroy Was Here!"]  │
  231.     │                                  │
  232.     │ These are not:                          │
  233.     │                                  │
  234.     │ [display Kilroy Was Here!]                      │
  235.         ║ [copy "Kilroy Was Here!" var01]                                 ║
  236.     ╚══─────────────────────────────────────────────────────────────══╝
  237.  
  238.         NanoBBS - UFO Language Documentation                    Page 4
  239.  
  240.  
  241.  
  242.         There are virtually countless combinations of verbs, adjectives
  243.     and nouns possible, and most of the verbs listed in this chapter
  244.     will include examples in context to help you make use of these
  245.     powerful features!
  246.  
  247.     Exercise caution and run tests using the VIEWUFO utility before
  248.     you turn your own UFO creations loose on your users!  It -is-
  249.     possible to delete important files or go into endless loops that
  250.         send your hard disk's MTBF into a nose dive using UFO scripts.  I
  251.     should stress at this point that users cannot enter compiled UFO
  252.     keywords in messages or at the bang prompt, but they can upload
  253.     UFO scripts to you (trojans) and if you directly display
  254.     uploaded files using the [link] keyword, well, you're wide open
  255.     to abuse by malevolent soon-to-be-EX-users!  It is NOT a good
  256.     idea to write a k-nifty ANSI viewing menu that lets users upload
  257.     to it without screening.  Caveat lector!
  258.  
  259.  
  260.     DATES AND TIMES IN UFO
  261.  
  262.     Throughout NanoBBS and everywhere in the UFO syntax, dates are
  263.     stored in a long integer in the "Seconds Since 1970" format.
  264.     This means that dates are stored as a number of seconds elapsed
  265.     since midnight, January 1st, 1970.  This is used for the
  266.     author's personal convenience (only a four-byte single variable
  267.     is needed for storage) and for consistency with numerous other
  268.     systems (most notably Unix) which use this form of dates.  THE
  269.     ONE EXCEPTION to this rule is the birthdate, which is stored in
  270.     ASCII in YY-MM-DD format.  There is a keyword (the [ymd2s70]
  271.     adjective) which will give you a second-since-1970 of the
  272.     birthdate if you need it, and it will return a negative number
  273.     if the date is before 1970 (pretty cool huh...).  At this
  274.     writing, about 780 million seconds have elapsed since midnight
  275.     70-01-01.
  276.  
  277.     Likewise, a time-of-day is stored as a number of seconds since
  278.     midnight, and can range from zero to 86399.
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.         NanoBBS - UFO Language Documentation                    Page 5
  299.  
  300.  
  301.        ╔════════════════════════════════════════════════════════════════════╗
  302.        ║                                    ║
  303.        ║                                    ║
  304.        ║                  Adjectives                ║
  305.        ║                                    ║
  306.        ║                                    ║
  307.        ╚════════════════════════════════════════════════════════════════════╝
  308.  
  309.  
  310.     ═══════════════════════════════════════════════════════════════
  311.     [sillycase {noun}]
  312.  
  313.     Returns noun in SiLlY CaSe
  314.  
  315.     ═══════════════════════════════════════════════════════════════
  316.     [leftjustify {noun1} {noun2}]
  317.  
  318.     Left justifies noun1 in noun2 columns
  319.  
  320.     ═══════════════════════════════════════════════════════════════
  321.     [rightjustify {noun1} {noun2}]
  322.  
  323.     Right justifies noun1 in noun2 columns
  324.  
  325.     ═══════════════════════════════════════════════════════════════
  326.     [centerjustify {noun1} {noun2}]
  327.  
  328.     Centre justfies noun1 in noun2 columns {This can be used to do
  329.     some REALLY cool stuff!}
  330.  
  331.     ═══════════════════════════════════════════════════════════════
  332.     [lowercase {noun}]
  333.  
  334.     Returns noun in lowercase
  335.  
  336.     ═══════════════════════════════════════════════════════════════
  337.     [uppercase {noun}]
  338.  
  339.     Returns noun in UPPERCASE
  340.  
  341.     ═══════════════════════════════════════════════════════════════
  342.     [mixedcase {noun}]
  343.  
  344.     Returns noun in Mixed Case
  345.  
  346.     ═══════════════════════════════════════════════════════════════
  347.     [firstname {noun}]
  348.  
  349.     Assumes the noun is a person name and attempts to parse out the
  350.     given name, returning what it gets.  It is programmed to skip
  351.     Mr., Mrs., Miss, Ms., Dr., The, and several other titles and
  352.     pseudonym prefices.
  353.  
  354.  
  355.  
  356.  
  357.  
  358.         NanoBBS - UFO Language Documentation                    Page 6
  359.  
  360.  
  361.         ═══════════════════════════════════════════════════════════════
  362.     [century {noun}]
  363.  
  364.     Returns 19 or 20 (noun is a Sec70 Date)
  365.  
  366.     ═══════════════════════════════════════════════════════════════
  367.     [year {noun}]
  368.  
  369.     Returns two-digit year of Sec70 date
  370.  
  371.     ═══════════════════════════════════════════════════════════════
  372.     [monthpad {noun}]
  373.  
  374.     Returns 0-padded month of Sec70 date
  375.  
  376.     ═══════════════════════════════════════════════════════════════
  377.     [month {noun}]
  378.  
  379.     Returns unpadded month of Sec70 date
  380.  
  381.     ═══════════════════════════════════════════════════════════════
  382.     [longmonth {noun}]
  383.  
  384.     Returns full month name of Sec70 date
  385.  
  386.     ═══════════════════════════════════════════════════════════════
  387.     [shortmonth {noun}]
  388.  
  389.     Returns 3-letter month of Sec70 date
  390.  
  391.     ═══════════════════════════════════════════════════════════════
  392.     [datepad {noun}]
  393.  
  394.     Returns 0-padded day of month of Sec70 date
  395.  
  396.     ═══════════════════════════════════════════════════════════════
  397.     [date {noun}]
  398.  
  399.     Returns unpadded day of month of Sec70 date
  400.  
  401.     ═══════════════════════════════════════════════════════════════
  402.     [dateord {noun}]
  403.  
  404.     Returns ordinal suffix of date
  405.  
  406.     ═══════════════════════════════════════════════════════════════
  407.     [dotwlong {noun}]
  408.  
  409.     Returns longhand day of the week
  410.  
  411.     ═══════════════════════════════════════════════════════════════
  412.     [dotwshort {noun}]
  413.  
  414.     Returns shorthand day of the week
  415.  
  416.  
  417.  
  418.         NanoBBS - UFO Language Documentation                    Page 7
  419.  
  420.  
  421.         ═══════════════════════════════════════════════════════════════
  422.     [time12h {noun}]
  423.  
  424.     Returns time in 12 hr format (no seconds)
  425.  
  426.     ═══════════════════════════════════════════════════════════════
  427.     [time12hs {noun}]
  428.  
  429.     Returns time in 12 hr format (w/seconds)
  430.  
  431.     ═══════════════════════════════════════════════════════════════
  432.     [time24h {noun}]
  433.  
  434.     Returns time in 24 hr format (no seconds)
  435.  
  436.     ═══════════════════════════════════════════════════════════════
  437.     [time24hs {noun}]
  438.  
  439.     Returns time in 24 hr format (w/seconds)
  440.  
  441.     ═══════════════════════════════════════════════════════════════
  442.     [meridian {noun}]
  443.  
  444.     Returns am or pm as required
  445.  
  446.     ═══════════════════════════════════════════════════════════════
  447.     [hour24 {noun}]
  448.  
  449.     Returns the hour part (in 24h format)
  450.  
  451.     ═══════════════════════════════════════════════════════════════
  452.     [hour12 {noun}]
  453.  
  454.     Returns the hour part (in 12h format)
  455.  
  456.     ═══════════════════════════════════════════════════════════════
  457.     [minute {noun}]
  458.  
  459.     Returns the minute part
  460.  
  461.     ═══════════════════════════════════════════════════════════════
  462.     [second {noun}]
  463.  
  464.     Returns the second part
  465.  
  466.     ═══════════════════════════════════════════════════════════════
  467.     [sdrawkcab {noun}]
  468.  
  469.     Returns the noun backwards
  470.  
  471.     ═══════════════════════════════════════════════════════════════
  472.     [backwards {noun}]
  473.  
  474.     Returns the noun backwards
  475.  
  476.  
  477.  
  478.         NanoBBS - UFO Language Documentation                    Page 8
  479.  
  480.  
  481.         ═══════════════════════════════════════════════════════════════
  482.     [drawkcab {noun}]
  483.  
  484.     Returns the noun backwards
  485.  
  486.     ═══════════════════════════════════════════════════════════════
  487.     [backward {noun}]
  488.  
  489.     Returns the noun backwards
  490.  
  491.     ═══════════════════════════════════════════════════════════════
  492.     [product {noun1} {noun2}]
  493.  
  494.     Returns the mathematical product of the two nouns
  495.  
  496.     ═══════════════════════════════════════════════════════════════
  497.     [quotient {noun1} {noun2}]
  498.  
  499.     Returns the mathematical quotient of {noun1} divided by {noun2}.
  500.     Quotient is truncated down to nearest integer.
  501.  
  502.     ═══════════════════════════════════════════════════════════════
  503.     [remainder {noun1} {noun2}]
  504.  
  505.     Returns the remainder of {noun1} divided by {noun2}.
  506.  
  507.     ═══════════════════════════════════════════════════════════════
  508.     [sum {noun1} {noun2}]
  509.  
  510.     Returns the mathematical sum of {noun1} and {noun2}.
  511.  
  512.     ═══════════════════════════════════════════════════════════════
  513.     [difference {noun1} {noun2}]
  514.  
  515.     Returns the mathematical difference between {noun1} and {noun2},
  516.     or in other words {noun1} minus {noun2}.
  517.  
  518.     ═══════════════════════════════════════════════════════════════
  519.     [ratio {noun1} {noun2}]
  520.  
  521.     Returns the ratio of {noun1}:{noun2} in the form n:1
  522.  
  523.     ═══════════════════════════════════════════════════════════════
  524.     [percentage {noun1} {noun2}]
  525.  
  526.     Returns the percentage that {noun1} is of {noun2}.
  527.  
  528.     ═══════════════════════════════════════════════════════════════
  529.     [xfer_estimate {noun}]
  530.  
  531.     Returns the estimated transfer time (in seconds) of the byte
  532.     count in {noun}.  Accounts for baud rate.
  533.  
  534.  
  535.  
  536.  
  537.  
  538.         NanoBBS - UFO Language Documentation                    Page 9
  539.  
  540.  
  541.         ═══════════════════════════════════════════════════════════════
  542.     [ymd2s70 {noun}]
  543.  
  544.     Returns a SecondSince1970 integer date from a valid YY/MM/DD or
  545.     YY-MM-DD date in {noun}
  546.  
  547.     ═══════════════════════════════════════════════════════════════
  548.     [ymd {noun}]
  549.  
  550.     Returns a canned YY/MM/DD date of the SecondSince1970 date in
  551.     {noun}.  A nice quicky to avoid the tedium of building custom
  552.     dates with the previous lot of keywords.
  553.  
  554.     ═══════════════════════════════════════════════════════════════
  555.     [ordinal {noun}]
  556.  
  557.     Returns ordinal suffix of noun if noun is numerical, nothing
  558.     otherwise.
  559.  
  560.     Ex.:
  561.  
  562.     Happy [userage ordinal userage] Birthday!
  563.  
  564.     If this were the user's 27th birthday, this bit of code would
  565.     display the string "Happy 27th Birthday!".  In this example,
  566.     first the user's actual age in years is displayed, and then the
  567.     ordinal suffix - in this case "th".  You might want to use this
  568.     in a welcome screen in conjunction with an [ifbirthday] verb.
  569.  
  570.     ═══════════════════════════════════════════════════════════════
  571.     [dollars {noun}]
  572.  
  573.     Assuming the noun is a quantity of money in cents (as credits
  574.     for netmail are stored) this adjective returns a dollar amount,
  575.     e.g. 0.50 for 50 cents, 1.25 for 125 cents etcetera.  Good for
  576.     informing a user how much s/he is being dinged for a netmail.
  577.  
  578.     ═══════════════════════════════════════════════════════════════
  579.     [fidocost {noun}]
  580.  
  581.     This returns the cost in cents, as defined in FIDOCOST.CTL, of a
  582.     netmail to the address specified in the noun.  If the address is
  583.     invalid or if it is not known in FIDOCOST.CTL (or covered by an
  584.     ALL clause) then the cost returned is zero.  This is well used
  585.     in conjunction with the preceding [dollars] keyword.
  586.  
  587.         ═══════════════════════════════════════════════════════════════
  588.         [creditcard {noun}]
  589.  
  590.         This checks the noun to see if it's a valid credit card number. If
  591.         it is, and the card type is recognized, it will return AMEX, VISA,
  592.         MASTERCARD or DISCOVER.  If it is a valid card of an unknown type,
  593.         UNKNOWN is returned.  If the card is in any way invalid (by
  594.         checksum, missing digits, etc) the adjective returns INVALID.
  595.  
  596.  
  597.  
  598.         NanoBBS - UFO Language Documentation                    Page 10
  599.  
  600.  
  601.  
  602.         ═══════════════════════════════════════════════════════════════
  603.         [zeropad {noun1} {noun2}]
  604.  
  605.         This pads {noun1} with the number of zeroes specified by {noun2}.
  606.         This is useful for a number of applications but was written to aid
  607.         in writing a credit card acceptance UFO script.
  608.  
  609.         Examples:
  610.  
  611.         [zeropad 5 3]
  612.  
  613.         This would result in:
  614.  
  615.         005
  616.  
  617.         [zeropad "621" 8]
  618.  
  619.         This would result in:
  620.  
  621.         00000621
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.         NanoBBS - UFO Language Documentation                    Page 11
  659.  
  660.  
  661.        ╔════════════════════════════════════════════════════════════════════╗
  662.        ║                                    ║
  663.        ║                                    ║
  664.        ║                Nouns                    ║
  665.        ║                                    ║
  666.        ║                                    ║
  667.        ╚════════════════════════════════════════════════════════════════════╝
  668.  
  669.         ═══════════════════════════════════════════════════════════════
  670.         [var01] [var02] [var03] ... [var38] [var39] [var40]
  671.  
  672.         These are general purpose variables for your own use.  There are
  673.         40 of these variables.  They can contain strings of up to 255
  674.         characters each.  If the strings represent numerical values,
  675.         they can be copied to numerical nouns, or they can have
  676.         mathematical operations performed on them or be used as
  677.         numerical parameters in the RIPscrip suite.  They are most often
  678.         used as temporary storage and as indices for loops.
  679.  
  680.         ═══════════════════════════════════════════════════════════════
  681.     [username]
  682.  
  683.     The user's logon name/pseudo
  684.  
  685.     ═══════════════════════════════════════════════════════════════
  686.     [userrealname]
  687.  
  688.     The user's real name
  689.  
  690.     ═══════════════════════════════════════════════════════════════
  691.     [userlocation]
  692.  
  693.     The user's location
  694.  
  695.     ═══════════════════════════════════════════════════════════════
  696.     [userpassword]
  697.  
  698.     The user's password
  699.  
  700.     ═══════════════════════════════════════════════════════════════
  701.     [userphone]
  702.  
  703.     The user's phone number
  704.  
  705.     ═══════════════════════════════════════════════════════════════
  706.     [userlastdate]
  707.  
  708.     Date/Time of user's last call
  709.  
  710.  
  711.     ═══════════════════════════════════════════════════════════════
  712.     [usercredit]
  713.  
  714.         User's online time credit.
  715.  
  716.  
  717.  
  718.         NanoBBS - UFO Language Documentation                    Page 12
  719.  
  720.  
  721.         ═══════════════════════════════════════════════════════════════
  722.     [userposts]
  723.  
  724.         Number of messages user has posted.
  725.  
  726.     ═══════════════════════════════════════════════════════════════
  727.     [useraccess]
  728.  
  729.         User's access level.
  730.  
  731.     ═══════════════════════════════════════════════════════════════
  732.     [usercalls]
  733.  
  734.     Number of calls user has made
  735.  
  736.     ═══════════════════════════════════════════════════════════════
  737.     [useruploads]
  738.  
  739.     Number of kilobytes uploaded
  740.  
  741.     ═══════════════════════════════════════════════════════════════
  742.     [userdownloads]
  743.  
  744.     Number of kilobytes downloaded
  745.  
  746.     ═══════════════════════════════════════════════════════════════
  747.     [userdownloadtoday]
  748.  
  749.     Number of kilobytes downloaded today
  750.  
  751.     ═══════════════════════════════════════════════════════════════
  752.     [userelapsed]
  753.  
  754.     Minutes used by user today
  755.  
  756.     ═══════════════════════════════════════════════════════════════
  757.     [userlines]
  758.  
  759.     Number of lines the user has set (usually 24)
  760.  
  761.     ═══════════════════════════════════════════════════════════════
  762.     [usercolumns]
  763.  
  764.     Number of columns the user has set (usually 80)
  765.  
  766.     ═══════════════════════════════════════════════════════════════
  767.     [userfirstdate]
  768.  
  769.     The Date and time of the user's first call to the system, in
  770.     SecondsSince1970 form
  771.  
  772.     ═══════════════════════════════════════════════════════════════
  773.     [userbday]
  774.  
  775.     The user's birthdate, as entered by him/her.
  776.  
  777.  
  778.         NanoBBS - UFO Language Documentation                    Page 13
  779.  
  780.  
  781.         ═══════════════════════════════════════════════════════════════
  782.     [userage]
  783.  
  784.     The user's age in years.  Because this is a derived noun (from
  785.     the Birthdate field) it is read-only - any attempt to change its
  786.     value will have no effect.
  787.  
  788.         ═══════════════════════════════════════════════════════════════
  789.     [userexpiry]
  790.  
  791.     The date of the user's account expiry, in SecondsSince1970
  792.         format.
  793.  
  794.         ═══════════════════════════════════════════════════════════════
  795.         [userbank]
  796.  
  797.         The balance of the user's time bank "account".  This is the
  798.         total number of minutes the user has stored for future use.
  799.  
  800.         ═══════════════════════════════════════════════════════════════
  801.         [userbanktoday]
  802.  
  803.         This is the number of minutes the user has already withdrawn
  804.         from the time bank today - this value is used internally to
  805.         enforce per-day withdrawal limits.
  806.  
  807.     ═══════════════════════════════════════════════════════════════
  808.     [msgfrom]
  809.  
  810.     The "From" field of the current message
  811.  
  812.     ═══════════════════════════════════════════════════════════════
  813.     [msgto]
  814.  
  815.     The "To" field of the current message
  816.  
  817.     ═══════════════════════════════════════════════════════════════
  818.     [msgsubj]
  819.  
  820.     The "Subject" field of the current message
  821.  
  822.     ═══════════════════════════════════════════════════════════════
  823.     [msgnum]
  824.  
  825.     The Message Number of the current message
  826.  
  827.     ═══════════════════════════════════════════════════════════════
  828.     [msgorig]
  829.  
  830.     The full 3D (or 4D if applicable) FTN address of the origin of
  831.     the current message.  If the "point" is zero, the address is
  832.     returned in 3D.
  833.  
  834.  
  835.  
  836.  
  837.  
  838.         NanoBBS - UFO Language Documentation                    Page 14
  839.  
  840.  
  841.         ═══════════════════════════════════════════════════════════════
  842.     [msgdest]
  843.  
  844.     The full 3D (or 4D if applicable) FTN address of the destination
  845.     of the current message.  If the "point" is zero, the address is
  846.     returned in 3D.
  847.  
  848.     ═══════════════════════════════════════════════════════════════
  849.     [msgorigzone]
  850.  
  851.     The Zone number of the current message's origin node
  852.  
  853.     ═══════════════════════════════════════════════════════════════
  854.     [msgorignet]
  855.  
  856.     The Net number of the current message's origin node
  857.  
  858.     ═══════════════════════════════════════════════════════════════
  859.     [msgorignode]
  860.  
  861.     The Node number of the current message's origin node
  862.  
  863.     ═══════════════════════════════════════════════════════════════
  864.     [msgdestzone]
  865.  
  866.     The Zone number of the current message's destination node
  867.  
  868.     ═══════════════════════════════════════════════════════════════
  869.     [msgdestnet]
  870.  
  871.     The Net number of the current message's destination node
  872.  
  873.     ═══════════════════════════════════════════════════════════════
  874.     [msgdestnode]
  875.  
  876.     The Node number of the current message's destination node
  877.  
  878.     ═══════════════════════════════════════════════════════════════
  879.     [msgdate]
  880.  
  881.     The message's date in SecondsSince1970 format
  882.  
  883.     ═══════════════════════════════════════════════════════════════
  884.     [msgareanum]
  885.  
  886.     The number of the current message area
  887.  
  888.     ═══════════════════════════════════════════════════════════════
  889.     [msgareaname]
  890.  
  891.     The name of the current message area
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.         NanoBBS - UFO Language Documentation                    Page 15
  899.  
  900.  
  901.         ═══════════════════════════════════════════════════════════════
  902.     [postpriv]
  903.  
  904.     Short for POST PRIVILEGE.  This is a number which is 0 if the
  905.     user may post in this area, 479 if the user does not have post
  906.     access and 946 if the area is read only.  These codes correspond
  907.     to SysMsgs in the Language file which indicate these error
  908.     conditions, so you can pass this value directly to a [message]
  909.     keyword to quickly indicate the error.
  910.  
  911.     ═══════════════════════════════════════════════════════════════
  912.     [msgorigreply]
  913.  
  914.     The number of the message that this message is a reply to
  915.  
  916.     ═══════════════════════════════════════════════════════════════
  917.     [msgtimesread]
  918.  
  919.     The number of times the current message has been read
  920.  
  921.     ═══════════════════════════════════════════════════════════════
  922.     [msgreply]
  923.  
  924.     The number of the next reply to this message
  925.  
  926.         ═══════════════════════════════════════════════════════════════
  927.         [ifmsgpvt]
  928.  
  929.         This will skip to the next [mark] if the current message is not
  930.         marked "Private."
  931.  
  932.     ═══════════════════════════════════════════════════════════════
  933.     [textlevel]
  934.  
  935.     The current UFO nesting level.    This is a read-only noun.
  936.  
  937.     ═══════════════════════════════════════════════════════════════
  938.     [usercount]
  939.  
  940.     The number of active user accounts in the BBS.    This is a
  941.     read-only noun.
  942.  
  943.  
  944.     ═══════════════════════════════════════════════════════════════
  945.     [highuser]
  946.  
  947.     The highest user record number in the BBS.  This is a read-only
  948.     noun.
  949.  
  950.     ═══════════════════════════════════════════════════════════════
  951.     [baudrate]
  952.  
  953.     The user's current baud rate.  This is a read-only noun.
  954.  
  955.  
  956.  
  957.  
  958.         NanoBBS - UFO Language Documentation                    Page 16
  959.  
  960.  
  961.         ═══════════════════════════════════════════════════════════════
  962.     [lockbaud]
  963.  
  964.     The defined locked baud rate if any.  This is a read-only noun.
  965.  
  966.     ═══════════════════════════════════════════════════════════════
  967.     [pagestart]
  968.  
  969.     The time in SecondsSinceMidnight format of when paging begins
  970.     being allowed.
  971.  
  972.     ═══════════════════════════════════════════════════════════════
  973.     [pageend]
  974.  
  975.     The time if SecondsSinceMidnight format of when paging ends
  976.     being allowed.
  977.  
  978.     ═══════════════════════════════════════════════════════════════
  979.     [minbaud]
  980.  
  981.     The slowest baud rate allowed.
  982.  
  983.     ═══════════════════════════════════════════════════════════════
  984.     [fileareaname]
  985.  
  986.     The name of the current file area.
  987.  
  988.     ═══════════════════════════════════════════════════════════════
  989.     [fileareanum]
  990.  
  991.     The number of the current file area
  992.  
  993.     ═══════════════════════════════════════════════════════════════
  994.     [fileareaowner]
  995.  
  996.     The "owner" name of the current file area
  997.  
  998.     ═══════════════════════════════════════════════════════════════
  999.     [filedlpath]
  1000.  
  1001.     The download path of the current file area
  1002.  
  1003.     ═══════════════════════════════════════════════════════════════
  1004.     [fileulpath]
  1005.  
  1006.     The upload path of the current file area
  1007.  
  1008.     ═══════════════════════════════════════════════════════════════
  1009.     [failurecode]
  1010.  
  1011.         The failure code of the last operation (that generates
  1012.         failure codes).  If there is a sysmsg to indicate the failure,
  1013.     that sysmsg's number is returned here.  Where the last operation
  1014.         is successful, failure code is always zero.  Not all operations
  1015.         generate failure codes.
  1016.  
  1017.  
  1018.         NanoBBS - UFO Language Documentation                    Page 17
  1019.  
  1020.  
  1021.         ═══════════════════════════════════════════════════════════════
  1022.     [totalcalls]
  1023.  
  1024.     The total number of calls to the system.
  1025.  
  1026.     ═══════════════════════════════════════════════════════════════
  1027.     [lastcaller]
  1028.  
  1029.     The username of the last person to call the BBS.
  1030.  
  1031.     ═══════════════════════════════════════════════════════════════
  1032.     [callstoday]
  1033.  
  1034.     The number of calls to the system today (including the current
  1035.     one).  A call is defined as a successful logon, and not merely a
  1036.     connection.
  1037.  
  1038.     ═══════════════════════════════════════════════════════════════
  1039.     [connectstoday]
  1040.  
  1041.     The number of connects (that may or may not have resulted in a
  1042.     logon) today.
  1043.  
  1044.     ═══════════════════════════════════════════════════════════════
  1045.     [poststoday]
  1046.  
  1047.     The number of messages that have been posted today.
  1048.  
  1049.     ═══════════════════════════════════════════════════════════════
  1050.     [ultoday]
  1051.  
  1052.     The number of files uploaded today.
  1053.  
  1054.     ═══════════════════════════════════════════════════════════════
  1055.     [dltoday]
  1056.  
  1057.     The number of files downloaded today.
  1058.  
  1059.     ═══════════════════════════════════════════════════════════════
  1060.     [batchsize]
  1061.  
  1062.     This is the total number of bytes in the download batch.  Good
  1063.     for reminding users when they are pigging out on files.
  1064.  
  1065.     ═══════════════════════════════════════════════════════════════
  1066.     [comport]
  1067.  
  1068.     This is the current comm port.    If you are using COM1 it will
  1069.     contain 1.
  1070.  
  1071.     ═══════════════════════════════════════════════════════════════
  1072.     [time12]
  1073.  
  1074.     This is the current time in 12-hour format without seconds.  It
  1075.     should be used with the [clock_ampm] keyword to create a proper
  1076.     12-hour time of day.
  1077.  
  1078.         NanoBBS - UFO Language Documentation                    Page 18
  1079.  
  1080.  
  1081.         ═══════════════════════════════════════════════════════════════
  1082.     [time12s]
  1083.  
  1084.     This is the current time in 12-hour format with seconds.  It
  1085.     should be used with the [clock_ampm] keyword to create a proper
  1086.     12-hour time of day.
  1087.  
  1088.     ═══════════════════════════════════════════════════════════════
  1089.     [time24]
  1090.  
  1091.     This is the current time in 24-hour format without seconds.
  1092.  
  1093.     ═══════════════════════════════════════════════════════════════
  1094.     [time24s]
  1095.  
  1096.     This is the current time in 24-hour format with seconds.
  1097.  
  1098.     ═══════════════════════════════════════════════════════════════
  1099.     [clock_ampm]
  1100.  
  1101.     This is either am or pm, depending on the time of day.
  1102.  
  1103.     ═══════════════════════════════════════════════════════════════
  1104.     [clock_hour24]
  1105.  
  1106.     This is the hour, in 24-hour time, of the current time of day.
  1107.     Think of it as what the little hand on your 24-hour military
  1108.     clock is pointing to.
  1109.  
  1110.     ═══════════════════════════════════════════════════════════════
  1111.     [clock_hour12]
  1112.  
  1113.     This is the hour of the current time of day.  Think of it as
  1114.         what the little hand on the clock points to.
  1115.  
  1116.     ═══════════════════════════════════════════════════════════════
  1117.     [clock_minute]
  1118.  
  1119.     This is the minute of the current time of day.    Think of it as
  1120.         what the big hand points to.
  1121.  
  1122.     ═══════════════════════════════════════════════════════════════
  1123.     [clock_second]
  1124.  
  1125.     This is the second of the current time of day.    Picture it as
  1126.         the number that the thin red hand on the clock points to.
  1127.  
  1128.     ═══════════════════════════════════════════════════════════════
  1129.     [clock_sectoday]
  1130.  
  1131.     This is the number of seconds since midnight today.  This is
  1132.     considerably faster than [sec70] and should be preferred when
  1133.     building strange time formats.
  1134.  
  1135.  
  1136.  
  1137.  
  1138.         NanoBBS - UFO Language Documentation                    Page 19
  1139.  
  1140.  
  1141.         ═══════════════════════════════════════════════════════════════
  1142.     [sec70]
  1143.  
  1144.     This is the number of seconds since 00:00 January 1, 1970.
  1145.     Peace, mun.  Use this as a novelty or to create really weird
  1146.     date formats!
  1147.  
  1148.     ═══════════════════════════════════════════════════════════════
  1149.     [online_hour]
  1150.  
  1151.     This is the number of hours a user has been online.
  1152.  
  1153.     ═══════════════════════════════════════════════════════════════
  1154.     [online_hourp]
  1155.  
  1156.     This is a zero-padded two-digit number of hours the user has
  1157.     been online.
  1158.  
  1159.     ═══════════════════════════════════════════════════════════════
  1160.     [online_minutes]
  1161.  
  1162.     The number of minutes the user has been online.
  1163.  
  1164.     ═══════════════════════════════════════════════════════════════
  1165.     [online_minutesp]
  1166.  
  1167.     The zero-padded number of minutes the user has been online.
  1168.  
  1169.     ═══════════════════════════════════════════════════════════════
  1170.     [online_seconds]
  1171.  
  1172.     The number of seconds the user has been online.
  1173.  
  1174.     ═══════════════════════════════════════════════════════════════
  1175.     [online_secondsp]
  1176.  
  1177.     The number of seconds the user has been online.  Zero-padded.
  1178.  
  1179.     ═══════════════════════════════════════════════════════════════
  1180.     [online_minpart]
  1181.  
  1182.     The minute part of an H:M:S format of the amount of time the
  1183.     user has been online this call.
  1184.  
  1185.     ═══════════════════════════════════════════════════════════════
  1186.     [online_minpartp]
  1187.  
  1188.     The same as [online_minpart] except that it is zero-padded.
  1189.  
  1190.     ═══════════════════════════════════════════════════════════════
  1191.     [online_secpart]
  1192.  
  1193.     The seconds part of an H:M:S format of the amount of time the
  1194.     user has been online this call.
  1195.  
  1196.  
  1197.  
  1198.         NanoBBS - UFO Language Documentation                    Page 20
  1199.  
  1200.  
  1201.         ═══════════════════════════════════════════════════════════════
  1202.     [online_secpartp]
  1203.  
  1204.     The same as [online_secpart] except that it is zero-padded.
  1205.  
  1206.     ═══════════════════════════════════════════════════════════════
  1207.     [timeonline]
  1208.  
  1209.     The amount of time the user has been online this call.
  1210.     Displayed in HH:MM:SS format for convenience.
  1211.  
  1212.     ═══════════════════════════════════════════════════════════════
  1213.         [timeleft]
  1214.  
  1215.         The amount of time the user has remaining for this call, in
  1216.         seconds.  This is a read-write noun, so you can change the
  1217.         user's remaining time by writing to this noun.
  1218.  
  1219.         Examples:
  1220.  
  1221.         [add 300 timeleft]
  1222.         [copy timeleft 300]
  1223.  
  1224.         The first example adds 5 minutes to the user's time limit, and
  1225.         the second example actually sets the time limit to 5 minutes.
  1226.  
  1227.         ═══════════════════════════════════════════════════════════════
  1228.     [cal_century]
  1229.  
  1230.     The century, 19 or 20.
  1231.  
  1232.     ═══════════════════════════════════════════════════════════════
  1233.     [cal_year]
  1234.  
  1235.     The year without the century, 00..99
  1236.  
  1237.     ═══════════════════════════════════════════════════════════════
  1238.     [cal_month#p]
  1239.  
  1240.     The month in numerical format with zero padding
  1241.  
  1242.     ═══════════════════════════════════════════════════════════════
  1243.     [cal_month#]
  1244.  
  1245.     The month in numerical format, no padding
  1246.  
  1247.     ═══════════════════════════════════════════════════════════════
  1248.     [cal_month]
  1249.  
  1250.     The month in longhand text, e.g. AUGUST
  1251.  
  1252.     ═══════════════════════════════════════════════════════════════
  1253.     [cal_monthabbr]
  1254.  
  1255.     The month in shorthand text, e.g. AUG
  1256.  
  1257.  
  1258.         NanoBBS - UFO Language Documentation                    Page 21
  1259.  
  1260.  
  1261.         ═══════════════════════════════════════════════════════════════
  1262.     [cal_datep]
  1263.  
  1264.     The date in numerical format with zero padding
  1265.  
  1266.     ═══════════════════════════════════════════════════════════════
  1267.     [cal_date]
  1268.  
  1269.     The date in numerical format, no padding
  1270.  
  1271.     ═══════════════════════════════════════════════════════════════
  1272.     [cal_datesuffix]
  1273.  
  1274.     The ordinal suffix of the date, i.e. st, nd, rd, th.
  1275.  
  1276.     ═══════════════════════════════════════════════════════════════
  1277.     [cal_dotw]
  1278.  
  1279.     The day of the week, e.g. WEDNESDAY
  1280.  
  1281.     ═══════════════════════════════════════════════════════════════
  1282.     [cal_dotwabbr]
  1283.  
  1284.     The day of the week in shorthand, e.g. WED
  1285.  
  1286.     ═══════════════════════════════════════════════════════════════
  1287.     [batchcount]
  1288.  
  1289.     This is the number of files in the download batch.
  1290.  
  1291.     ═══════════════════════════════════════════════════════════════
  1292.     [task]
  1293.  
  1294.     This is the node (or task) number as defined in the config file.
  1295.  
  1296.     ═══════════════════════════════════════════════════════════════
  1297.     [nup]
  1298.  
  1299.     This is the New User password.    Best not to display it.
  1300.  
  1301.     ═══════════════════════════════════════════════════════════════
  1302.     [syspass]
  1303.  
  1304.     This is the system password.  Best not to display it.
  1305.  
  1306.     ═══════════════════════════════════════════════════════════════
  1307.     [timedate]
  1308.  
  1309.     This is a nice generic time and date in 24 hour format with
  1310.     seconds and a YY-MM-DD date.  Good for logging things to
  1311.     questionnaire response files.
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.         NanoBBS - UFO Language Documentation                    Page 22
  1319.  
  1320.  
  1321.         ═══════════════════════════════════════════════════════════════
  1322.     [day70]
  1323.  
  1324.     This is the number of days since January 1, 1970.  Use this with
  1325.     the calendar adjectives to create dates in any format!
  1326.  
  1327.     ═══════════════════════════════════════════════════════════════
  1328.     [udate]
  1329.  
  1330.     This is the time and date in a format consistent with RFC-1036.
  1331.  
  1332.         ═══════════════════════════════════════════════════════════════
  1333.         [daysleft]
  1334.  
  1335.         This is the number of days remaining until the user's account
  1336.         expires.
  1337.  
  1338.  
  1339.  
  1340.  
  1341.  
  1342.  
  1343.  
  1344.  
  1345.  
  1346.  
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352.  
  1353.  
  1354.  
  1355.  
  1356.  
  1357.  
  1358.  
  1359.  
  1360.  
  1361.  
  1362.  
  1363.  
  1364.  
  1365.  
  1366.  
  1367.  
  1368.  
  1369.  
  1370.  
  1371.  
  1372.  
  1373.  
  1374.  
  1375.  
  1376.  
  1377.  
  1378.         NanoBBS - UFO Language Documentation                    Page 23
  1379.  
  1380.  
  1381.        ╔════════════════════════════════════════════════════════════════════╗
  1382.        ║                                    ║
  1383.        ║                                    ║
  1384.        ║                Verbs                    ║
  1385.        ║                                    ║
  1386.        ║                                    ║
  1387.        ╚════════════════════════════════════════════════════════════════════╝
  1388.  
  1389.     ═══════════════════════════════════════════════════════════════
  1390.     [random {noun1} {noun2}]
  1391.  
  1392.     Place a random number between 1 and {noun1} into {noun2}
  1393.  
  1394.         Here is an example which gives the user a sort of Instant Time
  1395.         Lottery:
  1396.  
  1397.                 [random 100 timeleft]
  1398.  
  1399.     ═══════════════════════════════════════════════════════════════
  1400.     [bumpcalls]
  1401.  
  1402.         Increments the number of calls to the system.  This keyword has
  1403.         no parameters.
  1404.  
  1405.     ═══════════════════════════════════════════════════════════════
  1406.     [loguser {noun1} {noun2}]
  1407.  
  1408.     Logs user to system.  User name or real name is in {noun1},
  1409.     password is in {noun2}.  Failurecodes: 0=OK, 1=bad pass, 2=user
  1410.     not found.
  1411.  
  1412.         ═══════════════════════════════════════════════════════════════
  1413.         [trashcan {username}]
  1414.  
  1415.         This runs the specified username through the trashcan filter -
  1416.         if it is found there, the user is logged off.  Needless to say
  1417.         it would be kind of stupid to set this to a constant.
  1418.  
  1419.     ═══════════════════════════════════════════════════════════════
  1420.     [updateuser]
  1421.  
  1422.     This rewrites the user's record.  If we are working with an
  1423.     object user, the object user is rewritten instead.
  1424.  
  1425.         ═══════════════════════════════════════════════════════════════
  1426.     [delay {noun}]
  1427.  
  1428.     This waits for {noun} milliseconds.  This has a 10 millisecond
  1429.     resolution.
  1430.  
  1431.     ═══════════════════════════════════════════════════════════════
  1432.     [updatelastread]
  1433.  
  1434.     This updates the user's lastread pointer for the current area.
  1435.     Unnecessary for changing area as the area change code does this
  1436.     for you.
  1437.  
  1438.         NanoBBS - UFO Language Documentation                    Page 24
  1439.  
  1440.  
  1441.         ═══════════════════════════════════════════════════════════════
  1442.     [makesemaphore {noun}]
  1443.  
  1444.     This writes a semaphore (a zero-byte file intended to indicate a
  1445.     condition with its presence) with the filename specified in
  1446.     {noun}
  1447.  
  1448.  
  1449.         ═══════════════════════════════════════════════════════════════
  1450.         [getfilesize {filename} {destination}]
  1451.  
  1452.         This gets the size, in bytes, of the file specified in
  1453.         {filename} and places this value in {destination}.
  1454.  
  1455.         ═══════════════════════════════════════════════════════════════
  1456.         [append {filename} {textstring}]
  1457.  
  1458.         This appends the contents of {textstring} to the text file
  1459.         specified in the {filename}.  If the file does not exist it is
  1460.         created first.
  1461.  
  1462.         ═══════════════════════════════════════════════════════════════
  1463.         [appendcr {filename} {textstring}]
  1464.  
  1465.         This is identical to the [append] keyword, except that it
  1466.         automatically appends a carriage return and linefeed to the file
  1467.         after it has written the {textstring}.
  1468.  
  1469.         ═══════════════════════════════════════════════════════════════
  1470.         [readln {filename} {line_number} {destination_noun}]
  1471.  
  1472.         This opens a text file specified by {filename} and reads the
  1473.         line of text specified by {line_number} (first line is line 1)
  1474.         into the {destination_noun}.  This powerful keyword, in concert
  1475.         with other keywords which write and delete text files, can be
  1476.         used to create complex ASCII-based databases of nearly any size
  1477.         and format.
  1478.  
  1479.         ═══════════════════════════════════════════════════════════════
  1480.         [delete {filename}]
  1481.  
  1482.         This deletes the file specified in {filename}.
  1483.  
  1484.         ═══════════════════════════════════════════════════════════════
  1485.         [getfiletime {filename} {destination}]
  1486.  
  1487.         This gets the time and date, in Sec70 format, of the file
  1488.         specified in {filename} and places this value in {destination}.
  1489.         If the file does not exist, it will return 0.
  1490.  
  1491.         ═══════════════════════════════════════════════════════════════
  1492.         [logtime {noun}]
  1493.  
  1494.         This makes a log entry in NANOBBS.LOG with the contents of
  1495.         {noun}.
  1496.  
  1497.         NanoBBS - UFO Language Documentation                    Page 25
  1498.  
  1499.  
  1500.         ═══════════════════════════════════════════════════════════════
  1501.         [blank {noun}]
  1502.  
  1503.         This quickly and cheaply blanks out the specified noun.
  1504.  
  1505.         ═══════════════════════════════════════════════════════════════
  1506.         [getchr {noun}]
  1507.  
  1508.         This waits for, then gets, a character of input from the user.
  1509.         The result is placed in the {noun}.
  1510.  
  1511.     ═══════════════════════════════════════════════════════════════
  1512.     [getln {noun}]
  1513.  
  1514.     This receives a line of input from the user and stores it to a
  1515.     noun, typically a variable.
  1516.  
  1517.         ═══════════════════════════════════════════════════════════════
  1518.     [keyfilter {noun}]
  1519.  
  1520.     This is used before a [getchr] keyword to limit input to only
  1521.     the characters in {noun}.  It is a direct synonym of [menu].
  1522.  
  1523.     ═══════════════════════════════════════════════════════════════
  1524.     [copy {dest} {src}]
  1525.  
  1526.     Simply copies the contents of the source noun into the
  1527.     destination noun.  This will not work if the destination noun is
  1528.     read-only.  This is good for assigning constants to variables
  1529.     for looping, etcetera.
  1530.  
  1531.  
  1532.         ═══════════════════════════════════════════════════════════════
  1533.         [echochar {echo_ascii}]
  1534.  
  1535.         This changes the echo character.  This is useful for hiding user
  1536.         input when entering passwords, etc.
  1537.  
  1538.         The {echo_ascii} noun should contain a decimal number from 0 to
  1539.         255; it represents the ASCII code to send in place of each
  1540.         character typed. Alternatively, you can place the word ECHO in
  1541.         the noun and it will cause NanoBBS to echo all user input
  1542.         normally, or NOECHO which will cause no user input to be fed
  1543.         back to the user.  The values 11 and 23 are synonymous with ECHO
  1544.         and NOECHO respectively.
  1545.  
  1546.         ═══════════════════════════════════════════════════════════════
  1547.         [goto {label}]
  1548.  
  1549.         This jumps to a location in the .UFO file indicated by the
  1550.         {label}.  If there is no such label the keyword is ignored.  The
  1551.         label is a two-character string and should NOT be
  1552.         contained in quotes like other text constants.  You cannot
  1553.         substitute a noun for the label.
  1554.  
  1555.  
  1556.  
  1557.  
  1558.         NanoBBS - UFO Language Documentation                    Page 26
  1559.  
  1560.  
  1561.         ═══════════════════════════════════════════════════════════════
  1562.         [label {label}]
  1563.  
  1564.         This defines a label for later use by a [goto] keyword.  The
  1565.         label must be two characters long and should NOT be contained in
  1566.         quotes like other text constants.  You cannot substitute a noune
  1567.         for the label.
  1568.  
  1569.         ═══════════════════════════════════════════════════════════════
  1570.         [iffail {failurecode}]
  1571.  
  1572.         This will continue processing if the failure code returned by
  1573.         the last operation (that generates failure codes) is the same as
  1574.         that specified in the parameter.  If the failure code and the
  1575.         parameter differ, UFO will branch to the next [mark] keyword.
  1576.  
  1577.         ═══════════════════════════════════════════════════════════════
  1578.     [mark]
  1579.  
  1580.         The [mark] is where most conditionals "branch" to upon failure.
  1581.         When encountered by itself it is ignored by NanoBBS, but many
  1582.         keywords will skip ahead in the UFO file until they encounter a
  1583.         [mark].  Example:
  1584.  
  1585.                 [iflt useraccess 100]You don't have enough access!
  1586.                 [quit][mark]You have enough access!
  1587.  
  1588.         This example will display "You don't have enough access!" and
  1589.         exit the UFO file if the user's access is less than 100,
  1590.         otherwise it will skip to the [mark] and display "You have
  1591.         enough access!".
  1592.  
  1593.         ═══════════════════════════════════════════════════════════════
  1594.         [sendx]
  1595.  
  1596.         This sends (download to user) the contents of the download
  1597.         batch using the Xmodem-CRC protocol.
  1598.  
  1599.         ═══════════════════════════════════════════════════════════════
  1600.         [sendy]
  1601.  
  1602.         This sends the contents of the download batch using the
  1603.         Xmodem-1k (sometimes erroneously called Ymodem) protocol.
  1604.  
  1605.         ═══════════════════════════════════════════════════════════════
  1606.         [sendz]
  1607.  
  1608.         This sends the contents of the download batch using the
  1609.         Zmodem protocol.
  1610.  
  1611.         ═══════════════════════════════════════════════════════════════
  1612.         [sends]
  1613.  
  1614.         This sends the contents of the download batch using the SEAlink
  1615.         protocol.
  1616.  
  1617.  
  1618.         NanoBBS - UFO Language Documentation                    Page 27
  1619.  
  1620.  
  1621.         ═══════════════════════════════════════════════════════════════
  1622.         [sendg]
  1623.  
  1624.         This sends the contents of the download batch using the Ymodem-G
  1625.         protocol.
  1626.  
  1627.         ═══════════════════════════════════════════════════════════════
  1628.         [sendb]
  1629.  
  1630.         This sends the contents of the download batch using the Ymodem
  1631.         Batch protocol.
  1632.  
  1633.         ═══════════════════════════════════════════════════════════════
  1634.         [senda]
  1635.  
  1636.         This sends the contents of the download batch using the ASCII
  1637.         protocol, with "more" prompting.  Yes, it is possible to send a
  1638.         batch of ASCII files.
  1639.  
  1640.         ═══════════════════════════════════════════════════════════════
  1641.         [recvx]
  1642.  
  1643.         This receives a file using the Xmodem protocol.  The path and
  1644.         filename should previously have been added to the batch.  The
  1645.         file will be saved to the "Upload" directory of the current file
  1646.         area.
  1647.  
  1648.         ═══════════════════════════════════════════════════════════════
  1649.         [recvy]
  1650.  
  1651.         This receives a file using the Xmodem-1k (sometimes erroneously
  1652.         called Ymodem) protocol.  The file is saved to the "Upload"
  1653.         directory of the current file area.
  1654.  
  1655.         ═══════════════════════════════════════════════════════════════
  1656.         [recvz]
  1657.  
  1658.         This receives one or more files using the Zmodem protocol.  The
  1659.         files are saved to the "Upload" directory of the current file
  1660.         area.
  1661.  
  1662.         ═══════════════════════════════════════════════════════════════
  1663.         [recvs]
  1664.  
  1665.         This receives one or more files using the SEAlink protocol.  The
  1666.         files are saved to the "Upload" directory of the current file
  1667.         area.
  1668.  
  1669.         ═══════════════════════════════════════════════════════════════
  1670.         [recvb]
  1671.  
  1672.         This receives one or more files using the Ymodem Batch protocol.
  1673.         The files are saved to the "Upload" directory of the current
  1674.         file area.
  1675.  
  1676.  
  1677.  
  1678.         NanoBBS - UFO Language Documentation                    Page 28
  1679.  
  1680.  
  1681.         ═══════════════════════════════════════════════════════════════
  1682.         [recvg]
  1683.  
  1684.         This receives one or more files using the Ymodem-G protocol.
  1685.         The files are saved to the "Upload" directory of the current
  1686.         file area.
  1687.  
  1688.         ═══════════════════════════════════════════════════════════════
  1689.     [loadobjectuser {noun}]
  1690.  
  1691.     This will load the user record whose username or realname is in
  1692.         the {noun}.  The user is loaded into the "object" record.  This
  1693.         is an auxiliary user record which can contain any user's record
  1694.         regardless of who's logged on.  This way you can set up scripts
  1695.         to compare and modify other users in relation to the user who's
  1696.         logged on.
  1697.  
  1698.     ═══════════════════════════════════════════════════════════════
  1699.     [useobjectuser]
  1700.  
  1701.     Once an object user is selected, most verbs and nouns that
  1702.     operate on the user can be made to operate on the object user
  1703.     instead by using this keywords.  Subsequent user operations will
  1704.     work on the object user until a [usethisuser] keyword is
  1705.     encountered.
  1706.  
  1707.     ═══════════════════════════════════════════════════════════════
  1708.     [usethisuser]
  1709.  
  1710.     This returns user operations to the user who is actually logged
  1711.         on.  Make sure to use this keyword immediately after you're
  1712.         finished working with an object user!
  1713.  
  1714.     ═══════════════════════════════════════════════════════════════
  1715.     [returnuser {noun1}{noun2}]
  1716.  
  1717.     This searches for the user whose username or realname is in
  1718.     {noun1} and places the user's user number in {noun2}
  1719.  
  1720.         ═══════════════════════════════════════════════════════════════
  1721.         [adduser]
  1722.  
  1723.         This adds the current user to the end of the user file, or to
  1724.         the first available position within the user file.  BE CAREFUL,
  1725.         this keyword makes a BIG assumption: that the user is not
  1726.         already in the user file (which is true if the user is logging
  1727.         on for the first time).
  1728.  
  1729.         ═══════════════════════════════════════════════════════════════
  1730.     [concatenate {noun1}{noun2}{noun3}]
  1731.  
  1732.     This concatenates {noun1} and {noun2}, and stores the result
  1733.     in {noun3}.
  1734.  
  1735.  
  1736.  
  1737.  
  1738.         NanoBBS - UFO Language Documentation                    Page 29
  1739.  
  1740.  
  1741.         ═══════════════════════════════════════════════════════════════
  1742.     [display {noun}]
  1743.  
  1744.     This is a somewhat redundant noun.  It will display the {noun}.
  1745.     A noun by itself (with no verb) generates the same compiled
  1746.     token as the noun displayed with this keyword.
  1747.  
  1748.         ═══════════════════════════════════════════════════════════════
  1749.         [smartcr {column}]
  1750.  
  1751.         This keyword does a new-line if the current cursor position is
  1752.         at the {column} or beyond.
  1753.  
  1754.         Example:
  1755.  
  1756.         [smartcr 40]
  1757.  
  1758.         This would do a new-line if the cursor is at column 42, but not
  1759.         if the cursor is at column 35.
  1760.  
  1761.         ═══════════════════════════════════════════════════════════════
  1762.         [x_cr]
  1763.  
  1764.         This does a carriage return if and only if the cursor is not
  1765.         already at the leftmost column.  It is the same as the embedded
  1766.         ~, (tilde comma) command, and in fact that is what this keyword
  1767.         compiles into!
  1768.  
  1769.         ═══════════════════════════════════════════════════════════════
  1770.         [smartwrap {noun}]
  1771.  
  1772.         This is a particularly nifty keyword which "smart wraps" the
  1773.         noun; that is, it displays the noun but word-wraps it and starts
  1774.         the next line at the starting columns from which this keyword
  1775.         was executed.  A version of this is used to display the file
  1776.         descriptions.  Of course, this noun is best used for nouns which
  1777.         contain text, but I can see applications for one-word or
  1778.         numerical nouns in this keyword.
  1779.  
  1780.         ═══════════════════════════════════════════════════════════════
  1781.         [skipline]
  1782.  
  1783.         This simply skips the rest of the current line and goes to the
  1784.         next line.
  1785.  
  1786.     ═══════════════════════════════════════════════════════════════
  1787.     [ansi3d {noun}]
  1788.  
  1789.     Displays the noun in a 3-D boilerplate effect which is one of my
  1790.     personal favourites.
  1791.  
  1792.     ═══════════════════════════════════════════════════════════════
  1793.     [pad3d {noun}]
  1794.  
  1795.     Displays the noun in a 3-D effect as in [ansi3d] but tidies it
  1796.     up a bit with space padding on either side of the noun.
  1797.  
  1798.         NanoBBS - UFO Language Documentation                    Page 30
  1799.  
  1800.  
  1801.         ═══════════════════════════════════════════════════════════════
  1802.     [link {noun}]
  1803.  
  1804.     This will link to the UFO file specified in {noun}.  This is
  1805.     like a GOSUB.  Upon exit from the linked file, UFO returns to
  1806.     the original (calling) file.
  1807.  
  1808.         ═══════════════════════════════════════════════════════════════
  1809.         [msgselect {msg}]
  1810.  
  1811.         This selects a message within the current message area.  The
  1812.         {msg} parameter can specify a message number, or it can be +
  1813.         or NEXT (no quotes) for the next available message, or - or PREV
  1814.         for the previous message.
  1815.  
  1816.         ═══════════════════════════════════════════════════════════════
  1817.         [msgarea {area}]
  1818.  
  1819.         This selects a new message area.  The {area} parameter can
  1820.         specify an area number, or it can be + or NEXT (no quotes) for
  1821.         the next allowed message area, or - or PREV for the previous
  1822.         allowed message area.  If an area number is specified and the
  1823.         area does not exist or the user is not allowed to change to the
  1824.         area, the keyword does nothing.
  1825.  
  1826.         ═══════════════════════════════════════════════════════════════
  1827.         [xtern_shell {program} {parameters}]
  1828.  
  1829.         This shells out of NanoBBS and executes the {program} with
  1830.         the command line parameters specified in {parameters}.  It
  1831.         first swaps NanoBBS out to EMS or disk if possible.
  1832.  
  1833.         ═══════════════════════════════════════════════════════════════
  1834.         [xtern_erlvl {errorlevel}]
  1835.  
  1836.         This exits NanoBBS entirely with the specified errorlevel.
  1837.         Unfortunately, as of this version it's (still) a one way trip...
  1838.  
  1839.         ═══════════════════════════════════════════════════════════════
  1840.         [dorinfo {node} {path}]
  1841.  
  1842.         This writes a DORINFO1.DEF compatible file to the specified
  1843.         {path}.  You can specify any node, and it will use the NanoBBS
  1844.         DorinfoX.Def method of naming, e.g. DORINFO2.DEF, DORINF25.DEF,
  1845.         DORIN117.DEF etc.
  1846.  
  1847.         To force the file to always be named DORINFO1.DEF, simply
  1848.         specify a constant 1 for the node number, e.g.
  1849.  
  1850.                 [dorinfo 1 c:\bbs\doors]
  1851.  
  1852.         To use the DorinfoX.Def method with the current node number,
  1853.         simply use the [task] noun, e.g.
  1854.  
  1855.                 [dorinfo task c:\bbs\doors]
  1856.  
  1857.  
  1858.         NanoBBS - UFO Language Documentation                    Page 31
  1859.  
  1860.  
  1861.         ═══════════════════════════════════════════════════════════════
  1862.         [doorsys {node} {path}]
  1863.  
  1864.         This writes a DOOR.SYS file to the specified {path}.  You can
  1865.         specify any node.  Unlike the [dorinfo] verb, the node you
  1866.         specify has no effect on the filename - it is always DOOR.SYS.
  1867.         However, the node number is a field within the DOOR.SYS file and
  1868.         is used there.
  1869.  
  1870.         To force the file to always use node 1, simply specify a
  1871.         constant 1 for the node number, e.g.
  1872.  
  1873.                 [doorsys 1 c:\bbs\doors]
  1874.  
  1875.         To use the current node number, simply use the [task] noun, e.g.
  1876.  
  1877.                 [doorsys task c:\bbs\doors]
  1878.  
  1879.         ═══════════════════════════════════════════════════════════════
  1880.         [filearea {area}]
  1881.  
  1882.         This selects a new file area.  The {area} parameter can specify
  1883.         an area number, or it can be + or NEXT (no quotes) for the next
  1884.         allowed file area, or - or PREV for the previous allowed file
  1885.         area.  If an area number is specified and the area does not
  1886.         exist or the user is not allowed to change to the area, the
  1887.         keyword does nothing.
  1888.  
  1889.         ═══════════════════════════════════════════════════════════════
  1890.         [existfile {filename}]
  1891.  
  1892.         If the specified filename does not exist, then this keyword
  1893.         skips to the next [mark], otherwise it continues processing as
  1894.         if nothing happened.
  1895.  
  1896.         ═══════════════════════════════════════════════════════════════
  1897.         [strippath {source} {destination}]
  1898.  
  1899.         This assumes that the {source} contains a pathed filename and
  1900.         strips the path from it, leaving only the filename in the
  1901.         {destination} noun.
  1902.  
  1903.         ═══════════════════════════════════════════════════════════════
  1904.         [msgtext]
  1905.  
  1906.         This causes the message body of the current message to be
  1907.         displayed.
  1908.  
  1909.     ═══════════════════════════════════════════════════════════════
  1910.     [mininput {noun}]
  1911.  
  1912.     Sets the minimum input length of the next [getln] keyword.  This
  1913.     means that the user will not be allowed to hit Enter until s/he
  1914.     has typed at least the specified number of characters.
  1915.  
  1916.  
  1917.  
  1918.         NanoBBS - UFO Language Documentation                    Page 32
  1919.  
  1920.  
  1921.         ═══════════════════════════════════════════════════════════════
  1922.     [maxinput {noun}]
  1923.  
  1924.     Sets the maximum input length of the next [getln] keyword.
  1925.  
  1926.     ═══════════════════════════════════════════════════════════════
  1927.     [quit]
  1928.  
  1929.     Exits the current UFO file immediately
  1930.  
  1931.     ═══════════════════════════════════════════════════════════════
  1932.     [hangup]
  1933.  
  1934.     Hangs up on the user immediately
  1935.  
  1936.     ═══════════════════════════════════════════════════════════════
  1937.     [fastlogoff]
  1938.  
  1939.     This is the same as [hangup] except that it's a little less
  1940.     impolite about it.  This is what happens when a user hits ^G at
  1941.     the canned main menu.
  1942.  
  1943.     ═══════════════════════════════════════════════════════════════
  1944.     [ansi_on]
  1945.  
  1946.     Turns ANSi colours on.
  1947.  
  1948.     ═══════════════════════════════════════════════════════════════
  1949.     [ansi_off]
  1950.  
  1951.     Turns ANSi colours off.
  1952.  
  1953.     ═══════════════════════════════════════════════════════════════
  1954.     [cleol]
  1955.  
  1956.     Clears to end of line
  1957.  
  1958.     ═══════════════════════════════════════════════════════════════
  1959.     [cls]
  1960.  
  1961.     Clears the screen
  1962.  
  1963.     ═══════════════════════════════════════════════════════════════
  1964.     [save_xy]
  1965.  
  1966.     Saves the cursor position.  Basically executes an ANSi SCP
  1967.     command.
  1968.  
  1969.     ═══════════════════════════════════════════════════════════════
  1970.     [restore_xy]
  1971.  
  1972.     Restores the cursor to the saved position.  Basically executes
  1973.     an ANSi RCP command.
  1974.  
  1975.  
  1976.  
  1977.  
  1978.         NanoBBS - UFO Language Documentation                    Page 33
  1979.  
  1980.  
  1981.         ═══════════════════════════════════════════════════════════════
  1982.     [ansi_dsr]
  1983.  
  1984.     Sends an ANSi DSR (Device Status Request) to the remote modem.
  1985.  
  1986.     ═══════════════════════════════════════════════════════════════
  1987.     [ansi_autodetect]
  1988.  
  1989.     Attempts to autodetect ANSi
  1990.  
  1991.     ═══════════════════════════════════════════════════════════════
  1992.     [blink]
  1993.  
  1994.     Turns on blinking characters.
  1995.  
  1996.     ═══════════════════════════════════════════════════════════════
  1997.     [noblink]
  1998.         [steady]
  1999.  
  2000.         Turns off blinking characters.  [noblink] and [steady] are
  2001.         direct synonyms which compile into exactly the same code.
  2002.  
  2003.     ═══════════════════════════════════════════════════════════════
  2004.     [clrattr]
  2005.  
  2006.     Sets the text colour to light grey on a black background.
  2007.  
  2008.     ╔═════════════════════════════════════════════════════════════╗
  2009.     ║ COLOURS                              ║
  2010.     ║                                  ║
  2011.     ║ If used by themselves or with the FG, COLOUR, FOREGROUND    ║
  2012.         ║ keywords, these colour keywords all set the foreground      ║
  2013.     ║ colour.                              ║
  2014.     ╚═════════════════════════════════════════════════════════════╝
  2015.  
  2016.     ═══════════════════════════════════════════════════════════════
  2017.     [black]
  2018.  
  2019.     Changes colour to black.
  2020.  
  2021.     ═══════════════════════════════════════════════════════════════
  2022.     [red]
  2023.  
  2024.     Changes colour to red.
  2025.  
  2026.     ═══════════════════════════════════════════════════════════════
  2027.     [green]
  2028.  
  2029.     Changes colour to green.
  2030.  
  2031.     ═══════════════════════════════════════════════════════════════
  2032.     [brown]
  2033.  
  2034.     Changes colour to brown.
  2035.  
  2036.  
  2037.  
  2038.         NanoBBS - UFO Language Documentation                    Page 34
  2039.  
  2040.  
  2041.         ═══════════════════════════════════════════════════════════════
  2042.     [blue]
  2043.  
  2044.     Changes colour to blue.
  2045.  
  2046.     ═══════════════════════════════════════════════════════════════
  2047.     [magenta]
  2048.  
  2049.     Changes colour to magenta.
  2050.  
  2051.     ═══════════════════════════════════════════════════════════════
  2052.     [cyan]
  2053.  
  2054.     Changes colour to cyan.
  2055.  
  2056.     ═══════════════════════════════════════════════════════════════
  2057.     [gray]
  2058.  
  2059.     Changes colour to grey.
  2060.  
  2061.     ═══════════════════════════════════════════════════════════════
  2062.     [grey]
  2063.  
  2064.     Changes colour to grey (and is correctly spelled)
  2065.  
  2066.     ═══════════════════════════════════════════════════════════════
  2067.     [darkgray]
  2068.  
  2069.     Changes colour to dark grey.
  2070.  
  2071.     ═══════════════════════════════════════════════════════════════
  2072.     [darkgrey]
  2073.  
  2074.     Changes colour to dark grey.
  2075.  
  2076.     ═══════════════════════════════════════════════════════════════
  2077.     [lightred]
  2078.  
  2079.     Changes colour to light red.  Not pink.
  2080.  
  2081.     ═══════════════════════════════════════════════════════════════
  2082.     [lightgreen]
  2083.  
  2084.     Changes colour to light green.
  2085.  
  2086.     ═══════════════════════════════════════════════════════════════
  2087.     [yellow]
  2088.  
  2089.     Changes colour to yellow.
  2090.  
  2091.     ═══════════════════════════════════════════════════════════════
  2092.     [lightblue]
  2093.  
  2094.     Changes colour to light blue.
  2095.  
  2096.  
  2097.  
  2098.         NanoBBS - UFO Language Documentation                    Page 35
  2099.  
  2100.  
  2101.         ═══════════════════════════════════════════════════════════════
  2102.     [lightmagenta]
  2103.  
  2104.     Changes colour to light magenta.
  2105.  
  2106.     ═══════════════════════════════════════════════════════════════
  2107.     [lightcyan]
  2108.  
  2109.     Changes colour to light cyan.
  2110.  
  2111.     ═══════════════════════════════════════════════════════════════
  2112.     [white]
  2113.  
  2114.     Changes colour to white.
  2115.  
  2116.     ═══════════════════════════════════════════════════════════════
  2117.     [background {colour}]
  2118.  
  2119.     Sets background colour
  2120.  
  2121.     ═══════════════════════════════════════════════════════════════
  2122.     [bg {colour}]
  2123.  
  2124.     Sets background colour
  2125.  
  2126.     ═══════════════════════════════════════════════════════════════
  2127.     [on {colour}]
  2128.  
  2129.     Sets background colour
  2130.  
  2131.     ═══════════════════════════════════════════════════════════════
  2132.     [foreground {colour}]
  2133.  
  2134.         Sets foreground colour.  This keyword is redundant and is
  2135.     included for syntactical purists only.
  2136.  
  2137.     ═══════════════════════════════════════════════════════════════
  2138.     [fg {colour}]
  2139.  
  2140.         Sets foreground colour.  This keyword is redundant and is
  2141.     included for syntactical purists only.
  2142.  
  2143.     ═══════════════════════════════════════════════════════════════
  2144.     [color {colour}]
  2145.  
  2146.         Sets foreground colour.  This keyword is redundant and is
  2147.     included for syntactical purists only.
  2148.  
  2149.     ═══════════════════════════════════════════════════════════════
  2150.     [colour {colour}]
  2151.  
  2152.         Sets foreground colour.  This keyword is redundant and is
  2153.     included for syntactical purists only.
  2154.  
  2155.  
  2156.  
  2157.  
  2158.         NanoBBS - UFO Language Documentation                    Page 36
  2159.  
  2160.  
  2161.         ═══════════════════════════════════════════════════════════════
  2162.     [cursor_up]
  2163.  
  2164.     Moves the cursor up one line (if allowed).
  2165.  
  2166.     ═══════════════════════════════════════════════════════════════
  2167.     [cursor_down]
  2168.  
  2169.     Moves the cursor down one line (if allowed).
  2170.  
  2171.     ═══════════════════════════════════════════════════════════════
  2172.     [cursor_left]
  2173.  
  2174.     Moves the cursor left one column (if allowed).    A backspace
  2175.     would be enormously faster if you can get away with it.
  2176.  
  2177.     ═══════════════════════════════════════════════════════════════
  2178.     [cursor_right]
  2179.  
  2180.     Moves the cursor right one column (if allowed).  A space would
  2181.     be enormously faster if you can get away with it.
  2182.  
  2183.     ═══════════════════════════════════════════════════════════════
  2184.     [cursor_up# {noun}]
  2185.  
  2186.     Moves the cursor up {noun} lines (if allowed).
  2187.  
  2188.     ═══════════════════════════════════════════════════════════════
  2189.     [cursor_down# {noun}]
  2190.  
  2191.     Moves the cursor down {noun} lines (if allowed).
  2192.  
  2193.     ═══════════════════════════════════════════════════════════════
  2194.     [cursor_left# {noun}]
  2195.  
  2196.     Moves the cursor left {noun} columns (if allowed).  A bunch of
  2197.     backspaces would be better if you know how many.
  2198.  
  2199.     ═══════════════════════════════════════════════════════════════
  2200.     [cursor_right# {noun}]
  2201.  
  2202.     Moves the cursor right {noun} columns (if allowed).  A bunch of
  2203.     spaces would be better if you know how many.
  2204.  
  2205.     ═══════════════════════════════════════════════════════════════
  2206.     [cursor_pos {noun1} {noun2}]
  2207.  
  2208.     Moves the cursor to {noun1},{noun2} where {noun1} is the column
  2209.     and {noun2} is the line.
  2210.  
  2211.     ═══════════════════════════════════════════════════════════════
  2212.  
  2213.  
  2214.  
  2215.  
  2216.  
  2217.  
  2218.         NanoBBS - UFO Language Documentation                    Page 37
  2219.  
  2220.  
  2221.         ╔═════════════════════════════════════════════════════════════╗
  2222.     ║ UFO supports most of the RIPscrip protocol.              ║
  2223.     ║                                  ║
  2224.     ║ UFO RIPscrip keywords allow any noun to be passed as a      ║
  2225.     ║ parameter.  The usual rules of noun syntax apply; numeric   ║
  2226.     ║ constants need no quotes but text constants including       ║
  2227.     ║ filenames are required to be enclosed in quotes.          ║
  2228.     ╚═════════════════════════════════════════════════════════════╝
  2229.     ═══════════════════════════════════════════════════════════════
  2230.     [rip_text_window {x0} {y0} {x1} {y1} {wrap} {size}]
  2231.  
  2232.     This defines the size and other parameters of the text window.
  2233.     This is a window in which plain text (ASCII and ANSI) is
  2234.     displayed, and it is usually smaller than the whole screen,
  2235.     which can display graphics.
  2236.  
  2237.     {x0} and {y0} define the absolute top left corner of the text
  2238.     window, and {x1} and {y1} define the lower right corner.  These
  2239.     are absolute character co-ordinates as if the text window were
  2240.     full-screen.
  2241.  
  2242.     {wrap} simply indicates whether text in the window should wrap
  2243.     when the right edge of the window is reached.  This can be YES
  2244.     or NO.    If YES, text will wrap as expected in a normal ASCII
  2245.     terminal, otherwise the cursor will stay at the rightmost edge
  2246.     until a newline (cr+lf) is encountered.  Normally {wrap} ought
  2247.     to be YES.
  2248.  
  2249.     {size} defines the character size of the text window.  There are
  2250.     five possible combinations.
  2251.  
  2252.         ╔══════╤═══════╤═════════╤═══════╗
  2253.         ║ Size │ Font  │   Max   │    Max  ║
  2254.         ║ Code │ Size  │ Columns │ Lines ║
  2255.         ╟──────┼───────┼─────────┼───────╢
  2256.         ║    0  │ 8x8   │   80    │    43   ║
  2257.         ║    1  │ 7x8   │   91    │    43   ║
  2258.         ║    2  │ 8x14  │   80    │    25   ║
  2259.         ║    3  │ 7x14  │   91    │    25   ║
  2260.         ║    4  │ 16x14 │   40    │    25   ║
  2261.         ╚══════╧═══════╧═════════╧═══════╝
  2262.  
  2263.     The maximum columns and lines are zero based, meaning (for
  2264.     example) that in mode 0 you can have a minimum {x0} and {x1} of
  2265.     0 and a maximum {x0} and {x1} of 79, and so on for the other
  2266.     modes.    And part of the screen not part of the window will not
  2267.     be touched by your plain text.
  2268.  
  2269.     If you set all six parameters to 0 (including the yes/no wrap
  2270.     parameter) then plain text and non-RIP sequences will be ignored
  2271.     by the user's terminal, as if the window were shut off
  2272.     completely.
  2273.  
  2274.  
  2275.  
  2276.  
  2277.  
  2278.         NanoBBS - UFO Language Documentation                    Page 38
  2279.  
  2280.  
  2281.         ═══════════════════════════════════════════════════════════════
  2282.     [rip_viewport {x0} {y0} {x1} {y1}]
  2283.  
  2284.     This simply defines the x and y co-ordinates of the RIP graphics
  2285.     window (aka the "viewport").  All RIP graphics output is
  2286.     displayed in this window, while ASCII and ANSI plain text is
  2287.     displayed in the [rip_text_window] explained previously.  As in
  2288.         the previous keyword, {x0} and {y0} define the top left corner
  2289.     of the viewport while {x1} and {y1} define the lower right
  2290.     corner.  These co-ordinates (and all RIP graphics co-ordinates)
  2291.     are based on a 640x350 screen size, so {x0} and {x1} can be from
  2292.     0 to 639, and {y0} and {y1} can be from 0 to 349.  It should be
  2293.     noted that Ripterm uses the bottom (highest-numbered) dozen or
  2294.     so lines of the screen for a status bar and it IS possible to
  2295.     overwrite the status bar unless you shrink the viewport a bit
  2296.     first.
  2297.  
  2298.     ═══════════════════════════════════════════════════════════════
  2299.     [rip_reset_windows]
  2300.  
  2301.     This has no parameters.  It resets both the text window and the
  2302.     graphics viewport to full-screen size.    It also clears the
  2303.     screen to the currently defined background colour, removes all
  2304.     the mouse regions and erases the "clipboard."  This should be
  2305.     used before executing a non-RIP external program.
  2306.  
  2307.     ═══════════════════════════════════════════════════════════════
  2308.     [rip_erase_window]
  2309.  
  2310.     This has no parameters.  It clears the text window to the
  2311.     currently defined background colour.  This will also clear any
  2312.     part of the graphics viewport that is overlapped by the text
  2313.     window.
  2314.  
  2315.     ═══════════════════════════════════════════════════════════════
  2316.     [rip_erase_view]
  2317.  
  2318.     This has no parameters.  It clears the graphics viewport to the
  2319.     currently defined background colour.  This will also clear any
  2320.     part of the text window that is overlapped by the graphics
  2321.     viewport.
  2322.  
  2323.     ═══════════════════════════════════════════════════════════════
  2324.     [rip_gotoxy {x} {y}]
  2325.  
  2326.     This sets the position of the cursor in the text window to the
  2327.         co-ordinates specified by {x} and {y}.  These co-ordinates are
  2328.     zero-based meaning that [rip_gotoxy 0 0] is the same as homing
  2329.     the cursor.  This is important to remember since ANSI is
  2330.     one-based.
  2331.  
  2332.  
  2333.  
  2334.  
  2335.  
  2336.  
  2337.  
  2338.         NanoBBS - UFO Language Documentation                    Page 39
  2339.  
  2340.  
  2341.         ═══════════════════════════════════════════════════════════════
  2342.     [rip_home]
  2343.  
  2344.     This has no parameters.  It sets the position of the cursor in
  2345.     the text window to the upper left corner, just like an ANSI
  2346.     cursor home command.
  2347.  
  2348.     ═══════════════════════════════════════════════════════════════
  2349.     [rip_erase_eol]
  2350.  
  2351.     This has no parameters.  It clears the current text line from
  2352.     the cursor position to the rightmost edge of the text window.
  2353.     It is equivalent to an ANSI cleol command.
  2354.  
  2355.     ═══════════════════════════════════════════════════════════════
  2356.     [rip_colour {colour}]
  2357.     [rip_color {colour}]
  2358.  
  2359.         This keyword is available in both the correct and American
  2360.     spellings.
  2361.  
  2362.     This sets the current colour for both text and graphics
  2363.         keywords.  There are 16 colours to choose from.  If you are
  2364.     using the default palette, you may use the colour name (e.g.
  2365.     blue, red, magenta, yellow, etc.) instead of its palette
  2366.     position (they are synonymous).  Colour 0 is always the
  2367.     background colour, even if you have set the palette so that
  2368.     colour 0 is not black.
  2369.  
  2370.     Here is a list of the default colours (and the spellings of
  2371.     their english synonyms)
  2372.  
  2373.               ╔═════════════════╤═════════════════╗
  2374.               ║ 0   Black    │ 8  Darkgray      ║
  2375.               ║ 1   Blue    │ 9  Lightblue      ║
  2376.               ║ 2   Green    │ 10 Lightgreen   ║
  2377.               ║ 3   Cyan    │ 11 Lightcyan      ║
  2378.               ║ 4   Red     │ 12 Lightred      ║
  2379.               ║ 5   Magenta    │ 13 Lightmagenta ║
  2380.               ║ 6   Brown    │ 14 Yellow      ║
  2381.               ║ 7   Lightgray    │ 15 White      ║
  2382.               ╚═════════════════╧═════════════════╝
  2383.  
  2384.  
  2385.  
  2386.  
  2387.  
  2388.  
  2389.  
  2390.  
  2391.  
  2392.  
  2393.  
  2394.  
  2395.  
  2396.  
  2397.  
  2398.         NanoBBS - UFO Language Documentation                    Page 40
  2399.  
  2400.  
  2401.         ═══════════════════════════════════════════════════════════════
  2402.     [rip_set_palette {c0} {c1} {c2} {c3} {c4} {c5} {c6} {c7}
  2403.              {c8} {c9} {c10} {c11} {c12} {c13} {c14} {c15}]
  2404.  
  2405.         {note: this keyword does not have to be split into two lines as
  2406.     shown here.}
  2407.  
  2408.         This keyword really does require sixteen parameters!  It defines
  2409.     all sixteen colours of the palette from the 64-colour master
  2410.     palette.  Consult an EGA manual for a list of the 64 colours, or
  2411.         experiment with the keyword to see what kind of weird and
  2412.     wonderful results you can come up with!  These colours can be
  2413.     from 0 to 63.  All sixteen parameters must be present or NCOMP
  2414.         will refuse to compile this keyword (and the NanoBBS embedded
  2415.     language equivalent will give unpredictable results).
  2416.  
  2417.     ═══════════════════════════════════════════════════════════════
  2418.     [rip_one_palette {colour} {value}]
  2419.  
  2420.     This sets just one colour in the palette.  The {colour} is from
  2421.     0 to 15 and defines the palette position to be modified, and the
  2422.     {value} is from 0 to 63 and defines the EGA master palette
  2423.     colour to be assigned to the colour.
  2424.  
  2425.     ═══════════════════════════════════════════════════════════════
  2426.     [rip_write_mode {mode}]
  2427.  
  2428.         This sets the drawing mode for all graphics keywords.  {mode}
  2429.     can be either NORMAL or XOR.  In the normal mode, graphics are
  2430.     simply overwritten on existing graphics, while in XOR mode the
  2431.     graphics are written in "complementary" mode, meaning
  2432.     effectively that if you draw something in XOR mode you can erase
  2433.     it non-destructively by drawing the same thing again, also in
  2434.     XOR mode.  This is useful for animation.
  2435.  
  2436.     ═══════════════════════════════════════════════════════════════
  2437.     [rip_move {x} {y}]
  2438.  
  2439.     This moves the graphics cursor to the position specified by {x}
  2440.     and {y}.  The author sees no practical use for this since all
  2441.     the graphics and graphic text primitives allow you to specify a
  2442.     location anyway, but the Telegrafix people suggest that this
  2443.         keyword may be needed for future versions of the RIP
  2444.     specification, so it is included for upward compatibility.
  2445.  
  2446.     ═══════════════════════════════════════════════════════════════
  2447.     [rip_text {text}]
  2448.  
  2449.     This displays text at the current position in the graphics
  2450.     viewport.  The {text} must be enclosed in "quotes".  The text
  2451.         displayed by this keyword is subject to the current colour,
  2452.     drawing mode and font styles.  The graphics "cursor" position is
  2453.     set to the immediate right of the text.
  2454.  
  2455.  
  2456.  
  2457.  
  2458.         NanoBBS - UFO Language Documentation                    Page 41
  2459.  
  2460.  
  2461.         ═══════════════════════════════════════════════════════════════
  2462.     [rip_text_xy {x} {y} {text}]
  2463.  
  2464.     This is the same as [rip_text] except that the {x} and {y}
  2465.     location within the graphics viewport is also specified, making
  2466.     this more efficient than an equivalent combination of the
  2467.         [rip_move] and [rip_text] keywords.  The {text} still has to be
  2468.     in quotes.
  2469.  
  2470.     ═══════════════════════════════════════════════════════════════
  2471.     [rip_font_style {font} {direction} {size}]
  2472.  
  2473.     This sets the current font, direction and size used in the
  2474.         [rip_text] and [rip_text_xy] keywords.
  2475.  
  2476.     {font} can be DEFAULT (an 8x8 bitmapped font), TRIPLEX, SMALL,
  2477.     SANSSERIF, and GOTHIC.    The latter four are scalable vector
  2478.     fonts.
  2479.  
  2480.     {direction} can be either HORIZONTAL or VERTICAL.  These can be
  2481.     abbreviated to HORIZ or VERT.
  2482.  
  2483.     {size} is the magnification factor.  It can be from 1 to 10,
  2484.     where 1 is normal size, 2 is double size, 3 is triple size etc.
  2485.  
  2486.     ═══════════════════════════════════════════════════════════════
  2487.     [rip_pixel {x} {y}]
  2488.  
  2489.     This plots a pixel at the {x},{y} screen location in the current
  2490.     colour.  Although the drafters of the protocol document didn't
  2491.         seem to see much use for this keyword, it can be used
  2492.     quite effectively in UFO, with the random starfield displayed in
  2493.     RIPSTARF.UFO as a compact example.
  2494.  
  2495.     ═══════════════════════════════════════════════════════════════
  2496.     [rip_line {x0} {y0} {x1} {y1}]
  2497.  
  2498.     This draws a line from {x0},{y0} to {x1},{y1} in the current
  2499.     drawing colour.  It uses the current line drawing style and
  2500.     thickness and the current drawing mode.
  2501.  
  2502.     ═══════════════════════════════════════════════════════════════
  2503.     [rip_rectangle {x0} {y0} {x1} {y1}]
  2504.  
  2505.     This draws a hollow rectangle where {x0},{y0} and {x1},{y1} are
  2506.     any two diagonally opposite corners.  It is subject to the
  2507.     current colour, line style and drawing mode.
  2508.  
  2509.     ═══════════════════════════════════════════════════════════════
  2510.     [rip_bar {x0} {y0} {x1} {y1}]
  2511.  
  2512.     This draws a rectangle much as the [rip_rectangle]
  2513.         keyword does, except that the rectangle is filled with the
  2514.     current fill colour (NOT the drawing colour!  See the
  2515.         [rip_fill_style] keyword later in this manual!)
  2516.  
  2517.  
  2518.         NanoBBS - UFO Language Documentation                    Page 42
  2519.  
  2520.  
  2521.         ═══════════════════════════════════════════════════════════════
  2522.     [rip_circle {x} {y} {radius}]
  2523.  
  2524.     This draws a circle of the specified radius with its centre at
  2525.     {x},{y}.  The circle is drawn Y-corrected for the EGA aspect
  2526.     ratio, so the radius is valid in x pixels but not y pixels.
  2527.  
  2528.     ═══════════════════════════════════════════════════════════════
  2529.     [rip_oval {x} {y} {start_angle} {end_angle} {x_rad} {y_rad}]
  2530.  
  2531.     This draws an elliptical arc centred at {x},{y} with a
  2532.     horizontal radius of {x_rad} and a vertical radius of {y_rad}.
  2533.     The current colour and line thickness are used.
  2534.  
  2535.     The {start_angle} and {end_angle} define how much of the full
  2536.     ellipse is to be drawn, in degrees. The arc is drawn
  2537.     counterclockwise.
  2538.  
  2539.     The compass below illustrates how angles work in this and the
  2540.         other keywords which use them.
  2541.           ┌────────────────────────────────┐
  2542.           │           90           │
  2543.           │     135    |    45        │
  2544.           │        \    |   /           │
  2545.           │          \ | /           │
  2546.           │  180 ------ o ------ 0 or 360  │
  2547.           │          / | \           │
  2548.           │        /    |   \           │
  2549.           │     225    |   315        │
  2550.           │           270           │
  2551.           └────────────────────────────────┘
  2552.  
  2553.     ═══════════════════════════════════════════════════════════════
  2554.     [rip_filled_oval {x} {y} {x_rad} {y_rad}]
  2555.  
  2556.     This draws a complete filled oval centred at {x},{y} with a
  2557.     horizontal radius of {x_rad} and a vertical radius of {y_rad}.
  2558.     The outline of the ellipse is drawn using the current drawing
  2559.     colour and is filled with the current fill colour (see
  2560.     [rip_fill_style]).  The outline thickness is the same as the
  2561.     line thickness.
  2562.  
  2563.     ═══════════════════════════════════════════════════════════════
  2564.     [rip_arc {x} {y} {start_angle} {end_angle} {radius}]
  2565.  
  2566.         This keyword draws an arc - a segment of a circle.  It is
  2567.     centred at {x},{y} and has a radius specified by {radius}.  The
  2568.     arc is drawn counterclockwise from {start_angle} to {end_angle}.
  2569.     The current drawing colour and line thickness are used.  See the
  2570.     [rip_oval] keyword for a compass of angle positions.
  2571.  
  2572.  
  2573.  
  2574.  
  2575.  
  2576.  
  2577.  
  2578.         NanoBBS - UFO Language Documentation                    Page 43
  2579.  
  2580.  
  2581.         ═══════════════════════════════════════════════════════════════
  2582.     [rip_oval_arc {x} {y} {start_angle} {end_angle} {x_rad} {y_rad}]
  2583.  
  2584.         This keyword draws an elliptical arc - a segment of an oval.  It
  2585.     is centred at {x},{y}.    Syntactically and functionally it is
  2586.     identical to the [rip_oval] keyword.
  2587.  
  2588.     ═══════════════════════════════════════════════════════════════
  2589.     [rip_pie_slice {x} {y} {start_angle} {end_angle} {radius}]
  2590.  
  2591.     This draws a circular "pie slice" - a circular arc with the ends
  2592.     of the arc tied to the center point by straight lines.    It works
  2593.     much the same way as the [rip_arc] function except that the pie
  2594.     slice is filled with the current fill colour and style.  As
  2595.     always, the arc is drawn counterclockwise according to the
  2596.     compass illustrated previously.  The {x} and {y} refer to the
  2597.     center point (where the straight lines converge) as if the
  2598.     circle were whole.
  2599.  
  2600.     ═══════════════════════════════════════════════════════════════
  2601.     [rip_oval_pie_slice {x} {y} {start_angle} {end_angle}
  2602.                 {x_rad} {y_rad}]
  2603.  
  2604.     This draws an elliptical "pie slice" - an elliptical arc with
  2605.     the ends of the arc tied to the center point by straight lines.
  2606.         It works much the same as the [rip_oval_arc] keyword except that
  2607.     the pie slice is filled with the current fill colour and style.
  2608.     As always, the arc is drawn counterclockwise according to the
  2609.     compass illustrated previously.  The {x} and {y} refer to the
  2610.     center point (where the straight lines converge) as if the
  2611.     ellipse were whole.
  2612.  
  2613.     ═══════════════════════════════════════════════════════════════
  2614.     [rip_bezier {x0} {y0} {x1} {y1} {x2} {y2} {x3} {y3} {segments}]
  2615.  
  2616.     This draws a custom Bezier curve.  There are four points used to
  2617.     create the curve.  {x0},{y0} and {x3},{y3} define the start and
  2618.     end points of the curve, while {x1},{y1} and {x2},{y2} are
  2619.     points that are not on the curve but which tend to "pull" the
  2620.     curve in their direction.  Since the curve is drawn in line
  2621.     segments, the {segments} parameter allows to to define the
  2622.     number of line segments to use to draw the curve - more segments
  2623.     give a smoother, slower-drawing curve while fewer give a faster,
  2624.     jaggier curve.
  2625.  
  2626.         (continued next page)
  2627.  
  2628.  
  2629.  
  2630.  
  2631.  
  2632.  
  2633.  
  2634.  
  2635.  
  2636.  
  2637.  
  2638.         NanoBBS - UFO Language Documentation                    Page 44
  2639.  
  2640.  
  2641.         The illustration below shows generally how the curves work:
  2642.     ┌───────────────────────────────────────────────────────────────┐
  2643.     │      {x1,y1}                        │
  2644.     │         +                            │
  2645.     │                          {x3,y3}        │
  2646.     │                         +*        │
  2647.     │                           *        │
  2648.     │        ****                    *        │
  2649.     │     **     ***                     *        │
  2650.     │    *        **                     *        │
  2651.     │      *          *                  *        │
  2652.     │      *           **                *        │
  2653.     │     *          ***               *        │
  2654.     │     +             ***          **        │
  2655.     │   {x0,y0}            *****          ***        │
  2656.     │                     *********            │
  2657.     │                                │
  2658.     │                               +    │
  2659.     │                            {x2,y2} │
  2660.     └───────────────────────────────────────────────────────────────┘
  2661.  
  2662.     ═══════════════════════════════════════════════════════════════
  2663.     [rip_polygon {points} {x0} {y0} {x1} {y1} .. {xn} {yn}]
  2664.  
  2665.     This draws a custom polygon with up to 512 sides.  The {points}
  2666.     parameter specifies how many vertices there are in the whole
  2667.     polygon, and there must be exactly that many {x,y} parameter
  2668.     pairs following.  That means that if you specify 7 points, there
  2669.     must be 14 parameters following.  If there are more there could
  2670.     be unpredictable results, and if there are less UFO.EXE will
  2671.     abort with an error message.  Each {x,y} pair specifies the
  2672.     location of a vertex.
  2673.  
  2674.     The polygon is always closed.  After the last vertex is
  2675.     specified, a line is automatically drawn from the last one to
  2676.     the first one.
  2677.  
  2678.         The polygon drawn with this keyword is subject to the drawing
  2679.     colour, drawing mode, line pattern, and line thickness.
  2680.  
  2681.     ═══════════════════════════════════════════════════════════════
  2682.     [rip_fill_poly {points} {x0} {y0} {x1} {y1} .. {xn} {yn}]
  2683.  
  2684.     This draws a custom polygon with up to 512 vertices, much as the
  2685.         previous [rip_polygon] keyword, but this keyword draws a filled
  2686.     polygon using the current fill colour and style.
  2687.  
  2688.     ═══════════════════════════════════════════════════════════════
  2689.     [rip_fill {x} {y} {border}]
  2690.  
  2691.     This executes a flood fill starting from the {x},{y} screen
  2692.     location.  It fills the screen with the fill colour and style up
  2693.     to the {border} colour (which can be specified as a word rather
  2694.     than a number as all colours).    Caveat: take care that the
  2695.     region you want to fill is completely enclosed by the {border}
  2696.     colour or the fill will "leak" and flood the whole viewport!
  2697.  
  2698.         NanoBBS - UFO Language Documentation                    Page 45
  2699.  
  2700.  
  2701.         ═══════════════════════════════════════════════════════════════
  2702.     [rip_line_style {style} {thickness}]
  2703.     [rip_line_style {style} {userpattern} {thickness}]
  2704.  
  2705.         This keyword defines the "style" used for drawing straight
  2706.     lines.    The {style} parameter specifies the style of line used,
  2707.     and it can be NORMAL, DOTTED, CENTERED, DASHED or CUSTOM.
  2708.  
  2709.         The {thickness} parameter defines the thickness in pixels of
  2710.     lines.    It can be either 1 or 3.  No other thicknesses are
  2711.     available in the RIP specification.
  2712.  
  2713.     The {userpattern} parameter is used only when the {style} is
  2714.     CUSTOM.  If the style is not {custom} then the {userpattern}
  2715.     must be omitted.  The {userpattern} is a 16-bit binary
  2716.     representation of the recurring pattern in the custom line
  2717.     style.
  2718.  
  2719.     Here are a few examples:
  2720.     ╔════════════════════════════════════════════════════════╗
  2721.     ║                           Decimal     ║
  2722.     ║    Pixel Pattern    Binary Representation   Parameter  ║
  2723.     ║  ┌────────────────┐    ┌────────────────┐     ┌─────┐     ║
  2724.     ║  │- - - - - - - - │    │1010101010101010│     │43690│     ║
  2725.     ║  │            │    │         │     │     │     ║
  2726.     ║  │ -    ---  -    --- │    │0100111001001110│     │36494│     ║
  2727.     ║  │            │    │         │     │     │     ║
  2728.     ║  │--- --- --- --- │    │1110111011101110│     │61166│     ║
  2729.     ║  │            │    │         │     │     │     ║
  2730.     ║  │--    --  --    --  │    │1100110011001100│     │52428│     ║
  2731.     ║  └────────────────┘    └────────────────┘     └─────┘     ║
  2732.     ╚════════════════════════════════════════════════════════╝
  2733.  
  2734.     If you can calculate the decimal number for an arbitrary pixel
  2735.     pattern in your head, you probably spend too much time with
  2736.     computers ;-)  The rest of us will do better with a good quality
  2737.     base-converting calculator.  If there is enough demand, a quasi-
  2738.     graphical method of entering pixel patterns will be offered in a
  2739.     future version.
  2740.  
  2741.  
  2742.  
  2743.  
  2744.  
  2745.  
  2746.  
  2747.  
  2748.  
  2749.  
  2750.  
  2751.  
  2752.  
  2753.  
  2754.  
  2755.  
  2756.  
  2757.  
  2758.         NanoBBS - UFO Language Documentation                    Page 46
  2759.  
  2760.  
  2761.         ═══════════════════════════════════════════════════════════════
  2762.     [rip_fill_style {pattern} {colour}]
  2763.  
  2764.     This sets the "fill style" and "fill colour" used by many
  2765.         keywords in the protocol.
  2766.  
  2767.     The {pattern} parameter refers to one of twelve preset fill
  2768.     parameters, numbered from 0 to 11.  Here they are:
  2769.     ┌───────────────────────────────┬──────────────────────────────┐
  2770.     │ 0  Background colour fill    │ 6  Light backslash line fill │
  2771.     │ 1  Solid fill colour fill    │ 7  Light crosshatch fill     │
  2772.     │ 2  Thick line fill        │ 8  Heavy crosshatch fill     │
  2773.     │ 3  Light diagonal line fill    │ 9  Interleaved line fill     │
  2774.     │ 4  Normal diagonal line fill    │ 10 Light dot fill           │
  2775.     │ 5  Normal backslash line fill │ 11 Heavy dot fill           │
  2776.     └───────────────────────────────┴──────────────────────────────┘
  2777.  
  2778.     The {colour} parameter simply sets the fill colour.  It can be a
  2779.     colour name or a palette position from 0 to 15.
  2780.  
  2781.     ═══════════════════════════════════════════════════════════════
  2782.     [rip_fill_pattern {c1} {c2} {c3} {c4} {c5} {c6} {c7} {c8} {colour}]
  2783.  
  2784.         This allows you to define a custom fill pattern for keywords
  2785.         that use the fill style.  When this keyword is executed it
  2786.     overrides the current fill pattern.  The custom fill pattern is
  2787.     a matrix 8 pixels high and 8 pixels wide.  Each of the first
  2788.     eight parameters is an 8-bit line of pixels.  The {colour}
  2789.     parameter sets the fill colour.
  2790.  
  2791.     Here are a couple of examples:
  2792.     ╔════════════════════════════════════════════════════════╗
  2793.     ║                       Decimal     ║
  2794.     ║     Bit Pattern        Binary      Parameter     ║
  2795.     ║   ┌─────────────────┐    ┌────────┐     ┌──────────┐     ║
  2796.     ║   │ * * * * * * * * │    │11111111│     │{c1} = 255│     ║
  2797.     ║   │ * ∙ ∙ ∙ ∙ ∙ ∙ * │    │10000001│     │{c2} = 129│     ║
  2798.     ║   │ * ∙ ∙ ∙ ∙ ∙ ∙ * │    │10000001│     │{c3} = 129│     ║
  2799.     ║   │ * ∙ ∙ ∙ ∙ ∙ ∙ * │    │10000001│     │{c4} = 129│     ║
  2800.     ║   │ * * * * * * * * │    │11111111│     │{c5} = 255│     ║
  2801.     ║   │ ∙ ∙ ∙ ∙ * ∙ ∙ ∙ │    │00001000│     │{c6} = 16 │     ║
  2802.     ║   │ ∙ ∙ ∙ ∙ * ∙ ∙ ∙ │    │00001000│     │{c7} = 16 │     ║
  2803.     ║   │ ∙ ∙ ∙ ∙ * ∙ ∙ ∙ │    │00001000│     │{c8} = 16 │     ║
  2804.     ║   └─────────────────┘    └────────┘     └──────────┘     ║
  2805.     ║                             ║
  2806.     ║   ┌─────────────────┐    ┌────────┐     ┌──────────┐     ║
  2807.         ║   │ * * ∙ ∙ ∙ * * * │    │11000111│    │{c1} = 199│    ║
  2808.     ║   │ * ∙ * * * ∙ * * │    │10111011│     │{c2} = 187│     ║
  2809.         ║   │ ∙ * * * * * ∙ ∙ │    │01111100│    │{c3} = 124│    ║
  2810.     ║   │ * ∙ * * * ∙ * * │    │10111011│     │{c4} = 187│     ║
  2811.         ║   │ * * ∙ ∙ ∙ * * * │    │11000111│    │{c5} = 199│    ║
  2812.     ║   │ * ∙ * * * ∙ * * │    │10111011│     │{c6} = 187│     ║
  2813.         ║   │ ∙ * * * * * ∙ ∙ │    │01111100│    │{c7} = 124│    ║
  2814.     ║   │ * ∙ * * * ∙ * * │    │10111011│     │{c8} = 187│     ║
  2815.     ║   └─────────────────┘    └────────┘     └──────────┘     ║
  2816.     ╚════════════════════════════════════════════════════════╝
  2817.  
  2818.         NanoBBS - UFO Language Documentation                    Page 47
  2819.  
  2820.  
  2821.         ═══════════════════════════════════════════════════════════════
  2822.     [rip_mouse {num} {x0} {y0} {x1} {y1} {click} {zoom} {text}]
  2823.  
  2824.         This keyword sets up a rectangular mouse region on the screen.
  2825.     If the user clicks the left mouse button while the mouse cursor
  2826.     is in this region, the terminal will send the {text} back to
  2827.         NanoBBS.  This is how RIP buttons are tied to existing keyword
  2828.     keys.  The region is defined by {x0},{y0} indicating the upper
  2829.     left corner and {x1},{y1} defining the lower right.
  2830.  
  2831.     {click} can be YES or NO, and if YES it will invert the mouse
  2832.     region while the mouse button is pressed, offering visible
  2833.     feedback.
  2834.  
  2835.     {zoom} can be YES or NO, and if YES it will cause the text
  2836.     window to be "zoomed" to full screen and will clear the window.
  2837.     This should be used if the {text} will cause NanoBBS to go into
  2838.     an area (or external program) that does not support RIPscrip.
  2839.  
  2840.     ═══════════════════════════════════════════════════════════════
  2841.     [rip_kill_mouse_fields]
  2842.  
  2843.     This has no parameters.  It removes all existing mouse regions.
  2844.     This is best used at the beginning of a new screen, so that the
  2845.     previous screen's mouse fields no longer apply.
  2846.  
  2847.     ═══════════════════════════════════════════════════════════════
  2848.     [rip_begin_text {x0} {y0} {x1} {y1}]
  2849.  
  2850.     This defines a rectangular region of the viewport to display
  2851.         text.  This keyword should be followed by one or more
  2852.         [rip_region_text] keywords and then by a [rip_end_text] keyword.
  2853.  
  2854.     The region is defined by {x0},{y0} representing the upper left
  2855.     corner and {x1},{y1} representing the lower right corner.
  2856.  
  2857.     ═══════════════════════════════════════════════════════════════
  2858.     [rip_region_text {justify} {text}]
  2859.  
  2860.         This keyword is used to write text in the text region specified
  2861.         by the [rip_begin_text] keyword.
  2862.  
  2863.     The {justify} parameter can be YES or NO.  If YES, it will do a
  2864.         left-right "fill justify" on the text, inserting space as necessary
  2865.         to keep both the left and right margins of the text in line.
  2866.  
  2867.     The text region does not scroll.  If the text runs below the
  2868.     bottom of the region it is not displayed.
  2869.  
  2870.         An example sequence of region text:
  2871.  
  2872.     [rip_begin_text 10 10 400 200]
  2873.     [rip_region_text yes "Hello there!  This is a demo"]
  2874.     [rip_region_text yes "of RIPscrip Region Text in"]
  2875.     [rip_region_text no  "UFO!"]
  2876.     [rip_end_text]
  2877.  
  2878.         NanoBBS - UFO Language Documentation                    Page 48
  2879.  
  2880.  
  2881.         ═══════════════════════════════════════════════════════════════
  2882.     [rip_end_text]
  2883.  
  2884.     This has no parameters.  It signals the end of a region text
  2885.     block.
  2886.  
  2887.     ═══════════════════════════════════════════════════════════════
  2888.     [rip_get_image {x0} {y0} {x1} {y1}]
  2889.  
  2890.     This copies a region of the screen to the "clipboard" - an
  2891.     internal storage area - for future use.  It can be used with the
  2892.     [rip_put_image] keyword to quickly move a region of graphics to
  2893.     another part of the screen, or to temporarily store a region of
  2894.     graphics which you expect to be overwritten but want to be able
  2895.     to restore.  {x0},{y0} specifies the upper left corner of the
  2896.     region and {x1},{y1} specifies the lower right.
  2897.  
  2898.     ═══════════════════════════════════════════════════════════════
  2899.     [rip_put_image {x} {y} {mode}]
  2900.  
  2901.     This "pastes" the clipboard contents to the screen, with the
  2902.     upper left corner defined by {x},{y}.
  2903.  
  2904.     {mode} can be any of the following:
  2905.  
  2906.     COPY - overwrites whatever is on the screen in that region
  2907.     XOR  - writes an XOR complement of the clipboard and the
  2908.            existing screen data
  2909.     OR   - logically OR's the clipboard with the existing screen
  2910.            data
  2911.     AND  - logically AND's the clipboard with the existing screen
  2912.            data
  2913.     NOT  - writes the inverse of the clipboard to the screen
  2914.  
  2915.     ═══════════════════════════════════════════════════════════════
  2916.     [rip_write_icon {filename}]
  2917.  
  2918.     This writes the contents of the clipboard to a disk file on the
  2919.     user's system.  The file's name is specified in {filename}.  It
  2920.     is stored as a RIPscrip icon which can later be loaded with the
  2921.     [rip_load_icon] keyword.
  2922.  
  2923.         No path information is allowed in the filename.  This keyword is
  2924.     ignored if the clipboard is empty.
  2925.  
  2926.  
  2927.     [rip_load_icon {x} {y} {mode} {clipboard} {filename}]
  2928.  
  2929.     This loads an icon from the user's disk with the specified
  2930.     filename.  The icon is placed at {x},{y}.  The {mode} parameter
  2931.     defines the mode in which it is written - this mode is used the
  2932.     same way as in the [rip_put_image] keyword.
  2933.  
  2934.     The {clipboard} can be YES or NO, and if it is YES it will cause
  2935.     the icon to also be loaded into the clipboard.
  2936.  
  2937.  
  2938.         NanoBBS - UFO Language Documentation                    Page 49
  2939.  
  2940.  
  2941.         ═══════════════════════════════════════════════════════════════
  2942.     [rip_button_style {width} {height} {orientation} {flags}
  2943.               {d_fore} {d_back} {bright} {dark} {surface}
  2944.               {group} {flags2} {uline_col} {corner_col}]
  2945.  
  2946.         This is the most complicated keyword in the NanoBBS
  2947.     implementation of the RIPscrip protocol.  For a complete
  2948.         explanation of the keyword you should refer to the original
  2949.     RIPscrip specification from Telegrafix.
  2950.  
  2951.         This keyword defines how mouse buttons are displayed and
  2952.     handled.  It does not display or draw anything, but sets up the
  2953.     numerous modes which buttons created with the [rip_button]
  2954.     keyword will use.
  2955.  
  2956.     The {width} and {height} parameters refer to the size of the
  2957.     button in pixels.
  2958.  
  2959.     The {orientation} parameter can be one of ABOVE, LEFT, CENTER,
  2960.     RIGHT, or BENEATH.  It refers to the positioning of the optional
  2961.     text label.  The label is written either above, to the left of,
  2962.     in the center of, to the right of, or below the button
  2963.     respectively.
  2964.  
  2965.     The {bevsize} parameter is the width of the bevel effect in
  2966.     pixels.  If the bevel flag (see "flags") is set, this parameter
  2967.     has effect, otherwise it is ignored.  It can be any valyue of
  2968.     zero or more.
  2969.  
  2970.     The {d_fore} and {d_back} parameters refer to the foreground and
  2971.     "dropshadow" colours of the text label, respectively.  The
  2972.     {d_back} colour is not used if the dropshadow flag is not set.
  2973.  
  2974.     The {bright}, {dark} and {surface} parameters represent the
  2975.     highlighted, shadowed and regular surface colours used with the
  2976.     special effects styles (see flags).
  2977.  
  2978.     The {uline_col} is the colour of the underline in the text
  2979.     label (if present).
  2980.  
  2981.     The {corner_col} is the colour of the corners of the bevel,
  2982.     recess, and other special button modes.
  2983.  
  2984.     The {group} parameter specifies the button group that subsequent
  2985.     [rip_button] keywords are associated with.  For more information
  2986.     on button groups, radio buttons, checkbox buttons and other
  2987.     button arcana, please refer to Telegrafix's original RIPscrip
  2988.     specification.    This can be from 0 to 35.
  2989.  
  2990.     The {flags} parameter is a bitmapped 16-bit integer.  This
  2991.     parameter is determined by adding up the bit values of all the
  2992.     flags you want to use.    Note that some flags are mutually
  2993.     incompatible.
  2994.  
  2995.         (continued next page)
  2996.  
  2997.  
  2998.         NanoBBS - UFO Language Documentation                    Page 50
  2999.  
  3000.  
  3001.     Here is a table of the {flags} parameter bitmap values.
  3002.         ╔═════════╤════════════════════════════════════════════╗
  3003.         ║      Bit │                        ║
  3004.         ║    Value │ Meaning                    ║
  3005.         ╟─────────┼────────────────────────────────────────────╢
  3006.         ║        1 │ Clipboard button               ║
  3007.         ║        2 │ Button can be inverted               ║
  3008.         ║        4 │ Reset screen                   ║
  3009.         ║        8 │ Use the "chisel" effect                    ║
  3010.         ║       16 │ Use the "recessed" effect                  ║
  3011.         ║       32 │ Use a "dropshadow" for the text label      ║
  3012.         ║       64 │ Stamp image to the clipboard           ║
  3013.         ║      128 │ "Icon" Button                              ║
  3014.         ║      256 │ "Plain" Button                             ║
  3015.         ║      512 │ Use the "bevel" effect                     ║
  3016.         ║     1024 │ Mouse button                   ║
  3017.         ║     2048 │ Underline the "hot key" in the text label  ║
  3018.         ║     4096 │ Use hot icons                   ║
  3019.         ║     8192 │ Adjust vertical centering of the label       ║
  3020.         ║    16384 │ Belongs to a radio group           ║
  3021.         ║    32768 │ Use the "sunken" effect                    ║
  3022.         ╚═════════╧════════════════════════════════════════════╝
  3023.  
  3024.     So, for example, if you want to make a mouse button with the
  3025.     bevel effect you add up the bit values for these two flags.  The
  3026.     mouse button flag has a bit value of 1024, and the bevel effect
  3027.     flag has a bit value of 512.  Add these up and you get 1536,
  3028.     which is the value you should place in the {flags} parameter for
  3029.     these options.
  3030.  
  3031.     The {flags2} parameter is (as of this version) a five-bit
  3032.     integer bitmap similar to the {flags} parameter.  Its value is
  3033.     determined in the same way as the {flags} parameter, by adding
  3034.     up the bit values.
  3035.  
  3036.     Here is a table of those bit values:
  3037.         ╔═════════╤════════════════════════════════════════════╗
  3038.         ║      Bit │                        ║
  3039.         ║    Value │ Meaning                    ║
  3040.         ╟─────────┼────────────────────────────────────────────╢
  3041.         ║        1 │ The button is in a checkbox group       ║
  3042.         ║        2 │ Highlight the hotkey character           ║
  3043.         ║        4 │ Zoom out when clicked               ║
  3044.         ║        8 │ Left justify the label               ║
  3045.         ║       16 │ Right justify the label            ║
  3046.         ╚═════════╧════════════════════════════════════════════╝
  3047.  
  3048.     Please refer to the original RIPscrip specification from
  3049.     Telegrafix for a full explanation of the meanings of the two
  3050.     {flags} parameters and their various mutual exclusivities.
  3051.  
  3052.  
  3053.  
  3054.  
  3055.  
  3056.  
  3057.  
  3058.         NanoBBS - UFO Language Documentation                    Page 51
  3059.  
  3060.  
  3061.         ═══════════════════════════════════════════════════════════════
  3062.     [rip_button {x0} {y0} {x1} {y1} {hotkey} {flags} {iconfile}
  3063.                     {textlabel} {keyword}]
  3064.  
  3065.     This creates a new button using the style selected in the
  3066.     [rip_button_style] keyword.
  3067.  
  3068.     The {x0} and {y0} parameters specify the upper left corner of
  3069.     the icon.
  3070.  
  3071.     If no height and width are specified in the [rip_button_style]
  3072.     then the {x1} and {y1} refer to the lower right corner,
  3073.     otherwise these two parameters are ignored and the button is
  3074.     sized according to the button style.  This allows for dynamic
  3075.     button sizes.
  3076.  
  3077.     The {hotkey} is the ASCII code (from zero to 255) of the
  3078.     keystroke that activates the button.  This character, if present
  3079.     in the text label, will be underlined in the label if the
  3080.     underline flag in the button style is set.
  3081.  
  3082.     The {flags} parameter is a two-bit binary integer.  Here are its
  3083.     values:
  3084.         ╔═════════╤════════════════════════════════════════════╗
  3085.         ║      Bit │                        ║
  3086.         ║    Value │ Meaning                    ║
  3087.         ╟─────────┼────────────────────────────────────────────╢
  3088.         ║        1 │ Draw the button as already selected       ║
  3089.         ║        2 │ The button is default if [Enter] is hit    ║
  3090.         ╚═════════╧════════════════════════════════════════════╝
  3091.  
  3092.     The {iconfile} parameter is the filename of an icon to load if
  3093.     this is an icon button.  Use a null constant "" if this is not
  3094.     an icon file.
  3095.  
  3096.     The {textlabel} parameter is the text of the text label.  Use a
  3097.     null constant "" if no label is wanted.
  3098.  
  3099.         The {keyword} parameter is the actual text for the terminal to
  3100.     send back to NanoBBS.  Technically the specification allows you
  3101.     to skip this by using a null constant "".  Use a ^ caret to
  3102.     specify control characters, e.g. ^M for a carriage return, ^G
  3103.     for a beep.
  3104.  
  3105.  
  3106.  
  3107.  
  3108.  
  3109.  
  3110.  
  3111.  
  3112.  
  3113.  
  3114.  
  3115.  
  3116.  
  3117.  
  3118.         NanoBBS - UFO Language Documentation                    Page 52
  3119.  
  3120.  
  3121.         ═══════════════════════════════════════════════════════════════
  3122.     [rip_copy_region {x0} {y0} {x1} {y1} {dest_line}]
  3123.  
  3124.     This vertically copies/scrolls a rectangular region of the
  3125.     screen.  {x0},{y0} define the upper left corner and {x1},{y1}
  3126.     define the lower right corner of the region to be copied, and
  3127.     {dest_line} is the vertical line number to copy the region to.
  3128.  
  3129.     The {x0} and {x1} parameters must be evenly divisible by eight
  3130.     due to a limitation of the EGA compatible hardware the protocol
  3131.     is written for.  If either parameter is not evenly divisible by
  3132.     eight, the parameters will be adjusted (tending to increase the
  3133.         size of the region).  If the keyword specifies a copy which
  3134.         would partially draw off the screen, the whole keyword is
  3135.     ignored.
  3136.  
  3137.     ═══════════════════════════════════════════════════════════════
  3138.     [rip_no_more]
  3139.  
  3140.     This has no parameters, and simply formally signals the RIPscrip
  3141.     compatible terminal that the RIPscrip sequences have ended and
  3142.     that further output should be to the text window.
  3143.  
  3144.  
  3145.  
  3146.  
  3147.  
  3148.  
  3149.  
  3150.  
  3151.  
  3152.  
  3153.  
  3154.  
  3155.  
  3156.  
  3157.  
  3158.  
  3159.  
  3160.  
  3161.  
  3162.  
  3163.  
  3164.  
  3165.  
  3166.  
  3167.  
  3168.  
  3169.  
  3170.  
  3171.  
  3172.  
  3173.  
  3174.  
  3175.  
  3176.  
  3177.  
  3178.         NanoBBS - UFO Language Documentation                    Page 53
  3179.  
  3180.  
  3181.         ═══════════════════════════════════════════════════════════════
  3182.     [pageplay {noun}]
  3183.  
  3184.     Executes a dazzling performance of the PagePlay(tm) file whose
  3185.     filename is in {noun}!    Full instructions for the PagePlay music
  3186.     system are included in the PagePlay shareware archive, availabel
  3187.     from THC Freedom Online BBS.
  3188.  
  3189.     ═══════════════════════════════════════════════════════════════
  3190.     [autoansi]
  3191.  
  3192.     Attempts to detect ANSi graphics on the remote caller's terminal
  3193.     software.
  3194.  
  3195.  
  3196.     ═══════════════════════════════════════════════════════════════
  3197.     [addbatch {noun}]
  3198.  
  3199.     Adds the file(s) in {noun} to the download batch.
  3200.  
  3201.     ═══════════════════════════════════════════════════════════════
  3202.     [delbatch {noun}]
  3203.  
  3204.     Removes the file in {noun} from the download batch.
  3205.  
  3206.     ═══════════════════════════════════════════════════════════════
  3207.     [clrbatch]
  3208.  
  3209.     Clears the download batch.
  3210.  
  3211.         ═══════════════════════════════════════════════════════════════
  3212.         [describebatch]
  3213.  
  3214.         This prompts the user to describe each file currently in the
  3215.         batch - this should be called immediately after a download (and
  3216.         it is in the canned interface).  It will try to extract
  3217.         FILE_ID.DIZ from each file first.
  3218.  
  3219.         ═══════════════════════════════════════════════════════════════
  3220.         [ifits {noun}]
  3221.  
  3222.         This continues to the next [mark] if the number of iterations of
  3223.         the current list is evenly divisible by zero.  There are several
  3224.         kinds of lists in NanoBBS which give you access to the
  3225.         iterations; they include the user list, daily caller list, file
  3226.         and message area listings, and file search listings.
  3227.  
  3228.         ═══════════════════════════════════════════════════════════════
  3229.         [ifvalidymd {noun}]
  3230.  
  3231.         If {noun} is a valid YY/MM/DD or YY-MM-DD date, this keyword
  3232.         will continue processing to the next [mark], otherwise it will
  3233.         skip ahead to the next [mark].
  3234.  
  3235.  
  3236.  
  3237.  
  3238.         NanoBBS - UFO Language Documentation                    Page 54
  3239.  
  3240.  
  3241.         ═══════════════════════════════════════════════════════════════
  3242.     [ifeq {noun1} {noun2}]
  3243.  
  3244.     This will continue processing to the next [mark] keyword if the
  3245.     two nouns are equal, and will skip until the next [mark] if the
  3246.     nouns are inequal.  UFO is smart enough to detect whether a
  3247.     numeric or alphabetic comparison should be made.  Alpha
  3248.     comparisons are case-insensitive.
  3249.  
  3250.         ═══════════════════════════════════════════════════════════════
  3251.         [ifne {noun1} {noun2}]
  3252.  
  3253.         This will continue processing to the next [mark] if the two
  3254.         nouns are not equal.  If both nouns are numbers then a numerical
  3255.         comparison is made, otherwise it is a string comparison.  If the
  3256.         nouns are equal, NanoBBS skips ahead to the next [mark] (or to
  3257.         the end of the file, whichever comes first).
  3258.  
  3259.     ═══════════════════════════════════════════════════════════════
  3260.     [iflt {noun1} {noun2}]
  3261.  
  3262.     Processes until the next [mark] if {noun1} is less than {noun2}
  3263.     or is alphabetically lower.
  3264.  
  3265.     ═══════════════════════════════════════════════════════════════
  3266.     [ifgt {noun1} {noun2}]
  3267.  
  3268.     Processes until the next [mark] if {noun1} is greater than
  3269.     {noun2} or is alphabetically higher.
  3270.  
  3271.     ═══════════════════════════════════════════════════════════════
  3272.     [iflte {noun1} {noun2}]
  3273.  
  3274.     Processes until the next [mark] if {noun1} is less than or equal
  3275.     to {noun2}.
  3276.  
  3277.     ═══════════════════════════════════════════════════════════════
  3278.     [ifgte {noun1} {noun2}]
  3279.  
  3280.     Processes until the next [mark] if {noun1} is greater than or
  3281.     equal to {noun2}.
  3282.  
  3283.     ═══════════════════════════════════════════════════════════════
  3284.     [cookie {noun}]
  3285.  
  3286.     Displays a cookie from the cookie file specified in {noun}.
  3287.  
  3288.     ═══════════════════════════════════════════════════════════════
  3289.     [chain {noun}]
  3290.  
  3291.     Quits the current UFO file and links to the one specified in
  3292.     {noun}.  This is like a GOTO.  Upon exit from the chained file,
  3293.     UFO does NOT return to the original file.
  3294.  
  3295.  
  3296.  
  3297.  
  3298.         NanoBBS - UFO Language Documentation                    Page 55
  3299.  
  3300.  
  3301.         ═══════════════════════════════════════════════════════════════
  3302.     [inc {noun}]
  3303.  
  3304.     This increments the {noun}.  It assumes that the noun contains a
  3305.     number.  If the noun was not already a number, it is assumed to
  3306.     be zero and is incremented to 1.
  3307.  
  3308.     ═══════════════════════════════════════════════════════════════
  3309.     [dec {noun}]
  3310.  
  3311.     This decrements the {noun}.  It assumes that the noun contains a
  3312.     number.  If the noun was not already a number, it is assumed to
  3313.     be zero and is decremented to -1.
  3314.  
  3315.     ═══════════════════════════════════════════════════════════════
  3316.     [shr1 {noun}]
  3317.  
  3318.     This assumes the noun is a number, specifically a signed 32 bit
  3319.     integer, and shifts it bitwise right one position.  This is a
  3320.     quick and dirty way to divide it by two.  If the noun is not a
  3321.     number it is assumed to be zero, and will be shr'd, with a
  3322.     result of zero.
  3323.  
  3324.     ═══════════════════════════════════════════════════════════════
  3325.     [shl1 {noun}]
  3326.  
  3327.     This assumes the noun is a number, specifically a signed 32 bit
  3328.     integer, and shifts it bitwise left one position.  This is a
  3329.     quick and dirty way to multiply it by two.  If the noun is not a
  3330.     number it is assumed to be zero, and will be shl'd, with a
  3331.     result of zero.
  3332.  
  3333.     ═══════════════════════════════════════════════════════════════
  3334.     [shr {noun1} {noun2}]
  3335.  
  3336.     This assumes {noun1} is a number, specifically a signed 32 bit
  3337.     integer, and shifts it bitwise right the number of positions
  3338.     specified in {noun2}. This is a quick and dirty way to divide by
  3339.     powers of two.    If the noun is not a number it is assumed to be
  3340.     zero, and will be shr'd, with a result of zero.
  3341.  
  3342.     ═══════════════════════════════════════════════════════════════
  3343.     [shl {noun1} {noun2}]
  3344.  
  3345.     This assumes {noun1} is a number, specifically a signed 32 bit
  3346.     integer, and shifts it bitwise left the number of positions
  3347.     specified in {noun2}. This is a quick and dirty way to multiply by
  3348.     powers of two.    If the noun is not a number it is assumed to be
  3349.     zero, and will be shl'd, with a result of zero.
  3350.  
  3351.     ═══════════════════════════════════════════════════════════════
  3352.     [add {noun1} {noun2}]
  3353.  
  3354.     This stores the sum of {noun1} and {noun2} in {noun2}.
  3355.  
  3356.  
  3357.  
  3358.         NanoBBS - UFO Language Documentation                    Page 56
  3359.  
  3360.  
  3361.         ═══════════════════════════════════════════════════════════════
  3362.     [sub {noun1} {noun2}]
  3363.  
  3364.     This subtracts {noun1} from {noun2} and stores the result in
  3365.     {noun2}.
  3366.  
  3367.  
  3368.     ═══════════════════════════════════════════════════════════════
  3369.     [showsysop {noun}]
  3370.  
  3371.     This is like [display] except that the noun is only seen on the
  3372.     local console.
  3373.  
  3374.     ═══════════════════════════════════════════════════════════════
  3375.     [comment]
  3376.  
  3377.     Anything between "[comment" and the closing "]" is ignored by
  3378.     UFO.
  3379.  
  3380.     ═══════════════════════════════════════════════════════════════
  3381.     [swallowbuffer]
  3382.  
  3383.     If there are any characters in the input buffer of either the
  3384.     comport or the keyboard, this will "swallow" them until both
  3385.     settle down.
  3386.  
  3387.     ═══════════════════════════════════════════════════════════════
  3388.     [nonstop]
  3389.  
  3390.     All output after this will be non-stop until a prompt is hit...
  3391.  
  3392.     ═══════════════════════════════════════════════════════════════
  3393.     [nonstop_off]
  3394.  
  3395.     This turns off nonstop mode set by the [nonstop] keyword.
  3396.  
  3397.         ═══════════════════════════════════════════════════════════════
  3398.         [moreofftemp]
  3399.  
  3400.         This temporarily turns off "More? (Y/n)" prompts, making output
  3401.         non-stop.
  3402.  
  3403.     ═══════════════════════════════════════════════════════════════
  3404.         [on_deleted] [off_deleted] [tog_deleted] [if_deleted]
  3405.  
  3406.         [on_deleted] sets the user's deleted bit(!!!)  The user will no
  3407.                      longer be able to logon so use with care!!!
  3408.         [off_deleted] turns the deleted bit off.
  3409.         [tog_deleted] toggles the deleted bit.
  3410.         [if_deleted] continues processing the script if the user is
  3411.                      deleted, otherwise it jumps to the next [mark].
  3412.  
  3413.  
  3414.  
  3415.  
  3416.  
  3417.  
  3418.         NanoBBS - UFO Language Documentation                    Page 57
  3419.  
  3420.  
  3421.         ═══════════════════════════════════════════════════════════════
  3422.         [on_clrscr] [off_clrscr] [tog_clrscr] [if_clrscr]
  3423.  
  3424.         [on_clrscr] turns on the use of clear-screens.
  3425.         [off_clrscr] turns off the use of clear-screens.
  3426.         [tog_clrscr] toggles the use of clear-screens.
  3427.         [if_clrscr] continues processing the script if the user is using
  3428.                     clear screens, otherwise it jumps to the next
  3429.                     [mark].
  3430.  
  3431.         ═══════════════════════════════════════════════════════════════
  3432.         [on_ansi] [off_ansi] [tog_ansi] [if_ansi]
  3433.  
  3434.         [on_ansi] turns on the use of ANSI colours.
  3435.         [off_ansi] turns off the use of ANSI colours.
  3436.         [tog_ansi] toggles the use of ANSI colours.
  3437.         [if_ansi] continues processing the script if the user is using
  3438.                   ANSI colours, otherwise it jumps to the next [mark].
  3439.  
  3440.         ═══════════════════════════════════════════════════════════════
  3441.         [on_nolimit] [off_nolimit] [tog_nolimit] [if_nolimit]
  3442.  
  3443.         [on_nolimit] suspends the user's time limits so s/he can stay on
  3444.                      line as long as they see fit.
  3445.         [off_nolimit] re-enables the user's time limits.
  3446.         [tog_nolimit] toggles the no-limit bit.
  3447.         [if_nolimit] continues processing the script if the user is
  3448.                      marked as having no time limit, otherwise it jumps
  3449.                      to the next [mark].
  3450.  
  3451.         ═══════════════════════════════════════════════════════════════
  3452.         [on_rodent] [off_rodent] [tog_rodent] [if_rodent]
  3453.  
  3454.         [on_rodent] turns on the "rodent" bit.  When this bit is on, the
  3455.                     user cannot page the SysOp for chat.  Useful for
  3456.                     dealing with users whose paging becomes very
  3457.                     annoying.
  3458.         [off_rodent] turns off the rodent bit, so the user can page again.
  3459.         [tog_rodent] toggles the rodent bit.
  3460.         [if_rodent] continues processing the script if the user's rodent
  3461.                     bit is set, otherwise it jumps to the next [mark].
  3462.  
  3463.  
  3464.  
  3465.  
  3466.  
  3467.  
  3468.  
  3469.  
  3470.  
  3471.  
  3472.  
  3473.  
  3474.  
  3475.  
  3476.  
  3477.  
  3478.         NanoBBS - UFO Language Documentation                    Page 58
  3479.  
  3480.  
  3481.         ═══════════════════════════════════════════════════════════════
  3482.         [on_toast] [off_toast] [tog_toast] [if_toast]
  3483.  
  3484.         [on_toast] turns on the "toast" bit.  When this bit is on, the
  3485.                    user gets ONE MORE CALL to the BBS.  Immediately upon
  3486.                    password acceptance and logon, the user is informed that
  3487.                    the account has been terminated, and then the deleted
  3488.                    bit is set.  The user can continue with the call, or
  3489.                    you can use a UFO script called from the language
  3490.                    file to drop the user immediately, at your option.
  3491.                    By default, the user is allowed to continue his "last
  3492.                    call."
  3493.  
  3494.                    This feature is intended as a way of removing a problem
  3495.                    user in such a way that the user is left with no
  3496.                    question that the account has been terminated, and by
  3497.                    default also allows the user a last call to plead her
  3498.                    case.
  3499.  
  3500.         [off_toast] turns off the toast bit.  A last minute pardon...
  3501.         [tog_toast] toggles the toast bit.
  3502.         [if_toast] continues processing the script if the user's toast
  3503.                    bit is set, otherwise it jumps to the next [mark].
  3504.  
  3505.         ═══════════════════════════════════════════════════════════════
  3506.         [on_chkmail] [off_chkmail] [tog_chkmail] [if_chkmail]
  3507.  
  3508.         [on_chkmail] turns on the check-new-mail bit.  When this bit is
  3509.                      on, each time the user logs on the BBS will scan
  3510.                      for new messages addressed to the user in the
  3511.                      Private Email base.
  3512.         [off_chkmail] turns off the check-new-mail bit.  No new message
  3513.                       scan but logons will be much faster.
  3514.         [tog_chkmail] toggles the check-new-mail bit.
  3515.         [if_chkmail] continues processing the script if the user's
  3516.                      check-new-mail bit is set, otherwise it jumps to
  3517.                      the next [mark].
  3518.  
  3519.         ═══════════════════════════════════════════════════════════════
  3520.         [on_FSE] [off_FSE] [tog_FSE] [if_FSE]
  3521.  
  3522.         (note: this keyword is case insensitive as all UFO keywords.  It
  3523.         is perfectly valid to, for example, use [on_fse] instead of
  3524.         [on_FSE] as shown above)
  3525.  
  3526.         [on_FSE] enables the use of the full screen editor when entering
  3527.                  messages.
  3528.         [off_FSE] disables the use of the FSE, and instead the user must
  3529.                   use the old-fashioned line-by-line message editor.
  3530.         [tog_FSE] toggles the use of the FSE.
  3531.         [if_FSE] continues processing the script if the user has enabled
  3532.                  the use of the FSE, otherwise it jumps to the next
  3533.                  [mark].
  3534.  
  3535.  
  3536.  
  3537.  
  3538.         NanoBBS - UFO Language Documentation                    Page 59
  3539.  
  3540.  
  3541.         ═══════════════════════════════════════════════════════════════
  3542.         [on_noratio] [off_noratio] [tog_noratio] [if_noratio]
  3543.  
  3544.         [on_noratio] disables checking for file download:upload ratios
  3545.                      when the user is downloading.  This is a good bit
  3546.                      to set for yourself and for close personal
  3547.                      friends...
  3548.         [off_noratio] re-enables file ratios.
  3549.         [tog_noratio] toggles the use of file ratios.
  3550.         [if_noratio] continues processing the script if the user is
  3551.                      flagged as having no file ratios, otherwise it
  3552.                      jumps to the next [mark].
  3553.  
  3554.         ═══════════════════════════════════════════════════════════════
  3555.         [on_suspended] [off_suspended] [tog_suspended] [if_suspended]
  3556.  
  3557.         [on_suspended] sets the suspended bit.  When this bit is set,
  3558.                        the user will receive a message stating that the
  3559.                        account is temporarily suspended, and will then
  3560.                        be logged off.
  3561.         [off_suspended] un-suspends the user.
  3562.         [tog_suspended] toggles the user's suspended bit.
  3563.         [if_suspended] continues processing the script if the user is
  3564.                        suspended, otherwise it jumps to the next [mark].
  3565.  
  3566.         ═══════════════════════════════════════════════════════════════
  3567.         [on_linefeeds] [off_linefeeds] [tog_linefeeds] [if_linefeeds]
  3568.  
  3569.         [on_linefeeds] turns on the use of linefeeds.  When this is set,
  3570.                        every time NanoBBS sends a new line carriage
  3571.                        return (ASCII 13) it will also send a line feed
  3572.                        (ASCII 10).  Most terminal programs for the IBM
  3573.                        clone line need line feeds or else all the output
  3574.                        will appear on one line.
  3575.         [off_linefeeds] turns off line feeds.
  3576.         [tog_linefeeds] toggles the use of line feeds.
  3577.         [if_linefeeds] continues processing the script if line feeds are
  3578.                        enabled, otherwise it jumps to the next [mark].
  3579.  
  3580.         ═══════════════════════════════════════════════════════════════
  3581.     [crlf]
  3582.  
  3583.     This inserts a carriage return/linefeed into the .BBS file,
  3584.     where you might not want a line break in your source text.
  3585.  
  3586.         ═══════════════════════════════════════════════════════════════
  3587.         [null]
  3588.  
  3589.         This simply sends a null character - an ASCII $00 - to the user.
  3590.         When this keyword is encountered by UFO.EXE, the null character
  3591.         itself is written to the output file.
  3592.  
  3593.  
  3594.  
  3595.  
  3596.  
  3597.  
  3598.         NanoBBS - UFO Language Documentation                    Page 60
  3599.  
  3600.  
  3601.         ═══════════════════════════════════════════════════════════════
  3602.     [menu {noun}]
  3603.  
  3604.     This is used before a [getchr] keyword to limit input to only
  3605.     the characters in {noun}.  It is a direct synonym of [keyfilter].
  3606.  
  3607.     ═══════════════════════════════════════════════════════════════
  3608.     [filesearch {noun}]
  3609.  
  3610.     This is a quasi-canned file search utility.  It will search for
  3611.     the file or files specified in {noun}.
  3612.  
  3613.     ═══════════════════════════════════════════════════════════════
  3614.     [sendtext {noun}]
  3615.  
  3616.     This sends the ASCII or ANSI file specified in the noun to the
  3617.     user in ASCII mode.  It is not counted as a download.  It will
  3618.     not process any UFO code in the file, and unlike linked UFO
  3619.     files the file can be any size.
  3620.  
  3621.     ═══════════════════════════════════════════════════════════════
  3622.     [harddownload {noun}]
  3623.  
  3624.     This adds the file or files in {noun} to the download batch,
  3625.     prompts for a protocol and then downloads the file to the user.
  3626.     Useful for embedding hardcoded file transfers, say for a
  3627.     required file.
  3628.  
  3629.     ═══════════════════════════════════════════════════════════════
  3630.     [senserip]
  3631.  
  3632.     Attempts to detect RIP graphics.  If successful it will set the
  3633.     RIP bit.
  3634.  
  3635.     ═══════════════════════════════════════════════════════════════
  3636.     [ifripdetect]
  3637.  
  3638.     Attempts to detect RIP graphics.  If none are found it will skip
  3639.     to the next [mark] keyword.
  3640.  
  3641.     ═══════════════════════════════════════════════════════════════
  3642.     [feedback]
  3643.  
  3644.         Prompts to send feedback to the SysOp.  It basically will jump
  3645.     to the defined e-mail message base and post a private message to
  3646.         the person defined as the SysOp in the config file, with a
  3647.     subject line of "Feedback."
  3648.  
  3649.     ═══════════════════════════════════════════════════════════════
  3650.     [keyjump {noun}]
  3651.  
  3652.         This will skip to the next [mark] keyword if the user key
  3653.         specified in the {noun} is on.  Otherwise, NanoBBS will continue
  3654.         processing as if nothing happened.  Only the first character of
  3655.         the noun is relevant.
  3656.  
  3657.  
  3658.         NanoBBS - UFO Language Documentation                    Page 61
  3659.  
  3660.  
  3661.         ═══════════════════════════════════════════════════════════════
  3662.     [keytoggle {noun}]
  3663.  
  3664.         This toggles the user key specified in the {noun}.  If the noun
  3665.         is on, this keyword turns it off, and vice versa.  Only the
  3666.         first character of the noun is relevant.
  3667.  
  3668.     ═══════════════════════════════════════════════════════════════
  3669.     [keyoff {noun}]
  3670.  
  3671.         This turns off the user key specified in the {noun}.  Only the
  3672.         first character of the noun is relevant.
  3673.  
  3674.     ═══════════════════════════════════════════════════════════════
  3675.     [keyon {noun}]
  3676.  
  3677.         This turns on the user key specified in the {noun}.  Only the
  3678.         first character of the noun is relevant.
  3679.  
  3680.     ═══════════════════════════════════════════════════════════════
  3681.     [loadlang {noun}]
  3682.  
  3683.     This loads a language file whose filename root (first 8
  3684.     characters, no extension or path) is in {noun}.
  3685.  
  3686.     ═══════════════════════════════════════════════════════════════
  3687.     [canned_logon]
  3688.         [logon]
  3689.  
  3690.     This goes through the canned logon procedure.  It will ask for a
  3691.     user name/number and password, and if the user is new, will run
  3692.         the new-user questionnaire.  [logon] and [canned_logon] are
  3693.         directly synonymous.
  3694.  
  3695.     ═══════════════════════════════════════════════════════════════
  3696.     [canned_goodbye]
  3697.  
  3698.     This asks the user is sure s/he wants to log off (offering a
  3699.     feedback option), updates all logs and usage variables, displays
  3700.     the goodbye file, and hangs up.
  3701.  
  3702.     ═══════════════════════════════════════════════════════════════
  3703.     [canned_msgread]
  3704.  
  3705.     This invokes the canned read-message menu
  3706.  
  3707.     ═══════════════════════════════════════════════════════════════
  3708.     [canned_email]
  3709.  
  3710.     This invokes the canned email menu.
  3711.  
  3712.  
  3713.  
  3714.  
  3715.  
  3716.  
  3717.  
  3718.         NanoBBS - UFO Language Documentation                    Page 62
  3719.  
  3720.  
  3721.         ═══════════════════════════════════════════════════════════════
  3722.     [canned_jumpmb]
  3723.  
  3724.     This invokes the canned jump-messagebase prompt.  The user can
  3725.     select a message base, jump to the next or previous message
  3726.     base, get a list of message bases, or quit.
  3727.  
  3728.     ═══════════════════════════════════════════════════════════════
  3729.     [canned_killmsg]
  3730.  
  3731.     This kills the current message, if the user is allowed.
  3732.  
  3733.     ═══════════════════════════════════════════════════════════════
  3734.     [canned_options]
  3735.  
  3736.     This invokes the canned user options - the menu in which the
  3737.     user can change his/her account parameters such as screen size,
  3738.     language file, line/NEd editor, etc.
  3739.  
  3740.     ═══════════════════════════════════════════════════════════════
  3741.     [canned_chpw]
  3742.  
  3743.     This invokes the password changer.  It is a subset of the
  3744.     [canned_options] function.
  3745.  
  3746.     ═══════════════════════════════════════════════════════════════
  3747.     [canned_chlang]
  3748.  
  3749.     This invokes the language changer.  It is a subset of the
  3750.     [canned_options] function.
  3751.  
  3752.     ═══════════════════════════════════════════════════════════════
  3753.     [canned_bang]
  3754.  
  3755.     This prompts for the Bang prompt.
  3756.  
  3757.     ═══════════════════════════════════════════════════════════════
  3758.     [canned_doormenu]
  3759.  
  3760.     This invokes a canned door menu.
  3761.  
  3762.     ═══════════════════════════════════════════════════════════════
  3763.     [rundoor {noun}]
  3764.  
  3765.         This runs a door whose NUMBER is in {noun}.  The appropriate
  3766.         door info file is automatically created, so you don't need to
  3767.         precede this with a DORINFO or DOORSYS token.
  3768.  
  3769.     ═══════════════════════════════════════════════════════════════
  3770.     [canned_yourstats]
  3771.  
  3772.     This shows the user's stats.
  3773.  
  3774.     ═══════════════════════════════════════════════════════════════
  3775.     [canned_page]
  3776.  
  3777.         This prompts to page the SysOp.  It will ask for a reason and
  3778.     note the chat request in the system log file.
  3779.  
  3780.         NanoBBS - UFO Language Documentation                    Page 63
  3781.  
  3782.  
  3783.         ═══════════════════════════════════════════════════════════════
  3784.     [canned_setscans]
  3785.  
  3786.     This invokes the set scans menu.
  3787.  
  3788.     ═══════════════════════════════════════════════════════════════
  3789.     [canned_newmsg]
  3790.  
  3791.     This invokes the global new message scan.
  3792.  
  3793.     ═══════════════════════════════════════════════════════════════
  3794.     [canned_callstoday]
  3795.  
  3796.     This invokes the calls today list.
  3797.  
  3798.     ═══════════════════════════════════════════════════════════════
  3799.     [canned_post]
  3800.  
  3801.     This prompts to post a message in the current area, then invokes
  3802.     the selected editor.  Access levels and read-only restrictions
  3803.     are checked.
  3804.  
  3805.     ═══════════════════════════════════════════════════════════════
  3806.     [canned_userlist]
  3807.  
  3808.     This invokes the user listings.
  3809.  
  3810.     ═══════════════════════════════════════════════════════════════
  3811.     [canned_batchmenu]
  3812.  
  3813.     This invokes the canned batch files menu.
  3814.  
  3815.     ═══════════════════════════════════════════════════════════════
  3816.     [canned_download]
  3817.  
  3818.         This invokes a generic download keyword.
  3819.  
  3820.     ═══════════════════════════════════════════════════════════════
  3821.     [canned_upload]
  3822.  
  3823.         This invokes a generic upload keyword.
  3824.  
  3825.     ═══════════════════════════════════════════════════════════════
  3826.     [canned_filelist]
  3827.  
  3828.     This lists all or selected files in the current file area.
  3829.  
  3830.     ═══════════════════════════════════════════════════════════════
  3831.     [canned_newfiles]
  3832.  
  3833.     This lists all new files or files since a specified date in the
  3834.     current file area.
  3835.  
  3836.  
  3837.  
  3838.  
  3839.  
  3840.         NanoBBS - UFO Language Documentation                    Page 64
  3841.  
  3842.  
  3843.         ═══════════════════════════════════════════════════════════════
  3844.     [canned_findfile]
  3845.  
  3846.     This invokes the hyper-speed file finder.  It is NOT a synonym
  3847.     of the [filesearch] keyword described earlier in this document,
  3848.     because it prompts the user for the file specification, while
  3849.     [filesearch] requires a file spec tp be provided in a noun.
  3850.  
  3851.     ═══════════════════════════════════════════════════════════════
  3852.     [canned_filemenu]
  3853.  
  3854.     This invokes the generic file section menu.
  3855.  
  3856.     ═══════════════════════════════════════════════════════════════
  3857.     [canned_nextmb]
  3858.  
  3859.     This jumps to the next message base.  If the user is already in
  3860.     the highest-numbered message base, the jump will be to the
  3861.     lowest-numbered base to which the user has access.
  3862.  
  3863.     ═══════════════════════════════════════════════════════════════
  3864.     [canned_prevmb]
  3865.  
  3866.     This jumps to the previous message base.  If the user is already
  3867.     in the lowest-numbered message base, the jump will be to the
  3868.     highest-numbered base to which the user has access.
  3869.  
  3870.     ═══════════════════════════════════════════════════════════════
  3871.     [canned_nextfb]
  3872.  
  3873.     This jumps to the next file area.  If the user is already in the
  3874.     highest-numbered file area, the jump will be to the
  3875.     lowest-numbered area to which the user has access.
  3876.  
  3877.     ═══════════════════════════════════════════════════════════════
  3878.     [canned_prevfb]
  3879.  
  3880.     This jumps to the previous file area.  If the user is already in
  3881.     the lowest-numbered file area, the jump will be to the
  3882.     highest-numbered area to which the user has access.
  3883.  
  3884.     ═══════════════════════════════════════════════════════════════
  3885.         [canned_timebank]
  3886.  
  3887.         This invokes the generic Time Bank menu.
  3888.  
  3889.         ═══════════════════════════════════════════════════════════════
  3890.     [canned_jumpfb]
  3891.  
  3892.     This invokes the canned jump file area prompt.    The user can
  3893.     select a file area, jump to the next or previous file area, get
  3894.     a list of file areas, or quit.
  3895.  
  3896.  
  3897.  
  3898.  
  3899.  
  3900.         NanoBBS - UFO Language Documentation                    Page 65
  3901.  
  3902.  
  3903.         ═══════════════════════════════════════════════════════════════
  3904.     [plaque]
  3905.  
  3906.     This displays the NanoBBS version information, or the "bridge
  3907.     plaque" (apologies to trekkies)
  3908.  
  3909.         ═══════════════════════════════════════════════════════════════
  3910.         [infoplaq]
  3911.  
  3912.         This displays the copyright banner and several memory-related
  3913.         disgnostic data.  It is identical to the undocumented "$"
  3914.         keyword at the canned main menu... whoops... I guess it's
  3915.         documented now!
  3916.  
  3917.         ═══════════════════════════════════════════════════════════════
  3918.         [nanochat]
  3919.  
  3920.         This invokes the NanoCHAT multi-user chat system, a
  3921.         teleconferencing system similar to that found in other quality
  3922.         multi-line BBS packages.  This chat system is fully documented
  3923.         in NANOBBS.DOC.  This keyword is ignored if the user is not
  3924.         logged in yet, meaning essentially that you can't use this
  3925.         keyword in your initial welcome screen...
  3926.  
  3927.         ═══════════════════════════════════════════════════════════════
  3928.         [canned_whoson]
  3929.  
  3930.         This displays a list of users online at the same time, how long
  3931.         each user has been on and what they are doing (being
  3932.         sufficiently vague as to afford other users -some- privacy).  It
  3933.         gives the user an option to mark him/herself "unavailable for
  3934.         chat".
  3935.  
  3936.         ═══════════════════════════════════════════════════════════════
  3937.         [whoson]
  3938.  
  3939.         This just gives a display of the users online as in the
  3940.         [canned_whoson] previously described, without prompting the user
  3941.         for availability.
  3942.  
  3943.         ═══════════════════════════════════════════════════════════════
  3944.         [freezetime]
  3945.  
  3946.         This temporarily freezes time, so that the user can proceed
  3947.         without time limits.  Time spent in frozen time is not charged
  3948.         to the user's cumulative time online for the day.  This keyword
  3949.         can be undone with the [unfreezetime] keyword.
  3950.  
  3951.         ═══════════════════════════════════════════════════════════════
  3952.         [unfreezetime]
  3953.  
  3954.         This unfreezes time.  What that means is that if the user had
  3955.         been in "frozen" time (as a result of the use of the
  3956.         [freezetime] keyword or because s/he was flagged as "No Limit")
  3957.         the clock will again start to tick and normal time limits for
  3958.         the user's access level will apply.
  3959.  
  3960.         NanoBBS - UFO Language Documentation                    Page 66
  3961.  
  3962.  
  3963.         ═══════════════════════════════════════════════════════════════
  3964.         [iftimefrozen]
  3965.  
  3966.         This keyword skips ahead to the next [mark] if time is not
  3967.         frozen, otherwise if time is frozen it keeps processing.
  3968.  
  3969.         ═══════════════════════════════════════════════════════════════
  3970.         [log {string}]
  3971.  
  3972.         This makes a log entry in NANOBBS.LOG with the {string} noun as
  3973.         the log contents.
  3974.  
  3975.     ═══════════════════════════════════════════════════════════════
  3976.     [message {noun}]
  3977.  
  3978.     This displays a "SysMsg" from the language file.  The message
  3979.     number is in the noun.
  3980.  
  3981.         ═══════════════════════════════════════════════════════════════
  3982.         [ghostpost {area} {filename} {from} {to} {subject}]
  3983.  
  3984.         Yes, this verb needs five nouns.
  3985.  
  3986.         This verb will post an automatic message to the area specified
  3987.         in the first noun.  The message body is contained in the file
  3988.         specified by the second noun.  The third noun specifies the
  3989.         "From" name.  The fourth noun specifies the recipient's name.
  3990.         The fifth noun specifies the subject.  This always posts a
  3991.         public message, even if the area in question is private.
  3992.  
  3993.         If the file does not exist or if the user online at the time
  3994.         does not have access to the area in question, no message is
  3995.         posted.  The filename MUST be fully pathed!
  3996.  
  3997.         You can insert UFO variables in the message text by using %V
  3998.         plus the variable number 1 to 40, examples:  %V01  %V10  %V15
  3999.         %V39.  No other UFO nouns can be embedded in the message text -
  4000.         use a [copy] keyword to copy a noun into a variable to get
  4001.         around this.
  4002.  
  4003.         ═══════════════════════════════════════════════════════════════
  4004.         [ghostpostp {area} {filename} {from} {to} {subject}]
  4005.  
  4006.         This is identical to [ghostpost] except that it always posts a
  4007.         private message.
  4008.  
  4009.         ═══════════════════════════════════════════════════════════════
  4010.         [logoff]
  4011.  
  4012.         This goes through the motions of logging the user off without
  4013.         actually hanging up - you could use this to allow users to
  4014.         logoff and then logon again (perhaps under a different account)
  4015.         without having to redial!
  4016.  
  4017.  
  4018.  
  4019.  
  4020.         NanoBBS - UFO Language Documentation                    Page 67
  4021.  
  4022.  
  4023.  
  4024.         ═══════════════════════════════════════════════════════════════
  4025.         [bye_nohangup]
  4026.  
  4027.         This is identical to [canned_goodbye] except that, as the name
  4028.         implies, it does not hang up the modem.
  4029.  
  4030.         ═══════════════════════════════════════════════════════════════
  4031.         [donthanguponbye]
  4032.  
  4033.         This instructs NanoBBS not to hangup when the user logs off, not
  4034.         even in the canned interface.  If you're using the canned
  4035.         interface, you'll want something in your byebye file that
  4036.         re-cycles to a logon prompt or something, or else NanoBBS will
  4037.         just exit and when it's re-run for WFC, it'll just reset the
  4038.         modem anyway, hanging up on whoever was there!
  4039.  
  4040.         ═══════════════════════════════════════════════════════════════
  4041.         [hanguponbye]
  4042.  
  4043.         This reverses a previous [donthanguponbye] command.  By default,
  4044.         NanoBBS hangs up when the user logs off, so unless you've used a
  4045.         [donthanguponbye] you won't need this.
  4046.  
  4047.         ═══════════════════════════════════════════════════════════════
  4048.         [canned_pageuser]
  4049.  
  4050.         This invokes the same hardcode as the "Page User" option from the
  4051.         [W]ho menu.  It goes through the motions of paging another user on
  4052.         a multi-node system to NanoCHAT.  There are no parameters.
  4053.  
  4054.         ═══════════════════════════════════════════════════════════════
  4055.         [canned_telegram]
  4056.  
  4057.         This invokes the same hardcode as the "Send Telegram" option from
  4058.         the [W]ho menu.  It goes through the motions of sending a
  4059.         "telegram" to another user on a multi-node system.  There are no
  4060.         parameters.
  4061.  
  4062.         ═══════════════════════════════════════════════════════════════
  4063.         [noabort]
  4064.  
  4065.         This keyword prevents the user from aborting the UFO script with a
  4066.         hotkey.
  4067.  
  4068.         ═══════════════════════════════════════════════════════════════
  4069.         [abortok]
  4070.  
  4071.         This keyword permits the user to abort the UFO script by hitting
  4072.         any key.
  4073.  
  4074.         ═══════════════════════════════════════════════════════════════
  4075.         [writebang {noun}]
  4076.  
  4077.         This writes the contents of {noun} to the "Bang Prompt".  The
  4078.         previously existing prompt is overwritten.
  4079.  
  4080.         NanoBBS - UFO Language Documentation                    Page 68
  4081.  
  4082.  
  4083.  
  4084.         ═══════════════════════════════════════════════════════════════
  4085.         [moretype {noun}]
  4086.  
  4087.         This defines what kind of "More?" prompts are displayed each page.
  4088.  
  4089.         The {noun} is a number code, with the following significances:
  4090.  
  4091.         0: Display a "Hit Any Key" prompt instead so the user has no "No"
  4092.            option (great for required messages like rules, new user info
  4093.            etc.)
  4094.  
  4095.         1: Just the options "Yes" and "No"
  4096.  
  4097.         2: "Yes", "No", and "=" which means nonstop.
  4098.  
  4099.         3: "Yes", "No", "=Nonstop" and "Flag" as in flag a file for
  4100.            downloading.
  4101.  
  4102.         ═══════════════════════════════════════════════════════════════
  4103.         [yndefault {noun}]
  4104.  
  4105.         This sets the default (if the user hits enter at a "Y/N" prompt)
  4106.         response.  The noun can either be YES or NO or Y or N.
  4107.  
  4108.         ═══════════════════════════════════════════════════════════════
  4109.         [iftrashcan {noun}]
  4110.  
  4111.         This will continue processing if the {noun} is in the default
  4112.         trashcan file, TRASHCAN.CTL.  If the {noun} is not in the trashcan,
  4113.         then UFO will skip ahead to the next [mark].
  4114.  
  4115.         ═══════════════════════════════════════════════════════════════
  4116.         [ifcensor {noun}]
  4117.  
  4118.         This is identical to [iftrashcan] except that the {noun} is checked
  4119.         against the default censor file, CENSOR.CTL.
  4120.  
  4121.         ═══════════════════════════════════════════════════════════════
  4122.         [ifbadstring {string} {filename}]
  4123.  
  4124.         This is similar to [iftrashcan] and [ifcensor] except that you can
  4125.         specify any filename to check {string} against.  If no path is
  4126.         specified with the filename, UFO assumes that the file can be found
  4127.         in the syspath defined in your config file.
  4128.  
  4129.         ═══════════════════════════════════════════════════════════════
  4130.         [figuretime]
  4131.  
  4132.         This causes NanoBBS to calculate the user's session time status and
  4133.         place the results in the Language Parameters in the order they are
  4134.         used by SysMsg 73.
  4135.  
  4136.         ═══════════════════════════════════════════════════════════════
  4137.         [timereport]
  4138.  
  4139.         This displays [sysmsg 73].  It is a detailed report of the amount
  4140.         of time the user has used in the current session, including how
  4141.         much "frozen" time, "granted" time and "banked" time is involved in
  4142.         this session.
  4143.  
  4144.         ═══════════════════════════════════════════════════════════════
  4145.         [plain {string}]
  4146.  
  4147.         This displays a string which may contain embedded colours, without
  4148.         translating the embedded codes.  Useful for inspecting the raw form
  4149.         of colourful strings.
  4150.  
  4151.         ═══════════════════════════════════════════════════════════════
  4152.         [ifbirthday]
  4153.  
  4154.         This will process to the next [mark] if it is the user's birthday
  4155.         today.  If it is not the user's birthday it will skip ahead until
  4156.         it reaches the next [mark] or the end of the file.
  4157.  
  4158.         ═══════════════════════════════════════════════════════════════
  4159.         [dispenseaccess {access}]
  4160.  
  4161.         This sets the user's access level to the specified level AND sets
  4162.         the user's expiry date to the one specified for that access level
  4163.         in EXPIRY.CTL.
  4164.  
  4165.         ═══════════════════════════════════════════════════════════════
  4166.         [setexpiry {days}]
  4167.  
  4168.         This set's the user's expiry date to the specified number of days
  4169.         in the future.
  4170.  
  4171.         ═══════════════════════════════════════════════════════════════
  4172.         [chat_send {node} {path} {filename}]
  4173.  
  4174.         This sends a text, ANSI, RIP or UFO file to the caller on the
  4175.         specified node.  You may substitute a few letters from the caller's
  4176.         chat handle instead, as in chat.  Note that the path and filename
  4177.         are separate; this allows you to let users select filenames from a
  4178.         secure directory.  If path information is specified in {filename}
  4179.         it will be stripped and the path specified in {path} will be used,
  4180.         making this keyword hack-proof.
  4181.  
  4182.         ═══════════════════════════════════════════════════════════════
  4183.         [chat_bc {path} {filename}]
  4184.  
  4185.         This sends a text, ANSI, RIP or UFO file to everyone on the
  4186.         caller's channel.  As in [chat_send] this keyword uses a separate
  4187.         path and filename for security.  Just hard-code the path and let
  4188.         users enter the filename if they wish, as long as the files are in
  4189.         a directory where there's nothing sensitive, there will be no
  4190.         security problems.
  4191.  
  4192.  
  4193.         ═══════════════════════════════════════════════════════════════
  4194.         [chat_bc_except {node} {path} {filename}]
  4195.  
  4196.         This is like [chat_bc] except that it will NOT send the file to one
  4197.         node you specify.  This way you can use this to build chat alias
  4198.         commands that work as super-actions, in which you use a [chat_send]
  4199.         to send the recipient's copy and a [chat_bc_except] to broadcast
  4200.         copies to everyone else who would see the action.
  4201.  
  4202.         ═══════════════════════════════════════════════════════════════
  4203.         [profilemenu]
  4204.  
  4205.         This takes the user to the canned User Profiles menu.
  4206.  
  4207.         ═══════════════════════════════════════════════════════════════
  4208.         [showprofile {username}]
  4209.  
  4210.         This displays the User Profile information for the specified (by
  4211.         logon username) user.
  4212.  
  4213.         ═══════════════════════════════════════════════════════════════
  4214.         [loadnode {node}]
  4215.  
  4216.         This loads the user account of the person on {node} into the Object
  4217.         user record for whatever purposes you want =)
  4218.        
  4219.  
  4220.         NanoBBS - UFO Language Documentation                    Page 68
  4221.  
  4222.  
  4223.