518 lines
27 KiB
Plaintext
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
|
|
}
|