PhoenixSpeak!

Intro

Legend has it that the mythical Phoenixes of Kasuria are able to remember everything they ever knew, even through their firey cycle of death and rebirth. Some say that the eldest of them can remember events dating all the way back to the creation of the world itself. When you shape your dreams into realities, that imbues them with a spark of magical fire of their own - akin in a way to the fires of rebirth of the Phoenix. It was only a matter of time, then, before some would find ways to tap into the Memory of Fire, and make their very dreams remember what comes to pass, even through the vanishing and rebirth of the dream itself! Learn then, the mystic ways of the Phoenix...

Overview

PhoenixSpeak is a way to store information about the furres that play your games. activities, etc. You could use this to store stats for an RPG, high scores for an action game, or anything else you can imagine! If a player leaves your dream and come back, their stats will still be there. If your dream shuts down, and you re-upload it a day later, or even up to a month - all the stats will still be there! It also lets you store things about the dream itself, that don't have to do with any specific player. Silver Sponsors do not have their stored information expire even after a month of not uploading their dream.

The system is based on a few simple concepts. One is that your dreams can now "memorize" things. The stuff your dream memorizes is referred to as "info". Each piece of info stores a number or a position on your map, just like DragonSpeak works with now. (Later we'll add features that let you store names and messages too.) You can give each "info" any name you want, like "hitpoints" or "level" or "score" - anything you like. Secondly, your dreams can also "remember" a piece of info, and use it. You could have the dream remember it 5 seconds later, or 5 weeks later, just whenever it's needed! Finally, because you have a limited amount of space for info, you can "forget" some info to free up room for more.

PhoenixSpeak consists of a set of special new DragonSpeak commands that memorize, remember, and forget PhoenixSpeak info, plus some advanced typed-in dream owner commands for viewing and managing all your info. Dream owners can also assign access to other furres to used these typed commands in the dream, if they wish.

One last detail. A piece of info can be about a particular furre (like hit points or experience levels probably would be), and then each furre that plays your game could have their own info with that name. Info can also be about the dream itself, then that would be just one piece of info with that name.

Let's See Some Examples!

Ok, let's say you want to make a game where everyone can explore a dungeon, and fight monsters. You want their progress to be recorded, so if they come back to play again another time, they'll still have all the benefits of having built up their character the last time! Let's say that a ferret named Joey has just come to your dream. How could we get him started? Let's say you make your entry text tell him to type ROLL NEW CHARACTER to start playing SuperQuestAdventureland! We will want to use one of the three memorize commands to store some starting stats for him.

Those commands are:

(5:600) memorize that the PhoenixSpeak info {...} about the triggering furre will now be #.
(5:601) memorize that the PhoenixSpeak info {...} about the furre named {...} will now be #.
(5:602) memorize that the PhoenixSpeak info {...} about this dream will now be #.

That first one is the one we want. Joey will be the triggering furre when he types in that command, so we'll just need to fill in a name for each stat, and what number it should be. Here's how we could do that, including rolling some dice to give him a random starting hitpoint total!

(0:31) When a furre says {roll new character},
(5:312) set variable %hitpoints to the total of rolling 2 dice with 6 sides plus 5.
(5:600) memorize that the PhoenixSpeak info {level} about the triggering furre will now be 1.
(5:600) memorize that the PhoenixSpeak info {experience points} about the triggering furre will now be 0.
(5:600) memorize that the PhoenixSpeak info {maximum_hp} about the triggering furre will now be %hitpoints.
(5:600) memorize that the PhoenixSpeak info {current_hp} about the triggering furre will now be %hitpoints.
(5:200) emit message {Congratulations! You are now a level 1 Warrior with %hitpoints hit points!} to whoever set off the trigger.

It's as simple as that! You could generate the stats for your favorite RPG, be it Dungeons & Dragons, White Wolf, Furre, GURPS, or your own system you've made up just for your dream. Every new player that comes in can type "roll new character" and they'll be stored in your dream's permanent records, able to come back and play your game some more whenever they like.

How do we use that info now?

When something happens in your dream that has to do with the furre's info, you will want your DragonSpeak remember the info and use it. Let's say Joey the ferret (or we should call him now, Joey the Warrior ferret) has just found the precious Scroll of Wisdom in your dream. You've put this treasure deep in the dungeon, in a spot that's difficult and dangerous to get to, because reading it immediately makes you go up a level and gain 10 hit points as well! Let's say you've patched object 1305 to be your scroll. Now you need to remember what Joey's stats are, so that you can add more to them. (You'd also want to remember Joey's hitpoints if he got wounded by a monster, but then you'd be subtracting, not adding!) The remember commands look like this:

