home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-387-Vol-3of3.iso
/
s
/
sd-27.zip
/
database.doc
< prev
next >
Wrap
Text File
|
1992-11-26
|
69KB
|
1,655 lines
The setups that the program recognizes are as follows
(from database.h, enumeration type "setup_kind"), each is
shown with a map giving the person numbering:
_____
| |
1x1 | 0 | (4 way symmetry)
|_____|
_____ _____
| | |
1x2 | 0 | 1 |
|_____|_____|
_____ _____ _____
| | | |
1x3 | 0 | 1 | 2 |
|_____|_____|_____|
_____ _____ _____ _____
| | | | |
1x4 | 0 | 1 | 3 | 2 |
|_____|_____|_____|_____|
_____ _____ _____ _____ _____ _____
| | | | | | |
1x6 | 0 | 1 | 2 | 5 | 4 | 3 |
|_____|_____|_____|_____|_____|_____|
_____ _____ _____ _____ _____ _____ _____ _____
| | | | | | | | |
1x8 | 0 | 1 | 3 | 2 | 6 | 7 | 5 | 4 |
|_____|_____|_____|_____|_____|_____|_____|_____|
_____ _____ _____ _____ _____ _____ _____ ___________ _____
| | | | | | | | | | |
1x10 | 0 | 1 | 2 | 3 | 4 | 9 | 8 | 7 | 6 | 5 |
|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|
_____ _____ _____ _____ _____ _____ _____ ___________ _____ _____ _____
| | | | | | | | | | | | |
1x12 | 0 | 1 | 2 | 3 | 4 | 5 | 11 | 10 | 9 | 8 | 7 | 6 |
|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|
_____ _____ _____ _____ _____ _____ _____ ___________ _____ _____ _____ _____ _____
| | | | | | | | | | | | | | |
1x14 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 13 | 12 | 11 | 10 | 9 | 8 | 7 |
|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|
_____ _____ _____ _____ _____ _____ _____ ___________ _____ _____ _____ _____ _____ _____ _____
| | | | | | | | | | | | | | | | |
1x16 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 |
|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|
_____ _____
| | |
| 0 | 1 |
2x2 |_____|_____| (4 way symmetry)
| | |
| 3 | 2 |
|_____|_____|
_____ _____ _____
| | | |
| 0 | 1 | 2 |
2x3 |_____|_____|_____|
| | | |
| 5 | 4 | 3 |
|_____|_____|_____|
_____ _____ _____ _____
| | | | |
| 0 | 1 | 2 | 3 |
2x4 |_____|_____|_____|_____|
| | | | |
| 7 | 6 | 5 | 4 |
|_____|_____|_____|_____|
_____ _____ _____ _____ _____ _____
| | | | | | |
| 0 | 1 | 2 | 3 | 4 | 5 |
2x6 |_____|_____|_____|_____|_____|_____|
| | | | | | |
| 11 | 10 | 9 | 8 | 7 | 6 |
|_____|_____|_____|_____|_____|_____|
_____ _____ _____ _____ _____ _____ _____ _____
| | | | | | | | |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
2x8 |_____|_____|_____|_____|_____|_____|_____|_____|
| | | | | | | | |
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 |
|_____|_____|_____|_____|_____|_____|_____|_____|
_____
_____| |_____
| | 1 | |
dmd | 0 |_____| 2 |
|_____| |_____|
| 3 |
|_____|
_____
| |
| 1 |
_____|_____|_____
| | | |
star | 0 | | 2 | (4 way symmetry)
|_____|_____|_____|
| |
| 3 |
|_____|
_____ _____
| |_____ _____| |
| 0 | | | 1 |
bone6 |_____| 5 | 2 |_____|
| |_____|_____| |
| 4 | | 3 |
|_____| |_____|
_____
| |
| 1 |
__|__ __|__
| | |
| 0 | 2 |
short6 |_____|_____|
| | |
| 5 | 3 |
|_____|_____|
| |
| 4 |
|_____|
_____ _____
| | |
| 0 | 1 |
_____|_____|_____|_____
| | | | |
qtag | 6 | 7 | 3 | 2 |
|_____|_____|_____|_____|
| | |
| 5 | 4 |
|_____|_____|
_____ _____
| |_____ _____ _____ _____| |
| 0 | | | | | 1 |
bone |_____| 6 | 7 | 3 | 2 |_____|
| |_____|_____|_____|_____| |
| 5 | | 4 |
|_____| |_____|
_____ _____
_____ _____| | |_____ _____
| | | 0 | 1 | | |
rigger | 6 | 7 |_____|_____| 3 | 2 |
|_____|_____| | |_____|_____|
| 5 | 4 |
|_____|_____|
_____ _____ _____
_____| | | |_____
| | 0 | 1 | 2 | |
spindle | 7 |_____|_____|_____| 3 |
|_____| | | |_____|
| 6 | 5 | 4 |
|_____|_____|_____|
_____ _____
| | |
| 0 | 1 |
|_____|_____|
_____| |_____
| | 3 | |
hrglass | 6 |_____| 2 |
|_____| |_____|
| 7 |
__|__ __|__
| | |
| 5 | 4 |
|_____|_____|
_____
| |
| 2 |
|_____|
_____ _____ | | _____ _____
| | | | 3 | | | |
crosswave | 0 | 1 | |_____| | 5 | 4 |
|_____|_____| | | |_____|_____|
| 7 |
|_____|
| |
| 6 |
|_____|
_____ _____ _____ _____
| | | | |
| 0 | 1 | 2 | 3 |
|_____|_____|_____|_____|
| | | | |
3x4 | 10 | 11 | 5 | 4 |
|_____|_____|_____|_____|
| | | | |
| 9 | 8 | 7 | 6 |
|_____|_____|_____|_____|
_____ _____ _____ _____
| | | | |
| 12 | 13 | 14 | 0 |
|_____|_____|_____|_____|
| | | | |
| 10 | 15 | 3 | 1 |
4x4 |_____|_____|_____|_____| (4 way symmetry)
| | | | |
| 9 | 11 | 7 | 2 |
|_____|_____|_____|_____|
| | | | |
| 8 | 6 | 5 | 4 |
|_____|_____|_____|_____|
_____ _____ _____ _____ _____ _____
| | | | | | |
| 0 | 1 | 2 | 3 | 4 | 5 |
|_____|_____|_____|_____|_____|_____|
| | | | | | |
| 11 | 10 | 9 | 8 | 7 | 6 |
4x6 |_____|_____|_____|_____|_____|_____|
| | | | | | |
| 18 | 19 | 20 | 21 | 22 | 23 |
|_____|_____|_____|_____|_____|_____|
| | | | | | |
| 17 | 16 | 15 | 14 | 13 | 12 |
|_____|_____|_____|_____|_____|_____|
_____ _____
| | | |
| 1 | | 4 |
_____|_____|_____ _____|_____|_____
| | | | | | |
| 0 | | 2 | 7 | | 5 |
|_____|_____|_____|_____|_____|_____|
| | | |
| 3 | | 6 |
c1phan |_____| |_____| (4 way symmetry)
| | | |
| 14 | | 11 |
_____|_____|___________|_____|_____
| | | | | | |
| 13 | | 15 | 10 | | 8 |
|_____|_____|_____|_____|_____|_____|
| | | |
| 12 | | 9 |
|_____| |_____|
_____ _____
| | |
| 0 | 1 |
_____|_____|_____|_____
| | | | |
| 21 | 22 | 2 | 3 |
_____|_____|_____|_____|_____|_____
| | | | | | |
| 19 | 20 | 23 | 5 | 4 | 6 |
bigblob |_____|_____|_____|_____|_____|_____| (4 way symmetry)
| | | | | | |
| 18 | 16 | 17 | 11 | 8 | 7 |
|_____|_____|_____|_____|_____|_____|
| | | | |
| 15 | 14 | 10 | 9 |
|_____|_____|_____|_____|
| | |
| 13 | 12 |
|_____|_____|
_____
| |
| 2 |
__|__ __|__
_____| | |_____
| | 1 | 3 | |
galaxy | 0 |_____|_____| 4 | (4 way symmetry)
|_____| | |_____|
| 7 | 5 |
|_____|_____|
| |
| 6 |
|_____|
_____ _____
_____| |_____ _____| |_____
| | 1 | | | 7 | |
ptpd | 0 |_____| 2 | 6 |_____| 4 |
|_____| |_____|_____| |_____|
| 3 | | 5 |
|_____| |_____|
_____
| |
| 3 |
_____ _____ __|__ __|__ _____ _____
| | | | | | |
3x1dmd | 0 | 1 | 2 | 6 | 5 | 4 |
|_____|_____|_____|_____|_____|_____|
| |
| 7 |
|_____|
_____ _____ _____
| | | | | |
| 0 | | 1 | | 2 |
__|__ __|__ __|__ __|__ __|__ __|__
| | | | | | |
3dmd | 9 | 10 | 11 | 5 | 4 | 3 |
|_____|_____|_____|_____|_____|_____|
| | | | | |
| 8 | | 7 | | 6 |
|_____| |_____| |_____|
_____ _____ _____ _____
| | | | | | | |
| 0 | | 1 | | 2 | | 3 |
__|__ __|__ __|__ __|__ __|__ __|__ __|__ __|__
| | | | | | | | |
4dmd | 12 | 13 | 14 | 15 | 7 | 6 | 5 | 4 |
|_____|_____|_____|_____|_____|_____|_____|_____|
| | | | | | | |
| 11 | | 10 | | 9 | | 8 |
|_____| |_____| |_____| |_____|
_____
| |
| 3 |
_____ _____ _____|_____|_____ _____ _____
| | | | | | | |
wingedstar | 0 | 1 | 2 | | 6 | 5 | 4 |
|_____|_____|_____|_____|_____|_____|_____|
| |
| 7 |
|_____|
_____
_____ | | _____
| | | 3 | | |
| 2 | |_____| | 5 |
|_____| | | |_____|
| 4 |
_____ _____|_____|_____ _____
| | | | | |
hyperglass | 0 | 1 | | 7 | 6 | (4 way symmetry)
|_____|_____|_____|_____|_____| (internal use only!)
| |
_____ | 10 | _____
| | |_____| | |
| 11 | | | | 8 |
|_____| | 9 | |_____|
|_____|
_____ _____
| | |
| 1 | 2 |
trngl |_____|_____| (1 way symmetry -- leads to strange
| | requirements in call descriptions)
| 0 |
|_____|
thar
nothing ??????
normal_concentric ??????
An important property of these setups, used extensively by the program,
is that any person's diagonal opposite can be found by adding half the
setup size modulo the setup size. Additionally, for setups that have
4 way symmetry, the person 90 degrees clockwise from a given person can
be found by adding one quarter of the setup size modulo the setup size.
Before going further, we must distinguish between
a "beginning setup kind" and an "ending setup kind".
These are described internally by the enumerations "begin_kind" and
"setup_kind", respectively, in the file database.h, by the way.
Ending setup kinds correspond to the diagrams shown earlier. They do
not distinguish between 90 degree rotated versions of the same setup.
Beginning setup kinds are more numerous because they DO distinguish
between the 90 degree rotated versions of those setups that do not
have 4 way symmetry. That is, they take into account the difference
between lines and columns, so that a call definition can indicate
separate actions for people in lines vs. people in columns in the
same 2x4 setup.
The set of beginning setup kinds is just the set of ending setup kinds
(that is, the diagrams above) augmented by 90 degree rotated versions
of those setups that don't have 4 way symmetry. The names of these
extra setups (called "PU" setups) are typically formed by reversing
the matrix size numbers (1x4 vs. 4x1, for example) or by putting
the letter "p" in front, as in "pqtag".
The extra beginning setup kinds are as follows:
normal setup "PU" setup
1x2 2x1
dmd pmd
trngl ptrngl
bone6 pbone6
short6 pshort6
qtag pqtag
wing pwing
spindle pspindle
hrglass phrglass
1x4 4x1
1x8 8x1
1x10 10x1
1x12 12x1
1x14 14x1
1x16 16x1
2x4 4x2
2x3 3x2
1x6 6x1
3x4 4x3
2x6 6x2
2x8 8x2
ptpd pptpd
3x1dmd p3x1dmd
3dmd p3dmd
4dmd p4dmd
This correspondence is embodied in the program by means of the table
"keytab" in the file sdtables.c, by the way.
A call definition by array consists of one or more descriptors that look like:
setup <beginning setup kind> <ending setup kind>
array [<person action> <person action> ...]
So, for example, the description of the call "drift apart" looks as follows:
setup 2x4 2x4
array [M6S M4S M7S M5S L2S L0S R3S R1S]
setup 4x2 2x4
array [R6S M4N 3LS M5S M2S R4S M3N L1S]
The first descriptor tells people who think they are in lines what to do,
and the second descriptor addresses people in columns. For calls that start
in a setup with 4 way symmetry, there is only one descriptor as in the
following definition of "reach out":
setup 2x2 1x4
array [M3S M1S R2S L0S]
It is never appropriate for a PU setup, such as "4x2", to
appear as the SECOND token after the word "setup". Only the FIRST token
may be such a setup.
An entry of zero in the array means that the call would be illegal for
anyone in that position, e.g. the leaders in the call "right and left thru".
We can now show the interpretation of a call descriptor for a very simple case,
when the beginning and ending formations are both in normal orientation,
as shown in diagrams above. In this case the beginning setup will have the
same name as an ending setup. The list in brackets will have as many items
as there are people in the beginning setup. Each person finds his position
number in that setup, assuming he is facing north. It is as though everyone
were given the diagrams listed above, and held the diagram in front of him
to determine his position. Once he determines his position, he looks at that
item in the bracketed array (starting with zero, of course) to determine
what to do. The number says what position in the ending setup that person
should move to. The letter (N, E, S, or W) after the number tells what
facing direction to take (north, east, south, or west). Both of these are
interpreted relative to the diagram that the person is holding in front of him.
So, for example, a direction of north indicates that that person does not
change facing direction, east indicates that that person finishes 90 degrees
clockwise from his starting orientation, and so on. Note that all directions
are north for the call "walk and dodge", and are south for the call "reach
out". This is so even if the calls are done from T-boned formations.
Finally, the optional letter before the number tells that person's roll
direction. "L" and "R" indicate that the person will quarter left or
right if told to roll after the call. "M" ("middle") says that the
person knows that he can't roll, and will stay facing the same direction.
No letter means that the person's roll direction is undefined
(or controversial, or not implemented yet) and an error will be given if
that person is told to roll. For example, roll is considered illegal
after "wheel fan and cross thru".
Example:
In "reach out", the first array item, which is "M3S", says that any
person in the starting 2x2 box who is a lead beau (position 0 in the
diagram) should think of a 1x4 line elongated laterally relative to himself,
and should go to the second spot from the right end (position 3), turn 180
degrees, and refuse to roll.
This person ---+
|
|
__V__ _____
| | |
| 0 | |
|_____|_____|
| | |
| | |
|_____|_____|
goes here -------+
|
|
_____ _____ __V__ _____
| | | | |
| | | 3 | |
|_____|_____|_____|_____|
If people are T-boned, the application of these rules could result in
people fighting over which way the resulting 1x4 should be oriented.
The program will resolve this by turning the result into a diamond if
it can, or giving an error otherwise.
We will now go through all the cases in a somewhat methodical way.
BEGINNING AND ENDING SETUPS DO NOT HAVE 4 WAY SYMMETRY,
CALL IS NON-ROTATING
We consider a call to be non-rotating if the starting and ending setups
have consistent orientation relative to the diagrams above. That is,
if the beginning setup is oriented as shown in one of the diagrams,
the ending setup will also be as shown in one of the diagrams. Any
"non-shape-changer" is such a call. Switch to a diamond is also
non-rotating. Reverse flip the diamond is not.
In this case, each person holds the diagram in front of him, in normal
orientation if possible, so that he is facing north, and reads his
position number from it. He then looks that the correspondingly numbered
element of the array describing the call in the database, and goes to
the indicated spot in the result setup, using the same orientation
of the set of diagrams. For example, on the call "circulate" from a 2x4,
anyone who thinks he is in lines and is the second from the left looking
out, will do this:
This person ---+
|
|
_____ __V__ _____ _____
| | | | |
| | 1 | | |
|_____|_____|_____|_____|
| | | | |
| | | | |
|_____|_____|_____|_____|
looks at item number 1 in the call definition array, which is
setup 2x4 2x4
array [R3S R2S L1S L0S M3N M2N M1N M0N]
^
|
item 1
and so goes here ----+
|
|
_____ _____ __V__ _____
| | | | |
| | | 2 | |
|_____|_____|_____|_____|
| | | | |
| | | | |
|_____|_____|_____|_____|
and faces south, ready to roll right.
The procedure just described only works for people who are facing north
or south in the diagram of the beginning setup. People facing east
or west do the following: Change the name of the beginning setup to
its PU name (in this case 4x2) when looking it up in the database
specification, and turn all the diagrams 90 degrees counterclockwise.
The PU version of the 2x4 setup looks like this:
_____ _____
| | |
| 3 | 4 |
|_____|_____|
| | |
| 2 | 5 |
4x2 |_____|_____|
| | |
| 1 | 6 |
|_____|_____|
| | |
| 0 | 7 |
|_____|_____|
If someone is last in a right-hand column, he will do the following:
_____ _____
| | |
| | |
|_____|_____|
| | |
| | |
|_____|_____|
| | |
| | |
|_____|_____|
| | |
this person ----->| 0 | |
|_____|_____|
looks at item number 0 in the call definition array, which is
setup 4x2 2x4
array [M1N M2N M3N R4S L3S M4N M5N M6N]
(Note that the beginning setup is now 4x2, but the ending setup
is still 2x4. PU names are never used in ending setup names.)
_____ _____
| | |
| | |
|_____|_____|
| | |
| | |
|_____|_____|
| | |
and so goes here --->| 1 | |
|_____|_____|
| | |
| | |
|_____|_____|
and faces north, ready to refuse to roll.
Calls that can handle arbitrary facing directions from beginning setups that
do not have 4 way symmetry must have 2 entries in the database: a "normal"
one for people who are facing north or south in the diagrams shown above,
and a "PU" one for people who are facing east or west. The full
definition for circulate from arbitrary 2x4's is
setup 2x4 2x4
array [R3S R2S L1S L0S M3N M2N M1N M0N]
setup 4x2 2x4
array [M1N M2N M3N R4S L3S M4N M5N M6N]
When using the PU definition, both the beginning and ending diagrams
are rotated 90 degrees counterclockwise relative to the above diagrams,
whether they are the same setup or different setups.
Another example:
Diamonds always have people T-boned. The points use the normal
definitions and the centers use the PU definitions. The call
"diamond circulate" is defined as
setup dmd dmd
array [R1E 0 L1W 0]
setup pmd dmd
array [0 R2E 0 L2W]
The zero entries mean that the call is illegal for people who
are facing directly into or out of the diamond. The legal starting
positions for the call "diamond single rotate" are the other way around:
setup dmd dmd
array [0 L0S 0 L2N]
setup pmd dmd
array [L3N 0 L1S 0]
The diagram that people use for the PU definition is:
_____
| |
| 2 |
__|__ __|__
| | |
| 1 | 3 |
|_____|_____|
| |
| 0 |
|_____|
Another example:
The call "flip the diamond" is defined as
setup dmd 1x4
array [R1S 0 L3S 0]
setup pmd 1x4
array [0 R2E 0 L2W]
The centers of the diamond use the PU definition. They
rotate the ending diagram 90 degrees counterclockwise also,
so the ending setup is
_____
| |
| 2 |
|_____|
| |
| 3 |
|_____|
| |
| 1 |
|_____|
| |
| 0 |
|_____|
BEGINNING AND ENDING SETUPS DO NOT HAVE 4 WAY SYMMETRY,
CALL IS *ROTATING*
If the beginning and ending setups do not both appear in the above diagrams
with consistent orientation, do the following:
Invent a new call whose action is the desired call followed by
a complete rotation of the final poition 90 degrees counterclockwise.
Enter that new call in the database as described above.
Put the word "rotate" after the two setup names in each definition
specification.
The word "rotate" tells the program to rotate the setup resulting from the
use of that specification clockwise after completion of the call. The call
"counter rotate" is an example:
setup 2x4 2x4 rotate
array [R0N R1N L6S L7S L0S L1S R6N R7N]
setup 4x2 2x4 rotate
array [R0N R1N R2N R3N L0S L1S L2S L3S]
"Lockit" is another:
setup 1x4 1x4 rotate
array [R0N R1N L0S L1S]
"Single strut right" is another:
setup 4x1 1x4 rotate
array [3W 2E 0 0]
Rotating call definitions are confusing to write! The facing direction
given in the call specification does NOT include the final clockwise
rotation that the program will perform. In "lockit" person #0 is shown
not changing his facing direction at all ("N") even though his roll direction
is "R". This is because his actual 90 degree clockwise turn is entirely
a consequence of the hidden final rotation. Person #2 is show turning
180 degrees. That, plus the final rotation, gives a 90 degree
counterclockwise turn.
What happens if one of the specifications has the word "rotate" and the
other does not? If people are not T-boned, there is no problem. Only
one of the specifications is used. In this case, whether the call is a
shape-changer would depend on people's facing direction. (The call "change
your image" comes to mind.) If people are T-boned, the call will be illegal
with this definition. "Change your image" used to be definied this way,
and was illegal from T-boned setups. It now uses a different trick, to
be described much later.
BEGINNING AND ENDING SETUPS BOTH HAVE 4 WAY SYMMETRY
This is straightforward. The word "rotate" is never used with such
calls, and only one descriptor is required. If people are T-boned when
the call is executed, the program does what it can. Here is the definition
of "ripoff":
setup 2x2 2x2
array [R1S R2N M3N M0N]
BEGINNING SETUP HAS 4 WAY SYMMETRY, ENDING SETUP DOES NOT
If the ending setup, relative to people who are facing north when the call
begins, is oriented as in one of the diagrams above, the situation is
straightforward, as in "reach out":
setup 2x2 1x4
array [M3S M1S R2S L0S]
Otherwise, we must use a rotating definition. As above, we define
a new call that has the effect of the desired call followed by a 90
degree counterclockwise rotation, encode that into the database, and put
in the word "rotate". Here is "pass the ocean":
setup 2x2 1x4 rotate
array [0 0 L1S R0N]
_____ _____
| | |
| | |
|_____|_____|
| | |
| 3 | |
|_____|_____|
^
|
This person ---+
goes here --+ and faces north,
|
|
__V__ _____ _____ _____
| | | | |
| 0 | | | |
|_____|_____|_____|_____|
and then the entire setup is rotated clockwise, resulting in this:
_____
| |
| X | facing east
|_____|
| |
| |
|_____|
| |
| |
|_____|
| |
| |
|_____|
which is of course the desired result.
BEGINNING SETUP DOES NOT HAVE 4 WAY SYMMETRY
ENDING SETUP DOES
If the beginning setup, relative to people who are facing north,
is oriented as in one of the diagrams above, the situation is
straightforward, as in "ah so":
setup 1x4 2x2
array [R1S L3S L0S R2S]
If the PU beginning setup is required, so that we turn all the
diagrams counterclockwise, we turn the ending setup's diagram
counterclockwise also. This is perhaps not intuitive.
Here is the call "single polly wally":
setup 4x1 2x2
array [R3S 2N L1S 0S]
beginning PU setup:
_____
| |
| 2 |
|_____|
| |
| 3 |
|_____|
| |
| 1 |
|_____|
| |
| 0 |
|_____|
ending setup -- note that it is rotated with respect to the main
diagram for a 2x2, so that its orientation is consistent with
the 4x1 starting setup:
_____ _____
| | |
| 1 | 2 |
|_____|_____|
| | |
| 0 | 3 |
|_____|_____|
Viewed in this way, person zero goes to position 3 and faces south.
The word "rotate" is not used with such a specification, since the
orientations of the beginning and ending setups are consistent
WITH EACH OTHER. (They are both rotated 90 degrees counterclockwise
from the main diagrams.)
We can of course mix specifications in which the people begin in the
normal setup and the PU setup. Consider "drop in":
setup dmd 2x2
array [R0E 0 L1W 0]
setup pmd 2x2
array [0 M1N 0 M2N]
For the "normal" people (who are the points):
_____ _____ _____
_____| |_____ | | |
| | 1 | | | 0 | 1 |
| 0 |_____| 2 | --> |_____|_____|
|_____| |_____| | | |
| 3 | | 3 | 2 |
|_____| |_____|_____|
For the "PU" people (who are the centers):
_____
| |
| 2 | _____ _____
__|__ __|__ | | |
| | | | 1 | 2 |
| 1 | 3 | --> |_____|_____|
|_____|_____| | | |
| | | 0 | 3 |
| 0 | |_____|_____|
|_____|
The word "rotate" is not used for either the "dmd" or the "pmd"
specification.
General rules of thumb:
(1) Never use the word "rotate" with an ending setup that has
4-way symmetry. If you think you need to, you are wrong.
(2) In general, use the word "rotate" for both specifications of a
multi-specification call, or for neither. If it is used for
one and not the other, that means that, if people are T-boned,
they will disagree on whether the call is a shape-changer. The
only legal case of this is calls with an ending setup which is
a 2x4. In that case, if people are T-boned, the call will go
into a 4x4 final setup. This is used in "change your image"
and "single rotate".
(3) The word "rotate" simply causes all of the people to turn their
formation 90 degrees clockwise at the conclusion of the call.
It is independent of everything else.
(3) Within any one specification, you must either turn ALL of the
above diagrams counterclockwise, or NONE of them. In the former
case, use the "PU" starting setup designation for that
specification. If you can't define the call this way, define
a different call and use "rotate" to get the desired behavior.
MULTIPLE SPECIFICATIONS
In general, a call is defined with one or more specifications, each
giving the rule for one starting setup. An example of this can be
found in the call "counter rotate", for which a very abbreviated
definition is:
setup 2x4 2x4 rotate
array [R0N R1N L6S L7S L0S L1S R6N R7N]
setup 4x2 2x4 rotate
array [R0N R1N R2N R3N L0S L1S L2S L3S]
setup 2x2 2x2
array [R1E L0W L1W R0E]
setup dmd dmd rotate
array [R0N 0 L0S 0]
setup pmd dmd rotate
array [0 R1N 0 L1S]
It actually has a specification for just about every starting setup
that exists. This is because counter rotate is a rather unusual call.
Many calls have just one definition from one setup. They are legal
from other setups that are just multiple copies of the given setup.
For example, "circle to a wave" is just defined from a 2x2 box:
setup 2x2 2x2
array [0 0 0E 1E]
No other definitions are given. When the call is executed from a
larger setup, such as lines facing or an 8-chain, the program breaks
up the larger setup into smaller ones and executes the call separately
in each smaller setup.
The program's general rule is to search through the given call
definition for a specification matching the given setup. If no entry
is found, it attempts to divide the setup into smaller ones. (If
people are T-boned and the setup does not have 4-way symmetry, it
actually requires two specifications, for example, 2x4 and 4x2.
If it finds either one, it does not consider subdividing. If only
one of the two was present, the people whoe require the other will
lose. Too bad.)
When the program decides to subdivide the setup, it is guided by the
specifications that are present for smaller setups. It always begins
with the least radical subdivision. If the original setup is a 2x4,
but no 2x4 (or 4x2, as needed) specifications are present, it looks
for 1x4 (and/or 4x1) specifications. If found, the setup is divided
that way. If a 2x2 specification is found, it divides the setup that
way. If both are found, it gives precedence to the 1x4 division.
If neither a 1x4/4x1 or 2x2 specification is found, it looks for a
1x2 and/or 2x1. If found, it subdivides the setup as appropriate.
If no 1x2/2x1 is found, it searches for a 1x1. Similar subdivision
searches are performed for other initial setups.
Some of the subdivision rules are actually somewhat tricky. When
dividing a 2x2 into 1x2's, it looks at people's facing direction
and checks for the existence of a 1x2 and/or 2x1 specification.
It requires an unambiguous decision of which axis to use for the
subdivision. Hence "siamese breakdown" is not permitted in a 2x2,
and subdivision is not possible if people are T-boned (I think.)
Similar care is exercised in the 2x4 to 1x2/2x1 subdivision. It
does the right thing with "heads pass thru; everyone trade".
The reason that "counter rotate" needs so many specifications is that
this call's definition does not involve the replication of smaller
versions in larger setups. If it were defined on a 1x4 but not on a
1x8, then, if called from a grand wave, it would do a lockit on each
side, rather than a the gigantic concentric counter rotate that is
required.
The order in which specifications with different starting setups
appear is not significant -- the search is always from the largest
setup to the smallest. Multiple specifications with the same
starting setup are only meaningful if qualifiers are used (see below),
and, in that case, they are searched in the order in which they appear.
OVERVIEW OF PREDICATES, RESTRICTIONS, AND QUALIFIERS
These are conditional things that can be placed in calls to perform
special functions. A brief summary of their meanings is this:
Predicates are applied separately to each person, and are used
to let a person execute a rule that depends on some property of
the setup, such as another person's orientation. Example:
Predicates are used in the call "in roll circulate" to tell people
who are not inrollers where the inroller is, so they know which way
to move.
Restrictions are applied to entire setups, and are used to indicate
that, while the overall setup shape is acceptable, certain aspects
(for example, facing directions) might be unusual. When a restriction
is violated, a warning or error arises. This is typically the "do
your part" warning. Example: A restriction is used on "follow your
neighbor" to force the "do your part" warning if people are not in
a normal box. The call could be done from a magic box. [Actually,
most restrictions should raise errors instead of warnings, but the
ability to do that is a recent feature.]
Qualifiers are used to control the search for starting setups.
Rather than causing a warning or error to be raised if the setup
is inappropriate, a qualifier simply causes that clause to be skipped
in the search. An example of this is in the call "recycle":
setup 1x4 2x2 qualifier wave_only
.....
setup 2x2 1x4
.....
When done from a 2x4, we want to do the 1x4 version if the people
are in waves, and the 2x2 version if they are in lines facing. The
normal preference is for the 1x4 version. The qualifier causes the
program to look at people's facing direction and ignore the 1x4 clause
if the people are not in waves. This will cause the 2x2 clause to be
used instead. If they are neither in waves nor lines facing, the 2x2
clause will be used and the call will fail, since the 2x2 definition
requires facing couples.
In using predicates, restrictions, and qualifiers, one must be aware
of their behavior in the presence of phantoms. Some of them are
strict -- they require that all necessary people actually be present
and make up the indicated formation. Others are lax -- they simply
require that the people who are present be oriented in a way that is
consistent with the indicated formation. In general, predicates are
strict (though they typically only look at one other person, not the
whole setup), and restrictions and qualifiers are lax.
PREDICATES
Predicates are used to indicate, on a person-by-person basis, how
the call definition is determined by properties of the setup other
than that person's position and facing direction. If a person's
action is dependent only on his position and facing direction, as
it is for most calls, the mechanism already described is sufficient.
For calls like "cycle and wheel" and "in roll circulate", that isn't
enough. Some people need guidance from another person.
Predicates are used by replacing the "array" clause:
array [<person action> <person action> ...]
With a "preds" clause:
preds <error message in quotes>
if <predicate> [<person action> <person action> ...]
if <predicate> [<person action> <person action> ...]
....
For each person, the predicates are evaluated in sequence until one
is satisfied. When that happens, that person's entry in the
corresponding action list is used. If no predicate is satisfied for
some person, the call fails, giving the error message. (In some
cases, evaluation of a predicate itself gives rise to an error
message.)
For example, the call "cycle and wheel" is defined this way:
setup 1x4 2x2
preds "Can't do this call."
if lines_miniwave [R1S L3N L0S R2N]
if lines_couple [R1S R0S L0S L1S]
These two predicates are both strict, and both defined for many setups.
They test the "partner" of the given person, and return true if that
partner is facing the opposite way or same way, respectively, as the
given person. If the partner is a phantom or is T-boned to the given
person, they return false. They do not raise any errors in any case.
If any person's partner is a phantom or is T-boned, both predicates
will return false, the program will run out of predicates, and the
error "Can't do this call" will be raised.
The call could have been defined by:
setup 1x4 2x2
preds "?"
if lines_miniwave [R1S L3N L0S R2N]
if lines_couple [R1S R0S L0S L1S]
if always [R1S 0 L0S 0 ]
since the ends know what to do anyway. In this case, if an end were
a phantom and the adjacent center were not, the call would fail with
a "so-and-so is not able to execute this call" error. This is because,
when testing the center, the first two predicates would both fail, and
the third would be used, giving zero, which indicates that the person
can't do the call.
The definition of "in roll circulate" is:
setup 2x4 2x4
preds "???"
if inroller_is_cw [1S 2S 3S 0 0 6S 7S 0N]
if always [0 0S 1S 2S 3N 4S 5S 0 ]
The predicate "inroller_is_cw" is unusual. It is specifically
designed for this call. It is defined only for 2x4 lines.
Some predicates, like "lines_miniwave" and "lines_couple", are
overloaded -- they have rather general meaning and can be invoked
from several setups. This predicate, however, is only appropriate
from 2x4 lines, so it must only be used with a "setup 2x4 ..."
specification. (In fact, it is only used for this call.)
Always check the applicable setups before using a predicate.
The predicate "inroller_is_cw" does most of its work when evaluated
for a center person (spots 1, 2, 5, or 6.) It examines the people
at the two ends of that person's line. There must be exactly one
live inroller. An inroller at one end and a phantom at the other
is legal. It evaluates to true if the inroller is clockwise (around
the 2x4) from the person in question, false if not. In the latter
case, the program will use the "always" predicate, which is always
satisfied, so it will never run off the end of the list. For this
reason, the error message after the word "preds" is just some question
marks -- it will never be printed. If the in-roll direction can not
be determined, the predicate itself raises the error.
For the ends, the in-roll status is clear. Person zero is not an
inroller. The predicate checks whether the person at the other end
of his line is an inroller, raising an error if not, and returns true
if so, since that inroller is clockwise from person zero. For person
three, the inroller must be at the other end of the line, which is
counterclockwise, so the predicate either raises an error or returns
false. Appropriate things are also done with persons four and seven,
to be sure that the inroller is not ambiguous.
To summarize some general properties of predicates:
(1) Some predicates are "strict" in their examination of other
people. They demand that the person being examined be alive
and facing in a certain direction. A few predicates are "lax" --
they only test for the absence of a person facing in the incorrect
direction. Always check the documentation of the spefic predicate
being used.
(2) Some predicates are applicable on a number of setups, with
suitable interpretation of what is meant for each setup. Others
are only applicable to one setup. Always check the documentation
of the spefic predicate being used.
(3) Some predicates (the more "generic" ones, in general) do their work
only by returning TRUE or FALSE. They never raise errors, because
that would compromise their generality. Other predicates raise
errors when appropriate, in order to simplify the database. Always
check the documentation of the specific predicate being used.
The existing predicates are listed in the appendix.
APPENDIX A -- PREDICATES
always
applies to any setup. Returns TRUE in all cases.
x22_miniwave
applies to 2x2 only. Returns TRUE if the lateral partner of the
person under test is alive and facing the opposite direction.
Returns FALSE if the lateral partner is a phantom or faces the
same way or is T-boned.
x22_couple
applies to 2x2 only. Returns TRUE if the lateral partner of the
person under test is alive and facing the same direction. Returns
FALSE if the lateral partner is a phantom or faces the opposite way
or is T-boned.
x22_facing_someone
applies to 2x2 only. Returns TRUE if the vertical partner of the
person under test is alive and facing the opposite direction.
Returns FALSE if the vertical partner is a phantom or faces the
same way or is T-boned. The name may be misleading. It is intended
to be used to determine if the person being tested is facing someone
else's face, but, if the two people are back-to-back, the predicate
will also be satisfied. To get the desired effect, you must only
use it on people who are trailers.
x14_once_rem_miniwave
applies to 1x4 only. Returns TRUE if the person once-removed
from the person under test is alive and facing the opposite direction.
Returns FALSE if the once-removed person is a phantom or faces the
same way or is T-boned.
x14_once_rem_couple
applies to 1x4 only. Returns TRUE if the person once-removed
from the person under test is alive and facing the same direction.
Returns FALSE if the once-removed person is a phantom or faces the
opposite way or is T-boned.
lines_miniwave
applies to 1x2, 1x4, 1x6, 2x4, 2x6, or 2x8 lines only. Returns TRUE if the
lateral partner of the person under test is alive and facing the
opposite direction. Returns FALSE if the partner is a phantom or
faces the same way or is T-boned.
lines_couple
applies to 1x2, 1x4, 1x6, 2x4, 2x6, or 2x8 lines only. Returns TRUE if the
lateral partner of the person under test is alive and facing the
same direction. Returns FALSE if the partner is a phantom or
faces the opposite way or is T-boned.
lines_magic_miniwave
applies to 2x4 lines only. Returns TRUE if the magic partner
of the person under test (the person in the opposite corner of
the same box) is alive and facing the opposite direction.
Returns FALSE if the magic partner is a phantom or faces the same
way or is T-boned.
lines_magic_couple
applies to 2x4 lines only. Returns TRUE if the magic partner
of the person under test (the person in the opposite corner of
the same box) is alive and facing the same direction.
Returns FALSE if the magic partner is a phantom or faces the
opposite way or is T-boned.
lines_once_rem_miniwave
applies to 2x4 lines only. This is the same as
"x14_once_rem_miniwave", but used in a 2x4 setup.
lines_once_rem_couple
applies to 2x4 lines only. This is the same as
"x14_once_rem_couple", but used in a 2x4 setup.
lines_tandem
applies to 2x4 lines only. Returns TRUE if the vertical partner
of the person under test is alive and facing the same direction.
Returns FALSE if the vertical partner is a phantom or faces the
opposite way or is T-boned.
lines_antitandem
applies to 2x4 lines only. Returns TRUE if the vertical partner
of the person under test is alive and facing the opposite direction.
Returns FALSE if the vertical partner is a phantom or faces the
same way or is T-boned.
columns_tandem
applies to 2x1, 4x1, 6x1, 4x2, 6x2, or 8x2 columns only. Returns TRUE if the
tandem partner of the person under test is alive and facing the same
direction. Returns FALSE if that person is a phantom or faces the
opposite way or is T-boned.
columns_antitandem
applies to 2x1, 4x1, 6x1, 4x2, 6x2, or 8x2 columns only. Returns TRUE if the
tandem partner of the person under test is alive and facing the opposite
direction. Returns FALSE if that person is a phantom or faces the
same way or is T-boned.
columns_magic_tandem
applies to 4x2 columns only. Returns TRUE if the magic tandem
partner of the person under test (the person in the opposite
corner of the same box) is alive and facing the same direction.
Returns FALSE if that person is a phantom or faces the
opposite way or is T-boned.
columns_magic_antitandem
applies to 4x2 columns only. Returns TRUE if the magic tandem
partner of the person under test (the person in the opposite
corner of the same box) is alive and facing the opposite direction.
Returns FALSE if that person is a phantom or faces the same
way or is T-boned.
columns_once_rem_tandem
applies to 4x2 columns only. Returns TRUE if the person
once-removed from the person under test is alive and facing
the same direction. Returns FALSE if that person is a phantom
or faces the opposite way or is T-boned.
columns_once_rem_antitandem
applies to 4x2 columns only. Returns TRUE if the person
once-removed from the person under test is alive and facing
the opposite direction. Returns FALSE if that person is a
phantom or faces the same way or is T-boned.
columns_couple
applies to 4x2 columns only. Returns TRUE if the lateral partner
of the person under test is alive and facing the same direction.
Returns FALSE if that person is a phantom or faces the opposite
way or is T-boned.
columns_miniwave
applies to 4x2 columns only. Returns TRUE if the lateral partner
of the person under test is alive and facing the opposite direction.
Returns FALSE if that person is a phantom or faces the same way
or is T-boned.
1x2_beau_or_miniwave
applies to 1x2 lines only. Returns TRUE if this person is a beau,
or else this belle is in a miniwave with the other person.
Returns FALSE if this belle is in a couple with the other person.
Raises an error if this belle can't tell.
1x4_wheel_and_deal
applies to 1x4 lines only. This implements the decision necessary
to do a wheel and deal. It is only as strict as necessary to resolve
ambiguity. You must use this only when it has already been determined
that the live people in each couple are facing consistently -- this
predicate will malfunction if presented with people in waves, for
example. Hence, it must only be used in the context
setup 1x4 2x2 restriction forbidden couples_only
It returns TRUE if this person is on the beau-side couple of the line.
If this person is on the belle-side couple, it returns TRUE if the line
is two-faced, and FALSE if it is one-faced. It raises an error if there
are no people on the other side and hence it can't tell.
1x6_wheel_and_deal
applies to 1x6 lines only. This implements the decision necessary
to do a 3X3 wheel and deal. It is only as strict as necessary to resolve
ambiguity. You must use this only when it has already been determined
that the live people in each triad are facing consistently -- this
predicate will malfunction if presented with people in waves, for
example. Hence, it must only be used in the context
setup 1x6 2x3 restriction forbidden 3x3couples_only
It returns TRUE if this person is on the beau-side triad of the line.
If this person is on the belle-side triad, it returns TRUE if the line
is two-faced, and FALSE if it is one-faced. It raises an error if there
are no people on the other side and hence it can't tell.
1x8_wheel_and_deal
applies to 1x8 lines only. This implements the decision necessary
to do a 4X4 wheel and deal. It is only as strict as necessary to resolve
ambiguity. You must use this only when it has already been determined
that the live people in each quad are facing consistently -- this
predicate will malfunction if presented with people in waves, for
example. Hence, it must only be used in the context
setup 1x8 2x4 restriction forbidden 4x4couples_only
It returns TRUE if this person is on the beau-side quad of the line.
If this person is on the belle-side quad, it returns TRUE if the line
is two-faced, and FALSE if it is one-faced. It raises an error if there
are no people on the other side and hence it can't tell.
Still to do:
vert1
vert2
inner_active_lines
outer_active_lines
judge_is_right
applies to 1x4 lines only. Returns TRUE if the person on the end
of the line to this person's right is alive and is a "judge" (extreme
right end of the line), and it is not the case that the other end
of the line is occupied by another live judge. Returns FALSE otherwise.
judge_is_left
applies to 1x4 lines only. Returns TRUE if the person on the end
of the line to this person's left is alive and is a "judge" (extreme
right end of the line), and it is not the case that the other end
of the line is occupied by another live judge. Returns FALSE otherwise.
socker_is_right
applies to 1x4 lines only. Returns TRUE if the person on the end
of the line to this person's right is alive and is a "socker" (extreme
left end of the line), and it is not the case that the other end
of the line is occupied by another live socker. Returns FALSE otherwise.
socker_is_left
applies to 1x4 lines only. Returns TRUE if the person on the end
of the line to this person's left is alive and is a "socker" (extreme
left end of the line), and it is not the case that the other end
of the line is occupied by another live socker. Returns FALSE otherwise.
inroller_is_cw
applies to 2x4 lines only. Returns TRUE if the end of the line clockwise
from this person is a live inroller (facing in) and the other end of that
line is not occupied by another live inroller. Returns FALSE if the end
of the line counterclockwise from this person is a live inroller and the
other end of that line is not occupied by another live inroller.
Otherwise, raises an error.
magic_inroller_is_cw
applies to 2x4 lines only. Same as inroller_is_cw, but applies to this
person's magic line.
outroller_is_cw
applies to 2x4 lines only. Same as inroller_is_cw, but checks for live
outrollers.
******* why is there no magic_outroller_is_cw ??????
outposter_is_cw
applies to 2x4 lines only. Returns TRUE if the end of the line clockwise
from this person is the outposter. The rules for outposters are different
from the rules for outrollers: if both ends of the line are looking out,
the one on the right (the "judge") is the outposter -- there is no conflict.
Returns FALSE if the outposter is at the counterclockwise end of the line,
or there is no live outposter.
outposter_is_ccw
applies to 2x4 lines only. Returns TRUE if the end of the line counterclockwise
from this person is the outposter. Returns FALSE if the outposter is at the
clockwise end of the line, or there is no live outposter.
nexttrnglspot_is_tboned
applies to triangles only. This is intended to determine which way a
person should face after doing a triangle circulate. Returns FALSE if
this person is a base and will still be a base after circulating,
independently of the existence or facing direction of the person already
standing on the target spot. If this person is a base circulating to an
apex spot or vice-versa, it demands that there be a person already standing
on the target spot. It returns TRUE if that person is facing perpendicular
to the subject person, and FALSE if that person is facing the same way or
opposite way. It returns an error if a triangle circulate is impossible
for the subject, or if there is no person on the target spot and such a
person is needed.
next62spot_is_tboned
applies to short6 only. This is intended to determine which way a
person should face after doing the outsides part of a 6x2 acey-deucey.
Returns FALSE if this person is in the box of 4 (normally, one of the
diamond points for 6x2 acey-deucey), whether this person will circulate
to an apex (end of the center line for 6x2 acey-deucey) spot or not.
If this person is an apex, it demands that there be a person already
standing on the target spot. It returns TRUE if that person is facing
perpendicular to the subject person, and FALSE if that person is facing
the same way or opposite way. It returns an error if an outer 6 circulate
is impossible for the subject (this can only happen if the subject is an
apex), or if there is no person on the target spot and such a person
is needed.
next_magic62spot_is_tboned
applies to short6 only. This is the same as "next62spot_is_tboned",
but it uses the "magic 6x2 acey deucey" circulate path in calculating
the target spot.
next_galaxyspot_is_tboned
column_double_down
boyp
applies to any setup. Returns TRUE if this person is an unambiguous boy.
Returns FALSE if not. The person's gender is ambiguous if the "as couples"
or "tandem" concept has caused people of opposite gender to be paired.
girlp
applies to any setup. Returns TRUE if this person is an unambiguous girl.
Returns FALSE if not. The person's gender is ambiguous if the "as couples"
or "tandem" concept has caused people of opposite gender to be paired.
roll_is_cw
applies to any setup. Returns TRUE if this person's roll direction, from
the preceding call, is clockwise. Returns if the direction is
counterclockwise, or the person can't roll, or roll direction from the
preceding call is ill-defined.
roll_is_ccw
applies to any setup. Returns TRUE if this person's roll direction, from
the preceding call, is counterclockwise. Returns if the direction is
clockwise, or the person can't roll, or roll direction from the
preceding call is ill-defined.
x12_boy_facing_girl
applies to 2x1 columns only. Returns TRUE if this person is an
unambiguous boy, and the other person in the column is alive and an
unambiguous girl. Facing directions are not checked.
x12_girl_facing_boy
applies to 2x1 columns only. Returns TRUE if this person is an
unambiguous girl, and the other person in the column is alive and an
unambiguous boy. Facing directions are not checked.
x22_boy_facing_girl
applies to 2x2 boxes only. Returns TRUE if this person is an
unambiguous boy, and the person in the box that this person faces
is alive and an unambiguous girl. The facing direction of that other
person is not checked.
x22_girl_facing_boy
applies to 2x2 boxes only. Returns TRUE if this person is an
unambiguous girl, and the person in the box that this person faces
is alive and an unambiguous boy. The facing direction of that other
person is not checked.
dmd_ctrs_rh
applies to a diamond or single 1/4-tag. Returns TRUE if the center
two people are in a right-handed miniwave. Returns FALSE if they
are in a left-handed miniwave. One live person in the center is
sufficient to make the test. Raises an error if the centers are
both phantoms or they are not in a miniwave. This predicate is
unusual in that it does not look specifically at the person under
test. It evaluates the setup as a whole.
trngl_pt_rh
Applies to a triangle. This is strict relative to the point.
Returns TRUE if the triangle point is as if in a right-handed triangle
(independently of the existence or facing direction of the base people).
Returns FALSE if the triangle point is as if in a left-handed triangle.
Raises an error if the point is a phantom or is facing toward or
away from the base. This predicate is unusual in that it does not
look specifically at the person under test. It evaluates the setup
as a whole.
Still to do:
q_tag_front
Applies only to a qtag in which the center people are in some kind of
line. (Remember that we use the term "qtag" independently of actual
facing direction -- hence it applies to 3/4 tags, 1/4-lines, diamonds,
etc. Part of the purpose of this predicate is to distinguish among
these cases.) Hence you must use this only with a starting setup of
"qtag", or with a starting setup of "pqtag" as long as it doesn't
specify a legal move for persons 2, 3, 6, or 7.
This is strict relative to the people it tests. For a person in the
center line, this returns TRUE if the subject's partner is alive and
facing in the opposite direction, and FALSE otherwise. That is, it
performs a strict test for the subject being in a miniwave, which
presumably means the setup is a 1/4-tag or diamonds as opposed to a
1/4-line or interlocked diamonds. For a person on the outside, this
returns TRUE only if the two people in the center line who are closest
to the subject (in the subject's single 1/4-tag or diamond) are both
alive and in a miniwave with each other, and the end of that line is
facing the subject. It returns FALSE otherwise. For example, for an
outside beau in a 1/4-tag or 1/4-line, it returns TRUE only if the
setup is a left-handed 1/4-tag, and FALSE if it is right-handed or is
a 1/4-line. It only examines the two center people close to the
subject (the ones in the subject's single 1/4-tag or diamond) in
making this determination. When applying the test to an outside, the
subject's own facing direction is not important. For example, in a
right-hand 3/4-tag, this will return TRUE for an outside beau and
FALSE for an outside belle. In diamonds of any consistent handedness,
this returns TRUE for a trailing point and FALSE for a leading point.
For facing diamonds it does the opposite.
q_tag_back
This is just like "q_tag_front" except that, for the outsides, it
returns TRUE only if the two people in the center line who are closest
to the subject are both alive and in a miniwave with each other, and
the end of that line is facing the away from subject. It returns
FALSE otherwise. For example, for an outside beau in a 1/4-tag or
1/4-line, it returns TRUE only if the setup is a right-handed 1/4-tag,
and FALSE if it is left-handed or is a 1/4-line.
q_line_front
This is just like "q_tag_front" except that it tests for a 1/4-line
or interlocked diamonds. For a person in the center line, this returns
TRUE if the subject's partner is alive and facing in the same
direction, and FALSE otherwise. That is, it performs a strict test for
the subject being in a couple, which presumably means the setup is a
1/4-line or interlocked diamonds as opposed to a 1/4-tag or plain
diamonds. For a person on the outside, this returns TRUE only if the
two people in the center line who are closest to the subject (in the
subject's single 1/4-tag or diamond) are both alive and in a couple
with each other, and the end of that line is facing the subject. It
returns FALSE otherwise. For example, for an outside beau in a 1/4-tag
or 1/4-line, it returns TRUE only if the setup is a left-handed
1/4-line, and FALSE if it is right-handed or is a 1/4-tag. In
interlocked diamonds of any consistent handedness, this returns TRUE
for a trailing point and FALSE for a leading point. For facing
interlocked diamonds it does the opposite.
q_line_back
This is just like "q_line_front" except that, for the outsides, it
returns TRUE only if the two people in the center line who are closest
to the subject are both alive and in a couple with each other, and
the end of that line is facing the away from subject. It returns
FALSE otherwise. For example, for an outside beau in a 1/4-tag or
1/4-line, it returns TRUE only if the setup is a right-handed 1/4-line,
and FALSE if it is left-handed or is a 1/4-tag.
APPENDIX B -- ESCAPE CODES IN CALL NAMES
These are not in a particularly logical order.
@0 - for call with mandatory substitution (e.g. "clover and ...") put
subcall here.
@1 - put optional subcall here.
@2 ... @3 - text to remove and replace with subcall. Like @4 ... @5 along with @1.
@4 ... @5 - text to remove if optional substitution has been made.
@6 - put selector here.
@7 ... @8 - text to ADD if optional substitution has been made, as in the "ing"
for "fascinating <anything>".
@9 - put number here.
@a - put number here, expressed as N/4, but say "full" instead of 4/4.
@b - put number here, expressed as N/4.
@c ... @d - text to remove if this call was invoked with a "must_be_tag_call"
substitution.
@e ... @f - text to change to "left" if this call has "left" modifier.
Must use @g also if this appears.
@g - at beginning of call name: an @e...@f sequence will occur.
@h - at beginning of call name: if this is invoked with "single"
concept, change to "single file".
@i - at beginning of call name: an @j...@l sequence will occur.
@j ... @l - text to add if this call has "cross" modifier. Presumably
has the word "cross" in it.
Must use @i also if this appears.
@k - put selector here, but use singular name, as in "beau tie".