Added CCOH and missing areas Changed some areas to be craftable, Fixed some on death issues, Fixed the Gaurd
321 lines
15 KiB
Plaintext
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;
|
|
}
|