forked from Jaysyn/PRC8
238 lines
9.0 KiB
Plaintext
238 lines
9.0 KiB
Plaintext
|
/*:://////////////////////////////////////////////
|
|||
|
//:: Spell Name Raise Dead
|
|||
|
//:: Spell FileName PHS_S_RaiseDead
|
|||
|
//:://////////////////////////////////////////////
|
|||
|
//:: In Game Spell desctiption
|
|||
|
//:://////////////////////////////////////////////
|
|||
|
Conjuration (Healing)
|
|||
|
Level: Clr 5
|
|||
|
Components: V, S, M, DF
|
|||
|
Casting Time: 1 minute
|
|||
|
Range: Touch
|
|||
|
Target: Dead creature touched
|
|||
|
Duration: Instantaneous
|
|||
|
Saving Throw: None; see text
|
|||
|
Spell Resistance: Yes (harmless)
|
|||
|
|
|||
|
You restore life to a deceased creature. You can raise a creature that has
|
|||
|
been dead for no longer than one day per caster level. In addition, the
|
|||
|
subject<63>s soul must be free and willing to return. If the subject<63>s soul is
|
|||
|
not willing to return, the spell does not work; therefore, a subject that
|
|||
|
wants to return receives no saving throw.
|
|||
|
|
|||
|
Coming back from the dead is an ordeal. The subject of the spell loses one
|
|||
|
level (or 1 Hit Die) when it is raised. If the subject is 1st level, it
|
|||
|
loses all its experience instead. This level/HD loss cannot be repaired by
|
|||
|
any means. A character who died with spells prepared
|
|||
|
has a 50% chance of losing any given spell upon being raised, in addition
|
|||
|
to losing spells for losing a level. A spellcasting creature that doesn<73>t
|
|||
|
prepare spells (such as a sorcerer) has a 50% chance of losing any given
|
|||
|
unused spell slot as if it had been used to cast a spell, in addition to
|
|||
|
losing spell slots for losing a level.
|
|||
|
|
|||
|
A raised creature has a number of hit points equal to its current Hit Dice.
|
|||
|
Any ability damage, poison and disease are cured in the process of raising
|
|||
|
the subject. While the spell closes mortal wounds and repairs lethal damage
|
|||
|
of most kinds, the body of the creature to be raised must be whole.
|
|||
|
Otherwise, the spell fails. None of the dead creature<72>s equipment or
|
|||
|
possessions are affected in any way by this spell.
|
|||
|
|
|||
|
A creature who has been turned into an undead creature or killed by a death
|
|||
|
effect can<61>t be raised by this spell. Constructs, elementals, outsiders, and
|
|||
|
undead creatures can<61>t be raised. The spell cannot bring back a creature
|
|||
|
that has died of old age.
|
|||
|
|
|||
|
Material Component: Diamonds worth a total of least 5,000 gp.
|
|||
|
//:://////////////////////////////////////////////
|
|||
|
//:: Spell Effects Applied / Notes
|
|||
|
//:://////////////////////////////////////////////
|
|||
|
This is not too easy without the death system in place.
|
|||
|
|
|||
|
The outline will be completed - until the 2 other raising spells (Resurrection,
|
|||
|
True Ressurection) are completed.
|
|||
|
|
|||
|
Corpses ideas:
|
|||
|
- Placable corpse created at the time will contain all the players
|
|||
|
items (bar cursed/plot ones, which are skipped by all death scripts)
|
|||
|
- Corpse stored in the database each time something is taken (bar the corpse
|
|||
|
itself, an additional "item", which will basically still store the corpses
|
|||
|
contents, but allow people to move it).
|
|||
|
(Note: Above can be turned off of course)
|
|||
|
- The corpse will be created at an exiting objects location, if they leave
|
|||
|
with a corpse (stupid gits)
|
|||
|
- All corpses are removed On Cleint Enter too.
|
|||
|
- If, On Client Enter, someone comes in and doesn't have a corpse lying
|
|||
|
around, one will be created at an approprate location.
|
|||
|
|
|||
|
- The player will be ghostly in limbo. No items. No PvP. No traps.
|
|||
|
//:://////////////////////////////////////////////
|
|||
|
//:: Created By: Jasperre
|
|||
|
//::////////////////////////////////////////////*/
|
|||
|
|
|||
|
#include "PHS_INC_SPELLS"
|
|||
|
|
|||
|
// Removes randomly prepared spells.
|
|||
|
void RemoveRandomPreparedSpells(object oTarget);
|
|||
|
|
|||
|
void main()
|
|||
|
{
|
|||
|
// Spell Hook Check.
|
|||
|
if(!PHS_SpellHookCheck(PHS_SPELL_RAISE_DEAD)) return;
|
|||
|
|
|||
|
// Check material components - 5000GP worth of diamonds
|
|||
|
if(!PHS_ComponentItemGemCheck("Raise Dead", 5000, "Diamond")) return;
|
|||
|
|
|||
|
// Declare Major Variables
|
|||
|
object oCaster = OBJECT_SELF;
|
|||
|
object oTarget = GetSpellTargetObject();// Should be a corpse object/dead creature
|
|||
|
object oRaise;
|
|||
|
int bDead = GetIsDead(oTarget);
|
|||
|
int nRace = GetRacialType(oTarget);
|
|||
|
int nHD, nNewXP;
|
|||
|
|
|||
|
// Raise effect
|
|||
|
effect eVis = EffectVisualEffect(VFX_IMP_RAISE_DEAD);
|
|||
|
effect eRaise = EffectResurrection();
|
|||
|
effect eHeal;
|
|||
|
|
|||
|
// Is it an actual dead body?
|
|||
|
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
|
|||
|
{
|
|||
|
// Check if dead
|
|||
|
if(bDead == FALSE)
|
|||
|
{
|
|||
|
FloatingTextStringOnCreature("*You cannot raise an alive being*", oCaster, FALSE);
|
|||
|
return;
|
|||
|
}
|
|||
|
else if(nRace == RACIAL_TYPE_CONSTRUCT ||
|
|||
|
nRace == RACIAL_TYPE_ELEMENTAL ||
|
|||
|
nRace == RACIAL_TYPE_OUTSIDER ||
|
|||
|
nRace == RACIAL_TYPE_UNDEAD)
|
|||
|
{
|
|||
|
// Cannot raise these races
|
|||
|
FloatingTextStringOnCreature("*You cannot raise this creature*", oCaster, FALSE);
|
|||
|
return;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// Raise oTarget
|
|||
|
oRaise = oTarget;
|
|||
|
// Check if they are friendly or not, if not friendly, we cannot
|
|||
|
// raise them
|
|||
|
if(GetIsFriend(oCaster, oRaise) ||
|
|||
|
GetFactionEqual(oCaster, oRaise))
|
|||
|
{
|
|||
|
// Level loss them first
|
|||
|
nHD = PHS_GetCharacterLevel(oRaise);
|
|||
|
|
|||
|
// Corpse system can be off.
|
|||
|
if(GetIsPC(oRaise))
|
|||
|
{
|
|||
|
// Lose a level
|
|||
|
// We put them back to exactly the point of the last level.
|
|||
|
// EG: At level 4, we might be between 6000 and 10000 exp.
|
|||
|
// We will go instantly down to 3000 XP, the amount
|
|||
|
// needed to get to level 3.
|
|||
|
nNewXP = PHS_GetLevelLossXP(nHD);
|
|||
|
|
|||
|
// Set XP
|
|||
|
SetXP(oRaise, nNewXP);
|
|||
|
}
|
|||
|
|
|||
|
// Signal spell cast at
|
|||
|
PHS_SignalSpellCastAt(oRaise, PHS_SPELL_RAISE_DEAD, FALSE);
|
|||
|
|
|||
|
// Raise them
|
|||
|
PHS_ApplyInstantAndVFX(oRaise, eVis, eRaise);
|
|||
|
// Remove randomly prepared spells.
|
|||
|
RemoveRandomPreparedSpells(oTarget);
|
|||
|
|
|||
|
// Heal them
|
|||
|
if(nHD >= 2)
|
|||
|
{
|
|||
|
// Heal them thier HD worth - 1 (because of there being 1 healed
|
|||
|
// already)
|
|||
|
eHeal = EffectHeal(nHD - 1);
|
|||
|
|
|||
|
// Apply it
|
|||
|
PHS_ApplyInstant(oRaise, eHeal);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// Cannot raise
|
|||
|
FloatingTextStringOnCreature("*Target is not friendly, and thusly is not willing to return to life*", oCaster, FALSE);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else //if(GetObjectType(oTarget) == OBJECT_TYPE_PLACABLE)
|
|||
|
{
|
|||
|
// Corpse object
|
|||
|
// Check tag
|
|||
|
if(GetTag(oTarget) == "CORPSE")
|
|||
|
{
|
|||
|
// Get object to raise
|
|||
|
oRaise = GetLocalObject(oTarget, "TO_RAISE");
|
|||
|
|
|||
|
// Level loss them first
|
|||
|
nHD = PHS_GetCharacterLevel(oRaise);
|
|||
|
|
|||
|
// Lose a level
|
|||
|
// We put them back to exactly the point of the last level.
|
|||
|
// EG: At level 4, we might be between 6000 and 10000 exp.
|
|||
|
// We will go instantly down to 3000 XP, the amount
|
|||
|
// needed to get to level 3.
|
|||
|
nNewXP = PHS_GetLevelLossXP(nHD);
|
|||
|
|
|||
|
// Set XP
|
|||
|
SetXP(oRaise, nNewXP);
|
|||
|
|
|||
|
// Signal spell cast at
|
|||
|
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_RAISE_DEAD, FALSE);
|
|||
|
|
|||
|
// Move them from limbo
|
|||
|
AssignCommand(oRaise, PHS_ForceMovementToLocation(GetLocation(oTarget), VFX_IMP_RAISE_DEAD, VFX_IMP_RAISE_DEAD));
|
|||
|
// Remove randomly prepared spells.
|
|||
|
RemoveRandomPreparedSpells(oTarget);
|
|||
|
|
|||
|
// Heal them
|
|||
|
if(nHD >= 2)
|
|||
|
{
|
|||
|
// Heal them thier HD worth - 1 (because of there being 1 healed
|
|||
|
// already)
|
|||
|
eHeal = EffectHeal(nHD - 1);
|
|||
|
|
|||
|
// Apply it
|
|||
|
PHS_ApplyInstant(oRaise, eHeal);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Removes randomly prepared spells.
|
|||
|
void RemoveRandomPreparedSpells(object oTarget)
|
|||
|
{
|
|||
|
// Tell oTarget
|
|||
|
FloatingTextStringOnCreature("*You feel a drain on your power, possibly some of your prepared spells have depissitated*", oTarget, FALSE);
|
|||
|
|
|||
|
// NOTE ON BARDS/SORCERORS!
|
|||
|
// This will probably remove all of thier spells - they can have, for example,
|
|||
|
// 6 spells to cast up to 6 times. This will loop all 6 spells, and if there
|
|||
|
// are any castings left, will do the 50% chance. This is kinda bad...but
|
|||
|
// I am tired right now, might change later.
|
|||
|
|
|||
|
int nCnt1, nCnt2;
|
|||
|
// Loop all spells
|
|||
|
for(nCnt1 = 0; nCnt1 <= PHS_SPELLS_2DA_MAX_ENTRY; nCnt1++)
|
|||
|
{
|
|||
|
for(nCnt2 = GetHasSpell(nCnt1, oTarget); nCnt2 > 0; nCnt2--)
|
|||
|
{
|
|||
|
// 50% chance of losing that prepared spell.
|
|||
|
if(d2() == 1)
|
|||
|
{
|
|||
|
DecrementRemainingSpellUses(oTarget, nCnt1);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|