(5:610) remember the PhoenixSpeak info {...} about the triggering furre, and put it in variable #.
(5:611) remember the PhoenixSpeak info {...} about the furre named {...}, and put it in variable #.
(5:612) remember the PhoenixSpeak info {...} about this dream, and put it in variable #.
(5:603) memorize that the PhoenixSpeak info {...} about the triggering furre will now be {...}.
(5:604) memorize that the PhoenixSpeak info {...} about the furre named {...} will now be {...}.
(5:605) memorize that the PhoenixSpeak info {...} about this dream will now be {...}.
(5:613) remember the PhoenixSpeak info {...} about the triggering furre, and put it in message $.
(5:614) remember the PhoenixSpeak info {...} about the furre named {...}, and put it in message $.
(5:615) remember the PhoenixSpeak info {...} about this dream, and put it in message $.
(5:880) forget all PhoenixSpeak info about furres that haven't been used in # days # hours # minutes # seconds.

Again, the first one is the one we want right now to further Joey's intrepid quest. To make the scroll work, we could do something like this:

(0:19) When somebody uses object type 1305,
(5:610) remember the PhoenixSpeak info {level} about the triggering furre, and put it in variable %level.
(5:302) take variable %level and add 1 to it.
(5:600) memorize that the info {level} about the triggering furre will now be %level.
(5:610) remember the PhoenixSpeak info {maximum_hp} about the triggering furre, and put it in variable %hitpoints.
(5:302) take variable %hitpoints and add 10 to it.
(5:600) memorize that the info {maximum_hp} about the triggering furre will now be %hitpoints.
(5:600) memorize that the info {current_hp} about the triggering furre will now be %hitpoints.
(5:200) emit message {The scroll fills you with mystic knowledge, and you gain a level! Your wounds magically heal!} to whoever set off the trigger.
(5:200) emit message {You are now level %level with %hitpoints hit points!} to whoever set off the trigger.
(5:76) place object type 0 in the triggering furre's paws.
(5:200) emit message {The scroll vanishes in a puff of magic smoke!} to whoever set off the trigger.

What else can we do?

We can check PhoenixSpeak info when deciding what should happen next, with commands like these:

(1:602) and the PhoenixSpeak info {...} about the triggering furre is greater than #,
(1:603) and the PhoenixSpeak info {...} about the triggering furre is less than #,

Let's say Joey (and everyone else, for that matter) isn't allowed to cross the Bridge of Ultimate Doom until they've built their character up to level 5. The monsters on the other side are way too tough for a low level character anyway, so it's really for his own good! So let's say you put a suit of armor by the side of the bridge to represent the Ancient Guardian, and when a furre tries to move onto the bridge, you could do something like this:

(0:7) When somebody moves into position (37,46),
(1:603) and the PhoenixSpeak info {level} about the triggering furre is less than 5,
(5:200) emit message {The suit of armor comes to life, and raises its sword to bar your way.} to whoever set off the trigger.
(5:200) emit message {In an echoing voice, it says "You are not yet mighty enough to face the perils that lie beyond."} to whoever set off the trigger.
(5:18) move the triggering furre back where they came from.

...and of course, when Joey has leveled up enough, you'll need this:

(0:7) When somebody moves into position (37,46),
(1:602) and the PhoenixSpeak info {level} about the triggering furre is greater than 4,
(5:200) emit message {The suit of armor comes to life, and says, "Now you are truly ready!"} to whoever set off the trigger.
(5:200) emit message {"Beware the frumious bandersnatch!" it warns, then goes motionless again.} to whoever set off the trigger.
(5:8) play sound 64 to the triggering furre.

Here are all of the "and" commands you can use for doing tests like these in your dream.

(1:600) and the PhoenixSpeak info {...} about the triggering furre is equal to #,
(1:601) and the PhoenixSpeak info {...} about the triggering furre is not equal to #,
(1:602) and the PhoenixSpeak info {...} about the triggering furre is greater than #,
(1:603) and the PhoenixSpeak info {...} about the triggering furre is less than #,
(1:610) and the PhoenixSpeak info {...} about the furre named {...} is equal to #,
(1:611) and the PhoenixSpeak info {...} about the furre named {...} is not equal to #,
(1:612) and the PhoenixSpeak info {...} about the furre named {...} is greater than #,
(1:613) and the PhoenixSpeak info {...} about the furre named {...} is less than #,
(1:620) and the PhoenixSpeak info {...} about this dream is equal to #,
(1:621) and the PhoenixSpeak info {...} about this dream is not equal to #,
(1:622) and the PhoenixSpeak info {...} about this dream is greater than #,
(1:623) and the PhoenixSpeak info {...} about this dream is less than #,

