Aschbourne_PRC8/_module/nss/ww_inc_on_hrtbt.nss
GetOffMyYarn 69879d6957 Areas and Fixes
Added CCOH and missing areas
Changed some areas to be craftable,
Fixed some on death issues,
Fixed the Gaurd
2024-08-30 11:38:44 -04:00

321 lines
15 KiB
Plaintext

#include "clone_lib"
void WWHrtbt(object oPC)
{
object oPC = GetFirstPC();
object oMod=GetModule();
//Make sure the PC we're looking at is valid, and keep cycling until the last PC
while (GetIsObjectValid(oPC))
{
//SendMessageToPC(oPC,"Werewolf Heartbeat.");
if((GetIsNight() == TRUE) && (GetLocalInt(oPC,"AFF_WEREWOLF") == 1) && (GetLocalInt(oPC,"ONE_CHANGE") != 1))
{
//Get the location of the PC we're looking at
location lTransform = GetLocation(oPC);
int iWolfDays = GetLocalInt(oPC,"WOLF_DAYS");
int iCurrentDay = GetCalendarDay();
int iFullMoon1 = GetLocalInt(oMod,"FullMoon1");
int iFullMoon2 = GetLocalInt(oMod,"FullMoon2");
int iFullMoon3 = GetLocalInt(oMod,"FullMoon3");
SetCampaignInt("WWData","iChangeNow",0,oPC);
SetLocalInt(oPC,"iChangeNow",0);
if(iWolfDays != 29)
{
if(iWolfDays == 3)
{
SetCampaignInt("WWData","WOLF_PERM",1,oPC);
SetLocalInt(oPC,"WOLF_PERM",1);
}
if((iCurrentDay == iFullMoon1) || (iCurrentDay == iFullMoon2) || (iCurrentDay == iFullMoon3))
{
SetCampaignInt("WWData","iChangeNow",1,oPC);
SetLocalInt(oPC,"iChangeNow",1);
}
iWolfDays++;
}
SetCampaignInt("WWData","WOLF_DAYS",iWolfDays,oPC);
SetLocalInt(oPC,"WOLF_DAYS",iWolfDays);
if(iWolfDays == 29)
{
SetCampaignInt("WWData","WOLF_DAYS",0,oPC);
SetLocalInt(oPC,"WOLF_DAYS",0);
}
//make sure the player is actually a werewolf
if((GetLocalInt(oPC,"HAS_WEREWOLF_EFFECT") != 1))
{
//make sure we only check once per night
SetCampaignInt("WWData","ONE_CHANGE",1,oPC);
SetLocalInt(oPC,"ONE_CHANGE",1);
int iFirstChange = GetLocalInt(oPC,"FIRST_CHANGE");
//only allow PC to resist change AFTER first change
int iChangeNow=GetLocalInt(oPC,"iChangeNow");
if((!(iFirstChange)) && (iChangeNow))
{
int iWereWolfWillResist = WillSave(oPC,25);
if (!(iWereWolfWillResist))
{
SendMessageToPC(oPC,"You could not resist the change.");
PlayVoiceChat(VOICE_CHAT_BATTLECRY1,oPC);
ExecuteScript("wwamrbrk",oPC);
RemoveFromParty(oPC);
//Apply werewolf transformation...
//object oWWolf = CreateObject(OBJECT_TYPE_CREATURE,"pcwerewolf",lTransform);
object oWWolf = CreatePCClone(oPC, lTransform, CustomSet_DefaultSet, FALSE);
//SetCustomSetScriptSet(CustomSet_DefaultSet,oWWolf);
SetCustomSet_OnPerception("ww_c2_default1",oWWolf);
SetCustomSet_OnCombatRoundEnd("werewolfattack",oWWolf);
SetCustomSet_OnDeath("pcwerewolfdeath",oWWolf);
SetCustomSet_OnPhysicalAttacked("wereonatt",oWWolf);
CustomSet_respawn(oWWolf);
//effect ePolymorphVFX = EffectVisualEffect(VFX_IMP_POLYMORPH);
effect ePolymorph = EffectPolymorph(POLYMORPH_TYPE_WEREWOLF,TRUE);
//ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePolymorphVFX, oWWolf);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePolymorph, oWWolf);
object oFirstNPC = GetFirstObjectInShape(SHAPE_SPHERE,10.0,lTransform,FALSE,OBJECT_TYPE_CREATURE);
while(oFirstNPC != OBJECT_INVALID)
{
int iSeen = GetObjectSeen(oPC,oFirstNPC);
if (iSeen)
{
SetLocalInt(oPC,"WasSeen",1);
}
//Get next object.
oFirstNPC = GetNextObjectInShape(SHAPE_SPHERE,10.0,lTransform,FALSE,OBJECT_TYPE_CREATURE);
}
effect eParalyze =EffectCutsceneParalyze();
effect eInvis = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
effect eSpellImmune = EffectImmunity(SPELL_ALL_SPELLS);
effect eInvuln = EffectDamageReduction(10000,DAMAGE_POWER_PLUS_TWENTY);
effect eSanct = EffectEthereal();
effect eLink = EffectLinkEffects(eParalyze,eInvis);
effect eLink2 = EffectLinkEffects(eSpellImmune,eInvuln);
object oMod = GetModule();
int iHour = GetLocalInt(oMod,"HourLength");
int iMorning = GetLocalInt(oMod,"StartDay");
int iNight = GetLocalInt(oMod,"StartNight");
int iTime = GetTimeHour();
int iTimePre24 = (24-iTime);
if (iNight<=iTime<=24)
{
int iDuration = ((iTimePre24+iMorning)*iHour);
float fDuration = IntToFloat(iDuration);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink,oPC,fDuration);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink2,oPC,fDuration);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSanct,oPC,fDuration);
//ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSanct,oPC,fDuration+2);
}
if (iTime<=iMorning)
{
//int iDuration = (iTime*iHour);
int iDuration = ((iMorning-iTime)*iHour);
float fDuration = IntToFloat(iDuration);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink,oPC,fDuration);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink2,oPC,fDuration);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSanct,oPC,fDuration);
//ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSanct,oPC,fDuration+2);
}
//End of the fun for making them watch themselves
SetLocalObject(oPC,"MY_WOLF",oWWolf);
object oWerewolf = GetLocalObject(oPC,"MY_WOLF");
AddHenchman(oPC,oWerewolf);
SetCampaignInt("WWData", "HAS_WEREWOLF_EFFECT", 1,oPC);
SetLocalInt(oPC,"HAS_WEREWOLF_EFFECT", 1);
SetCampaignInt("WWData", "INVOLUNTARY",1,oPC);
SetLocalInt(oPC, "INVOLUNTARY",1);
}
}
if((iChangeNow) && (iFirstChange))
{
SendMessageToPC(oPC,"You could not resist the change.");
PlayVoiceChat(VOICE_CHAT_BATTLECRY1,oPC);
ExecuteScript("wwamrbrk",oPC);
RemoveFromParty(oPC);
//Apply werewolf transformation...
//object oWWolf = CreateObject(OBJECT_TYPE_CREATURE,"pcwerewolf",lTransform);
object oWWolf = CreatePCClone(oPC, lTransform, CustomSet_DefaultSet, FALSE);
//effect ePolymorphVFX = EffectVisualEffect(VFX_IMP_POLYMORPH);
effect ePolymorph = EffectPolymorph(POLYMORPH_TYPE_WEREWOLF,TRUE);
//ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePolymorphVFX, oWWolf);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePolymorph, oWWolf);
object oFirstNPC = GetFirstObjectInShape(SHAPE_SPHERE,10.0,lTransform,FALSE,OBJECT_TYPE_CREATURE);
while(oFirstNPC != OBJECT_INVALID)
{
int iSeen = GetObjectSeen(oWWolf,oFirstNPC);
if (iSeen)
{
SetLocalInt(oPC,"WasSeen",1);
}
//Get next object.
oFirstNPC = GetNextObjectInShape(SHAPE_SPHERE,10.0,lTransform,FALSE,OBJECT_TYPE_CREATURE);
}
effect eParalyze =EffectCutsceneParalyze();
effect eInvis = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
effect eSpellImmune = EffectImmunity(SPELL_ALL_SPELLS);
effect eInvuln = EffectDamageReduction(10000,DAMAGE_POWER_PLUS_TWENTY);
effect eSanct = EffectEthereal();
effect eLink = EffectLinkEffects(eParalyze,eInvis);
effect eLink2 = EffectLinkEffects(eSpellImmune,eInvuln);
object oMod = GetModule();
int iHour = GetLocalInt(oMod,"HourLength");
int iMorning = GetLocalInt(oMod,"StartDay");
int iNight = GetLocalInt(oMod,"StartNight");
int iTime = GetTimeHour();
int iTimePre24 = (24-iTime);
if (iNight<=iTime<=24)
{
int iDuration = ((iTimePre24+iMorning)*iHour);
float fDuration = IntToFloat(iDuration);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink,oPC,fDuration);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink2,oPC,fDuration);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSanct,oPC,fDuration);
//ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSanct,oPC,fDuration+2);
}
if (iTime<=iMorning)
{
//int iDuration = (iTime*iHour);
int iDuration = ((iMorning-iTime)*iHour);
float fDuration = IntToFloat(iDuration);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink,oPC,fDuration);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink2,oPC,fDuration);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSanct,oPC,fDuration);
//ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSanct,oPC,fDuration+2);
}
//End of the fun for making them watch themselves
SetLocalObject(oPC,"MY_WOLF",oWWolf);
object oWerewolf = GetLocalObject(oPC,"MY_WOLF");
AddHenchman(oPC,oWerewolf);
SetCampaignInt("WWData", "HAS_WEREWOLF_EFFECT", 1,oPC);
SetLocalInt(oPC, "HAS_WEREWOLF_EFFECT", 1);
SetCampaignInt("WWData","FIRST_CHANGE",0,oPC);
SetLocalInt(oPC,"FIRST_CHANGE",0);
SetCampaignInt("WWData","INVOLUNTARY",1,oPC);
SetLocalInt(oPC,"INVOLUNTARY",1);
}
}
}
if(((GetIsDawn() == TRUE) || (GetIsDay() == TRUE)) &&
(GetLocalInt(oPC, "HAS_WEREWOLF_EFFECT") == 1) && (GetLocalInt(oPC, "wolfdead") == 0))
{
object oWerewolf = GetLocalObject(oPC,"MY_WOLF");
location lWerewolf = GetLocation(oWerewolf);
//Remove effects from the PC
effect eLoop=GetFirstEffect(oPC);
while (GetIsEffectValid(eLoop))
{
if (GetEffectType(eLoop)==EFFECT_TYPE_CUTSCENE_PARALYZE)
RemoveEffect(oPC, eLoop);
//if (GetEffectType(eLoop)==EFFECT_TYPE_DAMAGE_REDUCTION)
//RemoveEffect(oPC, eLoop);
//if (GetEffectType(eLoop)==EFFECT_TYPE_IMMUNITY)
//RemoveEffect(oPC, eLoop);
//if (GetEffectType(eLoop)==EFFECT_TYPE_VISUALEFFECT)
//RemoveEffect(oPC, eLoop);
//if (GetEffectType(eLoop)==EFFECT_TYPE_ETHEREAL)
//RemoveEffect(oPC, eLoop);
eLoop=GetNextEffect(oPC);
}
AssignCommand(oPC,JumpToLocation(lWerewolf));
DestroyObject(oWerewolf);
while (GetIsEffectValid(eLoop))
{
//if (GetEffectType(eLoop)==EFFECT_TYPE_CUTSCENE_PARALYZE)
//RemoveEffect(oPC, eLoop);
if (GetEffectType(eLoop)==EFFECT_TYPE_DAMAGE_REDUCTION)
RemoveEffect(oPC, eLoop);
if (GetEffectType(eLoop)==EFFECT_TYPE_IMMUNITY)
RemoveEffect(oPC, eLoop);
if (GetEffectType(eLoop)==EFFECT_TYPE_ETHEREAL)
RemoveEffect(oPC, eLoop);
if (GetEffectType(eLoop)==EFFECT_TYPE_VISUALEFFECT)
RemoveEffect(oPC, eLoop);
eLoop=GetNextEffect(oPC);
}
effect ePolymorphVFX = EffectVisualEffect(VFX_IMP_POLYMORPH);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePolymorphVFX, oPC);
object oFirstNPC = GetFirstObjectInShape(SHAPE_SPHERE,10.0,lWerewolf,FALSE,OBJECT_TYPE_CREATURE);
while(oFirstNPC != OBJECT_INVALID)
{
int iSeen = GetObjectSeen(oPC,oFirstNPC);
if (iSeen)
{
SetLocalInt(oPC,"WasSeen",1);
}
//Get next object.
oFirstNPC = GetNextObjectInShape(SHAPE_SPHERE,10.0,lWerewolf,FALSE,OBJECT_TYPE_CREATURE);
}
//End of the fun for making them watch themselves
SetCampaignInt("WWData", "HAS_WEREWOLF_EFFECT", 0,oPC);
SetLocalInt(oPC, "HAS_WEREWOLF_EFFECT", 0);
SetCampaignInt("WWData","ONE_CHANGE",0,oPC);
SetLocalInt(oPC,"ONE_CHANGE",0);
SetCampaignInt("WWData","INVOLUNTARY",0,oPC);
SetLocalInt(oPC,"INVOLUNTARY",0);
SetCampaignInt("WWData","WOLF_TOOL_CHARGE",0,oPC);
SetLocalInt(oPC,"WOLF_TOOL_CHARGE",0);
//see if pc realized what happend and if so create tool on pc
int iAbility = GetAbilityModifier(ABILITY_WISDOM,oPC);
int iRoll = d20(1);
//make sure pc doesn't already have tool
int iTool = GetLocalInt(oPC,"WWTOOL");
if(((iRoll+iAbility) >= 15) && !(iTool))
{
SendMessageToPC(oPC,"You realize you are infected with lycanthropy and may attempt to control your form.");
CreateItemOnObject("controlshapetool",oPC);
CreateItemOnObject("wolfformtool",oPC);
SetCampaignInt("WWData","WWTOOL",1,oPC);
SetLocalInt(oPC,"WWTOOL",1);
}
}
if(((GetIsDawn() == TRUE) || (GetIsDay() == TRUE)) &&
(GetLocalInt(oPC, "HAS_WEREWOLF_EFFECT") == 1) && (GetLocalInt(oPC, "wolfdead") ==1) &&
(GetLocalInt(oPC,"ONE_CHANGE") !=0))
{
SetCampaignInt("WWData","INVOLUNTARY",0,oPC);
SetLocalInt(oPC,"INVOLUNTARY",0);
SetCampaignInt("WWData", "HAS_WEREWOLF_EFFECT", 0,oPC);
SetLocalInt(oPC,"HAS_WEREWOLF_EFFECT", 0);
SetCampaignInt("WWData", "wolfdead", 0,oPC);
SetLocalInt(oPC,"wolfdead", 0);
SetCampaignInt("WWData","ONE_CHANGE",0,oPC);
SetLocalInt(oPC,"ONE_CHANGE", 0);
}
int iWait=GetLocalInt(oPC,"iWait");
int iReady=GetCalendarDay();
if(((GetIsDawn() == TRUE) || (GetIsDay() == TRUE)) && (GetLocalInt(oPC, "AFF_WEREWOLF") == 1)&&(iReady==iWait))
{
SetCampaignInt("WWData","WOLF_TOOL_CHARGE",0,oPC);
SetLocalInt(oPC,"WOLF_TOOL_CHARGE",0);
}
if(((GetIsDawn() == TRUE) || (GetIsDay() == TRUE)) && (GetLocalInt(oPC,"ONE_CHANGE") !=0))
{
SetCampaignInt("WWData","ONE_CHANGE",0,oPC);
SetLocalInt(oPC,"ONE_CHANGE",0);
}
oPC = GetNextPC();//end werewolf stuff
}
return;
}