NWScript:
int NOMINORS_USE_DRINKING_AGE = FALSE;
int NOMINORS_DRINKING_AGE_HUMAN = 21;
int NOMINORS_DRINKING_AGE_ELF = 100;
int NOMINORS_DRINKING_AGE_HALFELF = 50;
int NOMINORS_DRINKING_AGE_GNOME = 50;
int NOMINORS_DRINKING_AGE_HALFLING = 50;
int NOMINORS_DRINKING_AGE_DWARF = 50;
int NOMINORS_DRINKING_AGE_HALFORC = 21;
string NOMINORS_GREETING = "Ah, what a cutie. You know you are not old enough to drink the hard stuff now.";
int SERVE_HUMAN = TRUE;
int SERVE_ELF = TRUE;
int SERVE_HALFELF = TRUE;
int SERVE_GNOME = TRUE;
int SERVE_HALFLING = TRUE;
int SERVE_DWARF = TRUE;
int SERVE_HALFORC = FALSE;
string NO_SERVICE_RACE = "Sorry, this inn does not serve your race. Begone!";
int SERVE_ALL_REPUTATIONS = FALSE;
int REPUTATION_THRESHOLD = 30;
string NO_SERVICE_REPUTATION = "Please make yourself scarce. You are not welcome here";
int WILL_FLIRT = TRUE;
int ISA_HOMO = FALSE;
int FLIRT_THRESHOLD1 = 15;
int FLIRT_THRESHOLD2 = 18;
string FLIRT_HELLO1_1 = "Hello cutie :) What can I do you for?";
string FLIRT_HELLO1_2 = "Nice to have you today. Can I get you anything ::wink::?";
string FLIRT_HELLO1_3 = "It is my pleasure to serve you! What would you like (besides me)?";
string FLIRT_HELLO2_1 = "Oh my god. I have to say you are the best looking customer I have seen in these parts. Your wish is my command. ::whisper:: Meet me upstairs later... lets have some fun";
string FLIRT_HELLO2_2 = "I have a thing for people who look like you. Lets meet tonight. Can I get you a drink?";
string FLIRT_HELLO2_3 = ":::whisper::: for a good time, see me in my room tonight. Can I get you anything?";
int WILL_BE_REPULSED = TRUE;
int REPULSION_THRESHOLD1 = 8;
int REPULSION_THRESHOLD2 = 4;
string REPULSED_1 = "Ugh, can I get you a drink?";
string REPULSED_2 = "Jeez, who hit you with the ugly wand. I can see why you drink! Let me help.";
string GREETING_1 = "Is there anything I can get for you?";
string GREETING_2 = "How can I be of service?";
string ITEM1 = "Mosstone Ale";
string ITEM1_DESCRIPTION = "We have the local favorite, Mosstone Ale";
string ITEM1_TAG = "<custom item tag to be delivered>";
string ITEM2 = "Tethyrian Rum";
string ITEM2_DESCRIPTION = "If you can stand it, we also have Tethyrian Rum";
string ITEM2_TAG = "<custom item tag to be delivered>";
string ITEM3 = "Amnian Gin";
string ITEM3_DESCRIPTION = "And finally, we recommend the Amnian Gin if you are headed out adventuring";
string ITEM1_MINOR = "Milk";
string ITEM1_MINOR_DESCRIPTION = "For such a young adventurer, a nice glass of Milk";
string ITEM1_MINOR_TAG = "<custom item tag to be delivered>";
void main();
string GetBarmaidsOrderQuery(object oBarmaid, object oTarget);
string GetBarmaidsOrderQuery(object oBarmaid, object oTarget)
{
int iRace = GetRacialType(oTarget);
int iRaceBarmaid = GetRacialType(oTarget);
int iGender = GetGender(oTarget);
int iBarmaidGender = GetGender(oBarmaid);
int iRep = GetReputation(oBarmaid, oTarget);
int iCharisma = GetAbilityScore(oTarget, ABILITY_CHARISMA);
int iAge = GetAge(oTarget);
int iGenderWorks = FALSE;
if ((iGender == iBarmaidGender) && ISA_HOMO) iGenderWorks = TRUE;
if ((iGender != iBarmaidGender) && (ISA_HOMO == FALSE)) iGenderWorks = TRUE;
if ((SERVE_ALL_REPUTATIONS==FALSE) && (iRep < REPUTATION_THRESHOLD))
{
SetLocalInt(oBarmaid, "REFUSE_CURRENT_CUSTOMER", TRUE);
return(NO_SERVICE_REPUTATION);
}
if ((iRace == RACIAL_TYPE_HUMAN) && (SERVE_HUMAN == FALSE))
{
SetLocalInt(oBarmaid, "REFUSE_CURRENT_CUSTOMER", TRUE);
return(NO_SERVICE_RACE + "We don't serve humans.");
}
if ((iRace == RACIAL_TYPE_ELF) && (SERVE_ELF == FALSE))
{
SetLocalInt(oBarmaid, "REFUSE_CURRENT_CUSTOMER", TRUE);
return(NO_SERVICE_RACE + "We don't serve elves.");
}
if ((iRace == RACIAL_TYPE_HALFELF) && (SERVE_HALFELF == FALSE))
{
SetLocalInt(oBarmaid, "REFUSE_CURRENT_CUSTOMER", TRUE);
return(NO_SERVICE_RACE + "We don't serve half-elves.");
}
if ((iRace == RACIAL_TYPE_GNOME) && (SERVE_GNOME == FALSE))
{
SetLocalInt(oBarmaid, "REFUSE_CURRENT_CUSTOMER", TRUE);
return(NO_SERVICE_RACE + "We don't serve gnomes.");
}
if ((iRace == RACIAL_TYPE_HALFLING) && (SERVE_HALFLING == FALSE))
{
SetLocalInt(oBarmaid, "REFUSE_CURRENT_CUSTOMER", TRUE);
return(NO_SERVICE_RACE + "We don't serve halflings.");
}
if ((iRace == RACIAL_TYPE_DWARF) && (SERVE_DWARF == FALSE))
{
SetLocalInt(oBarmaid, "REFUSE_CURRENT_CUSTOMER", TRUE);
return(NO_SERVICE_RACE + "We don't serve dwarves.");
}
if ((iRace == RACIAL_TYPE_HALFORC) && (SERVE_HALFORC == FALSE))
{
SetLocalInt(oBarmaid, "REFUSE_CURRENT_CUSTOMER", TRUE);
return(NO_SERVICE_RACE + "We don't serve halforcs.");
}
if(NOMINORS_USE_DRINKING_AGE)
{
if ((iRace == RACIAL_TYPE_HUMAN) && (iAge < NOMINORS_DRINKING_AGE_HUMAN))
{
SetLocalInt(oBarmaid, "KIDMENU_CURRENT_CUSTOMER", TRUE);
return(NOMINORS_GREETING);
}
if ((iRace == RACIAL_TYPE_ELF) && (iAge < NOMINORS_DRINKING_AGE_ELF))
{
SetLocalInt(oBarmaid, "KIDMENU_CURRENT_CUSTOMER", TRUE);
return(NOMINORS_GREETING);
}
if ((iRace == RACIAL_TYPE_HALFELF) && (iAge < NOMINORS_DRINKING_AGE_HALFELF))
{
SetLocalInt(oBarmaid, "KIDMENU_CURRENT_CUSTOMER", TRUE);
return(NOMINORS_GREETING);
}
if ((iRace == RACIAL_TYPE_GNOME) && (iAge < NOMINORS_DRINKING_AGE_GNOME))
{
SetLocalInt(oBarmaid, "KIDMENU_CURRENT_CUSTOMER", TRUE);
return(NOMINORS_GREETING);
}
if ((iRace == RACIAL_TYPE_HALFLING) && (iAge < NOMINORS_DRINKING_AGE_HALFLING))
{
SetLocalInt(oBarmaid, "KIDMENU_CURRENT_CUSTOMER", TRUE);
return(NOMINORS_GREETING);
}
if ((iRace == RACIAL_TYPE_DWARF) && (iAge < NOMINORS_DRINKING_AGE_DWARF))
{
SetLocalInt(oBarmaid, "KIDMENU_CURRENT_CUSTOMER", TRUE);
return(NOMINORS_GREETING);
}
if ((iRace == RACIAL_TYPE_HALFORC) && (iAge < NOMINORS_DRINKING_AGE_HALFORC))
{
SetLocalInt(oBarmaid, "KIDMENU_CURRENT_CUSTOMER", TRUE);
return(NOMINORS_GREETING);
}
}
if (WILL_FLIRT && (iCharisma >= FLIRT_THRESHOLD1) && (iRace == iRaceBarmaid) && iGenderWorks)
{
if (WILL_FLIRT && (iCharisma >= FLIRT_THRESHOLD2) && (iRace == iRaceBarmaid) && iGenderWorks)
{
int iRespNum = Random(2);
switch(iRespNum)
{
case 0:
return(FLIRT_HELLO2_1);
break;
case 1:
return(FLIRT_HELLO2_2);
break;
case 2:
return(FLIRT_HELLO2_3);
break;
}
}
else
{
if (WILL_BE_REPULSED && (iCharisma <= REPULSION_THRESHOLD2))
{
return(REPULSED_2);
}
else
{
if (WILL_BE_REPULSED && (iCharisma <= REPULSION_THRESHOLD1))
{
return(REPULSED_1);
}
}
}
}
int iGreet = Random(1);
switch(iGreet)
{
case 0:
return(GREETING_1);
case 1:
return(GREETING_2);
}
return(GREETING_1);
}
void main()
{
string sMe = GetTag(OBJECT_SELF);
int STATUS_READY =10;
int STATUS_BUSY=20;
int STATUS_FINISHED=30;
int STAGE_AQUIRE =10;
int STAGE_GETORDER =20;
int STAGE_WALKBAR =30;
int STAGE_GETDRINK =40;
int STAGE_DELIVERDRINK =50;
int STAGE_GOSTATION =60;
float BARMAID_DISTANCE_THRESHOLD=1000.0;
int IS_BARMAID_EFFICIENT = TRUE;
object oTarget;
object oBarWP;
object oStaWP;
int nEvent=GetUserDefinedEventNumber();
switch (nEvent)
{
case 2005:
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_READY);
break;
case 2006:
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_BUSY);
break;
case 2007:
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_FINISHED);
break;
case 1001:
int nStatus=GetLocalInt(OBJECT_SELF,"MAID_STATUS");
int nStage=GetLocalInt(OBJECT_SELF,"MAID_STAGE");
int iAquired = FALSE;
if (nStatus==0)
{
nStatus=STATUS_READY;
SetLocalInt(OBJECT_SELF,"MAID_STAGE",nStatus);
nStage=STAGE_AQUIRE;
SetLocalInt(OBJECT_SELF,"MAID_STAGE",nStage);
}
switch(nStage)
{
case 10:
if (nStatus==STATUS_READY)
{
SetLocalInt(OBJECT_SELF, "REFUSE_CURRENT_CUSTOMER", FALSE);
SetLocalInt(OBJECT_SELF, "KIDMENU_CURRENT_CUSTOMER", FALSE);
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_BUSY);
int iNth = GetLocalInt(OBJECT_SELF, "NTH_PATRON");
iNth++;
object oTarget = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_NOT_PC, OBJECT_SELF, iNth);
if (GetStringLeft(GetTag(oTarget), 7) == "BARMAID")
{
iNth++;
oTarget = GetNearestCreature(CREATURE_TYPE_IS_ALIVE, TRUE, OBJECT_SELF, iNth);
}
if (GetStringLeft(GetTag(oTarget), 9) == "BARTENDER")
{
iNth++;
oTarget = GetNearestCreature(CREATURE_TYPE_IS_ALIVE, TRUE, OBJECT_SELF, iNth);
}
if (GetIsObjectValid(oTarget) && (GetDistanceToObject(oTarget) <= BARMAID_DISTANCE_THRESHOLD))
{
iAquired = TRUE;
SetLocalObject(OBJECT_SELF,"MAID_TARGET",oTarget);
SetLocalInt(OBJECT_SELF, "NTH_PATRON", iNth);
ActionForceMoveToObject(oTarget, IS_BARMAID_EFFICIENT);
ActionDoCommand(SetFacingPoint(GetPositionFromLocation(GetLocation(oTarget))));
AssignCommand(oTarget, ActionWait(5.0));
AssignCommand(oTarget, SetFacingPoint(GetPositionFromLocation(GetLocation(GetObjectByTag(sMe)))));
}
else
{
iNth = 1;
oTarget = GetNearestCreature(CREATURE_TYPE_IS_ALIVE, TRUE, OBJECT_SELF, iNth);
if (GetIsObjectValid(oTarget) && (GetDistanceToObject(oTarget) <= BARMAID_DISTANCE_THRESHOLD))
{
iAquired = TRUE;
SetLocalObject(OBJECT_SELF,"MAID_TARGET",oTarget);
SetLocalInt(OBJECT_SELF, "NTH_PATRON", iNth);
ActionForceMoveToObject(oTarget, IS_BARMAID_EFFICIENT);
ActionDoCommand(SetFacingPoint(GetPositionFromLocation(GetLocation(oTarget))));
AssignCommand(oTarget, ActionWait(5.0));
AssignCommand(oTarget, SetFacingPoint(GetPositionFromLocation(GetLocation(GetObjectByTag(sMe)))));
}
else
{
SetLocalInt(OBJECT_SELF, "NTH_PATRON", 0);
}
}
if (iAquired)
ActionDoCommand(SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_FINISHED));
else
ActionDoCommand(SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_READY));
}
if (nStatus==STATUS_FINISHED)
{
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_READY);
SetLocalInt(OBJECT_SELF,"MAID_STAGE",STAGE_GETORDER);
}
break;
case 20:
if (nStatus==STATUS_READY)
{
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_BUSY);
object oTarget = GetLocalObject(OBJECT_SELF, "MAID_TARGET");
ActionPlayAnimation(ANIMATION_LOOPING_TALK_NORMAL, 1.0, 2.0);
ActionDoCommand(SpeakString(GetBarmaidsOrderQuery(OBJECT_SELF, oTarget)));
if (GetLocalInt(OBJECT_SELF,"REFUSE_CURRENT_CUSTOMER"))
{
ActionDoCommand(SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_READY));
ActionDoCommand(SetLocalInt(OBJECT_SELF,"MAID_STAGE",STAGE_DELIVERDRINK));
}
else
{
if (GetLocalInt(OBJECT_SELF,"KIDMENU_CURRENT_CUSTOMER"))
{
ActionDoCommand(SpeakString(ITEM1_MINOR_DESCRIPTION));
}
else
{
ActionWait(3.0);
ActionDoCommand(SpeakString(ITEM1_DESCRIPTION));
ActionWait(3.0);
ActionDoCommand(SpeakString(ITEM2_DESCRIPTION));
ActionWait(3.0);
ActionDoCommand(SpeakString(ITEM3_DESCRIPTION));
ActionWait(3.0);
int iDrink = Random(2);
AssignCommand(oTarget, ActionWait(8.0));
switch(iDrink)
{
case 0:
AssignCommand(oTarget, DelayCommand(8.0, SpeakString("I'll have " + ITEM1)));
break;
case 1:
AssignCommand(oTarget, DelayCommand(8.0, SpeakString("A " + ITEM2 + " sounds good!")));
break;
case 2:
AssignCommand(oTarget, DelayCommand(8.0, SpeakString("Please bring me a " + ITEM3)));
break;
}
SetLocalInt(OBJECT_SELF, "DRINK_CHOSEN", iDrink);
ActionWait(3.0);
ActionDoCommand(SpeakString("Coming right up!"));
}
ActionDoCommand(SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_FINISHED));
}
}
if (nStatus==STATUS_FINISHED)
{
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_READY);
SetLocalInt(OBJECT_SELF,"MAID_STAGE",STAGE_WALKBAR);
}
break;
case 30:
if (nStatus==STATUS_READY)
{
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_BUSY);
object oBarWP = GetObjectByTag("WP_" + GetTag(OBJECT_SELF) + "_BAR");
if (GetIsObjectValid(oBarWP)==FALSE)
{
ActionDoCommand(SpeakString("Perhaps the owner should buy a bar for this inn... and tag it WP_" + GetTag(OBJECT_SELF) + "_BAR"));
}
else
{
ActionForceMoveToObject(oBarWP, IS_BARMAID_EFFICIENT);
ActionDoCommand(SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_FINISHED));
}
}
if (nStatus==STATUS_FINISHED)
{
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_READY);
SetLocalInt(OBJECT_SELF,"MAID_STAGE",STAGE_GETDRINK);
}
break;
case 40:
if (nStatus==STATUS_READY)
{
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_BUSY);
object oTarget = GetLocalObject(OBJECT_SELF, "MAID_TARGET");
int iDrinkChosen = GetLocalInt(OBJECT_SELF, "DRINK_CHOSEN");
switch(iDrinkChosen)
{
case 0:
ActionDoCommand(SpeakString("Please give me a " + ITEM1));
break;
case 1:
ActionDoCommand(SpeakString("I need a " + ITEM2));
break;
case 2:
ActionDoCommand(SpeakString("Load me up with a " + ITEM3));
break;
}
ActionWait(2.0);
ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 2.0);
ActionDoCommand(SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_FINISHED));
}
if (nStatus==STATUS_FINISHED)
{
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_READY);
SetLocalInt(OBJECT_SELF,"MAID_STAGE",STAGE_DELIVERDRINK);
}
break;
case 50:
if (nStatus==STATUS_READY)
{
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_BUSY);
object oTarget = GetLocalObject(OBJECT_SELF, "MAID_TARGET");
ActionForceMoveToObject(oTarget);
ActionPlayAnimation(ANIMATION_LOOPING_GET_MID, 1.0, 2.0);
int iDrinkChosen = GetLocalInt(OBJECT_SELF, "DRINK_CHOSEN");
switch(iDrinkChosen)
{
case 0:
ActionDoCommand(SpeakString("Here's your " + ITEM1));
break;
case 1:
ActionDoCommand(SpeakString("Enjoy your " + ITEM2));
break;
case 2:
ActionDoCommand(SpeakString("Your " + ITEM3 + " is ready!"));
break;
}
int iTargetSits = GetLocalInt(oTarget, "SITS_DOWN");
if (iTargetSits)
{
object oMychair = GetNearestObjectByTag("chair", oTarget);
AssignCommand(oTarget, DelayCommand(4.0, ActionSit(oMychair)));
}
ActionDoCommand(SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_FINISHED));
}
if (nStatus==STATUS_FINISHED)
{
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_READY);
SetLocalInt(OBJECT_SELF,"MAID_STAGE",STAGE_GOSTATION);
}
break;
case 60:
if (nStatus==STATUS_READY)
{
object oStaWP = GetObjectByTag("WP_" + GetTag(OBJECT_SELF) + "_STA");
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_BUSY);
if (GetIsObjectValid(oStaWP)==FALSE)
{
ActionDoCommand(SpeakString("Perhaps the owner should give me a station in this inn... and tag it WP_" + GetTag(OBJECT_SELF) + "_STA"));
}
else
{
ActionForceMoveToObject(oStaWP);
ActionDoCommand(SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_FINISHED));
}
}
if (nStatus==STATUS_FINISHED)
{
SetLocalInt(OBJECT_SELF,"MAID_STATUS",STATUS_READY);
SetLocalInt(OBJECT_SELF,"MAID_STAGE",STAGE_AQUIRE);
}
break;
}
break;
}
}