initial ifuritate (AE Enrage) implmentation

This is not working yet as it is not actually calling a timer yet.
This commit is contained in:
Sorvani 2013-03-15 11:56:03 -05:00
parent a14fecaf78
commit 0c14f5a470
9 changed files with 77 additions and 9 deletions

4
.gitignore vendored
View File

@ -35,3 +35,7 @@ Build_64/
build_64/
log/
logs/
# Patch files
*.orig
*.rej

View File

@ -1850,12 +1850,12 @@ bool NPC::AI_IdleCastCheck() {
void Mob::StartEnrage()
{
// dont continue if already enraged
if (bEnraged)
if (bEnraged || bInfuriated)
return;
if (SpecAttackTimers[SPECATK_ENRAGE] && !SpecAttackTimers[SPECATK_ENRAGE]->Check())
return;
// see if NPC has possibility to enrage
if (!SpecAttacks[SPECATK_ENRAGE])
if (!SpecAttacks[SPECATK_ENRAGE] && !SpecAttacks[SPECATK_INFURIATE])
return;
// check if timer exists (should be true at all times)
if (SpecAttackTimers[SPECATK_ENRAGE])
@ -1870,16 +1870,25 @@ void Mob::StartEnrage()
}
// start the timer. need to call IsEnraged frequently since we dont have callback timers :-/
SpecAttackTimers[SPECATK_ENRAGE]->Start();
bEnraged = true;
entity_list.MessageClose_StringID(this, true, 200, MT_NPCEnrage, NPC_ENRAGE_START, GetCleanName());
if (SpecAttacks[SPECATK_ENRAGE]) {
bEnraged = true;
entity_list.MessageClose_StringID(this, true, 200, MT_NPCEnrage, NPC_ENRAGE_START, GetCleanName());
} else if (SpecAttacks[SPECATK_INFURIATE]) {
bInfuriated = true;
entity_list.MessageClose(this, true, 200, MT_NPCEnrage, "%1 is infuriated.", GetCleanName());
}
}
void Mob::ProcessEnrage(){
if(IsEnraged()){
if(IsEnraged() || IsInfuriated()){
if(SpecAttackTimers[SPECATK_ENRAGE] && SpecAttackTimers[SPECATK_ENRAGE]->Check()){
entity_list.MessageClose_StringID(this, true, 200, MT_NPCEnrage, NPC_ENRAGE_END, GetCleanName());
SpecAttackTimers[SPECATK_ENRAGE]->Start(EnragedTimer);
bEnraged = false;
if(IsEnraged()) {
entity_list.MessageClose_StringID(this, true, 200, MT_NPCEnrage, NPC_ENRAGE_END, GetCleanName());
bEnraged = false;
} else if(IsInfuriated()) {
entity_list.MessageClose(this, true, 200, MT_NPCEnrage,"%1 is no longer infuriated.", GetCleanName());
bInfuriated = false; }
}
}
}
@ -1889,6 +1898,11 @@ bool Mob::IsEnraged()
return bEnraged;
}
bool Mob::IsInfuriated()
{
return bInfuriated;
}
bool Mob::Flurry()
{
// this is wrong, flurry is extra attacks on the current target

View File

@ -380,6 +380,10 @@ bool Mob::AvoidDamage(Mob* other, int32 &damage, bool CanRiposte)
damage = -3;
mlog(COMBAT__DAMAGE, "I am enraged, riposting frontal attack.");
}
if (IsInfuriated()) {
damage = -3;
mlog(COMBAT__DAMAGE, "I am infuriated, riposting attacks from all sides.");
}
/////////////////////////////////////////////////////////
// riposte

View File

