////////////////////////////////////////////////////////////////////////////// // Player Vampirism Control Script // By Deva Bryson Winblood 12/05/2003 ////////////////////////////////////////////////////////////////////////////// /* This script will make sure the player always has the proper tools for use with this affliction. It will make sure they have the proper skin. It will make them sleepy during the day. It will make them burn if on the surface during the day. If you have not fed on blood for awhile it will make you lash out at nearby enemies. */ #include "header_sounds" #include "prc_x2_itemprop" #include "rtS_inc_feats" #include "prc_inc_skin" const int VAMPIRE_XP_PER_LEVEL = 5000; /*void fnNewSkin(string sRes,object oMe) { // update level object oItem; SendMessageToPC(oMe,"Need a new Vampire Skin with RESREF:'"+sRes+".'"); oItem=GetItemPossessedBy(oMe,sRes); if (oItem==OBJECT_INVALID) { // create new skin SendMessageToPC(oMe," Do not currently have that skin."); oItem=CreateItemOnObject(sRes,oMe,1); SendMessageToPC(oMe," A skin with resref:'"+GetResRef(oItem)+"' was created."); } // create new skin DelayCommand(0.99,SendMessageToPC(oMe," Clear Actions and equip the new skin.")); DelayCommand(1.0,AssignCommand(oMe,ClearAllActions(TRUE))); DelayCommand(1.1,AssignCommand(oMe,ActionEquipItem(oItem,INVENTORY_SLOT_CARMOUR))); DelayCommand(1.2,SendMessageToPC(oMe," New skin should be equipped.")); } // fnNewSkin */ int fnSkinLevel(object oItem) { // returns current skin level int nRet=0; itemproperty pC; if (oItem!=OBJECT_INVALID) { // is wearing a skin pC=ItemPropertySkillBonus(SKILL_HIDE,4); if (IPGetItemHasProperty(oItem,pC,-1,FALSE)==TRUE) nRet=1; else { // check for level 2 pC=ItemPropertySkillBonus(SKILL_HIDE,5); if (IPGetItemHasProperty(oItem,pC,-1,FALSE)==TRUE) nRet=2; else { // check for level 3 pC=ItemPropertySkillBonus(SKILL_HIDE,6); if (IPGetItemHasProperty(oItem,pC,-1,FALSE)==TRUE) nRet=3; else { // check for level 4 pC=ItemPropertySkillBonus(SKILL_HIDE,7); if (IPGetItemHasProperty(oItem,pC,-1,FALSE)==TRUE) nRet=4; else { // check for level 5 pC=ItemPropertySkillBonus(SKILL_HIDE,8); if (IPGetItemHasProperty(oItem,pC,-1,FALSE)==TRUE) nRet=5; } // check for level 5 } // check for level 4 } // check for level 3 } // check for level 2 } // is wearing a skin return nRet; } // fnSkinLevel() void fnLevelUp(object oMe) { // increase the powers of the vampire skin //object oItem=GetItemInSlot(INVENTORY_SLOT_CARMOUR,oMe); object oItem = GetPCSkin(oMe); int nXP=GetLocalInt(oMe,"nVampireXP"); int nNextLevel=1+(nXP/VAMPIRE_XP_PER_LEVEL); itemproperty iP; if (nNextLevel>5) nNextLevel=5; if (nNextLevel<6) { // next level valid switch(nNextLevel) { // level up switch case 1: { // create level 1 properties SendMessageToPC(oMe,"You are now a 1st level vampire."); effect eUndead = EffectBonusFeat(FEAT_UNDEAD); eUndead = UnyieldingEffect(eUndead); eUndead = TagEffect(eUndead, "EFFECT_VAMPIRE"); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eUndead, oMe, 0.0f); IPRemoveAllItemProperties(oItem,DURATION_TYPE_PERMANENT); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_CHA,1); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_DEX,1); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_STR,2); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_AC_BONUS)==FALSE) { // add AC bonus iP=ItemPropertyACBonus(5); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,TRUE); } // add AC bonus iP=ItemPropertyCastSpell(IP_CONST_CASTSPELL_CHARM_PERSON_2,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageReduction(IP_CONST_DAMAGEREDUCTION_1,IP_CONST_DAMAGESOAK_5_HP); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGERESIST_5); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGERESIST_5); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyRegeneration(1); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,TRUE); iP=ItemPropertySkillBonus(SKILL_HIDE,4); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_LISTEN,4); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_MOVE_SILENTLY,4); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_SPOT,4); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); break; } // create level 1 properties case 2: { // add level 2 properties SendMessageToPC(oMe,"You are now a 2nd level vampire."); IPRemoveAllItemProperties(oItem,DURATION_TYPE_PERMANENT); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_CHA,2); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_DEX,2); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_STR,3); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_INT,1); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_WIS,1); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_AC_BONUS)==FALSE) { // add AC bonus iP=ItemPropertyACBonus(5); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,TRUE); } // add AC bonus iP=ItemPropertyCastSpell(IP_CONST_CASTSPELL_CHARM_PERSON_2,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageReduction(IP_CONST_DAMAGEREDUCTION_1,IP_CONST_DAMAGESOAK_10_HP); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGERESIST_10); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGERESIST_10); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyRegeneration(1); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,TRUE); iP=ItemPropertySkillBonus(SKILL_HIDE,5); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_LISTEN,5); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_MOVE_SILENTLY,5); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_SPOT,5); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_DISEASE); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,TRUE); iP=ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_POISON); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyBonusFeat(IP_CONST_FEAT_ALERTNESS); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyBonusFeat(IP_CONST_FEAT_DODGE); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); break; } // add level 2 properties case 3: { // add level 3 properties SendMessageToPC(oMe,"You are now a 3rd level vampire."); IPRemoveAllItemProperties(oItem,DURATION_TYPE_PERMANENT); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_CHA,2); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_DEX,2); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_STR,3); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_INT,1); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_WIS,1); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_AC_BONUS)==FALSE) { // add AC bonus iP=ItemPropertyACBonus(5); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,TRUE); } // add AC bonus iP=ItemPropertyCastSpell(IP_CONST_CASTSPELL_CHARM_PERSON_2,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageReduction(IP_CONST_DAMAGEREDUCTION_1,IP_CONST_DAMAGESOAK_15_HP); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGERESIST_15); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGERESIST_15); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyRegeneration(1); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,TRUE); iP=ItemPropertySkillBonus(SKILL_HIDE,6); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_LISTEN,6); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_MOVE_SILENTLY,6); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_SPOT,6); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_DISEASE); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_POISON); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyBonusFeat(IP_CONST_FEAT_ALERTNESS); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyBonusFeat(IP_CONST_FEAT_DODGE); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageVulnerability(IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEVULNERABILITY_5_PERCENT); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); break; } // add level 3 properties case 4: { // add level 4 properties SendMessageToPC(oMe,"You are now a 4th level vampire."); IPRemoveAllItemProperties(oItem,DURATION_TYPE_PERMANENT); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_CHA,3); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_DEX,3); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_STR,5); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_INT,1); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_WIS,1); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_AC_BONUS)==FALSE) { // add AC bonus iP=ItemPropertyACBonus(5); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,TRUE); } // add AC bonus iP=ItemPropertyCastSpell(IP_CONST_CASTSPELL_CHARM_PERSON_2,IP_CONST_CASTSPELL_NUMUSES_3_USES_PER_DAY); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyCastSpell(IP_CONST_CASTSPELL_DOMINATE_PERSON_7,IP_CONST_CASTSPELL_NUMUSES_1_USE_PER_DAY); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageReduction(IP_CONST_DAMAGEREDUCTION_1,IP_CONST_DAMAGESOAK_15_HP); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGERESIST_20); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGERESIST_20); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyRegeneration(1); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,TRUE); iP=ItemPropertySkillBonus(SKILL_HIDE,7); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_LISTEN,7); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_MOVE_SILENTLY,7); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_SPOT,7); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_DISEASE); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_POISON); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyBonusFeat(IP_CONST_FEAT_ALERTNESS); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyBonusFeat(IP_CONST_FEAT_DODGE); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageVulnerability(IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEVULNERABILITY_10_PERCENT); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyReducedSavingThrowVsX(IP_CONST_SAVEVS_POSITIVE,1); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); break; } // add level 4 properties case 5: { // add level 5 properties SendMessageToPC(oMe,"You are now a 5th level vampire (maximum level)."); IPRemoveAllItemProperties(oItem,DURATION_TYPE_PERMANENT); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_CHA,4); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_DEX,4); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_STR,6); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_INT,2); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyAbilityBonus(IP_CONST_ABILITY_WIS,2); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); if (GetItemHasItemProperty(oItem,ITEM_PROPERTY_AC_BONUS)==FALSE) { // add AC bonus iP=ItemPropertyACBonus(5); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,TRUE); } // add AC bonus iP=ItemPropertyCastSpell(IP_CONST_CASTSPELL_CHARM_PERSON_2,IP_CONST_CASTSPELL_NUMUSES_4_USES_PER_DAY); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyCastSpell(IP_CONST_CASTSPELL_DOMINATE_PERSON_7,IP_CONST_CASTSPELL_NUMUSES_2_USES_PER_DAY); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageReduction(IP_CONST_DAMAGEREDUCTION_1,IP_CONST_DAMAGESOAK_15_HP); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_COLD,IP_CONST_DAMAGERESIST_20); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_ELECTRICAL,IP_CONST_DAMAGERESIST_20); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyRegeneration(2); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,TRUE); iP=ItemPropertySkillBonus(SKILL_HIDE,8); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_LISTEN,8); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_MOVE_SILENTLY,8); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertySkillBonus(SKILL_SPOT,8); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_DISEASE); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_POISON); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyBonusFeat(IP_CONST_FEAT_ALERTNESS); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyBonusFeat(IP_CONST_FEAT_DODGE); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyDamageVulnerability(IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEVULNERABILITY_25_PERCENT); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); iP=ItemPropertyReducedSavingThrowVsX(IP_CONST_SAVEVS_POSITIVE,2); IPSafeAddItemProperty(oItem,iP,0.0,X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,TRUE,FALSE); break; } // add level 5 properties default: break; } // level up switch SetLocalInt(oItem,"nLevel",nNextLevel); ExecuteScript("rts_save_player",oMe); } // next level valid } // fnLevelUp() void fnGiveFeats(object oCreature) { // PURPOSE: Give feats for vampirism //object oSkin = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oCreature); object oSkin = GetPCSkin(oCreature); SendMessageToPC(oCreature,"Giving Vampire feats. - fnGiveFeats()"); GiveFeat(oCreature,65); // Vampire Body Menu GiveFeat(oCreature,63); // Vampire Mind Menu GiveFeat(oCreature,64); // Vampire Arcane Menu SetLocalInt(oSkin,"bVampireFeats",TRUE); SetSubRace(oCreature,"VAMPIRE"); } // fnGiveFeats() void main() { object oMe=OBJECT_SELF; int nExperience=GetLocalInt(oMe,"nVampireXP"); int nBlood=GetLocalInt(oMe,"nBloodPool"); object oItem; int nIsVamp=GetLocalInt(oMe,"nIsVampire"); int nLevel=1+(nExperience/VAMPIRE_XP_PER_LEVEL); int nSkinLevel; string sRes; effect eEff; int nCHP=GetCurrentHitPoints(oMe); int nMHP=GetMaxHitPoints(oMe); float fHPP=IntToFloat(nCHP)/IntToFloat(nMHP); int nN; //SendMessageToPC(oMe,"player_vampire XP:"+IntToString(nExperience)+" LEVEL:"+IntToString(nLevel)+" BLOOD:"+IntToString(nBlood)); if (GetLocalInt(oMe,"nDeadVampire")!=TRUE) { // living if (GetLocalInt(oMe,"nIsLycanthrope")!=TRUE) { // not a lycanthrope if (nIsVamp!=TRUE) { SetLocalInt(oMe,"nIsVampire",TRUE); SetSubRace(oMe,"VAMPIRE"); nBlood=70; SetLocalInt(oMe,"nBloodPool",nBlood); } if (GetLocalInt(oMe,"nVampJourn")!=TRUE) { AddJournalQuestEntry("PlayerVamp",1,oMe,FALSE,FALSE,TRUE); SetLocalInt(oMe,"nVampJourn",TRUE); } if (nLevel>5) nLevel=5; // Visual Effects if (nLevel>1) { // ghost smoke effect eEff=EffectVisualEffect(VFX_DUR_GHOST_SMOKE); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEff,oMe,12.5); } // ghost smoke effect if (nLevel>4) { // anti-light eEff=EffectVisualEffect(VFX_DUR_ANTI_LIGHT_10); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEff,oMe,12.5); } // anti-light //oItem=GetItemInSlot(INVENTORY_SLOT_CARMOUR,oMe); oItem = GetPCSkin(oMe); if (GetIsObjectValid(oItem)&&!GetLocalInt(oItem,"bVampireFeats")) { // give feats SendMessageToPC(oMe,"calling fnGiveFeats("+GetName(oItem)+")"); fnGiveFeats(oMe); } // give feats nSkinLevel=GetLocalInt(oItem,"nLevel"); if (nSkinLevel>nLevel) { // maybe rejoining player - correct level nLevel=nSkinLevel-nLevel; nExperience=nExperience+(nLevel*5000); SetLocalInt(oMe,"nVampireXP",nExperience); nLevel=nSkinLevel; nSkinLevel=nLevel-1; } // maybe rejoining player - correct level if (nLevel!=nSkinLevel||oItem==OBJECT_INVALID) { // create skin if (oItem==OBJECT_INVALID) { // create skin //oItem=CreateItemOnObject("baseskin",oMe,1); oItem = GetPCSkin(oMe); DelayCommand(1.0,AssignCommand(oMe,ClearAllActions(TRUE))); DelayCommand(1.2,AssignCommand(oMe,ActionEquipItem(oItem,INVENTORY_SLOT_CARMOUR))); SendMessageToPC(oMe,"calling fnGiveFeats("+GetName(oItem)+") after create."); if (!GetLocalInt(oItem,"bVampireFeats")) fnGiveFeats(oMe); } // create skin DelayCommand(1.5,fnLevelUp(oMe)); } // create skin //oItem=GetItemInSlot(INVENTORY_SLOT_CARMOUR,oMe); oItem = GetPCSkin(oMe); if (GetIsObjectValid(oItem)&&!GetLocalInt(oItem,"bGivenCoffin")) { // not yet given coffin SetLocalInt(oItem,"bGivenCoffin",TRUE); oItem=CreateItemOnObject("vamp_it_coffin",oMe); } // not yet given coffin oItem=GetItemPossessedBy(oMe,"rts_vampire"); if (oItem==OBJECT_INVALID) { // create the item oItem=CreateItemOnObject("rts_vampire",oMe,1); } // create the item if (fHPP<=0.20) { // very wounded auto use blood to heal if (nBlood>4) { // big heal nBlood=nBlood-5; SetLocalInt(oMe,"nBloodPool",nBlood); eEff=EffectHeal(25); ApplyEffectToObject(DURATION_TYPE_INSTANT,eEff,oMe,1.0); SendMessageToPC(oMe,"5 blood was consumed to heal yourself."); } // big heal else if (nBlood>0) { // minor heal nBlood=nBlood-1; SetLocalInt(oMe,"nBloodPool",nBlood); eEff=EffectHeal(5); ApplyEffectToObject(DURATION_TYPE_INSTANT,eEff,oMe,1.0); SendMessageToPC(oMe,"1 blood was consumed to heal yourself."); } // minor heal } // very wounded auto use blood to heal if(GetIsDay()==TRUE&&GetLocalInt(oMe,"nBuried")==FALSE) { // it is day oItem=GetNearestObjectByTag("RTS_SURFACE",oMe,1); if (oItem!=OBJECT_INVALID&&GetLocalInt(oMe,"nSunSafe")!=TRUE) { // burn baby burn eEff=EffectVisualEffect(VFX_IMP_FLAME_M); ApplyEffectToObject(DURATION_TYPE_INSTANT,eEff,oMe,3.0); nN=d6()+d6()+d6()+d6(); // 4d6 eEff=EffectDamage(nN,DAMAGE_TYPE_FIRE); ApplyEffectToObject(DURATION_TYPE_INSTANT,eEff,oMe,1.0); } // burn baby burn else { // tired if (d20()==1) SendMessageToPC(oMe,"You are tired. Vampires prefer to sleep during the day."); if (nLevel!=5&&GetLocalInt(oMe,"nBuried")!=TRUE) { // all but, the strongest vampire eEff=EffectMovementSpeedDecrease(10); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEff,oMe,11.0); } // all but, the strongest vampire } // tired } // it is day else { // fast movement at night nN=nLevel*19; eEff=EffectMovementSpeedIncrease(nN); if (GetLocalInt(oMe,"nBuried")!=TRUE) ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEff,oMe,12.0); } // fast movement at night // drain blood nBlood=nBlood-1; if (nBlood==50) { // need blood soon SendMessageToPC(oMe,"You need to drink blood soon."); AssignCommand(oMe,fnSoundAlert("c_lich_dead")); } // need blood soon else if (nBlood==30) { // SendMessageToPC(oMe,"Your thirst for blood is growing."); AssignCommand(oMe,fnSoundAlert("as_pl_zombiem2")); } // else if (nBlood==10) { // SendMessageToPC(oMe,"If you do not have blood soon you will go into a frenzy."); AssignCommand(oMe,fnSoundAlert("c_ghoul_atk3")); } // if (nBlood<1) { // blood frenzy oItem=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oMe,1,CREATURE_TYPE_PERCEPTION,PERCEPTION_SEEN); if (oItem!=OBJECT_INVALID&&GetLocalInt(oMe,"nBuried")!=TRUE) { // attack SendMessageToPC(oMe,"You are in a frenzy from lack of blood."); AssignCommand(oMe,ClearAllActions()); AssignCommand(oMe,fnSoundAlert("c_vampire_bat1")); AssignCommand(oMe,ActionAttack(oItem)); AssignCommand(oMe,ActionDoCommand(SetLocalInt(oMe,"nBloodPool",10))); } // attack } // blood frenzy SetLocalInt(oMe,"nBloodPool",nBlood); if (GetAlignmentGoodEvil(oMe)!=ALIGNMENT_EVIL) AdjustAlignment(oMe,ALIGNMENT_EVIL,100); DelayCommand(12.0,ExecuteScript("player_vampire",oMe)); } // not a lycanthrope } // living else { // dead vampire DeleteLocalInt(oMe,"nDeadVampire"); //oItem=GetItemInSlot(INVENTORY_SLOT_CARMOUR,oMe); oItem = GetPCSkin(oMe); if (GetIsObjectValid(oItem)) { // remove feats RemoveFeat(oMe,1081); RemoveFeat(oMe,1087); RemoveFeat(oMe,1093); DeleteLocalInt(oItem,"bVampireFeats"); } // remove feats } // dead vampire }