REO-EE/_module/nss/fky_chat_config.nss
Jaysyn904 f82740bbbd Initial commit
Initial commit
2024-02-22 13:22:03 -05:00

1286 lines
56 KiB
Plaintext

//::////////////////////////////////////////////////////////////////////////:://
//:: SIMTools V3.0 Speech Integration & Management Tools Version 3.0 :://
//:: Created By: FunkySwerve :://
//:: Created On: April 4 2006 :://
//:: Last Updated: March 27 2007 :://
//:: With Thanks To: :://
//:: Dumbo - for his amazing plugin :://
//:: Virusman - for Linux versions, and for the reset plugin, and for :://
//:: his excellent events plugin, without which this update would not :://
//:: be possible :://
//:: Dazzle - for his script samples :://
//:: Butch - for the emote wand scripts :://
//:: The DMFI project - for the languages conversions and many of the emotes:://
//:: Lanessar and the players of the Myth Drannor PW - for the new languages:://
//:: The players and DMs of Higher Ground for their input and playtesting :://
//::////////////////////////////////////////////////////////////////////////:://
/*Changelog
V3.1
-Fixed a bug causing area targetable commands to remprompt targeting after the command targeter was used.
-Fixed a bug preventing the command targeter from being used to confirm delete commands.
V3.0 - Includes some Linux-only features, including command completion and a new events plugin, noted below.
-Added dozens of new commands, emotes, and languages:
-added emotes: 'nope'; 'sy' and 'sway'; 'hl' and 'hello'; 'tp' and 'trip'; 'co' and 'collapse';
'lie'; 'rt' and 'rest'; 'lk' and 'look'; 'cn' and 'chant'; 'wl' and 'wail'; 'mn' and 'moan'; 'gn'
and 'groan'; smoke shortcut changed from 'sm' to 'sk'; 'sm' and 'scream'; 'sz' and 'sneeze';
'spit' (male only); 'snarl'; 'bk' and 'bark'; 'hw' and 'howl'; 'ht' and 'hoot';
mock shortcut chaged from 'mo' to 'mk'; 'mw' and 'meow'; 'mo' and 'moo'; 'screech'; 'rr' and 'roar';
'tt' and 'toast' (male only); 'bh' and 'belch' (male only); 'bp' and 'burp' (male only);
'hp' and 'hiccup' (male only); 'kn' and 'kneel'; 'gw' and 'guffaw'; 'cr' and 'chortle'; 'bye';
'gt' and 'goodnight'; 'gb' and 'goodbye'; 'cry'; 'sb' and 'sob'; 'wp' and 'weep'; 'ow' and 'ouch';
'cg' and 'cough'; 'choke';
-added languages: Troll, Thri-Kreen, Grimlock, Half-Orc, Kuo-Toan, Kenderspeak, Minotaur, Rakshasa,
Stinger, Lizardman, Illithid, Hobgoblin, Duergar, Bugbear, Githzerai, Korred, Sahaguin, Yuan-Ti, Pixie,
Magic, Sirensong, Hengeyokai, Svirfneblin, High Shou, Psionic, Averial, Kobold, Necromantic, Ogre
-added commands:
help, settail, setwings, delete, wpnone
-added dm_ commands:
dm_align_chaos, dm_align_evil, dm_align_good, dm_align_law, dm_fac_a_allally, dm_fac_a_allfoe,
dm_fac_a_peace, dm_fac_a_reset, dm_fac_c_allally, dm_fac_c_allfoe, dm_fac_c_peace, dm_fac_c_reset,
dm_fac_m_allally, dm_fac_m_allfoe, dm_fac_m_peace, dm_fac_m_reset, dm_fac_p_allally, dm_fac_p_allfoe,
dm_fac_p_peace, dm_fac_p_reset, dm_givepartyxp, dm_givepartylevel, dm_takepartyxp, dm_takepartylevel,
dm_item_id, dm_item_destroy_all, dm_item_destroy_equip, dm_item_destroy_inv, dm_help, dm_boot, dm_sql,
dm_rest, dm_reveal, dm_hide, dm_jump, dm_portpartyhere, dm_portpartyhell, dm_portpartyjail, dm_portpartyleader,
dm_portpartythere, dm_portpartytown, dm_setcha, dm_setcon, dm_setdex, dm_setint, dm_setstr, dm_setwis,
dm_setfort, dm_setreflex, dm_setwill, dm_settime, dm_setvarint, dm_setvarfloat, dm_setvarstring,
dm_setvarmodint, dm_setvarmodfloat, dm_setvarmodstring, dm_getvarint, dm_getvarfloat, dm_getvarstring,
dm_getvarmodint, dm_getvarmodfloat, dm_getvarmodstring, dm_setweather_a_clear, dm_setweather_a_rain,
dm_setweather_a_reset, dm_setweather_a_snow, dm_setweather_m_clear, dm_setweather_m_rain, dm_setweather_m_reset,
dm_setweather_m_snow, dm_spawn, dm_vent
-Added command completion, which pops up menus to assist the user when a command or emote is entered
incorrectly (Linux only).
-Added a Command Targeter, to allow much greater freedom in targeting commands. They may still be
targeted via tell, but if they are not, the user will be prompted to target by either using the
Command Targeter or by sending a tell with the !target command.
-Added a channel muting option for silenced characters.
-SIMTools now utilzes a new nwx plugin, nwnx_events by Virusman, which allows users to hook events
like onattacked, onpickpocket, and more. It also allows detection of conversation node #s via
script, greatly reducing the number of scripts required for conversations (Linux only).
V2.1
-Colored language text is now correctly translated.
-PROCESS_NPC_SPEECH option now set to TRUE by default. It must be on to prevent
PCs from evading the ignore feature by possessing their familars.
-Added levels to party list in playerinfo.
-Fixed a bug allowing evasion of talking while dead blocks with the emote symbol.
-You can now speak languages in Whisper.
V2.0
-Added an option to redirect chat from languages, metachannels, and message fowarding to the chat log
instead of the combat log. This results in a green [Tell] box before text, but prevents the messages
from being lost from combat scrolling. The ootion is turned on, by default. Thanks to virusman and
dumbo for the new functionality!
-Moved the NPC listening switch from the ini file to the configuration script, for easier access.
Thanks to dumbo for the improved functionality!
-Added an option to disable tracking of silent channels while still processing NPC speech, which will
cut down on scriptcalls but still allows DMs possessing NPCs to have their speech processed. Thanks
to both dumbo and virusman for the new option!
-Fixed some minor typos introduced in version 1.4.
V1.4
-Added dozens of emotes, based on dmfi emotes, with two-letter shortcuts for most.
-Modified emote handling so that other messages beginning with the emote symbol would not show as
invalid emotes, unless they were in shout channel. This will allow people to use the * prefix
for emote commands an still allow normal use of *-prefixed emote sentences, which seemed like
a more natural setup than forcing a different emote symbol.
-Added a silent lore check option for language recognition and comprehension checks, included in a
modified GetIsSkillSuccessful function because GISS was bugged in 1.67 Linux.
-Added a switch in the nwnx_ini file to allow processing of npc messages, which allows dms possessing
npcs to have their speech processed. Credit to dumbo and virusman for the added functionality!
The switch is off by default. To turn it on, just remove the ; from before the ;processnpc=1 line
to uncomment it and have SIMTools process NPC speech, and then save.
-Added an escape string option. Adding it to the beginning of the string in a SpeakString call will
prevent the speaker from translating the string if they are in 'speak another language' mode. It's
useful for text you don't ever want to be translated, like loot notification messsages. You can set
it to whatever string you want, of whatever length, so long as it does not begin with your command
symbol (default is !), your emote symbol (default is *), or the forward slash channel designator (/).
It should only be used for TALKVOLUME_TALK SpeakStrings, as they are the only volume subject to
translation.
-Added the nwnx reset plugin and a dm command to reset the server from ingame, dm_reset. Unlike
calling StartNewModule, the reset plugin stops the nwserver process, clearing the memory to
eliminate lag buildup.
-Added !d4 and !d10 commands to complete the dice set.
-Updated the playerinfo command to provide more information.
-Added the anon command to hide some of the information given by the playerinfo command, and the unanon
command to remove anonymous status.
-Corrected the description of the metakick command.
-Added dm commands to award and remove experience and levels: dm_givexp, dm_givelevel, dm_takexp,
and dm_takelevel.
-Minor bugfix to allow subraces to give characters multiple languages.
-Moved all the strings in the scriptset to a const file to make the task of translating them into other
languages simpler. If anyone does take the time to translate the whole file, please send it to me so
I can add it to the scriptset.
V1.3
-Added 39 new languages, provided by Lanessar and the players of the Myth Drannor PW.
-Added the DM Voice Thrower item, to tag objects for use with the ventrilo command. The current script
uses tag-based scripting, but can easily be converted if you use a single onactivate script. Switch to
tag-based already! :P
-Added 9 new DM commands:
/v - (the ventrilo command) when ever you enter this channel prefix, the speech you type is spoken by
the object you tagged with the DM Voice Thrower Item instead. Works on PCs, creatures, items,
placeables, and so on. Lots of fun, and a potential mischiefmaker!
dm_change_appear - sets target appearance to the specified appearance constant (ala the console command)
dm_change_appear base - restores target appearance (only works with 1- NWNX or 2- Bioware DB with
languages enabled)
dm_fx - applys any vfx in the game, at any duration, to the target
dm_fx_loc - applys any vfx in the game, at any duration, to the target's location
dm_fx_rem - removes all vfx applied by the sender of the tell to the target
dm_fx_list_* -lists vfx name and numbers by type, lith 6 types: dur, bea, eye, imp, com, fnf
dm_learn - teaches the target a specified language
dm_unlearm - removes knowledge from the target of the specified language
-Added 6 new scripting commands:
!list languages - lists all the languages the player can speak
!list alllanguages - lists all the available languages SIMTools has to offer
!setname - sets an item matching the name input in the speakers inventory to the new name input
!setname all - same as setname but switches all items of that name
!skillcheck - does a skillcheck for the player for the specified skill and dc
!list skills - lists the skill names and numbers for easy input into the skillcheck
V1.2
-Added DMFI languages! Characters may now speak all the languages from the DMFI scriptset, either with
one-liner commands or via on/off toggles. Their typing appears as the language selected, and their listeners
(in either talk or party channels) get lore checks to either 1) comprehend the speech if they don't
know it (optional) or 2) to recognize what language it is. Characters will gain languages on levelup,
if they add a language-speaking class, and may learn additional languages if you choose to allow it.
There is a sample language teacher in the test mod provided as an example of how to add languages to PCs.
-Added the dm_create command, so that DMs can create items specified by resrefs.
-Fixed a bug with dm_unbanshout that was leaving characters banned again after a reset.
V1.1
-Added an admin designation with seperate (and potentially greater) powers than the dm designation.
This may create a little confusion, because 'DM' is now a distinct designation, as well as describing
whether the person is logged in using the DM client. To summarize, the system has 4 potential sets
of persons who it treats distinctly:
---
People listed in the VerifyDMKey function (or 'designated DMs') who are logged in with DM client - DMDMs
People listed in the VerifyDMKey function (or 'designated DMs') who are logged in with PC client - DMPCs
People listed in the VerifyAdminKey function (or 'designated admins') who are logged in with DM client - AdminDMs
People listed in the VerifyAdminKey function (or 'designated admins') who are logged in with PC client - ADminPCs
---
You need not know these designations, but they may help clarify the toggles below.
-Added the ability to designate your own emote and command prefix symbols, instead of '*' and '!'.
-Fixed the dm_ignoremeta command. It was unimplemented (oops).
-Fixed the TOWN destination, it was set to JAIL.
-Now only DMs are given the target's ip with the !playerinfo command. Security concerns.
-Broke the disable speech on death option down by channel, so that players acan still use some channels,
and added the option to prevent use of metachannel while dead.
-Cleaned up the main function using wrapper functions, to make the structure clearer, and optimized it a bit.
*/
const int USING_LINUX = FALSE;//Set this to TRUE if you are using Linux instead of Windows. The Linux version of the
//chat plugin has some added functionality which allows popup conversations with command completion when a command
//or emote is misentered.
const int USING_NWNX_DB = FALSE;//Set this to TRUE if you are using NWNX/APS persistence ints. Leave
//it set to FALSE otherwise, or if you are unsure what this means. The persistence ints in these scripts
//use the default APS database and columns, so if you did not customize your MySQL/MySQLite database they are
//ready to use.
const int PROCESS_NPC_SPEECH = TRUE;//Leave this set this to TRUE if you want speech from NPCs to be processed through SIMTools.
//This means that all channels (including silent channels) will be monitored. It is useful for processing the speech
//of DMs possesssing NPCs. It's also necessary if you want to prevent avoidance of the ignore function by PCs possessing
//their familiars. The only downside is the increased number of scriptcalls generated, but the effect on performance should
//not be noticeable.
const int IGNORE_SILENT_CHANNELS = TRUE;//This switch turns off processing of silent channel speech if you have chosen to
//process NPC speech with the PROCESS_NPC_SPEECH speech above. This is important because monsters communicate across
//the entire module using the silent channels, and processing them could result in a greatly increased number of
//scriptcalls. You should only set this switch to FALSE if you plan to add to the functionality of SIMTools in a way
//that requires processing of silent channels. The current SIMTools scripts do not rely on processing silent channels
//at all, and DMs possessing NPCs will still have their speech processed with IGNORE_SILENT_CHANNELS set to TRUE.
const int TEXT_LOGGING_ENABLED = TRUE;//Set to TRUE to send all messages to the text log.
const int SPAMBLOCK_ENABLED = TRUE;//Set this to FALSE to turn off spam blocker. It is intended to
//stop advertising of other servers on yours.
const string EMOTE_SYMBOL = "*";//Set this to whatever single character you want players to access the emotes
//with. It is recommended that you select only a normally unused symbol, because any line beginning with this
//symbol will be seen by the system as an attempted emote, and suppressed accordingly (with an 'invalid emote'
//warning if they aren't among the listed emotes). ONLY A SINGLE CHARACTER MAY BE USED. Do not choose the
//forward slash (/), or metachannels and languages will not work. You may simply choose to use the default
//asterisk symbol, if you prefer. If you select a symbol other than the asterisk, the list commands and list
//emotes functions will display the correct symbol automatically, but you will have to change the descriptions
//of the 2 command list items to reflect the change, if you plan to use them and want them to be accurate.
const string COMMAND_SYMBOL = "!";//Set this to whatever single character you want players to access the
//commands with. It is recommended that you select only a normally unused symbol, because any line beginning
//with this symbol will be seen by the system as an attempted emote, and suppressed accordingly (with an
//'invalid emote' warning if they aren't among the listed emotes). ONLY A SINGLE CHARACTER MAY BE USED. YOU
//MUST PICK A DIFFERENT SYMBOL THAN THE ONE YOU CHOOSE FOR EMOTES, OR THE COMMANDS WILL NOT WORK. Do not
//choose the forward slash (/), or metachannels will not work. You may simply choose to use the default
//exclamation mark symbol, if you prefer. If you select a symbol other than the exclamation mark, the list commands
//and list emotes functions will display the correct symbol automatically, but you will have to change the
//descriptions of the 2 command list items to reflect the change, if you plan to use them and want them to be accurate.
const int ENABLE_WEAPON_VISUALS = FALSE;//Set this to TRUE to allow players to change the vfx on their weapons
//via the !wp commands.
const int ENABLE_PLAYER_SETNAME = FALSE;//Set this to TRUE to allow players to use the !setname command.
const int ENABLE_PLAYER_SETTAILWINGS = FALSE;//Set this to TRUE to allow players to use the !settail and !setwings commands.
const int ENABLE_METALANGUAGE_CONVERSION = TRUE;//Set this to FALSE to stop common metagame chat like 'lol'
//from being converted to emotes like *Laughs out loud* when spoken in the talk channel. Currently only 'lol'
//is converted, more will be added.
/////////////////////////////////Message Routing////////////////////////////////
const int SEND_CHANNELS_TO_CHAT_LOG = TRUE;//Set this to FALSE if you want languages, listening, and metachannels
//sent to the combat log instead of the chat log. This will elimimate the [Tell] bracketed text in front of messages
//but can make messages harder for players to read.
////////////////////////////////Listening Options///////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
//DM Listening//////////////////////////////////////////////////////////////////
const int DMS_HEAR_TELLS = FALSE;//Set this to TRUE if you want people listed in the VerifyDMKey function
//who are logged in as DMs to receive all player tell messages.
//
const int DM_PLAYERS_HEAR_TELLS = FALSE;//Set this to TRUE if you want people listed in the VerifyDMKey
//function who are logged in as players to receive all player tell messages in their combat logs. It will
//NOT route tells to people logged in as DMs, so you should use both this and the above command if you
//want both. Neither of the above commands will route tells from DMs.
//
const int DM_PLAYERS_HEAR_DM = FALSE;//Set this to TRUE if you want people listed in the VerifyDMKey
//function who are logged in as players to receive all DM messages in their combat logs. This will route
//DM messages to anyone with a cdkey you list below, if they are logged as a player. It will route DM
//messages from both players and DMs. People listed in the VerifyDMKey function who are logged as players
//will have the option to ignore these messages if this option is enabled, via the dm_ignoredm command.
//
//Admin Listening///////////////////////////////////////////////////////////////
const int ADMIN_DMS_HEAR_TELLS = TRUE;//Set this to TRUE if you want people listed in the VerifyAdminKey
//function who are logged in as DMs to receive all player tell messages.
//
const int ADMIN_PLAYERS_HEAR_TELLS = FALSE;//Set this to TRUE if you want people listed in the VerifyAdminKey
//function who are logged in as players to receive all tell messages in their combat logs. It will NOT route
//tells to people logged in as DMs, so you should use both this and the above command if you want both.
//Neither of the above commands will route tells from DMs.
//
const int ADMIN_PLAYERS_HEAR_DM = FALSE;//Set this to TRUE if you want administrators logged in as players
//to receive all DM messages in their combat logs. This will route DM messages to anyone with a cdkey you
//list below in the VerifyAdminKey function, if they are logged as a player. It will route DM messages from
//both players and DMs. DMs logged as players will have the option to ignore these messages if this option
//is enabled, via the dm_ignoredm command.
//
//General Listening/////////////////////////////////////////////////////////////
const int ENABLE_DM_TELL_ROUTING = FALSE;//Set this to TRUE if you want tells from the DM tell channel
//routed as well as tells from the player channel. This is dependant on what channel is used, and not on
//player/dm/admin status.
//
const int DM_TELLS_ROUTED_ONLY_TO_ADMINS = FALSE;//Set this to TRUE if you want DM tells routed to
//administrators (people with cd keys listed in the VerifyAdminKey function) but not to DMs (people with
//cd keys listed in the VerifyAdminKey function. You should leave the above function set to FALSE if you
//enable this.
//////////////////////////////////Metachannels//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//Metachannels are added chat channels. They are very similar to the party channel, in that players
//control who is in their metachannel via invites. They may invite whomever they like, however, and
//are not limited to the members of their party. There is no set number of metachannels; rather, a
//metachannel is created whenever a player wants. The first invite sent out determines who the 'leader'
//of the metachannel is. When that invite is accepted, the inviter becomes the leader of a new metachannel.
//From that point on, any messages that any member types that begin with '/m' will be sent to every member
//of the metachannel, via the combat log. Metachannels will be logged with other text if you enable
//text logging. If you are uncertain what use these channels could be put to, the whole reason that I
//implemented them at all was for guild use on my PW, but I'm certain they will find other uses.
////////////////////////////////////////////////////////////////////////////////
//
const int ENABLE_METACHANNELS = FALSE;//Set this to FALSE if you do not want players to have access
//to metachannels.
//
const int DMS_HEAR_META = FALSE;//Set this to TRUE if you want DMs to receive all player metamessages. DMs
//will have the option to ignore these messages with the command dm_ignoremeta. If a DM is also in a
//metachannel, it will not duplicate the messages (like NWN does with party channel when a DM joins a party).
//
const int DM_PLAYERS_HEAR_META = FALSE;///Set this to TRUE if you want DMs logged in as players
//to receive all DM messages in their combat logs. This will route DM messages to anyone with a cdkey you
//list below in the VerifyDMKey function, if they are logged as a player. It will NOT route metamessages
//to people logged in as DMs, so you should use both this and the above command if you want both. DMs
//logged in as players will have the option to ignore these messages with the command dm_ignoremeta.
//If a DM is also in a metachannel, it will not duplicate the messages (like NWN does with party channel
//when a DM joins a party).
//
const int ADMIN_DMS_HEAR_META = FALSE;//Set this to TRUE if you want administrators logged in as DMs to receive
//all player metamessages. Administrators will have the option to ignore these messages with the command
//dm_ignoremeta. If a administrator is also in a metachannel, it will not duplicate the messages
//(like NWN does with party channel when a DM joins a party).
//
const int ADMIN_PLAYERS_HEAR_META = FALSE;///Set this to TRUE if you want administrators logged in as players
//to receive all DM messages in their combat logs. This will route DM messages to anyone with a cdkey you
//list below in the VerifyAdminKey function,if they are logged as a player. It will NOT route metamessages
//to people logged in as DMs, so you should use both this and the above command if you want both.
//Administrators logged in as players will have the option to ignore these messages with the command
//dm_ignoremeta. If an administrator is also in a metachannel, it will not duplicate the messages
//(like NWN does with party channel when a DM joins a party).
/////////////////////////Conditional Channel Disabling//////////////////////////
////////////////////////////////////////////////////////////////////////////////
const int DISALLOW_SPEECH_WHILE_DEAD = FALSE;//Set to TRUE to disable speech by dead players on one,
//several, or all chat channels. Then set the constants for the channels you want to disable to TRUE.
//These channels will only block player speakers, not DM speakers, and not DMs logged in as players. Emotes
//and Commands are automatically blocked on all channels when the player using them is dead.
const int DISABLE_DEAD_TALK = FALSE;
const int DISABLE_DEAD_SHOUT = FALSE;
const int DISABLE_DEAD_WHISPER = FALSE;
const int DISABLE_DEAD_TELL = FALSE;
const int DISABLE_DEAD_PARTY = FALSE;
const int DISABLE_DEAD_DM = FALSE;
const int DISALLOW_METASPEECH_WHILE_DEAD = FALSE;//Set to TRUE to disable speech by dead players on
//metachannels. This setting is seperate from the above commands, and can be enabled even if
//DISALLOW_SPEECH_WHILE_DEAD is left equal to FALSE.
const int DISALLOW_SPEECH_WHILE_SILENCED = FALSE;//Set to TRUE to disable speech by silenced players on one,
//several, or all chat channels. Then set the constants for the channels you want to disable to TRUE.
//These channels will only block player speakers, not DM speakers, and not DMs logged in as players.
const int DISABLE_SILENCED_TALK = FALSE;
const int DISABLE_SILENCED_SHOUT = FALSE;
const int DISABLE_SILENCED_WHISPER = FALSE;
const int DISABLE_SILENCED_TELL = FALSE;
const int DISABLE_SILENCED_PARTY = FALSE;
const int DISABLE_SILENCED_DM = FALSE;
const int DISALLOW_METASPEECH_WHILE_SILENCED = FALSE;//Set to TRUE to disable speech by silenced players on
//metachannels. This setting is seperate from the above commands, and can be enabled even if
//DISALLOW_SPEECH_WHILE_SILENCED is left equal to FALSE.
//////////////////////////Permanent Channel Disabling///////////////////////////
////////////////////////////////////////////////////////////////////////////////
const int ENABLE_PERMANENT_CHANNEL_MUTING = FALSE;//Set this to TRUE if you want to permanently disable
//one, several, or all chat channels. Then set the constants for the channels you want to disable to TRUE.
//These channels will only block player speakers, not DM speakers, and not DMs logged in as players.
//Disabling a channel will ONLY prevent text from displaying on that channel. Emotes and commands can still
//be entered on it.
const int PERMANENT_CHANNEL_MUTING_FOR_PC_ONLY = TRUE;//Set this to FALSE to have permanent channel muting affect
//NPCs as well as PCs. Server shouts will be unaffacted.
const int DISABLE_TALK_CHANNEL = FALSE;
const int DISABLE_SHOUT_CHANNEL = FALSE;
const int DISABLE_WHISPER_CHANNEL = FALSE;
const int DISABLE_TELL_CHANNEL = FALSE;
const int DISABLE_PARTY_CHANNEL = FALSE;
const int DISABLE_DM_CHANNEL = FALSE;
//////////////////////////////DM_PORT DESTINATIONS//////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//If you want the DM commands dm_porthell, dm_portjail, and dm_porttown to work, you must specify the tags
//of their waypoints here.
//dm_porthell
const string LOCATION_HELL = "FKY_WAY_HELL"; //Replace FKY_WAY_HELL with the tag of your 'hell' waypoint.
//dm_portjail
const string LOCATION_JAIL = "FKY_WAY_JAIL"; //Replace FKY_WAY_JAIL with the tag of your 'jail' waypoint.
//dm_porttown
const string LOCATION_TOWN = "FKY_WAY_TOWN"; //Replace FKY_WAY_TOWN with the tag of your 'town' waypoint.
////////////////////////CHARACTER EDITING WITH LETOSCRIPT///////////////////////
////////////////////////////////////////////////////////////////////////////////
//If you want the DM commands dm_setcha, dm_setcon, dm_setdex, dm_setint, dm_setstr, dm_setwis, dm_setfort,
//dm_setreflex, dm_setwill, and the standard command !delete to work, you must specify your servervault path
//here so that leto can locate the character files to edit them. These commands will not work on a localvault
//server. The character is booted after each command so that the file can be edited. Sample windows and linux
//servervault paths are shown below. Leaving this const blank will disable the commands above.
//const string VAULTPATH_CHAT = "";
//const string VAULTPATH_CHAT = "C:/NeverwinterNights/NWN/servervault/";//windows sample
const string VAULTPATH_CHAT = "/home/tyler/Desktop/REO/NeverwinterNights/nwn/servervault/";
const int LETO_FOR_ADMINS_ONLY = FALSE;//Set this to TRUE if you want to prevent dungeon masters from
//using the leto DM commands. DMs and players can still use the !delete command, unless you change the
//DMS_CAN_DELETE and PLAYERS_CAN_DELETE consts, below, to FALSE.
const int ALREADY_USING_LETO = FALSE;//Set this to TRUE if you are already using letoscript elsewhere in
//your module (most likely for subraces). If you don't know what this means leave this set to FALSE. This
//will prevent some conflicts that might arise in the onclientexit event. If you set this to TRUE and the
//SIMTools leto commands stop working, you will need to set it back to FALSE and make edits to your onclientexit
//script to prevent conflict between your leto scripts and SIMTools. Or, if you decide that you would rather
//not use the SIMTools leto functions because of a conflict, just set this to TRUE, and leave the VAULTPATH_CHAT
//const above set to "".
const int SAFE_DELETE = TRUE;//Set this to TRUE if you do not want the !delete command to actually delete the
//characte file. If you do this it will simply rename the file to a .utc extension, so that it will not appear
//in the player's character selection screen, but can be retrieved simply by renaming the file back to a
//.bic extension. The only downside to enabling this option is that it will interfere with later leto edits of
//characters of the same name in that player's vault, if those leto edits use a method that converts the file to
//.utc format before editing (as SIMTools edits do).
const int DMS_CAN_DELETE = TRUE;//Set this to FALSE if you do not want DMs to be able to delete characters
//with the !delete command. The delete commmand allows deletion of the targeted character, though only DMs
//and admins can target characters besides their own.
const int PLAYERS_CAN_DELETE = FALSE;//Set this to FALSE if you do not want players to be able to delete
//their own characters with the !delete command.
////////////////////////////////////DM List/////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//This function returns TRUE if the player is a dm. For it to function correctly you must enter all
//the cd keys of your DMs. Dummy cdkeys are provided below as examples. If you are not comfortable with
//shortening the functions, simply overwrite the dummy keys with the keys of your dms, and leave the
//remaining keys as is. You may, of course, add more than twelve keys, as well.
int VerifyDMKey(object oPlayer);
int VerifyDMKey(object oPlayer)
{
string sCDKey = GetPCPublicCDKey(oPlayer);
if (sCDKey == "FTMFTR33" || // Drakaden
sCDKey == "Q7KR3PY3" || // Drakaden's Alt (Drakaden3)
sCDKey == "FFXH76WF" || // Kal-Rhael
sCDKey == "QG6EKNC6" || // Kate
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
//////////////////////////////////Admin List////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//This function returns TRUE if the player is an administrator. Administrators in SIMTools do not
//necessarily have more power than DMs, and in fact could be configured to have less. It is merely
//a separate designation from DM, with separate settings, and potentially more power. For it to
//function correctly you must enter all the cd keys of your administrators. DO NOT LIST SOMEONE IN BOTH
//DM AND ADMIN LISTS! The system is configured to treat them as two seperate groups. Dummy cdkeys are
//provided below as examples. If you are not comfortable with shortening the functions, simply overwrite
//the dummy keys with the keys of your dms, and leave the remaining keys as is. You may, of course, add
//more than twelve keys, as well.
int VerifyAdminKey(object oPlayer);
int VerifyAdminKey(object oPlayer)
{
string sCDKey = GetPCPublicCDKey(oPlayer);
if (sCDKey == "FTMU44GR" || // Zunath
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY" ||
sCDKey == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
///////////////////////////////////Languages////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//
const int ENABLE_LANGUAGES = TRUE;//Set this to FALSE if you do not want players to be able to speak
//different languages.
//
const string ESCAPE_STRING = "&&";//Adding this escape string to the beginning of a SpeakString call will
//prevent the speaker from translating the string if they are in 'speak another language' mode. The excape
//string is automatically filtered out of what they say, whether or not they are speaking another language
//at the time. It's useful for adding to the begging of strings in scripts that you don't ever want to be
//translated, like loot notification messsages. You can set it to whatever string you want, of whatever
//length, so long as it does not begin with your command symbol (default is !), your emote symbol
//(default is *), or the forward slash channel designator (/). It should only be used for TALKVOLUME_TALK
//SpeakStrings, as they are the only volume subject to translation.
//
const int ENABLE_FULL_LANGUAGE_LIST_FOR_PLAYERS = FALSE;//Set this to true if you want players to be able
//to see the full list of languages available. The !list alllanguages command was created primarily for DMs
//to use when 'teaching' a player a language, but you may want to allow them to see them all. In either case,
//they will be able to see the languages that their character can speak with the !list languages command.
//
//Language Storage Object Tag and Resref////////////////////////////////////////
//This object is used ONLY if you left USING_NWNX_DB set to FALSE above. The slow speed of the Bioware
//database makes it impractical for the number of database reads that the languages system requires
//the first oncliententer of every character each reset, so local ints stored on an item are used instead.
//These ints will be saved across server resets if the character file is saved via ExportSingleCharacter(), AND
//if the character is a PC. DM characters cannot store ints on inventory items across resets. If you want
//to use another object to store language information, you may enter the tag and resref of that object
//below. The system will autmatically create that Item on the PC oncliententer if they do not have one,
//mark it with whatever languages the character can speak based on class, race, and subrace, and then make
//it undroppable via the SetItemCursedFlag function.
const string TAG_OF_LANGUAGE_STORAGE_OBJECT = "database";
const string RESREF_OF_LANGUAGE_STORAGE_OBJECT = "database";
//Lore to Recognize/Understand Languages////////////////////////////////////////
const int LORE_NEEDED_TO_RECOGNIZE_LANGUAGE = 20;//Set this number equal to the lore check difficulty
//you want for chatacters to recognize what language is being spoken. Language recognition is automatic if
//they speak the language.
const int LORE_ALLOWS_LANGUAGE_COMPREHENSION = TRUE;//Set this to FALSE if you do not want high lore skills
//to enable characters to not only recognize but to understand languages they cannot speak.
const int SILENT_LORE_CHECKS = FALSE;//Set this to TRUE if you want the Lore checks for language recognition
//to be performed silently instead of being displayed.
//This function defines what lore skill difficulty check must be passed in order to not just recognize a
//foreign language but to comprehend it. If you disable LORE_ALLOWS_LANGUAGE_COMPREHENSION by setting it to
//FALSE then this function does nothing. You can set the lore values to whatever suits your module.
int GetLoreNeededToComprehendLanguage(int nLanguage);
int GetLoreNeededToComprehendLanguage(int nLanguage)
{
int nReturn = 120;//defaults to highest possible in case of error
switch(nLanguage/10)
{
case 0:
switch(nLanguage)
{
case 1: nReturn = 60; break;//Dwarven
case 2: nReturn = 30; break;//Algarondan
case 3: nReturn = 35; break;//Alzhedo
case 4: nReturn = 105; break;//Aquan
case 5: nReturn = 95; break;//AssassinsCant
case 6: nReturn = 100; break;//Auran
case 7: nReturn = 30; break;//Chessentan
case 8: nReturn = 35; break;//Chondathan
case 9: nReturn = 65; break;//Elven
}
break;
case 1:
switch(nLanguage)
{
case 10: nReturn = 45; break;//Chultan
case 11: nReturn = 40; break;//Damaran
case 12: nReturn = 30; break;//Dambrathan
case 13: nReturn = 105; break;//DrowSign
case 14: nReturn = 85; break;//Druidic
case 15: nReturn = 60; break;//Gnomish
case 16: nReturn = 35; break;//Durpari
case 17: nReturn = 55; break;//Giant
case 18: nReturn = 75; break;//Gnoll
case 19: nReturn = 40; break;//Halardrim
}
break;
case 2:
switch(nLanguage)
{
case 20: nReturn = 30; break;//Halruaan
case 21: nReturn = 100; break;//Ignan
case 22: nReturn = 35; break;//Illuskan
case 23: nReturn = 55; break;//Halfling
case 24: nReturn = 30; break;//Imaskar
case 25: nReturn = 30; break;//Lantanese
case 26: nReturn = 40; break;//Midani
case 27: nReturn = 35; break;//Mulhorandi
case 28: nReturn = 40; break;//Nexalan
case 29: nReturn = 35; break;//Oillusk
}
break;
case 3:
switch(nLanguage)
{
case 30: nReturn = 30; break;//Rashemi
case 31: nReturn = 35; break;//Raumvira
case 32: nReturn = 85; break;//Drow
case 33: nReturn = 40; break;//Serusan
case 34: nReturn = 45; break;//Shaaran
case 35: nReturn = 30; break;//Shou
case 36: nReturn = 85; break;//Sylvan
case 37: nReturn = 105; break;//Animal
case 38: nReturn = 35; break;//Talfiric
case 39: nReturn = 35; break;//Tashalan
}
break;
case 4:
switch(nLanguage)
{
case 40: nReturn = 105; break;//Terran
case 41: nReturn = 90; break;//Treant
case 42: nReturn = 50; break;//Tuigan
case 43: nReturn = 30; break;//Turmic
case 44: nReturn = 95; break;//Cant
case 45: nReturn = 35; break;//Uluik
case 46: nReturn = 60; break;//Undercommon
case 47: nReturn = 40; break;//Untheric
case 48: nReturn = 45; break;//Vaasan
case 49: nReturn = 70; break;//Goblin
}
break;
case 5:
switch(nLanguage)
{
case 50: nReturn = 80; break;//Troll
case 51: nReturn = 85; break;//Thri-kreen
case 52: nReturn = 90; break;//Grimlock
case 53: nReturn = 60; break;//Helf-orc
case 54: nReturn = 75; break;//Kuo-toan
case 55: nReturn = 45; break;//Kenderspeak
case 56: nReturn = 75; break;//Orc
case 57: nReturn = 75; break;//Minotaur
case 58: nReturn = 90; break;//Rakshasa
case 59: nReturn = 80; break;//Stinger
}
break;
case 6:
switch(nLanguage)
{
case 60: nReturn = 70; break;//Lizardman
case 61: nReturn = 110; break;//Illithid
case 62: nReturn = 65; break;//Hobgoblin
case 63: nReturn = 80; break;//Draconic
case 64: nReturn = 70; break;//Duergar
case 65: nReturn = 75; break;//Bugbear
case 66: nReturn = 105; break;//Githzerai
case 67: nReturn = 80; break;//Korred
case 68: nReturn = 75; break;//Sahaguin
case 69: nReturn = 85; break;//Yuan-ti
}
break;
case 7:
switch(nLanguage)
{
case 70: nReturn = 90; break;//Pixie
case 71: nReturn = 120; break;//Magic
case 72: nReturn = 120; break;//Infernal
case 73: nReturn = 60; break;//Siren song
case 74: nReturn = 65; break;//Hengeyokai
case 75: nReturn = 55; break;//Svirfneblin
case 76: nReturn = 60; break;//High Shou
case 77: nReturn = 200; break;//Psionic
case 78: nReturn = 70; break;//Averial
case 79: nReturn = 50; break;//Kobold
}
break;
case 8:
switch(nLanguage)
{
case 80: nReturn = 120; break;//Necromantic
case 81: nReturn = 125; break;//Abyssal
case 82: nReturn = 50; break;//Ogre
case 89: nReturn = 115; break;//Celestial
}
break;
case 9:
switch(nLanguage)
{
case 99: nReturn = 20; break;//Leetspeak
}
break;
}
return nReturn;
}
//Subrace Languages/////////////////////////////////////////////////////////////
//
//Some languages are attained only by learning or being of a certain subrace. These functions tell what
//subraces get what languages. I have filled in the ones I use on my PW as an example. Because subrace
//names vary from PW to PW, you will probably have to change mine to match yours. If the player's race
//has already guaranteed him the language because it is required for the subrace, you need not list the
//subrace here (though doing so won't cause any problems). Of course, the player can get one language
//from his race and a second from his subrace. Leetspeak is included only for purposes of completeness. If
//you modify subrace names after creation you will have to 'teach' the character the appropriate language
//when you do, because these are only checked the first time a character enters the server. An example
//language teacher conversation is included in the demo module. If you have disabled languages you may
//ignore these settings completely.
int SubraceSpeaksDrow(string sSubrace)//List the subraces you want to be able to speak drow here.
{
if (sSubrace == "Elf - Drow" ||
sSubrace == "Drider" ||
sSubrace == "Drey" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksAnimal(string sSubrace)//List the subraces you want to be able to speak animal here.
{
if (sSubrace == "Half-Elf - Dryadkin" ||
sSubrace == "Half-Elf - Nymphkin" ||
sSubrace == "Half-Elf - Nereidkin" ||
sSubrace == "Half-Satyr" ||
sSubrace == "Treant" ||
sSubrace == "Atomie" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksGoblin(string sSubrace)
{
if (sSubrace == "Humanoid - Goblin" ||
sSubrace == "Humanoid - Hobgoblin" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksOrcish(string sSubrace)
{
if (sSubrace == "Humanoid - Orc" ||
sSubrace == "Humanoid - Deep Orc" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksDraconic(string sSubrace)
{
if (sSubrace == "Half-Dragon - Black" ||
sSubrace == "Half-Dragon - Blue" ||
sSubrace == "Half-Dragon - Green" ||
sSubrace == "Prismatic" ||
sSubrace == "Half-Dragon - Red" ||
sSubrace == "Half-Dragon - White" ||
sSubrace == "Humanoid - Kobold" ||
sSubrace == "Lizardfolk" ||
sSubrace == "Humanoid - Yuan-Ti" ||
sSubrace == "Hound Archon" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksInfernal(string sSubrace)
{
if (((sSubrace == "Tiefling") && (d8() > 4)) || //There's a 50% chance Tieflings will speak Infernal.
sSubrace == "Planewalker" || //If not, then they will speak Abyssal.
sSubrace == "Erinyes" ||
sSubrace == "Half-Fiend" ||
sSubrace == "Half-Kyton" ||
sSubrace == "Hound Archon" ||
sSubrace == "Kolyarut" ||
sSubrace == "Maelephant" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksAbyssal(string sSubrace)
{
if (sSubrace == "Tiefling" ||
sSubrace == "Planewalker" ||
sSubrace == "Kolyarut" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksCelestial(string sSubrace)
{
if (sSubrace == "Aasimar" ||
sSubrace == "Planewalker" ||
sSubrace == "Fallen Angel" ||
sSubrace == "Genie" ||
sSubrace == "Half-Celestial" ||
sSubrace == "Hound Archon" ||
sSubrace == "Kolyarut" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksLeetspeak(string sSubrace)
{
if (sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksAquan(string sSubrace)
{
if (sSubrace == "PT - Water Genasi" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksAuran(string sSubrace)
{
if (sSubrace == "PT - Air Genasi" ||
sSubrace == "Genie" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksGiant(string sSubrace)
{
if (sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksGnoll(string sSubrace)
{
if (sSubrace == "Humanoid - Gnoll" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksIgnan(string sSubrace)
{
if (sSubrace == "PT - Fire Genasi" ||
sSubrace == "Genie" ||
sSubrace == "Salamander" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksSylvan(string sSubrace)
{
if (sSubrace == "Half-Elf - Dryadkin" ||
sSubrace == "Half-Elf - Nymphkin" ||
sSubrace == "Half-Elf - Nereidkin" ||
sSubrace == "Half-Satyr" ||
sSubrace == "Pixie" ||
sSubrace == "Fey - Satyr" ||
sSubrace == "Treant" ||
sSubrace == "Atomie" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksTerran(string sSubrace)
{
if (sSubrace == "PT - Earth Genasi" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksTreant(string sSubrace)
{
if (sSubrace == "Treant" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksDrowSign(string sSubrace)
{
if (sSubrace == "Elf - Drow" ||
sSubrace == "Drider" ||
sSubrace == "Drey" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksUndercommon(string sSubrace)
{
if (sSubrace == "Elf - Drow" ||
sSubrace == "Drider" ||
sSubrace == "Drey" ||
sSubrace == "Illithid" ||
sSubrace == "Gnome - Svirfneblin" ||
sSubrace == "Dwarf - Duergar" ||
sSubrace == "Dwarf - Derrzagon" ||
sSubrace == "Dwarf - Deep Dwarf" ||
sSubrace == "Dwarf - Derro" ||
sSubrace == "Rilminai" ||
sSubrace == "XXXXYYYY" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksTroll(string sSubrace)
{
if (sSubrace == "Troll" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksThriKreen(string sSubrace)
{
if (sSubrace == "Thri-Kreen" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksGrimlock(string sSubrace)
{
if (sSubrace == "Humanoid - Grimlock" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksKuoToan(string sSubrace)
{
if (sSubrace == "Kuo-Toa" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksKenderspeak(string sSubrace)
{
if (sSubrace == "Kender" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksMinotaur(string sSubrace)
{
if (sSubrace == "Minotaur" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksRakshasa(string sSubrace)
{
if (sSubrace == "Rakshasa" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksStinger(string sSubrace)
{
if (sSubrace == "Stinger" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksLizardMan(string sSubrace)
{
if (sSubrace == "Lizardfolk" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksIllithid(string sSubrace)
{
if (sSubrace == "Illithid" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksHobgoblin(string sSubrace)
{
if (sSubrace == "Humanoid - Hobgoblin" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksDuergar(string sSubrace)
{
if (sSubrace == "Dwarf - Duergar" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksBugBear(string sSubrace)
{
if (sSubrace == "Humanoid - Bugbear" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksGithzerai(string sSubrace)
{
if (sSubrace == "Githzerai" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksKorred(string sSubrace)
{
if (sSubrace == "Korred" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksSahaguin(string sSubrace)
{
if (sSubrace == "Sahaguin" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksYuanTi(string sSubrace)
{
if (sSubrace == "Humanoid - Yuan-Ti" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksPixie(string sSubrace)
{
if (sSubrace == "Pixie" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksSirenSong(string sSubrace)
{
if (sSubrace == "Siren" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksHengeyokai(string sSubrace)
{
if (sSubrace == "Hengeyokai" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksSvirfneblin(string sSubrace)
{
if (sSubrace == "Gnome - Svirfneblin" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksPsionic(string sSubrace)
{
if (sSubrace == "Illithid" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksAverial(string sSubrace)
{
if (sSubrace == "Averial" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksKobold(string sSubrace)
{
if (sSubrace == "Humanoid - Kobold" ||
sSubrace == "XXXXYYYY")
{
return TRUE;
}
else return FALSE;
}
int SubraceSpeaksOgre(string sSubrace)
{
if (sSubrace == "Half-Ogre" ||
sSubrace == "Ogre")
{
return TRUE;
}
else return FALSE;
}
//void main(){}