1582 lines
67 KiB
Plaintext
1582 lines
67 KiB
Plaintext
////////////////////////////////////////////////////////////////////////////////
|
|
// hos_chat - Replaces the invisible listeners that were needed before
|
|
// By Deva B. Winblood. August 16th, 2008
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "x3_inc_string"
|
|
#include "npcactivitiesh"
|
|
#include "color_header"
|
|
#include "header_sounds"
|
|
#include "speech_j_h"
|
|
#include "prc_inc_racial"
|
|
|
|
/////////////////////////////////
|
|
// CONSTANTS
|
|
/////////////////////////////////
|
|
|
|
string sHOLLY_BERRY_WORD = "MISTLETOE";
|
|
|
|
/////////////////////////////////
|
|
// PROTOTYPES
|
|
/////////////////////////////////
|
|
|
|
void fnListHelp(object oPC);
|
|
void fnListCmd(object oPC);
|
|
void fnListTroops(object oPC);
|
|
void fnListSettings(object oPC);
|
|
void fnListTroop(object oPC);
|
|
void fnSayDM(object oPC,string sSay);
|
|
void fnSayLeader(object oPC,string sSay);
|
|
void fnSayTeam(object oPC,string sSay);
|
|
void fnSaySquad(object oPC,string sSay);
|
|
void fnTroopsCommand(object oPC,string sCmd);
|
|
void fnSpecificTroop(object oPC, string sCmd);
|
|
void fnVoiceChat(object oPC,string sMaster);
|
|
void fnAnimate(object oPC,string sMaster);
|
|
void fnVampire(object oPC,string sMaster);
|
|
void fnDetonateSeed(object oSeed);
|
|
void fnFireSeedDetonate(object oPC);
|
|
void fnSettings(object oPC,string sCmd);
|
|
void fnListLeader(object oPC);
|
|
void fnDebugThis(object oPC,string sMsg);
|
|
void fnCountContainers(object oPC);
|
|
|
|
|
|
////////////////////////////////////////////////////////////////[ MAIN ]////////
|
|
void main()
|
|
{
|
|
string sMsg=GetPCChatMessage();
|
|
string sOriginal=sMsg;
|
|
object oMod=GetModule();
|
|
object oPC=GetPCChatSpeaker();
|
|
int nVolume=GetPCChatVolume();
|
|
int bGameInProgress=GetLocalInt(oMod,"nInProgress");
|
|
int nShoutTokens=GetLocalInt(oPC,"nShoutTokens");
|
|
int bIsLeader=FALSE;
|
|
int nShoutGameLevel=GetLocalInt(oMod,"nShoutGameLevel");
|
|
string sLetter=GetStringLeft(sMsg,1);
|
|
string sWord=StringParse(sMsg);
|
|
string sTeamID=GetLocalString(oPC,"sTeamID");
|
|
string sUpperWord=GetStringUpperCase(sWord);
|
|
string sMsgUpper;
|
|
string sOrigUpper=GetStringUpperCase(sOriginal);
|
|
object oOb;
|
|
if (GetLocalObject(oMod,"oTeamLead"+sTeamID)==oPC) bIsLeader=TRUE;
|
|
int bWasCommand=FALSE;
|
|
if (sLetter=="@")
|
|
{ // say to leader
|
|
fnSayLeader(oPC,sOriginal);
|
|
bWasCommand=TRUE;
|
|
} // say to leader
|
|
else if (sLetter=="[")
|
|
{ // debug
|
|
oOb=GetItemPossessedBy(oPC,"rts_debug_wand");
|
|
if (GetIsObjectValid(oOb))
|
|
{ // has debug wand
|
|
SetLocalString(oPC,"sOriginal",sOriginal);
|
|
SetLocalString(oPC,"sMsg",GetStringRight(sMsg,GetStringLength(sMsg)-1));
|
|
ExecuteScript("debug_routine",oPC);
|
|
} // has debug wand
|
|
else
|
|
{ // need wand
|
|
SendMessageToPC(oPC,"You cannot use debug commands without a debug wand. :DEBUGWAND will create a wand. [WARNING: This wand can be used to cheat.] Other players will be notified when you use this.");
|
|
} // need wand
|
|
} // debug
|
|
else if (sLetter=="!")
|
|
{ // say to squad
|
|
fnSaySquad(oPC,sOriginal);
|
|
bWasCommand=TRUE;
|
|
} // say to squad
|
|
else if (sLetter=="?")
|
|
{ // say to team
|
|
fnSayTeam(oPC,sOriginal);
|
|
bWasCommand=TRUE;
|
|
} // say to team
|
|
else if (sLetter=="]")
|
|
{ // say to DM and get their attention
|
|
fnSayDM(oPC,sOriginal);
|
|
bWasCommand=TRUE;
|
|
} // say to DM and get their attention
|
|
else if (sLetter=="'")
|
|
{ // say MUD style
|
|
sMsg=GetStringRight(sMsg,GetStringLength(sMsg)-1);
|
|
SetPCChatMessage(sMsg);
|
|
} // say MUD style
|
|
else if (sLetter==":")
|
|
{ // system command
|
|
sMsg=GetStringRight(sMsg,GetStringLength(sMsg)-1);
|
|
sWord=StringParse(sMsg," ");
|
|
sUpperWord=GetStringUpperCase(sWord);
|
|
if (sUpperWord=="DEBUG")
|
|
{ // debug
|
|
fnDebugThis(oPC,sOriginal);
|
|
} // debug
|
|
else if (sUpperWord=="CSKIN")
|
|
{ // Change Skin Color
|
|
sMsg=StringRemoveParsed(sMsg,sWord," ");
|
|
SendMessageToPC(oPC,"Set Skin Color:"+sMsg);
|
|
SetColor(oPC,COLOR_CHANNEL_SKIN,StringToInt(sMsg));
|
|
} // Change Skin Color
|
|
else if (sUpperWord=="CHAIR")
|
|
{ // Change hair color
|
|
sMsg=StringRemoveParsed(sMsg,sWord," ");
|
|
SendMessageToPC(oPC,"Set Hair Color:"+sMsg);
|
|
SetColor(oPC,COLOR_CHANNEL_HAIR,StringToInt(sMsg));
|
|
} // change hair color
|
|
else if (sUpperWord=="CONTAINERS")
|
|
{ // count containers
|
|
fnCountContainers(oPC);
|
|
} // count containers
|
|
else if (sUpperWord=="?"||sUpperWord=="HELP")
|
|
{ // list
|
|
SendMessageToPC(oPC,":DEBUG <debug message>");
|
|
SendMessageToPC(oPC,":CSKIN #");
|
|
SendMessageToPC(oPC,":CHAIR #");
|
|
SendMessageToPC(oPC,":CONTAINERS");
|
|
SendMessageToPC(oPC,":COLORS");
|
|
} // list
|
|
else if (sUpperWord=="COLORS")
|
|
{ // list colors
|
|
SendMessageToPC(oPC,"Skin:"+IntToString(GetColor(oPC,COLOR_CHANNEL_SKIN)));
|
|
SendMessageToPC(oPC,"Hair:"+IntToString(GetColor(oPC,COLOR_CHANNEL_HAIR)));
|
|
SendMessageToPC(oPC,"Tattoo1:"+IntToString(GetColor(oPC,COLOR_CHANNEL_TATTOO_1)));
|
|
SendMessageToPC(oPC,"Tattoo2:"+IntToString(GetColor(oPC,COLOR_CHANNEL_TATTOO_2)));
|
|
} // list colors
|
|
else if (sUpperWord=="DEBUGWAND")
|
|
{ // create debug wand
|
|
oOb=GetItemPossessedBy(oPC,"rts_debug_wand");
|
|
if (!GetIsObjectValid(oOb))
|
|
{ // create
|
|
oOb=CreateItemOnObject("rts_debug_wand",oPC);
|
|
PrintString("[DEBUG WAND CREATED] by "+GetName(oOb)+" controlled by "+GetPCPlayerName(oOb));
|
|
} // create
|
|
SendMessageToPC(oPC,"Chat [? or [help to get a list of debug commands.");
|
|
sMsgUpper=GetName(oPC)+" created a debug wand... it is possible to use this to cheat.";
|
|
sMsgUpper=StringToRGBString(sMsgUpper,"744");
|
|
oOb=GetFirstPC();
|
|
while(GetIsObjectValid(oOb))
|
|
{ // notify players
|
|
if (oOb!=oPC)
|
|
{ // don't tell the PC that created it
|
|
SendMessageToPC(oOb,sMsgUpper);
|
|
} // don't tell the PC that created it
|
|
oOb=GetNextPC();
|
|
} // notify players
|
|
} // create debug wand
|
|
bWasCommand=TRUE;
|
|
} // system command
|
|
else
|
|
{ // other
|
|
sMsg=StringRemoveParsed(sMsg,sWord," ");
|
|
sMsgUpper=GetStringUpperCase(sMsg);
|
|
if (sUpperWord=="LIST")
|
|
{ // list command
|
|
if (sMsgUpper=="COMMANDS")
|
|
{ // list commands
|
|
fnListCmd(oPC);
|
|
} // list commands
|
|
else if (sMsgUpper=="HELP")
|
|
{ // list help
|
|
fnListHelp(oPC);
|
|
} // list help
|
|
else if (sMsgUpper=="TROOP")
|
|
{ // list troop
|
|
fnListTroop(oPC);
|
|
} // list troop
|
|
else if (sMsgUpper=="TROOPS")
|
|
{ // list troops
|
|
fnListTroops(oPC);
|
|
} // list troops
|
|
else if (sMsgUpper=="SETTINGS")
|
|
{ // list settings
|
|
fnListSettings(oPC);
|
|
} // list settings
|
|
else if (sMsgUpper=="LEADER")
|
|
{ // list leaders
|
|
fnListLeader(oPC);
|
|
} // list leaders
|
|
else
|
|
{ // error
|
|
SendMessageToPC(oPC,"TRY: list help, list commands, or list leader");
|
|
} // error
|
|
bWasCommand=TRUE;
|
|
} // list command
|
|
else if (sUpperWord=="TROOP,")
|
|
{ // single unit command
|
|
fnSpecificTroop(oPC,GetStringLowerCase(sOriginal));
|
|
} // single unit command
|
|
else if (sUpperWord=="TROOPS,")
|
|
{ // multiple unit command
|
|
fnTroopsCommand(oPC,GetStringLowerCase(sOriginal));
|
|
} // multiple unit command
|
|
else if (sUpperWord=="ANIM")
|
|
{ // Play animation
|
|
fnAnimate(oPC,GetStringLowerCase(sOriginal));
|
|
bWasCommand=TRUE;
|
|
} // Play animation
|
|
else if (sUpperWord=="VOICECHAT")
|
|
{ // Play Voicechat
|
|
fnVoiceChat(oPC,GetStringLowerCase(sOriginal));
|
|
bWasCommand=TRUE;
|
|
} // Play Voicechat
|
|
else if (sUpperWord=="VAMPIRE")
|
|
{ // vampire abilities
|
|
if (GetLocalInt(oPC,"nIsVampire"))
|
|
{ // is vampire
|
|
fnVampire(oPC,GetStringLowerCase(sOriginal));
|
|
} // is vampire
|
|
bWasCommand=TRUE;
|
|
} // vampire abilities
|
|
else if (sUpperWord=="SETTINGS")
|
|
{ // chat and game settings adjustment
|
|
fnSettings(oPC,GetStringLowerCase(sOriginal));
|
|
bWasCommand=TRUE;
|
|
} // chat and game settings adjustment
|
|
else if (sUpperWord==sHOLLY_BERRY_WORD)
|
|
{ // fireseed
|
|
fnFireSeedDetonate(oPC);
|
|
bWasCommand=TRUE;
|
|
} // fireseed
|
|
else if (sOrigUpper=="SUMMON MINOR"||sOrigUpper=="SUMMON MEDIUM"||sOrigUpper=="SUMMON MAJOR")
|
|
{ // leader summon emergency help
|
|
if (bIsLeader)
|
|
{ // is leader
|
|
oOb=GetWaypointByTag(sTeamID+"_START");
|
|
if (GetArea(oOb)==GetArea(oPC))
|
|
{ // is in the lair
|
|
int nN=1;
|
|
if (sOrigUpper=="SUMMON MEDIUM") nN=2;
|
|
else if (sOrigUpper=="SUMMON MAJOR") nN=3;
|
|
SetLocalInt(oPC,"nParm",nN);
|
|
ExecuteScript("leader_summon",oPC);
|
|
} // is in the lair
|
|
else
|
|
{ // not in the lair
|
|
SendMessageToPC(oPC,"You can only use this ability when in your lair.");
|
|
} // not in the lair
|
|
} // is leader
|
|
else
|
|
{ // not leader
|
|
SendMessageToPC(oPC,"Only the team leader can use this command when in the lair.");
|
|
} // not leader
|
|
bWasCommand=TRUE;
|
|
} // leader summon emergency help
|
|
} // other
|
|
if (bWasCommand) SetPCChatMessage(""); // display nothing
|
|
else
|
|
{ // adjust volume?
|
|
// 0 = only leaders and PCs with shout tokens can shout [ Default ]
|
|
// 1 = Anyone can shout
|
|
// 2 = only people with shout tokens can shout
|
|
if (nVolume==TALKVOLUME_SHOUT&&!GetIsDM(oPC))
|
|
{ // was a shout check rules
|
|
if (nShoutGameLevel==2&&nShoutTokens<1)
|
|
{ // no shouting without tokens
|
|
SendMessageToPC(oPC,"Shout Tokens via spell or other method are required to shout. Your volume has been lowered.");
|
|
SetPCChatVolume(TALKVOLUME_TALK);
|
|
} // no shouting without tokens
|
|
else if (nShoutGameLevel==0&&!bIsLeader&&nShoutTokens<1)
|
|
{ // only leaders and people with tokens can shout
|
|
SendMessageToPC(oPC,"Only Leaders or Players with unused Shout Tokens are permitted to shout. Your volume has been lowered.");
|
|
SetPCChatVolume(TALKVOLUME_TALK);
|
|
} // only leaders and people with tokens can shout
|
|
else
|
|
{ // shouting okay
|
|
nShoutTokens=nShoutTokens-1;
|
|
if (nShoutTokens<1) nShoutTokens=0;
|
|
SetLocalInt(oPC,"nShoutTokens",nShoutTokens);
|
|
if (nShoutGameLevel==2) SendMessageToPC(oPC,"Shout Tokens Remaining:"+IntToString(nShoutTokens));
|
|
else if (nShoutGameLevel==0&&!bIsLeader) SendMessageToPC(oPC,"Shout Tokens Remaining:"+IntToString(nShoutTokens));
|
|
} // shouting okay
|
|
} // was a shout check rules
|
|
} // adjust volume?
|
|
}
|
|
////////////////////////////////////////////////////////////////[ MAIN ]////////
|
|
|
|
|
|
///////////////////////////////////
|
|
// FUNCTIONS
|
|
///////////////////////////////////
|
|
|
|
|
|
void fnCountContainers(object oPC)
|
|
{ // PURPOSE: containers
|
|
int nN=0;
|
|
int nC;
|
|
object oWP=GetObjectByTag("AREA_DEBUG",nN);
|
|
object oC;
|
|
SendMessageToPC(oPC,"Begin Containers capable of being cleaned report===");
|
|
while(GetIsObjectValid(oWP))
|
|
{ // look at containers
|
|
nC=1;
|
|
if (GetLocalInt(GetArea(oWP),"nCleanMode")!=5)
|
|
{ // no clean
|
|
oC=GetNearestObject(OBJECT_TYPE_PLACEABLE,oWP,nC);
|
|
while(GetIsObjectValid(oC))
|
|
{ // check placeables
|
|
if (!GetPlotFlag(oC)&&!GetLocalInt(oC,"bNoClean")&&GetHasInventory(oC))
|
|
{ // report
|
|
SendMessageToPC(oPC,"Container '"+GetName(oC)+"' in area '"+GetName(GetArea(oWP))+"'.");
|
|
} // report
|
|
nC++;
|
|
oC=GetNearestObject(OBJECT_TYPE_PLACEABLE,oWP,nC);
|
|
} // check placeables
|
|
} // no clean
|
|
nN++;
|
|
oWP=GetObjectByTag("AREA_DEBUG",nN);
|
|
} // look at containers
|
|
SendMessageToPC(oPC,"End of Container Report===");
|
|
} // fnCountContainers
|
|
|
|
|
|
void fnSettings(object oPC,string sCmd)
|
|
{ // PURPOSE: To adjust settings for these commands
|
|
string sMaster=sCmd;
|
|
string sParse=StringParse(sMaster," ");
|
|
int nN;
|
|
sMaster=StringRemoveParsed(sMaster,sParse," "); // strip settings
|
|
sParse=StringParse(sMaster," ");
|
|
sMaster=StringRemoveParsed(sMaster,sParse," ");
|
|
nN=StringToInt(sMaster);
|
|
if (sParse=="range")
|
|
{ // range
|
|
if (nN<1||nN>30) nN=30;
|
|
SetLocalInt(oPC,"nVoiceRange",nN);
|
|
SendMessageToPC(oPC,"Voice range has been set to "+IntToString(nN)+" meters.");
|
|
} // range
|
|
else if (sParse=="number")
|
|
{ // number
|
|
if (nN<1||nN>40) nN=20;
|
|
SetLocalInt(oPC,"nVoiceNumber",nN);
|
|
SendMessageToPC(oPC,"Number of units to respond to voice commands has been set to "+IntToString(nN)+".");
|
|
} // number
|
|
else
|
|
{ // unknown
|
|
SendMessageToPC(oPC,"That is an unknown settings command '"+sParse+"' try 'list settings' for more help. [You typed '"+sCmd+"']");
|
|
} // unknown
|
|
} // fnSettings()
|
|
|
|
void fnIssueCommand(object oPC,object oCreature,int nCMD,int nOpt=0)
|
|
{ // PURPOSE: Issue the command to the unit
|
|
string sS;
|
|
switch(nCMD)
|
|
{ // switch
|
|
case 1: { // Follow
|
|
SetLocalInt(oCreature,"nMState",5);
|
|
SetLocalInt(oCreature,"nSState",0);
|
|
SetLocalObject(oCreature,"oDestWP",oPC);
|
|
SetLocalInt(oCreature,"nFollowDist",nOpt);
|
|
if (GetAbilityScore(oCreature,ABILITY_INTELLIGENCE)>9) AssignCommand(oCreature,SpeakString("Following"));
|
|
break;
|
|
} // Follow
|
|
case 2: { // Recon
|
|
SetLocalInt(oCreature,"nMState",14);
|
|
SetLocalInt(oCreature,"nSState",0);
|
|
SetLocalObject(oCreature,"oDestWP",oPC);
|
|
SetLocalInt(oCreature,"nFollowDist",nOpt);
|
|
if (GetAbilityScore(oCreature,ABILITY_INTELLIGENCE)>9) AssignCommand(oCreature,SpeakString("Reconnoitering"));
|
|
break;
|
|
} // Recon
|
|
case 3: { // Guard Lair
|
|
SetLocalInt(oCreature,"nMState",11);
|
|
SetLocalInt(oCreature,"nSState",0);
|
|
if (GetAbilityScore(oCreature,ABILITY_INTELLIGENCE)>9) AssignCommand(oCreature,SpeakString("Guarding Lair"));
|
|
break;
|
|
} // Guard Lair
|
|
case 4: { // Stop
|
|
SetLocalInt(oCreature,"nMState",7);
|
|
SetLocalInt(oCreature,"nSState",0);
|
|
if (GetAbilityScore(oCreature,ABILITY_INTELLIGENCE)>9) AssignCommand(oCreature,SpeakString("Stopped"));
|
|
break;
|
|
} // Stop
|
|
case 5: { // Guard Mana
|
|
SetLocalInt(oCreature,"nMState",2);
|
|
SetLocalInt(oCreature,"nSState",0);
|
|
SetLocalInt(oCreature,"nParm",4);
|
|
if (GetAbilityScore(oCreature,ABILITY_INTELLIGENCE)>9) AssignCommand(oCreature,SpeakString("Mana Guard"));
|
|
break;
|
|
} // Guard Mana
|
|
case 6: { // Guard Throne
|
|
SetLocalInt(oCreature,"nMState",2);
|
|
SetLocalInt(oCreature,"nSState",0);
|
|
SetLocalInt(oCreature,"nParm",5);
|
|
if (GetAbilityScore(oCreature,ABILITY_INTELLIGENCE)>9) AssignCommand(oCreature,SpeakString("Throne Guard"));
|
|
break;
|
|
} // Guard Throne
|
|
case 7: { // Guard Here
|
|
SetLocalInt(oCreature,"nMState",2);
|
|
SetLocalInt(oCreature,"nSState",0);
|
|
SetLocalInt(oCreature,"nParm",0);
|
|
if (GetAbilityScore(oCreature,ABILITY_INTELLIGENCE)>9) AssignCommand(oCreature,SpeakString("Guarding"));
|
|
break;
|
|
} // Guard Here
|
|
case 8: { // Raid
|
|
SetLocalInt(oCreature,"nMState",17);
|
|
SetLocalInt(oCreature,"nSState",0);
|
|
if (nOpt==1) SetLocalString(oCreature,"sTeamToRaid","DWF");
|
|
else if (nOpt==2) SetLocalString(oCreature,"sTeamToRaid","UNC");
|
|
else if (nOpt==3) SetLocalString(oCreature,"sTeamToRaid","UND");
|
|
else if (nOpt==4) SetLocalString(oCreature,"sTeamToRaid","SPID");
|
|
if (GetAbilityScore(oCreature,ABILITY_INTELLIGENCE)>9) AssignCommand(oCreature,SpeakString("Raiding"));
|
|
SetLocalInt(oCreature,"nParm",1);
|
|
break;
|
|
} // Raid
|
|
case 9: { // control point capture
|
|
SetLocalInt(oCreature,"nMState",18);
|
|
SetLocalInt(oCreature,"nSState",0);
|
|
if (GetAbilityScore(oCreature,ABILITY_INTELLIGENCE)>9) AssignCommand(oCreature,SpeakString("Capturing Control Points"));
|
|
break;
|
|
} // control point capture
|
|
case 10: { // Roam
|
|
SetLocalInt(oCreature,"nMState",8);
|
|
SetLocalInt(oCreature,"nSState",0);
|
|
if (GetAbilityScore(oCreature,ABILITY_INTELLIGENCE)>9) AssignCommand(oCreature,SpeakString("Roaming"));
|
|
break;
|
|
} // Roam
|
|
case 11: { // power reservoir
|
|
SetLocalInt(oCreature,"nMState",23);
|
|
SetLocalInt(oCreature,"nSState",0);
|
|
if (GetAbilityScore(oCreature,ABILITY_INTELLIGENCE)>9) AssignCommand(oCreature,SpeakString("Power Reservoir Recovery Duty"));
|
|
break;
|
|
} // power reservoir
|
|
case 12: { // tactics
|
|
if (nOpt==9)
|
|
{ // disable
|
|
DeleteLocalInt(oCreature,"bCOMBAT_AI_ON");
|
|
DeleteLocalString(oCreature,"sCOMBAT_AI_TYPE");
|
|
} // disable
|
|
else
|
|
{ // enable
|
|
sS="melee";
|
|
if (nOpt==2) sS="ranged";
|
|
else if (nOpt==3) sS="stealth";
|
|
else if (nOpt==4) sS="flee";
|
|
else if (nOpt==5) sS="hold";
|
|
else if (nOpt==6) sS="support";
|
|
else if (nOpt==7) sS="summon";
|
|
else if (nOpt==8) sS="caster";
|
|
SetLocalInt(oCreature,"bCOMBAT_AI_ON",TRUE);
|
|
SetLocalString(oCreature,"sCOMBAT_AI_TYPE",sS);
|
|
} // enable
|
|
break;
|
|
} // tactics
|
|
default: break;
|
|
} // switch
|
|
} // fnIssueCommand()
|
|
|
|
void fnTroopsCommand(object oPC,string sCmd)
|
|
{ // PURPOSE: Commands issued to all units within range
|
|
int nRange=GetLocalInt(oPC,"nVoiceRange");
|
|
int nNumber=GetLocalInt(oPC,"nVoiceNumber");
|
|
float fRange;
|
|
int nC=0;
|
|
float fF;
|
|
int nN;
|
|
object oOb;
|
|
string sID=GetLocalString(oPC,"sTeamID");
|
|
string sVocalized;
|
|
string sDo;
|
|
string sParse;
|
|
string sHeader;
|
|
int bNoSubLeader;
|
|
object oLeader=GetLocalObject(GetModule(),"oTeamLead"+sID);
|
|
fRange=IntToFloat(nRange);
|
|
if (fRange<1.0||fRange>30.0) fRange=30.0;
|
|
if (nNumber<1||nNumber>40) nNumber=20;
|
|
if (sID=="DWF") sHeader="Friends, ";
|
|
else if (sID=="SPID") sHeader="Minions, ";
|
|
else if (sID=="UNC") sHeader="Grunts, ";
|
|
else if (sID=="UND") sHeader="Slaves, ";
|
|
sDo=GetStringRight(sCmd,GetStringLength(sCmd)-7);
|
|
//SendMessageToPC(oPC,sDo);
|
|
while(GetStringLeft(sDo,1)==" ") { sDo=GetStringRight(sDo,GetStringLength(sDo)-1); }
|
|
//SendMessageToPC(oPC,sDo);
|
|
sParse=fnParse(sDo," ");
|
|
//SendMessageToPC(oPC,"PARSE:"+sParse);
|
|
//SendMessageToPC(oPC,sDo);
|
|
sDo=fnRemoveParsed(sDo,sParse," ");
|
|
//SendMessageToPC(oPC,"FINAL sDo:"+sDo);
|
|
//SendMessageToPC(oPC,"nNumber:"+IntToString(nNumber)+" fRange"+FloatToString(fRange));
|
|
nN=1;
|
|
oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_NOT_PC);
|
|
fF=GetDistanceBetween(oPC,oOb);
|
|
while(oOb!=OBJECT_INVALID&&nC<nNumber&&fF<=fRange)
|
|
{ // look for units
|
|
//SendMessageToPC(oPC,"["+IntToString(nN)+"]"+GetName(oOb)+" ID:"+GetLocalString(oOb,"sTeamID"));
|
|
bNoSubLeader=GetLocalInt(oOb,"nNoSubLeader");
|
|
if (GetLocalString(oOb,"sTeamID")==sID&&(oPC==oLeader||bNoSubLeader==FALSE))
|
|
{ // same team
|
|
if (sParse=="follow")
|
|
{ // follow
|
|
if (sDo=="3")
|
|
{ // 3 meters
|
|
fnIssueCommand(oPC,oOb,1,0);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" stick to me heels!";
|
|
else if (sID=="UNC") sVocalized=" keep on me arse!";
|
|
else if (sID=="UND") sVocalized=" follow me closely!";
|
|
else if (sID=="SPID") sVocalized=" come with me, and stay close!";
|
|
} // 3 meters
|
|
else if (sDo=="5")
|
|
{ // 5 meters
|
|
fnIssueCommand(oPC,oOb,1,1);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" stick to me heels!";
|
|
else if (sID=="UNC") sVocalized=" keep on me arse!";
|
|
else if (sID=="UND") sVocalized=" follow me closely!";
|
|
else if (sID=="SPID") sVocalized=" come with me, and stay close!";
|
|
} // 5 meters
|
|
else if (sDo=="7")
|
|
{ // 7 meters
|
|
fnIssueCommand(oPC,oOb,1,2);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" stay with me!";
|
|
else if (sID=="UNC") sVocalized=" come wid' me!";
|
|
else if (sID=="UND") sVocalized=" follow me!";
|
|
else if (sID=="SPID") sVocalized=" come with me!";
|
|
} // 7 meters
|
|
} // follow
|
|
else if (sParse=="recon")
|
|
{ // recon
|
|
if (sDo=="3")
|
|
{ // 3 meters
|
|
fnIssueCommand(oPC,oOb,2,0);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" walk in front a bit!";
|
|
else if (sID=="UNC") sVocalized=" go ahead a me!";
|
|
else if (sID=="UND") sVocalized=" walk ahead of your master!";
|
|
else if (sID=="SPID") sVocalized=" scout ahead a short distance!";
|
|
} // 3 meters
|
|
else if (sDo=="5")
|
|
{ // 5 meters
|
|
fnIssueCommand(oPC,oOb,2,1);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" walk in front a bit!";
|
|
else if (sID=="UNC") sVocalized=" go ahead a me!";
|
|
else if (sID=="UND") sVocalized=" walk ahead of your master!";
|
|
else if (sID=="SPID") sVocalized=" scout ahead a short distance!";
|
|
} // 5 meters
|
|
else if (sDo=="7")
|
|
{ // 7 meters
|
|
fnIssueCommand(oPC,oOb,2,2);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" walk in front a ways!";
|
|
else if (sID=="UNC") sVocalized=" go far ahead a me!";
|
|
else if (sID=="UND") sVocalized=" walk far ahead of your master!";
|
|
else if (sID=="SPID") sVocalized=" scout ahead a longer distance!";
|
|
} // 7 meters
|
|
} // recon
|
|
else if (sParse=="guard")
|
|
{ // guard
|
|
if (sDo=="lair")
|
|
{ // guard lair
|
|
fnIssueCommand(oPC,oOb,3);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" guard our hold!";
|
|
else if (sID=="UNC") sVocalized=" keep the rats out of the cave!";
|
|
else if (sID=="UND") sVocalized=" guard against trespassers!";
|
|
else if (sID=="SPID") sVocalized=" ward our lair from those that come!";
|
|
} // guard lair
|
|
else if (sDo=="mana")
|
|
{ // guard mana
|
|
fnIssueCommand(oPC,oOb,5);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" protect our magic vault!";
|
|
else if (sID=="UNC") sVocalized=" protect our power juice!";
|
|
else if (sID=="UND") sVocalized=" defend the mana reserves!";
|
|
else if (sID=="SPID") sVocalized=" protect our holy power source!";
|
|
} // guard mana
|
|
else if (sDo=="throne")
|
|
{ // guard throne
|
|
fnIssueCommand(oPC,oOb,6);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" guard the throne room!";
|
|
else if (sID=="UNC") sVocalized=" watch out around the bosses chair!";
|
|
else if (sID=="UND") sVocalized=" guard the throne of your master!";
|
|
else if (sID=="SPID") sVocalized=" guard the high chair!";
|
|
} // guard throne
|
|
else if (sDo=="here")
|
|
{ // guard here
|
|
fnIssueCommand(oPC,oOb,7);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" guard where you stand!";
|
|
else if (sID=="UNC") sVocalized=" stay here and looks!";
|
|
else if (sID=="UND") sVocalized=" guard this location!";
|
|
else if (sID=="SPID") sVocalized=" where you stand should be protected!";
|
|
} // guard here
|
|
} // guard
|
|
else if (sParse=="stop")
|
|
{ // stop
|
|
fnIssueCommand(oPC,oOb,4);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" halt!";
|
|
else if (sID=="UNC") sVocalized=" move not!";
|
|
else if (sID=="UND") sVocalized=" stand where you are!";
|
|
else if (sID=="SPID") sVocalized=" cease!";
|
|
} // stop
|
|
else if (sParse=="raid")
|
|
{ // raid
|
|
if (sDo=="dwarves"&&sID!="DWF")
|
|
{ // dwarves
|
|
fnIssueCommand(oPC,oOb,8,1);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" guard our hold!";
|
|
else if (sID=="UNC") sVocalized=" attack the shorties!";
|
|
else if (sID=="UND") sVocalized=" attack the foul beards!";
|
|
else if (sID=="SPID") sVocalized=" attack the stone brothers!";
|
|
} // dwarves
|
|
else if (sDo=="unclean"&&sID!="UNC")
|
|
{ // unclean
|
|
fnIssueCommand(oPC,oOb,8,2);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" attack the dirty scum!";
|
|
else if (sID=="UNC") sVocalized=" attack the shorties!";
|
|
else if (sID=="UND") sVocalized=" attack the mentally challenged!";
|
|
else if (sID=="SPID") sVocalized=" attack the cave dwellers!";
|
|
} // unclean
|
|
else if (sDo=="undead"&&sID!="UND")
|
|
{ // undead
|
|
fnIssueCommand(oPC,oOb,8,3);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" attack those who forgot to die!";
|
|
else if (sID=="UNC") sVocalized=" attack the death walkers!";
|
|
else if (sID=="UND") sVocalized=" attack the foul beards!";
|
|
else if (sID=="SPID") sVocalized=" attack the necromancers spawn!";
|
|
} // undead
|
|
else if (sDo=="spiders"&&sID!="SPID")
|
|
{ // spider cultists
|
|
fnIssueCommand(oPC,oOb,8,4);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" attack the brainwashed cultists!";
|
|
else if (sID=="UNC") sVocalized=" attack the creepy crawlies!";
|
|
else if (sID=="UND") sVocalized=" attack the drow and their vermin!";
|
|
else if (sID=="SPID") sVocalized=" attack the necromancers spawn!";
|
|
} // spider cultists
|
|
else
|
|
{ // cannot do
|
|
sVocalized="I cannot raid my own team and I must name the teams as 'dwarves, unclean, undead, or spiders'!";
|
|
} // cannot do
|
|
} // raid
|
|
else if (sParse=="capture")
|
|
{ // control point
|
|
fnIssueCommand(oPC,oOb,9);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" go forth and secure the places of power!";
|
|
else if (sID=="UNC") sVocalized=" get me some places that feel good!";
|
|
else if (sID=="UND") sVocalized=" capture the four locations of power!";
|
|
else if (sID=="SPID") sVocalized=" capture the control points!";
|
|
} // control point
|
|
else if (sParse=="roam")
|
|
{ // roam
|
|
fnIssueCommand(oPC,oOb,10);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" wander about a bit!";
|
|
else if (sID=="UNC") sVocalized=" get lost!";
|
|
else if (sID=="UND") sVocalized=" wander and cause mayhem!";
|
|
else if (sID=="SPID") sVocalized=" roam where you may!";
|
|
} // roam
|
|
else if (sParse=="power")
|
|
{ // power reservoir
|
|
fnIssueCommand(oPC,oOb,11);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" if someone has the power doodad, get it back!";
|
|
else if (sID=="UNC") sVocalized=" gets the power thingy if someone finds it!";
|
|
else if (sID=="UND") sVocalized=" recover the power reservoir if others find it!";
|
|
else if (sID=="SPID") sVocalized=" bring back the power reservoir if others have it in their possession!";
|
|
} // power reservoir
|
|
else if (sParse=="run")
|
|
{ // run
|
|
SetLocalInt(oOb,"nGNBRun",TRUE);
|
|
SetLocalInt(oOb,"nRun",TRUE);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" move fast!";
|
|
else if (sID=="UNC") sVocalized=" move!";
|
|
else if (sID=="UND") sVocalized=" move at a running speed!";
|
|
else if (sID=="SPID") sVocalized=" run!";
|
|
} // run
|
|
else if (sParse=="walk")
|
|
{ // walk
|
|
DeleteLocalInt(oOb,"nGNBRun");
|
|
DeleteLocalInt(oOb,"nRun");
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" move slow!";
|
|
else if (sID=="UNC") sVocalized=" slow!";
|
|
else if (sID=="UND") sVocalized=" move at a walking speed!";
|
|
else if (sID=="SPID") sVocalized=" walk!";
|
|
} // walk
|
|
else if (sParse=="tactics")
|
|
{ // set tactics
|
|
sVocalized=" use "+sDo+" tactics in combat.";
|
|
if (sDo=="melee") fnIssueCommand(oPC,oOb,12,1);
|
|
else if (sDo=="ranged") fnIssueCommand(oPC,oOb,12,2);
|
|
else if (sDo=="stealth") fnIssueCommand(oPC,oOb,12,3);
|
|
else if (sDo=="flee") fnIssueCommand(oPC,oOb,12,4);
|
|
else if (sDo=="hold") fnIssueCommand(oPC,oOb,12,5);
|
|
else if (sDo=="support") fnIssueCommand(oPC,oOb,12,6);
|
|
else if (sDo=="summon") fnIssueCommand(oPC,oOb,12,7);
|
|
else if (sDo=="caster") fnIssueCommand(oPC,oOb,12,8);
|
|
else if (sDo=="bioware") fnIssueCommand(oPC,oOb,12,9);
|
|
if (sDo=="support"||sDo=="summon"||sDo=="caster") sVocalized=sVocalized+"[Spell caster tactic]";
|
|
nC++;
|
|
} // set tactics
|
|
} // same team
|
|
nN++;
|
|
oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_NOT_PC);
|
|
fF=GetDistanceBetween(oPC,oOb);
|
|
} // look for units
|
|
if (GetStringLength(sVocalized)>2) SetPCChatMessage(sHeader+sVocalized);
|
|
else { SetPCChatMessage(); SendMessageToPC(oPC,"Nothing to do."); }
|
|
} // fnTroopsCommand()
|
|
|
|
void fnSpecificTroop(object oPC, string sCmd)
|
|
{ // PURPOSE: Commands issued to specific unit type within range
|
|
int nRange=GetLocalInt(oPC,"nVoiceRange");
|
|
int nNumber=GetLocalInt(oPC,"nVoiceNumber");
|
|
float fRange;
|
|
int nC=0;
|
|
float fF;
|
|
int nN;
|
|
object oOb;
|
|
string sID=GetLocalString(oPC,"sTeamID");
|
|
string sVocalized;
|
|
string sDo;
|
|
string sParse;
|
|
string sHeader;
|
|
string sName;
|
|
int bNoSubLeader;
|
|
object oLeader=GetLocalObject(GetModule(),"oTeamLead"+sID);
|
|
fRange=IntToFloat(nRange);
|
|
if (fRange<1.0||fRange>30.0) fRange=30.0;
|
|
if (nNumber<1||nNumber>40) nNumber=20;
|
|
if (sID=="DWF") sHeader="Friends, ";
|
|
else if (sID=="SPID") sHeader="Minions, ";
|
|
else if (sID=="UNC") sHeader="Grunts, ";
|
|
else if (sID=="UND") sHeader="Slaves, ";
|
|
sDo=GetStringRight(sCmd,GetStringLength(sCmd)-6);
|
|
//SendMessageToPC(oPC,sDo);
|
|
while(GetStringLeft(sDo,1)==" ") { sDo=GetStringRight(sDo,GetStringLength(sDo)-1); }
|
|
//SendMessageToPC(oPC,sDo);
|
|
sParse=fnParse(sDo,":");
|
|
//SendMessageToPC(oPC,"PARSE:"+sParse);
|
|
//SendMessageToPC(oPC,sDo);
|
|
sDo=fnRemoveParsed(sDo,sParse,":");
|
|
sName=sParse;
|
|
while(GetStringLeft(sDo,1)==" ") { sDo=GetStringRight(sDo,GetStringLength(sDo)-1); }
|
|
sParse=fnParse(sDo," ");
|
|
sDo=fnRemoveParsed(sDo,sParse," ");
|
|
//SendMessageToPC(oPC,"FINAL sDo:"+sDo);
|
|
//SendMessageToPC(oPC,"nNumber:"+IntToString(nNumber)+" fRange"+FloatToString(fRange));
|
|
nN=1;
|
|
oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_NOT_PC);
|
|
fF=GetDistanceBetween(oPC,oOb);
|
|
while(oOb!=OBJECT_INVALID&&nC<nNumber&&fF<=fRange)
|
|
{ // look for units
|
|
//SendMessageToPC(oPC,"["+IntToString(nN)+"]"+GetName(oOb)+" ID:"+GetLocalString(oOb,"sTeamID"));
|
|
bNoSubLeader=GetLocalInt(oOb,"nNoSubLeader");
|
|
if (GetLocalString(oOb,"sTeamID")==sID&&(oPC==oLeader||bNoSubLeader==FALSE)&&GetStringLowerCase(GetName(oOb))==sName)
|
|
{ // same team
|
|
if (sParse=="follow")
|
|
{ // follow
|
|
if (sDo=="3")
|
|
{ // 3 meters
|
|
fnIssueCommand(oPC,oOb,1,0);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" stick to me heels!";
|
|
else if (sID=="UNC") sVocalized=" keep on me arse!";
|
|
else if (sID=="UND") sVocalized=" follow me closely!";
|
|
else if (sID=="SPID") sVocalized=" come with me, and stay close!";
|
|
} // 3 meters
|
|
else if (sDo=="5")
|
|
{ // 5 meters
|
|
fnIssueCommand(oPC,oOb,1,1);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" stick to me heels!";
|
|
else if (sID=="UNC") sVocalized=" keep on me arse!";
|
|
else if (sID=="UND") sVocalized=" follow me closely!";
|
|
else if (sID=="SPID") sVocalized=" come with me, and stay close!";
|
|
} // 5 meters
|
|
else if (sDo=="7")
|
|
{ // 7 meters
|
|
fnIssueCommand(oPC,oOb,1,2);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" stay with me!";
|
|
else if (sID=="UNC") sVocalized=" come wid' me!";
|
|
else if (sID=="UND") sVocalized=" follow me!";
|
|
else if (sID=="SPID") sVocalized=" come with me!";
|
|
} // 7 meters
|
|
} // follow
|
|
else if (sParse=="recon")
|
|
{ // recon
|
|
if (sDo=="3")
|
|
{ // 3 meters
|
|
fnIssueCommand(oPC,oOb,2,0);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" walk in front a bit!";
|
|
else if (sID=="UNC") sVocalized=" go ahead a me!";
|
|
else if (sID=="UND") sVocalized=" walk ahead of your master!";
|
|
else if (sID=="SPID") sVocalized=" scout ahead a short distance!";
|
|
} // 3 meters
|
|
else if (sDo=="5")
|
|
{ // 5 meters
|
|
fnIssueCommand(oPC,oOb,2,1);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" walk in front a bit!";
|
|
else if (sID=="UNC") sVocalized=" go ahead a me!";
|
|
else if (sID=="UND") sVocalized=" walk ahead of your master!";
|
|
else if (sID=="SPID") sVocalized=" scout ahead a short distance!";
|
|
} // 5 meters
|
|
else if (sDo=="7")
|
|
{ // 7 meters
|
|
fnIssueCommand(oPC,oOb,2,2);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" walk in front a ways!";
|
|
else if (sID=="UNC") sVocalized=" go far ahead a me!";
|
|
else if (sID=="UND") sVocalized=" walk far ahead of your master!";
|
|
else if (sID=="SPID") sVocalized=" scout ahead a longer distance!";
|
|
} // 7 meters
|
|
} // recon
|
|
else if (sParse=="guard")
|
|
{ // guard
|
|
if (sDo=="lair")
|
|
{ // guard lair
|
|
fnIssueCommand(oPC,oOb,3);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" guard our hold!";
|
|
else if (sID=="UNC") sVocalized=" keep the rats out of the cave!";
|
|
else if (sID=="UND") sVocalized=" guard against trespassers!";
|
|
else if (sID=="SPID") sVocalized=" ward our lair from those that come!";
|
|
} // guard lair
|
|
else if (sDo=="mana")
|
|
{ // guard mana
|
|
fnIssueCommand(oPC,oOb,5);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" protect our magic vault!";
|
|
else if (sID=="UNC") sVocalized=" protect our power juice!";
|
|
else if (sID=="UND") sVocalized=" defend the mana reserves!";
|
|
else if (sID=="SPID") sVocalized=" protect our holy power source!";
|
|
} // guard mana
|
|
else if (sDo=="throne")
|
|
{ // guard throne
|
|
fnIssueCommand(oPC,oOb,6);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" guard the throne room!";
|
|
else if (sID=="UNC") sVocalized=" watch out around the bosses chair!";
|
|
else if (sID=="UND") sVocalized=" guard the throne of your master!";
|
|
else if (sID=="SPID") sVocalized=" guard the high chair!";
|
|
} // guard throne
|
|
else if (sDo=="here")
|
|
{ // guard here
|
|
fnIssueCommand(oPC,oOb,7);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" guard where you stand!";
|
|
else if (sID=="UNC") sVocalized=" stay here and looks!";
|
|
else if (sID=="UND") sVocalized=" guard this location!";
|
|
else if (sID=="SPID") sVocalized=" where you stand should be protected!";
|
|
} // guard here
|
|
} // guard
|
|
else if (sParse=="stop")
|
|
{ // stop
|
|
fnIssueCommand(oPC,oOb,4);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" halt!";
|
|
else if (sID=="UNC") sVocalized=" move not!";
|
|
else if (sID=="UND") sVocalized=" stand where you are!";
|
|
else if (sID=="SPID") sVocalized=" cease!";
|
|
} // stop
|
|
else if (sParse=="raid")
|
|
{ // raid
|
|
if (sDo=="dwarves"&&sID!="DWF")
|
|
{ // dwarves
|
|
fnIssueCommand(oPC,oOb,8,1);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" guard our hold!";
|
|
else if (sID=="UNC") sVocalized=" attack the shorties!";
|
|
else if (sID=="UND") sVocalized=" attack the foul beards!";
|
|
else if (sID=="SPID") sVocalized=" attack the stone brothers!";
|
|
} // dwarves
|
|
else if (sDo=="unclean"&&sID!="UNC")
|
|
{ // unclean
|
|
fnIssueCommand(oPC,oOb,8,2);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" attack the dirty scum!";
|
|
else if (sID=="UNC") sVocalized=" attack the shorties!";
|
|
else if (sID=="UND") sVocalized=" attack the mentally challenged!";
|
|
else if (sID=="SPID") sVocalized=" attack the cave dwellers!";
|
|
} // unclean
|
|
else if (sDo=="undead"&&sID!="UND")
|
|
{ // undead
|
|
fnIssueCommand(oPC,oOb,8,3);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" attack those who forgot to die!";
|
|
else if (sID=="UNC") sVocalized=" attack the death walkers!";
|
|
else if (sID=="UND") sVocalized=" attack the foul beards!";
|
|
else if (sID=="SPID") sVocalized=" attack the necromancers spawn!";
|
|
} // undead
|
|
else if (sDo=="spiders"&&sID!="SPID")
|
|
{ // spider cultists
|
|
fnIssueCommand(oPC,oOb,8,4);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" attack the brainwashed cultists!";
|
|
else if (sID=="UNC") sVocalized=" attack the creepy crawlies!";
|
|
else if (sID=="UND") sVocalized=" attack the drow and their vermin!";
|
|
else if (sID=="SPID") sVocalized=" attack the necromancers spawn!";
|
|
} // spider cultists
|
|
else
|
|
{ // cannot do
|
|
sVocalized="I cannot raid my own team and I must name the teams as 'dwarves, unclean, undead, or spiders'!";
|
|
} // cannot do
|
|
} // raid
|
|
else if (sParse=="capture")
|
|
{ // control point
|
|
fnIssueCommand(oPC,oOb,9);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" go forth and secure the places of power!";
|
|
else if (sID=="UNC") sVocalized=" get me some places that feel good!";
|
|
else if (sID=="UND") sVocalized=" capture the four locations of power!";
|
|
else if (sID=="SPID") sVocalized=" capture the control points!";
|
|
} // control point
|
|
else if (sParse=="roam")
|
|
{ // roam
|
|
fnIssueCommand(oPC,oOb,10);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" wander about a bit!";
|
|
else if (sID=="UNC") sVocalized=" get lost!";
|
|
else if (sID=="UND") sVocalized=" wander and cause mayhem!";
|
|
else if (sID=="SPID") sVocalized=" roam where you may!";
|
|
} // roam
|
|
else if (sParse=="power")
|
|
{ // power reservoir
|
|
fnIssueCommand(oPC,oOb,11);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" if someone has the power doodad, get it back!";
|
|
else if (sID=="UNC") sVocalized=" gets the power thingy if someone finds it!";
|
|
else if (sID=="UND") sVocalized=" recover the power reservoir if others find it!";
|
|
else if (sID=="SPID") sVocalized=" bring back the power reservoir if others have it in their possession!";
|
|
} // power reservoir
|
|
else if (sParse=="run")
|
|
{ // run
|
|
SetLocalInt(oOb,"nGNBRun",TRUE);
|
|
SetLocalInt(oOb,"nRun",TRUE);
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" move fast!";
|
|
else if (sID=="UNC") sVocalized=" move!";
|
|
else if (sID=="UND") sVocalized=" move at a running speed!";
|
|
else if (sID=="SPID") sVocalized=" run!";
|
|
} // run
|
|
else if (sParse=="walk")
|
|
{ // walk
|
|
DeleteLocalInt(oOb,"nGNBRun");
|
|
DeleteLocalInt(oOb,"nRun");
|
|
nC++;
|
|
if (sID=="DWF") sVocalized=" move slow!";
|
|
else if (sID=="UNC") sVocalized=" slow!";
|
|
else if (sID=="UND") sVocalized=" move at a walking speed!";
|
|
else if (sID=="SPID") sVocalized=" walk!";
|
|
} // walk
|
|
else if (sParse=="tactics")
|
|
{ // set tactics
|
|
sVocalized=" use "+sDo+" tactics in combat.";
|
|
if (sDo=="melee") fnIssueCommand(oPC,oOb,12,1);
|
|
else if (sDo=="ranged") fnIssueCommand(oPC,oOb,12,2);
|
|
else if (sDo=="stealth") fnIssueCommand(oPC,oOb,12,3);
|
|
else if (sDo=="flee") fnIssueCommand(oPC,oOb,12,4);
|
|
else if (sDo=="hold") fnIssueCommand(oPC,oOb,12,5);
|
|
else if (sDo=="support") fnIssueCommand(oPC,oOb,12,6);
|
|
else if (sDo=="summon") fnIssueCommand(oPC,oOb,12,7);
|
|
else if (sDo=="caster") fnIssueCommand(oPC,oOb,12,8);
|
|
else if (sDo=="bioware") fnIssueCommand(oPC,oOb,12,9);
|
|
if (sDo=="support"||sDo=="summon"||sDo=="caster") sVocalized=sVocalized+"[Spell caster tactic]";
|
|
nC++;
|
|
} // set tactics
|
|
} // same team
|
|
nN++;
|
|
oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_NOT_PC);
|
|
fF=GetDistanceBetween(oPC,oOb);
|
|
} // look for units
|
|
if (GetStringLength(sVocalized)>2) SetPCChatMessage(sHeader+sVocalized);
|
|
else { SetPCChatMessage(); SendMessageToPC(oPC,"Nothing to do.");}
|
|
} // fnSpecificTroop()
|
|
|
|
void fnSay(object oPC,string sSay)
|
|
{ // PURPOSE: say something outloud if you are using the DM channel
|
|
string sWords=GetStringRight(sSay,GetStringLength(sSay)-1);
|
|
AssignCommand(oPC,SpeakString(sWords));
|
|
} // fnSay()
|
|
|
|
void fnSayDM(object oPC,string sSay)
|
|
{ // PURPOSE: Send message to DMs
|
|
object oDM;
|
|
string sWords=GetStringRight(sSay,GetStringLength(sSay)-1);
|
|
sWords=ColorRGBString(sWords,4,4,6);
|
|
sWords=ColorRGBString("["+GetName(oPC)+"]: ",4,4,4)+sWords;
|
|
oDM=GetFirstPC();
|
|
while(oDM!=OBJECT_INVALID)
|
|
{ // DM
|
|
if (GetIsDM(oDM))
|
|
{
|
|
SendMessageToPC(oDM,sWords);
|
|
AssignCommand(oDM,fnSoundAlert("as_an_catmeow1"));
|
|
ChatJ_AddToJournal(oDM,sWords);
|
|
}
|
|
oDM=GetNextPC();
|
|
} // DM
|
|
} // fnSayDM()
|
|
|
|
void fnSayLeader(object oPC,string sSay)
|
|
{ // PURPOSE: send message to team leader
|
|
object oMod=GetModule();
|
|
string sID=GetLocalString(oPC,"sTeamID");
|
|
object oLeader=GetLocalObject(oMod,"oTeamLead"+sID);
|
|
string sWords=GetStringRight(sSay,GetStringLength(sSay)-1);
|
|
sWords=ColorRGBString(sWords,6,4,4);
|
|
sWords=ColorRGBString("["+GetName(oPC)+"]: ",4,4,4)+sWords;
|
|
if (oLeader!=OBJECT_INVALID)
|
|
{
|
|
SendMessageToPC(oLeader,sWords);
|
|
AssignCommand(oLeader,fnSoundAlert("as_an_gull1"));
|
|
ChatJ_AddToJournal(oLeader,sWords);
|
|
}
|
|
} // fnSayLeader()
|
|
|
|
void fnSayTeam(object oPC,string sSay)
|
|
{ // PURPOSE: send message to team members
|
|
object oMod=GetModule();
|
|
string sID=GetLocalString(oPC,"sTeamID");
|
|
string sWords=GetStringRight(sSay,GetStringLength(sSay)-1);
|
|
object oOb;
|
|
sWords=ColorRGBString(sWords,6,6,6);
|
|
sWords=ColorRGBString("["+GetName(oPC)+"]: ",4,4,4)+sWords;
|
|
oOb=GetFirstPC();
|
|
while(oOb!=OBJECT_INVALID)
|
|
{ // look for team members
|
|
if (GetLocalString(oOb,"sTeamID")==sID)
|
|
{
|
|
SendMessageToPC(oOb,sWords);
|
|
ChatJ_AddToJournal(oOb,sWords);
|
|
}
|
|
oOb=GetNextPC();
|
|
} // look for team members
|
|
} // fnSayTeam()
|
|
|
|
void fnSaySquad(object oPC,string sSay)
|
|
{ // PURPOSE: Send a message to squad members
|
|
object oMod=GetModule();
|
|
string sID=GetLocalString(oPC,"sTeamID");
|
|
string sWords=GetStringRight(sSay,GetStringLength(sSay)-1);
|
|
object oOb;
|
|
int nSQN=GetLocalInt(oPC,"nSquadNum");
|
|
sWords=ColorRGBString(sWords,2,6,2);
|
|
sWords=ColorRGBString("["+GetName(oPC)+"]: ",4,4,4)+sWords;
|
|
oOb=GetFirstPC();
|
|
while(oOb!=OBJECT_INVALID)
|
|
{ // look for team members
|
|
if (GetLocalString(oOb,"sTeamID")==sID&&GetLocalInt(oOb,"nSquadNum")==nSQN)
|
|
{
|
|
AssignCommand(oOb,fnSoundAlert("as_an_woodpeckr1"));
|
|
SendMessageToPC(oOb,sWords);
|
|
ChatJ_AddToJournal(oOb,sWords);
|
|
}
|
|
oOb=GetNextPC();
|
|
} // look for team members
|
|
} // fnSaySquad()
|
|
|
|
void fnListHelp(object oPC)
|
|
{ // PURPOSE: display help
|
|
SendMessageToPC(oPC,"+------------------------+");
|
|
SendMessageToPC(oPC,"| Spoken Commands Help |");
|
|
SendMessageToPC(oPC,"+------------------------+");
|
|
SendMessageToPC(oPC,"list help = this help");
|
|
SendMessageToPC(oPC,"'<what you want to say> = will output text even if spoken into the DM channel.");
|
|
SendMessageToPC(oPC,"]<what you want to say> = will send message to DM.");
|
|
SendMessageToPC(oPC,"@<what you want to say> = will send message to the team leader.");
|
|
SendMessageToPC(oPC,"!<what you want to say> = will send message to the squad you are assigned to.");
|
|
SendMessageToPC(oPC,"?<what you want to say> = will send message to all your team members.");
|
|
SendMessageToPC(oPC,":<type> <notes you wish to add> = will write a debug message to log file.");
|
|
SendMessageToPC(oPC," Types are: placeable, transition, creature, and other.");
|
|
SendMessageToPC(oPC,"+------------------------+");
|
|
SendMessageToPC(oPC,"| Roleplaying Commands |");
|
|
SendMessageToPC(oPC,"+------------------------+");
|
|
SendMessageToPC(oPC,"VOICECHAT # = will play that voice chat # for your character.");
|
|
SendMessageToPC(oPC,"ANIM #/# = will cause PC to play animation # for # seconds.");
|
|
SendMessageToPC(oPC,"+------------------------+");
|
|
SendMessageToPC(oPC,"| Vampire Commands |");
|
|
SendMessageToPC(oPC,"+------------------------+");
|
|
SendMessageToPC(oPC,"VAMPIRE command = If the PC is a vampire they can access some of");
|
|
SendMessageToPC(oPC," COMMAND The vampire commands using spoken commands.");
|
|
SendMessageToPC(oPC," level = How much blood and vampire XP do I have?");
|
|
SendMessageToPC(oPC," wolf = costs 40 blood to shape change into a wolf");
|
|
SendMessageToPC(oPC," dire = costs 60 blood to shape change into a dire wolf");
|
|
SendMessageToPC(oPC," bury = bury yourself in the ground to protect from sunlight");
|
|
SendMessageToPC(oPC," children = costs 20 blood and summons children of the night");
|
|
SendMessageToPC(oPC," heal5 = costs 1 blood and heals the PC 5 points");
|
|
SendMessageToPC(oPC," heal25 = costs 5 blood and heals the PC 25 points");
|
|
SendMessageToPC(oPC," coffin = places your coffin here. Can only be used once!");
|
|
SendMessageToPC(oPC," stun = attempts to stun nearest neutral or enemy target");
|
|
SendMessageToPC(oPC," feed = attempts to feed upon nearest neutral or enemy target");
|
|
SendMessageToPC(oPC,"=============================");
|
|
SendMessageToPC(oPC,"list commands = list of troop commands");
|
|
SendMessageToPC(oPC,"list leader = list of team leader specific commands");
|
|
SendMessageToPC(oPC,"=============================");
|
|
} // fnListHelp()
|
|
|
|
void fnListCmd(object oPC)
|
|
{ // PURPOSE: To list troop related commands
|
|
SendMessageToPC(oPC,"+------------------------+");
|
|
SendMessageToPC(oPC,"| Spoken Commands Help |");
|
|
SendMessageToPC(oPC,"+------------------------+");
|
|
SendMessageToPC(oPC,"list help = list other types of commands");
|
|
SendMessageToPC(oPC,"--------------------------");
|
|
SendMessageToPC(oPC,"Troops, <command> = issue command to troops within range");
|
|
SendMessageToPC(oPC,"Troop, <troop name>: <command> = issue command to specific troop in range");
|
|
SendMessageToPC(oPC,"Settings <command> = set the settings for spoken commands");
|
|
SendMessageToPC(oPC,"More info on the above can be had by typing. list troops, list troop, or list settings.");
|
|
SendMessageToPC(oPC,"=============================");
|
|
} // fnListCmd()
|
|
|
|
void fnListTroops(object oPC)
|
|
{ // PURPOSE: Troops commands
|
|
SendMessageToPC(oPC,"[==== Troops, <commmand> ====]");
|
|
SendMessageToPC(oPC,"COMMANDS:");
|
|
SendMessageToPC(oPC," Follow <distance> = follow me distance 3 or 7");
|
|
SendMessageToPC(oPC," Recon <distance> = recon in front of me 3 or 7");
|
|
SendMessageToPC(oPC," Guard Lair = Go into guard lair mode");
|
|
SendMessageToPC(oPC," Stop = abort any existing commands");
|
|
SendMessageToPC(oPC," Guard Mana = Guard Mana Vault");
|
|
SendMessageToPC(oPC," Guard Throne = Guard Throne Room");
|
|
SendMessageToPC(oPC," Guard Here = Guard where you stand");
|
|
SendMessageToPC(oPC," Raid <team> = Go on an attack raid against team");
|
|
SendMessageToPC(oPC," Capture Control = Capture control points");
|
|
SendMessageToPC(oPC," Roam = Roam mode");
|
|
SendMessageToPC(oPC," Power Reservoir = puts them on power reservoir recovery");
|
|
SendMessageToPC(oPC," Run = tell the unit to run");
|
|
SendMessageToPC(oPC," Walk = tell the unit to walk");
|
|
SendMessageToPC(oPC," Tactics <tactic> = will set the troops to the specific combat");
|
|
SendMessageToPC(oPC," AI tactic. TACTICS ARE: Melee, Ranged, Stealth,");
|
|
SendMessageToPC(oPC," Flee, Hold, Support, Summon, Caster, and Bioware.");
|
|
} // fnListTroops()
|
|
|
|
void fnListSettings(object oPC)
|
|
{ // PURPOSE: To list settings
|
|
SendMessageToPC(oPC,"[==== Settings <command> ====]");
|
|
SendMessageToPC(oPC,"COMMANDS:");
|
|
SendMessageToPC(oPC," range <1-30> = how many meters people should listen to you");
|
|
SendMessageToPC(oPC," number <1-40>= how many units maximum should respond to you");
|
|
SendMessageToPC(oPC,"[==== Current Settings ====]");
|
|
SendMessageToPC(oPC,"Range: "+IntToString(GetLocalInt(oPC,"nVoiceRange")));
|
|
SendMessageToPC(oPC,"Number: "+IntToString(GetLocalInt(oPC,"nVoiceNumber")));
|
|
} // fnListSettings()
|
|
|
|
void fnListTroop(object oPC)
|
|
{ // PURPOSE: To list individual troop commands
|
|
SendMessageToPC(oPC,"[==== Troop, <name>: <command> ====]");
|
|
SendMessageToPC(oPC,"COMMANDS:");
|
|
SendMessageToPC(oPC," Follow <distance> = follow me distance 3 or 7");
|
|
SendMessageToPC(oPC," Recon <distance> = recon in front of me 3 or 7");
|
|
SendMessageToPC(oPC," Guard Lair = Go into guard lair mode");
|
|
SendMessageToPC(oPC," Stop = abort any existing commands");
|
|
SendMessageToPC(oPC," Guard Mana = Guard Mana Vault");
|
|
SendMessageToPC(oPC," Guard Throne = Guard Throne Room");
|
|
SendMessageToPC(oPC," Guard Here = Guard where you stand");
|
|
SendMessageToPC(oPC," Raid <team> = Go on an attack raid against team");
|
|
SendMessageToPC(oPC," Capture Control = Capture control points");
|
|
SendMessageToPC(oPC," Roam = Roam mode");
|
|
SendMessageToPC(oPC," Power Reservoir = puts them on power reservoir recovery");
|
|
SendMessageToPC(oPC," Run = tell the unit to run");
|
|
SendMessageToPC(oPC," Walk = tell the unit to walk");
|
|
SendMessageToPC(oPC," Tactics <tactic> = will set the troops to the specific combat");
|
|
SendMessageToPC(oPC," AI tactic. TACTICS ARE: Melee, Ranged, Stealth,");
|
|
SendMessageToPC(oPC," Flee, Hold, Support, Summon, Caster, and Bioware.");
|
|
} // fnListTroop()
|
|
|
|
|
|
void fnListLeader(object oPC)
|
|
{ // PURPOSE: To list leader specific commands
|
|
SendMessageToPC(oPC,"[==== List of Commands only useable by Leader ====]");
|
|
SendMessageToPC(oPC,"MESSAGE <TEAM> <Message to send> = Dispatch a messenger with the message to specified team");
|
|
SendMessageToPC(oPC," Teams: dwarves, unclean, undead, and spiders");
|
|
SendMessageToPC(oPC,"CLEAN = Will clean clutter in lair instantly [costs 50 mana]");
|
|
SendMessageToPC(oPC,"SUMMON <Degree> = summons units to the leader in the lair in an emergency. Can only be use in lair.");
|
|
SendMessageToPC(oPC," Degree: Minor [costs 100 mana], Medium [costs 200 mana], Major [costs 300 mana]");
|
|
SendMessageToPC(oPC," This will summon 2 Units that follow the leader, and 8 Units on Guard Lair. All of these");
|
|
SendMessageToPC(oPC," Units will despawn in 4 minutes. These are emergency units. They are short lived but powerful.");
|
|
} // fnListLeader()
|
|
|
|
|
|
void fnVoiceChat(object oPC,string sMaster)
|
|
{ // PURPOSE: play voice chat #
|
|
string sChat=GetStringRight(sMaster,GetStringLength(sMaster)-10);
|
|
int nVC=StringToInt(sChat);
|
|
PlayVoiceChat(nVC,oPC);
|
|
} // fnVoiceChat()
|
|
|
|
void fnAnimate(object oPC,string sMaster)
|
|
{ // PURPOSE: Give PCs access to all animations for role playing purposes
|
|
string sFull=sMaster;
|
|
string sParse;
|
|
int nAnim;
|
|
int nDur;
|
|
sFull=GetStringRight(sFull,GetStringLength(sFull)-5);
|
|
sParse=fnParse(sFull,"/");
|
|
sFull=fnRemoveParsed(sFull,sParse,"/");
|
|
nAnim=StringToInt(sParse);
|
|
nDur=StringToInt(sFull);
|
|
AssignCommand(oPC,ActionPlayAnimation(nAnim,1.0,IntToFloat(nDur)));
|
|
} // fnAnimate()
|
|
|
|
void fnVampire(object oPC,string sMaster)
|
|
{ // PURPOSE: to handle spoken vampire commands
|
|
string sFull=sMaster;
|
|
int nN;
|
|
object oOb;
|
|
object oNeutral;
|
|
object oEnemy;
|
|
int nRace;
|
|
object oC;
|
|
int nBlood=GetLocalInt(oPC,"nBloodPool");
|
|
string sS;
|
|
int nXP=GetLocalInt(oPC,"nVampireXP");
|
|
sFull=GetStringRight(sFull,GetStringLength(sFull)-8);
|
|
if (sFull=="level")
|
|
{ // provide level information
|
|
SendMessageToPC(oPC," VAMPIRE XP:"+IntToString(nXP)+" BLOOD:"+IntToString(nBlood));
|
|
} // provide level information
|
|
else if (sFull=="wolf")
|
|
{ // wolf shape
|
|
if (nBlood>39)
|
|
{ // enough blood
|
|
ExecuteScript("vamp_act_wolf",oPC);
|
|
} // enough blood
|
|
else
|
|
{ // not enough blood
|
|
SendMessageToPC(oPC,"You do not have enough blood to use that power. You must feed!");
|
|
} // not enough blood
|
|
} // wolf shape
|
|
else if (sFull=="dire")
|
|
{ // dire wolf shape
|
|
if (nBlood>59)
|
|
{ // enough blood
|
|
ExecuteScript("vamp_act_dwolf",oPC);
|
|
} // enough blood
|
|
else
|
|
{ // not enough blood
|
|
SendMessageToPC(oPC,"You do not have enough blood to use that power. You must feed!");
|
|
} // not enough blood
|
|
} // dire wolf shape
|
|
else if (sFull=="bury")
|
|
{ // bury in ground
|
|
ExecuteScript("vamp_act_bury",oPC);
|
|
} // bury in ground
|
|
else if (sFull=="children")
|
|
{ // children of the night
|
|
if (nBlood>19)
|
|
{ // enough blood
|
|
ExecuteScript("vamp_act_summon",oPC);
|
|
} // enough blood
|
|
else
|
|
{ // not enough blood
|
|
SendMessageToPC(oPC,"You do not have enough blood to use that power. You must feed!");
|
|
} // not enough blood
|
|
} // children of the night
|
|
else if (sFull=="heal5")
|
|
{ // heal 5 points
|
|
if (nBlood>0)
|
|
{ // enough blood
|
|
ExecuteScript("vamp_act_heal5",oPC);
|
|
} // enough blood
|
|
else
|
|
{ // not enough blood
|
|
SendMessageToPC(oPC,"You do not have enough blood to use that power. You must feed!");
|
|
} // not enough blood
|
|
} // heal 5 points
|
|
else if (sFull=="heal25")
|
|
{ // heal 25 points
|
|
if (nBlood>4)
|
|
{ // enough blood
|
|
ExecuteScript("vamp_act_heal25",oPC);
|
|
} // enough blood
|
|
else
|
|
{ // not enough blood
|
|
SendMessageToPC(oPC,"You do not have enough blood to use that power. You must feed!");
|
|
} // not enough blood
|
|
} // heal 25 points
|
|
else if (sFull=="coffin")
|
|
{ // place coffin
|
|
if (GetLocalInt(oPC,"nCoffinPlaced")==FALSE)
|
|
{ // place coffin
|
|
ExecuteScript("vamp_place_coffi",oPC);
|
|
} // place coffin
|
|
else
|
|
{ // already placed
|
|
SendMessageToPC(oPC,"You already placed the coffin and are only permitted to do so once.");
|
|
} // already placed
|
|
} // place coffin
|
|
else if (sFull=="stun")
|
|
{ // stun nearest neutral or enemy
|
|
nN=1;
|
|
oOb=OBJECT_INVALID;
|
|
oNeutral=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_NEUTRAL,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN);
|
|
while(oNeutral!=OBJECT_INVALID&&oOb==OBJECT_INVALID)
|
|
{ // check all nearby neutrals
|
|
if (GetCreatureSize(oNeutral)<=GetCreatureSize(oPC)) oOb=oNeutral;
|
|
nN++;
|
|
oNeutral=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_NEUTRAL,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN);
|
|
} // check all nearby neutrals
|
|
nN++;
|
|
oEnemy=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN);
|
|
while(oEnemy!=OBJECT_INVALID)
|
|
{ // check all nearby neutrals
|
|
oC=OBJECT_INVALID;
|
|
if (GetCreatureSize(oEnemy)<=GetCreatureSize(oPC)) oC=oEnemy;
|
|
if (oC!=OBJECT_INVALID)
|
|
{ // possible target
|
|
if (oOb==OBJECT_INVALID||GetDistanceBetween(oOb,oPC)>GetDistanceBetween(oC,oPC)) oOb=oC;
|
|
} // possible target
|
|
nN++;
|
|
oEnemy=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN);
|
|
} // check all nearby neutrals
|
|
if (oOb!=OBJECT_INVALID)
|
|
{ // target found
|
|
SetLocalObject(oPC,"oTarget",oOb);
|
|
ExecuteScript("vamp_act_stun",oPC);
|
|
} // target found
|
|
else
|
|
{ // no good targets
|
|
SendMessageToPC(oPC,"No suitable neutral or enemy targets are nearby.");
|
|
} // no good targets
|
|
} // stun nearest neutral or enemy
|
|
else if (sFull=="feed")
|
|
{ // feed upon nearby enemy or neutral
|
|
nN=1;
|
|
oOb=OBJECT_INVALID;
|
|
oNeutral=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_NEUTRAL,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN);
|
|
while(oNeutral!=OBJECT_INVALID&&oOb==OBJECT_INVALID)
|
|
{ // check all nearby neutrals
|
|
nRace=MyPRCGetRacialType(oNeutral);
|
|
if (GetIsPC(oNeutral)&&GetLocalInt(oNeutral,"nIsVampire")==FALSE) oOb=oNeutral;
|
|
else if (nRace==RACIAL_TYPE_DWARF||nRace==RACIAL_TYPE_GNOME||nRace==RACIAL_TYPE_HALFLING) oOb=oNeutral;
|
|
else if (nRace==RACIAL_TYPE_GIANT||nRace==RACIAL_TYPE_HALFELF||nRace==RACIAL_TYPE_HALFORC) oOb=oNeutral;
|
|
else if (nRace==RACIAL_TYPE_HUMAN||nRace==RACIAL_TYPE_HUMANOID_GOBLINOID) oOb=oNeutral;
|
|
else if (nRace==RACIAL_TYPE_HUMANOID_ORC||nRace==RACIAL_TYPE_FEY||nRace==RACIAL_TYPE_ELF) oOb=oNeutral;
|
|
nN++;
|
|
oNeutral=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_NEUTRAL,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN);
|
|
} // check all nearby neutrals
|
|
nN++;
|
|
oEnemy=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN);
|
|
while(oEnemy!=OBJECT_INVALID)
|
|
{ // check all nearby neutrals
|
|
nRace=MyPRCGetRacialType(oEnemy);
|
|
oC=OBJECT_INVALID;
|
|
if (GetIsPC(oNeutral)&&GetLocalInt(oNeutral,"nIsVampire")==FALSE) oC=oEnemy;
|
|
else if (nRace==RACIAL_TYPE_DWARF||nRace==RACIAL_TYPE_GNOME||nRace==RACIAL_TYPE_HALFLING) oC=oEnemy;
|
|
else if (nRace==RACIAL_TYPE_GIANT||nRace==RACIAL_TYPE_HALFELF||nRace==RACIAL_TYPE_HALFORC) oC=oEnemy;
|
|
else if (nRace==RACIAL_TYPE_HUMAN||nRace==RACIAL_TYPE_HUMANOID_GOBLINOID) oC=oEnemy;
|
|
else if (nRace==RACIAL_TYPE_HUMANOID_ORC||nRace==RACIAL_TYPE_FEY||nRace==RACIAL_TYPE_ELF) oC=oEnemy;
|
|
if (oC!=OBJECT_INVALID)
|
|
{ // possible target
|
|
if (oOb==OBJECT_INVALID||GetDistanceBetween(oOb,oPC)>GetDistanceBetween(oC,oPC)) oOb=oC;
|
|
} // possible target
|
|
nN++;
|
|
oEnemy=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN);
|
|
} // check all nearby neutrals
|
|
if (oOb!=OBJECT_INVALID)
|
|
{ // target found
|
|
SetLocalObject(oPC,"oTarget",oOb);
|
|
ExecuteScript("vamp_act_drink",oPC);
|
|
} // target found
|
|
else
|
|
{ // no good targets
|
|
SendMessageToPC(oPC,"No suitable neutral or enemy targets are nearby.");
|
|
} // no good targets
|
|
} // feed upon nearby enemy or neutral
|
|
} // fnVampire()
|
|
|
|
void fnDetonateSeed(object oSeed)
|
|
{ // PURPOSE: This holly berry bomb must now explode
|
|
object oPC=GetLocalObject(oSeed,"oOwner");
|
|
int nLevel=GetLocalInt(oSeed,"nLevel");
|
|
location lLoc=GetLocation(oSeed);
|
|
int nN;
|
|
int nDmg;
|
|
effect eE;
|
|
object oOb;
|
|
int nEL=nLevel;
|
|
int nRoll;
|
|
int nDC;
|
|
if (nEL>20) nEL=20;
|
|
DestroyObject(oSeed);
|
|
nDC=10+nLevel;
|
|
eE=EffectVisualEffect(VFX_FNF_FIREBALL);
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eE,lLoc);
|
|
nN=1;
|
|
oOb=GetNearestCreatureToLocation(CREATURE_TYPE_IS_ALIVE,TRUE,lLoc,nN);
|
|
while(oOb!=OBJECT_INVALID&&GetDistanceBetweenLocations(lLoc,GetLocation(oOb))<=5.0)
|
|
{ // in range
|
|
nRoll=d20()+GetReflexSavingThrow(oOb);
|
|
if (nRoll>=nDC)
|
|
{ // saved
|
|
nDmg=d8(nEL);
|
|
nDmg=nDmg/2;
|
|
eE=EffectDamage(nDmg,DAMAGE_TYPE_FIRE);
|
|
AssignCommand(oPC,ApplyEffectToObject(DURATION_TYPE_INSTANT,eE,oOb));
|
|
nDmg=nEL/2;
|
|
eE=EffectDamage(nDmg,DAMAGE_TYPE_BLUDGEONING);
|
|
AssignCommand(oPC,ApplyEffectToObject(DURATION_TYPE_INSTANT,eE,oOb));
|
|
} // saved
|
|
else
|
|
{ // no-save
|
|
nDmg=d8(nEL);
|
|
eE=EffectDamage(nDmg,DAMAGE_TYPE_FIRE);
|
|
AssignCommand(oPC,ApplyEffectToObject(DURATION_TYPE_INSTANT,eE,oOb));
|
|
eE=EffectDamage(nEL,DAMAGE_TYPE_BLUDGEONING);
|
|
AssignCommand(oPC,ApplyEffectToObject(DURATION_TYPE_INSTANT,eE,oOb));
|
|
} // no-save
|
|
nN++;
|
|
oOb=GetNearestCreatureToLocation(CREATURE_TYPE_IS_ALIVE,TRUE,lLoc,nN);
|
|
} // in range
|
|
} // fnDetonateSeed()
|
|
|
|
void fnFireSeedDetonate(object oPC)
|
|
{ // PURPOSE: Detonate any placed holly berry bombs
|
|
int nN;
|
|
object oHB;
|
|
nN=1;
|
|
oHB=GetNearestObjectByTag("wazoo_pl_hbb",oPC,nN);
|
|
while(oHB!=OBJECT_INVALID&&GetDistanceBetween(oPC,oHB)<=90.0)
|
|
{ // holly berries in range
|
|
if (GetLocalObject(oHB,"oOwner")==oPC) DelayCommand(0.2,fnDetonateSeed(oHB));
|
|
nN++;
|
|
oHB=GetNearestObjectByTag("wazoo_pl_hbb",oPC,nN);
|
|
} // holly berries in range
|
|
} // fnFireSeedDetonate()
|
|
|
|
|
|
void fnHandleCommands(object oMe,object oPC,string sCmd)
|
|
{ // PURPOSE: Do the parsing and handle the commands
|
|
string sMaster=GetStringLowerCase(sCmd);
|
|
string sParse;
|
|
if (sMaster=="list help") fnListHelp(oPC);
|
|
else if (sMaster=="list") SendMessageToPC(oPC,"TRY: list help, or list commands");
|
|
else if (sMaster=="list commands") fnListCmd(oPC);
|
|
else if (GetStringLeft(sMaster,1)=="'") fnSay(oPC,sCmd);
|
|
else if (GetStringLeft(sMaster,7)=="troops,") fnTroopsCommand(oPC,sMaster);
|
|
else if (GetStringLeft(sMaster,6)=="troop,") fnSpecificTroop(oPC,sMaster);
|
|
else if (GetStringLeft(sMaster,8)=="settings") fnSettings(oPC,sMaster);
|
|
else if (sMaster=="list troops") fnListTroops(oPC);
|
|
else if (sMaster=="list troop") fnListTroop(oPC);
|
|
else if (sMaster=="list settings") fnListSettings(oPC);
|
|
else if (GetStringLeft(sMaster,1)=="]") fnSayDM(oPC,sCmd);
|
|
else if (GetStringLeft(sMaster,1)=="@") fnSayLeader(oPC,sCmd);
|
|
else if (GetStringLeft(sMaster,1)=="?") fnSayTeam(oPC,sCmd);
|
|
else if (GetStringLeft(sMaster,1)=="!") fnSaySquad(oPC,sCmd);
|
|
else if (GetStringLeft(sMaster,10)=="voicechat ") fnVoiceChat(oPC,sMaster);
|
|
else if (GetStringLeft(sMaster,5)=="anim ") fnAnimate(oPC,sMaster);
|
|
else if (GetStringLeft(sMaster,8)=="vampire "&&GetLocalInt(oPC,"nIsVampire")==TRUE) fnVampire(oPC,sMaster);
|
|
else if (sMaster==sHOLLY_BERRY_WORD) fnFireSeedDetonate(oPC);
|
|
} // fnHandleCommands()
|
|
|
|
|
|
void fnDebugThis(object oPC,string sMsg)
|
|
{ // PURPOSE: Save a debug Message to the Log
|
|
PrintString("[]-[]-[]-BEGIN-[]-[]");
|
|
PrintString(" "+sMsg);
|
|
PrintString("--------------------");
|
|
string sS;
|
|
object oOb;
|
|
int nN;
|
|
float fF;
|
|
vector vVec;
|
|
sS=" GAME TIME: "+IntToString(GetTimeHour())+" Hour, "+IntToString(GetCalendarDay())+" Day, ";
|
|
sS=sS+IntToString(GetCalendarMonth())+" Month, "+IntToString(GetCalendarYear())+" Version:"+GetLocalString(GetModule(),"sVersion");
|
|
PrintString(sS);
|
|
sS=" LOCATION: "+GetName(GetArea(oPC))+" Tag("+GetTag(GetArea(oPC))+") Coordinates: ";
|
|
vVec=GetPosition(oPC);
|
|
sS=sS+FloatToString(vVec.x)+" X, "+FloatToString(vVec.y)+" Y, "+FloatToString(vVec.z)+" Z FACING:";
|
|
sS=sS+FloatToString(GetFacing(oPC));
|
|
PrintString(sS);
|
|
sS=" TeamID:"+GetLocalString(oPC,"sTeamID")+" PC Name:"+GetName(oPC)+" Level:";
|
|
sS=sS+IntToString(GetLevelByPosition(1,oPC)+GetLevelByPosition(2,oPC)+GetLevelByPosition(3,oPC));
|
|
PrintString(sS);
|
|
PrintString("--------------------");
|
|
sS=" ASSOCIATES:";
|
|
oOb=GetAssociate(ASSOCIATE_TYPE_FAMILIAR,oPC,1);
|
|
if (GetIsObjectValid(oOb)) sS=sS+" Familiar("+GetName(oOb)+" Tag:"+GetTag(oOb)+" RR:"+GetResRef(oOb)+", ";
|
|
oOb=GetAssociate(ASSOCIATE_TYPE_ANIMALCOMPANION,oPC,1);
|
|
if (GetIsObjectValid(oOb)) sS=sS+" Animal Companion("+GetName(oOb)+" Tag:"+GetTag(oOb)+" RR:"+GetResRef(oOb)+", ";
|
|
nN=1;
|
|
oOb=GetAssociate(ASSOCIATE_TYPE_DOMINATED,oPC,nN);
|
|
while(GetIsObjectValid(oOb))
|
|
{ // Dominated
|
|
if (GetIsObjectValid(oOb)) sS=sS+" Dominated("+GetName(oOb)+" Tag:"+GetTag(oOb)+" RR:"+GetResRef(oOb)+", ";
|
|
nN++;
|
|
oOb=GetAssociate(ASSOCIATE_TYPE_DOMINATED,oPC,nN);
|
|
} // Dominated
|
|
nN=1;
|
|
oOb=GetAssociate(ASSOCIATE_TYPE_HENCHMAN,oPC,nN);
|
|
while(GetIsObjectValid(oOb))
|
|
{ // Henchmen
|
|
if (GetIsObjectValid(oOb)) sS=sS+" Henchman("+GetName(oOb)+" Tag:"+GetTag(oOb)+" RR:"+GetResRef(oOb)+", ";
|
|
nN++;
|
|
oOb=GetAssociate(ASSOCIATE_TYPE_HENCHMAN,oPC,nN);
|
|
} // Henchmen
|
|
nN=1;
|
|
oOb=GetAssociate(ASSOCIATE_TYPE_SUMMONED,oPC,nN);
|
|
while(GetIsObjectValid(oOb))
|
|
{ // Summoned
|
|
if (GetIsObjectValid(oOb)) sS=sS+" Summoned("+GetName(oOb)+" Tag:"+GetTag(oOb)+" RR:"+GetResRef(oOb)+", ";
|
|
nN++;
|
|
oOb=GetAssociate(ASSOCIATE_TYPE_SUMMONED,oPC,nN);
|
|
} // Summoned
|
|
sS=sS+" END.";
|
|
PrintString(sS);
|
|
sS=" NEAREST NON-ASSOCIATE:";
|
|
nN=1;
|
|
oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN);
|
|
while(GetIsObjectValid(oOb))
|
|
{ // find nearest non associate
|
|
if (GetAssociateType(oOb)==ASSOCIATE_TYPE_NONE)
|
|
{ // found
|
|
sS=sS+" Name:"+GetName(oOb)+" Tag:"+GetTag(oOb)+" RR:"+GetResRef(oOb)+" Distance:"+FloatToString(GetDistanceBetween(oPC,oOb));
|
|
oOb=OBJECT_INVALID;
|
|
} // found
|
|
else
|
|
{ // continue
|
|
nN++;
|
|
oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,nN);
|
|
} // continue
|
|
} // find nearest non associate
|
|
PrintString(sS);
|
|
sS=" NEAREST ENEMY:";
|
|
oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,1,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_ENEMY);
|
|
if (GetIsObjectValid(oOb)) sS=sS+" Name:"+GetName(oOb)+" Tag:"+GetTag(oOb)+" RR:"+GetResRef(oOb)+" Distance:"+FloatToString(GetDistanceBetween(oPC,oOb));
|
|
PrintString(sS);
|
|
sS=" NEAREST NEUTRAL:";
|
|
oOb=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oPC,1,CREATURE_TYPE_REPUTATION,REPUTATION_TYPE_NEUTRAL);
|
|
if (GetIsObjectValid(oOb)) sS=sS+" Name:"+GetName(oOb)+" Tag:"+GetTag(oOb)+" RR:"+GetResRef(oOb)+" Distance:"+FloatToString(GetDistanceBetween(oPC,oOb));
|
|
PrintString(sS);
|
|
sS=" NEAREST WAYPOINT:";
|
|
oOb=GetNearestObject(OBJECT_TYPE_WAYPOINT,oPC,1);
|
|
if (GetIsObjectValid(oOb)) sS=sS+" Name:"+GetName(oOb)+" Tag:"+GetTag(oOb)+" RR:"+GetResRef(oOb)+" Distance:"+FloatToString(GetDistanceBetween(oPC,oOb));
|
|
PrintString(sS);
|
|
sS=" NEAREST PLACEABLE:";
|
|
oOb=GetNearestObject(OBJECT_TYPE_PLACEABLE,oPC,1);
|
|
if (GetIsObjectValid(oOb)) sS=sS+" Name:"+GetName(oOb)+" Tag:"+GetTag(oOb)+" RR:"+GetResRef(oOb)+" Distance:"+FloatToString(GetDistanceBetween(oPC,oOb));
|
|
PrintString(sS);
|
|
sS=" NEAREST DOOR:";
|
|
oOb=GetNearestObject(OBJECT_TYPE_DOOR,oPC,1);
|
|
if (GetIsObjectValid(oOb)) sS=sS+" Name:"+GetName(oOb)+" Tag:"+GetTag(oOb)+" RR:"+GetResRef(oOb)+" Distance:"+FloatToString(GetDistanceBetween(oPC,oOb));
|
|
PrintString(sS);
|
|
sS=" NEAREST ITEM:";
|
|
oOb=GetNearestObject(OBJECT_TYPE_ITEM,oPC,1);
|
|
if (GetIsObjectValid(oOb)) sS=sS+" Name:"+GetName(oOb)+" Tag:"+GetTag(oOb)+" RR:"+GetResRef(oOb)+" Distance:"+FloatToString(GetDistanceBetween(oPC,oOb));
|
|
PrintString(sS);
|
|
sS=" NEAREST TRIGGER:";
|
|
oOb=GetNearestObject(OBJECT_TYPE_TRIGGER,oPC,1);
|
|
if (GetIsObjectValid(oOb)) sS=sS+" Name:"+GetName(oOb)+" Tag:"+GetTag(oOb)+" RR:"+GetResRef(oOb)+" Distance:"+FloatToString(GetDistanceBetween(oPC,oOb));
|
|
PrintString(sS);
|
|
PrintString("[]-[]-[]-END---[]-[]");
|
|
SendMessageToPC(oPC,"A Bug message has been written to the Log file. Please read the log file and copy and paste the information in the bug report into any email, or mantis bug report.");
|
|
} // fnDebug()
|
|
|
|
|
|
|