Info on the localization files for Strip Club Wars. In the code strings that
are displayed to the user are identified with a string called a key. At run
time those keys are mapped into the proper string to display. This is done as
a way to separate the text from the code and perhaps support different
languages at some point. 

Each file is composed of a key-value pair, separated by a space:

abc.def.ghi This is a string to display.

The key is the first (leftmost field), the value is the second (rightmost).
When the key is used in the game, the localization library converts it to
a string.

Spaces before and after the string to display are trimmed out. To force
spaces at the beginning or end of a line, add an underscore. The underscore
will be trimmed, but not the text. So this:

abc.def _ Hello There! _

will get shown as " Hello There! " (without the quotes)

The string can also be enclosed in quotes but those quotes will be removed.
This is equivalent to the last example:
abc.def " Hello There! "

In these examples, it's a simple substitution. But most string values
will have replacement codes. These codes are replaced at run-time with the
appropriate values.  The simplest replacement is the variable replacement,
which is marked with a % sign. In this case a line like:

abc.def You are looking at a %1.

The %1 is replaced by the first value passed to the replacement function. 
So that string could appear as "You are looking at a dog" or "You are looking
at a very nice house".

For displaying numeric values, three additional modifers are used. For example:

abc.def You bought %I1 widgets for $%D2. Your happiness went up by %F3%%.

The %I1 displayes the 1st value as an integer, while the %D2 one displays the
2nd one with 2 decimals and a leading dollar sign and the %F3 displayes the
3rd one with 4 decimals and a trailing percent sign. As in "You bought 5
widgets for $34.21. Your happiness went up by 12.2921%." 

Note that to display an actual % sign, use the string %%.

The next type of replacement is a reference to a person. In the simplest form,
these will look like:

abc.def You met {1:N}. 

These replacements are enclosed in braces and have multiple fields, separated
by colons. When the first field is a number, it refers to a person in the 
specific ordinal position as passed to the interpolation function at run
time. In this case it replaces it with the name of the first person passed.
In general the value 0 refers to the speaker (the person who is saying the
string that will be shown). 

The second field is the "how". This tells the system how to convert the person
into a name or pronoun to show.

Values are:

 A: actual full name
 a: first name + last initial
 B: full name + nickname
 N: common name by which the speaker will refer to this person*
 n: first initial of common name*
 L: last name 
 l: first initial of last name
 F: first name (if formal) or nickname*
 W: actual full name*
 w: common name + last initial (essentially N l)*
 C: character id (for internal/debugging purposes only)
 T: title (the character's title, if any)
 R: title + last name 
 I: character intro (relation to speaker or listener if speaker is narrator)
 p: pronoun (I/you/he/she)
 P: capitalized pronoun (same as cp)
 X: last name, first name (for sorting by last name)
 ...

The items with * will only show the name if the listener knows the target.

The how field can also have some flags. These flags preceed the how
designation:

 f: use formal name
 o: use object pronoun (him/her instead of he/she)
 s: use possessive (his/her or add the 's to a name)
 u: use object possesive (his/hers)
 v: use self pronoun (himself/herself)
 c: capitalize

The replacement string can have a 3rd field, so it look like:

{1:p;1}

In this case, the third field specifies the speaker. So when doing 1:p:1 it
means that it wants the pronoun for 1 as spoken by 1, which would be "I". 

The next type of replacement is the short string replacement.
Short strings are defined in the local files like:

abc.ss.id.X

where abc is any string, the 'ss' field is required and the id after it is 
what appears in the replacement string. These are not character specific
and have replacement codes like:

{0:!ss_code}

In this case the game will then look for all the localization strings that
match the pattern:

*.ss.ss_code.*

and pick one at random to display. For example, a string like {0:!compliment}
will find

gen.ss.compliment.1|nice
gen.ss.compliment.2|pretty
gen.ss.compliment.3|smart

and pick one at random. Short codes are used to display different random texts
and create some variability without having to code it.

Note that for these the person id is ignored.

There are two other kinds of short codes for more specific conditions. These
require two bangs to trigger them and then a prefix which is either g_ (for
gender-specific strings) or d_ (for time of day specifications).

The first kind is used to handle words that are gender-specific. For instace
if we want to display something like "because he is a man of integrity"
we would use something like "because {1:p} is a {1:!g_person} of integrity".
These are prefixed with a g_.  For example {0:!g_person} is replaced with
either man or woman depending on the gender of 0.

Then we have the following definitions:

gen.ss.male_person.1|man
gen.ss.female_person.1|woman

The system would then figure out if person 1 is a man or a woman and pick
the appropriate string replacement. Note that the random selection is still
in play here, although the focus is just to pick a gender-specific term.
(In this case the 'g' is replaced by the person's gender).

The second one is for displaying the current time period. The replacement
string looks like {0:!d_day_night} and the system would look for a line that 
matches as this:
 
gen.ss.0_day_night.1|morning
gen.ss.1_day_night.1|noon
gen.ss.2_day_night.1|afternoon

If this case the 'd_' is replaced by the day period as a value and will
display morning, noon, afternoon, etc. as appropriate.


The next type of replacement is the flag replacement. This looks like
{0:?xyz} and it replaces it with the value of the xyz flag for person 0.
If there are 2 question marks, like {0:??xyz} it uses the value of a
global flag and the person is ignored.


When parsing the file, the parser will flag most instances of pronouns, like
I, you, he, she, her, etc. These normally should be replacement strings. When
wanting to use one of these as a literal string, not refering to a character
in the scene, preceed the pronoun with a ^ to suppress the warning. For 
example:

abc.def|The man said to ^his wife,

