272 lines
8.0 KiB
Plaintext
272 lines
8.0 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Purple Rose Inn Resting Modifications (NON-HCR)
|
|
//:: pri_on_play_rest
|
|
//:: Copyright (c) 2002 Shepherd Software Inc.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Modified By: Russell S. Ahlstrom
|
|
//:: Modified On: September 16, 2002
|
|
//:://////////////////////////////////////////////
|
|
|
|
//Purple Rose v 1.1.3
|
|
|
|
#include "pri_text"
|
|
#include "pri_inc"
|
|
|
|
|
|
int iBedUse;
|
|
int nHasFood;
|
|
int nRestHP;
|
|
object oMod = GetModule();
|
|
object oBedroll;
|
|
|
|
int DoesPCHaveBedroll(object oPC)
|
|
{
|
|
oBedroll = GetItemPossessedBy(oPC,"bedroll");
|
|
if (GetIsObjectValid(oBedroll))
|
|
return 1;
|
|
else {
|
|
oBedroll = GetLocalObject(oMod,"inbedroll" + GetName(oPC) + GetPCPublicCDKey(oPC));
|
|
if (GetIsObjectValid(oBedroll))
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
object GetPCRestFood(object oPC)
|
|
{
|
|
object oMyFood;
|
|
|
|
object oEquip = GetFirstItemInInventory(oPC);
|
|
while(GetIsObjectValid(oEquip)) {
|
|
if(!FindSubString(GetTag(oEquip),"Food")) {
|
|
oMyFood = oEquip;
|
|
break;
|
|
}
|
|
oEquip = GetNextItemInInventory(oPC);
|
|
}
|
|
return oMyFood;
|
|
}
|
|
|
|
int DoesPCHaveFoodToRest(object oPC)
|
|
{
|
|
int nNotOkToRest = 0;
|
|
if(!nHasFood)
|
|
{
|
|
FloatingTextStringOnCreature(TOOHUNGRY, oPC, FALSE);
|
|
AssignCommand( oPC, ClearAllActions());
|
|
nNotOkToRest = 1;
|
|
}
|
|
return nNotOkToRest;
|
|
}
|
|
|
|
void ApplySleepEffects(object oPC)
|
|
{
|
|
effect eSnore = EffectVisualEffect(VFX_IMP_SLEEP);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSnore, oPC, 7.0);
|
|
//insert special effects here. I tried EffectSleep along with different
|
|
//animations. They either get overrode by the rest anim or cancel the rest.
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSnore, oPC, 7.0);
|
|
effect eBad = GetFirstEffect(oPC);
|
|
//Search for negative effects
|
|
int nBlindMe=1;
|
|
while(GetIsEffectValid(eBad))
|
|
{
|
|
int nEtype=GetEffectType(eBad);
|
|
if(nEtype==EFFECT_TYPE_TRUESEEING)
|
|
nBlindMe=0;
|
|
eBad=GetNextEffect(oPC);
|
|
}
|
|
if(nBlindMe)
|
|
{
|
|
effect eBlind = EffectBlindness();
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlind, oPC, 29.0);
|
|
}
|
|
DelayCommand(7.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSnore, oPC, 7.0));
|
|
}
|
|
|
|
void RemoveSleepBlindness(object oPC)
|
|
{
|
|
effect eBad = GetFirstEffect(oPC);
|
|
//Search for negative effects
|
|
while(GetIsEffectValid(eBad)) {
|
|
int nEtype=GetEffectType(eBad);
|
|
if (nEtype == EFFECT_TYPE_BLINDNESS) {
|
|
//Remove effect if it is negative.
|
|
RemoveEffect(oPC, eBad);
|
|
}
|
|
eBad = GetNextEffect(oPC);
|
|
}
|
|
}
|
|
|
|
void ReplaceBedroll(object oPC)
|
|
{
|
|
oBedroll=GetLocalObject(oMod, "inbedroll"+GetName(oPC)+GetPCPublicCDKey(oPC));
|
|
CreateItemOnObject("bedroll", oPC);
|
|
DestroyObject(oBedroll);
|
|
DeleteLocalObject(oMod, "inbedroll"+GetName(oPC)+GetPCPublicCDKey(oPC));
|
|
}
|
|
|
|
void main()
|
|
{
|
|
object oPC = GetLastPCRested();
|
|
|
|
int iBedroll;
|
|
int iBedUse = GetLocalInt(oPC, "RSA_BedUse");
|
|
|
|
if (iBedUse == 0) iBedroll = DoesPCHaveBedroll(oPC);
|
|
|
|
nRestHP = GetCurrentHitPoints(oPC);
|
|
|
|
//PRI Mod
|
|
|
|
int iCanBedRoll = 1;
|
|
int iSleep = 0;
|
|
int iKill = 0;
|
|
int iWakeUp = 0;
|
|
int iRatChance = 0;
|
|
int iFail = 0;
|
|
|
|
string sWhyNoSleep = "Error in pri_on_play_rest script";
|
|
string sPoorRoom = "Error in pri_on_play_rest script";
|
|
string sFood = GetLocalString(oPC, "RSA_FoodType");
|
|
|
|
object oButler = OBJECT_INVALID;
|
|
|
|
object oPRIForceInnRest = GetNearestObjectByTag("PRIForceInnRest", oPC);
|
|
if (GetIsObjectValid(oPRIForceInnRest)) iCanBedRoll = 0;
|
|
|
|
if (iBedUse > 0)
|
|
{
|
|
GetInnArea(oPC);
|
|
|
|
iRatChance = GetLocalInt(oPC, "RSA_RatChance");
|
|
|
|
string sButler = GetLocalString(oPC, "RSA_Butler");
|
|
sPoorRoom = GetLocalString(oPC, "RSA_PoorWake");
|
|
|
|
oButler = GetObjectByTag(sButler);
|
|
|
|
if (iBedUse == iRSA_POORBED) iWakeUp = 1;
|
|
|
|
if (iBedUse == iRSA_RICHBED) iKill = GetLocalInt(oButler, "RSA_KillInSleep");
|
|
|
|
}
|
|
|
|
if (iBedUse > 0 || (iCanBedRoll > 0 && iBedroll > 0)) iSleep = 1;
|
|
|
|
if (iSleep == 0 && GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED)
|
|
{
|
|
AssignCommand(oPC, ClearAllActions());
|
|
sWhyNoSleep = NOBEDROLL;
|
|
if (iCanBedRoll == 0) sWhyNoSleep = SLEEPINN;
|
|
FloatingTextStringOnCreature(sWhyNoSleep, oPC, FALSE);
|
|
return;
|
|
}
|
|
|
|
if ((iSleep == 0 && GetLastRestEventType() == REST_EVENTTYPE_REST_CANCELLED) ||
|
|
(iSleep == 0 && GetLastRestEventType() == REST_EVENTTYPE_REST_FINISHED))
|
|
{
|
|
return;
|
|
}
|
|
|
|
//End of PRI Mod
|
|
|
|
if (GetLastRestEventType() == REST_EVENTTYPE_REST_STARTED)
|
|
{
|
|
nHasFood = 0;
|
|
SetLocalInt(oMod,"HPStartRest" + GetName(oPC) + GetPCPublicCDKey(oPC),nRestHP);
|
|
object oFood;
|
|
int iFail = 0;
|
|
|
|
if (iBedUse == 0)
|
|
{
|
|
|
|
oFood = GetPCRestFood(oPC);
|
|
|
|
if (GetIsObjectValid(oFood))
|
|
{
|
|
nHasFood = 1;
|
|
sFood = GetTag(oFood);
|
|
SetLocalString(oPC, "RSA_FoodType", sFood);
|
|
}
|
|
|
|
iFail = DoesPCHaveFoodToRest(oPC);
|
|
}
|
|
|
|
if (!iFail)
|
|
{
|
|
//set the variables for the current time to mark the pc as resting
|
|
if (iBedUse == 0)
|
|
{
|
|
DestroyObject(oFood);
|
|
SendMessageToPC(oPC, EATFOOD + " [" + GetName(oFood) + "]");
|
|
}
|
|
ApplySleepEffects(oPC);
|
|
}
|
|
if (iBedroll && iBedUse == 0)
|
|
{
|
|
object oNewBedroll=CreateObject(OBJECT_TYPE_PLACEABLE,"bedroll",GetLocation(oPC));
|
|
DestroyObject(oBedroll);
|
|
SetLocalObject(oMod,"inbedroll"+GetName(oPC)+GetPCPublicCDKey(oPC),oNewBedroll);
|
|
}
|
|
//PRI Mod
|
|
|
|
if (iFail == 1) SetLocalString(oPC, "RSA_FoodType", "None");
|
|
|
|
if (iBedUse > 0)
|
|
{
|
|
if (iWakeUp == 1 && iFail == 0)
|
|
{
|
|
int iRoll = d100(1);
|
|
if (iRoll >= iRatChance)
|
|
{
|
|
AssignCommand(oPC, ClearAllActions());
|
|
SendMessageToPC(oPC, sPoorRoom);
|
|
}
|
|
}
|
|
|
|
if (iKill == 1 && iFail == 0)
|
|
{
|
|
SendMessageToAllDMs(GetName(oPC)+" has been targeted by the Assassin in "+GetName(GetArea(oPC))+".");
|
|
location lLoc = GetLocation(GetWaypointByTag("AssassinSpawn"));
|
|
object oAssassin = CreateObject(OBJECT_TYPE_CREATURE, "assassian", lLoc, TRUE);
|
|
AssignCommand(oAssassin, ActionAttack(oPC, FALSE));
|
|
SetLocalInt(oButler, "RSA_KillInSleep", 0);
|
|
SendMessageToAllDMs("Assassin in"+GetName(GetArea(oPC))+" is now toggled off!");
|
|
}
|
|
}
|
|
|
|
//End of PRI Mod
|
|
}
|
|
|
|
int nLastRestType=GetLastRestEventType();
|
|
if (nLastRestType == REST_EVENTTYPE_REST_FINISHED || nLastRestType == REST_EVENTTYPE_REST_CANCELLED)
|
|
{
|
|
RemoveSleepBlindness(oPC);
|
|
int ExtraPostRestHealing = 0;
|
|
if (sFood == "FoodPOISON3")
|
|
{
|
|
SendMessageToPC(oPC, "You start to feel sick.");
|
|
SendMessageToAllDMs(GetName(oPC)+" ate some poisoned food!");
|
|
ExtraPostRestHealing = iRSA_POISONFOOD;
|
|
effect ePoison = EffectPoison(iRSA_POISONTYPE);
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoison, oPC);
|
|
int nSHP=GetLocalInt(oMod,("HPStartRest"+GetName(oPC)+GetPCPublicCDKey(oPC)));
|
|
int nDam;
|
|
nDam = ((nRestHP - nSHP) + ExtraPostRestHealing);
|
|
effect eDamage = EffectDamage(nDam, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_NORMAL);
|
|
ApplyEffectToObject( DURATION_TYPE_INSTANT, eDamage, oPC);
|
|
}
|
|
|
|
SetLocalString(oPC, "RSA_FoodType", "AteFood");
|
|
|
|
if (iBedroll && iBedUse == 0)
|
|
ReplaceBedroll(oPC);
|
|
|
|
}
|
|
|
|
}
|