One More Example

All the examples so far have been about a furre. Here's one idea how you could get some use out of storing info about the dream. Let's say you want some variety in your setting, and you've decided to add seasons. Maybe certain monsters only come out in the spring. You might change the artwork in your dream to snowy shapes in the winter, and have a river that freezes over so you can walk across it and get to an area that's unreachable the rest of the year. There's all sorts of possibilities! Here's just the beginning of an example of how you could control the seasons, and have your dream act differently in each one. First, we let the dream owner change the seasons with a spoken command:

(0:31) When a furre says {set winter},
(1:10) and the triggering furre is the dream owner,
(5:602) memorize that the PhoenixSpeak info {season} about this dream will now be 1.
(5:200) emit message {Season set to Winter.} to whoever set off the trigger.
(0:31) When a furre says {set spring},
(1:10) and the triggering furre is the dream owner,
(5:602) memorize that the PhoenixSpeak info {season} about this dream will now be 2.
(5:200) emit message {Season set to Spring.} to whoever set off the trigger.
(0:31) When a furre says {set summer},
(1:10) and the triggering furre is the dream owner,
(5:602) memorize that the PhoenixSpeak info {season} about this dream will now be 3.
(5:200) emit message {Season set to Summer.} to whoever set off the trigger.
(0:31) When a furre says {set fall},
(1:10) and the triggering furre is the dream owner,
(5:602) memorize that the PhoenixSpeak info {season} about this dream will now be 4.
(5:200) emit message {Season set to Fall.} to whoever set off the trigger.

Now here's how you could give people an idea how things are right when they enter your dream:

