20255/17/19 Update

Added PEPS AI.
Full compile.
This commit is contained in:
Jaysyn904
2025-07-19 18:27:32 -04:00
parent dd3496e400
commit d2a9c50615
2533 changed files with 136137 additions and 13984 deletions

View File

@@ -1,90 +1,36 @@
//::///////////////////////////////////////////////
//:: Default On Damaged
//:: NW_C2_DEFAULT6
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
If already fighting then ignore, else determine
combat round
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Oct 16, 2001
//:://////////////////////////////////////////////
#include "hench_i0_ai"
#include "x3_inc_horse"
/*//////////////////////////////////////////////////////////////////////////////
Script: nw_c2_default6
Programmer: Philos
////////////////////////////////////////////////////////////////////////////////
Monster OnDamaged event script;
Does not fire if the creature dies from the damage.
Does not fire for plot creatures as they take no damage.
May fire before or after OnPhysicalAttacked event.
Fires when EffectDamage is applied to oCreature even if 0 damage.
Fires when a weapon damages a oCreature, but not if resisted.
*///////////////////////////////////////////////////////////////////////////////
#include "0i_actions"
void main()
{
//ExecuteScript("prc_npc_damaged", OBJECT_SELF);
object oCreature = OBJECT_SELF;
object oDamager = GetLastDamager();
object oMe=OBJECT_SELF;
int nHPBefore;
if (!GetLocalInt(GetModule(),"X3_NO_MOUNTED_COMBAT_FEAT"))
if (GetHasFeat(FEAT_MOUNTED_COMBAT)&&HorseGetIsMounted(OBJECT_SELF))
{ // see if can negate some damage
if (GetLocalInt(OBJECT_SELF,"bX3_LAST_ATTACK_PHYSICAL"))
{ // last attack was physical
nHPBefore=GetLocalInt(OBJECT_SELF,"nX3_HP_BEFORE");
if (!GetLocalInt(OBJECT_SELF,"bX3_ALREADY_MOUNTED_COMBAT"))
{ // haven't already had a chance to use this for the round
SetLocalInt(OBJECT_SELF,"bX3_ALREADY_MOUNTED_COMBAT",TRUE);
int nAttackRoll=GetBaseAttackBonus(oDamager)+d20();
int nRideCheck=GetSkillRank(SKILL_RIDE,OBJECT_SELF)+d20();
if (nRideCheck>=nAttackRoll&&!GetIsDead(OBJECT_SELF))
{ // averted attack
if (GetIsPC(oDamager)) SendMessageToPC(oDamager,GetName(OBJECT_SELF)+GetStringByStrRef(111991));
//if (GetIsPC(OBJECT_SELF)) SendMessageToPCByStrRef(OBJECT_SELF,111992");
if (GetCurrentHitPoints(OBJECT_SELF)<nHPBefore)
{ // heal
effect eHeal=EffectHeal(nHPBefore-GetCurrentHitPoints(OBJECT_SELF));
AssignCommand(GetModule(),ApplyEffectToObject(DURATION_TYPE_INSTANT,eHeal,oMe));
} // heal
} // averted attack
} // haven't already had a chance to use this for the round
} // last attack was physical
} // see if can negate some damage
if(GetFleeToExit())
{
}
else if (GetSpawnInCondition(NW_FLAG_SET_WARNINGS))
{
// don't do anything?
}
else
{
if (!GetIsObjectValid(oDamager))
{
// don't do anything, we don't have a valid damager
}
else if (!GetIsFighting(OBJECT_SELF))
{
if ((GetLocalInt(OBJECT_SELF, HENCH_HEAL_SELF_STATE) == HENCH_HEAL_SELF_WAIT) &&
(GetPercentageHPLoss(OBJECT_SELF) < 30))
{
// force heal
HenchDetermineCombatRound(OBJECT_INVALID, TRUE);
}
else if(!GetIsObjectValid(GetAttemptedAttackTarget()) && !GetIsObjectValid(GetAttemptedSpellTarget()))
{
// Jug_Debug(GetName(OBJECT_SELF) + " responding to damage");
if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL))
{
HenchDetermineSpecialBehavior(oDamager);
}
else
{
HenchDetermineCombatRound(oDamager);
}
}
}
}
ExecuteScript("prc_npc_damaged", OBJECT_SELF);
// Send the user-defined event signal
if(GetSpawnInCondition(NW_FLAG_DAMAGED_EVENT))
{
SignalEvent(OBJECT_SELF, EventUserDefined(EVENT_DAMAGED));
SignalEvent(oCreature, EventUserDefined(EVENT_DAMAGED));
return;
}
if(ai_Disabled(oCreature)) return;
// Make sure to clear wounded shout limit if we take damage. See ai_TryHealing.
DeleteLocalInt(oCreature, "AI_WOUNDED_SHOUT_LIMIT");
object oDamager = GetLastDamager(oCreature);
if(AI_DEBUG) ai_Debug("nw_c2_default6", "23", GetName(oCreature) + " has been damaged by " + GetName(oDamager));
if(ai_GetFleeToExit(oCreature)) return;
if(GetObjectType(oDamager) == OBJECT_TYPE_AREA_OF_EFFECT &&
ai_IsInADangerousAOE(oCreature, AI_RANGE_BATTLEFIELD, TRUE)) return;
if(ai_GetIsBusy(oCreature) || ai_GetIsInCombat(oCreature)) return;
if(GetDistanceBetween(oCreature, oDamager) < AI_RANGE_CLOSE) ai_DoMonsterCombatRound(oCreature);
else ActionMoveToObject(oDamager, TRUE, AI_RANGE_CLOSE - 1.0);
}