home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC-Online 1998 February
/
PCOnline_02_1998.iso
/
filesbbs
/
dos
/
nbeta087.exe
/
UFO.DOC
< prev
Wrap
Text File
|
1996-10-27
|
143KB
|
4,223 lines
▄█████▄ ▄█████▄ ▄█████▄ ▄████▄ ▄█████▄ ▄█████▄ ▄████▄
▄▄▄ ▀███ ▄▄▄ ▀███ ▄▄▄ ▀███ ▄▄▄ ▀███ ▄▄▄ ██▀ ▄▄▄ ██▀ ▄▄▄ ▀▀▀
███ ███ ███ ███ ███ ███ ███ ███ ██████▄ ██████▄ ▀████▄
███ ███ ████████ ███ ███ ███▄ ███ ███ ███ ███ ███ ▄▄▄ ███
███ ███ ███ ███ ███ ███ ▀████▀ ██████▀ ██████▀ ▀████▀
NanoBBS 2.00
Copyright 1994,1996 Whirlwind Software
All Rights Reserved
Program and Documentation by Gerald Albion
Additional Code by
Mark Dignam and Mark May
╔═══════════════════════════════════════════════════════════════╗
║ ┌─┐ ┌─┐┌──────┐┌───────┐ ║
║ │ │ │ ││ ┌────┘│ ┌───┐ │ Universal Flexible Online: ║
║ │ │ │ ││ └─┐ │ │ │ │ The UFO Scripting Language ║
║ │ └───┘ ││ ┌─┘ │ └───┘ │ ║
║ └───────┘└─┘ └───────┘ ║
╚═══════════════════════════════════════════════════════════════╝
UFO is an acronym standing for Universal Flexible Online.
Let's just say I was really into some Michael Schenker music
when I coined that one.
The UFO scripting language is made up of keywords in a flat
ASCII text file. In order to turn the keywords into tokens that
NanoBBS can understand, you must run the UFO script compiler
(UFO.EXE) with your script file.
There are three kinds of keywords.
┌───────┐
│ VERBS │ are action keywords; they actually do something. They
└───────┘ might change a colour or invoke a canned option or
perform some arcane logical program flow function, at your
disposal.
┌───────┐
│ NOUNS │ are variables and other "things" in the BBS. A noun
└───────┘ might be part of a user's record such as name or
password, or perhaps a system variable like number of calls or
current baud rate. Many verbs act on nouns, and most verbs can
act on ALL nouns. This ability to combine actions with any
system noun instantly gives you incredible power to customize
your system, but there is third dimension to this syntactic
structure...
NanoBBS - UFO Language Documentation Page 1
┌────────────┐
│ ADJECTIVES │ are modifiers which change the form or
└────────────┘ content of nouns before a verb acts on them. You
might, for example, want to display a noun but in upper case;
for this you would use an [uppercase] adjective between the verb
and the noun.
Here is the basic syntax:
[verb] This is a simple action with no parameters.
[verb noun] This is the simplest form of a verb that performs
an action on a noun.
[verb noun noun] Some verbs perform the action on more than one
noun, or perform the action on one noun and need another as
input to decide how to perform the action.
[noun] A noun by itself will simply be displayed to the user.
Sort of like: Spot. This is Spot. See Spot. You get the
picture.
[adjective noun] An adjective followed by a noun, without a
verb, will cause the noun to be displayed after the changes
specified by the adjective are made.
[verb adjective noun] This will perform the action with the
adjective-modified noun.
[verb adjective1 adjective2 .... adjectiveX noun] You may
string as many adjectives as you need to get a desired effect
on a noun.
[verb adjective noun adjective adjective2 noun] Verbs which
require more than one noun can also use any number of
adjectives. One thing, where a verb specifies a noun to be
changed, it is pointless and invalid to specify an adjective
for the "destination" noun. Results of such an operation are
unknown.
If all this sounds remarkably like programming in plain
English, well, that's how I intended it to be. There is, of
course, a caveat: in order to distunguish keywords from the
regular text in your UFO files, keywords are enclosed in
[square brackets], also called braces. Anything not enclosed
in braces is treated as plain text and is displayed to the user
as it appears.
You can also use the embedded colour commands (the ones that
start with the tilde ~ character, as discussed in the chapter
on embedded commands), and you may even find it easier to type
these embedded colours directly rather than using their
full-syntax equivalents. Either way is fine.
NanoBBS - UFO Language Documentation Page 2
As in English, some combinations make no sense. Just as a
pink-with-purple-polka-dot frog is something only an acid freak
ever sees, likewise a sillycased download count is not of this
particular world either. I cannot be responsible for what
happens to your sanity if you try anything immensely kinky in
UFO (grin)...
Unlike some script langauges, you can stack as many UFO
keywords between a set of braces as you want. You can put as
much whitespace before, after and between each keyword as you
like, and you can span keywords across multiple lines of text
without having blank lines show up when the compiled UFO file
is run. In short, it's pretty danged forgiving.
Here is an example of a basic verb:
[green]This is green text!
The above example will change the foreground colour to green and
display the message "This is green text!" to the user in green!
Another example:
[white]Go Sweden! [yellow on blue]─┼──[background black cleol]
The above example changes the foreground colour to white,
then displays the message "Go Sweden!" and then changes colours
to yellow on a blue background, and uses some nifty IBM line
drawing characters to draw a cute little blue and yellow Swedish
flag... using a background colour keyword to change the
background colour back to black and then a [cleol] to clear to
the end of line.
Let's see another example, using adjectives!
[magenta]Welcome back, [lightcyan sillycase username magenta]!
This example first changes the colour to magenta and says
"Welcome back, " to the user. It then changes the colour to
light cyan and displays the user's name, in "Silly Case" which
is one of many special effects in UFO's repertoire.
NanoBBS - UFO Language Documentation Page 3
I should point out at this time that there is a [display] verb
which is theoretically supposed to be used to display a noun
such as the username, but if the UFO.EXE program detects a noun
or adjective where there ought to be a verb, it assumes the verb
is [display] and continues on its merry way. Therefore, the
[sillycase username] above is really the same as [display
sillycase username].
Anyhow, we should see something like this:
Welcome back, GeRaLd aLbIoN!
Pretty cool, eh?
Here is an example with conditionals and the [mark] keyword:
[ifeq useraccess 50000 pageplay "SYSOP.PPL" goto EN mark
pageplay "LAMER.PPL"][label EN]
This tests to see if the user's access is exactly 50000, no
higher or lower. If it is 50000, the pageplay file "SYSOP.PPL"
is played on the local speaker, otherwise the file "LAMER.PPL" is
played. How it works is this: UFO sees the IFEQ keyword and
then compares USERACCESS with 50000. 50000 is a numeric
constant and numeric constants don't need quotes. If USERACCESS
and 50000 compare true (i.e. if they're the same) then all the
code up to the MARK keyword is processed, otherwise it is
skipped. OK, let's say the user does have 50000 access. We
continue on to pageplay the "SYSOP.PPL" file (in quotes because
it is a non-numeric constant) and then we jump directly to the
EN label (labels have two characters only, see the label verb
later in this chapter). Now, if the user's access was not
50000, UFO would skip everything until the MARK keyword and
would then see the pageplay keyword, and would play the
"LAMER.PPL" file. After that it would be at the same place, the
EN label.
╔══─────────────────────────────────────────────────────────────══╗
║ Constants in UFO: ║
│ │
│ Most verbs allow you to specify a constant as a read-only noun │
│ in most places. Numerical constants (those which are meant to │
│ be numbers) can just be entered verbatim. However, in order │
│ to distinguish non-numerical constants from keywords, │
│ non-numerical (or text) constants must be enclosed in quotes. │
│ │
│ These are valid commands in UFO: │
│ │
│ [display 1000] [display "1000"] │
│ [display "Kilroy Was Here!"] [copy var01 "Kilroy Was Here!"] │
│ │
│ These are not: │
│ │
│ [display Kilroy Was Here!] │
║ [copy "Kilroy Was Here!" var01] ║
╚══─────────────────────────────────────────────────────────────══╝
NanoBBS - UFO Language Documentation Page 4
There are virtually countless combinations of verbs, adjectives
and nouns possible, and most of the verbs listed in this chapter
will include examples in context to help you make use of these
powerful features!
Exercise caution and run tests using the VIEWUFO utility before
you turn your own UFO creations loose on your users! It -is-
possible to delete important files or go into endless loops that
send your hard disk's MTBF into a nose dive using UFO scripts. I
should stress at this point that users cannot enter compiled UFO
keywords in messages or at the bang prompt, but they can upload
UFO scripts to you (trojans) and if you directly display
uploaded files using the [link] keyword, well, you're wide open
to abuse by malevolent soon-to-be-EX-users! It is NOT a good
idea to write a k-nifty ANSI viewing menu that lets users upload
to it without screening. Caveat lector!
DATES AND TIMES IN UFO
Throughout NanoBBS and everywhere in the UFO syntax, dates are
stored in a long integer in the "Seconds Since 1970" format.
This means that dates are stored as a number of seconds elapsed
since midnight, January 1st, 1970. This is used for the
author's personal convenience (only a four-byte single variable
is needed for storage) and for consistency with numerous other
systems (most notably Unix) which use this form of dates. THE
ONE EXCEPTION to this rule is the birthdate, which is stored in
ASCII in YY-MM-DD format. There is a keyword (the [ymd2s70]
adjective) which will give you a second-since-1970 of the
birthdate if you need it, and it will return a negative number
if the date is before 1970 (pretty cool huh...). At this
writing, about 780 million seconds have elapsed since midnight
70-01-01.
Likewise, a time-of-day is stored as a number of seconds since
midnight, and can range from zero to 86399.
NanoBBS - UFO Language Documentation Page 5
╔════════════════════════════════════════════════════════════════════╗
║ ║
║ ║
║ Adjectives ║
║ ║
║ ║
╚════════════════════════════════════════════════════════════════════╝
═══════════════════════════════════════════════════════════════
[sillycase {noun}]
Returns noun in SiLlY CaSe
═══════════════════════════════════════════════════════════════
[leftjustify {noun1} {noun2}]
Left justifies noun1 in noun2 columns
═══════════════════════════════════════════════════════════════
[rightjustify {noun1} {noun2}]
Right justifies noun1 in noun2 columns
═══════════════════════════════════════════════════════════════
[centerjustify {noun1} {noun2}]
Centre justfies noun1 in noun2 columns {This can be used to do
some REALLY cool stuff!}
═══════════════════════════════════════════════════════════════
[lowercase {noun}]
Returns noun in lowercase
═══════════════════════════════════════════════════════════════
[uppercase {noun}]
Returns noun in UPPERCASE
═══════════════════════════════════════════════════════════════
[mixedcase {noun}]
Returns noun in Mixed Case
═══════════════════════════════════════════════════════════════
[firstname {noun}]
Assumes the noun is a person name and attempts to parse out the
given name, returning what it gets. It is programmed to skip
Mr., Mrs., Miss, Ms., Dr., The, and several other titles and
pseudonym prefices.
NanoBBS - UFO Language Documentation Page 6
═══════════════════════════════════════════════════════════════
[century {noun}]
Returns 19 or 20 (noun is a Sec70 Date)
═══════════════════════════════════════════════════════════════
[year {noun}]
Returns two-digit year of Sec70 date
═══════════════════════════════════════════════════════════════
[monthpad {noun}]
Returns 0-padded month of Sec70 date
═══════════════════════════════════════════════════════════════
[month {noun}]
Returns unpadded month of Sec70 date
═══════════════════════════════════════════════════════════════
[longmonth {noun}]
Returns full month name of Sec70 date
═══════════════════════════════════════════════════════════════
[shortmonth {noun}]
Returns 3-letter month of Sec70 date
═══════════════════════════════════════════════════════════════
[datepad {noun}]
Returns 0-padded day of month of Sec70 date
═══════════════════════════════════════════════════════════════
[date {noun}]
Returns unpadded day of month of Sec70 date
═══════════════════════════════════════════════════════════════
[dateord {noun}]
Returns ordinal suffix of date
═══════════════════════════════════════════════════════════════
[dotwlong {noun}]
Returns longhand day of the week
═══════════════════════════════════════════════════════════════
[dotwshort {noun}]
Returns shorthand day of the week
NanoBBS - UFO Language Documentation Page 7
═══════════════════════════════════════════════════════════════
[time12h {noun}]
Returns time in 12 hr format (no seconds)
═══════════════════════════════════════════════════════════════
[time12hs {noun}]
Returns time in 12 hr format (w/seconds)
═══════════════════════════════════════════════════════════════
[time24h {noun}]
Returns time in 24 hr format (no seconds)
═══════════════════════════════════════════════════════════════
[time24hs {noun}]
Returns time in 24 hr format (w/seconds)
═══════════════════════════════════════════════════════════════
[meridian {noun}]
Returns am or pm as required
═══════════════════════════════════════════════════════════════
[hour24 {noun}]
Returns the hour part (in 24h format)
═══════════════════════════════════════════════════════════════
[hour12 {noun}]
Returns the hour part (in 12h format)
═══════════════════════════════════════════════════════════════
[minute {noun}]
Returns the minute part
═══════════════════════════════════════════════════════════════
[second {noun}]
Returns the second part
═══════════════════════════════════════════════════════════════
[sdrawkcab {noun}]
Returns the noun backwards
═══════════════════════════════════════════════════════════════
[backwards {noun}]
Returns the noun backwards
NanoBBS - UFO Language Documentation Page 8
═══════════════════════════════════════════════════════════════
[drawkcab {noun}]
Returns the noun backwards
═══════════════════════════════════════════════════════════════
[backward {noun}]
Returns the noun backwards
═══════════════════════════════════════════════════════════════
[product {noun1} {noun2}]
Returns the mathematical product of the two nouns
═══════════════════════════════════════════════════════════════
[quotient {noun1} {noun2}]
Returns the mathematical quotient of {noun1} divided by {noun2}.
Quotient is truncated down to nearest integer.
═══════════════════════════════════════════════════════════════
[remainder {noun1} {noun2}]
Returns the remainder of {noun1} divided by {noun2}.
═══════════════════════════════════════════════════════════════
[sum {noun1} {noun2}]
Returns the mathematical sum of {noun1} and {noun2}.
═══════════════════════════════════════════════════════════════
[difference {noun1} {noun2}]
Returns the mathematical difference between {noun1} and {noun2},
or in other words {noun1} minus {noun2}.
═══════════════════════════════════════════════════════════════
[ratio {noun1} {noun2}]
Returns the ratio of {noun1}:{noun2} in the form n:1
═══════════════════════════════════════════════════════════════
[percentage {noun1} {noun2}]
Returns the percentage that {noun1} is of {noun2}.
═══════════════════════════════════════════════════════════════
[xfer_estimate {noun}]
Returns the estimated transfer time (in seconds) of the byte
count in {noun}. Accounts for baud rate.
NanoBBS - UFO Language Documentation Page 9
═══════════════════════════════════════════════════════════════
[ymd2s70 {noun}]
Returns a SecondSince1970 integer date from a valid YY/MM/DD or
YY-MM-DD date in {noun}
═══════════════════════════════════════════════════════════════
[ymd {noun}]
Returns a canned YY/MM/DD date of the SecondSince1970 date in
{noun}. A nice quicky to avoid the tedium of building custom
dates with the previous lot of keywords.
═══════════════════════════════════════════════════════════════
[ordinal {noun}]
Returns ordinal suffix of noun if noun is numerical, nothing
otherwise.
Ex.:
Happy [userage ordinal userage] Birthday!
If this were the user's 27th birthday, this bit of code would
display the string "Happy 27th Birthday!". In this example,
first the user's actual age in years is displayed, and then the
ordinal suffix - in this case "th". You might want to use this
in a welcome screen in conjunction with an [ifbirthday] verb.
═══════════════════════════════════════════════════════════════
[dollars {noun}]
Assuming the noun is a quantity of money in cents (as credits
for netmail are stored) this adjective returns a dollar amount,
e.g. 0.50 for 50 cents, 1.25 for 125 cents etcetera. Good for
informing a user how much s/he is being dinged for a netmail.
═══════════════════════════════════════════════════════════════
[fidocost {noun}]
This returns the cost in cents, as defined in FIDOCOST.CTL, of a
netmail to the address specified in the noun. If the address is
invalid or if it is not known in FIDOCOST.CTL (or covered by an
ALL clause) then the cost returned is zero. This is well used
in conjunction with the preceding [dollars] keyword.
═══════════════════════════════════════════════════════════════
[creditcard {noun}]
This checks the noun to see if it's a valid credit card number. If
it is, and the card type is recognized, it will return AMEX, VISA,
MASTERCARD or DISCOVER. If it is a valid card of an unknown type,
UNKNOWN is returned. If the card is in any way invalid (by
checksum, missing digits, etc) the adjective returns INVALID.
NanoBBS - UFO Language Documentation Page 10
═══════════════════════════════════════════════════════════════
[zeropad {noun1} {noun2}]
This pads {noun1} with the number of zeroes specified by {noun2}.
This is useful for a number of applications but was written to aid
in writing a credit card acceptance UFO script.
Examples:
[zeropad 5 3]
This would result in:
005
[zeropad "621" 8]
This would result in:
00000621
NanoBBS - UFO Language Documentation Page 11
╔════════════════════════════════════════════════════════════════════╗
║ ║
║ ║
║ Nouns ║
║ ║
║ ║
╚════════════════════════════════════════════════════════════════════╝
═══════════════════════════════════════════════════════════════
[var01] [var02] [var03] ... [var38] [var39] [var40]
These are general purpose variables for your own use. There are
40 of these variables. They can contain strings of up to 255
characters each. If the strings represent numerical values,
they can be copied to numerical nouns, or they can have
mathematical operations performed on them or be used as
numerical parameters in the RIPscrip suite. They are most often
used as temporary storage and as indices for loops.
═══════════════════════════════════════════════════════════════
[username]
The user's logon name/pseudo
═══════════════════════════════════════════════════════════════
[userrealname]
The user's real name
═══════════════════════════════════════════════════════════════
[userlocation]
The user's location
═══════════════════════════════════════════════════════════════
[userpassword]
The user's password
═══════════════════════════════════════════════════════════════
[userphone]
The user's phone number
═══════════════════════════════════════════════════════════════
[userlastdate]
Date/Time of user's last call
═══════════════════════════════════════════════════════════════
[usercredit]
User's online time credit.
NanoBBS - UFO Language Documentation Page 12
═══════════════════════════════════════════════════════════════
[userposts]
Number of messages user has posted.
═══════════════════════════════════════════════════════════════
[useraccess]
User's access level.
═══════════════════════════════════════════════════════════════
[usercalls]
Number of calls user has made
═══════════════════════════════════════════════════════════════
[useruploads]
Number of kilobytes uploaded
═══════════════════════════════════════════════════════════════
[userdownloads]
Number of kilobytes downloaded
═══════════════════════════════════════════════════════════════
[userdownloadtoday]
Number of kilobytes downloaded today
═══════════════════════════════════════════════════════════════
[userelapsed]
Minutes used by user today
═══════════════════════════════════════════════════════════════
[userlines]
Number of lines the user has set (usually 24)
═══════════════════════════════════════════════════════════════
[usercolumns]
Number of columns the user has set (usually 80)
═══════════════════════════════════════════════════════════════
[userfirstdate]
The Date and time of the user's first call to the system, in
SecondsSince1970 form
═══════════════════════════════════════════════════════════════
[userbday]
The user's birthdate, as entered by him/her.
NanoBBS - UFO Language Documentation Page 13
═══════════════════════════════════════════════════════════════
[userage]
The user's age in years. Because this is a derived noun (from
the Birthdate field) it is read-only - any attempt to change its
value will have no effect.
═══════════════════════════════════════════════════════════════
[userexpiry]
The date of the user's account expiry, in SecondsSince1970
format.
═══════════════════════════════════════════════════════════════
[userbank]
The balance of the user's time bank "account". This is the
total number of minutes the user has stored for future use.
═══════════════════════════════════════════════════════════════
[userbanktoday]
This is the number of minutes the user has already withdrawn
from the time bank today - this value is used internally to
enforce per-day withdrawal limits.
═══════════════════════════════════════════════════════════════
[msgfrom]
The "From" field of the current message
═══════════════════════════════════════════════════════════════
[msgto]
The "To" field of the current message
═══════════════════════════════════════════════════════════════
[msgsubj]
The "Subject" field of the current message
═══════════════════════════════════════════════════════════════
[msgnum]
The Message Number of the current message
═══════════════════════════════════════════════════════════════
[msgorig]
The full 3D (or 4D if applicable) FTN address of the origin of
the current message. If the "point" is zero, the address is
returned in 3D.
NanoBBS - UFO Language Documentation Page 14
═══════════════════════════════════════════════════════════════
[msgdest]
The full 3D (or 4D if applicable) FTN address of the destination
of the current message. If the "point" is zero, the address is
returned in 3D.
═══════════════════════════════════════════════════════════════
[msgorigzone]
The Zone number of the current message's origin node
═══════════════════════════════════════════════════════════════
[msgorignet]
The Net number of the current message's origin node
═══════════════════════════════════════════════════════════════
[msgorignode]
The Node number of the current message's origin node
═══════════════════════════════════════════════════════════════
[msgdestzone]
The Zone number of the current message's destination node
═══════════════════════════════════════════════════════════════
[msgdestnet]
The Net number of the current message's destination node
═══════════════════════════════════════════════════════════════
[msgdestnode]
The Node number of the current message's destination node
═══════════════════════════════════════════════════════════════
[msgdate]
The message's date in SecondsSince1970 format
═══════════════════════════════════════════════════════════════
[msgareanum]
The number of the current message area
═══════════════════════════════════════════════════════════════
[msgareaname]
The name of the current message area
NanoBBS - UFO Language Documentation Page 15
═══════════════════════════════════════════════════════════════
[postpriv]
Short for POST PRIVILEGE. This is a number which is 0 if the
user may post in this area, 479 if the user does not have post
access and 946 if the area is read only. These codes correspond
to SysMsgs in the Language file which indicate these error
conditions, so you can pass this value directly to a [message]
keyword to quickly indicate the error.
═══════════════════════════════════════════════════════════════
[msgorigreply]
The number of the message that this message is a reply to
═══════════════════════════════════════════════════════════════
[msgtimesread]
The number of times the current message has been read
═══════════════════════════════════════════════════════════════
[msgreply]
The number of the next reply to this message
═══════════════════════════════════════════════════════════════
[ifmsgpvt]
This will skip to the next [mark] if the current message is not
marked "Private."
═══════════════════════════════════════════════════════════════
[textlevel]
The current UFO nesting level. This is a read-only noun.
═══════════════════════════════════════════════════════════════
[usercount]
The number of active user accounts in the BBS. This is a
read-only noun.
═══════════════════════════════════════════════════════════════
[highuser]
The highest user record number in the BBS. This is a read-only
noun.
═══════════════════════════════════════════════════════════════
[baudrate]
The user's current baud rate. This is a read-only noun.
NanoBBS - UFO Language Documentation Page 16
═══════════════════════════════════════════════════════════════
[lockbaud]
The defined locked baud rate if any. This is a read-only noun.
═══════════════════════════════════════════════════════════════
[pagestart]
The time in SecondsSinceMidnight format of when paging begins
being allowed.
═══════════════════════════════════════════════════════════════
[pageend]
The time if SecondsSinceMidnight format of when paging ends
being allowed.
═══════════════════════════════════════════════════════════════
[minbaud]
The slowest baud rate allowed.
═══════════════════════════════════════════════════════════════
[fileareaname]
The name of the current file area.
═══════════════════════════════════════════════════════════════
[fileareanum]
The number of the current file area
═══════════════════════════════════════════════════════════════
[fileareaowner]
The "owner" name of the current file area
═══════════════════════════════════════════════════════════════
[filedlpath]
The download path of the current file area
═══════════════════════════════════════════════════════════════
[fileulpath]
The upload path of the current file area
═══════════════════════════════════════════════════════════════
[failurecode]
The failure code of the last operation (that generates
failure codes). If there is a sysmsg to indicate the failure,
that sysmsg's number is returned here. Where the last operation
is successful, failure code is always zero. Not all operations
generate failure codes.
NanoBBS - UFO Language Documentation Page 17
═══════════════════════════════════════════════════════════════
[totalcalls]
The total number of calls to the system.
═══════════════════════════════════════════════════════════════
[lastcaller]
The username of the last person to call the BBS.
═══════════════════════════════════════════════════════════════
[callstoday]
The number of calls to the system today (including the current
one). A call is defined as a successful logon, and not merely a
connection.
═══════════════════════════════════════════════════════════════
[connectstoday]
The number of connects (that may or may not have resulted in a
logon) today.
═══════════════════════════════════════════════════════════════
[poststoday]
The number of messages that have been posted today.
═══════════════════════════════════════════════════════════════
[ultoday]
The number of files uploaded today.
═══════════════════════════════════════════════════════════════
[dltoday]
The number of files downloaded today.
═══════════════════════════════════════════════════════════════
[batchsize]
This is the total number of bytes in the download batch. Good
for reminding users when they are pigging out on files.
═══════════════════════════════════════════════════════════════
[comport]
This is the current comm port. If you are using COM1 it will
contain 1.
═══════════════════════════════════════════════════════════════
[time12]
This is the current time in 12-hour format without seconds. It
should be used with the [clock_ampm] keyword to create a proper
12-hour time of day.
NanoBBS - UFO Language Documentation Page 18
═══════════════════════════════════════════════════════════════
[time12s]
This is the current time in 12-hour format with seconds. It
should be used with the [clock_ampm] keyword to create a proper
12-hour time of day.
═══════════════════════════════════════════════════════════════
[time24]
This is the current time in 24-hour format without seconds.
═══════════════════════════════════════════════════════════════
[time24s]
This is the current time in 24-hour format with seconds.
═══════════════════════════════════════════════════════════════
[clock_ampm]
This is either am or pm, depending on the time of day.
═══════════════════════════════════════════════════════════════
[clock_hour24]
This is the hour, in 24-hour time, of the current time of day.
Think of it as what the little hand on your 24-hour military
clock is pointing to.
═══════════════════════════════════════════════════════════════
[clock_hour12]
This is the hour of the current time of day. Think of it as
what the little hand on the clock points to.
═══════════════════════════════════════════════════════════════
[clock_minute]
This is the minute of the current time of day. Think of it as
what the big hand points to.
═══════════════════════════════════════════════════════════════
[clock_second]
This is the second of the current time of day. Picture it as
the number that the thin red hand on the clock points to.
═══════════════════════════════════════════════════════════════
[clock_sectoday]
This is the number of seconds since midnight today. This is
considerably faster than [sec70] and should be preferred when
building strange time formats.
NanoBBS - UFO Language Documentation Page 19
═══════════════════════════════════════════════════════════════
[sec70]
This is the number of seconds since 00:00 January 1, 1970.
Peace, mun. Use this as a novelty or to create really weird
date formats!
═══════════════════════════════════════════════════════════════
[online_hour]
This is the number of hours a user has been online.
═══════════════════════════════════════════════════════════════
[online_hourp]
This is a zero-padded two-digit number of hours the user has
been online.
═══════════════════════════════════════════════════════════════
[online_minutes]
The number of minutes the user has been online.
═══════════════════════════════════════════════════════════════
[online_minutesp]
The zero-padded number of minutes the user has been online.
═══════════════════════════════════════════════════════════════
[online_seconds]
The number of seconds the user has been online.
═══════════════════════════════════════════════════════════════
[online_secondsp]
The number of seconds the user has been online. Zero-padded.
═══════════════════════════════════════════════════════════════
[online_minpart]
The minute part of an H:M:S format of the amount of time the
user has been online this call.
═══════════════════════════════════════════════════════════════
[online_minpartp]
The same as [online_minpart] except that it is zero-padded.
═══════════════════════════════════════════════════════════════
[online_secpart]
The seconds part of an H:M:S format of the amount of time the
user has been online this call.
NanoBBS - UFO Language Documentation Page 20
═══════════════════════════════════════════════════════════════
[online_secpartp]
The same as [online_secpart] except that it is zero-padded.
═══════════════════════════════════════════════════════════════
[timeonline]
The amount of time the user has been online this call.
Displayed in HH:MM:SS format for convenience.
═══════════════════════════════════════════════════════════════
[timeleft]
The amount of time the user has remaining for this call, in
seconds. This is a read-write noun, so you can change the
user's remaining time by writing to this noun.
Examples:
[add 300 timeleft]
[copy timeleft 300]
The first example adds 5 minutes to the user's time limit, and
the second example actually sets the time limit to 5 minutes.
═══════════════════════════════════════════════════════════════
[cal_century]
The century, 19 or 20.
═══════════════════════════════════════════════════════════════
[cal_year]
The year without the century, 00..99
═══════════════════════════════════════════════════════════════
[cal_month#p]
The month in numerical format with zero padding
═══════════════════════════════════════════════════════════════
[cal_month#]
The month in numerical format, no padding
═══════════════════════════════════════════════════════════════
[cal_month]
The month in longhand text, e.g. AUGUST
═══════════════════════════════════════════════════════════════
[cal_monthabbr]
The month in shorthand text, e.g. AUG
NanoBBS - UFO Language Documentation Page 21
═══════════════════════════════════════════════════════════════
[cal_datep]
The date in numerical format with zero padding
═══════════════════════════════════════════════════════════════
[cal_date]
The date in numerical format, no padding
═══════════════════════════════════════════════════════════════
[cal_datesuffix]
The ordinal suffix of the date, i.e. st, nd, rd, th.
═══════════════════════════════════════════════════════════════
[cal_dotw]
The day of the week, e.g. WEDNESDAY
═══════════════════════════════════════════════════════════════
[cal_dotwabbr]
The day of the week in shorthand, e.g. WED
═══════════════════════════════════════════════════════════════
[batchcount]
This is the number of files in the download batch.
═══════════════════════════════════════════════════════════════
[task]
This is the node (or task) number as defined in the config file.
═══════════════════════════════════════════════════════════════
[nup]
This is the New User password. Best not to display it.
═══════════════════════════════════════════════════════════════
[syspass]
This is the system password. Best not to display it.
═══════════════════════════════════════════════════════════════
[timedate]
This is a nice generic time and date in 24 hour format with
seconds and a YY-MM-DD date. Good for logging things to
questionnaire response files.
NanoBBS - UFO Language Documentation Page 22
═══════════════════════════════════════════════════════════════
[day70]
This is the number of days since January 1, 1970. Use this with
the calendar adjectives to create dates in any format!
═══════════════════════════════════════════════════════════════
[udate]
This is the time and date in a format consistent with RFC-1036.
═══════════════════════════════════════════════════════════════
[daysleft]
This is the number of days remaining until the user's account
expires.
NanoBBS - UFO Language Documentation Page 23
╔════════════════════════════════════════════════════════════════════╗
║ ║
║ ║
║ Verbs ║
║ ║
║ ║
╚════════════════════════════════════════════════════════════════════╝
═══════════════════════════════════════════════════════════════
[random {noun1} {noun2}]
Place a random number between 1 and {noun1} into {noun2}
Here is an example which gives the user a sort of Instant Time
Lottery:
[random 100 timeleft]
═══════════════════════════════════════════════════════════════
[bumpcalls]
Increments the number of calls to the system. This keyword has
no parameters.
═══════════════════════════════════════════════════════════════
[loguser {noun1} {noun2}]
Logs user to system. User name or real name is in {noun1},
password is in {noun2}. Failurecodes: 0=OK, 1=bad pass, 2=user
not found.
═══════════════════════════════════════════════════════════════
[trashcan {username}]
This runs the specified username through the trashcan filter -
if it is found there, the user is logged off. Needless to say
it would be kind of stupid to set this to a constant.
═══════════════════════════════════════════════════════════════
[updateuser]
This rewrites the user's record. If we are working with an
object user, the object user is rewritten instead.
═══════════════════════════════════════════════════════════════
[delay {noun}]
This waits for {noun} milliseconds. This has a 10 millisecond
resolution.
═══════════════════════════════════════════════════════════════
[updatelastread]
This updates the user's lastread pointer for the current area.
Unnecessary for changing area as the area change code does this
for you.
NanoBBS - UFO Language Documentation Page 24
═══════════════════════════════════════════════════════════════
[makesemaphore {noun}]
This writes a semaphore (a zero-byte file intended to indicate a
condition with its presence) with the filename specified in
{noun}
═══════════════════════════════════════════════════════════════
[getfilesize {filename} {destination}]
This gets the size, in bytes, of the file specified in
{filename} and places this value in {destination}.
═══════════════════════════════════════════════════════════════
[append {filename} {textstring}]
This appends the contents of {textstring} to the text file
specified in the {filename}. If the file does not exist it is
created first.
═══════════════════════════════════════════════════════════════
[appendcr {filename} {textstring}]
This is identical to the [append] keyword, except that it
automatically appends a carriage return and linefeed to the file
after it has written the {textstring}.
═══════════════════════════════════════════════════════════════
[readln {filename} {line_number} {destination_noun}]
This opens a text file specified by {filename} and reads the
line of text specified by {line_number} (first line is line 1)
into the {destination_noun}. This powerful keyword, in concert
with other keywords which write and delete text files, can be
used to create complex ASCII-based databases of nearly any size
and format.
═══════════════════════════════════════════════════════════════
[delete {filename}]
This deletes the file specified in {filename}.
═══════════════════════════════════════════════════════════════
[getfiletime {filename} {destination}]
This gets the time and date, in Sec70 format, of the file
specified in {filename} and places this value in {destination}.
If the file does not exist, it will return 0.
═══════════════════════════════════════════════════════════════
[logtime {noun}]
This makes a log entry in NANOBBS.LOG with the contents of
{noun}.
NanoBBS - UFO Language Documentation Page 25
═══════════════════════════════════════════════════════════════
[blank {noun}]
This quickly and cheaply blanks out the specified noun.
═══════════════════════════════════════════════════════════════
[getchr {noun}]
This waits for, then gets, a character of input from the user.
The result is placed in the {noun}.
═══════════════════════════════════════════════════════════════
[getln {noun}]
This receives a line of input from the user and stores it to a
noun, typically a variable.
═══════════════════════════════════════════════════════════════
[keyfilter {noun}]
This is used before a [getchr] keyword to limit input to only
the characters in {noun}. It is a direct synonym of [menu].
═══════════════════════════════════════════════════════════════
[copy {dest} {src}]
Simply copies the contents of the source noun into the
destination noun. This will not work if the destination noun is
read-only. This is good for assigning constants to variables
for looping, etcetera.
═══════════════════════════════════════════════════════════════
[echochar {echo_ascii}]
This changes the echo character. This is useful for hiding user
input when entering passwords, etc.
The {echo_ascii} noun should contain a decimal number from 0 to
255; it represents the ASCII code to send in place of each
character typed. Alternatively, you can place the word ECHO in
the noun and it will cause NanoBBS to echo all user input
normally, or NOECHO which will cause no user input to be fed
back to the user. The values 11 and 23 are synonymous with ECHO
and NOECHO respectively.
═══════════════════════════════════════════════════════════════
[goto {label}]
This jumps to a location in the .UFO file indicated by the
{label}. If there is no such label the keyword is ignored. The
label is a two-character string and should NOT be
contained in quotes like other text constants. You cannot
substitute a noun for the label.
NanoBBS - UFO Language Documentation Page 26
═══════════════════════════════════════════════════════════════
[label {label}]
This defines a label for later use by a [goto] keyword. The
label must be two characters long and should NOT be contained in
quotes like other text constants. You cannot substitute a noune
for the label.
═══════════════════════════════════════════════════════════════
[iffail {failurecode}]
This will continue processing if the failure code returned by
the last operation (that generates failure codes) is the same as
that specified in the parameter. If the failure code and the
parameter differ, UFO will branch to the next [mark] keyword.
═══════════════════════════════════════════════════════════════
[mark]
The [mark] is where most conditionals "branch" to upon failure.
When encountered by itself it is ignored by NanoBBS, but many
keywords will skip ahead in the UFO file until they encounter a
[mark]. Example:
[iflt useraccess 100]You don't have enough access!
[quit][mark]You have enough access!
This example will display "You don't have enough access!" and
exit the UFO file if the user's access is less than 100,
otherwise it will skip to the [mark] and display "You have
enough access!".
═══════════════════════════════════════════════════════════════
[sendx]
This sends (download to user) the contents of the download
batch using the Xmodem-CRC protocol.
═══════════════════════════════════════════════════════════════
[sendy]
This sends the contents of the download batch using the
Xmodem-1k (sometimes erroneously called Ymodem) protocol.
═══════════════════════════════════════════════════════════════
[sendz]
This sends the contents of the download batch using the
Zmodem protocol.
═══════════════════════════════════════════════════════════════
[sends]
This sends the contents of the download batch using the SEAlink
protocol.
NanoBBS - UFO Language Documentation Page 27
═══════════════════════════════════════════════════════════════
[sendg]
This sends the contents of the download batch using the Ymodem-G
protocol.
═══════════════════════════════════════════════════════════════
[sendb]
This sends the contents of the download batch using the Ymodem
Batch protocol.
═══════════════════════════════════════════════════════════════
[senda]
This sends the contents of the download batch using the ASCII
protocol, with "more" prompting. Yes, it is possible to send a
batch of ASCII files.
═══════════════════════════════════════════════════════════════
[recvx]
This receives a file using the Xmodem protocol. The path and
filename should previously have been added to the batch. The
file will be saved to the "Upload" directory of the current file
area.
═══════════════════════════════════════════════════════════════
[recvy]
This receives a file using the Xmodem-1k (sometimes erroneously
called Ymodem) protocol. The file is saved to the "Upload"
directory of the current file area.
═══════════════════════════════════════════════════════════════
[recvz]
This receives one or more files using the Zmodem protocol. The
files are saved to the "Upload" directory of the current file
area.
═══════════════════════════════════════════════════════════════
[recvs]
This receives one or more files using the SEAlink protocol. The
files are saved to the "Upload" directory of the current file
area.
═══════════════════════════════════════════════════════════════
[recvb]
This receives one or more files using the Ymodem Batch protocol.
The files are saved to the "Upload" directory of the current
file area.
NanoBBS - UFO Language Documentation Page 28
═══════════════════════════════════════════════════════════════
[recvg]
This receives one or more files using the Ymodem-G protocol.
The files are saved to the "Upload" directory of the current
file area.
═══════════════════════════════════════════════════════════════
[loadobjectuser {noun}]
This will load the user record whose username or realname is in
the {noun}. The user is loaded into the "object" record. This
is an auxiliary user record which can contain any user's record
regardless of who's logged on. This way you can set up scripts
to compare and modify other users in relation to the user who's
logged on.
═══════════════════════════════════════════════════════════════
[useobjectuser]
Once an object user is selected, most verbs and nouns that
operate on the user can be made to operate on the object user
instead by using this keywords. Subsequent user operations will
work on the object user until a [usethisuser] keyword is
encountered.
═══════════════════════════════════════════════════════════════
[usethisuser]
This returns user operations to the user who is actually logged
on. Make sure to use this keyword immediately after you're
finished working with an object user!
═══════════════════════════════════════════════════════════════
[returnuser {noun1}{noun2}]
This searches for the user whose username or realname is in
{noun1} and places the user's user number in {noun2}
═══════════════════════════════════════════════════════════════
[adduser]
This adds the current user to the end of the user file, or to
the first available position within the user file. BE CAREFUL,
this keyword makes a BIG assumption: that the user is not
already in the user file (which is true if the user is logging
on for the first time).
═══════════════════════════════════════════════════════════════
[concatenate {noun1}{noun2}{noun3}]
This concatenates {noun1} and {noun2}, and stores the result
in {noun3}.
NanoBBS - UFO Language Documentation Page 29
═══════════════════════════════════════════════════════════════
[display {noun}]
This is a somewhat redundant noun. It will display the {noun}.
A noun by itself (with no verb) generates the same compiled
token as the noun displayed with this keyword.
═══════════════════════════════════════════════════════════════
[smartcr {column}]
This keyword does a new-line if the current cursor position is
at the {column} or beyond.
Example:
[smartcr 40]
This would do a new-line if the cursor is at column 42, but not
if the cursor is at column 35.
═══════════════════════════════════════════════════════════════
[x_cr]
This does a carriage return if and only if the cursor is not
already at the leftmost column. It is the same as the embedded
~, (tilde comma) command, and in fact that is what this keyword
compiles into!
═══════════════════════════════════════════════════════════════
[smartwrap {noun}]
This is a particularly nifty keyword which "smart wraps" the
noun; that is, it displays the noun but word-wraps it and starts
the next line at the starting columns from which this keyword
was executed. A version of this is used to display the file
descriptions. Of course, this noun is best used for nouns which
contain text, but I can see applications for one-word or
numerical nouns in this keyword.
═══════════════════════════════════════════════════════════════
[skipline]
This simply skips the rest of the current line and goes to the
next line.
═══════════════════════════════════════════════════════════════
[ansi3d {noun}]
Displays the noun in a 3-D boilerplate effect which is one of my
personal favourites.
═══════════════════════════════════════════════════════════════
[pad3d {noun}]
Displays the noun in a 3-D effect as in [ansi3d] but tidies it
up a bit with space padding on either side of the noun.
NanoBBS - UFO Language Documentation Page 30
═══════════════════════════════════════════════════════════════
[link {noun}]
This will link to the UFO file specified in {noun}. This is
like a GOSUB. Upon exit from the linked file, UFO returns to
the original (calling) file.
═══════════════════════════════════════════════════════════════
[msgselect {msg}]
This selects a message within the current message area. The
{msg} parameter can specify a message number, or it can be +
or NEXT (no quotes) for the next available message, or - or PREV
for the previous message.
═══════════════════════════════════════════════════════════════
[msgarea {area}]
This selects a new message area. The {area} parameter can
specify an area number, or it can be + or NEXT (no quotes) for
the next allowed message area, or - or PREV for the previous
allowed message area. If an area number is specified and the
area does not exist or the user is not allowed to change to the
area, the keyword does nothing.
═══════════════════════════════════════════════════════════════
[xtern_shell {program} {parameters}]
This shells out of NanoBBS and executes the {program} with
the command line parameters specified in {parameters}. It
first swaps NanoBBS out to EMS or disk if possible.
═══════════════════════════════════════════════════════════════
[xtern_erlvl {errorlevel}]
This exits NanoBBS entirely with the specified errorlevel.
Unfortunately, as of this version it's (still) a one way trip...
═══════════════════════════════════════════════════════════════
[dorinfo {node} {path}]
This writes a DORINFO1.DEF compatible file to the specified
{path}. You can specify any node, and it will use the NanoBBS
DorinfoX.Def method of naming, e.g. DORINFO2.DEF, DORINF25.DEF,
DORIN117.DEF etc.
To force the file to always be named DORINFO1.DEF, simply
specify a constant 1 for the node number, e.g.
[dorinfo 1 c:\bbs\doors]
To use the DorinfoX.Def method with the current node number,
simply use the [task] noun, e.g.
[dorinfo task c:\bbs\doors]
NanoBBS - UFO Language Documentation Page 31
═══════════════════════════════════════════════════════════════
[doorsys {node} {path}]
This writes a DOOR.SYS file to the specified {path}. You can
specify any node. Unlike the [dorinfo] verb, the node you
specify has no effect on the filename - it is always DOOR.SYS.
However, the node number is a field within the DOOR.SYS file and
is used there.
To force the file to always use node 1, simply specify a
constant 1 for the node number, e.g.
[doorsys 1 c:\bbs\doors]
To use the current node number, simply use the [task] noun, e.g.
[doorsys task c:\bbs\doors]
═══════════════════════════════════════════════════════════════
[filearea {area}]
This selects a new file area. The {area} parameter can specify
an area number, or it can be + or NEXT (no quotes) for the next
allowed file area, or - or PREV for the previous allowed file
area. If an area number is specified and the area does not
exist or the user is not allowed to change to the area, the
keyword does nothing.
═══════════════════════════════════════════════════════════════
[existfile {filename}]
If the specified filename does not exist, then this keyword
skips to the next [mark], otherwise it continues processing as
if nothing happened.
═══════════════════════════════════════════════════════════════
[strippath {source} {destination}]
This assumes that the {source} contains a pathed filename and
strips the path from it, leaving only the filename in the
{destination} noun.
═══════════════════════════════════════════════════════════════
[msgtext]
This causes the message body of the current message to be
displayed.
═══════════════════════════════════════════════════════════════
[mininput {noun}]
Sets the minimum input length of the next [getln] keyword. This
means that the user will not be allowed to hit Enter until s/he
has typed at least the specified number of characters.
NanoBBS - UFO Language Documentation Page 32
═══════════════════════════════════════════════════════════════
[maxinput {noun}]
Sets the maximum input length of the next [getln] keyword.
═══════════════════════════════════════════════════════════════
[quit]
Exits the current UFO file immediately
═══════════════════════════════════════════════════════════════
[hangup]
Hangs up on the user immediately
═══════════════════════════════════════════════════════════════
[fastlogoff]
This is the same as [hangup] except that it's a little less
impolite about it. This is what happens when a user hits ^G at
the canned main menu.
═══════════════════════════════════════════════════════════════
[ansi_on]
Turns ANSi colours on.
═══════════════════════════════════════════════════════════════
[ansi_off]
Turns ANSi colours off.
═══════════════════════════════════════════════════════════════
[cleol]
Clears to end of line
═══════════════════════════════════════════════════════════════
[cls]
Clears the screen
═══════════════════════════════════════════════════════════════
[save_xy]
Saves the cursor position. Basically executes an ANSi SCP
command.
═══════════════════════════════════════════════════════════════
[restore_xy]
Restores the cursor to the saved position. Basically executes
an ANSi RCP command.
NanoBBS - UFO Language Documentation Page 33
═══════════════════════════════════════════════════════════════
[ansi_dsr]
Sends an ANSi DSR (Device Status Request) to the remote modem.
═══════════════════════════════════════════════════════════════
[ansi_autodetect]
Attempts to autodetect ANSi
═══════════════════════════════════════════════════════════════
[blink]
Turns on blinking characters.
═══════════════════════════════════════════════════════════════
[noblink]
[steady]
Turns off blinking characters. [noblink] and [steady] are
direct synonyms which compile into exactly the same code.
═══════════════════════════════════════════════════════════════
[clrattr]
Sets the text colour to light grey on a black background.
╔═════════════════════════════════════════════════════════════╗
║ COLOURS ║
║ ║
║ If used by themselves or with the FG, COLOUR, FOREGROUND ║
║ keywords, these colour keywords all set the foreground ║
║ colour. ║
╚═════════════════════════════════════════════════════════════╝
═══════════════════════════════════════════════════════════════
[black]
Changes colour to black.
═══════════════════════════════════════════════════════════════
[red]
Changes colour to red.
═══════════════════════════════════════════════════════════════
[green]
Changes colour to green.
═══════════════════════════════════════════════════════════════
[brown]
Changes colour to brown.
NanoBBS - UFO Language Documentation Page 34
═══════════════════════════════════════════════════════════════
[blue]
Changes colour to blue.
═══════════════════════════════════════════════════════════════
[magenta]
Changes colour to magenta.
═══════════════════════════════════════════════════════════════
[cyan]
Changes colour to cyan.
═══════════════════════════════════════════════════════════════
[gray]
Changes colour to grey.
═══════════════════════════════════════════════════════════════
[grey]
Changes colour to grey (and is correctly spelled)
═══════════════════════════════════════════════════════════════
[darkgray]
Changes colour to dark grey.
═══════════════════════════════════════════════════════════════
[darkgrey]
Changes colour to dark grey.
═══════════════════════════════════════════════════════════════
[lightred]
Changes colour to light red. Not pink.
═══════════════════════════════════════════════════════════════
[lightgreen]
Changes colour to light green.
═══════════════════════════════════════════════════════════════
[yellow]
Changes colour to yellow.
═══════════════════════════════════════════════════════════════
[lightblue]
Changes colour to light blue.
NanoBBS - UFO Language Documentation Page 35
═══════════════════════════════════════════════════════════════
[lightmagenta]
Changes colour to light magenta.
═══════════════════════════════════════════════════════════════
[lightcyan]
Changes colour to light cyan.
═══════════════════════════════════════════════════════════════
[white]
Changes colour to white.
═══════════════════════════════════════════════════════════════
[background {colour}]
Sets background colour
═══════════════════════════════════════════════════════════════
[bg {colour}]
Sets background colour
═══════════════════════════════════════════════════════════════
[on {colour}]
Sets background colour
═══════════════════════════════════════════════════════════════
[foreground {colour}]
Sets foreground colour. This keyword is redundant and is
included for syntactical purists only.
═══════════════════════════════════════════════════════════════
[fg {colour}]
Sets foreground colour. This keyword is redundant and is
included for syntactical purists only.
═══════════════════════════════════════════════════════════════
[color {colour}]
Sets foreground colour. This keyword is redundant and is
included for syntactical purists only.
═══════════════════════════════════════════════════════════════
[colour {colour}]
Sets foreground colour. This keyword is redundant and is
included for syntactical purists only.
NanoBBS - UFO Language Documentation Page 36
═══════════════════════════════════════════════════════════════
[cursor_up]
Moves the cursor up one line (if allowed).
═══════════════════════════════════════════════════════════════
[cursor_down]
Moves the cursor down one line (if allowed).
═══════════════════════════════════════════════════════════════
[cursor_left]
Moves the cursor left one column (if allowed). A backspace
would be enormously faster if you can get away with it.
═══════════════════════════════════════════════════════════════
[cursor_right]
Moves the cursor right one column (if allowed). A space would
be enormously faster if you can get away with it.
═══════════════════════════════════════════════════════════════
[cursor_up# {noun}]
Moves the cursor up {noun} lines (if allowed).
═══════════════════════════════════════════════════════════════
[cursor_down# {noun}]
Moves the cursor down {noun} lines (if allowed).
═══════════════════════════════════════════════════════════════
[cursor_left# {noun}]
Moves the cursor left {noun} columns (if allowed). A bunch of
backspaces would be better if you know how many.
═══════════════════════════════════════════════════════════════
[cursor_right# {noun}]
Moves the cursor right {noun} columns (if allowed). A bunch of
spaces would be better if you know how many.
═══════════════════════════════════════════════════════════════
[cursor_pos {noun1} {noun2}]
Moves the cursor to {noun1},{noun2} where {noun1} is the column
and {noun2} is the line.
═══════════════════════════════════════════════════════════════
NanoBBS - UFO Language Documentation Page 37
╔═════════════════════════════════════════════════════════════╗
║ UFO supports most of the RIPscrip protocol. ║
║ ║
║ UFO RIPscrip keywords allow any noun to be passed as a ║
║ parameter. The usual rules of noun syntax apply; numeric ║
║ constants need no quotes but text constants including ║
║ filenames are required to be enclosed in quotes. ║
╚═════════════════════════════════════════════════════════════╝
═══════════════════════════════════════════════════════════════
[rip_text_window {x0} {y0} {x1} {y1} {wrap} {size}]
This defines the size and other parameters of the text window.
This is a window in which plain text (ASCII and ANSI) is
displayed, and it is usually smaller than the whole screen,
which can display graphics.
{x0} and {y0} define the absolute top left corner of the text
window, and {x1} and {y1} define the lower right corner. These
are absolute character co-ordinates as if the text window were
full-screen.
{wrap} simply indicates whether text in the window should wrap
when the right edge of the window is reached. This can be YES
or NO. If YES, text will wrap as expected in a normal ASCII
terminal, otherwise the cursor will stay at the rightmost edge
until a newline (cr+lf) is encountered. Normally {wrap} ought
to be YES.
{size} defines the character size of the text window. There are
five possible combinations.
╔══════╤═══════╤═════════╤═══════╗
║ Size │ Font │ Max │ Max ║
║ Code │ Size │ Columns │ Lines ║
╟──────┼───────┼─────────┼───────╢
║ 0 │ 8x8 │ 80 │ 43 ║
║ 1 │ 7x8 │ 91 │ 43 ║
║ 2 │ 8x14 │ 80 │ 25 ║
║ 3 │ 7x14 │ 91 │ 25 ║
║ 4 │ 16x14 │ 40 │ 25 ║
╚══════╧═══════╧═════════╧═══════╝
The maximum columns and lines are zero based, meaning (for
example) that in mode 0 you can have a minimum {x0} and {x1} of
0 and a maximum {x0} and {x1} of 79, and so on for the other
modes. And part of the screen not part of the window will not
be touched by your plain text.
If you set all six parameters to 0 (including the yes/no wrap
parameter) then plain text and non-RIP sequences will be ignored
by the user's terminal, as if the window were shut off
completely.
NanoBBS - UFO Language Documentation Page 38
═══════════════════════════════════════════════════════════════
[rip_viewport {x0} {y0} {x1} {y1}]
This simply defines the x and y co-ordinates of the RIP graphics
window (aka the "viewport"). All RIP graphics output is
displayed in this window, while ASCII and ANSI plain text is
displayed in the [rip_text_window] explained previously. As in
the previous keyword, {x0} and {y0} define the top left corner
of the viewport while {x1} and {y1} define the lower right
corner. These co-ordinates (and all RIP graphics co-ordinates)
are based on a 640x350 screen size, so {x0} and {x1} can be from
0 to 639, and {y0} and {y1} can be from 0 to 349. It should be
noted that Ripterm uses the bottom (highest-numbered) dozen or
so lines of the screen for a status bar and it IS possible to
overwrite the status bar unless you shrink the viewport a bit
first.
═══════════════════════════════════════════════════════════════
[rip_reset_windows]
This has no parameters. It resets both the text window and the
graphics viewport to full-screen size. It also clears the
screen to the currently defined background colour, removes all
the mouse regions and erases the "clipboard." This should be
used before executing a non-RIP external program.
═══════════════════════════════════════════════════════════════
[rip_erase_window]
This has no parameters. It clears the text window to the
currently defined background colour. This will also clear any
part of the graphics viewport that is overlapped by the text
window.
═══════════════════════════════════════════════════════════════
[rip_erase_view]
This has no parameters. It clears the graphics viewport to the
currently defined background colour. This will also clear any
part of the text window that is overlapped by the graphics
viewport.
═══════════════════════════════════════════════════════════════
[rip_gotoxy {x} {y}]
This sets the position of the cursor in the text window to the
co-ordinates specified by {x} and {y}. These co-ordinates are
zero-based meaning that [rip_gotoxy 0 0] is the same as homing
the cursor. This is important to remember since ANSI is
one-based.
NanoBBS - UFO Language Documentation Page 39
═══════════════════════════════════════════════════════════════
[rip_home]
This has no parameters. It sets the position of the cursor in
the text window to the upper left corner, just like an ANSI
cursor home command.
═══════════════════════════════════════════════════════════════
[rip_erase_eol]
This has no parameters. It clears the current text line from
the cursor position to the rightmost edge of the text window.
It is equivalent to an ANSI cleol command.
═══════════════════════════════════════════════════════════════
[rip_colour {colour}]
[rip_color {colour}]
This keyword is available in both the correct and American
spellings.
This sets the current colour for both text and graphics
keywords. There are 16 colours to choose from. If you are
using the default palette, you may use the colour name (e.g.
blue, red, magenta, yellow, etc.) instead of its palette
position (they are synonymous). Colour 0 is always the
background colour, even if you have set the palette so that
colour 0 is not black.
Here is a list of the default colours (and the spellings of
their english synonyms)
╔═════════════════╤═════════════════╗
║ 0 Black │ 8 Darkgray ║
║ 1 Blue │ 9 Lightblue ║
║ 2 Green │ 10 Lightgreen ║
║ 3 Cyan │ 11 Lightcyan ║
║ 4 Red │ 12 Lightred ║
║ 5 Magenta │ 13 Lightmagenta ║
║ 6 Brown │ 14 Yellow ║
║ 7 Lightgray │ 15 White ║
╚═════════════════╧═════════════════╝
NanoBBS - UFO Language Documentation Page 40
═══════════════════════════════════════════════════════════════
[rip_set_palette {c0} {c1} {c2} {c3} {c4} {c5} {c6} {c7}
{c8} {c9} {c10} {c11} {c12} {c13} {c14} {c15}]
{note: this keyword does not have to be split into two lines as
shown here.}
This keyword really does require sixteen parameters! It defines
all sixteen colours of the palette from the 64-colour master
palette. Consult an EGA manual for a list of the 64 colours, or
experiment with the keyword to see what kind of weird and
wonderful results you can come up with! These colours can be
from 0 to 63. All sixteen parameters must be present or NCOMP
will refuse to compile this keyword (and the NanoBBS embedded
language equivalent will give unpredictable results).
═══════════════════════════════════════════════════════════════
[rip_one_palette {colour} {value}]
This sets just one colour in the palette. The {colour} is from
0 to 15 and defines the palette position to be modified, and the
{value} is from 0 to 63 and defines the EGA master palette
colour to be assigned to the colour.
═══════════════════════════════════════════════════════════════
[rip_write_mode {mode}]
This sets the drawing mode for all graphics keywords. {mode}
can be either NORMAL or XOR. In the normal mode, graphics are
simply overwritten on existing graphics, while in XOR mode the
graphics are written in "complementary" mode, meaning
effectively that if you draw something in XOR mode you can erase
it non-destructively by drawing the same thing again, also in
XOR mode. This is useful for animation.
═══════════════════════════════════════════════════════════════
[rip_move {x} {y}]
This moves the graphics cursor to the position specified by {x}
and {y}. The author sees no practical use for this since all
the graphics and graphic text primitives allow you to specify a
location anyway, but the Telegrafix people suggest that this
keyword may be needed for future versions of the RIP
specification, so it is included for upward compatibility.
═══════════════════════════════════════════════════════════════
[rip_text {text}]
This displays text at the current position in the graphics
viewport. The {text} must be enclosed in "quotes". The text
displayed by this keyword is subject to the current colour,
drawing mode and font styles. The graphics "cursor" position is
set to the immediate right of the text.
NanoBBS - UFO Language Documentation Page 41
═══════════════════════════════════════════════════════════════
[rip_text_xy {x} {y} {text}]
This is the same as [rip_text] except that the {x} and {y}
location within the graphics viewport is also specified, making
this more efficient than an equivalent combination of the
[rip_move] and [rip_text] keywords. The {text} still has to be
in quotes.
═══════════════════════════════════════════════════════════════
[rip_font_style {font} {direction} {size}]
This sets the current font, direction and size used in the
[rip_text] and [rip_text_xy] keywords.
{font} can be DEFAULT (an 8x8 bitmapped font), TRIPLEX, SMALL,
SANSSERIF, and GOTHIC. The latter four are scalable vector
fonts.
{direction} can be either HORIZONTAL or VERTICAL. These can be
abbreviated to HORIZ or VERT.
{size} is the magnification factor. It can be from 1 to 10,
where 1 is normal size, 2 is double size, 3 is triple size etc.
═══════════════════════════════════════════════════════════════
[rip_pixel {x} {y}]
This plots a pixel at the {x},{y} screen location in the current
colour. Although the drafters of the protocol document didn't
seem to see much use for this keyword, it can be used
quite effectively in UFO, with the random starfield displayed in
RIPSTARF.UFO as a compact example.
═══════════════════════════════════════════════════════════════
[rip_line {x0} {y0} {x1} {y1}]
This draws a line from {x0},{y0} to {x1},{y1} in the current
drawing colour. It uses the current line drawing style and
thickness and the current drawing mode.
═══════════════════════════════════════════════════════════════
[rip_rectangle {x0} {y0} {x1} {y1}]
This draws a hollow rectangle where {x0},{y0} and {x1},{y1} are
any two diagonally opposite corners. It is subject to the
current colour, line style and drawing mode.
═══════════════════════════════════════════════════════════════
[rip_bar {x0} {y0} {x1} {y1}]
This draws a rectangle much as the [rip_rectangle]
keyword does, except that the rectangle is filled with the
current fill colour (NOT the drawing colour! See the
[rip_fill_style] keyword later in this manual!)
NanoBBS - UFO Language Documentation Page 42
═══════════════════════════════════════════════════════════════
[rip_circle {x} {y} {radius}]
This draws a circle of the specified radius with its centre at
{x},{y}. The circle is drawn Y-corrected for the EGA aspect
ratio, so the radius is valid in x pixels but not y pixels.
═══════════════════════════════════════════════════════════════
[rip_oval {x} {y} {start_angle} {end_angle} {x_rad} {y_rad}]
This draws an elliptical arc centred at {x},{y} with a
horizontal radius of {x_rad} and a vertical radius of {y_rad}.
The current colour and line thickness are used.
The {start_angle} and {end_angle} define how much of the full
ellipse is to be drawn, in degrees. The arc is drawn
counterclockwise.
The compass below illustrates how angles work in this and the
other keywords which use them.
┌────────────────────────────────┐
│ 90 │
│ 135 | 45 │
│ \ | / │
│ \ | / │
│ 180 ------ o ------ 0 or 360 │
│ / | \ │
│ / | \ │
│ 225 | 315 │
│ 270 │
└────────────────────────────────┘
═══════════════════════════════════════════════════════════════
[rip_filled_oval {x} {y} {x_rad} {y_rad}]
This draws a complete filled oval centred at {x},{y} with a
horizontal radius of {x_rad} and a vertical radius of {y_rad}.
The outline of the ellipse is drawn using the current drawing
colour and is filled with the current fill colour (see
[rip_fill_style]). The outline thickness is the same as the
line thickness.
═══════════════════════════════════════════════════════════════
[rip_arc {x} {y} {start_angle} {end_angle} {radius}]
This keyword draws an arc - a segment of a circle. It is
centred at {x},{y} and has a radius specified by {radius}. The
arc is drawn counterclockwise from {start_angle} to {end_angle}.
The current drawing colour and line thickness are used. See the
[rip_oval] keyword for a compass of angle positions.
NanoBBS - UFO Language Documentation Page 43
═══════════════════════════════════════════════════════════════
[rip_oval_arc {x} {y} {start_angle} {end_angle} {x_rad} {y_rad}]
This keyword draws an elliptical arc - a segment of an oval. It
is centred at {x},{y}. Syntactically and functionally it is
identical to the [rip_oval] keyword.
═══════════════════════════════════════════════════════════════
[rip_pie_slice {x} {y} {start_angle} {end_angle} {radius}]
This draws a circular "pie slice" - a circular arc with the ends
of the arc tied to the center point by straight lines. It works
much the same way as the [rip_arc] function except that the pie
slice is filled with the current fill colour and style. As
always, the arc is drawn counterclockwise according to the
compass illustrated previously. The {x} and {y} refer to the
center point (where the straight lines converge) as if the
circle were whole.
═══════════════════════════════════════════════════════════════
[rip_oval_pie_slice {x} {y} {start_angle} {end_angle}
{x_rad} {y_rad}]
This draws an elliptical "pie slice" - an elliptical arc with
the ends of the arc tied to the center point by straight lines.
It works much the same as the [rip_oval_arc] keyword except that
the pie slice is filled with the current fill colour and style.
As always, the arc is drawn counterclockwise according to the
compass illustrated previously. The {x} and {y} refer to the
center point (where the straight lines converge) as if the
ellipse were whole.
═══════════════════════════════════════════════════════════════
[rip_bezier {x0} {y0} {x1} {y1} {x2} {y2} {x3} {y3} {segments}]
This draws a custom Bezier curve. There are four points used to
create the curve. {x0},{y0} and {x3},{y3} define the start and
end points of the curve, while {x1},{y1} and {x2},{y2} are
points that are not on the curve but which tend to "pull" the
curve in their direction. Since the curve is drawn in line
segments, the {segments} parameter allows to to define the
number of line segments to use to draw the curve - more segments
give a smoother, slower-drawing curve while fewer give a faster,
jaggier curve.
(continued next page)
NanoBBS - UFO Language Documentation Page 44
The illustration below shows generally how the curves work:
┌───────────────────────────────────────────────────────────────┐
│ {x1,y1} │
│ + │
│ {x3,y3} │
│ +* │
│ * │
│ **** * │
│ ** *** * │
│ * ** * │
│ * * * │
│ * ** * │
│ * *** * │
│ + *** ** │
│ {x0,y0} ***** *** │
│ ********* │
│ │
│ + │
│ {x2,y2} │
└───────────────────────────────────────────────────────────────┘
═══════════════════════════════════════════════════════════════
[rip_polygon {points} {x0} {y0} {x1} {y1} .. {xn} {yn}]
This draws a custom polygon with up to 512 sides. The {points}
parameter specifies how many vertices there are in the whole
polygon, and there must be exactly that many {x,y} parameter
pairs following. That means that if you specify 7 points, there
must be 14 parameters following. If there are more there could
be unpredictable results, and if there are less UFO.EXE will
abort with an error message. Each {x,y} pair specifies the
location of a vertex.
The polygon is always closed. After the last vertex is
specified, a line is automatically drawn from the last one to
the first one.
The polygon drawn with this keyword is subject to the drawing
colour, drawing mode, line pattern, and line thickness.
═══════════════════════════════════════════════════════════════
[rip_fill_poly {points} {x0} {y0} {x1} {y1} .. {xn} {yn}]
This draws a custom polygon with up to 512 vertices, much as the
previous [rip_polygon] keyword, but this keyword draws a filled
polygon using the current fill colour and style.
═══════════════════════════════════════════════════════════════
[rip_fill {x} {y} {border}]
This executes a flood fill starting from the {x},{y} screen
location. It fills the screen with the fill colour and style up
to the {border} colour (which can be specified as a word rather
than a number as all colours). Caveat: take care that the
region you want to fill is completely enclosed by the {border}
colour or the fill will "leak" and flood the whole viewport!
NanoBBS - UFO Language Documentation Page 45
═══════════════════════════════════════════════════════════════
[rip_line_style {style} {thickness}]
[rip_line_style {style} {userpattern} {thickness}]
This keyword defines the "style" used for drawing straight
lines. The {style} parameter specifies the style of line used,
and it can be NORMAL, DOTTED, CENTERED, DASHED or CUSTOM.
The {thickness} parameter defines the thickness in pixels of
lines. It can be either 1 or 3. No other thicknesses are
available in the RIP specification.
The {userpattern} parameter is used only when the {style} is
CUSTOM. If the style is not {custom} then the {userpattern}
must be omitted. The {userpattern} is a 16-bit binary
representation of the recurring pattern in the custom line
style.
Here are a few examples:
╔════════════════════════════════════════════════════════╗
║ Decimal ║
║ Pixel Pattern Binary Representation Parameter ║
║ ┌────────────────┐ ┌────────────────┐ ┌─────┐ ║
║ │- - - - - - - - │ │1010101010101010│ │43690│ ║
║ │ │ │ │ │ │ ║
║ │ - --- - --- │ │0100111001001110│ │36494│ ║
║ │ │ │ │ │ │ ║
║ │--- --- --- --- │ │1110111011101110│ │61166│ ║
║ │ │ │ │ │ │ ║
║ │-- -- -- -- │ │1100110011001100│ │52428│ ║
║ └────────────────┘ └────────────────┘ └─────┘ ║
╚════════════════════════════════════════════════════════╝
If you can calculate the decimal number for an arbitrary pixel
pattern in your head, you probably spend too much time with
computers ;-) The rest of us will do better with a good quality
base-converting calculator. If there is enough demand, a quasi-
graphical method of entering pixel patterns will be offered in a
future version.
NanoBBS - UFO Language Documentation Page 46
═══════════════════════════════════════════════════════════════
[rip_fill_style {pattern} {colour}]
This sets the "fill style" and "fill colour" used by many
keywords in the protocol.
The {pattern} parameter refers to one of twelve preset fill
parameters, numbered from 0 to 11. Here they are:
┌───────────────────────────────┬──────────────────────────────┐
│ 0 Background colour fill │ 6 Light backslash line fill │
│ 1 Solid fill colour fill │ 7 Light crosshatch fill │
│ 2 Thick line fill │ 8 Heavy crosshatch fill │
│ 3 Light diagonal line fill │ 9 Interleaved line fill │
│ 4 Normal diagonal line fill │ 10 Light dot fill │
│ 5 Normal backslash line fill │ 11 Heavy dot fill │
└───────────────────────────────┴──────────────────────────────┘
The {colour} parameter simply sets the fill colour. It can be a
colour name or a palette position from 0 to 15.
═══════════════════════════════════════════════════════════════
[rip_fill_pattern {c1} {c2} {c3} {c4} {c5} {c6} {c7} {c8} {colour}]
This allows you to define a custom fill pattern for keywords
that use the fill style. When this keyword is executed it
overrides the current fill pattern. The custom fill pattern is
a matrix 8 pixels high and 8 pixels wide. Each of the first
eight parameters is an 8-bit line of pixels. The {colour}
parameter sets the fill colour.
Here are a couple of examples:
╔════════════════════════════════════════════════════════╗
║ Decimal ║
║ Bit Pattern Binary Parameter ║
║ ┌─────────────────┐ ┌────────┐ ┌──────────┐ ║
║ │ * * * * * * * * │ │11111111│ │{c1} = 255│ ║
║ │ * ∙ ∙ ∙ ∙ ∙ ∙ * │ │10000001│ │{c2} = 129│ ║
║ │ * ∙ ∙ ∙ ∙ ∙ ∙ * │ │10000001│ │{c3} = 129│ ║
║ │ * ∙ ∙ ∙ ∙ ∙ ∙ * │ │10000001│ │{c4} = 129│ ║
║ │ * * * * * * * * │ │11111111│ │{c5} = 255│ ║
║ │ ∙ ∙ ∙ ∙ * ∙ ∙ ∙ │ │00001000│ │{c6} = 16 │ ║
║ │ ∙ ∙ ∙ ∙ * ∙ ∙ ∙ │ │00001000│ │{c7} = 16 │ ║
║ │ ∙ ∙ ∙ ∙ * ∙ ∙ ∙ │ │00001000│ │{c8} = 16 │ ║
║ └─────────────────┘ └────────┘ └──────────┘ ║
║ ║
║ ┌─────────────────┐ ┌────────┐ ┌──────────┐ ║
║ │ * * ∙ ∙ ∙ * * * │ │11000111│ │{c1} = 199│ ║
║ │ * ∙ * * * ∙ * * │ │10111011│ │{c2} = 187│ ║
║ │ ∙ * * * * * ∙ ∙ │ │01111100│ │{c3} = 124│ ║
║ │ * ∙ * * * ∙ * * │ │10111011│ │{c4} = 187│ ║
║ │ * * ∙ ∙ ∙ * * * │ │11000111│ │{c5} = 199│ ║
║ │ * ∙ * * * ∙ * * │ │10111011│ │{c6} = 187│ ║
║ │ ∙ * * * * * ∙ ∙ │ │01111100│ │{c7} = 124│ ║
║ │ * ∙ * * * ∙ * * │ │10111011│ │{c8} = 187│ ║
║ └─────────────────┘ └────────┘ └──────────┘ ║
╚════════════════════════════════════════════════════════╝
NanoBBS - UFO Language Documentation Page 47
═══════════════════════════════════════════════════════════════
[rip_mouse {num} {x0} {y0} {x1} {y1} {click} {zoom} {text}]
This keyword sets up a rectangular mouse region on the screen.
If the user clicks the left mouse button while the mouse cursor
is in this region, the terminal will send the {text} back to
NanoBBS. This is how RIP buttons are tied to existing keyword
keys. The region is defined by {x0},{y0} indicating the upper
left corner and {x1},{y1} defining the lower right.
{click} can be YES or NO, and if YES it will invert the mouse
region while the mouse button is pressed, offering visible
feedback.
{zoom} can be YES or NO, and if YES it will cause the text
window to be "zoomed" to full screen and will clear the window.
This should be used if the {text} will cause NanoBBS to go into
an area (or external program) that does not support RIPscrip.
═══════════════════════════════════════════════════════════════
[rip_kill_mouse_fields]
This has no parameters. It removes all existing mouse regions.
This is best used at the beginning of a new screen, so that the
previous screen's mouse fields no longer apply.
═══════════════════════════════════════════════════════════════
[rip_begin_text {x0} {y0} {x1} {y1}]
This defines a rectangular region of the viewport to display
text. This keyword should be followed by one or more
[rip_region_text] keywords and then by a [rip_end_text] keyword.
The region is defined by {x0},{y0} representing the upper left
corner and {x1},{y1} representing the lower right corner.
═══════════════════════════════════════════════════════════════
[rip_region_text {justify} {text}]
This keyword is used to write text in the text region specified
by the [rip_begin_text] keyword.
The {justify} parameter can be YES or NO. If YES, it will do a
left-right "fill justify" on the text, inserting space as necessary
to keep both the left and right margins of the text in line.
The text region does not scroll. If the text runs below the
bottom of the region it is not displayed.
An example sequence of region text:
[rip_begin_text 10 10 400 200]
[rip_region_text yes "Hello there! This is a demo"]
[rip_region_text yes "of RIPscrip Region Text in"]
[rip_region_text no "UFO!"]
[rip_end_text]
NanoBBS - UFO Language Documentation Page 48
═══════════════════════════════════════════════════════════════
[rip_end_text]
This has no parameters. It signals the end of a region text
block.
═══════════════════════════════════════════════════════════════
[rip_get_image {x0} {y0} {x1} {y1}]
This copies a region of the screen to the "clipboard" - an
internal storage area - for future use. It can be used with the
[rip_put_image] keyword to quickly move a region of graphics to
another part of the screen, or to temporarily store a region of
graphics which you expect to be overwritten but want to be able
to restore. {x0},{y0} specifies the upper left corner of the
region and {x1},{y1} specifies the lower right.
═══════════════════════════════════════════════════════════════
[rip_put_image {x} {y} {mode}]
This "pastes" the clipboard contents to the screen, with the
upper left corner defined by {x},{y}.
{mode} can be any of the following:
COPY - overwrites whatever is on the screen in that region
XOR - writes an XOR complement of the clipboard and the
existing screen data
OR - logically OR's the clipboard with the existing screen
data
AND - logically AND's the clipboard with the existing screen
data
NOT - writes the inverse of the clipboard to the screen
═══════════════════════════════════════════════════════════════
[rip_write_icon {filename}]
This writes the contents of the clipboard to a disk file on the
user's system. The file's name is specified in {filename}. It
is stored as a RIPscrip icon which can later be loaded with the
[rip_load_icon] keyword.
No path information is allowed in the filename. This keyword is
ignored if the clipboard is empty.
[rip_load_icon {x} {y} {mode} {clipboard} {filename}]
This loads an icon from the user's disk with the specified
filename. The icon is placed at {x},{y}. The {mode} parameter
defines the mode in which it is written - this mode is used the
same way as in the [rip_put_image] keyword.
The {clipboard} can be YES or NO, and if it is YES it will cause
the icon to also be loaded into the clipboard.
NanoBBS - UFO Language Documentation Page 49
═══════════════════════════════════════════════════════════════
[rip_button_style {width} {height} {orientation} {flags}
{d_fore} {d_back} {bright} {dark} {surface}
{group} {flags2} {uline_col} {corner_col}]
This is the most complicated keyword in the NanoBBS
implementation of the RIPscrip protocol. For a complete
explanation of the keyword you should refer to the original
RIPscrip specification from Telegrafix.
This keyword defines how mouse buttons are displayed and
handled. It does not display or draw anything, but sets up the
numerous modes which buttons created with the [rip_button]
keyword will use.
The {width} and {height} parameters refer to the size of the
button in pixels.
The {orientation} parameter can be one of ABOVE, LEFT, CENTER,
RIGHT, or BENEATH. It refers to the positioning of the optional
text label. The label is written either above, to the left of,
in the center of, to the right of, or below the button
respectively.
The {bevsize} parameter is the width of the bevel effect in
pixels. If the bevel flag (see "flags") is set, this parameter
has effect, otherwise it is ignored. It can be any valyue of
zero or more.
The {d_fore} and {d_back} parameters refer to the foreground and
"dropshadow" colours of the text label, respectively. The
{d_back} colour is not used if the dropshadow flag is not set.
The {bright}, {dark} and {surface} parameters represent the
highlighted, shadowed and regular surface colours used with the
special effects styles (see flags).
The {uline_col} is the colour of the underline in the text
label (if present).
The {corner_col} is the colour of the corners of the bevel,
recess, and other special button modes.
The {group} parameter specifies the button group that subsequent
[rip_button] keywords are associated with. For more information
on button groups, radio buttons, checkbox buttons and other
button arcana, please refer to Telegrafix's original RIPscrip
specification. This can be from 0 to 35.
The {flags} parameter is a bitmapped 16-bit integer. This
parameter is determined by adding up the bit values of all the
flags you want to use. Note that some flags are mutually
incompatible.
(continued next page)
NanoBBS - UFO Language Documentation Page 50
Here is a table of the {flags} parameter bitmap values.
╔═════════╤════════════════════════════════════════════╗
║ Bit │ ║
║ Value │ Meaning ║
╟─────────┼────────────────────────────────────────────╢
║ 1 │ Clipboard button ║
║ 2 │ Button can be inverted ║
║ 4 │ Reset screen ║
║ 8 │ Use the "chisel" effect ║
║ 16 │ Use the "recessed" effect ║
║ 32 │ Use a "dropshadow" for the text label ║
║ 64 │ Stamp image to the clipboard ║
║ 128 │ "Icon" Button ║
║ 256 │ "Plain" Button ║
║ 512 │ Use the "bevel" effect ║
║ 1024 │ Mouse button ║
║ 2048 │ Underline the "hot key" in the text label ║
║ 4096 │ Use hot icons ║
║ 8192 │ Adjust vertical centering of the label ║
║ 16384 │ Belongs to a radio group ║
║ 32768 │ Use the "sunken" effect ║
╚═════════╧════════════════════════════════════════════╝
So, for example, if you want to make a mouse button with the
bevel effect you add up the bit values for these two flags. The
mouse button flag has a bit value of 1024, and the bevel effect
flag has a bit value of 512. Add these up and you get 1536,
which is the value you should place in the {flags} parameter for
these options.
The {flags2} parameter is (as of this version) a five-bit
integer bitmap similar to the {flags} parameter. Its value is
determined in the same way as the {flags} parameter, by adding
up the bit values.
Here is a table of those bit values:
╔═════════╤════════════════════════════════════════════╗
║ Bit │ ║
║ Value │ Meaning ║
╟─────────┼────────────────────────────────────────────╢
║ 1 │ The button is in a checkbox group ║
║ 2 │ Highlight the hotkey character ║
║ 4 │ Zoom out when clicked ║
║ 8 │ Left justify the label ║
║ 16 │ Right justify the label ║
╚═════════╧════════════════════════════════════════════╝
Please refer to the original RIPscrip specification from
Telegrafix for a full explanation of the meanings of the two
{flags} parameters and their various mutual exclusivities.
NanoBBS - UFO Language Documentation Page 51
═══════════════════════════════════════════════════════════════
[rip_button {x0} {y0} {x1} {y1} {hotkey} {flags} {iconfile}
{textlabel} {keyword}]
This creates a new button using the style selected in the
[rip_button_style] keyword.
The {x0} and {y0} parameters specify the upper left corner of
the icon.
If no height and width are specified in the [rip_button_style]
then the {x1} and {y1} refer to the lower right corner,
otherwise these two parameters are ignored and the button is
sized according to the button style. This allows for dynamic
button sizes.
The {hotkey} is the ASCII code (from zero to 255) of the
keystroke that activates the button. This character, if present
in the text label, will be underlined in the label if the
underline flag in the button style is set.
The {flags} parameter is a two-bit binary integer. Here are its
values:
╔═════════╤════════════════════════════════════════════╗
║ Bit │ ║
║ Value │ Meaning ║
╟─────────┼────────────────────────────────────────────╢
║ 1 │ Draw the button as already selected ║
║ 2 │ The button is default if [Enter] is hit ║
╚═════════╧════════════════════════════════════════════╝
The {iconfile} parameter is the filename of an icon to load if
this is an icon button. Use a null constant "" if this is not
an icon file.
The {textlabel} parameter is the text of the text label. Use a
null constant "" if no label is wanted.
The {keyword} parameter is the actual text for the terminal to
send back to NanoBBS. Technically the specification allows you
to skip this by using a null constant "". Use a ^ caret to
specify control characters, e.g. ^M for a carriage return, ^G
for a beep.
NanoBBS - UFO Language Documentation Page 52
═══════════════════════════════════════════════════════════════
[rip_copy_region {x0} {y0} {x1} {y1} {dest_line}]
This vertically copies/scrolls a rectangular region of the
screen. {x0},{y0} define the upper left corner and {x1},{y1}
define the lower right corner of the region to be copied, and
{dest_line} is the vertical line number to copy the region to.
The {x0} and {x1} parameters must be evenly divisible by eight
due to a limitation of the EGA compatible hardware the protocol
is written for. If either parameter is not evenly divisible by
eight, the parameters will be adjusted (tending to increase the
size of the region). If the keyword specifies a copy which
would partially draw off the screen, the whole keyword is
ignored.
═══════════════════════════════════════════════════════════════
[rip_no_more]
This has no parameters, and simply formally signals the RIPscrip
compatible terminal that the RIPscrip sequences have ended and
that further output should be to the text window.
NanoBBS - UFO Language Documentation Page 53
═══════════════════════════════════════════════════════════════
[pageplay {noun}]
Executes a dazzling performance of the PagePlay(tm) file whose
filename is in {noun}! Full instructions for the PagePlay music
system are included in the PagePlay shareware archive, availabel
from THC Freedom Online BBS.
═══════════════════════════════════════════════════════════════
[autoansi]
Attempts to detect ANSi graphics on the remote caller's terminal
software.
═══════════════════════════════════════════════════════════════
[addbatch {noun}]
Adds the file(s) in {noun} to the download batch.
═══════════════════════════════════════════════════════════════
[delbatch {noun}]
Removes the file in {noun} from the download batch.
═══════════════════════════════════════════════════════════════
[clrbatch]
Clears the download batch.
═══════════════════════════════════════════════════════════════
[describebatch]
This prompts the user to describe each file currently in the
batch - this should be called immediately after a download (and
it is in the canned interface). It will try to extract
FILE_ID.DIZ from each file first.
═══════════════════════════════════════════════════════════════
[ifits {noun}]
This continues to the next [mark] if the number of iterations of
the current list is evenly divisible by zero. There are several
kinds of lists in NanoBBS which give you access to the
iterations; they include the user list, daily caller list, file
and message area listings, and file search listings.
═══════════════════════════════════════════════════════════════
[ifvalidymd {noun}]
If {noun} is a valid YY/MM/DD or YY-MM-DD date, this keyword
will continue processing to the next [mark], otherwise it will
skip ahead to the next [mark].
NanoBBS - UFO Language Documentation Page 54
═══════════════════════════════════════════════════════════════
[ifeq {noun1} {noun2}]
This will continue processing to the next [mark] keyword if the
two nouns are equal, and will skip until the next [mark] if the
nouns are inequal. UFO is smart enough to detect whether a
numeric or alphabetic comparison should be made. Alpha
comparisons are case-insensitive.
═══════════════════════════════════════════════════════════════
[ifne {noun1} {noun2}]
This will continue processing to the next [mark] if the two
nouns are not equal. If both nouns are numbers then a numerical
comparison is made, otherwise it is a string comparison. If the
nouns are equal, NanoBBS skips ahead to the next [mark] (or to
the end of the file, whichever comes first).
═══════════════════════════════════════════════════════════════
[iflt {noun1} {noun2}]
Processes until the next [mark] if {noun1} is less than {noun2}
or is alphabetically lower.
═══════════════════════════════════════════════════════════════
[ifgt {noun1} {noun2}]
Processes until the next [mark] if {noun1} is greater than
{noun2} or is alphabetically higher.
═══════════════════════════════════════════════════════════════
[iflte {noun1} {noun2}]
Processes until the next [mark] if {noun1} is less than or equal
to {noun2}.
═══════════════════════════════════════════════════════════════
[ifgte {noun1} {noun2}]
Processes until the next [mark] if {noun1} is greater than or
equal to {noun2}.
═══════════════════════════════════════════════════════════════
[cookie {noun}]
Displays a cookie from the cookie file specified in {noun}.
═══════════════════════════════════════════════════════════════
[chain {noun}]
Quits the current UFO file and links to the one specified in
{noun}. This is like a GOTO. Upon exit from the chained file,
UFO does NOT return to the original file.
NanoBBS - UFO Language Documentation Page 55
═══════════════════════════════════════════════════════════════
[inc {noun}]
This increments the {noun}. It assumes that the noun contains a
number. If the noun was not already a number, it is assumed to
be zero and is incremented to 1.
═══════════════════════════════════════════════════════════════
[dec {noun}]
This decrements the {noun}. It assumes that the noun contains a
number. If the noun was not already a number, it is assumed to
be zero and is decremented to -1.
═══════════════════════════════════════════════════════════════
[shr1 {noun}]
This assumes the noun is a number, specifically a signed 32 bit
integer, and shifts it bitwise right one position. This is a
quick and dirty way to divide it by two. If the noun is not a
number it is assumed to be zero, and will be shr'd, with a
result of zero.
═══════════════════════════════════════════════════════════════
[shl1 {noun}]
This assumes the noun is a number, specifically a signed 32 bit
integer, and shifts it bitwise left one position. This is a
quick and dirty way to multiply it by two. If the noun is not a
number it is assumed to be zero, and will be shl'd, with a
result of zero.
═══════════════════════════════════════════════════════════════
[shr {noun1} {noun2}]
This assumes {noun1} is a number, specifically a signed 32 bit
integer, and shifts it bitwise right the number of positions
specified in {noun2}. This is a quick and dirty way to divide by
powers of two. If the noun is not a number it is assumed to be
zero, and will be shr'd, with a result of zero.
═══════════════════════════════════════════════════════════════
[shl {noun1} {noun2}]
This assumes {noun1} is a number, specifically a signed 32 bit
integer, and shifts it bitwise left the number of positions
specified in {noun2}. This is a quick and dirty way to multiply by
powers of two. If the noun is not a number it is assumed to be
zero, and will be shl'd, with a result of zero.
═══════════════════════════════════════════════════════════════
[add {noun1} {noun2}]
This stores the sum of {noun1} and {noun2} in {noun2}.
NanoBBS - UFO Language Documentation Page 56
═══════════════════════════════════════════════════════════════
[sub {noun1} {noun2}]
This subtracts {noun1} from {noun2} and stores the result in
{noun2}.
═══════════════════════════════════════════════════════════════
[showsysop {noun}]
This is like [display] except that the noun is only seen on the
local console.
═══════════════════════════════════════════════════════════════
[comment]
Anything between "[comment" and the closing "]" is ignored by
UFO.
═══════════════════════════════════════════════════════════════
[swallowbuffer]
If there are any characters in the input buffer of either the
comport or the keyboard, this will "swallow" them until both
settle down.
═══════════════════════════════════════════════════════════════
[nonstop]
All output after this will be non-stop until a prompt is hit...
═══════════════════════════════════════════════════════════════
[nonstop_off]
This turns off nonstop mode set by the [nonstop] keyword.
═══════════════════════════════════════════════════════════════
[moreofftemp]
This temporarily turns off "More? (Y/n)" prompts, making output
non-stop.
═══════════════════════════════════════════════════════════════
[on_deleted] [off_deleted] [tog_deleted] [if_deleted]
[on_deleted] sets the user's deleted bit(!!!) The user will no
longer be able to logon so use with care!!!
[off_deleted] turns the deleted bit off.
[tog_deleted] toggles the deleted bit.
[if_deleted] continues processing the script if the user is
deleted, otherwise it jumps to the next [mark].
NanoBBS - UFO Language Documentation Page 57
═══════════════════════════════════════════════════════════════
[on_clrscr] [off_clrscr] [tog_clrscr] [if_clrscr]
[on_clrscr] turns on the use of clear-screens.
[off_clrscr] turns off the use of clear-screens.
[tog_clrscr] toggles the use of clear-screens.
[if_clrscr] continues processing the script if the user is using
clear screens, otherwise it jumps to the next
[mark].
═══════════════════════════════════════════════════════════════
[on_ansi] [off_ansi] [tog_ansi] [if_ansi]
[on_ansi] turns on the use of ANSI colours.
[off_ansi] turns off the use of ANSI colours.
[tog_ansi] toggles the use of ANSI colours.
[if_ansi] continues processing the script if the user is using
ANSI colours, otherwise it jumps to the next [mark].
═══════════════════════════════════════════════════════════════
[on_nolimit] [off_nolimit] [tog_nolimit] [if_nolimit]
[on_nolimit] suspends the user's time limits so s/he can stay on
line as long as they see fit.
[off_nolimit] re-enables the user's time limits.
[tog_nolimit] toggles the no-limit bit.
[if_nolimit] continues processing the script if the user is
marked as having no time limit, otherwise it jumps
to the next [mark].
═══════════════════════════════════════════════════════════════
[on_rodent] [off_rodent] [tog_rodent] [if_rodent]
[on_rodent] turns on the "rodent" bit. When this bit is on, the
user cannot page the SysOp for chat. Useful for
dealing with users whose paging becomes very
annoying.
[off_rodent] turns off the rodent bit, so the user can page again.
[tog_rodent] toggles the rodent bit.
[if_rodent] continues processing the script if the user's rodent
bit is set, otherwise it jumps to the next [mark].
NanoBBS - UFO Language Documentation Page 58
═══════════════════════════════════════════════════════════════
[on_toast] [off_toast] [tog_toast] [if_toast]
[on_toast] turns on the "toast" bit. When this bit is on, the
user gets ONE MORE CALL to the BBS. Immediately upon
password acceptance and logon, the user is informed that
the account has been terminated, and then the deleted
bit is set. The user can continue with the call, or
you can use a UFO script called from the language
file to drop the user immediately, at your option.
By default, the user is allowed to continue his "last
call."
This feature is intended as a way of removing a problem
user in such a way that the user is left with no
question that the account has been terminated, and by
default also allows the user a last call to plead her
case.
[off_toast] turns off the toast bit. A last minute pardon...
[tog_toast] toggles the toast bit.
[if_toast] continues processing the script if the user's toast
bit is set, otherwise it jumps to the next [mark].
═══════════════════════════════════════════════════════════════
[on_chkmail] [off_chkmail] [tog_chkmail] [if_chkmail]
[on_chkmail] turns on the check-new-mail bit. When this bit is
on, each time the user logs on the BBS will scan
for new messages addressed to the user in the
Private Email base.
[off_chkmail] turns off the check-new-mail bit. No new message
scan but logons will be much faster.
[tog_chkmail] toggles the check-new-mail bit.
[if_chkmail] continues processing the script if the user's
check-new-mail bit is set, otherwise it jumps to
the next [mark].
═══════════════════════════════════════════════════════════════
[on_FSE] [off_FSE] [tog_FSE] [if_FSE]
(note: this keyword is case insensitive as all UFO keywords. It
is perfectly valid to, for example, use [on_fse] instead of
[on_FSE] as shown above)
[on_FSE] enables the use of the full screen editor when entering
messages.
[off_FSE] disables the use of the FSE, and instead the user must
use the old-fashioned line-by-line message editor.
[tog_FSE] toggles the use of the FSE.
[if_FSE] continues processing the script if the user has enabled
the use of the FSE, otherwise it jumps to the next
[mark].
NanoBBS - UFO Language Documentation Page 59
═══════════════════════════════════════════════════════════════
[on_noratio] [off_noratio] [tog_noratio] [if_noratio]
[on_noratio] disables checking for file download:upload ratios
when the user is downloading. This is a good bit
to set for yourself and for close personal
friends...
[off_noratio] re-enables file ratios.
[tog_noratio] toggles the use of file ratios.
[if_noratio] continues processing the script if the user is
flagged as having no file ratios, otherwise it
jumps to the next [mark].
═══════════════════════════════════════════════════════════════
[on_suspended] [off_suspended] [tog_suspended] [if_suspended]
[on_suspended] sets the suspended bit. When this bit is set,
the user will receive a message stating that the
account is temporarily suspended, and will then
be logged off.
[off_suspended] un-suspends the user.
[tog_suspended] toggles the user's suspended bit.
[if_suspended] continues processing the script if the user is
suspended, otherwise it jumps to the next [mark].
═══════════════════════════════════════════════════════════════
[on_linefeeds] [off_linefeeds] [tog_linefeeds] [if_linefeeds]
[on_linefeeds] turns on the use of linefeeds. When this is set,
every time NanoBBS sends a new line carriage
return (ASCII 13) it will also send a line feed
(ASCII 10). Most terminal programs for the IBM
clone line need line feeds or else all the output
will appear on one line.
[off_linefeeds] turns off line feeds.
[tog_linefeeds] toggles the use of line feeds.
[if_linefeeds] continues processing the script if line feeds are
enabled, otherwise it jumps to the next [mark].
═══════════════════════════════════════════════════════════════
[crlf]
This inserts a carriage return/linefeed into the .BBS file,
where you might not want a line break in your source text.
═══════════════════════════════════════════════════════════════
[null]
This simply sends a null character - an ASCII $00 - to the user.
When this keyword is encountered by UFO.EXE, the null character
itself is written to the output file.
NanoBBS - UFO Language Documentation Page 60
═══════════════════════════════════════════════════════════════
[menu {noun}]
This is used before a [getchr] keyword to limit input to only
the characters in {noun}. It is a direct synonym of [keyfilter].
═══════════════════════════════════════════════════════════════
[filesearch {noun}]
This is a quasi-canned file search utility. It will search for
the file or files specified in {noun}.
═══════════════════════════════════════════════════════════════
[sendtext {noun}]
This sends the ASCII or ANSI file specified in the noun to the
user in ASCII mode. It is not counted as a download. It will
not process any UFO code in the file, and unlike linked UFO
files the file can be any size.
═══════════════════════════════════════════════════════════════
[harddownload {noun}]
This adds the file or files in {noun} to the download batch,
prompts for a protocol and then downloads the file to the user.
Useful for embedding hardcoded file transfers, say for a
required file.
═══════════════════════════════════════════════════════════════
[senserip]
Attempts to detect RIP graphics. If successful it will set the
RIP bit.
═══════════════════════════════════════════════════════════════
[ifripdetect]
Attempts to detect RIP graphics. If none are found it will skip
to the next [mark] keyword.
═══════════════════════════════════════════════════════════════
[feedback]
Prompts to send feedback to the SysOp. It basically will jump
to the defined e-mail message base and post a private message to
the person defined as the SysOp in the config file, with a
subject line of "Feedback."
═══════════════════════════════════════════════════════════════
[keyjump {noun}]
This will skip to the next [mark] keyword if the user key
specified in the {noun} is on. Otherwise, NanoBBS will continue
processing as if nothing happened. Only the first character of
the noun is relevant.
NanoBBS - UFO Language Documentation Page 61
═══════════════════════════════════════════════════════════════
[keytoggle {noun}]
This toggles the user key specified in the {noun}. If the noun
is on, this keyword turns it off, and vice versa. Only the
first character of the noun is relevant.
═══════════════════════════════════════════════════════════════
[keyoff {noun}]
This turns off the user key specified in the {noun}. Only the
first character of the noun is relevant.
═══════════════════════════════════════════════════════════════
[keyon {noun}]
This turns on the user key specified in the {noun}. Only the
first character of the noun is relevant.
═══════════════════════════════════════════════════════════════
[loadlang {noun}]
This loads a language file whose filename root (first 8
characters, no extension or path) is in {noun}.
═══════════════════════════════════════════════════════════════
[canned_logon]
[logon]
This goes through the canned logon procedure. It will ask for a
user name/number and password, and if the user is new, will run
the new-user questionnaire. [logon] and [canned_logon] are
directly synonymous.
═══════════════════════════════════════════════════════════════
[canned_goodbye]
This asks the user is sure s/he wants to log off (offering a
feedback option), updates all logs and usage variables, displays
the goodbye file, and hangs up.
═══════════════════════════════════════════════════════════════
[canned_msgread]
This invokes the canned read-message menu
═══════════════════════════════════════════════════════════════
[canned_email]
This invokes the canned email menu.
NanoBBS - UFO Language Documentation Page 62
═══════════════════════════════════════════════════════════════
[canned_jumpmb]
This invokes the canned jump-messagebase prompt. The user can
select a message base, jump to the next or previous message
base, get a list of message bases, or quit.
═══════════════════════════════════════════════════════════════
[canned_killmsg]
This kills the current message, if the user is allowed.
═══════════════════════════════════════════════════════════════
[canned_options]
This invokes the canned user options - the menu in which the
user can change his/her account parameters such as screen size,
language file, line/NEd editor, etc.
═══════════════════════════════════════════════════════════════
[canned_chpw]
This invokes the password changer. It is a subset of the
[canned_options] function.
═══════════════════════════════════════════════════════════════
[canned_chlang]
This invokes the language changer. It is a subset of the
[canned_options] function.
═══════════════════════════════════════════════════════════════
[canned_bang]
This prompts for the Bang prompt.
═══════════════════════════════════════════════════════════════
[canned_doormenu]
This invokes a canned door menu.
═══════════════════════════════════════════════════════════════
[rundoor {noun}]
This runs a door whose NUMBER is in {noun}. The appropriate
door info file is automatically created, so you don't need to
precede this with a DORINFO or DOORSYS token.
═══════════════════════════════════════════════════════════════
[canned_yourstats]
This shows the user's stats.
═══════════════════════════════════════════════════════════════
[canned_page]
This prompts to page the SysOp. It will ask for a reason and
note the chat request in the system log file.
NanoBBS - UFO Language Documentation Page 63
═══════════════════════════════════════════════════════════════
[canned_setscans]
This invokes the set scans menu.
═══════════════════════════════════════════════════════════════
[canned_newmsg]
This invokes the global new message scan.
═══════════════════════════════════════════════════════════════
[canned_callstoday]
This invokes the calls today list.
═══════════════════════════════════════════════════════════════
[canned_post]
This prompts to post a message in the current area, then invokes
the selected editor. Access levels and read-only restrictions
are checked.
═══════════════════════════════════════════════════════════════
[canned_userlist]
This invokes the user listings.
═══════════════════════════════════════════════════════════════
[canned_batchmenu]
This invokes the canned batch files menu.
═══════════════════════════════════════════════════════════════
[canned_download]
This invokes a generic download keyword.
═══════════════════════════════════════════════════════════════
[canned_upload]
This invokes a generic upload keyword.
═══════════════════════════════════════════════════════════════
[canned_filelist]
This lists all or selected files in the current file area.
═══════════════════════════════════════════════════════════════
[canned_newfiles]
This lists all new files or files since a specified date in the
current file area.
NanoBBS - UFO Language Documentation Page 64
═══════════════════════════════════════════════════════════════
[canned_findfile]
This invokes the hyper-speed file finder. It is NOT a synonym
of the [filesearch] keyword described earlier in this document,
because it prompts the user for the file specification, while
[filesearch] requires a file spec tp be provided in a noun.
═══════════════════════════════════════════════════════════════
[canned_filemenu]
This invokes the generic file section menu.
═══════════════════════════════════════════════════════════════
[canned_nextmb]
This jumps to the next message base. If the user is already in
the highest-numbered message base, the jump will be to the
lowest-numbered base to which the user has access.
═══════════════════════════════════════════════════════════════
[canned_prevmb]
This jumps to the previous message base. If the user is already
in the lowest-numbered message base, the jump will be to the
highest-numbered base to which the user has access.
═══════════════════════════════════════════════════════════════
[canned_nextfb]
This jumps to the next file area. If the user is already in the
highest-numbered file area, the jump will be to the
lowest-numbered area to which the user has access.
═══════════════════════════════════════════════════════════════
[canned_prevfb]
This jumps to the previous file area. If the user is already in
the lowest-numbered file area, the jump will be to the
highest-numbered area to which the user has access.
═══════════════════════════════════════════════════════════════
[canned_timebank]
This invokes the generic Time Bank menu.
═══════════════════════════════════════════════════════════════
[canned_jumpfb]
This invokes the canned jump file area prompt. The user can
select a file area, jump to the next or previous file area, get
a list of file areas, or quit.
NanoBBS - UFO Language Documentation Page 65
═══════════════════════════════════════════════════════════════
[plaque]
This displays the NanoBBS version information, or the "bridge
plaque" (apologies to trekkies)
═══════════════════════════════════════════════════════════════
[infoplaq]
This displays the copyright banner and several memory-related
disgnostic data. It is identical to the undocumented "$"
keyword at the canned main menu... whoops... I guess it's
documented now!
═══════════════════════════════════════════════════════════════
[nanochat]
This invokes the NanoCHAT multi-user chat system, a
teleconferencing system similar to that found in other quality
multi-line BBS packages. This chat system is fully documented
in NANOBBS.DOC. This keyword is ignored if the user is not
logged in yet, meaning essentially that you can't use this
keyword in your initial welcome screen...
═══════════════════════════════════════════════════════════════
[canned_whoson]
This displays a list of users online at the same time, how long
each user has been on and what they are doing (being
sufficiently vague as to afford other users -some- privacy). It
gives the user an option to mark him/herself "unavailable for
chat".
═══════════════════════════════════════════════════════════════
[whoson]
This just gives a display of the users online as in the
[canned_whoson] previously described, without prompting the user
for availability.
═══════════════════════════════════════════════════════════════
[freezetime]
This temporarily freezes time, so that the user can proceed
without time limits. Time spent in frozen time is not charged
to the user's cumulative time online for the day. This keyword
can be undone with the [unfreezetime] keyword.
═══════════════════════════════════════════════════════════════
[unfreezetime]
This unfreezes time. What that means is that if the user had
been in "frozen" time (as a result of the use of the
[freezetime] keyword or because s/he was flagged as "No Limit")
the clock will again start to tick and normal time limits for
the user's access level will apply.
NanoBBS - UFO Language Documentation Page 66
═══════════════════════════════════════════════════════════════
[iftimefrozen]
This keyword skips ahead to the next [mark] if time is not
frozen, otherwise if time is frozen it keeps processing.
═══════════════════════════════════════════════════════════════
[log {string}]
This makes a log entry in NANOBBS.LOG with the {string} noun as
the log contents.
═══════════════════════════════════════════════════════════════
[message {noun}]
This displays a "SysMsg" from the language file. The message
number is in the noun.
═══════════════════════════════════════════════════════════════
[ghostpost {area} {filename} {from} {to} {subject}]
Yes, this verb needs five nouns.
This verb will post an automatic message to the area specified
in the first noun. The message body is contained in the file
specified by the second noun. The third noun specifies the
"From" name. The fourth noun specifies the recipient's name.
The fifth noun specifies the subject. This always posts a
public message, even if the area in question is private.
If the file does not exist or if the user online at the time
does not have access to the area in question, no message is
posted. The filename MUST be fully pathed!
You can insert UFO variables in the message text by using %V
plus the variable number 1 to 40, examples: %V01 %V10 %V15
%V39. No other UFO nouns can be embedded in the message text -
use a [copy] keyword to copy a noun into a variable to get
around this.
═══════════════════════════════════════════════════════════════
[ghostpostp {area} {filename} {from} {to} {subject}]
This is identical to [ghostpost] except that it always posts a
private message.
═══════════════════════════════════════════════════════════════
[logoff]
This goes through the motions of logging the user off without
actually hanging up - you could use this to allow users to
logoff and then logon again (perhaps under a different account)
without having to redial!
NanoBBS - UFO Language Documentation Page 67
═══════════════════════════════════════════════════════════════
[bye_nohangup]
This is identical to [canned_goodbye] except that, as the name
implies, it does not hang up the modem.
═══════════════════════════════════════════════════════════════
[donthanguponbye]
This instructs NanoBBS not to hangup when the user logs off, not
even in the canned interface. If you're using the canned
interface, you'll want something in your byebye file that
re-cycles to a logon prompt or something, or else NanoBBS will
just exit and when it's re-run for WFC, it'll just reset the
modem anyway, hanging up on whoever was there!
═══════════════════════════════════════════════════════════════
[hanguponbye]
This reverses a previous [donthanguponbye] command. By default,
NanoBBS hangs up when the user logs off, so unless you've used a
[donthanguponbye] you won't need this.
═══════════════════════════════════════════════════════════════
[canned_pageuser]
This invokes the same hardcode as the "Page User" option from the
[W]ho menu. It goes through the motions of paging another user on
a multi-node system to NanoCHAT. There are no parameters.
═══════════════════════════════════════════════════════════════
[canned_telegram]
This invokes the same hardcode as the "Send Telegram" option from
the [W]ho menu. It goes through the motions of sending a
"telegram" to another user on a multi-node system. There are no
parameters.
═══════════════════════════════════════════════════════════════
[noabort]
This keyword prevents the user from aborting the UFO script with a
hotkey.
═══════════════════════════════════════════════════════════════
[abortok]
This keyword permits the user to abort the UFO script by hitting
any key.
═══════════════════════════════════════════════════════════════
[writebang {noun}]
This writes the contents of {noun} to the "Bang Prompt". The
previously existing prompt is overwritten.
NanoBBS - UFO Language Documentation Page 68
═══════════════════════════════════════════════════════════════
[moretype {noun}]
This defines what kind of "More?" prompts are displayed each page.
The {noun} is a number code, with the following significances:
0: Display a "Hit Any Key" prompt instead so the user has no "No"
option (great for required messages like rules, new user info
etc.)
1: Just the options "Yes" and "No"
2: "Yes", "No", and "=" which means nonstop.
3: "Yes", "No", "=Nonstop" and "Flag" as in flag a file for
downloading.
═══════════════════════════════════════════════════════════════
[yndefault {noun}]
This sets the default (if the user hits enter at a "Y/N" prompt)
response. The noun can either be YES or NO or Y or N.
═══════════════════════════════════════════════════════════════
[iftrashcan {noun}]
This will continue processing if the {noun} is in the default
trashcan file, TRASHCAN.CTL. If the {noun} is not in the trashcan,
then UFO will skip ahead to the next [mark].
═══════════════════════════════════════════════════════════════
[ifcensor {noun}]
This is identical to [iftrashcan] except that the {noun} is checked
against the default censor file, CENSOR.CTL.
═══════════════════════════════════════════════════════════════
[ifbadstring {string} {filename}]
This is similar to [iftrashcan] and [ifcensor] except that you can
specify any filename to check {string} against. If no path is
specified with the filename, UFO assumes that the file can be found
in the syspath defined in your config file.
═══════════════════════════════════════════════════════════════
[figuretime]
This causes NanoBBS to calculate the user's session time status and
place the results in the Language Parameters in the order they are
used by SysMsg 73.
═══════════════════════════════════════════════════════════════
[timereport]
This displays [sysmsg 73]. It is a detailed report of the amount
of time the user has used in the current session, including how
much "frozen" time, "granted" time and "banked" time is involved in
this session.
═══════════════════════════════════════════════════════════════
[plain {string}]
This displays a string which may contain embedded colours, without
translating the embedded codes. Useful for inspecting the raw form
of colourful strings.
═══════════════════════════════════════════════════════════════
[ifbirthday]
This will process to the next [mark] if it is the user's birthday
today. If it is not the user's birthday it will skip ahead until
it reaches the next [mark] or the end of the file.
═══════════════════════════════════════════════════════════════
[dispenseaccess {access}]
This sets the user's access level to the specified level AND sets
the user's expiry date to the one specified for that access level
in EXPIRY.CTL.
═══════════════════════════════════════════════════════════════
[setexpiry {days}]
This set's the user's expiry date to the specified number of days
in the future.
═══════════════════════════════════════════════════════════════
[chat_send {node} {path} {filename}]
This sends a text, ANSI, RIP or UFO file to the caller on the
specified node. You may substitute a few letters from the caller's
chat handle instead, as in chat. Note that the path and filename
are separate; this allows you to let users select filenames from a
secure directory. If path information is specified in {filename}
it will be stripped and the path specified in {path} will be used,
making this keyword hack-proof.
═══════════════════════════════════════════════════════════════
[chat_bc {path} {filename}]
This sends a text, ANSI, RIP or UFO file to everyone on the
caller's channel. As in [chat_send] this keyword uses a separate
path and filename for security. Just hard-code the path and let
users enter the filename if they wish, as long as the files are in
a directory where there's nothing sensitive, there will be no
security problems.
═══════════════════════════════════════════════════════════════
[chat_bc_except {node} {path} {filename}]
This is like [chat_bc] except that it will NOT send the file to one
node you specify. This way you can use this to build chat alias
commands that work as super-actions, in which you use a [chat_send]
to send the recipient's copy and a [chat_bc_except] to broadcast
copies to everyone else who would see the action.
═══════════════════════════════════════════════════════════════
[profilemenu]
This takes the user to the canned User Profiles menu.
═══════════════════════════════════════════════════════════════
[showprofile {username}]
This displays the User Profile information for the specified (by
logon username) user.
═══════════════════════════════════════════════════════════════
[loadnode {node}]
This loads the user account of the person on {node} into the Object
user record for whatever purposes you want =)
NanoBBS - UFO Language Documentation Page 68