(0:9) When a furre arrives in the dream,
(1:620) and the PhoenixSpeak info {season} about this dream is equal to 1,
(5:200) emit message {Welcome to Questville! You see several children having a snowball fight, while some others are ice-skating on the frozen pond.}
(0:9) When a furre arrives in the dream,
(1:620) and the PhoenixSpeak info {season} about this dream is equal to 2,
(5:200) emit message {Questville is in bloom! The weather's warmed up at last, and it seems like flowers are everywhere.}
(0:9) When a furre arrives in the dream,
(1:620) and the PhoenixSpeak info {season} about this dream is equal to 3,
(5:200) emit message {It's a hot day in Questville. Several furres are swimming in the pond, and a young otter is running a lemonade stand.}
(0:9) When a furre arrives in the dream,
(1:620) and the PhoenixSpeak info {season} about this dream is equal to 4,
(5:200) emit message {The trees are a riot of yellow, red, and orange. A lone badger struggles to keep the ground raked as more leaves flutter down.}

How much can I store?

You have enough room for 50 furres in your PS and 10 kb of space to use. Silver Sponsors have room for 200 furres and 64 kb of server space!

If you don't use it for a month (that is, if you don't upload your dream for a month) the database will be cleared. If you have Silver Sponsorship though, your PS will not expire.

Special Text Replacement Strings!

This new feature gives you more control over messages you emit. Also, since this doesn't use your special PhoenixSpeak memory, these features aren't just for Silver Sponsors, they're available to everyone. You can use them right now, even if you're not a Silver Sponsor!

These are a little like the way you put variable names in your {...} emit message now. You may know that when you put a message like:

{You hit the monster for %diceroll points!}

It won't print the word "%diceroll", but will say something like "You hit the monster for 5 points!" Well, if you put into any {...} field in DragonSpeak the following codes that are in the [] brackets, it will replace it with the appropriate text. So for instance, you could now emit to everyone in a room:

{With a swing of his mighty sword, [FURRE] hits the dragon for %diceroll points!}

It will substitute in the name of the triggering furre - most likely Joey, right? Here's a list of all the replacement codes you can use, and what they do!

[FURRE]

The name of the player who triggered the PhoenixSpeak execution. Equivalent to "triggering furre" in DragonSpeak, and the player who gave the command in `ps commands.

[FURRE_POS]

The current position of the triggering furre: '(24,12)'

[DATE]

The current date (YYYY-MM-DD): '2007-10-16'

[TIME]

The current time (hh:mm:ss) in 24-hour clock format: '23:14:29'

[DATETIME]

The current date and time (YYYY-MM-DD hh:mm:ss): '2007-10-16 23:14:29'

[NICEDATE]

The current date in human-readable form (Mon DD, YYYY): 'Oct 16, 2007'

[NICETIME]

The current time in human-readable form (hh:mm am/pm): '11:14 p.m. FST'

The timestamp (YYYY-MM-DD hh:mm:ss) of time one week ago: '2007-10-09 23:14:29'

[LAST_MONTH]

The timestamp (YYYY-MM-DD hh:mm:ss) of time one month ago: '2007-09-16 23:14:29'

[LAST_QYEAR]

The timestamp (YYYY-MM-DD hh:mm:ss) of time three months ago: '2007-07-16 23:14:29'

[LAST_HYEAR]

The timestamp (YYYY-MM-DD hh:mm:ss) of time half a year ago: '2007-04-16 23:14:29'

[LAST_YEAR]

The timestamp (YYYY-MM-DD hh:mm:ss) of time one year ago: '2006-10-16 23:14:29'

[CMD]

Available only when a player says something that matches the silent speech prefix: The first word of what was said.

[PARAM1] ... [PARAM9]

Available only when a player says something that matches the silent speech prefix: The second through tenth word of what was said.

Maintenance Commands

Finally, there's a bunch of commands you can use by just typing them into the Furcadia chat window, while you're in your dream. They are available to the dream owner automatically, and you can also set access levels of other players so they can use them too. Just like the memories of the Phoenix, the access levels you give to furres will be remembered forever, so you only need to grant them access once. Here's a list of all the commands you can use. These are a bit more complicated - we'll try to add more explanations and examples later. For now, if you have any questions, please come to our brand new PhoenixSpeak Forum! It's at http://forums.furcadia.com and people will answer any question you might have, on there. You can also come by our tech support center in Naia Green if you want to ask someone there! You don't need these to get started, but they can be helpful for examining what you have stored, figuring out or fixing problems, or freeing up space if your dream gets too full. We may be changing the wording of some of these in the future, to make them easier - but we'll keep supporting these versions of the commands too, if we do that!

ps active_db
Access: dream owner, anyone with access level >= 10000

Displays which PhoenixSpeak database is currently active : 'live' or 'test'

Displays queried data from PhoenixSpeak database. The query can be limited to a specific row in the table ("* 'sanctimonious' +") and specific fields on a row (": xp, coins, level"). If the specified field does not exist, an error message will be displayed.

Examples:

ps get character
Displays all fields from table 'character'.
ps get character[ 'sanctimonious' ]: *
Displays all fields from the row 'sanctimonious' of the table 'character'.
ps get character[ 'sanctimonious' ]: xp, coins, level
Displays fields 'xp', 'coins', and 'level' from the row 'sanctimonious' of the 'character' table.
ps get character[ 'san*' ]
Displays all fields from table 'character' that begin with 'san'.

Loads PhoenixSpeak database. It should be noted that 'test' database is loaded automatically when the dream is uploaded.
'test': Database meant for testing new features and fields in a private or semi-private testing dream, while the 'live' database is being used in the public dream.
'live': Database meant for active use in the public dream.

ps list_access
Access: dream owner, anyone with access level >= 1500

Lists the shortname and access level of every player who currently has PhoenixSpeak access.

ps memory
Access: dream owner, anyone with access level >= 1000

Displays the amount of space currently used up by PhoenixSpeak and the maximum amount of space the dream can use.

ps rm_access
Argument: <character_name> Access: dream owner, anyone with access level >= 1500 Removes PhoenixSpeak access from player character_name. If the command is run by someone else than the dream owner, the access will not be removed, if the player's access level is higher or equal to the access level of the command giver.

ps set character[ 'sanctimonious' ]
Creates row 'sanctimonious' in 'character' table, if it does not exist.
ps set character[ 'sanctimonious' ]: flag, flag2
Creates row 'sanctimonious' in 'character' table, if it does not exist. Then fields 'flag' and 'flag2' are created in the row 'sanctimonious', if they do not exist.
ps set character[ 'sanctimonious' ]: xp=1380, species='fox'
Creates row 'sanctimonious' in 'character' table, if it does not exist. Then field 'xp' is set to 1380 and field 'species' Is set to 'fox' on row 'sanctimonious'.

Set PhoenixSpeak access level of player character_name to access_level. Note that no more than 150 players can have a set access level.
If the command is run by someone other than the dream owner, he or she will not be able to set the access level higher than their own access level. They will also not be able to set the access level of any player whose access level is higher or equal to theirs. Note: All access entries are stored on the server. Re-uploading the dream will not reset the access list.

One final note, for proxy and bot authors who want to make advanced features that interact with PhoenixSpeak. You can put a number from 1 to 65535 in front of any of these ps commands, and the results outputted back to you will have that same number in front of them. Happy Dreaming!