Here's a chopped down version just to show off the functionality added so far.
I started by compressing the stacked if statements into an array loaded as they are defined
then added extra push lines for the longer lists to keep it all neat and easily readable.
I added a toLower function because the JS internal .toLowerCase returns weird garbage
I compressed the common actions into a function fnTurnWaitText because 90% of the entries turn wait and text.
it cleaned it up some.
I also added a "pack mule" feature to minions. say "hold", "take", etc they happily open their pack and tell you to throw it in.
*edit*
Packmule was broken but I fixed it. it was only available to admin so I modified the code to create a minion pack on layer 0x01E
Pack Mule feature now works for humanoid minions for all accounts
fixed some esoteric wobbliness by borrowing the code structure from Taming.js to make them a formal pet rather than just OWNED
*edit*
added in variable wages based off the average of their stats. stats / 10
changed hiring gold from UseResource to item.destroy they kept taking all the gold instead of just what they were supposed to charge.
now the only way to overpay them is to hand them all your gold.
They will stop for a moment and face you waiting if you call their name even before you hire them.
They now will introduce themselves on 'Name' before hiring and complain you forgot their name afterwards.
18 randomized responses to the 'hello' type greetings now, always room for more
I added a disable-able section to give NPC fighters skillgain. I tested NPC skillgain and they didn't gain
for over an hour. So I scripted a slow climb powered by onAttack(). It got really strange with dexterity going down to -51 using +=1
but I changed up the structure and they all work correctly now.
the skillgain section needs tuning to be more like OSI. Minions gain very slowly. I plan on modifying the Inkeeper to be a humanoid
stablemaster so hired NPC's can be lodged at the INN when offline.
not done yet, I'll update it as I go.
//0 UOX3 Speech enabled AI File (JavaScript)
// [Contribution]|[ Contributor ]|[ Date/time stamp ]|[ File Name ]|[ Tools used ]
// Expanded | LordCromwell | November 22 2016 | hiring0x00.js | ..., notepad? :D
// Converted | Dark-Storm | 29.12.2001 2:07 am | speech_002.js | PERL :)
// Rewritten | Xuri | July 2004 | speech_001.js | unknown (2004? dinosaurs maybe? :P)
//
// This script uses regular expressions in it's searches. This results in queries like "hi", "hi!", and "hi?"
// all being positive search results, while leaving out partial matches like "hi' in "hiking" or "hinder" or "hill".
//
// The regular expression is placed within two forward slashes, for instance /hello/.
// This ensures that the script only searches for the whole word "hello" and
// leaves off preceeding or trailing letters,numbers, and symbols.
//
// *Enclose the trigger-word in \bquery\b.
// Example: /\bhello\b/
// *An additional "i" behind the last forward slash indicates that the search is case-insensitive.
// Example: /\bhello\b/i will return true for HELLO, hello, HeLlO, ... etc
//________________________________________________________________________________________________________
// Speech item 0x0000 <example entry>
// // begin entry
// // Instantiate trigger list
// var objTrgArr0x0000 = [/\btrigger1\b/i,/\btrigger2\b/i,/\btrigger3\b/i,/\btrigger4\b/i];
// objTrgArr0x0000.push (/\btrigger5\b/i,/\binventory6\b/i,/\btrigger7\b/i,/\btrigger8\b/i)
// objTrgArr0x0000.push (/\btrigger9\b/i,/\binventory0\b/i,/\btriggerA\b/i,/\btriggerB\b/i)
// Using push allows us to keep the blocks neat
//
// var intTrgIdx = 0;
//
// for( intTrgIdx = 0; intTrgIdx <= objTrgArr0x0000.length; intTrgIdx++ ) //iterate through trigger list
// {
// if( strSpeechArray[intArrayIndex].match(objTrgArr0x0000[intTrgIdx])) //test conditional
// {
// //Common tasks.
// fnTurnWaitText( objPlayer, objNPC,"Initial message.");
//
// //perform entry specific tasks
//
// return 0;
// }
//
// }
// // end entry
//________________________________________________________________________________________________________
// Declarations and Globals
var intPauseNPC = 6000;
var strMessage = "";
var intWage = 0;
var Debugger = .01;
var intSkillGainDelay = .01;
var objTempStats = [0,0,0,0,0,0];
var intEnhancements = [1,1,1,1,1,1,1,1] // 1 (ON) 0 (OFF) flags->|skillgain| | | | | | | |
//
// Line 50
function onSpeech( strInput, objPlayer, objNPC)
{
if( !objNPC.InRange( objPlayer, 8 ) )
{
return; //exit function if player is not within range.
}
else
{
var i = 0;
var intTrgIdx = 0;
var intArrayIndex = 0;
var strSpeechArray = strInput.split(" ");
for( i = 1; i <= strSpeechArray.length; i++ )
{
//________________________________________________________________________________________________________
// emotive entry 0x0000 - Silently turns toward speaker that addresses them by name
// begin entry
var strNPCName = fnToLower(objNPC.name);
if( strSpeechArray[intArrayIndex].match(strNPCName)) //test conditional
{
//Common tasks.
//NPC simply turns toward any player that says their name.
fnTurnWaitMute(objPlayer, objNPC);
//perform entry specific tasks
return 0;
}
// end entry
//_______________________________________________________________________________________________________
// Speech entry 0x0000 - Gossip (Hiring info)
// begin entry
// Instantiate trigger list
var objTrgArr0x0000 = [/\bjob\b/i,/\bhire\b/i,/\bwork\b/i];
// objTrgArr0x0000.push (/\bnull\b/i,/\bnull\b/i,/\bnull\b/i,/\bnull\b/i,/\bnull\b/i);
for( intTrgIdx = 0; intTrgIdx <= objTrgArr0x0000.length; intTrgIdx++ ) //iterate through trigger list
{
if( strSpeechArray[intArrayIndex].match(objTrgArr0x0000[intTrgIdx])) //test conditional
{
//Common tasks.
fnTurnWaitText( objPlayer, objNPC,"What's this?");
//perform entry specific tasks
if( objNPC.owner!= null)
{
if(objNPC.owner.serial == objPlayer.serial)
{
objNPC.TextMessage( "I'm already employed by you." );
return 0;
}
else
{
objNPC.TextMessage( "I am beholden to another employer.");
return 0;
}
return 0;
}
else if( objNPC.owner == null)
{
intWage = (objNPC.strength + objNPC.dexterity + objNPC.intelligence) / 10;
objNPC.TextMessage( "You can hire me for "+ intWage +" gold coin." );
return 0;
}
}
}
// end entry
//________________________________________________________________________________________________________
// Speech entry 0x0001 - Gossip (NPC's have names you know! :P)
// begin entry
// Instantiate trigger list
var objTrgArr0x0001 = [/\bname\b/i,/\bhey you\b/i];
// objTrgArr0x0001.push (/\bnull\b/i);
for( intTrgIdx = 0; intTrgIdx <= objTrgArr0x0001.length; intTrgIdx++ ) //iterate through trigger list
{//1A
if( strSpeechArray[intArrayIndex].match(objTrgArr0x0001[intTrgIdx])) //test conditional
{//2A
//Common tasks.
//fnTurnWaitText( objPlayer, objNPC,"My name is "+objNPC.name+". A pleasure, I'm sure." );
//Perform entry specific tasks
//Do I know you?
if (objNPC.owner != null)
{//3A
if (objNPC.owner == objPlayer)
{//4A
fnTurnWaitText( objPlayer, objNPC,"My name is "+objNPC.name+"." );
objNPC.TextMessage("I canst believe thou hath forgotten so soon.");
return 0;
}//4a
else
{//4B
}//4b
}//3a
else
{//3B
}//3b
fnTurnWaitText( objPlayer, objNPC,"My name is "+objNPC.name+". A pleasure, I'm sure." );
return;
}//2a
}//1a
// end entry
//________________________________________________________________________________________________________
// Speech entry 0x0002 - Gossip (Lord British)
// begin entry
// Instantiate trigger list
var objTrgArr0x0002 = [/\bbritish\b/i,/\bking\b/i,/\bruler\b/i,/\bhighness\b/i];
// objTrgArr0x0002.push (/\bwho lives in that castle?\b/i);
for( intTrgIdx = 0; intTrgIdx <= objTrgArr0x0002.length; intTrgIdx++ ) //iterate through trigger list
{
if( strSpeechArray[intArrayIndex].match(objTrgArr0x0002[intTrgIdx])) //test conditional
{
//Common tasks.
fnTurnWaitText( objPlayer, objNPC,"Lord British is a leader who believes in order.");
//perform entry specific tasks
return;
}
}
// end entry
//________________________________________________________________________________________________________
// Speech entry 0x0003 - Gossip ( hello, hi, greetings, salutations and much ado about nothing )
// begin entry
// Instantiate trigger list
var objTrgArr0x0003 = [/\bhey\b/i,/\bhello\b/i,/\bhi\b/i,/\bgreetings\b/i,/\bmorning\b/i];
objTrgArr0x0003.push (/\bwaves\b/i,/\bafternoon\b/i,/\bevening\b/i,/\byo\b/i,/\bhail\b/i);
for( intTrgIdx = 0; intTrgIdx <= objTrgArr0x0003.length; intTrgIdx++ ) //iterate through trigger list
{//1A
if( strSpeechArray[intArrayIndex].match(objTrgArr0x0003[intTrgIdx])) //test conditional
{//2A
//Common tasks.
//fnTurnWaitText( objPlayer, objNPC," " );
//Perform entry specific tasks
//Load array and select a random reply
var strGreetArray = ["Hail!","Salutations!","Greetings!","A Pleasure.","Hello."];
strGreetArray.push ("A fine one to you!", "Good tidings.","*nods in your direction*");
strGreetArray.push ("Pleasant day.", "Lovely weather.","*smiles*","*salutes*");
strGreetArray.push ("*grins broadly*", "*winks*","*waves*","Good day!","How are you this fine day?");
var intIDX = Math.floor(Math.random() * 18); //get a random integer, ... we hope
if (intIDX == null) {intIDX=2;}// needed to prevent NaN
if (strGreetArray[intIDX] == null) {strGreetArray[intIDX]="Wonderful!";} //needed to prevent 'undefined'
fnTurnWaitText( objPlayer, objNPC, strGreetArray[intIDX] );
return 0;
}//2a
}//1a
// end entry
//________________________________________________________________________________________________________
// Speech entry 0x010F - Command (opens minion pack)
// begin entry
// Instantiate trigger list
var objTrgArr0x010F = [/\bhold\b/i,/\bpack\b/i,/\bbag\b/i];
objTrgArr0x010F.push (/\btake\b/i,/\binventory\b/i);
for( intTrgIdx = 0; intTrgIdx <= objTrgArr0x010F.length; intTrgIdx++ ) //iterate through trigger list
{//1A
if( strSpeechArray[intArrayIndex].match(objTrgArr0x010F[intTrgIdx])) //test conditional
{//2A
//Common tasks.
if (objNPC.owner == objPlayer)
{//3A
fnTurnWaitText( objPlayer, objNPC,"Just throw it in my pack.");
//perform entry specific tasks
var objMinionPack = objPlayer.FindItemLayer(0x01e);
if( objMinionPack == null || !objMinionPack.isItem )
{//4A
fnCreateMinionBag( objPlayer );
objMinionPack=objPlayer.FindItemLayer(0x01e);
}//4a
objPlayer.OpenLayer (objPlayer.socket, 0x01e); //expose mbackpack to owner if hired
return;
}//3a
}//2a
}//1a
// end entry
//________________________________________________________________________________________________________
// increment and Next
intArrayIndex++;}}} // End of For loop
//________________________________________________________________________________________________________
// Control Entry - Drop item on NPC
function onDropItemOnNpc( objPlayer, objNPC, objItem )
{
// Checks to see if the player already has a minion bank box.
var objMinionPack = objPlayer.FindItemLayer(0x01e);
if( objMinionPack == null || !objMinionPack.isItem )
{
fnCreateMinionBag( objPlayer );
objMinionPack=objPlayer.FindItemLayer(0x01e);
}
objNPC.TextMessage("I see you are prepped with a minion bag, will you pay " +intWage);
// validate this NPC is payable
if (intWage == 0) {intWage = (objNPC.strength + objNPC.dexterity + objNPC.intelligence) / 10;}
// Give player attention
fnTurnWaitMute( objPlayer, objNPC );
// What was dropped
// The purpose of the switch is to allow for custom reactions to some objects such as food, potions, body parts etc.
// That is why it doesn't just default to OpenMinionBag
switch (objItem.id)
{//1
case 0x0eed:
// Some yahoo gave me gold, who was it
var numGold = objPlayer.ResourceCount( 0x0eed );
if( objNPC.owner != null ) //true means i'm employed
{//2A
if( objNPC.owner == objPlayer ) //true means it's my boss
{//3A
// It's the boss he wants me to bag the loot!
objNPC.TextMessage( "So I'll just carry this then? Right!" );
objNPC.TextMessage( "*opens bag*" );
//objItem.SetCont(objMinionPack);
objPlayer.OpenLayer (objPlayer.socket, 0x01e); //expose mbackpack to owner if hired
return 0;
}//3A
else
{//3B
objNPC.TextMessage( "Begging thine pardon but I am already under employ." );
return 0;
}//3B
}//2A
else
{//2C No owner no problem!
if( objItem.amount >= intWage)
{//3C
objNPC.TextMessage( "Off we go then." );
objNPC.owner = objPlayer;
objNPC.tamed = true;
objNPC.Follow( objPlayer );
objNPC.wandertype = 0;
//objNPC.aitype = 0; //let's make this fun and not lobotomize our humanoid minions
objItem.destroy;
if( objNPC.atWar )
{//4B
objNPC.TextMessage( "Bribery will get you everywhere." );
objNPC.target= null;
objNPC.attack= null;
objNPC.atWar= false;
objPlayer.target= null;
objPlayer.attack= null;
objPlayer.atWar= false;
}//4B
return 0;
}//3c
else if( objItem.amount <= intWage )
{//3D
objNPC.TextMessage( "I doest not pro-rate." );
return 0;
}//3D
}//2C
break; // end case
default:
objNPC.TextMessage( "Now where would I put this?" );
break; // end default case
}//1
return 0;
}//EOfnDropItemOnNPC
//________________________________________________________________________________________________________
// Update onAISliver
function onAISliver(objNPC)
{
Debugger += .1;
if (Debugger >= 1)
{
Debugger=0;
//objNPC.TextMessage(objNPC.baseskills.swordsmanship);
objNPC.health += 1;
}
return;
}
//________________________________________________________________________________________________________
// Update onSwing
function onSwing( iSwung, pSwinging, pSwingAt )
{
if (intEnhancements[0] == 0) {return;}
objTempStats[0]=pSwinging.strength;
objTempStats[1]=pSwinging.dexterity;
objTempStats[2]=pSwinging.intelligence;
objTempStats[3]=pSwinging.baseskills.swordsmanship;
objTempStats[4]=pSwinging.baseskills.parrying;
objTempStats[5]=pSwinging.baseskills.tactics;
intSkillGainDelay +=.01;
if(intSkillGainDelay >= 1 )
{
var Conditional = Math.floor(Math.random()*1000);
if (Conditional < 333) {Conditional = 0}
else
if (Conditional < 666) {Conditional = 1}
else
if (Conditional < 999) {Conditional = 2}
switch (Conditional )
{
case 0:
if (pSwinging.strength < 120)
{
objTempStats[0]+=1;
pSwinging.strength = objTempStats[0];
pSwinging.TextMessage("Hey, I'm getting better at this!")
}
if (pSwinging.baseskills.swordsmanship < 1200)
{
objTempStats[3]+=1;
pSwinging.baseskills.swordsmanship = objTempStats[3];
}
break;
case 1:
if (pSwinging.dexterity < 120)
{
objTempStats[1]+=1;
pSwinging.dexterity = objTempStats[1];
pSwinging.TextMessage("Hey, I'm getting better at this!")
}
if (pSwinging.baseskills.parrying < 1200)
{
objTempStats[4]+=1;
pSwinging.baseskills.parrying = objTempStats[4];
}
break;
case 2:
if (pSwinging.intelligence < 120)
{
objTempStats[2]+=1;
pSwinging.intelligence = objTempStats[2];
pSwinging.TextMessage("Hey, I'm getting better at this!")
}
if (pSwinging.baseskills.tactics < 1200)
{
objTempStats[5]+=1;
pSwinging.baseskills.tactics = objTempStats[5];
}
break;
default:
break;
}
intSkillGainDelay = 0;
}
return;
}
function onDefense( pAttacker, pDefender )
{
return;
}
//________________________________________________________________________________________________________
// Tools and methods
function fnTurnWaitText ( objPlayer, objNPC, strMessage )
{
objNPC.TurnToward( objPlayer );
objNPC.SetTimer( 11, intPauseNPC );
objNPC.TextMessage( strMessage );
return false;
}
function fnTurnWaitMute ( objPlayer, objNPC )
{
objNPC.TurnToward( objPlayer );
objNPC.SetTimer( 11, intPauseNPC );
objNPC.TextMessage( strMessage );
return false;
}
function fnTurnWaitSysText ( objPlayer, objNPC, strMessage )
{
objNPC.TurnToward( objPlayer );
objNPC.SetTimer( 11, intPauseNPC );
objPlayer.SysMessage( strMessage );
return false;
}
function fnToLower ( strMessage )
{
var i2 = 0;
var strLower=["",""];
strLower[0] = strMessage.replace("A","a");
strLower[1] = strLower[0].replace("B","b");
strLower[0] = strLower[1].replace("C","c");
strLower[1] = strLower[0].replace("D","d");
strLower[0] = strLower[1].replace("E","e");
strLower[1] = strLower[0].replace("F","f");
strLower[0] = strLower[1].replace("G","g");
strLower[1] = strLower[0].replace("H","h");
strLower[0] = strLower[1].replace("I","i");
strLower[1] = strLower[0].replace("J","j");
strLower[0] = strLower[1].replace("K","k");
strLower[1] = strLower[0].replace("L","l");
strLower[0] = strLower[1].replace("M","m");
strLower[1] = strLower[0].replace("N","n");
strLower[0] = strLower[1].replace("O","o");
strLower[1] = strLower[0].replace("P","p");
strLower[0] = strLower[1].replace("Q","q");
strLower[1] = strLower[0].replace("R","r");
strLower[0] = strLower[1].replace("S","s");
strLower[1] = strLower[0].replace("T","t");
strLower[0] = strLower[1].replace("U","u");
strLower[1] = strLower[0].replace("V","v");
strLower[0] = strLower[1].replace("W","w");
strLower[1] = strLower[0].replace("X","x");
strLower[0] = strLower[1].replace("Y","y");
strLower[1] = strLower[0].replace("Z","z");
return strLower[1];
}
function fnCreateMinionBag( objPlayer )
{
// Create a new minion bankbox for the player
var objNewMinionPack = CreateDFNItem( objPlayer.socket, objPlayer, "0x09b2", 1, "ITEM", false );
objNewMinionPack.name = objPlayer.name + "'s minion bag";
objNewMinionPack.layer = 0x01e;
objNewMinionPack.owner = objPlayer;
objNewMinionPack.container = objPlayer;
objNewMinionPack.type = 1;
objNewMinionPack.morex = 1;
if ( objNewMinionPack )
{
return true;
}
else
{
return false;
}
return 0;
}
// [Contribution]|[ Contributor ]|[ Date/time stamp ]|[ File Name ]|[ Tools used ]
// Expanded | LordCromwell | November 22 2016 | hiring0x00.js | ..., notepad? :D
// Converted | Dark-Storm | 29.12.2001 2:07 am | speech_002.js | PERL :)
// Rewritten | Xuri | July 2004 | speech_001.js | unknown (2004? dinosaurs maybe? :P)
//
// This script uses regular expressions in it's searches. This results in queries like "hi", "hi!", and "hi?"
// all being positive search results, while leaving out partial matches like "hi' in "hiking" or "hinder" or "hill".
//
// The regular expression is placed within two forward slashes, for instance /hello/.
// This ensures that the script only searches for the whole word "hello" and
// leaves off preceeding or trailing letters,numbers, and symbols.
//
// *Enclose the trigger-word in \bquery\b.
// Example: /\bhello\b/
// *An additional "i" behind the last forward slash indicates that the search is case-insensitive.
// Example: /\bhello\b/i will return true for HELLO, hello, HeLlO, ... etc
//________________________________________________________________________________________________________
// Speech item 0x0000 <example entry>
// // begin entry
// // Instantiate trigger list
// var objTrgArr0x0000 = [/\btrigger1\b/i,/\btrigger2\b/i,/\btrigger3\b/i,/\btrigger4\b/i];
// objTrgArr0x0000.push (/\btrigger5\b/i,/\binventory6\b/i,/\btrigger7\b/i,/\btrigger8\b/i)
// objTrgArr0x0000.push (/\btrigger9\b/i,/\binventory0\b/i,/\btriggerA\b/i,/\btriggerB\b/i)
// Using push allows us to keep the blocks neat
//
// var intTrgIdx = 0;
//
// for( intTrgIdx = 0; intTrgIdx <= objTrgArr0x0000.length; intTrgIdx++ ) //iterate through trigger list
// {
// if( strSpeechArray[intArrayIndex].match(objTrgArr0x0000[intTrgIdx])) //test conditional
// {
// //Common tasks.
// fnTurnWaitText( objPlayer, objNPC,"Initial message.");
//
// //perform entry specific tasks
//
// return 0;
// }
//
// }
// // end entry
//________________________________________________________________________________________________________
// Declarations and Globals
var intPauseNPC = 6000;
var strMessage = "";
var intWage = 0;
var Debugger = .01;
var intSkillGainDelay = .01;
var objTempStats = [0,0,0,0,0,0];
var intEnhancements = [1,1,1,1,1,1,1,1] // 1 (ON) 0 (OFF) flags->|skillgain| | | | | | | |
//
// Line 50
function onSpeech( strInput, objPlayer, objNPC)
{
if( !objNPC.InRange( objPlayer, 8 ) )
{
return; //exit function if player is not within range.
}
else
{
var i = 0;
var intTrgIdx = 0;
var intArrayIndex = 0;
var strSpeechArray = strInput.split(" ");
for( i = 1; i <= strSpeechArray.length; i++ )
{
//________________________________________________________________________________________________________
// emotive entry 0x0000 - Silently turns toward speaker that addresses them by name
// begin entry
var strNPCName = fnToLower(objNPC.name);
if( strSpeechArray[intArrayIndex].match(strNPCName)) //test conditional
{
//Common tasks.
//NPC simply turns toward any player that says their name.
fnTurnWaitMute(objPlayer, objNPC);
//perform entry specific tasks
return 0;
}
// end entry
//_______________________________________________________________________________________________________
// Speech entry 0x0000 - Gossip (Hiring info)
// begin entry
// Instantiate trigger list
var objTrgArr0x0000 = [/\bjob\b/i,/\bhire\b/i,/\bwork\b/i];
// objTrgArr0x0000.push (/\bnull\b/i,/\bnull\b/i,/\bnull\b/i,/\bnull\b/i,/\bnull\b/i);
for( intTrgIdx = 0; intTrgIdx <= objTrgArr0x0000.length; intTrgIdx++ ) //iterate through trigger list
{
if( strSpeechArray[intArrayIndex].match(objTrgArr0x0000[intTrgIdx])) //test conditional
{
//Common tasks.
fnTurnWaitText( objPlayer, objNPC,"What's this?");
//perform entry specific tasks
if( objNPC.owner!= null)
{
if(objNPC.owner.serial == objPlayer.serial)
{
objNPC.TextMessage( "I'm already employed by you." );
return 0;
}
else
{
objNPC.TextMessage( "I am beholden to another employer.");
return 0;
}
return 0;
}
else if( objNPC.owner == null)
{
intWage = (objNPC.strength + objNPC.dexterity + objNPC.intelligence) / 10;
objNPC.TextMessage( "You can hire me for "+ intWage +" gold coin." );
return 0;
}
}
}
// end entry
//________________________________________________________________________________________________________
// Speech entry 0x0001 - Gossip (NPC's have names you know! :P)
// begin entry
// Instantiate trigger list
var objTrgArr0x0001 = [/\bname\b/i,/\bhey you\b/i];
// objTrgArr0x0001.push (/\bnull\b/i);
for( intTrgIdx = 0; intTrgIdx <= objTrgArr0x0001.length; intTrgIdx++ ) //iterate through trigger list
{//1A
if( strSpeechArray[intArrayIndex].match(objTrgArr0x0001[intTrgIdx])) //test conditional
{//2A
//Common tasks.
//fnTurnWaitText( objPlayer, objNPC,"My name is "+objNPC.name+". A pleasure, I'm sure." );
//Perform entry specific tasks
//Do I know you?
if (objNPC.owner != null)
{//3A
if (objNPC.owner == objPlayer)
{//4A
fnTurnWaitText( objPlayer, objNPC,"My name is "+objNPC.name+"." );
objNPC.TextMessage("I canst believe thou hath forgotten so soon.");
return 0;
}//4a
else
{//4B
}//4b
}//3a
else
{//3B
}//3b
fnTurnWaitText( objPlayer, objNPC,"My name is "+objNPC.name+". A pleasure, I'm sure." );
return;
}//2a
}//1a
// end entry
//________________________________________________________________________________________________________
// Speech entry 0x0002 - Gossip (Lord British)
// begin entry
// Instantiate trigger list
var objTrgArr0x0002 = [/\bbritish\b/i,/\bking\b/i,/\bruler\b/i,/\bhighness\b/i];
// objTrgArr0x0002.push (/\bwho lives in that castle?\b/i);
for( intTrgIdx = 0; intTrgIdx <= objTrgArr0x0002.length; intTrgIdx++ ) //iterate through trigger list
{
if( strSpeechArray[intArrayIndex].match(objTrgArr0x0002[intTrgIdx])) //test conditional
{
//Common tasks.
fnTurnWaitText( objPlayer, objNPC,"Lord British is a leader who believes in order.");
//perform entry specific tasks
return;
}
}
// end entry
//________________________________________________________________________________________________________
// Speech entry 0x0003 - Gossip ( hello, hi, greetings, salutations and much ado about nothing )
// begin entry
// Instantiate trigger list
var objTrgArr0x0003 = [/\bhey\b/i,/\bhello\b/i,/\bhi\b/i,/\bgreetings\b/i,/\bmorning\b/i];
objTrgArr0x0003.push (/\bwaves\b/i,/\bafternoon\b/i,/\bevening\b/i,/\byo\b/i,/\bhail\b/i);
for( intTrgIdx = 0; intTrgIdx <= objTrgArr0x0003.length; intTrgIdx++ ) //iterate through trigger list
{//1A
if( strSpeechArray[intArrayIndex].match(objTrgArr0x0003[intTrgIdx])) //test conditional
{//2A
//Common tasks.
//fnTurnWaitText( objPlayer, objNPC," " );
//Perform entry specific tasks
//Load array and select a random reply
var strGreetArray = ["Hail!","Salutations!","Greetings!","A Pleasure.","Hello."];
strGreetArray.push ("A fine one to you!", "Good tidings.","*nods in your direction*");
strGreetArray.push ("Pleasant day.", "Lovely weather.","*smiles*","*salutes*");
strGreetArray.push ("*grins broadly*", "*winks*","*waves*","Good day!","How are you this fine day?");
var intIDX = Math.floor(Math.random() * 18); //get a random integer, ... we hope
if (intIDX == null) {intIDX=2;}// needed to prevent NaN
if (strGreetArray[intIDX] == null) {strGreetArray[intIDX]="Wonderful!";} //needed to prevent 'undefined'
fnTurnWaitText( objPlayer, objNPC, strGreetArray[intIDX] );
return 0;
}//2a
}//1a
// end entry
//________________________________________________________________________________________________________
// Speech entry 0x010F - Command (opens minion pack)
// begin entry
// Instantiate trigger list
var objTrgArr0x010F = [/\bhold\b/i,/\bpack\b/i,/\bbag\b/i];
objTrgArr0x010F.push (/\btake\b/i,/\binventory\b/i);
for( intTrgIdx = 0; intTrgIdx <= objTrgArr0x010F.length; intTrgIdx++ ) //iterate through trigger list
{//1A
if( strSpeechArray[intArrayIndex].match(objTrgArr0x010F[intTrgIdx])) //test conditional
{//2A
//Common tasks.
if (objNPC.owner == objPlayer)
{//3A
fnTurnWaitText( objPlayer, objNPC,"Just throw it in my pack.");
//perform entry specific tasks
var objMinionPack = objPlayer.FindItemLayer(0x01e);
if( objMinionPack == null || !objMinionPack.isItem )
{//4A
fnCreateMinionBag( objPlayer );
objMinionPack=objPlayer.FindItemLayer(0x01e);
}//4a
objPlayer.OpenLayer (objPlayer.socket, 0x01e); //expose mbackpack to owner if hired
return;
}//3a
}//2a
}//1a
// end entry
//________________________________________________________________________________________________________
// increment and Next
intArrayIndex++;}}} // End of For loop
//________________________________________________________________________________________________________
// Control Entry - Drop item on NPC
function onDropItemOnNpc( objPlayer, objNPC, objItem )
{
// Checks to see if the player already has a minion bank box.
var objMinionPack = objPlayer.FindItemLayer(0x01e);
if( objMinionPack == null || !objMinionPack.isItem )
{
fnCreateMinionBag( objPlayer );
objMinionPack=objPlayer.FindItemLayer(0x01e);
}
objNPC.TextMessage("I see you are prepped with a minion bag, will you pay " +intWage);
// validate this NPC is payable
if (intWage == 0) {intWage = (objNPC.strength + objNPC.dexterity + objNPC.intelligence) / 10;}
// Give player attention
fnTurnWaitMute( objPlayer, objNPC );
// What was dropped
// The purpose of the switch is to allow for custom reactions to some objects such as food, potions, body parts etc.
// That is why it doesn't just default to OpenMinionBag
switch (objItem.id)
{//1
case 0x0eed:
// Some yahoo gave me gold, who was it
var numGold = objPlayer.ResourceCount( 0x0eed );
if( objNPC.owner != null ) //true means i'm employed
{//2A
if( objNPC.owner == objPlayer ) //true means it's my boss
{//3A
// It's the boss he wants me to bag the loot!
objNPC.TextMessage( "So I'll just carry this then? Right!" );
objNPC.TextMessage( "*opens bag*" );
//objItem.SetCont(objMinionPack);
objPlayer.OpenLayer (objPlayer.socket, 0x01e); //expose mbackpack to owner if hired
return 0;
}//3A
else
{//3B
objNPC.TextMessage( "Begging thine pardon but I am already under employ." );
return 0;
}//3B
}//2A
else
{//2C No owner no problem!
if( objItem.amount >= intWage)
{//3C
objNPC.TextMessage( "Off we go then." );
objNPC.owner = objPlayer;
objNPC.tamed = true;
objNPC.Follow( objPlayer );
objNPC.wandertype = 0;
//objNPC.aitype = 0; //let's make this fun and not lobotomize our humanoid minions
objItem.destroy;
if( objNPC.atWar )
{//4B
objNPC.TextMessage( "Bribery will get you everywhere." );
objNPC.target= null;
objNPC.attack= null;
objNPC.atWar= false;
objPlayer.target= null;
objPlayer.attack= null;
objPlayer.atWar= false;
}//4B
return 0;
}//3c
else if( objItem.amount <= intWage )
{//3D
objNPC.TextMessage( "I doest not pro-rate." );
return 0;
}//3D
}//2C
break; // end case
default:
objNPC.TextMessage( "Now where would I put this?" );
break; // end default case
}//1
return 0;
}//EOfnDropItemOnNPC
//________________________________________________________________________________________________________
// Update onAISliver
function onAISliver(objNPC)
{
Debugger += .1;
if (Debugger >= 1)
{
Debugger=0;
//objNPC.TextMessage(objNPC.baseskills.swordsmanship);
objNPC.health += 1;
}
return;
}
//________________________________________________________________________________________________________
// Update onSwing
function onSwing( iSwung, pSwinging, pSwingAt )
{
if (intEnhancements[0] == 0) {return;}
objTempStats[0]=pSwinging.strength;
objTempStats[1]=pSwinging.dexterity;
objTempStats[2]=pSwinging.intelligence;
objTempStats[3]=pSwinging.baseskills.swordsmanship;
objTempStats[4]=pSwinging.baseskills.parrying;
objTempStats[5]=pSwinging.baseskills.tactics;
intSkillGainDelay +=.01;
if(intSkillGainDelay >= 1 )
{
var Conditional = Math.floor(Math.random()*1000);
if (Conditional < 333) {Conditional = 0}
else
if (Conditional < 666) {Conditional = 1}
else
if (Conditional < 999) {Conditional = 2}
switch (Conditional )
{
case 0:
if (pSwinging.strength < 120)
{
objTempStats[0]+=1;
pSwinging.strength = objTempStats[0];
pSwinging.TextMessage("Hey, I'm getting better at this!")
}
if (pSwinging.baseskills.swordsmanship < 1200)
{
objTempStats[3]+=1;
pSwinging.baseskills.swordsmanship = objTempStats[3];
}
break;
case 1:
if (pSwinging.dexterity < 120)
{
objTempStats[1]+=1;
pSwinging.dexterity = objTempStats[1];
pSwinging.TextMessage("Hey, I'm getting better at this!")
}
if (pSwinging.baseskills.parrying < 1200)
{
objTempStats[4]+=1;
pSwinging.baseskills.parrying = objTempStats[4];
}
break;
case 2:
if (pSwinging.intelligence < 120)
{
objTempStats[2]+=1;
pSwinging.intelligence = objTempStats[2];
pSwinging.TextMessage("Hey, I'm getting better at this!")
}
if (pSwinging.baseskills.tactics < 1200)
{
objTempStats[5]+=1;
pSwinging.baseskills.tactics = objTempStats[5];
}
break;
default:
break;
}
intSkillGainDelay = 0;
}
return;
}
function onDefense( pAttacker, pDefender )
{
return;
}
//________________________________________________________________________________________________________
// Tools and methods
function fnTurnWaitText ( objPlayer, objNPC, strMessage )
{
objNPC.TurnToward( objPlayer );
objNPC.SetTimer( 11, intPauseNPC );
objNPC.TextMessage( strMessage );
return false;
}
function fnTurnWaitMute ( objPlayer, objNPC )
{
objNPC.TurnToward( objPlayer );
objNPC.SetTimer( 11, intPauseNPC );
objNPC.TextMessage( strMessage );
return false;
}
function fnTurnWaitSysText ( objPlayer, objNPC, strMessage )
{
objNPC.TurnToward( objPlayer );
objNPC.SetTimer( 11, intPauseNPC );
objPlayer.SysMessage( strMessage );
return false;
}
function fnToLower ( strMessage )
{
var i2 = 0;
var strLower=["",""];
strLower[0] = strMessage.replace("A","a");
strLower[1] = strLower[0].replace("B","b");
strLower[0] = strLower[1].replace("C","c");
strLower[1] = strLower[0].replace("D","d");
strLower[0] = strLower[1].replace("E","e");
strLower[1] = strLower[0].replace("F","f");
strLower[0] = strLower[1].replace("G","g");
strLower[1] = strLower[0].replace("H","h");
strLower[0] = strLower[1].replace("I","i");
strLower[1] = strLower[0].replace("J","j");
strLower[0] = strLower[1].replace("K","k");
strLower[1] = strLower[0].replace("L","l");
strLower[0] = strLower[1].replace("M","m");
strLower[1] = strLower[0].replace("N","n");
strLower[0] = strLower[1].replace("O","o");
strLower[1] = strLower[0].replace("P","p");
strLower[0] = strLower[1].replace("Q","q");
strLower[1] = strLower[0].replace("R","r");
strLower[0] = strLower[1].replace("S","s");
strLower[1] = strLower[0].replace("T","t");
strLower[0] = strLower[1].replace("U","u");
strLower[1] = strLower[0].replace("V","v");
strLower[0] = strLower[1].replace("W","w");
strLower[1] = strLower[0].replace("X","x");
strLower[0] = strLower[1].replace("Y","y");
strLower[1] = strLower[0].replace("Z","z");
return strLower[1];
}
function fnCreateMinionBag( objPlayer )
{
// Create a new minion bankbox for the player
var objNewMinionPack = CreateDFNItem( objPlayer.socket, objPlayer, "0x09b2", 1, "ITEM", false );
objNewMinionPack.name = objPlayer.name + "'s minion bag";
objNewMinionPack.layer = 0x01e;
objNewMinionPack.owner = objPlayer;
objNewMinionPack.container = objPlayer;
objNewMinionPack.type = 1;
objNewMinionPack.morex = 1;
if ( objNewMinionPack )
{
return true;
}
else
{
return false;
}
return 0;
}