forked from Jaysyn/PRC8
Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
201 lines
7.1 KiB
Plaintext
201 lines
7.1 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: codi_pre_tele
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Ocular Adept: Telekinesis
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: James Stoneburner
|
|
//:: Created On: 2003-11-30
|
|
//:://////////////////////////////////////////////
|
|
#include "prc_inc_sp_tch"
|
|
|
|
void MoveTarget(object oTarget, vector vAwayFrom, float fDistance);
|
|
|
|
void main()
|
|
{
|
|
//SendMessageToPC(OBJECT_SELF, "Telekinesis script online");
|
|
int nOcLvl = GetLevelByClass(CLASS_TYPE_OCULAR, OBJECT_SELF);
|
|
int nChaMod = GetAbilityModifier(ABILITY_CHARISMA, OBJECT_SELF);
|
|
int nOcSv = 10 + (nOcLvl/2) + nChaMod;
|
|
|
|
|
|
|
|
|
|
object oCaster = OBJECT_SELF;
|
|
object oTarget = PRCGetSpellTargetObject();
|
|
|
|
if(oCaster == oTarget)
|
|
{
|
|
// Cast on Self
|
|
location lSelf = GetLocation(OBJECT_SELF);
|
|
float fDist;
|
|
effect eKnockdown = EffectKnockdown();
|
|
int iWillsave;
|
|
vector vPosition = GetPosition(OBJECT_SELF);
|
|
object oTarget2 = GetFirstObjectInShape(SHAPE_SPHERE, 5.0, lSelf, FALSE);
|
|
while(oTarget2 != OBJECT_INVALID)
|
|
{
|
|
if(oTarget2 != OBJECT_SELF && GetIsEnemy(oTarget, OBJECT_SELF))
|
|
{
|
|
fDist = 6.0 - IntToFloat(GetCreatureSize(oTarget2));
|
|
iWillsave = WillSave(oTarget, nOcSv);
|
|
if(iWillsave == 0)
|
|
{
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnockdown, oTarget2, 6.0);
|
|
}
|
|
DelayCommand(0.1, MoveTarget(oTarget2, vPosition, fDist));
|
|
}
|
|
oTarget2 = GetNextObjectInShape(SHAPE_SPHERE, 5.0, lSelf, FALSE);
|
|
}
|
|
}
|
|
else if (oTarget == OBJECT_INVALID)
|
|
{
|
|
// Cast on Ground
|
|
}
|
|
else if (GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
|
|
{
|
|
int bHit = PRCDoRangedTouchAttack(oTarget);;
|
|
if(bHit) {
|
|
location lSelf = GetLocation(OBJECT_SELF);
|
|
float fDist;
|
|
float fDelay = 0.2;
|
|
effect eKnockdown = EffectKnockdown();
|
|
int iFortsave;
|
|
vector vPosition = GetPosition(OBJECT_SELF);
|
|
fDist = 9.0 - (IntToFloat(GetCreatureSize(oTarget)) * 1.5);
|
|
AssignCommand(oTarget, ClearAllActions());
|
|
if(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget) != OBJECT_INVALID)
|
|
{
|
|
iFortsave = WillSave(oTarget, nOcSv);
|
|
if(iFortsave == 0)
|
|
{
|
|
object oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
|
|
if (GetDroppableFlag(oItem) && !GetPlotFlag(oItem))
|
|
{
|
|
object oNew = CopyObject(oItem, GetLocation(oTarget));
|
|
DestroyObject(oItem);
|
|
}
|
|
//DelayCommand(fDelay, AssignCommand(oTarget, ActionPutDownItem(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget))));
|
|
//fDelay = fDelay + 0.3;
|
|
}
|
|
}
|
|
if(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget) != OBJECT_INVALID)
|
|
{
|
|
iFortsave = WillSave(oTarget, nOcSv);
|
|
if(iFortsave == 0)
|
|
{
|
|
object oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget);
|
|
if (GetDroppableFlag(oItem) && !GetPlotFlag(oItem))
|
|
{
|
|
object oNew = CopyObject(oItem, GetLocation(oTarget));
|
|
DestroyObject(oItem);
|
|
}
|
|
//DelayCommand(fDelay, AssignCommand(oTarget, ActionPutDownItem(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget))));
|
|
//fDelay = fDelay + 0.3;
|
|
}
|
|
}
|
|
DelayCommand(fDelay, MoveTarget(oTarget, vPosition, fDist));
|
|
fDelay = fDelay + fDist/2.0;
|
|
iFortsave = WillSave(oTarget, nOcSv);
|
|
if(iFortsave == 0)
|
|
{
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnockdown, oTarget, 6.0));
|
|
}
|
|
} else {
|
|
if(GetIsPC(OBJECT_SELF)) {
|
|
SendMessageToPC(OBJECT_SELF, "The ray missed.");
|
|
}
|
|
}
|
|
}
|
|
else if (GetObjectType(oTarget) == OBJECT_TYPE_DOOR)
|
|
{
|
|
if (GetLocked(oTarget) && !GetLockKeyRequired(oTarget))
|
|
{
|
|
int iDC = GetLockUnlockDC(oTarget);
|
|
if(d20(1) + GetClassByPosition(CLASS_TYPE_OCULAR) >= iDC)
|
|
{
|
|
SetLocked(oTarget, FALSE);
|
|
AssignCommand(oTarget, SpeakString("**Click**"));
|
|
}
|
|
else
|
|
{
|
|
SendMessageToPC(oCaster, "You fail to effect that object.");
|
|
}
|
|
}
|
|
else if (GetLocked(oTarget) && GetLockKeyRequired(oTarget))
|
|
{
|
|
AssignCommand(oCaster, SpeakString("This lock is beyond my ability to open, I'll need the key.",TALKVOLUME_WHISPER));
|
|
}
|
|
else if (!GetLocked(oTarget))
|
|
{
|
|
AssignCommand(oTarget, ActionOpenDoor(oTarget));
|
|
}
|
|
}
|
|
else if(GetObjectType(oTarget) == OBJECT_TYPE_PLACEABLE)
|
|
{
|
|
if (GetLocked(oTarget) && GetLockKeyRequired(oTarget))
|
|
{
|
|
int iDC = GetLockUnlockDC(oTarget);
|
|
if(d20(1) + GetClassByPosition(CLASS_TYPE_OCULAR) >= iDC)
|
|
{
|
|
SetLocked(oTarget, FALSE);
|
|
AssignCommand(oTarget, SpeakString("**Click**"));
|
|
}
|
|
else
|
|
{
|
|
SendMessageToPC(oCaster, "You fail to effect that object.");
|
|
}
|
|
}
|
|
else if (GetLocked(oTarget) && GetLockKeyRequired(oTarget))
|
|
{
|
|
AssignCommand(oCaster, SpeakString("This lock is beyond my ability to open, I'll need the key.",TALKVOLUME_WHISPER));
|
|
}
|
|
else if (!GetLocked(oTarget))
|
|
{
|
|
//location lLoc = GetLocation(oTarget);
|
|
//CreateObject(OBJECT_TYPE_CREATURE, "anunseenforce", lLoc, FALSE, "FORCE");
|
|
AssignCommand(oTarget, PlayAnimation(ANIMATION_PLACEABLE_OPEN));
|
|
}
|
|
}
|
|
else if (GetObjectType(oTarget) == OBJECT_TYPE_ITEM)
|
|
{
|
|
// Cast on Item
|
|
}
|
|
}
|
|
|
|
void MoveTarget(object oTarget, vector vAwayFrom, float fDistance)
|
|
{
|
|
vector vStart = GetPosition(oTarget);
|
|
int X = (vStart.x > vAwayFrom.x);
|
|
int Y = (vStart.y > vAwayFrom.y);
|
|
int i = 0;
|
|
vector vNew;
|
|
location lNew;
|
|
float fDelay = 0.1;
|
|
for(i=1;i<=FloatToInt(fDistance);i++)
|
|
{
|
|
if (X && Y)
|
|
{
|
|
vNew = Vector(vStart.x + IntToFloat(i), vStart.y + IntToFloat(i), 0.0);
|
|
}
|
|
else if (X && !Y)
|
|
{
|
|
vNew = Vector(vStart.x + IntToFloat(i), vStart.y - IntToFloat(i), 0.0);
|
|
}
|
|
else if (!X && Y)
|
|
{
|
|
vNew = Vector(vStart.x - IntToFloat(i), vStart.y + IntToFloat(i), 0.0);
|
|
}
|
|
else if (!X && !Y)
|
|
{
|
|
vNew = Vector(vStart.x - IntToFloat(i), vStart.y - IntToFloat(i), 0.0);
|
|
}
|
|
lNew = Location(GetArea(oTarget), vNew, GetFacing(oTarget));
|
|
DelayCommand(fDelay, AssignCommand(oTarget, JumpToLocation(lNew)));
|
|
fDelay = fDelay + 0.5;
|
|
}
|
|
|
|
|
|
}
|