Added (2) Castle Interior overrides, continued making static NPCs & stores dynamic. added more DMFI language tokens, started working on mod onEnter scripting, got NPCs to fire emotes while walking around.
137 lines
5.2 KiB
Plaintext
137 lines
5.2 KiB
Plaintext
/*/////////////////////// [On Phisical Attacked] ///////////////////////////////
|
|
Filename: J_AI_OnPhiAttack or nw_c2_default5
|
|
///////////////////////// [On Phisical Attacked] ///////////////////////////////
|
|
On Attacked
|
|
No checking for fleeing or warnings.
|
|
Very boring really!
|
|
///////////////////////// [History] ////////////////////////////////////////////
|
|
1.3 - Added hiding things
|
|
1.4 - Missing Silent Shouts have been added.
|
|
///////////////////////// [Workings] ///////////////////////////////////////////
|
|
Got some simple Knockdown timer, so that we use heal sooner if we keep getting
|
|
a creature who is attempting to knock us down.
|
|
///////////////////////// [Arguments] //////////////////////////////////////////
|
|
Arguments: GetLastAttacker, GetLastWeaponUsed, GetLastAttackMode, GetLastAttackType
|
|
///////////////////////// [On Phisical Attacked] /////////////////////////////*/
|
|
|
|
#include "J_INC_OTHER_AI"
|
|
|
|
void main()
|
|
{
|
|
// Pre-attacked-event. Returns TRUE if we interrupt this script call.
|
|
if(FirePreUserEvent(AI_FLAG_UDE_ATTACK_PRE_EVENT, EVENT_ATTACK_PRE_EVENT)) return;
|
|
|
|
// AI status check. Is the AI on?
|
|
if(GetAIOff()) return;
|
|
|
|
// Set up objects.
|
|
object oAttacker = GetLastAttacker();
|
|
object oWeapon = GetLastWeaponUsed(oAttacker);
|
|
//int nMode = GetLastAttackMode(oAttacker); // Currently unused
|
|
int nAttackType = GetLastAttackType(oAttacker);
|
|
|
|
// Check if they are valid, a DM, we are ignoring them, they are dead now, or invalid
|
|
if(!GetIgnoreNoFriend(oAttacker))
|
|
{
|
|
// Adjust automatically if set.
|
|
if(GetSpawnInCondition(AI_FLAG_OTHER_CHANGE_FACTIONS_TO_HOSTILE_ON_ATTACK, AI_OTHER_MASTER))
|
|
{
|
|
if(!GetIsEnemy(oAttacker))
|
|
{
|
|
AdjustReputation(oAttacker, OBJECT_SELF, -100);
|
|
}
|
|
}
|
|
|
|
// If we were attacked by knockdown, for a timer of X seconds, we make
|
|
// sure we attempt healing at a higher level.
|
|
if(!GetLocalTimer(AI_TIMER_KNOCKDOWN) &&
|
|
(nAttackType == SPECIAL_ATTACK_IMPROVED_KNOCKDOWN ||
|
|
nAttackType == SPECIAL_ATTACK_KNOCKDOWN) &&
|
|
!GetIsImmune(OBJECT_SELF, IMMUNITY_TYPE_KNOCKDOWN) &&
|
|
GetBaseAttackBonus(oAttacker) + 20 >= GetAC(OBJECT_SELF))
|
|
{
|
|
SetLocalTimer(AI_TIMER_KNOCKDOWN, 30.0);
|
|
}
|
|
|
|
// Set last hostile, valid attacker (Used in the On Damaged event)
|
|
SetAIObject(AI_STORED_LAST_ATTACKER, oAttacker);
|
|
|
|
// * Don't speak when dead. 1.4 change (an obvious one to make)
|
|
if(CanSpeak())
|
|
{
|
|
// Speak the phisically attacked string, if applicable.
|
|
// Speak the damaged string, if applicable.
|
|
SpeakArrayString(AI_TALK_ON_PHISICALLY_ATTACKED);
|
|
}
|
|
|
|
// Turn of hiding, a timer to activate Hiding in the main file. This is
|
|
// done in each of the events, with the opposition checking seen/heard.
|
|
TurnOffHiding(oAttacker);
|
|
|
|
// We set if we are attacked in HTH onto a low-delay timer.
|
|
// - Not currently used
|
|
/*if(!GetLocalTimer(AI_TIMER_ATTACKED_IN_HTH))
|
|
{
|
|
// If the weapon is not ranged, or is not valid, set the timer.
|
|
if(!GetIsObjectValid(oWeapon) ||
|
|
!GetWeaponRanged(oWeapon))
|
|
{
|
|
SetLocalTimer(AI_TIMER_ATTACKED_IN_HTH, f18);
|
|
}
|
|
}*/
|
|
|
|
// If we are not fighting, and they are in the area, attack. Else, determine anyway.
|
|
if(!CannotPerformCombatRound())
|
|
{
|
|
// Must be in our area to go after now.
|
|
if(GetArea(oAttacker) == GetArea(OBJECT_SELF))
|
|
{
|
|
// 59: "[Phisically Attacked] Attacking back. [Attacker(enemy)] " + GetName(oAttacker)
|
|
DebugActionSpeakByInt(59, oAttacker);
|
|
|
|
// Attack the attacker
|
|
DetermineCombatRound(oAttacker);
|
|
|
|
// Shout to allies to attack the enemy who attacked me
|
|
AISpeakString(AI_SHOUT_I_WAS_ATTACKED);
|
|
}
|
|
else
|
|
{
|
|
// Shout to allies to attack, or be prepared.
|
|
AISpeakString(AI_SHOUT_CALL_TO_ARMS);
|
|
|
|
// 60: "[Phisically Attacked] Not same area. [Attacker(enemy)] " + GetName(oAttacker)
|
|
DebugActionSpeakByInt(60, oAttacker);
|
|
|
|
// May find another hostile to attack...
|
|
DetermineCombatRound();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Shout to allies to attack, or be prepared.
|
|
AISpeakString(AI_SHOUT_CALL_TO_ARMS);
|
|
}
|
|
}
|
|
// Else, invalid, DM, ally, etc...must be prepared at least (could be
|
|
// they are charmed or something!)
|
|
else
|
|
{
|
|
// If we are not fighting, prepare for battle. Something bad must have
|
|
// happened.
|
|
if(!CannotPerformCombatRound())
|
|
{
|
|
// Respond to oAttacker as if they shouted for help.
|
|
IWasAttackedResponse(oAttacker);
|
|
}
|
|
else
|
|
{
|
|
// Shout to allies to attack, or be prepared.
|
|
AISpeakString(AI_SHOUT_CALL_TO_ARMS);
|
|
}
|
|
}
|
|
|
|
// Fire End of Attacked event
|
|
FireUserEvent(AI_FLAG_UDE_ATTACK_EVENT, EVENT_ATTACK_EVENT);
|
|
}
|