@ -3755,6 +3755,9 @@ void Bot::AI_Process() {
// Stop attacking if the target is enraged
if(IsEngaged() && !BehindMob(GetTarget(), GetX(), GetY()) && GetTarget()->IsEnraged())
return;
// Stop attacking if the target is infuriated
if(IsEngaged() && GetTarget()->IsInfuriated())
return;
if(GetBotStance() == BotStancePassive)
return;
@ -4083,6 +4086,9 @@ void Bot::PetAIProcess() {
// Stop attacking while we are on a front arc and the target is enraged
if(!botPet->BehindMob(botPet->GetTarget(), botPet->GetX(), botPet->GetY()) && botPet->GetTarget()->IsEnraged())
return;
// Stop attacking while the target is infuriated
if(botPet->GetTarget()->IsInfuriated())
return;
if(botPet->Attack(GetTarget(), SLOT_PRIMARY)) // try the main hand
if (botPet->GetTarget()) // Do we still have a target?

View File

@ -84,11 +84,11 @@ typedef enum { //focus types
/*
Used:
b,d,f,g,j,m,n,o,p,r,t
b,d,e,f,g,j,m,n,o,p,r,t
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,Q,R,S,T,U,W,Y
Unused:
a,c,e,h,k,l,q,s,u,v,w,x,y,z
a,c,h,k,l,q,s,u,v,w,x,y,z
P,V,X
*/
@ -96,6 +96,7 @@ enum {
SPECATK_NONE = 0,
SPECATK_SUMMON, // S
SPECATK_ENRAGE, // E
SPECATK_INFURIATE, // e
SPECATK_RAMPAGE, // R
SPECATK_AREA_RAMPAGE, // r
SPECATK_FLURRY, // F

View File

@ -1722,6 +1722,9 @@ void Merc::AI_Process() {
// Stop attacking if the target is enraged
if(IsEngaged() && !BehindMob(GetTarget(), GetX(), GetY()) && GetTarget()->IsEnraged())
return;
// stop attacking if the target is infuriated
if(IsEngaged() && GetTarget()->IsInfuriated())
return;
//TODO: Implement Stances.
/*if(GetBotStance() == BotStancePassive)
return;*/

View File

@ -646,6 +646,7 @@ public:
void StartEnrage();
void ProcessEnrage();
bool IsEnraged();
bool IsInfuriated();
void Taunt(NPC* who, bool always_succeed, float chance_bonus = 0);
virtual void AI_Init();
@ -916,6 +917,7 @@ protected:
char lastname[64];
bool bEnraged;
bool bInfuriated;
Timer *SpecAttackTimers[SPECATK_MAXNUM];
bool destructibleobject;

View File

@ -1445,6 +1445,9 @@ void Mob::NPCSpecialAttacks(const char* parse, int permtag, bool reset, bool rem
case 'E':
SpecAttacks[SPECATK_ENRAGE] = (remove ? false : true);
break;
case 'e':
SpecAttacks[SPECATK_INFURIATE] = (remove ? false : true);
break;
case 'F':
SpecAttacks[SPECATK_FLURRY] = (remove ? false : true);
break;
@ -1590,6 +1593,10 @@ bool Mob::HasNPCSpecialAtk(const char* parse) {
if (!SpecAttacks[SPECATK_ENRAGE])
HasAllAttacks = false;
break;
case 'e':
if (!SpecAttacks[SPECATK_INFURIATE])
HasAllAttacks = false;
break;
case 'F':
if (!SpecAttacks[SPECATK_FLURRY])
HasAllAttacks = false;

View File

@ -4990,6 +4990,32 @@ XS(XS_Mob_IsEnraged)
XSRETURN(1);
}
XS(XS_Mob_IsInfuriated); /* prototype to pass -Wmissing-prototypes */
XS(XS_Mob_IsInfuriated)
{
dXSARGS;
if (items != 1)
Perl_croak(aTHX_ "Usage: Mob::IsInfuriated(THIS)");
{
Mob * THIS;
bool RETVAL;
if (sv_derived_from(ST(0), "Mob")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(Mob *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type Mob");
if(THIS == NULL)
Perl_croak(aTHX_ "THIS is NULL, avoiding crash.");
RETVAL = THIS->IsInfuriated();
ST(0) = boolSV(RETVAL);
sv_2mortal(ST(0));
}
XSRETURN(1);
}
XS(XS_Mob_GetReverseFactionCon); /* prototype to pass -Wmissing-prototypes */
XS(XS_Mob_GetReverseFactionCon)
{
@ -8247,6 +8273,7 @@ XS(boot_Mob)
newXSproto(strcpy(buf, "IsStunned"), XS_Mob_IsStunned, file, "$");
newXSproto(strcpy(buf, "StartEnrage"), XS_Mob_StartEnrage, file, "$");
newXSproto(strcpy(buf, "IsEnraged"), XS_Mob_IsEnraged, file, "$");
newXSproto(strcpy(buf, "IsInfuriated"), XS_Mob_IsInfuriated, file, "$");
newXSproto(strcpy(buf, "GetReverseFactionCon"), XS_Mob_GetReverseFactionCon, file, "$$");
newXSproto(strcpy(buf, "IsAIControlled"), XS_Mob_IsAIControlled, file, "$");
newXSproto(strcpy(buf, "GetAggroRange"), XS_Mob_GetAggroRange, file, "$");