Jaysyn904 04165202c0 Initial upload
Initial upload
2024-11-25 19:36:07 -05:00

518 lines
27 KiB
Plaintext

//////////////////////////////////////////////////////////////////////////////
// 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
}