HoS_PRC8/_mod/_module/nss/npcact_interp.nss
Jaysyn904 e2f4ba74d5 Merged redundant hak files
Merged redundant hak files.  Moved hak scripts into module.  Updated gitignore.  Full Compile.  Added release folder & archive.
2024-12-12 15:02:17 -05:00

738 lines
32 KiB
Plaintext

////////////////////////////////////////////////////////////////////////////////
// npcact_interp - NPC ACTIVITIES 6.0 Full version Interpretter
//------------------------------------------------------------------------------
// By Deva Bryson Winblood 04/30/2004
//------------------------------------------------------------------------------
// Last Modified By: Deva Bryson Winblood
// Last Modified Date: 06/03/2004
////////////////////////////////////////////////////////////////////////////////
#include "npcactivitiesh"
#include "npcact_h_cust" // customization
#include "npcact_h_core" // core commands
#include "npcact_h_logic" // logic commands
#include "npcact_h_make" // creation commands
#include "npcact_h_var" // variable initialization and setting commands
#include "npcact_h_vfx" // visual effect commands
#include "npcact_h_speak" // Speaking and singing related commands
#include "npcact_ho_core" // Core commands for FULL interpreter
/////////////////////////
// PROTOTYPES
/////////////////////////
void fnDoPauseThenEnd();
///////////////////////////////////////////////////////////////////////// MAIN
void main()
{
object oMe=OBJECT_SELF;
string sAct=GetLocalString(oMe,"sAct");
float fDelay=0.2; // default delay
string sCommand=fnParse(sAct);
string sL1=GetStringLeft(sAct,1);
string sL2=GetStringLeft(sAct,2);
string sL3=GetStringLeft(sAct,3);
string sL4=GetStringLeft(sAct,4);
string sS;
int nR;
int nGNBDisabled=GetLocalInt(oMe,"nGNBDisabled");
effect eE;
fnDebug(GetTag(oMe)+" FULL INTERPRETER ("+sCommand+")",TRUE);
if (nGNBDisabled!=TRUE&&fnGetIsBusy(oMe)==FALSE&&GetStringLength(sAct)>0)
{ // okay to deal with commands
fnDebug(" sAct Before='"+sAct+"' LEN:"+IntToString(GetStringLength(sAct)),TRUE);
sAct=fnRemoveParsed(sAct,sCommand);
fnDebug(" sAct After='"+sAct+"' LEN:"+IntToString(GetStringLength(sAct)),TRUE);
SetLocalString(oMe,"sAct",sAct);
SetLocalInt(oMe,"nGNBInterpActivity",0); // used as fail safe
/// begin the big if/else if
if (sL1=="@")
{ // custom script
fnDebug("["+GetTag(oMe)+"]Custom Script("+sCommand+")",TRUE);
fDelay=fnNPCACTAtScript(sCommand);
} // custom script
else if (sL1=="'")
{ // Quick speak
fDelay=0.1;
AssignCommand(oMe,SpeakString(GetStringRight(sCommand,GetStringLength(sCommand)-1)));
} // Quick Speak
else if (sL1=="#")
{ // library call
fnDebug("["+GetTag(oMe)+"]Library Call("+sCommand+")",TRUE);
fDelay=fnNPCACTLibCall(sCommand);
} // library call
else if (sL1=="*")
{ // professions call
fnDebug("["+GetTag(oMe)+"]Professions Call("+sCommand+")",TRUE);
fDelay=fnNPCACTProfCall(sCommand);
} // professions call
else if (sL1=="&")
{ // IF logic
fDelay=fnNPCACTLogicCore(sCommand);
} // IF logic
else if (sL1=="!")
{ // Set variable
fDelay=fnNPCACTSetVariable(sCommand);
} // Set variable
else if (sL1=="+"||sL1=="-")
{ // variable addition and subtraction
fDelay=fnNPCACTAddSubtract(sCommand);
} // variable addition and subtraction
else if (sL1=="$")
{ // custom event script assign
fDelay=fnNPCACTScriptSet(sCommand);
} // custom event script assign
else if (sL1=="^")
{ // non-visual effect
fDelay=fnNPCACTNonVFX(sCommand);
} // non-visual effect
else if (sL1=="]")
{ // Set Appearance
fDelay=fnNPCACTSetAppearance(sCommand);
} // Set Appearance
else if (sL1=="[")
{ // Set Mode
fDelay=fnNPCACTModeSet(sCommand);
} // Set Mode
else if (sL1==">")
{ // Set timed event
fDelay=fnNPCACTInsertTimedEvent(sCommand);
} // Set timed event
else if (sL4=="ANIM")
{ // animation command
fDelay=fnNPCACTAnimate(sCommand);
} // animation command
else if (sL2=="TT")
{ // Talk to
fDelay=fnNPCACTTalkTo(sCommand);
} // Talk to
else if (sL3=="RWL"||(sL2=="RW"&&GetStringLength(sCommand)>2))
{ // random word list
fDelay=fnNPCACTRandomSpeak(sCommand);
} // random word list
else if (sL4=="LYRI"||sL2=="LY")
{ // sing song
fDelay=fnNPCACTLyrical(sCommand);
} // sing song
else if (sL2=="RC")
{ // random command
fDelay=fnNPCACTRandomCommand(sCommand);
} // random command
else if (sL2=="WP")
{ // set new destination
sCommand=GetStringRight(sCommand,GetStringLength(sCommand)-2);
SetLocalString(OBJECT_SELF,"sGNBDTag",sCommand);
} // set new destination
else if (sL1==":")
{ // create creature
fDelay=fnNPCACTMakeCreature(sCommand);
} // create creature
else if (sL2=="AO")
{ // attack object by tag
fDelay=fnNPCACTAttackObject(sCommand);
} // attack object by tag
else if (sL2=="CB")
{ // enter combat with person with specific tag
fDelay=fnNPCACTEnterCombat(sCommand);
} // enter combat with person with specific tag
else if (sL2=="Cc")
{ // change clothing
fDelay=fnNPCACTChangeClothes(sCommand);
} // change clothing
else if (sL2=="DO")
{ // Destroy Object by tag
fDelay=fnNPCACTDestroyObject(sCommand);
} // Destroy Object by tag
else if (sL2=="EQ")
{ // Equip Weapons
fDelay=fnNPCACTEquipWeapons();
} // Equip Weapons
else if (sL2=="UE")
{ // Unequip Weapons
fDelay=fnNPCACTUnequipWeapons();
} // Unequip Weapons
else if (sCommand=="REST"||sCommand=="RS")
{ // rest
fDelay=fnNPCACTRest();
} // rest
else if (sCommand=="SLEP"||sCommand=="SL")
{ // sleep
fDelay=fnNPCACTSleep();
} // sleep
else if (sL4=="SITS")
{ // sits
fDelay=fnNPCACTSitForSpecified(sCommand);
} // sits
else if (sL2=="CO"&&GetStringLength(sCommand)>2)
{ // create item
fDelay=fnNPCACTMakeItem(sCommand);
} // create item
else if (sL2=="CP")
{ // create placeable
fDelay=fnNPCACTMakePlaceable(sCommand);
} // create placeable
else if (sL4=="FOTG"||sL2=="FT")
{ // follow specific tag
fDelay=fnNPCACTFollowByTag(sCommand);
} // follow specific tag
else if (sCommand=="RAND"||sCommand=="RW")
{ // random walk
fDelay=fnNPCACTRandomWalk();
} // random walk
else if (sL4=="TAKE"||sL2=="TK")
{ // take item by tag
fDelay=fnNPCACTTakeItem(sCommand);
} // take item by tag
else if (sL4=="WAIT"||sL2=="WT")
{ // wait
fDelay=fnNPCACTWait(sCommand);
} // wait
else if (sL4=="SFAC"||sL2=="SF")
{ // Set Facing
fDelay=fnNPCACTSetFacing(sCommand);
} // Set Facing
else if (sCommand=="LOCK"||sCommand=="lk")
{ // lock doors or container
fDelay=fnNPCACTLockThings();
} // lock doors or container
else if (sCommand=="UNLOCK"||sCommand=="ul")
{ // unlock
fDelay=fnNPCACTUnlock();
} // unlock
else if (sCommand=="CLOS"||sCommand=="CD")
{ // close door
fDelay=fnNPCACTCloseDoors();
} // close door
else if (sL3=="LAG"||(sL1=="L"&&GetStringLength(sCommand)==2))
{ // lag commands
sL1=GetStringRight(sCommand,1);
if (sL1=="1") SetLocalInt(OBJECT_SELF,"nGNBLagMeth",1);
else if (sL1=="2") SetLocalInt(OBJECT_SELF,"nGNBLagMeth",2);
else if (sL1=="3") SetLocalInt(OBJECT_SELF,"nGNBLagMeth",3);
else if (sL1=="4") SetLocalInt(OBJECT_SELF,"nGNBLagMeth",4);
} // lag commands
else if (sCommand=="NONP"||sCommand=="NN")
{ // no NPC interaction
SetLocalInt(OBJECT_SELF,"nNN",TRUE);
fDelay=0.1;
} // no NPC interaction
else if (sCommand=="YSNP"||sCommand=="YN")
{ // yes NPC interaction
DeleteLocalInt(OBJECT_SELF,"nNN");
fDelay=0.1;
} // yes NPC interaction
else if (sL2=="BS")
{ // base script set
fDelay=fnNPCACTSetBaseScripts(sCommand);
} // base script set
else if (sL2=="BM")
{ // beam effect
fDelay=fnNPCACTBeamEffect(sCommand);
} // beam effect
else if (sL3=="EFF")
{ // Effect
fDelay=fnNPCACTEffects(sCommand);
} // Effect
else if (sL2=="FX")
{ // FX area
fDelay=fnNPCACTPlaceableVFX(sCommand);
} // FX area
else if (sL2=="PF")
{ // persistent visual effect
fDelay=fnNPCACTPersistentVFX(sCommand);
} // persistent visual effect
else if (sL2=="RV")
{ // remove visual effect
fDelay=fnNPCACT4Visual(0,sCommand);
} // remove visual effect
else if (sL2=="VF")
{ // add visual effect
fDelay=fnNPCACT4Visual(1,sCommand);
} // add visual effect
else if (sL2=="YP"||sL4=="YSPC")
{ // enable PC interaction
DeleteLocalInt(OBJECT_SELF,"bNPCACTNOPC");
} // enable PC interaction
else if (sL2=="NP"||sL4=="NOPC")
{ // disable PC interaction
SetLocalInt(OBJECT_SELF,"bNPCACTNOPC",TRUE);
} // disable PC interaction
else if (sCommand=="BORD"||sCommand=="BD")
{ // BORD Animation
fDelay=fnNPCACTAnimate("ANIM6/30");
} // BORD Animation
else if (sCommand=="BOW"||sCommand=="BW")
{ // BOW Animation
fDelay=fnNPCACTAnimate("ANIM1/20");
} // BOW Animation
else if (sCommand=="DRIN"||sCommand=="DR")
{ // DRINK Animation
fDelay=fnNPCACTAnimate("ANIM2/20");
} // DRINK Animation
else if (sCommand=="DRUN"||sCommand=="DK")
{ // DRUNK Animation
fDelay=fnNPCACTAnimate("ANIM22/60");
} // DRUNK Animation
else if (sCommand=="GRET"||sCommand=="GR")
{ // GRET Animation
fDelay=fnNPCACTAnimate("ANIM3/20");
} // GRET Animation
else if (sCommand=="GRET"||sCommand=="GR")
{ // GRET Animation
fDelay=fnNPCACTAnimate("ANIM3/20");
} // GRET Animation
else if (sCommand=="LIST"||sCommand=="LI")
{ // LIST Animation
fDelay=fnNPCACTAnimate("ANIM18/20");
} // LIST Animation
else if (sCommand=="LOOK"||sCommand=="LK")
{ // LOOK Animation
fDelay=fnNPCACTAnimate("ANIM19/30");
} // LOOK Animation
else if (sCommand=="LOW"||sCommand=="LW")
{ // LOW Animation
fDelay=fnNPCACTAnimate("ANIM16/60");
} // LOW Animation
else if (sCommand=="MEDI"||sCommand=="ME")
{ // MEDI Animation
fDelay=fnNPCACTAnimate("ANIM20/60");
} // MEDI Animation
else if (sCommand=="MID"||sCommand=="MD")
{ // MID Animation
fDelay=fnNPCACTAnimate("ANIM17/60");
} // MID Animation
else if (sCommand=="PAU1"||sCommand=="P1")
{ // PAU1 Animation
fDelay=fnNPCACTAnimate("ANIM21/30");
} // PAU1 Animation
else if (sCommand=="PAU2"||sCommand=="P2")
{ // PAU2 Animation
fDelay=fnNPCACTAnimate("ANIM24/30");
} // PAU2 Animation
else if (sCommand=="READ"||sCommand=="RD")
{ // READ Animation
fDelay=fnNPCACTAnimate("ANIM8/30");
} // READ Animation
else if (sCommand=="SALT"||sCommand=="SA")
{ // SALT Animation
fDelay=fnNPCACTAnimate("ANIM9/20");
} // SALT Animation
else if (sCommand=="SCRT"||sCommand=="SH")
{ // SCRT Animation
fDelay=fnNPCACTAnimate("ANIM7/30");
} // SCRT Animation
else if (sCommand=="SITC"||sCommand=="SC")
{ // SITC Animation
fDelay=fnNPCACTAnimate("ANIM26/300");
} // SITC Animation
else if (sCommand=="TIRD"||sCommand=="TI")
{ // TIRD Animation
fDelay=fnNPCACTAnimate("ANIM23/60");
} // TIRD Animation
else if (sCommand=="VIC1"||sCommand=="V1")
{ // VIC1 Animation
fDelay=fnNPCACTAnimate("ANIM12/20");
} // VIC1 Animation
else if (sCommand=="VIC2"||sCommand=="V2")
{ // VIC2 Animation
fDelay=fnNPCACTAnimate("ANIM13/20");
} // VIC2 Animation
else if (sCommand=="VIC3"||sCommand=="V3")
{ // VIC3 Animation
fDelay=fnNPCACTAnimate("ANIM14/20");
} // VIC3 Animation
else if (sCommand=="WORS"||sCommand=="WS")
{ // WORS Animation
fDelay=fnNPCACTAnimate("ANIM31/60");
} // WORS Animation
else if (sCommand=="ATTK"||sCommand=="AT")
{ // Attack nearby placeable
fDelay=fnNPCACTF_ATTK();
} // Attack nearby placeable
else if (sL4=="CAST"||sL2=="C/")
{ // CAST SPELL by abbreviation
fDelay=fnNPCACTF_CAST(sCommand);
} // CAST SPELL by abbreviation
else if (sCommand=="CLAC"||sCommand=="Ca")
{ // Clear all Actions
fDelay=0.0; AssignCommand(oMe,ClearAllActions());
} // Clear all Actions
else if (sCommand=="CLEN"||sCommand=="CL")
{ // Clean nearby non plot items
fDelay=fnNPCACTF_CLEN();
} // Clean nearby non plot items
else if (sCommand=="CLLD"||sCommand=="CC")
{ // Close nearby containers
fDelay=fnNPCACTF_CLLD();
} // Close nearby containers
else if (sL3=="CLO"||(sL1=="W"&&StringToInt(GetStringRight(sCommand,1))>0))
{ // Change clothing
fDelay=fnNPCACTF_CLO(sCommand);
} // Change clothing
else if (sCommand=="DIE"||sCommand=="DI")
{ // Apply death effect
eE=EffectDeath();
ApplyEffectToObject(DURATION_TYPE_INSTANT,eE,oMe,1.0);
} // Apply death effect
else if (sCommand=="DISA"||sCommand=="DS")
{ // Apply disappear effect
eE=EffectDisappear();
ApplyEffectToObject(DURATION_TYPE_INSTANT,eE,oMe,1.0);
} // Apply disappear effect
else if (sCommand=="DRD"||sCommand=="DD")
{ // Choose a nearby random door
fDelay=fnNPCACTF_DRD();
} // Choose a nearby random door
else if (sCommand=="EAT"||sCommand=="EA")
{ // EAT
fDelay=fnNPCACTF_EAT();
} // EAT
else if (sCommand=="FOAN"||sCommand=="FA")
{ // Follow any
fDelay=fnNPCACTF_Follow(2);
} // Follow any
else if (sCommand=="FOFM"||sCommand=="FF")
{ // Follow Female
fDelay=fnNPCACTF_Follow(0);
} // Follow Female
else if (sCommand=="FOFP"||sCommand=="Ff")
{ // Follow Female PC
fDelay=fnNPCACTF_Follow(4);
} // Follow Female PC
else if (sCommand=="FOMA"||sCommand=="FM")
{ // Follow Male
fDelay=fnNPCACTF_Follow(1);
} // Follow Male
else if (sCommand=="FOMP"||sCommand=="Fm")
{ // Follow Male PC
fDelay=fnNPCACTF_Follow(5);
} // Follow Male PC
else if (sCommand=="FOPC"||sCommand=="FP")
{ // Follow any PC
fDelay=fnNPCACTF_Follow(3);
} // Follow any PC
else if (sCommand=="KNOC"||sCommand=="KN")
{ // cast knock spell
fDelay=12.0;
AssignCommand(oMe,ActionCastSpellAtLocation(SPELL_KNOCK,GetLocation(oMe),METAMAGIC_ANY,TRUE));
} // cast knock spell
else if (sCommand=="ALE"||sCommand=="C3")
{ // Create ALE
fDelay=fnNPCACTMakeItem("COnw_it_mpotion021");
} // Create ALE
else if (sCommand=="FISH"||sCommand=="C2")
{ // Create FISH
fDelay=fnNPCACTMakeItem("COnw_it_msmlmisc20");
} // Create FISH
else if (sCommand=="SPRT"||sCommand=="C5")
{ // Create Spirits
fDelay=fnNPCACTMakeItem("COnw_it_mpotion022");
} // Create Spirits
else if (sCommand=="MEAT"||sCommand=="C1")
{ // Create Meat
fDelay=fnNPCACTMakeItem("COnw_it_mmidmisc05");
} // Create Meat
else if (sCommand=="WINE"||sCommand=="C4")
{ // Create Wine
fDelay=fnNPCACTMakeItem("COnw_it_mpotion023");
} // Create Wine
else if (sCommand=="CAMP"||sCommand=="CF")
{ // Create Campfire
fDelay=1.0;
CreateObject(OBJECT_TYPE_PLACEABLE,"plc_campfr",GetLocation(oMe));
} // Create Campfire
else if (sCommand=="TAFO"||sCommand=="TF")
{ // Talk Forceful
fDelay=fnNPCACTTalkTo("TTANY/F");
} // Talk Forceful
else if (sCommand=="TALA"||sCommand=="TL")
{ // Talk Laughing
fDelay=fnNPCACTTalkTo("TTANY/L");
} // Talk Laughing
else if (sCommand=="TANM"||sCommand=="TN")
{ // Talk Normal
fDelay=fnNPCACTTalkTo("TTANY/N");
} // Talk Normal
else if (sCommand=="TAPL"||sCommand=="TP")
{ // Talk Pleading
fDelay=fnNPCACTTalkTo("TTANY/P");
} // Talk Pleading
else if (sCommand=="TALK"||sCommand=="TA")
{ // Talk Random Talk Method
nR=d4();
if (nR==1) sS="N";
else if (nR==2) sS="L";
else if (nR==3) sS="F";
else { sS="P"; }
fDelay=fnNPCACTTalkTo("TTANY/"+sS);
} // Talk Random Talk Method
else if (sCommand=="MAG1"||sCommand=="M1")
{ // Magic effect 1
fDelay=fnNPCACTEffects("EFF74/0");
} // Magic effect 1
else if (sCommand=="MAG2"||sCommand=="M2")
{ // Magic effect 2
fDelay=fnNPCACTEffects("EFF195/0");
} // Magic effect 2
else if (sCommand=="MAG3"||sCommand=="M3")
{ // Magic effect 3
fDelay=fnNPCACTEffects("EFF71/0");
} // Magic effect 3
else if (sCommand=="REAP"||sCommand=="Ra")
{ // reappear
eE=EffectAppear();
ApplyEffectToObject(DURATION_TYPE_INSTANT,eE,oMe);
fDelay=4.0;
} // reappear
else if (sCommand=="POIS"||sCommand=="PO")
{ // Poison effect
eE=EffectPoison(POISON_TINY_SPIDER_VENOM);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eE,oMe,30.0);
fDelay=1.0;
} // Poison effect
else if (sCommand=="RNS0"||sCommand=="R0")
{ // random speak
fDelay=fnNPCACTRandomSpeak("Thisss sho' isss a nice place/One moresss drinksss sho to help me walk! Hic!/Thatsss a mighty fine barrel you havess! Hicup!/Who took my drink? Hic!/Itsss a bad day I need a drink!/[SINGING] Grannies in the cellar, lordy can't ya smell her/My bottle looksss shorter than before!/Spirits is the breakfast of champions!! Let me have some! Hicup!/Uggghhhh--- I don't feel too goodss! Hic!",1);
} // random speak
else if (sCommand=="RNS1"||sCommand=="R1")
{ // random speak
fDelay=fnNPCACTRandomSpeak("Don't it beat all! That merchant took forever to get here/I just done my sword cleanin' fo' the day/I seen an ogre once that'd shrivel yo' privates if he took to lookin' at ya/Some of the walkin' all day wears me down/A nice ale usually settles me stomach/Once I had to fight off a dozen bandits comin' fo' the merchant I was workin' wif/I need to find me a bed warmer! Harhar/I think spirits is a stronger drink! That'd be what I needs/I have a big scar on me arse too! Damn badger bit it",1);
} // random speak
else if (sCommand=="RNS2"||sCommand=="R2")
{ // random speak
fDelay=fnNPCACTRandomSpeak("Come look at my goods/I'm looking to trade/Fresh in! Goods from around the world/Come one, Come all! Incredible bargains here/Do you need to lighten your load? I'm buying goods of all kinds/Quick! Get them before they are gone! I am selling them like they are jewels! Maybe they are!/I have money just waiting to be spent on your goods you wish to sell/Buy something for a special occasion!/Did you forget something? You better talk to me to make sure you didn't",1);
} // random speak
else if (sCommand=="RNS3"||sCommand=="R3")
{ // random speak
fDelay=fnNPCACTRandomSpeak("Ode to the beggar!A tale of woe/O'to travel the world/Too many words tangle the tongue! A well placed word, that can win wars/If booglytoosome would fondangle the biddyswitch twould ever so simply perdobel/It twas a dark and stormy- Too cliche/So many stories, so many songs, and far too little time/The orphan dwarf and his adoptive troll parents- Nah, too stupid/Time pursues us all! It follows and cuddles! It waits for to fall! Our bodies form as puddles-That is just awful/A song or two to lighten the day!",1);
} // random speak
else if (sCommand=="RNS4"||sCommand=="R4")
{ // random speak
fDelay=fnNPCACTRandomSpeak("Me findem food! Is good?/Me needs me mate! Is good?/Me bash things! Is good?/Smell man flesh!/No like rain!/Needs more blood!/Time for bash!/Me say NOW!/Shiny things good! Man flesh trap!",1);
} // random speak
else if (sCommand=="RNS5"||sCommand=="R5")
{ // random speak
fDelay=fnNPCACTRandomSpeak("I really don't like this outfit/Today is depressing/I think I need to work on my hair/I wonder who that is?/Did you hear who slept over at you know who's last night?/My man will support me well/I need some new clothes/It's just not my day!/Damn the fates!",1);
} // random speak
else if (sCommand=="RNS6"||sCommand=="R6")
{ // random speak
fDelay=fnNPCACTRandomSpeak("Did you see her mellons? Whoa!/She has a nice arse! I'm talking about her donkey either!/I got a new tool last week/Some weather we're having/I hate work!/I bet I can belch longer!/No pain, no gain!/A fool and his money are soon parted!/If it don't hurt nothin' do what you want!",1);
} // random speak
else if (sCommand=="RNS7"||sCommand=="R7")
{ // random speak
fDelay=fnNPCACTRandomSpeak("A well placed grease spell often works wonders/What spell would you use in that situation?/I almost am done with that new spell/What do I NEED an invisible stalker for?/The usual spell does fine for me/---and then I put the bat guano in with the other powder and---/---the explosion was quite magnificent! It only singed my hair a bit!/It worked last time I cast it/I'm not sure the situation calls for an answer to that!",1);
} // random speak
else if (sCommand=="RNS8"||sCommand=="R8")
{ // random speak
fDelay=fnNPCACTRandomSpeak("and so what is the universe really?/---does not preclude the existence of other gods!/Yes, but that in itself was a contradiction!/For the love of the gods! Read the book! It's all in there!/I'm telling you it is a hidden truth!/How can you ask such silly questions?/That is blasphemy if I ever heard it before!/---might be the reason why---/---could of been a miracle---",1);
} // random speak
else if (sCommand=="RNS9"||sCommand=="R9")
{ // random speak
fDelay=fnNPCACTRandomSpeak("What do you think of the weather?/I don't give it much thought really/How has your day been?/The same as usual/That's what she wanted to know!/I don't know/You win some! Others you lose!/What did they give you?/I think something special",1);
} // random speak
else if (sCommand=="SNG1"||sCommand=="r1")
{ // sing song
fDelay=fnNPCACTLyrical("10/[SINGING]One bright and kindly summers morning/I perchance passed the field of my toils/There I saw my hearts definate warning/I happened to see my woman's donkey/My lass has a very fine ass/Don't you know it works all day/My lass has a very fine ass/It works and doesn't get pay/So next time your at the market/Make sure its a donkey you buy/For prideful they may be/But, to work their pay is just right/My lass has a very fine ass!",1);
} // sing song
else if (sCommand=="SNG2"||sCommand=="r2")
{ // sing song
fDelay=fnNPCACTLyrical("9/[SINGING] Raise your cup high and proud: Sing with me/Stomp your feet, shake the ground/Greet your chums round 'bout/Show them what drinkings all 'bout/DRINK THEM UNDER THE TABLE/SLAM THAT ALE DOWN AND DOWN/DRINK THEM UNDER THE TABLE/WATCH THEIR PRIDE FALLIN' DOWN/DRINK THEM UNDER THE TABLE/SLAM THAT ALE DOWN AND DOWN/DRINK THEM UNDER THE TABLE/WATCH THEIR PRIDE FALLIN' DOWN",1);
} // sing song
else if (sCommand=="SNG3"||sCommand=="r3")
{ // sing song
fDelay=fnNPCACTLyrical("9/[SINGING] The sea is my larder---/It is where the fish grow/The sea provides my staples---/As you all surely know/The sea provides shelter---/to the wise man they will show/The sea is as stable---/as the time honored know/The sea is my roadway---/Whereever the winds blow",1);
} // sing song
else if (sCommand=="SNG4"||sCommand=="r4")
{ // sing song
fDelay=fnNPCACTLyrical("8/[SINGING] Why are your eyes so blue all the time---/Why are your eyes always looking into mine---/Where did you come from, and where will you go---/Find my hand and take me where you go---/If I love you, will you love me too/Will you be there, whenever I need you",1);
} // sing song
else if (sCommand=="SNG5"||sCommand=="r5")
{ // sing song
fDelay=fnNPCACTLyrical("10/[SINGING] See them run, see them crawl/That's what makes it worth it all/Hear them scream, hear them weep/That's what helps me sleep a wink/Rape and Pillage/Burn the village/Rape and Pillage/Rape and Pillage/We don't need the pay/We just need some prey/We don't need friends/We prefer bone snapping trends/Rape and Pillage/Burn the village/Rape and pillage/RAPE AND PILLAGE!!",1);
} // sing song
else if (sCommand=="SNG6"||sCommand=="r6")
{ // sing song
fDelay=fnNPCACTLyrical("12/[SINGING] T'wards the mountains went the bodies---/of those the monster had taken/T'wards the caverns went the fighters/Never seen or heard again/The fear was gripping hearts/The pride had fallen low/Then came the hero/The one that was unknown/T'wards the mountains he wandered/N'er turning to look back/T'wards the caverns he stumbled/N'er considering what was there/And there he did battle/And there he did fall",1);
} // sing song
else if (sCommand=="SNG7"||sCommand=="r7")
{ // sing song
fDelay=fnNPCACTLyrical("11/[SINGING] Find the barrel/Bolt and Arrow/Grow the crops/Tend your shops/Sail the ships/Sway your hips/Kiss the Lass/Swat her arse/Grab a Potion/Forbidden Lotion/Swim the River/Love your giver/Taste the ale/Drain it well/Close the bin/Let's sing again",1);
} // sing song
else if (sCommand=="SIT"||sCommand=="SI")
{ // sit on chair
fDelay=fnNPCACTSitForSpecified("SITS10");
} // sit on chair
else if (sL4=="POLY"||sL2=="PY")
{ // Polymorph
fDelay=fnNPCACTF_Polymorph(sCommand);
} // Polymorph
else if (sCommand=="HELT"||sCommand=="HS")
{ // heal self
eE=EffectHeal(GetMaxHitPoints(oMe)-GetCurrentHitPoints(oMe));
ApplyEffectToObject(DURATION_TYPE_INSTANT,eE,oMe,1.0);
fDelay=1.0;
} // heal self
else if (sCommand=="KILL"||sCommand=="KI")
{ // KILL
fDelay=fnNPCACTF_KILL();
} // KILL
else if (sCommand=="PKLK"||sCommand=="PL")
{ // pick lock
fDelay=fnNPCACTF_PickLock();
} // pick lock
else if (sCommand=="TAUN"||sCommand=="TU")
{ // Taunt
fDelay=fnNPCACTF_Taunt();
} // Taunt
else if (sCommand=="USE"||sCommand=="US")
{ // USE
fDelay=fnNPCACTF_Use();
} // USE
else if (sCommand=="WOPC"||sCommand=="WO")
{ // worship PC
SetLocalInt(oMe,"nNPCParm",0);
ExecuteScript("npcact_ext_wors",oMe);
} // worship PC
else if (sCommand=="WOCR"||sCommand=="WC")
{ // worship NPC
SetLocalInt(oMe,"nNPCParm",1);
ExecuteScript("npcact_ext_wors",oMe);
fDelay=GetLocalFloat(oMe,"fDelay");
} // worship NPC
else if (sCommand=="BULL"||sCommand=="BU")
{ // BULLY
ExecuteScript("npcact_ext_bull",oMe);
fDelay=GetLocalFloat(oMe,"fDelay");
} // BULLY
else if (sCommand=="FLEE"||sCommand=="FL")
{ // FLEE
ExecuteScript("npcact_ext_flee",oMe);
fDelay=GetLocalFloat(oMe,"fDelay");
} // FLEE
else if (sCommand=="HEAL"||sCommand=="HE")
{ // HEAL
ExecuteScript("npcact_ext_heal",oMe);
fDelay=GetLocalFloat(oMe,"fDelay");
} // HEAL
else if (sCommand=="PICK"||sCommand=="PP")
{ // PICK POCKETS
ExecuteScript("npcact_ext_pick",oMe);
fDelay=GetLocalFloat(oMe,"fDelay");
} // PICK POCKETS
else if (sCommand=="TURN"||sCommand=="TR")
{ // TURN UNDEAD
ExecuteScript("npcact_ext_turn",oMe);
fDelay=GetLocalFloat(oMe,"fDelay");
} // TURN UNDEAD
else if (sCommand=="REACT"||sCommand=="RT")
{ // REACT
ExecuteScript("npcact_ext_react",oMe);
fDelay=GetLocalFloat(oMe,"fDelay");
} // REACT
else if (sCommand=="RMTR")
{ // Remove Trap
ExecuteScript("npcact_ext_rmtr",oMe);
fDelay=GetLocalFloat(oMe,"fDelay");
} // Remove Trap
else if (sCommand=="STTR"||sCommand=="ST")
{ // Set Trap
ExecuteScript("npcact_ext_sttr",oMe);
fDelay=GetLocalFloat(oMe,"fDelay");
} // Set Trap
else if (sCommand=="GOSSIP"||sCommand=="GO")
{ // Gossip
ExecuteScript("npcact_ext_goss",oMe);
fDelay=GetLocalFloat(oMe,"fDelay");
} // Gossip
else if (sCommand=="SLIS"||sCommand=="sl")
{ // Set Listen
ExecuteScript("npcact_ext_slis",oMe);
fDelay=GetLocalFloat(oMe,"fDelay");
} // Set Listen
else if (sCommand=="SGOS"||sCommand=="sg")
{ // Set Gossip
SetLocalString(oMe,"sParm",sCommand);
ExecuteScript("npcact_ext_sgos",oMe);
fDelay=GetLocalFloat(oMe,"fDelay");
} // Set Gossip
else if (sCommand=="LTON"||sCommand=="LO"||sCommand=="LTOF"||sCommand=="Lo")
{ // lights on/off
SetLocalString(oMe,"sParm",sCommand);
ExecuteScript("npcact_ext_light",oMe);
fDelay=GetLocalFloat(oMe,"fDelay");
} // lights on/off
else if (sCommand=="INN"||sCommand=="IN")
{ // Inn backwards compatibility
fDelay=fnNPCACTF_Inn();
} // Inn backwards compatibility
else if (sCommand=="PROP"||sCommand=="PR")
{ // Proposition
fDelay=fnNPCACTF_Proposition();
} // Proposition
else if (sL3=="SUM"||sL1=="m")
{ // summon
fDelay=fnNPCACTF_SummonCreature(sCommand);
} // Summon
else if (sL3=="SAY"||(sL1=="S"&&GetStringLength(sCommand)>1))
{ // SAY#
fDelay=fnNPCACTF_SayPhrase(sCommand);
} // SAY#
else if (sCommand=="WAKE"||sCommand=="WK")
{ // WAKE
fDelay=fnNPCACTF_Wake();
} // WAKE
else if (sL1=="A"&&GetStringLength(sCommand)==4)
{ // old style add
fDelay=fnNPCACTAddSubtract("+InNPCActionVar"+GetSubString(sCommand,1,1)+"/"+GetStringRight(sCommand,2));
} // old style add
else if (sL1=="S"&&GetStringLength(sCommand)==4)
{ // old style subtract
fDelay=fnNPCACTAddSubtract("-InNPCActionVar"+GetSubString(sCommand,1,1)+"/"+GetStringRight(sCommand,2));
} // old style subtract
else if (sL1=="V"&&GetStringLength(sCommand)==4)
{ // old style variable set
fDelay=fnNPCACTSetVariable("!InNPCActionVar"+GetSubString(sCommand,1,1)+"/"+GetStringRight(sCommand,2));
} // old style variable set
else if (sL1=="I"&&GetStringLength(sCommand)==4)
{ // IF old style
fDelay=fnNPCACTLogicCore("&IEnNPCActionVar"+GetSubString(sCommand,1,1)+"/"+GetStringRight(sCommand,2));
} // IF old style
else if ((sL3=="COP"&&GetStringLength(sCommand)==4)||(sL1=="c"&&GetStringLength(sCommand)==2))
{ // old COPY
fDelay=fnNPCACTF_CopyVar(sCommand);
} // old COPY
/// end the big if/else if
sAct=GetLocalString(oMe,"sAct"); // see if changed
nGNBDisabled=GetLocalInt(oMe,"nGNBDisabled");
if (fDelay<0.2) fDelay=0.1;
if (GetStringLength(sAct)>0&&fDelay>0.0) { DelayCommand(fDelay,ExecuteScript("npcact_interp",oMe)); }
else if (!nGNBDisabled) { DelayCommand(fDelay,fnDoPauseThenEnd()); }
else { DelayCommand(2.0,ExecuteScript("npcact_interp",oMe)); }
} // okay to deal with commands
else if (!nGNBDisabled)
{
fnDoPauseThenEnd();
}
else { DelayCommand(2.0,ExecuteScript("npcact_interp",oMe)); }
}
///////////////////////////////////////////////////////////////////////// MAIN
/////////////////////////
// FUNCTIONS
/////////////////////////
void fnState1Required()
{ // PURPOSE: Make sure not stuck in a bad state
// LAST MODIFIED BY: Deva Bryson Winblood
if (GetLocalInt(OBJECT_SELF,"nGNBState")!=1) { SetLocalInt(OBJECT_SELF,"nGNBState",1); DelayCommand(0.3,fnState1Required()); }
} // fnState1Required()
void fnDoPauseThenEnd()
{ // PURPOSE: To check for a pause and handle that
// and switch to state 1 when done with pause
// LAST MODIFIED BY: Deva Bryson Winblood
float fGNBPause=GetLocalFloat(OBJECT_SELF,"fGNBPause");
SetLocalInt(OBJECT_SELF,"nGNBState",7);
if (fGNBPause>0.0) { DelayCommand(fGNBPause,fnState1Required()); }
else { fnState1Required(); }
} // fnDoPauseThenEnd()