1465 lines
44 KiB
Plaintext
1465 lines
44 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//::
|
|
//:: Designer Include File
|
|
//::
|
|
//:: NW_I0_PLOT.nss
|
|
//::
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//::
|
|
//::
|
|
//:://////////////////////////////////////////////
|
|
//::
|
|
//::
|
|
//:: This is a sample of design wrote
|
|
//:: functions that may need inclusion in multiple
|
|
//:: modules.
|
|
//::
|
|
//:://////////////////////////////////////////////
|
|
//::
|
|
//:: Created By: Brent Knowles
|
|
//:: Created On: February 12, 2001
|
|
//:: Updated On: August, 14, 2003 (Georg) - Fixed AutoDC, Added const statement to constants
|
|
//:://////////////////////////////////////////////
|
|
|
|
const int DC_EASY = 0;
|
|
const int DC_MEDIUM = 1;
|
|
const int DC_HARD = 2;
|
|
const int DC_SUPERIOR = 3;
|
|
const int DC_MASTER = 4;
|
|
const int DC_LEGENDARY = 5;
|
|
const int DC_EPIC = 6;
|
|
// * this is used by some of the template scripts
|
|
// * 100 - this number is the chance of that dialog
|
|
// * appearing
|
|
const int G_CLASSCHANCE = 70;
|
|
|
|
//Experience Point Rewards constants used in the 'des_xp_rewards' 2da
|
|
const int XP_VERY_LOW = 1; //50 xp
|
|
const int XP_LOW = 2; //100 xp
|
|
const int XP_MEDIUM_LOW = 3; //150 xp
|
|
const int XP_MEDIUM = 4; //250 xp
|
|
const int XP_MEDIUM_HIGH = 5; //500 xp
|
|
const int XP_HIGH = 6; //1000 xp
|
|
const int XP_VERY_HIGH = 7; //2000 xp
|
|
const int XP_EPIC = 8; //5000 xp
|
|
|
|
|
|
// * FUNCTION DECLARATIONS
|
|
|
|
// * returns true if the player can afford to lose the indicated amount of XP without losing a level
|
|
int plotCanRemoveXP(object oPC, int nPenalty);
|
|
|
|
int GetCanCastHealingSpells(object oPC) ;
|
|
int DoOnce();
|
|
void DebugSpeak(string s);
|
|
object GetMyMaster();
|
|
int IsRecall();
|
|
void DimensionHop(object oTarget);
|
|
int CanSeePlayer();
|
|
void EscapeArea(int bRun = TRUE, string sTag="NW_EXIT");
|
|
int HasItem(object oCreature, string s);
|
|
void TakeGold(int nAmount, object oGoldHolder, int bDestroy=TRUE);
|
|
object GetNearestPC();
|
|
void SetIsEnemy(object oTarget);
|
|
|
|
// Provide a scaled skill check DC based on the DC_* constant passed in
|
|
// DC - DC_EASY DC_MEDIUM DC_HARD DC_SUPERIOR DC_MASTER DC_LEGENDARY DC_EPIC
|
|
// nSkill - SKILL_* constant
|
|
// oTarget - creature that is going to perform the check;
|
|
int AutoDC(int DC, int nSkill, object oTarget);
|
|
void AutoAlignG(int DC, object oTarget);
|
|
void AutoAlignE(int DC, object oTarget);
|
|
void DoGiveXP(string sJournalTag, int nPercentage, object oTarget, int QuestAlignment=ALIGNMENT_NEUTRAL);
|
|
void RewardXP(string sJournalTag, int nPercentage, object oTarget, int QuestAlignment=ALIGNMENT_NEUTRAL, int bAllParty=TRUE);
|
|
void RewardGP(int GP, object oTarget,int bAllParty=TRUE);
|
|
int CheckCharismaMiddle();
|
|
int CheckCharismaNormal();
|
|
int CheckCharismaLow();
|
|
int CheckCharismaHigh();
|
|
int CheckIntelligenceLow();
|
|
int CheckIntelligenceNormal();
|
|
int CheckIntelligenceNormal();
|
|
int CheckIntelligenceHigh();
|
|
int CheckWisdomHigh();
|
|
// Return the wisdom of oTarget
|
|
int GetWisdom(object oTarget);
|
|
// Return the Intelligence of the Target
|
|
int GetIntelligence(object oTarget);
|
|
// Return the Charisma of the Target
|
|
int GetCharisma(object oTarget);
|
|
// Return the numer of items oTarget possesses from type sItem (Tag)
|
|
int GetNumItems(object oTarget,string sItem);
|
|
// Gives the item with the ResRef sItem to creature oTarget nNumItems times
|
|
void GiveNumItems(object oTarget,string sItem,int nNumItems);
|
|
// Remove nNumItems Items of Type sItem (Tag) from oTarget
|
|
void TakeNumItems(object oTarget,string sItem,int nNumItems);
|
|
// * plays the correct character theme
|
|
// * assumes OBJECT_SELF is in the area
|
|
void PlayCharacterTheme(int nTheme);
|
|
// * plays the old theme for the area
|
|
// * assumes OBJECT_SELF is in the area
|
|
void PlayOldTheme();
|
|
int GetPLocalInt(object oPC,string sLocalName);
|
|
void SetPLocalInt(object oPC,string sLocalName, int nValue);
|
|
// * removes all negative effects
|
|
void RemoveEffects(object oDead);
|
|
// * starts store using appraise skill
|
|
void gplotAppraiseOpenStore(object oStore, object oPC, int nBonusMarkUp = 0, int nBonusMarkDown = 0);
|
|
// * starts store with favorable appraise check
|
|
void gplotAppraiseFavOpenStore(object oStore, object oPC, int nBonusMarkUp = 0, int nBonusMarkDown = 0);
|
|
//Do a DC check and modify the skill by the Target's Strength modifier
|
|
int CheckDCStr(int DC, int nSkill, object oTarget);
|
|
//Check to see if target is PC and not DM
|
|
int GetIsPlayerCharacter(object oTarget);
|
|
//Reward Experience based on an entry in the des_xp_rewards 2da file
|
|
void Reward_2daXP(object oPC, int nRow, int bAllParty = TRUE, int nPercentage = 100);
|
|
//Both speak a string ref as well as play the associate sound file
|
|
void PlaySpeakSoundByStrRef(int nStrRef);
|
|
|
|
|
|
// * returns a value that will be subtracted from the
|
|
// * oTarget's DC to resist APpraise or Persuasion
|
|
int GetNPCEasyMark(object oTarget)
|
|
{
|
|
int nCharmMod = 0;
|
|
if (GetHasSpellEffect(SPELL_CHARM_PERSON, oTarget))
|
|
{
|
|
nCharmMod = 10;
|
|
}
|
|
else
|
|
if (GetHasSpellEffect(SPELL_CHARM_MONSTER, oTarget))
|
|
{
|
|
nCharmMod = 10;
|
|
}
|
|
else
|
|
if (GetHasSpellEffect(SPELL_CHARM_PERSON_OR_ANIMAL, oTarget))
|
|
{
|
|
nCharmMod = 10;
|
|
}
|
|
else if (GetHasSpellEffect(SPELL_MASS_CHARM, oTarget))
|
|
{
|
|
nCharmMod = 15;
|
|
}
|
|
else if (GetHasSpellEffect(SPELL_DOMINATE_MONSTER, oTarget))
|
|
{
|
|
nCharmMod = 20;
|
|
}
|
|
else if (GetHasSpellEffect(SPELL_DOMINATE_ANIMAL, oTarget))
|
|
{
|
|
nCharmMod = 20;
|
|
}
|
|
else if (GetHasSpellEffect(SPELL_DOMINATE_PERSON, oTarget))
|
|
{
|
|
nCharmMod = 20;
|
|
}
|
|
return nCharmMod;
|
|
}
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: gplotAppraiseOpenStore
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Opens a store, modifying the store prices
|
|
by the Appraise skill of the PCspeaker
|
|
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By:
|
|
//:: Created On:
|
|
//:: 2003-05-26: Updated from XP1 sources - Georg
|
|
//:://////////////////////////////////////////////
|
|
void gplotAppraiseOpenStore(object oStore, object oPC, int nBonusMarkUp = 0, int nBonusMarkDown = 0)
|
|
{
|
|
int STATE_FAILED = 1;
|
|
int STATE_TIE = 2;
|
|
int STATE_WON = 3;
|
|
string sTag = ObjectToString(OBJECT_SELF);
|
|
|
|
int nPlayerSkillRank = GetSkillRank(SKILL_APPRAISE, oPC);
|
|
|
|
int nNPCSkillRank = GetSkillRank(SKILL_APPRAISE, OBJECT_SELF) - GetNPCEasyMark(OBJECT_SELF);
|
|
|
|
|
|
if (nNPCSkillRank < 1 )
|
|
nNPCSkillRank = 1;
|
|
|
|
int nAdjust = 0;
|
|
|
|
|
|
/*
|
|
New System:
|
|
|
|
An opposed skill check (a d10 roll instead). Your appraise skill versus the shopkeepers appraise skill.
|
|
|
|
Possible Results:
|
|
|
|
Percentage Rebate/Penalty: The 'difference'
|
|
|
|
Feedback: [Appraise Skill]: Merchant's reaction is unfavorable.
|
|
[Appraise Skill]: Merchant's reaction is neutral.
|
|
[Appraise Skill]: Merchant's reaction is favorable.
|
|
|
|
Additional: Remember last reaction for this particular skill.
|
|
When the player gets a new skill rank in this skill they'll get a
|
|
reroll against this merchant.
|
|
|
|
*/
|
|
|
|
int nState = 0;
|
|
int nPreviousRank = GetLocalInt(oPC, "X0_APPRAISERANK"+ sTag);
|
|
|
|
// * if the player's rank has improved, let them have another appraise check
|
|
// * against this merchant
|
|
|
|
|
|
|
|
if ( (nPlayerSkillRank > nPreviousRank) || !GetLocalInt(oPC, "X0_APPRAISEVISITED"+sTag) )
|
|
{
|
|
SetLocalInt(oPC, "X0_APPRAISERANK"+ sTag, nPlayerSkillRank);
|
|
SetLocalInt(oPC, "X0_APPRAISEVISITED"+sTag, 1);
|
|
|
|
nPlayerSkillRank = nPlayerSkillRank + d10();
|
|
nNPCSkillRank = nNPCSkillRank + d10();
|
|
nAdjust = nNPCSkillRank - nPlayerSkillRank; // * determines the level of price modification
|
|
if (nNPCSkillRank > nPlayerSkillRank)
|
|
{
|
|
nState = STATE_FAILED;
|
|
}
|
|
else
|
|
if (nNPCSkillRank < nPlayerSkillRank)
|
|
{
|
|
nState = STATE_WON;
|
|
}
|
|
else
|
|
if (nNPCSkillRank == nPlayerSkillRank)
|
|
{
|
|
nState = STATE_TIE;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
// * recover last reaction
|
|
nAdjust = GetLocalInt(oPC, "X0_APPRAISEADJUST" + sTag);
|
|
|
|
if (nAdjust > 0)
|
|
{
|
|
nState = STATE_FAILED;
|
|
}
|
|
else
|
|
if (nAdjust < 0)
|
|
{
|
|
nState = STATE_WON;
|
|
}
|
|
else
|
|
if (nAdjust == 0)
|
|
{
|
|
nState = STATE_TIE;
|
|
}
|
|
|
|
}
|
|
|
|
if (nState == STATE_FAILED )
|
|
{
|
|
FloatingTextStrRefOnCreature(8963, oPC, FALSE);
|
|
}
|
|
else
|
|
if (nState == STATE_WON)
|
|
{
|
|
FloatingTextStrRefOnCreature(8965, oPC, FALSE);
|
|
}
|
|
else
|
|
if (nState == STATE_TIE)
|
|
{
|
|
FloatingTextStrRefOnCreature(8964, oPC, FALSE);
|
|
}
|
|
|
|
SetLocalInt(oPC, "X0_APPRAISEADJUST"+ sTag, nAdjust);
|
|
// SpawnScriptDebugger();
|
|
|
|
|
|
// * Hard cap of 30% max up or down
|
|
if (nAdjust > 30)
|
|
nAdjust = 30;
|
|
if (nAdjust < -30)
|
|
nAdjust = -30;
|
|
nBonusMarkUp = nBonusMarkUp + nAdjust;
|
|
nBonusMarkDown = nBonusMarkDown - nAdjust;
|
|
OpenStore(oStore, oPC, nBonusMarkUp, nBonusMarkDown);
|
|
}
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: gplotAppraiseFavOpenStore
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Opens a store, modifying the store prices
|
|
by the Appraise skill of the PCspeaker
|
|
THIS SCRIPT ALWAYS RESULTS IN A GOOD APPRAISE
|
|
RESULT
|
|
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Keith Warner
|
|
//:: Created On: Mar 7/03
|
|
//:: 2003-05-26: Updated from XP1 sources - Georg
|
|
//:://////////////////////////////////////////////
|
|
void gplotAppraiseFavOpenStore(object oStore, object oPC, int nBonusMarkUp = 0, int nBonusMarkDown = 0)
|
|
{
|
|
int STATE_WON = 3;
|
|
string sTag = ObjectToString(OBJECT_SELF);
|
|
|
|
int nPlayerSkillRank = GetSkillRank(SKILL_APPRAISE, oPC);
|
|
|
|
int nNPCSkillRank = 0;
|
|
|
|
|
|
int nAdjust = 0;
|
|
|
|
int nState = STATE_WON;
|
|
int nPreviousRank = GetLocalInt(oPC, "X0_APPRAISERANK"+ sTag);
|
|
|
|
// * if the player's rank has improved, let them have another appraise check
|
|
// * against this merchant
|
|
|
|
|
|
|
|
if ( (nPlayerSkillRank > nPreviousRank) || !GetLocalInt(oPC, "X0_APPRAISEVISITED"+sTag) )
|
|
{
|
|
SetLocalInt(oPC, "X0_APPRAISERANK"+ sTag, nPlayerSkillRank);
|
|
SetLocalInt(oPC, "X0_APPRAISEVISITED"+sTag, 1);
|
|
|
|
nPlayerSkillRank = nPlayerSkillRank + d10();
|
|
|
|
nAdjust = nNPCSkillRank - nPlayerSkillRank; // * determines the level of price modification
|
|
|
|
}
|
|
else
|
|
{
|
|
// * recover last reaction
|
|
nAdjust = GetLocalInt(oPC, "X0_APPRAISEADJUST" + sTag);
|
|
}
|
|
|
|
FloatingTextStrRefOnCreature(8965, oPC, FALSE);
|
|
|
|
|
|
SetLocalInt(oPC, "X0_APPRAISEADJUST"+ sTag, nAdjust);
|
|
|
|
// * Hard cap of 30% max up or down
|
|
if (nAdjust > 30)
|
|
nAdjust = 30;
|
|
if (nAdjust < -30)
|
|
nAdjust = -30;
|
|
|
|
nBonusMarkUp = nBonusMarkUp + nAdjust;
|
|
nBonusMarkDown = nBonusMarkDown - nAdjust;
|
|
OpenStore(oStore, oPC, nBonusMarkUp, nBonusMarkDown);
|
|
}
|
|
|
|
|
|
// * plays the correct character theme
|
|
// * assumes OBJECT_SELF is in the area
|
|
void PlayCharacterTheme(int nTheme)
|
|
{
|
|
object oArea =GetArea(OBJECT_SELF);
|
|
int nMusicNight = MusicBackgroundGetNightTrack(oArea);
|
|
int nMusicDay = MusicBackgroundGetDayTrack(oArea);
|
|
// AssignCommand(GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC), SpeakString(IntToString(nMusic)));
|
|
//* stores the last music track
|
|
SetLocalInt(oArea, "NW_L_MYLASTTRACKNight", nMusicNight);
|
|
SetLocalInt(oArea, "NW_L_MYLASTTRACKDay", nMusicDay);
|
|
MusicBackgroundStop(oArea);
|
|
MusicBackgroundChangeNight(oArea, nTheme);
|
|
MusicBackgroundChangeDay(oArea, nTheme);
|
|
MusicBackgroundPlay(oArea);
|
|
|
|
}
|
|
|
|
// * plays the old theme for the area
|
|
// * assumes OBJECT_SELF is in the area
|
|
void PlayOldTheme()
|
|
{
|
|
object oArea =GetArea(OBJECT_SELF);
|
|
//* stores the last music track
|
|
int nMusicNight = GetLocalInt(oArea, "NW_L_MYLASTTRACKNight");
|
|
int nMusicDay = GetLocalInt(oArea, "NW_L_MYLASTTRACKDay");
|
|
MusicBackgroundStop(oArea);
|
|
MusicBackgroundChangeNight(oArea, nMusicNight);
|
|
MusicBackgroundChangeDay(oArea, nMusicDay);
|
|
MusicBackgroundPlay(oArea);
|
|
|
|
}
|
|
|
|
|
|
// Returns the adjusted Reaction for the purposes of store pricing.
|
|
float GetReactionAdjustment(object oTarget);
|
|
/*
|
|
Adjusts all faction member's reputation visa via
|
|
another faction. Pass in a member from each
|
|
faction.
|
|
*/
|
|
void AdjustFactionReputation(object oTargetCreature, object oMemberOfSourceFaction, int nAdjustment);
|
|
/*
|
|
Makes the person teleport away and look like
|
|
they are casting a spell.
|
|
*/
|
|
void EscapeViaTeleport(object oFleeing);
|
|
|
|
// * FUNCTION DEFINITIONS
|
|
|
|
|
|
int GetCanCastHealingSpells(object oPC)
|
|
{
|
|
talent tTalent = GetCreatureTalentBest(TALENT_CATEGORY_BENEFICIAL_HEALING_TOUCH, 20, oPC);
|
|
if (GetIsTalentValid(tTalent) == TRUE)
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
int DoOnce()
|
|
{
|
|
int bResult = FALSE;
|
|
|
|
if (GetLocalInt(OBJECT_SELF,"NW_L_DOONCE999") == 0)
|
|
{
|
|
SetLocalInt(OBJECT_SELF,"NW_L_DOONCE999",1);
|
|
bResult = TRUE;
|
|
}
|
|
return bResult;
|
|
}
|
|
|
|
void DebugSpeak(string s)
|
|
{
|
|
SpeakString(s);
|
|
}
|
|
object GetMyMaster()
|
|
{
|
|
return GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
|
|
}
|
|
|
|
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: IsRecall
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Attempts to transport the player
|
|
back to closest Temple of Tyr using
|
|
a Recall Stone.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By:
|
|
//:: Created On:
|
|
//:://////////////////////////////////////////////
|
|
int IsRecall()
|
|
{
|
|
if (GetTag(GetItemActivated()) == "NW_IT_RECALL")
|
|
{
|
|
string sAreaTag = GetTag(GetArea(GetItemActivator()));
|
|
if (/*Chapter 1 Areas*/
|
|
sAreaTag == "MAP_M1S3B" ||
|
|
sAreaTag == "Map_M1S4C" ||
|
|
sAreaTag == "MAP_M1Q6F4" || // Fenthick area in Chapter1e
|
|
sAreaTag == "Map_M1S4D" ||
|
|
sAreaTag == "Map_M1S4E" ||
|
|
sAreaTag == "Map_M1S4F" ||
|
|
|
|
/* Chapter 3 and 4 Areas*/
|
|
sAreaTag == "MAP_M1Q6A" || /*Castle Never*/
|
|
sAreaTag == "M4Q1D2" /*Final Source Stone level*/ ||
|
|
sAreaTag == "M4FinalArea" || /*Haedralines area*/
|
|
sAreaTag == "M3Q1A10" || /*Aarin Gend's Lodge*/
|
|
sAreaTag == "M3Q3C" || sAreaTag == "M3Q3Ca" || sAreaTag == "M3Q2G" || sAreaTag == "M3Q2I" ||
|
|
sAreaTag == "Map_M2Q2E2" || sAreaTag == "Map_M2Q2G" || sAreaTag == "Map_M2Q3GA" || sAreaTag == "Map_M2Q3GB")
|
|
{
|
|
AssignCommand(GetItemActivator(), ActionSpeakStringByStrRef(10611));
|
|
return TRUE;
|
|
}
|
|
else
|
|
/* if (CanAffordIt() == FALSE)
|
|
{
|
|
AssignCommand(GetItemActivator(), ActionSpeakStringByStrRef(66200));
|
|
return TRUE;
|
|
|
|
}
|
|
else */
|
|
// * May 2002: Checking a global to see if Haedraline is around as well
|
|
if ( GetLocalInt(GetModule(),"NW_G_RECALL_HAED") == 10
|
|
|| GetIsObjectValid(GetNearestObjectByTag("Haedraline3Q11", GetItemActivator())) == TRUE)
|
|
{
|
|
AssignCommand(GetItemActivator(), ActionSpeakStringByStrRef(10612));
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
object oPortal = GetObjectByTag("NW_RECALL_PORTAL");
|
|
if (GetIsObjectValid(oPortal) == TRUE)
|
|
{
|
|
SetLocalInt(GetItemActivator(), "NW_L_USED_RECALL", 1);
|
|
SetLocalLocation(GetItemActivator(), "NW_L_LOC_RECALL", GetLocation(GetItemActivator()));
|
|
string sTag = "NW_RECALL_PORTAL";
|
|
object oClicker = GetItemActivator();
|
|
object oTarget = GetObjectByTag(sTag);
|
|
// AssignCommand(GetItemActivator(), SpeakString(sTag));
|
|
// * if I don't do this, gets stuck in a loop
|
|
// * of casting.
|
|
AssignCommand(oClicker, ClearAllActions());
|
|
|
|
AssignCommand(oClicker, PlaySound("as_mg_telepout1"));
|
|
|
|
|
|
//SetAreaTransitionBMP(AREA_TRANSITION_RANDOM);
|
|
// AssignCommand(oClicker, PlaySound("as_mg_telepout1"));
|
|
AssignCommand(oClicker,JumpToObject(oTarget));
|
|
// AssignCommand(oClicker, DelayCommand(1.0,PlaySound("as_mg_telepout1")));
|
|
AssignCommand(oClicker, ActionDoCommand(ClearAllActions()));
|
|
return TRUE;
|
|
}
|
|
// * this module does not have a temple of tyr
|
|
else
|
|
{
|
|
AssignCommand(GetItemActivator(), ActionSpeakStringByStrRef(10614));
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: DimensionHop
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Will move the character from one point to oTarget
|
|
with a flashy graphic.
|
|
Original Use: Dryads in M3Q3, SnowGlobe
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Brent
|
|
//:: Created On: January 10, 2002
|
|
//:://////////////////////////////////////////////
|
|
|
|
void DimensionHop(object oTarget)
|
|
{
|
|
if (GetDistanceToObject(oTarget) > 2.5)
|
|
{
|
|
effect eVis = EffectVisualEffect(VFX_IMP_UNSUMMON);
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);
|
|
ActionJumpToObject(oTarget);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: CanSeePlayer
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Returns true if OBJECT_SELF can see the player
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By:
|
|
//:: Created On:
|
|
//:://////////////////////////////////////////////
|
|
|
|
int CanSeePlayer()
|
|
{
|
|
return GetIsObjectValid(GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN));
|
|
}
|
|
//::///////////////////////////////////////////////
|
|
//:: EscapeArea()
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Runs object to nearest waypoint with tag
|
|
"NW_EXIT". This tag can be overridden.
|
|
You can also specify whether to run or not.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Brent
|
|
//:: Created On: December 2001
|
|
//:://////////////////////////////////////////////
|
|
void EscapeArea(int bRun = TRUE, string sTag="NW_EXIT")
|
|
{
|
|
object oWay = GetNearestObjectByTag(sTag);
|
|
if (GetIsObjectValid(oWay))
|
|
{
|
|
ActionMoveToObject(oWay, bRun);
|
|
ActionDoCommand(DestroyObject(OBJECT_SELF));
|
|
SetCommandable(FALSE); // * this prevents them from being interrupted
|
|
}
|
|
else
|
|
SpeakString("invalid exit waypoint");
|
|
}
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: HasItem
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
A wrapper to simplify checking for an item.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Brent
|
|
//:: Created On: November 2001
|
|
//:://////////////////////////////////////////////
|
|
|
|
int HasItem(object oCreature, string s)
|
|
{
|
|
return GetIsObjectValid(GetItemPossessedBy(oCreature, s));
|
|
}
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: Take Gold
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Takes nAmount of gold from the object speaking.
|
|
By default, the gold is destroyed.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Brent
|
|
//:: Created On: November 2001
|
|
//:://////////////////////////////////////////////
|
|
void TakeGold(int nAmount, object oGoldHolder, int bDestroy=TRUE)
|
|
{
|
|
TakeGoldFromCreature(nAmount, oGoldHolder, bDestroy);
|
|
}
|
|
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: HasGold
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Checks to see if the player has nAmount of gold
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By:
|
|
//:: Created On:
|
|
//:://////////////////////////////////////////////
|
|
int HasGold(int nAmount, object oGoldHolder)
|
|
{
|
|
return GetGold(oGoldHolder) >= nAmount;
|
|
}
|
|
|
|
//:: GetNearestPC
|
|
//////////////////////////////////////////////////
|
|
//
|
|
// GetNearestPC
|
|
//
|
|
//////////////////////////////////////////////////
|
|
//
|
|
//
|
|
// Returns the PC closes to the object calling
|
|
// the function.
|
|
//
|
|
//////////////////////////////////////////////////
|
|
//
|
|
// Created By: Brent
|
|
// Created On: May 16, 2001
|
|
//
|
|
//////////////////////////////////////////////////
|
|
object GetNearestPC()
|
|
{
|
|
return GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC);
|
|
}
|
|
|
|
|
|
//:: SetIsEnemy
|
|
//////////////////////////////////////////////////
|
|
//
|
|
// [Function Name]
|
|
//
|
|
//////////////////////////////////////////////////
|
|
//
|
|
//
|
|
// [A description of the function. This should contain any
|
|
// special ranges on input values]
|
|
//
|
|
//////////////////////////////////////////////////
|
|
//
|
|
// Created By:
|
|
// Created On:
|
|
//
|
|
//////////////////////////////////////////////////
|
|
void SetIsEnemy(object oTarget)
|
|
{
|
|
AdjustReputation(oTarget, OBJECT_SELF,-100);
|
|
ActionAttack(oTarget);
|
|
}
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// AutoDC
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Returns a pass value based on the object's level and the suggested DC
|
|
// December 20 2001: Changed so that the difficulty is determined by the
|
|
// NPC's Hit Dice
|
|
// November 2002 (Brent): Adding a higher upper range for level 15+ campaigns.
|
|
// August 2003 (Georg): Fixed bug not adding up DCs in the correct order
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Created By: Brent, September 13 2001
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
int AutoDC(int DC, int nSkill, object oTarget)
|
|
{
|
|
/*
|
|
Easy = Lvl/4 ...rounded up
|
|
Moderate = 3/Lvl + Lvl ...rounded up
|
|
Difficult = Lvl * 1.5 + 6 ...rounded up
|
|
*/
|
|
int nLevel = GetHitDice(OBJECT_SELF);
|
|
int nTest = 0;
|
|
|
|
// * July 2
|
|
// * If nLevel is less than 0 or 0 then set it to 1
|
|
if (nLevel <= 0)
|
|
{
|
|
nLevel = 1;
|
|
}
|
|
|
|
switch (DC)
|
|
{
|
|
case DC_EASY: nTest = nLevel / 4 + 1; break;
|
|
// * minor tweak to lower the values a little
|
|
case DC_MEDIUM: nTest = (3 / nLevel + nLevel) - abs( (nLevel/2) -2); break;
|
|
case DC_HARD: nTest = FloatToInt(nLevel * 1.5 + 6) - abs( ( FloatToInt(nLevel/1.5) -2)); break;
|
|
case DC_SUPERIOR: nTest = 7+ FloatToInt(nLevel * 1.5 + 6) - abs( ( FloatToInt(nLevel/1.5) -2)); break;
|
|
case DC_MASTER: nTest = 14 + FloatToInt(nLevel * 1.5 + 6) - abs( ( FloatToInt(nLevel/1.5) -2)); break;
|
|
case DC_LEGENDARY: nTest = 21 + FloatToInt(nLevel * 1.5 + 6) - abs( ( FloatToInt(nLevel/1.5) -2)); break;
|
|
case DC_EPIC: nTest = 28 + FloatToInt(nLevel * 1.5 + 6) - abs( ( FloatToInt(nLevel/1.5) -2)); break;
|
|
}
|
|
|
|
|
|
|
|
// *********************************
|
|
// * CHARM/DOMINATION
|
|
// * If charmed or dominated the NPC
|
|
// * will be at a disadvantage
|
|
// *********************************
|
|
int nCharmMod = 0;
|
|
|
|
if (nSkill == SKILL_PERSUADE || nSkill == SKILL_BLUFF || nSkill == SKILL_INTIMIDATE)
|
|
nCharmMod = GetNPCEasyMark(oTarget);
|
|
int nDC = nTest + 10 - nCharmMod ;
|
|
if (nDC < 1 )
|
|
nDC = 1;
|
|
|
|
// * Roll d20 + skill rank vs. DC + 10
|
|
if (GetSkillRank(nSkill, oTarget) + d20() >= (nDC) )
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// AutoAlignG(int DC, object oTarget)
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Adjusts the alignment of the object towards good, relative to the
|
|
// degree indicated.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Created By: Brent, September 13, 2001
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
void AutoAlignG(int DC, object oTarget)
|
|
{
|
|
int nShift = 0;
|
|
switch (DC)
|
|
{
|
|
case 0: nShift = 3; break;
|
|
case 1: nShift = 7; break;
|
|
case 2: nShift = 10; break;
|
|
}
|
|
AdjustAlignment(oTarget, ALIGNMENT_GOOD, nShift);
|
|
}
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// AutoAlignE
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Adjusts the alignment of the object towards evil, relative to the
|
|
// degree indicated.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Created By: Brent, September 13, 2001
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
void AutoAlignE(int DC, object oTarget)
|
|
{
|
|
int nShift = 0;
|
|
switch (DC)
|
|
{
|
|
case 0: nShift = 3; break;
|
|
case 1: nShift = 7; break;
|
|
case 2: nShift = 10; break;
|
|
}
|
|
AdjustAlignment(oTarget, ALIGNMENT_EVIL, nShift);
|
|
}
|
|
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: DoGiveXP
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Gives the designated XP to the object
|
|
using the design rules for XP
|
|
distribution.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By:
|
|
//:: Created On:
|
|
//:://////////////////////////////////////////////
|
|
|
|
void DoGiveXP(string sJournalTag, int nPercentage, object oTarget, int QuestAlignment=ALIGNMENT_NEUTRAL)
|
|
{
|
|
|
|
float nRewardMod = 1.0;
|
|
// * error handling
|
|
if ((nPercentage < 0) || (nPercentage > 100))
|
|
{
|
|
nPercentage = 100;
|
|
}
|
|
float nXP = GetJournalQuestExperience(sJournalTag) * (nPercentage * 0.01);
|
|
|
|
// * for each party member
|
|
// * cycle through them and
|
|
// * and give them the appropriate reward
|
|
// * HACK FOR NOW
|
|
if ((GetAlignmentGoodEvil(oTarget) == ALIGNMENT_NEUTRAL) || (QuestAlignment ==ALIGNMENT_NEUTRAL) )
|
|
{
|
|
nRewardMod = 1.0;
|
|
}
|
|
else
|
|
if (GetAlignmentGoodEvil(oTarget) == QuestAlignment)
|
|
{
|
|
nRewardMod = 1.25;
|
|
}
|
|
else
|
|
if (GetAlignmentGoodEvil(oTarget) != QuestAlignment)
|
|
{
|
|
nRewardMod = 0.75;
|
|
}
|
|
// AssignCommand(oTarget,SpeakString("My XP reward is: " + FloatToString(nRewardMod * nXP)));
|
|
GiveXPToCreature(oTarget, FloatToInt(nRewardMod * nXP));
|
|
|
|
}
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// RewardXP
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Gives each player the reward, scaled 1.25 times if of the correct alignment
|
|
// and 0.75 times if of the wrong alignment. Neutral always get the
|
|
// 1.0 times reward.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Created By: Brent, September 13, 2001
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
void RewardXP(string sJournalTag, int nPercentage, object oTarget, int QuestAlignment=ALIGNMENT_NEUTRAL, int bAllParty=TRUE)
|
|
{
|
|
|
|
// AssignCommand(oTarget, SpeakString("in rewardxp funtion"));
|
|
if (bAllParty == TRUE)
|
|
{
|
|
object oPartyMember = GetFirstFactionMember(oTarget, TRUE);
|
|
while (GetIsObjectValid(oPartyMember) == TRUE)
|
|
{
|
|
DoGiveXP(sJournalTag, nPercentage, oPartyMember, QuestAlignment);
|
|
oPartyMember = GetNextFactionMember(oTarget, TRUE);
|
|
// AssignCommand(oTarget,SpeakString("here your xp sir"));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DoGiveXP(sJournalTag, nPercentage, oTarget, QuestAlignment);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// RewardGP
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Gives the GP to (if bAllParty = TRUE) all party members.
|
|
// Each players gets the GP value amount.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Created By: Brent, September 13, 2001
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
void RewardGP(int GP, object oTarget,int bAllParty=TRUE)
|
|
{
|
|
// * for each party member
|
|
// * cycle through them and
|
|
// * and give them the appropriate reward
|
|
// * HACK FOR NOW
|
|
if (bAllParty == TRUE)
|
|
{
|
|
object oPartyMember = GetFirstFactionMember(oTarget, TRUE);
|
|
while (GetIsObjectValid(oPartyMember) == TRUE)
|
|
{
|
|
//AssignCommand(oPartyMember, SpeakString("MY GP reward is: " + IntToString(GP)));
|
|
GiveGoldToCreature(oPartyMember, GP);
|
|
oPartyMember = GetNextFactionMember(oTarget, TRUE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
GiveGoldToCreature(oTarget, GP);
|
|
}
|
|
}
|
|
|
|
|
|
// *
|
|
// * Conversation Functions
|
|
// *
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CheckCharismaMiddle
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Returns TRUE if charisma is in the normal range.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Created By: Brent, September 13, 2001
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
int CheckCharismaMiddle()
|
|
{
|
|
if (GetAbilityScore(GetPCSpeaker(),ABILITY_CHARISMA) >= 10 && GetAbilityScore(GetPCSpeaker(),ABILITY_CHARISMA) < 15)
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CheckCharismaNormal
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Returns TRUE if charisma is in the normal range.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Created By: Brent, September 13, 2001
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
int CheckCharismaNormal()
|
|
{
|
|
if (GetAbilityScore(GetPCSpeaker(),ABILITY_CHARISMA) >= 10)
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CheckCharismaLow
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Returns TRUE if charisma is in the low range.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Created By: Brent, September 13, 2001
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
int CheckCharismaLow()
|
|
{
|
|
if (GetAbilityScore(GetPCSpeaker(),ABILITY_CHARISMA) < 10)
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CheckCharismaHigh
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Returns TRUE if charisma is in the high range.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Created By: Brent, September 13, 2001
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
int CheckCharismaHigh()
|
|
{
|
|
if (GetAbilityScore(GetPCSpeaker(),ABILITY_CHARISMA) >= 15)
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CheckIntelligenceLow
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Returns TRUE if intelligence is in the low range
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Created By: Brent, September 13, 2001
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
int CheckIntelligenceLow()
|
|
{
|
|
if (GetAbilityScore(GetPCSpeaker(),ABILITY_INTELLIGENCE) < 9)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CheckIntelligenceNormal
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Returns TRUE if intelligence is in the normal range
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Created By: Brent, September 13, 2001
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
int CheckIntelligenceNormal()
|
|
{
|
|
if (GetAbilityScore(GetPCSpeaker(),ABILITY_INTELLIGENCE) >= 9)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: CheckIntelligenceHigh
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By:
|
|
//:: Created On:
|
|
//:://////////////////////////////////////////////
|
|
|
|
int CheckIntelligenceHigh()
|
|
{
|
|
if (GetAbilityScore(GetPCSpeaker(),ABILITY_INTELLIGENCE) >= 15)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CheckWisdomHigh
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Returns TRUE if wisdom is in the High range
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Created By: Brent, September 13, 2001
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
int CheckWisdomHigh()
|
|
{
|
|
if (GetAbilityScore(GetPCSpeaker(),ABILITY_WISDOM) > 13)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
int GetWisdom(object oTarget)
|
|
{
|
|
return GetAbilityScore(oTarget, ABILITY_WISDOM);
|
|
}
|
|
int GetIntelligence(object oTarget)
|
|
{
|
|
return GetAbilityScore(oTarget, ABILITY_INTELLIGENCE);
|
|
}
|
|
int GetCharisma(object oTarget)
|
|
{
|
|
return GetAbilityScore(oTarget, ABILITY_CHARISMA);
|
|
}
|
|
|
|
//:: GetNumItems
|
|
//////////////////////////////////////////////////
|
|
//
|
|
// GetNumItems
|
|
//
|
|
//////////////////////////////////////////////////
|
|
//
|
|
//
|
|
// Returns the number of specified item in the
|
|
// target's inventory.
|
|
//
|
|
//////////////////////////////////////////////////
|
|
//
|
|
// Created By: John
|
|
// Created On: September 19, 2001
|
|
//
|
|
//////////////////////////////////////////////////
|
|
int GetNumItems(object oTarget,string sItem)
|
|
{
|
|
int nNumItems = 0;
|
|
object oItem = GetFirstItemInInventory(oTarget);
|
|
|
|
while (GetIsObjectValid(oItem) == TRUE)
|
|
{
|
|
if (GetTag(oItem) == sItem)
|
|
{
|
|
nNumItems = nNumItems + GetNumStackedItems(oItem);
|
|
}
|
|
oItem = GetNextItemInInventory(oTarget);
|
|
}
|
|
|
|
return nNumItems;
|
|
}
|
|
|
|
//:: GiveNumItems
|
|
//////////////////////////////////////////////////
|
|
//
|
|
// GiveNumItems
|
|
//
|
|
//////////////////////////////////////////////////
|
|
//
|
|
//
|
|
// Gives the target the number of items specified.
|
|
//
|
|
//////////////////////////////////////////////////
|
|
//
|
|
// Created By: John
|
|
// Created On: September 19, 2001
|
|
//
|
|
//////////////////////////////////////////////////
|
|
void GiveNumItems(object oTarget,string sItem,int nNumItems)
|
|
{
|
|
int nCount = 0;
|
|
object oItem = GetFirstItemInInventory(OBJECT_SELF);
|
|
|
|
while (GetIsObjectValid(oItem) == TRUE && nCount < nNumItems)
|
|
{
|
|
if (GetTag(oItem) == sItem)
|
|
{
|
|
ActionGiveItem(oItem,oTarget);
|
|
nCount++;
|
|
}
|
|
oItem = GetNextItemInInventory(OBJECT_SELF);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
//:: TakeNumItems
|
|
//////////////////////////////////////////////////
|
|
//
|
|
// TakeNumItems
|
|
//
|
|
//////////////////////////////////////////////////
|
|
//
|
|
//
|
|
// Takes the number of items specified from the target.
|
|
//
|
|
//////////////////////////////////////////////////
|
|
//
|
|
// Created By: John
|
|
// Created On: September 19, 2001
|
|
//
|
|
//////////////////////////////////////////////////
|
|
void TakeNumItems(object oTarget,string sItem,int nNumItems)
|
|
{
|
|
int nCount = 0;
|
|
object oItem = GetFirstItemInInventory(oTarget);
|
|
|
|
while (GetIsObjectValid(oItem) == TRUE && nCount < nNumItems)
|
|
{
|
|
if (GetTag(oItem) == sItem)
|
|
{
|
|
ActionTakeItem(oItem,oTarget);
|
|
nCount++;
|
|
}
|
|
oItem = GetNextItemInInventory(oTarget);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// GetReactionAdjustment
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Returns the adjusted Reaction for the purposes of store pricing.
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Created By: Brent, September 25, 2001
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
float GetReactionAdjustment(object oTarget)
|
|
{
|
|
float nFactionAdjustment = 2.0;
|
|
// (i)
|
|
if (GetIsFriend(oTarget) == TRUE)
|
|
{
|
|
nFactionAdjustment = 1.0;
|
|
}
|
|
|
|
// (ii)
|
|
int oTargetLawChaos = GetLawChaosValue(oTarget);
|
|
int oTargetGoodEvil = GetGoodEvilValue(oTarget);
|
|
int oSourceLawChaos = GetLawChaosValue(OBJECT_SELF);
|
|
int oSourceGoodEvil = GetGoodEvilValue(OBJECT_SELF);
|
|
int APB = abs(oSourceLawChaos - oTargetLawChaos) + abs(oSourceGoodEvil - oTargetGoodEvil);
|
|
int nTargetCharismaMod = GetAbilityModifier(ABILITY_CHARISMA, oTarget);
|
|
return abs(10 + APB - (nTargetCharismaMod * 10)) * nFactionAdjustment;
|
|
|
|
}
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: AdjustFactionReputation
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Adjusts all faction member's reputation visa via
|
|
another faction. Pass in a member from each
|
|
faction.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Presotn Watamaniuk
|
|
//:: Created On: Nov 15, 2001
|
|
//:://////////////////////////////////////////////
|
|
void AdjustFactionReputation(object oTargetCreature, object oMemberOfSourceFaction, int nAdjustment)
|
|
{
|
|
object oFaction = GetFirstFactionMember(oTargetCreature);
|
|
while(GetIsObjectValid(oFaction))
|
|
{
|
|
AdjustReputation(oTargetCreature, oMemberOfSourceFaction, nAdjustment);
|
|
oFaction = GetNextFactionMember(oTargetCreature);
|
|
}
|
|
AdjustReputation(oTargetCreature, oMemberOfSourceFaction, nAdjustment);
|
|
}
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: Escape Via Teleport
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Makes the person teleport away and look like
|
|
they are casting a spell.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Preston Watamaniuk
|
|
//:: Created On: March 12, 2002
|
|
//:://////////////////////////////////////////////
|
|
|
|
void EscapeViaTeleport(object oFleeing)
|
|
{
|
|
effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3);
|
|
ActionCastFakeSpellAtObject(SPELL_MINOR_GLOBE_OF_INVULNERABILITY, oFleeing);
|
|
DelayCommand(1.5, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(oFleeing)));
|
|
DestroyObject(oFleeing, 2.5);
|
|
}
|
|
|
|
|
|
//::///////////////////////////////////////////////
|
|
//:: GetP(arty)LocalInt
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Scans through all players in the party, to
|
|
treat them all as 'one person' for the purposes
|
|
of most plots. Makes our plots more multiplayer friendly.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: John
|
|
//:: Created On:
|
|
//:://////////////////////////////////////////////
|
|
int GetPLocalInt(object oPC,string sLocalName)
|
|
{
|
|
int nValue = 0;
|
|
object oMember;
|
|
|
|
oMember = GetFirstFactionMember(oPC);
|
|
|
|
while (GetIsObjectValid(oMember))
|
|
{
|
|
if (GetLocalInt(oPC,sLocalName) > nValue)
|
|
{
|
|
nValue = GetLocalInt(oMember,sLocalName);
|
|
}
|
|
oMember = GetNextFactionMember(oPC);
|
|
}
|
|
|
|
return nValue;
|
|
}
|
|
//::///////////////////////////////////////////////
|
|
//:: SetP(arty)LocalInt
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: John
|
|
//:: Created On:
|
|
//:://////////////////////////////////////////////
|
|
void SetPLocalInt(object oPC,string sLocalName, int nValue)
|
|
{
|
|
object oMember;
|
|
|
|
oMember = GetFirstFactionMember(oPC);
|
|
|
|
while (GetIsObjectValid(oMember))
|
|
{
|
|
SetLocalInt(oMember,sLocalName,nValue);
|
|
oMember = GetNextFactionMember(oPC);
|
|
}
|
|
|
|
return;
|
|
}
|
|
// * removes all negative effects
|
|
void RemoveEffects(object oDead)
|
|
{
|
|
//Declare major variables
|
|
object oTarget = oDead;
|
|
effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION);
|
|
int bValid;
|
|
|
|
effect eBad = GetFirstEffect(oTarget);
|
|
//Search for negative effects
|
|
while(GetIsEffectValid(eBad))
|
|
{
|
|
if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_DEAF ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_PARALYZE ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_FRIGHTENED ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_DAZED ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_CONFUSED ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_POISON ||
|
|
GetEffectType(eBad) == EFFECT_TYPE_DISEASE
|
|
)
|
|
{
|
|
//Remove effect if it is negative.
|
|
RemoveEffect(oTarget, eBad);
|
|
}
|
|
eBad = GetNextEffect(oTarget);
|
|
}
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE));
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oTarget);
|
|
|
|
// * May 2002: Removed this because ActionRest is no longer an instant.
|
|
// * rest the player
|
|
//AssignCommand(oDead, ActionRest());
|
|
}
|
|
int CheckDCStr(int DC, int nSkill, object oTarget)
|
|
{
|
|
/*
|
|
Easy = Lvl/4 ...rounded up
|
|
Moderate = 3/Lvl + Lvl ...rounded up
|
|
Difficult = Lvl * 1.5 + 6 ...rounded up
|
|
*/
|
|
int nLevel = GetHitDice(OBJECT_SELF);
|
|
int nTest = 0;
|
|
|
|
// * July 2
|
|
// * If nLevel is less than 0 or 0 then set it to 1
|
|
if (nLevel <= 0)
|
|
{
|
|
nLevel = 1;
|
|
}
|
|
|
|
switch (DC)
|
|
{
|
|
case 0: nTest = nLevel / 4 + 1; break;
|
|
// * minor tweak to lower the values a little
|
|
case 1: nTest = (3 / nLevel + nLevel) - abs( (nLevel/2) -2); break;
|
|
case 2: nTest = FloatToInt(nLevel * 1.5 + 6) - abs( ( FloatToInt(nLevel/1.5) -2));
|
|
case 3: nTest = nTest + 7;
|
|
case 4: nTest = nTest + 7;
|
|
case 5: nTest = nTest + 7;
|
|
// because there are no break statements it should
|
|
// add all the bonuses
|
|
}
|
|
//SpeakString(IntToString(nTest));
|
|
|
|
// * Roll d20 + skill rank vs. DC + 10
|
|
if (GetSkillRank(nSkill, oTarget) + d20() + GetAbilityModifier(ABILITY_STRENGTH, oTarget) >= (nTest + 10) )
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
// * returns true if the player can afford to lose the indicated amount of XP without losing a level
|
|
int plotCanRemoveXP(object oPC, int nPenalty)
|
|
{
|
|
int nXP = GetXP(oPC);
|
|
int nHD = GetHitDice(oPC);
|
|
// * You can not lose a level with this
|
|
int nMin = ((nHD * (nHD - 1)) / 2) * 1000;
|
|
|
|
int nNewXP = nXP - nPenalty;
|
|
if (nNewXP < nMin)
|
|
return FALSE;
|
|
return TRUE;
|
|
}
|
|
int GetIsPlayerCharacter(object oTarget)
|
|
{
|
|
if (GetIsPC(oTarget) == TRUE && GetIsDM(oTarget) == FALSE)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
//::///////////////////////////////////////////////
|
|
//:: Name Reward_2daXP
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Pass in a PC and a row from the 'des_xp_rewards'
|
|
2da file to reward the PC and/or party experience
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Keith Warner
|
|
//:: Created On: May 29/03
|
|
//:://////////////////////////////////////////////
|
|
|
|
void Reward_2daXP(object oPC, int nRow, int bAllParty = TRUE, int nPercentage = 100)
|
|
{
|
|
|
|
float fPercent = IntToFloat(nPercentage)/100.0;
|
|
int nPlotXP = StringToInt(Get2DAString("des_xp_rewards", "XP", nRow));
|
|
int nReward = FloatToInt(fPercent * nPlotXP);
|
|
if (bAllParty == TRUE)
|
|
{
|
|
object oParty = GetFirstFactionMember(oPC);
|
|
while (oParty != OBJECT_INVALID)
|
|
{
|
|
GiveXPToCreature(oParty, nReward);
|
|
oParty = GetNextFactionMember(oPC);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
GiveXPToCreature(oPC, nReward);
|
|
}
|
|
}
|
|
//::///////////////////////////////////////////////
|
|
//:: Name PlaySpeakSoundByStrRef
|
|
/*
|
|
Do both a SpeakStringRef and a Play StringRef
|
|
at the same time.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Keith Warner
|
|
//:: Created On: Oct 23/03
|
|
//:://////////////////////////////////////////////
|
|
void PlaySpeakSoundByStrRef(int nStrRef)
|
|
{
|
|
SpeakStringByStrRef(nStrRef);
|
|
PlaySoundByStrRef(nStrRef, FALSE);
|
|
}
|