RATDOG/_module/nss/j_ai_onphiattack.nss

137 lines
5.2 KiB
Plaintext
Raw Normal View History

/*/////////////////////// [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);
}