#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; }