86 lines
5.5 KiB
C++
86 lines
5.5 KiB
C++
#ifndef VCORE_ADVENTURE_ROTATION_POLICY_H
|
|
#define VCORE_ADVENTURE_ROTATION_POLICY_H
|
|
#include <vector>
|
|
#include <cstdint>
|
|
namespace AdventureRotationPolicy
|
|
{
|
|
enum class Condition { Always, MissingAura, Execute, Injured, Emergency, Resource, LowResource, Interrupt };
|
|
struct Action { uint32_t Spell; Condition When = Condition::Always; bool Self = false; uint32_t Aura = 0; unsigned Combo = 0; uint32_t Proc = 0; };
|
|
// Stable, shared PvE priorities. Native spell validation handles level,
|
|
// resources, procs, cooldowns and learned ranks; no random action selection.
|
|
inline unsigned SoloSpec(unsigned klass, uint32_t seed)
|
|
{
|
|
switch (klass)
|
|
{
|
|
case 1: case 4: case 7: case 8: case 11: return seed % 2;
|
|
case 3: case 6: return 1 + seed % 2;
|
|
case 2: case 5: return 2;
|
|
case 9: return seed % 3;
|
|
default: return 0;
|
|
}
|
|
}
|
|
inline bool Ranged(unsigned klass, unsigned spec)
|
|
{ return klass==3 || klass==5 || klass==8 || klass==9 || (klass==7 && spec!=1) || (klass==11 && spec!=1); }
|
|
inline std::vector<Action> Damage(unsigned klass, unsigned spec)
|
|
{
|
|
using C=Condition;
|
|
switch (klass)
|
|
{
|
|
case 1:
|
|
if(spec==2)return {{71,C::MissingAura,true},{871,C::Emergency,true},{12975,C::Emergency,true},{2565,C::Injured,true},{23922},{6572},{772,C::MissingAura},{20243},{78,C::Resource}};
|
|
if(spec==1)return {{2458,C::MissingAura,true},{23881},{85288},{5308,C::Execute},{86346},{1464,C::Always,false,0,0,46916},{78,C::Resource}};
|
|
return {{2457,C::MissingAura,true},{772,C::MissingAura},{12294},{86346},{7384},{5308,C::Execute},{1464},{78,C::Resource}};
|
|
case 2:
|
|
if(spec==0)return {{20271},{879},{35395}};
|
|
if(spec==1)return {{25780,C::MissingAura,true},{498,C::Injured,true},{31850,C::Emergency,true},{31935},{53600},{35395},{20271},{24275,C::Execute}};
|
|
return {{85256},{35395},{24275,C::Execute},{20271},{879}};
|
|
case 3:
|
|
if(spec==2)return {{1978,C::MissingAura},{53301},{3674},{53351,C::Execute},{77767},{3044}};
|
|
return {{1978,C::MissingAura},{53209},{53351,C::Execute},{19434},{56641},{3044}};
|
|
case 4:
|
|
if(spec==0)return {{5171,C::MissingAura,true,0,3},{1943,C::MissingAura,false,0,1},{32645,C::Always,false,0,5},{2098,C::Always,false,0,5},{1329},{1752}};
|
|
return {{5171,C::MissingAura,true,0,3},{1943,C::MissingAura,false,0,5},{2098,C::Always,false,0,5},{84617},{1752}};
|
|
case 5:
|
|
if(spec!=2)return {{585}};
|
|
return {{15473,C::MissingAura,true},{34914,C::MissingAura},{589,C::MissingAura},{2944,C::MissingAura},{8092},{32379,C::Execute},{15407},{585}};
|
|
case 6:
|
|
if(spec==0)return {{48263,C::MissingAura,true},{48792,C::Emergency,true},{45462,C::MissingAura,false,55078},{45477,C::MissingAura,false,55095},{49998},{55050},{47541}};
|
|
if(spec==1)return {{48265,C::MissingAura,true},{45477,C::MissingAura,false,55095},{45462,C::MissingAura,false,55078},{49020},{49143},{49184},{47541}};
|
|
return {{48265,C::MissingAura,true},{45477,C::MissingAura,false,55095},{45462,C::MissingAura,false,55078},{55090},{85948},{47541}};
|
|
case 7:
|
|
if(spec==2)return {{403}};
|
|
if(spec==1)return {{17364},{60103},{8050,C::MissingAura},{8042},{73899},{403}};
|
|
return {{324,C::MissingAura,true},{8050,C::MissingAura},{51505},{8042},{403}};
|
|
case 8:
|
|
if(spec==1)return {{30482,C::MissingAura,true},{44457,C::MissingAura},{11366,C::Always,false,0,0,48108},{2136},{133}};
|
|
return {{6117,C::MissingAura,true},{12042,C::Resource,true},{30451},{5143,C::Always,false,0,0,79808},{44425}};
|
|
case 9:
|
|
if(spec==1)return {{28176,C::MissingAura,true},{348,C::MissingAura},{172,C::MissingAura},{603,C::MissingAura},{71521},{29722},{686}};
|
|
if(spec==2)return {{28176,C::MissingAura,true},{348,C::MissingAura},{17962},{50796},{29722},{17877,C::Execute}};
|
|
return {{28176,C::MissingAura,true},{172,C::MissingAura},{30108,C::MissingAura},{980,C::MissingAura},{48181},{1120,C::Execute},{686}};
|
|
case 11:
|
|
if(spec==2)return {{5176}};
|
|
if(spec==1)return {{768,C::MissingAura,true},{5217,C::LowResource,true},{52610,C::MissingAura,true,0,3},{33876,C::MissingAura},{1079,C::MissingAura,false,0,5},{1822,C::MissingAura},{22568,C::Always,false,0,5},{5221},{33876},{1082}};
|
|
return {{24858,C::MissingAura,true},{8921,C::MissingAura},{5570,C::MissingAura},{78674},{2912},{5176}};
|
|
default:return {};
|
|
}
|
|
}
|
|
inline std::vector<Action> Healing(unsigned klass, unsigned spec, float hp)
|
|
{
|
|
using C=Condition;
|
|
switch(klass)
|
|
{
|
|
case 2: if(hp<30)return {{633},{20473},{19750},{82326},{635}}; return {{20473},{82326},{635},{19750}};
|
|
case 5:
|
|
if(spec==0 && hp<40)return {{33206},{17,C::MissingAura},{47540},{2061},{2060}};
|
|
if(hp<35)return {{47788},{2061},{2050}};
|
|
if(hp<70)return {{33076,C::MissingAura},{47540},{2060},{2050}};
|
|
return {{139,C::MissingAura},{2050},{2061}};
|
|
case 7: if(hp<35)return {{61295},{8004},{77472},{331}}; return {{61295,C::MissingAura},{77472},{331}};
|
|
case 11: if(hp<35)return {{18562},{8936},{5185}}; return {{33763,C::MissingAura},{774,C::MissingAura},{50464},{5185}};
|
|
default:return {};
|
|
}
|
|
}
|
|
}
|
|
#endif
|