From 3d1dc6314df3444d090f645a5fdcdcbecf64a1ee Mon Sep 17 00:00:00 2001 From: KimLS Date: Sun, 7 Jun 2015 19:42:12 -0700 Subject: [PATCH 01/90] New style AA data loading, still rudimentary --- zone/CMakeLists.txt | 1 + zone/aa.cpp | 126 +++++++++++++++++++++++++++++++++++++++++ zone/aa_ability.h | 45 +++++++++++++++ zone/aa_rank.h | 44 ++++++++++++++ zone/aa_rank_effects.h | 37 ++++++++++++ zone/aa_rank_prereqs.h | 33 +++++++++++ zone/client_packet.cpp | 2 + zone/entity.cpp | 1 - zone/net.cpp | 1 - zone/zone.cpp | 7 +-- zone/zone.h | 13 ++++- zone/zonedb.h | 7 ++- 12 files changed, 308 insertions(+), 9 deletions(-) create mode 100644 zone/aa_ability.h create mode 100644 zone/aa_rank.h create mode 100644 zone/aa_rank_effects.h create mode 100644 zone/aa_rank_prereqs.h diff --git a/zone/CMakeLists.txt b/zone/CMakeLists.txt index 2510dcddb..4340ff6da 100644 --- a/zone/CMakeLists.txt +++ b/zone/CMakeLists.txt @@ -125,6 +125,7 @@ SET(zone_sources SET(zone_headers aa.h + aa_ability.h basic_functions.h beacon.h bot.h diff --git a/zone/aa.cpp b/zone/aa.cpp index b6e220d60..c98e31372 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -2070,3 +2070,129 @@ Mob *AA_SwarmPetInfo::GetOwner() { return entity_list.GetMobID(owner_id); } + +//New AA +void Zone::LoadAlternateAdvancement() { + Log.Out(Logs::General, Logs::Status, "Loading Alternate Advancement Data..."); + if(!database.LoadAlternateAdvancementAbilities(zone->aa_abilities, + zone->aa_ranks)) + { + zone->aa_abilities.clear(); + zone->aa_ranks.clear(); + Log.Out(Logs::General, Logs::Status, "Failed to load Alternate Advancement Data"); + return; + } + + Log.Out(Logs::General, Logs::Status, "Loaded Alternate Advancement Data"); +} + +bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map> &abilities, + std::unordered_map> &ranks) +{ + Log.Out(Logs::General, Logs::Status, "Loading Alternate Advancement Abilities..."); + abilities.clear(); + std::string query = "SELECT id, name, expansion, category, classes, expendable, first_rank_id FROM aa_ability"; + auto results = QueryDatabase(query); + if(results.Success()) { + for(auto row = results.begin(); row != results.end(); ++row) { + AA::Ability *ability = new AA::Ability; + int id = atoi(row[0]); + + ability->name = row[1]; + ability->expansion = atoi(row[2]); + ability->category = atoi(row[3]); + ability->classes = atoi(row[4]); + ability->expendable = atoi(row[5]) != 0 ? true : false; + ability->first_rank_id = atoi(row[6]); + + abilities[id] = std::unique_ptr(ability); + } + } else { + Log.Out(Logs::General, Logs::Error, "Failed to load Alternate Advancement Abilities"); + return false; + } + + Log.Out(Logs::General, Logs::Status, "Loaded %d Alternate Advancement Abilities", (int)abilities.size()); + + Log.Out(Logs::General, Logs::Status, "Loading Alternate Advancement Ability Ranks..."); + ranks.clear(); + query = "SELECT id, upper_hotkey_sid, lower_hotkey_sid, title_sid, desc_sid, cost, level_req, spell, spell_type, recast_time, " + "prev_id, next_id FROM aa_ranks"; + results = QueryDatabase(query); + if(results.Success()) { + for(auto row = results.begin(); row != results.end(); ++row) { + AA::Rank *rank = new AA::Rank; + int id = atoi(row[0]); + rank->upper_hotkey_sid = atoi(row[1]); + rank->lower_hotkey_sid = atoi(row[2]); + rank->title_sid = atoi(row[3]); + rank->desc_sid = atoi(row[4]); + rank->cost = atoi(row[5]); + rank->level_req = atoi(row[6]); + rank->spell = atoi(row[7]); + rank->spell_type = atoi(row[8]); + rank->recast_time = atoi(row[9]); + rank->prev_id = atoi(row[10]); + rank->next_id = atoi(row[11]); + + ranks[id] = std::unique_ptr(rank); + } + } else { + Log.Out(Logs::General, Logs::Error, "Failed to load Alternate Advancement Ability Ranks"); + return false; + } + + Log.Out(Logs::General, Logs::Status, "Loaded %d Alternate Advancement Ability Ranks", (int)ranks.size()); + + Log.Out(Logs::General, Logs::Status, "Loading Alternate Advancement Ability Rank Effects..."); + query = "SELECT rank_id, slot, effect_id, base1, base2 FROM aa_rank_effects"; + results = QueryDatabase(query); + if(results.Success()) { + for(auto row = results.begin(); row != results.end(); ++row) { + AA::RankEffect effect; + int rank_id = atoi(row[0]); + int slot = atoi(row[1]); + effect.effect_id = atoi(row[2]); + effect.base1 = atoi(row[3]); + effect.base2 = atoi(row[4]); + + if(slot < 1 || slot > 12) + continue; + + if(ranks.count(rank_id) > 0) { + AA::Rank *rank = ranks[rank_id].get(); + rank->effects[slot] = effect; + } + } + } else { + Log.Out(Logs::General, Logs::Error, "Failed to load Alternate Advancement Ability Rank Effects"); + return false; + } + + Log.Out(Logs::General, Logs::Status, "Loaded Alternate Advancement Ability Rank Effects"); + + Log.Out(Logs::General, Logs::Status, "Loading Alternate Advancement Ability Rank Prereqs..."); + query = "SELECT rank_id, aa_id, points FROM aa_rank_prereqs"; + results = QueryDatabase(query); + if(results.Success()) { + for(auto row = results.begin(); row != results.end(); ++row) { + AA::RankPrereq prereq; + int rank_id = atoi(row[0]); + prereq.aa_id = atoi(row[1]); + prereq.points = atoi(row[1]); + + if(ranks.count(rank_id) > 0) { + AA::Rank *rank = ranks[rank_id].get(); + rank->prereqs.push_back(prereq); + } + } + } else { + Log.Out(Logs::General, Logs::Error, "Failed to load Alternate Advancement Ability Rank Prereqs"); + return false; + } + + Log.Out(Logs::General, Logs::Status, "Loaded Alternate Advancement Ability Rank Prereqs"); + + return true; +} + diff --git a/zone/aa_ability.h b/zone/aa_ability.h new file mode 100644 index 000000000..bb9148689 --- /dev/null +++ b/zone/aa_ability.h @@ -0,0 +1,45 @@ +/* EQEMu: Everquest Server Emulator + Copyright (C) 2001-2015 EQEMu Development Team (http://eqemulator.net) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY except by those people which sell it, which + are required to give you total support for your newly bought product; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef EQEMU_ZONE_AA_ABILITY_H +#define EQEMU_ZONE_AA_ABILITY_H + +#include "../common/global_define.h" +#include +#include +#include +#include "aa_rank_effects.h" +#include "aa_rank_prereqs.h" +#include "aa_rank.h" + +namespace AA +{ + +struct Ability +{ + std::string name; + int expansion; + int category; + int classes; + bool expendable; + int first_rank_id; +}; + +} + +#endif diff --git a/zone/aa_rank.h b/zone/aa_rank.h new file mode 100644 index 000000000..ec1cc4115 --- /dev/null +++ b/zone/aa_rank.h @@ -0,0 +1,44 @@ +/* EQEMu: Everquest Server Emulator + Copyright (C) 2001-2015 EQEMu Development Team (http://eqemulator.net) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY except by those people which sell it, which + are required to give you total support for your newly bought product; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef EQEMU_ZONE_AA_RANK_H +#define EQEMU_ZONE_AA_RANK_H + +namespace AA +{ + +struct Rank +{ + int upper_hotkey_sid; + int lower_hotkey_sid; + int title_sid; + int desc_sid; + int cost; + int level_req; + int spell; + int spell_type; + int recast_time; + int prev_id; + int next_id; + std::unordered_map effects; + std::vector prereqs; +}; + +} + +#endif diff --git a/zone/aa_rank_effects.h b/zone/aa_rank_effects.h new file mode 100644 index 000000000..fd65d507f --- /dev/null +++ b/zone/aa_rank_effects.h @@ -0,0 +1,37 @@ +/* EQEMu: Everquest Server Emulator + Copyright (C) 2001-2015 EQEMu Development Team (http://eqemulator.net) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY except by those people which sell it, which + are required to give you total support for your newly bought product; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef EQEMU_ZONE_AA_RANK_EFFECTS_H +#define EQEMU_ZONE_AA_RANK_EFFECTS_H + +#include "../common/global_define.h" +#include + +namespace AA +{ + +struct RankEffect +{ + int effect_id; + int base1; + int base2; +}; + +} + +#endif diff --git a/zone/aa_rank_prereqs.h b/zone/aa_rank_prereqs.h new file mode 100644 index 000000000..b1620be6c --- /dev/null +++ b/zone/aa_rank_prereqs.h @@ -0,0 +1,33 @@ +/* EQEMu: Everquest Server Emulator + Copyright (C) 2001-2015 EQEMu Development Team (http://eqemulator.net) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY except by those people which sell it, which + are required to give you total support for your newly bought product; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#ifndef EQEMU_ZONE_AA_RANK_PREREQS_H +#define EQEMU_ZONE_AA_RANK_PREREQS_H + +namespace AA +{ + +struct RankPrereq +{ + int aa_id; + int points; +}; + +} + +#endif diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 8a7b8a133..112e8f33f 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -1091,6 +1091,7 @@ void Client::Handle_Connect_OP_SendAAStats(const EQApplicationPacket *app) void Client::Handle_Connect_OP_SendAATable(const EQApplicationPacket *app) { + Log.Out(Logs::General, Logs::Error, "SendAAList()"); SendAAList(); return; } @@ -1152,6 +1153,7 @@ void Client::Handle_Connect_OP_TGB(const EQApplicationPacket *app) void Client::Handle_Connect_OP_UpdateAA(const EQApplicationPacket *app) { + Log.Out(Logs::General, Logs::Error, "SendAATable()"); SendAATable(); } diff --git a/zone/entity.cpp b/zone/entity.cpp index baa4f4354..a73b21f4d 100644 --- a/zone/entity.cpp +++ b/zone/entity.cpp @@ -58,7 +58,6 @@ extern uint32 numclients; extern PetitionList petition_list; extern char errorname[32]; -extern uint16 adverrornum; Entity::Entity() { diff --git a/zone/net.cpp b/zone/net.cpp index ef6b46836..0178eff21 100644 --- a/zone/net.cpp +++ b/zone/net.cpp @@ -96,7 +96,6 @@ EntityList entity_list; WorldServer worldserver; uint32 numclients = 0; char errorname[32]; -uint16 adverrornum = 0; extern Zone* zone; EQStreamFactory eqsf(ZoneStream); npcDecayTimes_Struct npcCorpseDecayTimes[100]; diff --git a/zone/zone.cpp b/zone/zone.cpp index e58bea24a..31bc27b41 100644 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -68,7 +68,6 @@ extern bool staticzone; extern NetConnection net; extern PetitionList petition_list; extern QuestParserCollection* parse; -extern uint16 adverrornum; extern uint32 numclients; extern WorldServer worldserver; extern Zone* zone; @@ -954,15 +953,14 @@ bool Zone::Init(bool iStaticZone) { zone->LoadNPCEmotes(&NPCEmoteList); //Load AA information - adverrornum = 500; LoadAAs(); + LoadAlternateAdvancement(); + //Load merchant data - adverrornum = 501; zone->GetMerchantDataForZoneLoad(); //Load temporary merchant data - adverrornum = 502; zone->LoadTempMerchantData(); // Merc data @@ -974,7 +972,6 @@ bool Zone::Init(bool iStaticZone) { if (RuleB(Zone, LevelBasedEXPMods)) zone->LoadLevelEXPMods(); - adverrornum = 503; petition_list.ClearPetitions(); petition_list.ReadDatabase(); diff --git a/zone/zone.h b/zone/zone.h index 7b1b855a7..274a1a021 100644 --- a/zone/zone.h +++ b/zone/zone.h @@ -27,6 +27,7 @@ #include "qglobals.h" #include "spawn2.h" #include "spawngroup.h" +#include "aa_ability.h" struct ZonePoint { @@ -113,12 +114,17 @@ public: inline const uint32& GetMaxClients() { return pMaxClients; } + //new AA + void LoadAlternateAdvancement(); + + //old AA void LoadAAs(); int GetTotalAAs() { return totalAAs; } SendAA_Struct* GetAABySequence(uint32 seq) { return aas[seq]; } SendAA_Struct* FindAA(uint32 id); uint8 GetTotalAALevels(uint32 skill_id); - void LoadZoneDoors(const char* zone, int16 version); + + void LoadZoneDoors(const char* zone, int16 version); bool LoadZoneObjects(); bool LoadGroundSpawns(); void ReloadStaticData(); @@ -313,6 +319,11 @@ private: int totalBS; ZoneSpellsBlocked *blocked_spells; + //new AA + std::unordered_map> aa_abilities; + std::unordered_map> aa_ranks; + + //old AA int totalAAs; SendAA_Struct **aas; //array of AA structs diff --git a/zone/zonedb.h b/zone/zonedb.h index cac380a96..dda01b7dc 100644 --- a/zone/zonedb.h +++ b/zone/zonedb.h @@ -6,6 +6,7 @@ #include "position.h" #include "../common/faction.h" #include "../common/eqemu_logsys.h" +#include "aa_ability.h" class Client; class Corpse; @@ -339,7 +340,11 @@ public: bool SetCharacterFactionLevel(uint32 char_id, int32 faction_id, int32 value, uint8 temp, faction_map &val_list); // needed for factions Dec, 16 2001 bool LoadFactionData(); - /* AAs */ + /* AAs New */ + bool LoadAlternateAdvancementAbilities(std::unordered_map> &abilities, + std::unordered_map> &ranks); + + /* AAs Old */ bool LoadAAEffects(); bool LoadAAEffects2(); bool LoadSwarmSpells(); From 3ee1c43ac401a612c9dae5f6b2d1bdc38f5dc0bc Mon Sep 17 00:00:00 2001 From: KimLS Date: Mon, 8 Jun 2015 09:53:21 -0700 Subject: [PATCH 02/90] Remove old aa list send for experiment also want to merge from master... --- common/eq_packet_structs.h | 45 ++++++++++++++++++++++++++++++++++++++ zone/aa.cpp | 8 +++---- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/common/eq_packet_structs.h b/common/eq_packet_structs.h index e5ab88e57..adfa3d9ee 100644 --- a/common/eq_packet_structs.h +++ b/common/eq_packet_structs.h @@ -4218,6 +4218,51 @@ struct UseAA_Struct { uint32 end; }; +//new AA stuff + +struct AARankInfo_Struct +{ + uint32 id; + int32 upper_hotkey_sid; + int32 lower_hotkey_sid; + int32 title_sid; + int32 desc_sid; + int32 level_req; + int32 cost; + uint32 seq; + uint32 current_level; + uint32 type; + int32 spell; + int32 spell_type; + int32 spell_refresh; + int32 classes; + int32 max_level; + int32 prev_id; + int32 next_id; + int32 total_cost; + int32 expansion; + int32 category; + uint8 expendable; + uint32 total_effects; + uint32 total_prereqs; +}; + +struct AARankPrereq_Struct +{ + int32 aa_id; + int32 points; +}; + +struct AARankEffect_Struct +{ + int32 effect_id; + int32 base1; + int32 base2; + int32 slot; +}; + +//old AA stuff + struct AA_Ability { /*00*/ uint32 skill_id; /*04*/ uint32 base1; diff --git a/zone/aa.cpp b/zone/aa.cpp index c98e31372..1a8b5f5c5 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1377,10 +1377,10 @@ void Client::SendAA(uint32 id, int seq) { } void Client::SendAAList(){ - int total = zone->GetTotalAAs(); - for(int i=0;i < total;i++){ - SendAA(0,i); - } +// int total = zone->GetTotalAAs(); +// for(int i=0;i < total;i++){ +// SendAA(0,i); +// } } uint32 Client::GetAA(uint32 aa_id) const { From 250d0cc9036475d1622893c27321f649b443c69e Mon Sep 17 00:00:00 2001 From: KimLS Date: Mon, 8 Jun 2015 20:06:14 -0700 Subject: [PATCH 03/90] More aa work, it actually loads yay --- common/eq_packet_structs.h | 3 +- common/patches/uf.cpp | 71 +++++++- common/patches/uf_structs.h | 3 +- zone/CMakeLists.txt | 1 + zone/aa.cpp | 315 +++++++++++++++++++++++++++++++++--- zone/aa_ability.cpp | 69 ++++++++ zone/aa_ability.h | 15 +- zone/aa_rank.h | 12 +- zone/client.h | 6 +- zone/client_packet.cpp | 7 +- zone/zone.h | 5 + 11 files changed, 469 insertions(+), 38 deletions(-) create mode 100644 zone/aa_ability.cpp diff --git a/common/eq_packet_structs.h b/common/eq_packet_structs.h index da965f4ba..d2d9ae8b3 100644 --- a/common/eq_packet_structs.h +++ b/common/eq_packet_structs.h @@ -4220,7 +4220,7 @@ struct UseAA_Struct { }; //new AA stuff - +//reference only struct AARankInfo_Struct { uint32 id; @@ -4244,6 +4244,7 @@ struct AARankInfo_Struct int32 expansion; int32 category; uint8 expendable; + uint8 grant_only; uint32 total_effects; uint32 total_prereqs; }; diff --git a/common/patches/uf.cpp b/common/patches/uf.cpp index deedcec5f..bbe0c0f0d 100644 --- a/common/patches/uf.cpp +++ b/common/patches/uf.cpp @@ -1804,11 +1804,11 @@ namespace UF // OUT(unknown00224[48]); //NOTE: new client supports 300 AAs, our internal rep/PP //only supports 240.. - for (r = 0; r < MAX_PP_AA_ARRAY; r++) { - OUT(aa_array[r].AA); - OUT(aa_array[r].value); - OUT(aa_array[r].charges); - } + //for (r = 0; r < MAX_PP_AA_ARRAY; r++) { + // OUT(aa_array[r].AA); + // OUT(aa_array[r].value); + // OUT(aa_array[r].charges); + //} // OUT(unknown02220[4]); OUT(mana); OUT(cur_hp); @@ -2145,13 +2145,66 @@ namespace UF ENCODE(OP_SendAATable) { +#if 1 + EQApplicationPacket *inapp = *p; + *p = nullptr; + AARankInfo_Struct *emu = (AARankInfo_Struct*)inapp->pBuffer; + + EQApplicationPacket *outapp = new EQApplicationPacket(OP_SendAATable, sizeof(structs::SendAA_Struct) + emu->total_effects * sizeof(structs::AA_Ability)); + structs::SendAA_Struct *eq = (structs::SendAA_Struct*)outapp->pBuffer; + + inapp->SetReadPosition(sizeof(AARankInfo_Struct)); + outapp->SetWritePosition(sizeof(structs::SendAA_Struct)); + + eq->id = emu->id; + eq->unknown004 = 1; + eq->id = emu->id; + eq->hotkey_sid = emu->upper_hotkey_sid; + eq->hotkey_sid2 = emu->lower_hotkey_sid; + eq->desc_sid = emu->desc_sid; + eq->title_sid = emu->title_sid; + eq->class_type = emu->level_req; + eq->cost = emu->cost; + eq->seq = emu->seq; + eq->current_level = emu->current_level; + eq->type = emu->type; + eq->spellid = emu->spell; + eq->spell_type = emu->spell_type; + eq->spell_refresh = emu->spell_refresh; + eq->classes = emu->classes; + eq->max_level = emu->max_level; + eq->last_id = emu->prev_id; + eq->next_id = emu->next_id; + eq->cost2 = emu->total_cost; + eq->grant_only = emu->grant_only > 0 ? true : false; + eq->expendable_charges = emu->expendable ? 1 : 0; + eq->aa_expansion = emu->expansion; + eq->special_category = emu->category; + eq->total_abilities = emu->total_effects; + + for(auto i = 0; i < eq->total_abilities; ++i) { + eq->abilities[i].skill_id = inapp->ReadUInt32(); + eq->abilities[i].base1 = inapp->ReadUInt32(); + eq->abilities[i].base2 = inapp->ReadUInt32(); + eq->abilities[i].slot = inapp->ReadUInt32(); + } + + if(emu->total_prereqs > 0) { + eq->prereq_skill = -(int)inapp->ReadUInt32(); + eq->prereq_minpoints = inapp->ReadUInt32(); + } + + Log.Out(Logs::General, Logs::Status, "%s", DumpPacketToString(outapp).c_str()); + dest->FastQueuePacket(&outapp); + delete inapp; +#else ENCODE_LENGTH_ATLEAST(SendAA_Struct); SETUP_VAR_ENCODE(SendAA_Struct); ALLOC_VAR_ENCODE(structs::SendAA_Struct, sizeof(structs::SendAA_Struct) + emu->total_abilities*sizeof(structs::AA_Ability)); // Check clientver field to verify this AA should be sent for SoF // clientver 1 is for all clients and 6 is for Underfoot - if (emu->clientver <= 6) + if(emu->clientver <= 6) { OUT(id); eq->unknown004 = 1; @@ -2174,7 +2227,7 @@ namespace UF OUT(spell_type); OUT(spell_refresh); OUT(classes); - OUT(berserker); + //OUT(berserker); //eq->max_level = emu->sof_max_level; OUT(max_level); OUT(last_id); @@ -2185,7 +2238,7 @@ namespace UF eq->expendable_charges = emu->special_category == 7 ? 1 : 0; // temp hack, this can actually be any number OUT(total_abilities); unsigned int r; - for (r = 0; r < emu->total_abilities; r++) { + for(r = 0; r < emu->total_abilities; r++) { OUT(abilities[r].skill_id); OUT(abilities[r].base1); OUT(abilities[r].base2); @@ -2193,7 +2246,9 @@ namespace UF } } + Log.Out(Logs::General, Logs::Status, "%s", DumpPacketToString(__packet).c_str()); FINISH_ENCODE(); +#endif } ENCODE(OP_SendCharInfo) diff --git a/common/patches/uf_structs.h b/common/patches/uf_structs.h index c943c6ea5..36d6dea74 100644 --- a/common/patches/uf_structs.h +++ b/common/patches/uf_structs.h @@ -3886,8 +3886,7 @@ struct SendAA_Struct { /*0049*/ uint32 spellid; /*0053*/ uint32 spell_type; /*0057*/ uint32 spell_refresh; -/*0061*/ uint16 classes; -/*0063*/ uint16 berserker; //seems to be 1 if its a berserker ability +/*0061*/ uint32 classes; /*0065*/ uint32 max_level; /*0069*/ uint32 last_id; /*0073*/ uint32 next_id; diff --git a/zone/CMakeLists.txt b/zone/CMakeLists.txt index a68945155..ba9aa8620 100644 --- a/zone/CMakeLists.txt +++ b/zone/CMakeLists.txt @@ -2,6 +2,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) SET(zone_sources aa.cpp + aa_ability.cpp aggro.cpp attack.cpp beacon.cpp diff --git a/zone/aa.cpp b/zone/aa.cpp index edca1ebdb..88e2a2e56 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1097,22 +1097,24 @@ void Client::SendAATimers() { } void Client::SendAATable() { + Log.Out(Logs::General, Logs::Status, "SendAATable()"); EQApplicationPacket* outapp = new EQApplicationPacket(OP_RespondAA, sizeof(AATable_Struct)); AATable_Struct* aa2 = (AATable_Struct *)outapp->pBuffer; - aa2->aa_spent = GetAAPointsSpent(); - - uint32 i; - for(i=0;i < MAX_PP_AA_ARRAY;i++){ - aa2->aa_list[i].AA = aa[i]->value ? aa[i]->AA : 0; // bit of a hack to prevent expendables punching a hole - aa2->aa_list[i].value = aa[i]->value; - aa2->aa_list[i].charges = aa[i]->charges; - } + //aa2->aa_spent = GetAAPointsSpent(); + // + //uint32 i; + //for(i=0;i < MAX_PP_AA_ARRAY;i++){ + // aa2->aa_list[i].AA = aa[i]->value ? aa[i]->AA : 0; // bit of a hack to prevent expendables punching a hole + // aa2->aa_list[i].value = aa[i]->value; + // aa2->aa_list[i].charges = aa[i]->charges; + //} QueuePacket(outapp); safe_delete(outapp); } void Client::SendPreviousAA(uint32 id, int seq){ + Log.Out(Logs::General, Logs::Status, "SendPreviousAA(%u, %i)", id, seq); uint32 value=0; SendAA_Struct* saa2 = nullptr; if(id==0) @@ -1148,11 +1150,13 @@ void Client::SendPreviousAA(uint32 id, int seq){ } database.FillAAEffects(saa); + Log.Out(Logs::General, Logs::Status, "%s", DumpPacketToString(outapp).c_str()); QueuePacket(outapp); safe_delete(outapp); } void Client::SendAA(uint32 id, int seq) { + Log.Out(Logs::General, Logs::Status, "SendAA(%u, %i)", id, seq); uint32 value=0; SendAA_Struct* saa2 = nullptr; @@ -1368,6 +1372,7 @@ void Client::SendAA(uint32 id, int seq) { EQApplicationPacket* outapp = new EQApplicationPacket(OP_SendAATable); outapp->size=size; outapp->pBuffer=(uchar*)saa; + if(id==0 && value && (orig_val < saa->max_level)) //send previous AA only on zone in SendPreviousAA(id, seq); @@ -1377,10 +1382,13 @@ void Client::SendAA(uint32 id, int seq) { } void Client::SendAAList(){ -// int total = zone->GetTotalAAs(); -// for(int i=0;i < total;i++){ -// SendAA(0,i); -// } + Log.Out(Logs::General, Logs::Status, "SendAAList()"); + int total = zone->GetTotalAAs(); + + total = total > 2 ? 2 : total; + for(int i=0;i < total;i++){ + SendAA(0,i); + } } uint32 Client::GetAA(uint32 aa_id) const { @@ -2080,39 +2088,300 @@ Mob *AA_SwarmPetInfo::GetOwner() return entity_list.GetMobID(owner_id); } +void Client::SendAlternateAdvancementList() { + for(auto &aa : zone->aa_abilities) { + SendAlternateAdvancement(aa.first, true); + } +} + //New AA +void Client::SendAlternateAdvancement(int aa_id, bool first_login) { + if(!zone) + return; + + AA::Ability *ability = zone->GetAlternateAdvancementAbility(aa_id); + + if(!ability) + return; + + if(!(ability->classes & (1 << GetClass()))) { + return; + } + + if(ability->account_time_required) { + if((Timer::GetTimeSeconds() - account_creation) < ability->account_time_required) + { + return; + } + } + + // Hide Quest/Progression AAs unless player has been granted the first level using $client->IncrementAA(skill_id). + if(ability->category == 1 || ability->category == 2) { + //if(GetAA(saa2->id) == 0) + // return; + + if(ability->expansion > 0) { + AA::Ability *qaa = zone->GetAlternateAdvancementAbility(aa_id + 1); + //if(qaa && qaa->expansion == ability->expansion && GetAA(aa_id) > 0) { + // return; + //} + } + } + + // Passive and Active Shroud AAs + // For now we skip them + if(ability->category == 3 || ability->category == 4) { + return; + } + + // Check for racial/Drakkin blood line AAs + if(ability->category == 8) + { + uint32 client_race = GetBaseRace(); + + // Drakkin Bloodlines + if(ability->expansion > 522) + { + if(client_race != 522) + return; + + int heritage = this->GetDrakkinHeritage() + 523; // 523 = Drakkin Race(522) + Bloodline + + if(heritage != ability->expansion) + return; + } + else if(client_race != ability->expansion) + { + return; + } + } + + //Send first rank + AA::Rank *rank = ability->first; + if(!rank) + return; + + //Should move this to another function + int size = sizeof(AARankInfo_Struct)+(sizeof(AARankEffect_Struct)* rank->effects.size()) + (sizeof(AARankPrereq_Struct)* rank->prereqs.size()); + EQApplicationPacket *outapp = new EQApplicationPacket(OP_SendAATable, size); + AARankInfo_Struct *aai = (AARankInfo_Struct*)outapp->pBuffer; + + aai->id = rank->id; + aai->upper_hotkey_sid = rank->upper_hotkey_sid; + aai->lower_hotkey_sid = rank->lower_hotkey_sid; + aai->title_sid = rank->title_sid; + aai->desc_sid = rank->desc_sid; + aai->level_req = rank->level_req; + aai->cost = rank->cost; + aai->seq = aa_id; + aai->current_level = 1; + aai->type = ability->type; + aai->spell = rank->spell; + aai->spell_type = rank->spell_type; + aai->spell_refresh = rank->recast_time; + aai->classes = ability->classes; + aai->max_level = ability->GetMaxLevel(); + aai->prev_id = rank->prev_id; + aai->next_id = rank->next_id; + aai->total_cost = rank->total_cost; + aai->expansion = ability->expansion; + aai->category = ability->category; + aai->expendable = ability->expendable; + aai->grant_only = ability->grant_only; + aai->total_effects = rank->effects.size(); + aai->total_prereqs = rank->prereqs.size(); + + outapp->SetWritePosition(sizeof(AARankInfo_Struct)); + for(auto effect : rank->effects) { + outapp->WriteSInt32(effect.second.effect_id); + outapp->WriteSInt32(effect.second.base1); + outapp->WriteSInt32(effect.second.base2); + outapp->WriteSInt32(effect.first); + } + + for(auto prereq : rank->prereqs) { + outapp->WriteSInt32(prereq.aa_id); + outapp->WriteSInt32(prereq.points); + } + + //if first_login then also send current rank if not maxed + + QueuePacket(outapp); + safe_delete(outapp); + + // + //if(size == 0) + // return; + // + //uchar* buffer = new uchar[size]; + //SendAA_Struct* saa = (SendAA_Struct*)buffer; + //memcpy(saa, saa2, size); + // + //if(saa->spellid == 0) + // saa->spellid = 0xFFFFFFFF; + // + //value = GetAA(saa->id); + //uint32 orig_val = value; + // + //if(value && saa->id){ + // + // if(value < saa->max_level){ + // saa->id += value; + // saa->next_id = saa->id + 1; + // value++; + // } + // + // else if(aa_stack && saa->sof_next_id){ + // saa->id += value - 1; + // saa->next_id = saa->sof_next_id; + // + // //Prevent removal of previous AA from window if next AA belongs to a higher client version. + // SendAA_Struct* saa_next = nullptr; + // saa_next = zone->FindAA(saa->sof_next_id); + // + // // this check should work as long as we continue to just add the clients and just increase + // // each number .... + // if(saa_next && static_cast(GetClientVersion()) < saa_next->clientver - 1) { + // saa->next_id = 0xFFFFFFFF; + // } + // } + // + // else{ + // saa->id += value - 1; + // saa->next_id = 0xFFFFFFFF; + // } + // + // uint32 current_level_mod = 0; + // if(aa_stack) + // current_level_mod = saa->sof_current_level; + // + // saa->last_id = saa->id - 1; + // saa->current_level = value + (current_level_mod); + // saa->cost = saa2->cost + (saa2->cost_inc*(value - 1)); + // saa->cost2 = 0; + // for(uint32 i = 0; i < value; i++) { + // saa->cost2 += saa2->cost + (saa2->cost_inc * i); + // } + // saa->class_type = saa2->class_type + (saa2->level_inc*(value - 1)); + //} + // + //if(aa_stack){ + // + // if(saa->sof_current_level >= 1 && value == 0) + // saa->current_level = saa->sof_current_level + 1; + // + // saa->max_level = saa->sof_max_level; + //} + // + //database.FillAAEffects(saa); + // + //if(value > 0) + //{ + // // AA_Action stores the base ID + // const AA_DBAction *caa = &AA_Actions[saa->id - value + 1][value - 1]; + // + // if(caa && caa->reuse_time > 0) + // saa->spell_refresh = CalcAAReuseTimer(caa); + //} + // + ////You can now use the level_inc field in the altadv_vars table to accomplish this, though still needed + ////for special cases like LOH/HT due to inability to implement correct stacking of AA's that use hotkeys. + //std::map::iterator RequiredLevel = AARequiredLevelAndCost.find(saa->id); + // + //if(RequiredLevel != AARequiredLevelAndCost.end()) + //{ + // saa->class_type = RequiredLevel->second.Level; + // saa->cost = RequiredLevel->second.Cost; + //} + // + // + //EQApplicationPacket* outapp = new EQApplicationPacket(OP_SendAATable); + //outapp->size = size; + //outapp->pBuffer = (uchar*)saa; + //if(id == 0 && value && (orig_val < saa->max_level)) //send previous AA only on zone in + // SendPreviousAA(id, seq); + // + //QueuePacket(outapp); + //safe_delete(outapp); + ////will outapp delete the buffer for us even though it didnt make it? --- Yes, it should +} + void Zone::LoadAlternateAdvancement() { Log.Out(Logs::General, Logs::Status, "Loading Alternate Advancement Data..."); - if(!database.LoadAlternateAdvancementAbilities(zone->aa_abilities, - zone->aa_ranks)) + if(!database.LoadAlternateAdvancementAbilities(aa_abilities, + aa_ranks)) { - zone->aa_abilities.clear(); - zone->aa_ranks.clear(); + aa_abilities.clear(); + aa_ranks.clear(); Log.Out(Logs::General, Logs::Status, "Failed to load Alternate Advancement Data"); return; } + Log.Out(Logs::General, Logs::Status, "Processing Alternate Advancement Data..."); + for(const auto &ability : aa_abilities) { + ability.second->first = GetAlternateAdvancementRank(ability.second->first_rank_id); + + //process these ranks + AA::Rank *current = ability.second->first; + while(current) { + current->prev = GetAlternateAdvancementRank(current->prev_id); + current->next = GetAlternateAdvancementRank(current->next_id); + current->base_ability = ability.second.get(); + + if(current->prev) { + current->total_cost = current->cost + current->prev->total_cost; + } else { + current->total_cost = current->cost; + } + + current = current->next; + } + + ability.second->GetMaxLevel(true); + } + Log.Out(Logs::General, Logs::Status, "Loaded Alternate Advancement Data"); } +AA::Ability *Zone::GetAlternateAdvancementAbility(int id) { + auto iter = aa_abilities.find(id); + if(iter != aa_abilities.end()) { + return iter->second.get(); + } + + return nullptr; +} + +AA::Rank *Zone::GetAlternateAdvancementRank(int rank_id) { + auto iter = aa_ranks.find(rank_id); + if(iter != aa_ranks.end()) { + return iter->second.get(); + } + + return nullptr; +} + bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map> &abilities, std::unordered_map> &ranks) { Log.Out(Logs::General, Logs::Status, "Loading Alternate Advancement Abilities..."); abilities.clear(); - std::string query = "SELECT id, name, expansion, category, classes, expendable, first_rank_id FROM aa_ability"; + std::string query = "SELECT id, name, expansion, category, classes, type, expendable, account_time_required, grant_only, first_rank_id FROM aa_ability"; auto results = QueryDatabase(query); if(results.Success()) { for(auto row = results.begin(); row != results.end(); ++row) { AA::Ability *ability = new AA::Ability; int id = atoi(row[0]); - ability->name = row[1]; ability->expansion = atoi(row[2]); ability->category = atoi(row[3]); ability->classes = atoi(row[4]); - ability->expendable = atoi(row[5]) != 0 ? true : false; - ability->first_rank_id = atoi(row[6]); + ability->type = atoi(row[5]); + ability->expendable = atoi(row[6]) != 0 ? true : false; + ability->account_time_required = atoul(row[7]); + ability->grant_only = atoi(row[8]) != 0 ? true : false; + ability->first_rank_id = atoi(row[9]); + ability->first = nullptr; abilities[id] = std::unique_ptr(ability); } @@ -2132,6 +2401,7 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_mapid = id; rank->upper_hotkey_sid = atoi(row[1]); rank->lower_hotkey_sid = atoi(row[2]); rank->title_sid = atoi(row[3]); @@ -2143,6 +2413,10 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_maprecast_time = atoi(row[9]); rank->prev_id = atoi(row[10]); rank->next_id = atoi(row[11]); + rank->base_ability = nullptr; + rank->total_cost = 0; + rank->next = nullptr; + rank->prev = nullptr; ranks[id] = std::unique_ptr(rank); } @@ -2204,4 +2478,3 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_mapnext) { + current = current->next; + } + + return current; +} + +AA::Rank *AA::Ability::GetRankByPointsSpent(int current_level) { + if(!first) + return nullptr; + + if(current_level == 0) { + return GetMaxRank(); + } + + int i = 1; + Rank *current = first; + while(current->next) { + if(1 == current_level) { + break; + } + + i++; + current = current->next; + } + + return current; +} + +int AA::Ability::GetMaxLevel(bool force_calc) { + if(!force_calc) + return max_level; + + max_level = 0; + Rank *current = first; + while(current) { + max_level++; + current = current->next; + } + + return max_level; +} \ No newline at end of file diff --git a/zone/aa_ability.h b/zone/aa_ability.h index bb9148689..b2098c408 100644 --- a/zone/aa_ability.h +++ b/zone/aa_ability.h @@ -30,14 +30,27 @@ namespace AA { -struct Ability +class Ability { +public: + Ability() { } + ~Ability() { } + + Rank *GetMaxRank(); + Rank *GetRankByPointsSpent(int current_level); + int GetMaxLevel(bool force_calc = false); + std::string name; int expansion; int category; int classes; + uint32 account_time_required; + bool grant_only; + int type; bool expendable; int first_rank_id; + int max_level; + Rank *first; }; } diff --git a/zone/aa_rank.h b/zone/aa_rank.h index ec1cc4115..43b6ef635 100644 --- a/zone/aa_rank.h +++ b/zone/aa_rank.h @@ -22,8 +22,14 @@ namespace AA { -struct Rank +class Ability; +class Rank { +public: + Rank() { } + ~Rank() { } + + int id; int upper_hotkey_sid; int lower_hotkey_sid; int title_sid; @@ -34,7 +40,11 @@ struct Rank int spell_type; int recast_time; int prev_id; + Rank *prev; int next_id; + Rank *next; + int total_cost; + Ability *base_ability; std::unordered_map effects; std::vector prereqs; }; diff --git a/zone/client.h b/zone/client.h index de093990c..7bc4aac1e 100644 --- a/zone/client.h +++ b/zone/client.h @@ -759,7 +759,11 @@ public: inline PTimerList &GetPTimers() { return(p_timers); } - //AA Methods + //New AA Methods + void SendAlternateAdvancement(int aa_id, bool first_login = false); + void SendAlternateAdvancementList(); + + //old AA Methods void SendAAList(); void ResetAA(); void SendClearAA(); diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index df8ef8f12..bfe96fdb3 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -1091,8 +1091,10 @@ void Client::Handle_Connect_OP_SendAAStats(const EQApplicationPacket *app) void Client::Handle_Connect_OP_SendAATable(const EQApplicationPacket *app) { - Log.Out(Logs::General, Logs::Error, "SendAAList()"); - SendAAList(); + //SendAAList(); + + SendAlternateAdvancementList(); + return; } @@ -1153,7 +1155,6 @@ void Client::Handle_Connect_OP_TGB(const EQApplicationPacket *app) void Client::Handle_Connect_OP_UpdateAA(const EQApplicationPacket *app) { - Log.Out(Logs::General, Logs::Error, "SendAATable()"); SendAATable(); } diff --git a/zone/zone.h b/zone/zone.h index 274a1a021..fbe1b48d1 100644 --- a/zone/zone.h +++ b/zone/zone.h @@ -116,6 +116,8 @@ public: //new AA void LoadAlternateAdvancement(); + AA::Ability *GetAlternateAdvancementAbility(int id); + AA::Rank *GetAlternateAdvancementRank(int rank_id); //old AA void LoadAAs(); @@ -319,10 +321,13 @@ private: int totalBS; ZoneSpellsBlocked *blocked_spells; +public: //new AA std::unordered_map> aa_abilities; std::unordered_map> aa_ranks; +private: + //old AA int totalAAs; SendAA_Struct **aas; //array of AA structs From dbbe6b5a91155e55ebbbcfdc597dc0debe4a399d Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 9 Jun 2015 12:39:39 -0700 Subject: [PATCH 04/90] Experimenting with packets --- common/eq_packet_structs.h | 2 +- common/patches/uf.cpp | 2 +- zone/aa.cpp | 168 +++++++++---------------------------- zone/aa_ability.cpp | 9 +- zone/aa_ability.h | 5 +- zone/aa_rank.h | 2 + zone/client.h | 2 +- zone/client_packet.cpp | 3 - zone/command.cpp | 14 ++-- 9 files changed, 59 insertions(+), 148 deletions(-) diff --git a/common/eq_packet_structs.h b/common/eq_packet_structs.h index d2d9ae8b3..0c4335016 100644 --- a/common/eq_packet_structs.h +++ b/common/eq_packet_structs.h @@ -4243,7 +4243,7 @@ struct AARankInfo_Struct int32 total_cost; int32 expansion; int32 category; - uint8 expendable; + uint8 charges; uint8 grant_only; uint32 total_effects; uint32 total_prereqs; diff --git a/common/patches/uf.cpp b/common/patches/uf.cpp index bbe0c0f0d..caea6b933 100644 --- a/common/patches/uf.cpp +++ b/common/patches/uf.cpp @@ -2177,7 +2177,7 @@ namespace UF eq->next_id = emu->next_id; eq->cost2 = emu->total_cost; eq->grant_only = emu->grant_only > 0 ? true : false; - eq->expendable_charges = emu->expendable ? 1 : 0; + eq->expendable_charges = emu->charges ? 1 : 0; eq->aa_expansion = emu->expansion; eq->special_category = emu->category; eq->total_abilities = emu->total_effects; diff --git a/zone/aa.cpp b/zone/aa.cpp index 88e2a2e56..57f6df675 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1101,6 +1101,14 @@ void Client::SendAATable() { EQApplicationPacket* outapp = new EQApplicationPacket(OP_RespondAA, sizeof(AATable_Struct)); AATable_Struct* aa2 = (AATable_Struct *)outapp->pBuffer; + aa2->aa_spent = 8; + //aa2->aa_list[0].AA = 11; + //aa2->aa_list[0].value = 4; + //aa2->aa_list[0].charges = 0; + //aa2->aa_list[1].AA = 202; + //aa2->aa_list[1].value = 4; + //aa2->aa_list[1].charges = 0; + //aa2->aa_spent = GetAAPointsSpent(); // //uint32 i; @@ -2089,13 +2097,16 @@ Mob *AA_SwarmPetInfo::GetOwner() } void Client::SendAlternateAdvancementList() { - for(auto &aa : zone->aa_abilities) { - SendAlternateAdvancement(aa.first, true); - } + //for(auto &aa : zone->aa_abilities) { + // SendAlternateAdvancement(aa.first, 5); + //} + + SendAlternateAdvancement(1, 4); + SendAlternateAdvancement(2, 4); } //New AA -void Client::SendAlternateAdvancement(int aa_id, bool first_login) { +void Client::SendAlternateAdvancement(int aa_id, int level) { if(!zone) return; @@ -2108,8 +2119,12 @@ void Client::SendAlternateAdvancement(int aa_id, bool first_login) { return; } - if(ability->account_time_required) { - if((Timer::GetTimeSeconds() - account_creation) < ability->account_time_required) + AA::Rank *rank = ability->GetRankByPointsSpent(level + 1); + if(!rank) + return; + + if(rank->account_time_required) { + if((Timer::GetTimeSeconds() - account_creation) < rank->account_time_required) { return; } @@ -2120,9 +2135,9 @@ void Client::SendAlternateAdvancement(int aa_id, bool first_login) { //if(GetAA(saa2->id) == 0) // return; - if(ability->expansion > 0) { + if(rank->expansion > 0) { AA::Ability *qaa = zone->GetAlternateAdvancementAbility(aa_id + 1); - //if(qaa && qaa->expansion == ability->expansion && GetAA(aa_id) > 0) { + //if(qaa && qaa->expansion == rank->expansion && GetAA(aa_id) > 0) { // return; //} } @@ -2140,33 +2155,28 @@ void Client::SendAlternateAdvancement(int aa_id, bool first_login) { uint32 client_race = GetBaseRace(); // Drakkin Bloodlines - if(ability->expansion > 522) + if(rank->expansion > 522) { if(client_race != 522) return; int heritage = this->GetDrakkinHeritage() + 523; // 523 = Drakkin Race(522) + Bloodline - if(heritage != ability->expansion) + if(heritage != rank->expansion) return; } - else if(client_race != ability->expansion) + else if(client_race != rank->expansion) { return; } } - - //Send first rank - AA::Rank *rank = ability->first; - if(!rank) - return; //Should move this to another function int size = sizeof(AARankInfo_Struct)+(sizeof(AARankEffect_Struct)* rank->effects.size()) + (sizeof(AARankPrereq_Struct)* rank->prereqs.size()); EQApplicationPacket *outapp = new EQApplicationPacket(OP_SendAATable, size); AARankInfo_Struct *aai = (AARankInfo_Struct*)outapp->pBuffer; - aai->id = rank->id; + aai->id = ability->GetMaxRank()->id; aai->upper_hotkey_sid = rank->upper_hotkey_sid; aai->lower_hotkey_sid = rank->lower_hotkey_sid; aai->title_sid = rank->title_sid; @@ -2174,7 +2184,7 @@ void Client::SendAlternateAdvancement(int aa_id, bool first_login) { aai->level_req = rank->level_req; aai->cost = rank->cost; aai->seq = aa_id; - aai->current_level = 1; + aai->current_level = level + 1; aai->type = ability->type; aai->spell = rank->spell; aai->spell_type = rank->spell_type; @@ -2184,9 +2194,9 @@ void Client::SendAlternateAdvancement(int aa_id, bool first_login) { aai->prev_id = rank->prev_id; aai->next_id = rank->next_id; aai->total_cost = rank->total_cost; - aai->expansion = ability->expansion; + aai->expansion = rank->expansion; aai->category = ability->category; - aai->expendable = ability->expendable; + aai->charges = ability->charges; aai->grant_only = ability->grant_only; aai->total_effects = rank->effects.size(); aai->total_prereqs = rank->prereqs.size(); @@ -2204,106 +2214,8 @@ void Client::SendAlternateAdvancement(int aa_id, bool first_login) { outapp->WriteSInt32(prereq.points); } - //if first_login then also send current rank if not maxed - QueuePacket(outapp); safe_delete(outapp); - - // - //if(size == 0) - // return; - // - //uchar* buffer = new uchar[size]; - //SendAA_Struct* saa = (SendAA_Struct*)buffer; - //memcpy(saa, saa2, size); - // - //if(saa->spellid == 0) - // saa->spellid = 0xFFFFFFFF; - // - //value = GetAA(saa->id); - //uint32 orig_val = value; - // - //if(value && saa->id){ - // - // if(value < saa->max_level){ - // saa->id += value; - // saa->next_id = saa->id + 1; - // value++; - // } - // - // else if(aa_stack && saa->sof_next_id){ - // saa->id += value - 1; - // saa->next_id = saa->sof_next_id; - // - // //Prevent removal of previous AA from window if next AA belongs to a higher client version. - // SendAA_Struct* saa_next = nullptr; - // saa_next = zone->FindAA(saa->sof_next_id); - // - // // this check should work as long as we continue to just add the clients and just increase - // // each number .... - // if(saa_next && static_cast(GetClientVersion()) < saa_next->clientver - 1) { - // saa->next_id = 0xFFFFFFFF; - // } - // } - // - // else{ - // saa->id += value - 1; - // saa->next_id = 0xFFFFFFFF; - // } - // - // uint32 current_level_mod = 0; - // if(aa_stack) - // current_level_mod = saa->sof_current_level; - // - // saa->last_id = saa->id - 1; - // saa->current_level = value + (current_level_mod); - // saa->cost = saa2->cost + (saa2->cost_inc*(value - 1)); - // saa->cost2 = 0; - // for(uint32 i = 0; i < value; i++) { - // saa->cost2 += saa2->cost + (saa2->cost_inc * i); - // } - // saa->class_type = saa2->class_type + (saa2->level_inc*(value - 1)); - //} - // - //if(aa_stack){ - // - // if(saa->sof_current_level >= 1 && value == 0) - // saa->current_level = saa->sof_current_level + 1; - // - // saa->max_level = saa->sof_max_level; - //} - // - //database.FillAAEffects(saa); - // - //if(value > 0) - //{ - // // AA_Action stores the base ID - // const AA_DBAction *caa = &AA_Actions[saa->id - value + 1][value - 1]; - // - // if(caa && caa->reuse_time > 0) - // saa->spell_refresh = CalcAAReuseTimer(caa); - //} - // - ////You can now use the level_inc field in the altadv_vars table to accomplish this, though still needed - ////for special cases like LOH/HT due to inability to implement correct stacking of AA's that use hotkeys. - //std::map::iterator RequiredLevel = AARequiredLevelAndCost.find(saa->id); - // - //if(RequiredLevel != AARequiredLevelAndCost.end()) - //{ - // saa->class_type = RequiredLevel->second.Level; - // saa->cost = RequiredLevel->second.Cost; - //} - // - // - //EQApplicationPacket* outapp = new EQApplicationPacket(OP_SendAATable); - //outapp->size = size; - //outapp->pBuffer = (uchar*)saa; - //if(id == 0 && value && (orig_val < saa->max_level)) //send previous AA only on zone in - // SendPreviousAA(id, seq); - // - //QueuePacket(outapp); - //safe_delete(outapp); - ////will outapp delete the buffer for us even though it didnt make it? --- Yes, it should } void Zone::LoadAlternateAdvancement() { @@ -2366,21 +2278,19 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_mapname = row[1]; - ability->expansion = atoi(row[2]); - ability->category = atoi(row[3]); - ability->classes = atoi(row[4]); - ability->type = atoi(row[5]); - ability->expendable = atoi(row[6]) != 0 ? true : false; - ability->account_time_required = atoul(row[7]); - ability->grant_only = atoi(row[8]) != 0 ? true : false; - ability->first_rank_id = atoi(row[9]); + ability->category = atoi(row[2]); + ability->classes = atoi(row[3]); + ability->type = atoi(row[4]); + ability->charges = atoi(row[5]); + ability->grant_only = atoi(row[6]) != 0 ? true : false; + ability->first_rank_id = atoi(row[7]); ability->first = nullptr; abilities[id] = std::unique_ptr(ability); @@ -2395,7 +2305,7 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_maprecast_time = atoi(row[9]); rank->prev_id = atoi(row[10]); rank->next_id = atoi(row[11]); + rank->expansion = atoi(row[12]); + rank->account_time_required = atoul(row[13]); rank->base_ability = nullptr; rank->total_cost = 0; rank->next = nullptr; diff --git a/zone/aa_ability.cpp b/zone/aa_ability.cpp index 3cc14826a..8f9cb8da4 100644 --- a/zone/aa_ability.cpp +++ b/zone/aa_ability.cpp @@ -33,17 +33,16 @@ AA::Rank *AA::Ability::GetMaxRank() { } AA::Rank *AA::Ability::GetRankByPointsSpent(int current_level) { + if(current_level == 0) + return nullptr; + if(!first) return nullptr; - if(current_level == 0) { - return GetMaxRank(); - } - int i = 1; Rank *current = first; while(current->next) { - if(1 == current_level) { + if(i == current_level) { break; } diff --git a/zone/aa_ability.h b/zone/aa_ability.h index b2098c408..d1ef49105 100644 --- a/zone/aa_ability.h +++ b/zone/aa_ability.h @@ -37,17 +37,16 @@ public: ~Ability() { } Rank *GetMaxRank(); + Rank *GetRankByLevel(int level); Rank *GetRankByPointsSpent(int current_level); int GetMaxLevel(bool force_calc = false); std::string name; - int expansion; int category; int classes; - uint32 account_time_required; bool grant_only; int type; - bool expendable; + int charges; int first_rank_id; int max_level; Rank *first; diff --git a/zone/aa_rank.h b/zone/aa_rank.h index 43b6ef635..d35582834 100644 --- a/zone/aa_rank.h +++ b/zone/aa_rank.h @@ -43,6 +43,8 @@ public: Rank *prev; int next_id; Rank *next; + int expansion; + uint32 account_time_required; int total_cost; Ability *base_ability; std::unordered_map effects; diff --git a/zone/client.h b/zone/client.h index 7bc4aac1e..71fc219fb 100644 --- a/zone/client.h +++ b/zone/client.h @@ -760,7 +760,7 @@ public: inline PTimerList &GetPTimers() { return(p_timers); } //New AA Methods - void SendAlternateAdvancement(int aa_id, bool first_login = false); + void SendAlternateAdvancement(int aa_id, int level); void SendAlternateAdvancementList(); //old AA Methods diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index bfe96fdb3..77431ecd9 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -1091,10 +1091,7 @@ void Client::Handle_Connect_OP_SendAAStats(const EQApplicationPacket *app) void Client::Handle_Connect_OP_SendAATable(const EQApplicationPacket *app) { - //SendAAList(); - SendAlternateAdvancementList(); - return; } diff --git a/zone/command.cpp b/zone/command.cpp index a286f92bd..3210ba070 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -674,12 +674,14 @@ void command_incstat(Client* c, const Seperator* sep){ } void command_resetaa(Client* c,const Seperator *sep){ - if(c->GetTarget()!=0 && c->GetTarget()->IsClient()){ - c->GetTarget()->CastToClient()->ResetAA(); - c->Message(13,"Successfully reset %s's AAs", c->GetTarget()->GetName()); - } - else - c->Message(0,"Usage: Target a client and use #resetaa to reset the AA data in their Profile."); + c->SendAlternateAdvancement(1, 1); + c->SendAlternateAdvancement(2, 1); + //if(c->GetTarget()!=0 && c->GetTarget()->IsClient()){ + // c->GetTarget()->CastToClient()->ResetAA(); + // c->Message(13,"Successfully reset %s's AAs", c->GetTarget()->GetName()); + //} + //else + // c->Message(0,"Usage: Target a client and use #resetaa to reset the AA data in their Profile."); } void command_help(Client *c, const Seperator *sep) From 33c1c7c3e4abbf1e182b85fccd05741284a003f4 Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 9 Jun 2015 16:17:09 -0700 Subject: [PATCH 05/90] More packet figuring out... --- common/patches/uf.cpp | 4 +++ zone/aa.cpp | 62 ++++++++++++++++++++++--------------------- zone/client.h | 2 +- zone/command.cpp | 10 +++++-- 4 files changed, 45 insertions(+), 33 deletions(-) diff --git a/common/patches/uf.cpp b/common/patches/uf.cpp index caea6b933..81ad197d6 100644 --- a/common/patches/uf.cpp +++ b/common/patches/uf.cpp @@ -1810,6 +1810,10 @@ namespace UF // OUT(aa_array[r].charges); //} // OUT(unknown02220[4]); + + eq->aa_array[0].AA = 6; + eq->aa_array[0].value = 5; + OUT(mana); OUT(cur_hp); OUT(STR); diff --git a/zone/aa.cpp b/zone/aa.cpp index 57f6df675..2fe75e4fc 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1097,28 +1097,28 @@ void Client::SendAATimers() { } void Client::SendAATable() { - Log.Out(Logs::General, Logs::Status, "SendAATable()"); - EQApplicationPacket* outapp = new EQApplicationPacket(OP_RespondAA, sizeof(AATable_Struct)); - - AATable_Struct* aa2 = (AATable_Struct *)outapp->pBuffer; - aa2->aa_spent = 8; - //aa2->aa_list[0].AA = 11; + //Log.Out(Logs::General, Logs::Status, "SendAATable()"); + //EQApplicationPacket* outapp = new EQApplicationPacket(OP_RespondAA, sizeof(AATable_Struct)); + // + //AATable_Struct* aa2 = (AATable_Struct *)outapp->pBuffer; + //aa2->aa_spent = 10; + //aa2->aa_list[0].AA = 6; //aa2->aa_list[0].value = 4; //aa2->aa_list[0].charges = 0; - //aa2->aa_list[1].AA = 202; + //aa2->aa_list[1].AA = 11; //aa2->aa_list[1].value = 4; //aa2->aa_list[1].charges = 0; - - //aa2->aa_spent = GetAAPointsSpent(); // - //uint32 i; - //for(i=0;i < MAX_PP_AA_ARRAY;i++){ - // aa2->aa_list[i].AA = aa[i]->value ? aa[i]->AA : 0; // bit of a hack to prevent expendables punching a hole - // aa2->aa_list[i].value = aa[i]->value; - // aa2->aa_list[i].charges = aa[i]->charges; - //} - QueuePacket(outapp); - safe_delete(outapp); + ////aa2->aa_spent = GetAAPointsSpent(); + //// + ////uint32 i; + ////for(i=0;i < MAX_PP_AA_ARRAY;i++){ + //// aa2->aa_list[i].AA = aa[i]->value ? aa[i]->AA : 0; // bit of a hack to prevent expendables punching a hole + //// aa2->aa_list[i].value = aa[i]->value; + //// aa2->aa_list[i].charges = aa[i]->charges; + ////} + //QueuePacket(outapp); + //safe_delete(outapp); } void Client::SendPreviousAA(uint32 id, int seq){ @@ -2101,12 +2101,15 @@ void Client::SendAlternateAdvancementList() { // SendAlternateAdvancement(aa.first, 5); //} - SendAlternateAdvancement(1, 4); - SendAlternateAdvancement(2, 4); + SendAlternateAdvancementRank(1, 5); + SendAlternateAdvancementRank(1, 6); + SendAlternateAdvancementRank(2, 1); + //SendAlternateAdvancement(1, 5); + //SendAlternateAdvancement(2, 5); } //New AA -void Client::SendAlternateAdvancement(int aa_id, int level) { +void Client::SendAlternateAdvancementRank(int aa_id, int level) { if(!zone) return; @@ -2119,7 +2122,7 @@ void Client::SendAlternateAdvancement(int aa_id, int level) { return; } - AA::Rank *rank = ability->GetRankByPointsSpent(level + 1); + AA::Rank *rank = ability->GetRankByPointsSpent(level); if(!rank) return; @@ -2129,12 +2132,12 @@ void Client::SendAlternateAdvancement(int aa_id, int level) { return; } } - + // Hide Quest/Progression AAs unless player has been granted the first level using $client->IncrementAA(skill_id). if(ability->category == 1 || ability->category == 2) { //if(GetAA(saa2->id) == 0) // return; - + if(rank->expansion > 0) { AA::Ability *qaa = zone->GetAlternateAdvancementAbility(aa_id + 1); //if(qaa && qaa->expansion == rank->expansion && GetAA(aa_id) > 0) { @@ -2142,7 +2145,7 @@ void Client::SendAlternateAdvancement(int aa_id, int level) { //} } } - + // Passive and Active Shroud AAs // For now we skip them if(ability->category == 3 || ability->category == 4) { @@ -2171,25 +2174,24 @@ void Client::SendAlternateAdvancement(int aa_id, int level) { } } - //Should move this to another function - int size = sizeof(AARankInfo_Struct)+(sizeof(AARankEffect_Struct)* rank->effects.size()) + (sizeof(AARankPrereq_Struct)* rank->prereqs.size()); + int size = sizeof(AARankInfo_Struct) + (sizeof(AARankEffect_Struct) * rank->effects.size()) + (sizeof(AARankPrereq_Struct) * rank->prereqs.size()); EQApplicationPacket *outapp = new EQApplicationPacket(OP_SendAATable, size); AARankInfo_Struct *aai = (AARankInfo_Struct*)outapp->pBuffer; - aai->id = ability->GetMaxRank()->id; + aai->id = rank->id; aai->upper_hotkey_sid = rank->upper_hotkey_sid; aai->lower_hotkey_sid = rank->lower_hotkey_sid; aai->title_sid = rank->title_sid; aai->desc_sid = rank->desc_sid; - aai->level_req = rank->level_req; aai->cost = rank->cost; aai->seq = aa_id; - aai->current_level = level + 1; aai->type = ability->type; aai->spell = rank->spell; aai->spell_type = rank->spell_type; aai->spell_refresh = rank->recast_time; aai->classes = ability->classes; + aai->level_req = rank->level_req; + aai->current_level = level; aai->max_level = ability->GetMaxLevel(); aai->prev_id = rank->prev_id; aai->next_id = rank->next_id; @@ -2208,7 +2210,7 @@ void Client::SendAlternateAdvancement(int aa_id, int level) { outapp->WriteSInt32(effect.second.base2); outapp->WriteSInt32(effect.first); } - + for(auto prereq : rank->prereqs) { outapp->WriteSInt32(prereq.aa_id); outapp->WriteSInt32(prereq.points); diff --git a/zone/client.h b/zone/client.h index 71fc219fb..1a1e32c6f 100644 --- a/zone/client.h +++ b/zone/client.h @@ -760,7 +760,7 @@ public: inline PTimerList &GetPTimers() { return(p_timers); } //New AA Methods - void SendAlternateAdvancement(int aa_id, int level); + void SendAlternateAdvancementRank(int aa_id, int level); void SendAlternateAdvancementList(); //old AA Methods diff --git a/zone/command.cpp b/zone/command.cpp index 3210ba070..f2a84baaa 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -674,8 +674,14 @@ void command_incstat(Client* c, const Seperator* sep){ } void command_resetaa(Client* c,const Seperator *sep){ - c->SendAlternateAdvancement(1, 1); - c->SendAlternateAdvancement(2, 1); + + //if(sep->IsNumber(1) && atoi(sep->arg[1]) == 1) { + // c->SendAlternateAdvancement(2, 2); + //} + //else if(sep->IsNumber(1) && atoi(sep->arg[1]) == 2) { + // c->SendAlternateAdvancement(2, 3); + //} + //if(c->GetTarget()!=0 && c->GetTarget()->IsClient()){ // c->GetTarget()->CastToClient()->ResetAA(); // c->Message(13,"Successfully reset %s's AAs", c->GetTarget()->GetName()); From d5e697c061df46d38711305405925d3903f13415 Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 9 Jun 2015 22:12:31 -0700 Subject: [PATCH 06/90] More work, looks a lot better than before, tomorrow i hope to get actual client implementation done --- zone/aa.cpp | 395 +++++++++++++++++++++-------------------- zone/aa_ability.h | 1 + zone/bonuses.cpp | 29 +-- zone/client.cpp | 84 ++++----- zone/client.h | 8 +- zone/client_packet.cpp | 108 +++++------ zone/mob.h | 11 +- zone/spell_effects.cpp | 68 +++---- zone/zone.h | 1 + 9 files changed, 363 insertions(+), 342 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index 2fe75e4fc..a66b533f6 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1254,37 +1254,37 @@ void Client::SendAA(uint32 id, int seq) { if (RuleB(AA, Stacking) && (GetClientVersionBit() >= 4) && (saa2->hotkey_sid == 4294967295u)) aa_stack = true; - if (aa_stack){ - uint32 aa_AA = 0; - uint32 aa_value = 0; - for (int i = 0; i < MAX_PP_AA_ARRAY; i++) { - if (aa[i]) { - aa_AA = aa[i]->AA; - aa_value = aa[i]->value; - - if (aa_AA){ - - if (aa_value > 0) - aa_AA -= aa_value-1; - - saa_pp = zone->FindAA(aa_AA); - - if (saa_pp){ - - if (saa_pp->sof_next_skill == saa2->sof_next_skill){ - - if (saa_pp->id == saa2->id) - break; //You already have this in the player profile. - else if ((saa_pp->sof_current_level < saa2->sof_current_level) && (aa_value < saa_pp->max_level)) - return; //DISABLE DISPLAY HIGHER - You have not reached max level yet of your current AA. - else if ((saa_pp->sof_current_level < saa2->sof_current_level) && (aa_value == saa_pp->max_level) && (saa_pp->sof_next_id == saa2->id)) - IsBaseLevel = false; //ALLOW DISPLAY HIGHER - } - } - } - } - } - } + //if (aa_stack){ + // uint32 aa_AA = 0; + // uint32 aa_value = 0; + // for (int i = 0; i < MAX_PP_AA_ARRAY; i++) { + // if (aa[i]) { + // aa_AA = aa[i]->AA; + // aa_value = aa[i]->value; + // + // if (aa_AA){ + // + // if (aa_value > 0) + // aa_AA -= aa_value-1; + // + // saa_pp = zone->FindAA(aa_AA); + // + // if (saa_pp){ + // + // if (saa_pp->sof_next_skill == saa2->sof_next_skill){ + // + // if (saa_pp->id == saa2->id) + // break; //You already have this in the player profile. + // else if ((saa_pp->sof_current_level < saa2->sof_current_level) && (aa_value < saa_pp->max_level)) + // return; //DISABLE DISPLAY HIGHER - You have not reached max level yet of your current AA. + // else if ((saa_pp->sof_current_level < saa2->sof_current_level) && (aa_value == saa_pp->max_level) && (saa_pp->sof_next_id == saa2->id)) + // IsBaseLevel = false; //ALLOW DISPLAY HIGHER + // } + // } + // } + // } + // } + //} //Hide higher tiers of multi tiered AA's if the base level is not fully purchased. if (aa_stack && IsBaseLevel && saa2->sof_current_level > 0) @@ -1399,51 +1399,6 @@ void Client::SendAAList(){ } } -uint32 Client::GetAA(uint32 aa_id) const { - std::map::const_iterator res; - res = aa_points.find(aa_id); - if(res != aa_points.end()) { - return(res->second); - } - return(0); -} - -bool Client::SetAA(uint32 aa_id, uint32 new_value) { - aa_points[aa_id] = new_value; - uint32 cur; - auto sendaa = zone->FindAA(aa_id); // this is a bit hacky - uint32 charges = sendaa->special_category == 7 && new_value ? 1 : 0; - for(cur=0;cur < MAX_PP_AA_ARRAY;cur++){ - if((aa[cur]->value > 1) && ((aa[cur]->AA - aa[cur]->value + 1)== aa_id)){ - aa[cur]->value = new_value; - if(new_value > 0) - aa[cur]->AA++; - aa[cur]->charges = charges; - return true; - } - else if((aa[cur]->value == 1) && (aa[cur]->AA == aa_id)){ - aa[cur]->value = new_value; - if(new_value > 0) - aa[cur]->AA++; - aa[cur]->charges = charges; - return true; - } - // hack to prevent expendable exploit, we should probably be reshuffling the array to fix the hole - else if(aa[cur]->value == 0 && new_value == 1 && aa[cur]->AA == aa_id) { - aa[cur]->value = new_value; - aa[cur]->charges = charges; - return true; - } - else if(aa[cur]->AA==0){ //end of list - aa[cur]->AA = aa_id; - aa[cur]->value = new_value; - aa[cur]->charges = charges; - return true; - } - } - return false; -} - SendAA_Struct* Zone::FindAA(uint32 id) { return aas_send[id]; } @@ -1503,39 +1458,39 @@ bool ZoneDatabase::LoadAAEffects2() { } void Client::ResetAA(){ - RefundAA(); - uint32 i; - for (i=0; i < MAX_PP_AA_ARRAY; i++) { - aa[i]->AA = 0; - aa[i]->value = 0; - aa[i]->charges = 0; - m_pp.aa_array[i].AA = 0; - m_pp.aa_array[i].value = 0; - m_pp.aa_array[i].charges= 0; - } - - std::map::iterator itr; - for(itr = aa_points.begin(); itr != aa_points.end(); ++itr) - aa_points[itr->first] = 0; - - for(int i = 0; i < _maxLeaderAA; ++i) - m_pp.leader_abilities.ranks[i] = 0; - - m_pp.group_leadership_points = 0; - m_pp.raid_leadership_points = 0; - m_pp.group_leadership_exp = 0; - m_pp.raid_leadership_exp = 0; - - database.DeleteCharacterAAs(this->CharacterID()); - SaveAA(); - SendClearAA(); - SendAAList(); - SendAATable(); - SendAAStats(); - database.DeleteCharacterLeadershipAAs(this->CharacterID()); - // undefined for these clients - if (GetClientVersionBit() & BIT_TitaniumAndEarlier) - Kick(); +// RefundAA(); +// uint32 i; +// for (i=0; i < MAX_PP_AA_ARRAY; i++) { +// aa[i]->AA = 0; +// aa[i]->value = 0; +// aa[i]->charges = 0; +// m_pp.aa_array[i].AA = 0; +// m_pp.aa_array[i].value = 0; +// m_pp.aa_array[i].charges= 0; +// } +// +// std::map::iterator itr; +// for(itr = aa_points.begin(); itr != aa_points.end(); ++itr) +// aa_points[itr->first] = 0; +// +// for(int i = 0; i < _maxLeaderAA; ++i) +// m_pp.leader_abilities.ranks[i] = 0; +// +// m_pp.group_leadership_points = 0; +// m_pp.raid_leadership_points = 0; +// m_pp.group_leadership_exp = 0; +// m_pp.raid_leadership_exp = 0; +// +// database.DeleteCharacterAAs(this->CharacterID()); +// SaveAA(); +// SendClearAA(); +// SendAAList(); +// SendAATable(); +// SendAAStats(); +// database.DeleteCharacterLeadershipAAs(this->CharacterID()); +// // undefined for these clients +// if (GetClientVersionBit() & BIT_TitaniumAndEarlier) +// Kick(); } void Client::SendClearAA() @@ -2096,19 +2051,23 @@ Mob *AA_SwarmPetInfo::GetOwner() return entity_list.GetMobID(owner_id); } -void Client::SendAlternateAdvancementList() { - //for(auto &aa : zone->aa_abilities) { - // SendAlternateAdvancement(aa.first, 5); - //} - - SendAlternateAdvancementRank(1, 5); - SendAlternateAdvancementRank(1, 6); - SendAlternateAdvancementRank(2, 1); - //SendAlternateAdvancement(1, 5); - //SendAlternateAdvancement(2, 5); +//New AA +void Client::SendAlternateAdvancementTable() { + for(auto &aa : zone->aa_abilities) { + auto ranks = GetAA(aa.second->first_rank_id); + if(ranks) { + if(aa.second->GetMaxLevel() == ranks) { + SendAlternateAdvancementRank(aa.first, ranks); + } else { + SendAlternateAdvancementRank(aa.first, ranks); + SendAlternateAdvancementRank(aa.first, ranks + 1); + } + } else { + SendAlternateAdvancementRank(aa.first, 1); + } + } } -//New AA void Client::SendAlternateAdvancementRank(int aa_id, int level) { if(!zone) return; @@ -2126,53 +2085,9 @@ void Client::SendAlternateAdvancementRank(int aa_id, int level) { if(!rank) return; - if(rank->account_time_required) { - if((Timer::GetTimeSeconds() - account_creation) < rank->account_time_required) - { - return; - } - } - - // Hide Quest/Progression AAs unless player has been granted the first level using $client->IncrementAA(skill_id). - if(ability->category == 1 || ability->category == 2) { - //if(GetAA(saa2->id) == 0) - // return; - - if(rank->expansion > 0) { - AA::Ability *qaa = zone->GetAlternateAdvancementAbility(aa_id + 1); - //if(qaa && qaa->expansion == rank->expansion && GetAA(aa_id) > 0) { - // return; - //} - } - } - - // Passive and Active Shroud AAs - // For now we skip them - if(ability->category == 3 || ability->category == 4) { + if(!CanUseAlternateAdvancementRank(rank)) { return; } - - // Check for racial/Drakkin blood line AAs - if(ability->category == 8) - { - uint32 client_race = GetBaseRace(); - - // Drakkin Bloodlines - if(rank->expansion > 522) - { - if(client_race != 522) - return; - - int heritage = this->GetDrakkinHeritage() + 523; // 523 = Drakkin Race(522) + Bloodline - - if(heritage != rank->expansion) - return; - } - else if(client_race != rank->expansion) - { - return; - } - } int size = sizeof(AARankInfo_Struct) + (sizeof(AARankEffect_Struct) * rank->effects.size()) + (sizeof(AARankPrereq_Struct) * rank->prereqs.size()); EQApplicationPacket *outapp = new EQApplicationPacket(OP_SendAATable, size); @@ -2220,10 +2135,126 @@ void Client::SendAlternateAdvancementRank(int aa_id, int level) { safe_delete(outapp); } +AA::Ability *Zone::GetAlternateAdvancementAbility(int id) { + auto iter = aa_abilities.find(id); + if(iter != aa_abilities.end()) { + return iter->second.get(); + } + + return nullptr; +} + +AA::Ability *Zone::GetAlternateAdvancementAbilityByRank(int rank_id) { + AA::Rank *rank = GetAlternateAdvancementRank(rank_id); + + if(!rank) + return nullptr; + + return rank->base_ability; +} + +AA::Rank *Zone::GetAlternateAdvancementRank(int rank_id) { + auto iter = aa_ranks.find(rank_id); + if(iter != aa_ranks.end()) { + return iter->second.get(); + } + + return nullptr; +} + +uint32 Mob::GetAA(uint32 rank_id) const { + if(zone) { + AA::Ability *ability = zone->GetAlternateAdvancementAbilityByRank(rank_id); + if(!ability) + return 0; + + auto iter = aa_ranks.find(ability->id); + if(iter != aa_ranks.end()) { + return iter->second; + } + } + return 0; +} + +bool Mob::SetAA(uint32 rank_id, uint32 new_value) { + if(zone) { + AA::Ability *ability = zone->GetAlternateAdvancementAbilityByRank(rank_id); + + if(!ability) { + return false; + } + + if(new_value > ability->GetMaxLevel()) { + return false; + } + + aa_ranks[ability->id] = new_value; + } + + return false; +} + + +bool Mob::CanUseAlternateAdvancementRank(AA::Rank *rank) { + AA::Ability *ability = rank->base_ability; + + if(!ability) + return false; + + // Passive and Active Shroud AAs + // For now we skip them + if(ability->category == 3 || ability->category == 4) { + return false; + } + + // Check for racial/Drakkin blood line AAs + if(ability->category == 8) + { + uint32 client_race = GetBaseRace(); + + // Drakkin Bloodlines + if(rank->expansion > 522) + { + if(client_race != 522) + return false; + + int heritage = this->GetDrakkinHeritage() + 523; // 523 = Drakkin Race(522) + Bloodline + + if(heritage != rank->expansion) + return false; + } + else if(client_race != rank->expansion) + { + return false; + } + } + + return true; +} + +bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank) { + AA::Ability *ability = rank->base_ability; + + if(!ability) + return false; + + if(!CanUseAlternateAdvancementRank(rank)) { + return false; + } + + //You can't purchase grant only AAs they can only be assigned + if(ability->grant_only) { + return false; + } + + //check other stuff like price later + return true; +} + void Zone::LoadAlternateAdvancement() { Log.Out(Logs::General, Logs::Status, "Loading Alternate Advancement Data..."); - if(!database.LoadAlternateAdvancementAbilities(aa_abilities, - aa_ranks)) + if(!database.LoadAlternateAdvancementAbilities(aa_abilities, + aa_ranks)) { aa_abilities.clear(); aa_ranks.clear(); @@ -2244,7 +2275,8 @@ void Zone::LoadAlternateAdvancement() { if(current->prev) { current->total_cost = current->cost + current->prev->total_cost; - } else { + } + else { current->total_cost = current->cost; } @@ -2257,24 +2289,6 @@ void Zone::LoadAlternateAdvancement() { Log.Out(Logs::General, Logs::Status, "Loaded Alternate Advancement Data"); } -AA::Ability *Zone::GetAlternateAdvancementAbility(int id) { - auto iter = aa_abilities.find(id); - if(iter != aa_abilities.end()) { - return iter->second.get(); - } - - return nullptr; -} - -AA::Rank *Zone::GetAlternateAdvancementRank(int rank_id) { - auto iter = aa_ranks.find(rank_id); - if(iter != aa_ranks.end()) { - return iter->second.get(); - } - - return nullptr; -} - bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map> &abilities, std::unordered_map> &ranks) { @@ -2285,7 +2299,7 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_mapid = atoi(row[0]); ability->name = row[1]; ability->category = atoi(row[2]); ability->classes = atoi(row[3]); @@ -2295,7 +2309,7 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_mapfirst_rank_id = atoi(row[7]); ability->first = nullptr; - abilities[id] = std::unique_ptr(ability); + abilities[ability->id] = std::unique_ptr(ability); } } else { Log.Out(Logs::General, Logs::Error, "Failed to load Alternate Advancement Abilities"); @@ -2312,8 +2326,7 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_mapid = id; + rank->id = atoi(row[0]); rank->upper_hotkey_sid = atoi(row[1]); rank->lower_hotkey_sid = atoi(row[2]); rank->title_sid = atoi(row[3]); @@ -2332,7 +2345,7 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_mapnext = nullptr; rank->prev = nullptr; - ranks[id] = std::unique_ptr(rank); + ranks[rank->id] = std::unique_ptr(rank); } } else { Log.Out(Logs::General, Logs::Error, "Failed to load Alternate Advancement Ability Ranks"); diff --git a/zone/aa_ability.h b/zone/aa_ability.h index d1ef49105..a31bc06e3 100644 --- a/zone/aa_ability.h +++ b/zone/aa_ability.h @@ -41,6 +41,7 @@ public: Rank *GetRankByPointsSpent(int current_level); int GetMaxLevel(bool force_calc = false); + int id; std::string name; int category; int classes; diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index 5dd7440f6..a2a180cef 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -639,20 +639,21 @@ void Client::CalcAABonuses(StatBonuses* newbon) { uint32 slots = 0; uint32 aa_AA = 0; uint32 aa_value = 0; - if(this->aa) { - for (i = 0; i < MAX_PP_AA_ARRAY; i++) { //iterate through all of the client's AAs - if (this->aa[i]) { // make sure aa exists or we'll crash zone - aa_AA = this->aa[i]->AA; //same as aaid from the aa_effects table - aa_value = this->aa[i]->value; //how many points in it - if (aa_AA > 0 || aa_value > 0) { //do we have the AA? if 1 of the 2 is set, we can assume we do - //slots = database.GetTotalAALevels(aa_AA); //find out how many effects from aa_effects table - slots = zone->GetTotalAALevels(aa_AA); //find out how many effects from aa_effects, which is loaded into memory - if (slots > 0) //and does it have any effects? may be able to put this above, not sure if it runs on each iteration - ApplyAABonuses(aa_AA, slots, newbon); //add the bonuses - } - } - } - } + //aa old + //if(this->aa) { + // for (i = 0; i < MAX_PP_AA_ARRAY; i++) { //iterate through all of the client's AAs + // if (this->aa[i]) { // make sure aa exists or we'll crash zone + // aa_AA = this->aa[i]->AA; //same as aaid from the aa_effects table + // aa_value = this->aa[i]->value; //how many points in it + // if (aa_AA > 0 || aa_value > 0) { //do we have the AA? if 1 of the 2 is set, we can assume we do + // //slots = database.GetTotalAALevels(aa_AA); //find out how many effects from aa_effects table + // slots = zone->GetTotalAALevels(aa_AA); //find out how many effects from aa_effects, which is loaded into memory + // if (slots > 0) //and does it have any effects? may be able to put this above, not sure if it runs on each iteration + // ApplyAABonuses(aa_AA, slots, newbon); //add the bonuses + // } + // } + // } + //} } diff --git a/zone/client.cpp b/zone/client.cpp index 53d39ea7b..dc32745e4 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -176,7 +176,6 @@ Client::Client(EQStreamInterface* ieqs) admin = 0; lsaccountid = 0; shield_target = nullptr; - SQL_log = nullptr; guild_id = GUILD_NONE; guildrank = 0; GuildBanker = false; @@ -524,47 +523,48 @@ void Client::ReportConnectingState() { } bool Client::SaveAA(){ - int first_entry = 0; - std::string rquery; - /* Save Player AA */ - int spentpoints = 0; - for (int a = 0; a < MAX_PP_AA_ARRAY; a++) { - uint32 points = aa[a]->value; - if (points > HIGHEST_AA_VALUE) { - aa[a]->value = HIGHEST_AA_VALUE; - points = HIGHEST_AA_VALUE; - } - if (points > 0) { - SendAA_Struct* curAA = zone->FindAA(aa[a]->AA - aa[a]->value + 1); - if (curAA) { - for (int rank = 0; rank::iterator RequiredLevel = AARequiredLevelAndCost.find(aa[a]->AA - aa[a]->value + 1 + rank); - if (RequiredLevel != AARequiredLevelAndCost.end()) { - spentpoints += RequiredLevel->second.Cost; - } - else - spentpoints += (curAA->cost + (curAA->cost_inc * rank)); - } - } - } - } - m_pp.aapoints_spent = spentpoints + m_epp.expended_aa; - int highest = 0; - for (int a = 0; a < MAX_PP_AA_ARRAY; a++) { - if (aa[a]->AA > 0) { // those with value 0 will be cleaned up on next load - if (first_entry != 1){ - rquery = StringFormat("REPLACE INTO `character_alternate_abilities` (id, slot, aa_id, aa_value, charges)" - " VALUES (%u, %u, %u, %u, %u)", character_id, a, aa[a]->AA, aa[a]->value, aa[a]->charges); - first_entry = 1; - } else { - rquery = rquery + StringFormat(", (%u, %u, %u, %u, %u)", character_id, a, aa[a]->AA, aa[a]->value, aa[a]->charges); - } - highest = a; - } - } - auto results = database.QueryDatabase(rquery); - /* This is another part of the hack to clean up holes left by expendable AAs */ - rquery = StringFormat("DELETE FROM `character_alternate_abilities` WHERE `id` = %u AND `slot` > %d", character_id, highest); + //aa old + //int first_entry = 0; + //std::string rquery; + ///* Save Player AA */ + //int spentpoints = 0; + //for (int a = 0; a < MAX_PP_AA_ARRAY; a++) { + // uint32 points = aa[a]->value; + // if (points > HIGHEST_AA_VALUE) { + // aa[a]->value = HIGHEST_AA_VALUE; + // points = HIGHEST_AA_VALUE; + // } + // if (points > 0) { + // SendAA_Struct* curAA = zone->FindAA(aa[a]->AA - aa[a]->value + 1); + // if (curAA) { + // for (int rank = 0; rank::iterator RequiredLevel = AARequiredLevelAndCost.find(aa[a]->AA - aa[a]->value + 1 + rank); + // if (RequiredLevel != AARequiredLevelAndCost.end()) { + // spentpoints += RequiredLevel->second.Cost; + // } + // else + // spentpoints += (curAA->cost + (curAA->cost_inc * rank)); + // } + // } + // } + //} + //m_pp.aapoints_spent = spentpoints + m_epp.expended_aa; + //int highest = 0; + //for (int a = 0; a < MAX_PP_AA_ARRAY; a++) { + // if (aa[a]->AA > 0) { // those with value 0 will be cleaned up on next load + // if (first_entry != 1){ + // rquery = StringFormat("REPLACE INTO `character_alternate_abilities` (id, slot, aa_id, aa_value, charges)" + // " VALUES (%u, %u, %u, %u, %u)", character_id, a, aa[a]->AA, aa[a]->value, aa[a]->charges); + // first_entry = 1; + // } else { + // rquery = rquery + StringFormat(", (%u, %u, %u, %u, %u)", character_id, a, aa[a]->AA, aa[a]->value, aa[a]->charges); + // } + // highest = a; + // } + //} + //auto results = database.QueryDatabase(rquery); + ///* This is another part of the hack to clean up holes left by expendable AAs */ + //rquery = StringFormat("DELETE FROM `character_alternate_abilities` WHERE `id` = %u AND `slot` > %d", character_id, highest); return true; } diff --git a/zone/client.h b/zone/client.h index 1a1e32c6f..c2d3b1f63 100644 --- a/zone/client.h +++ b/zone/client.h @@ -761,7 +761,7 @@ public: //New AA Methods void SendAlternateAdvancementRank(int aa_id, int level); - void SendAlternateAdvancementList(); + void SendAlternateAdvancementTable(); //old AA Methods void SendAAList(); @@ -787,8 +787,6 @@ public: void DisableAAEffect(aaEffectType type); bool CheckAAEffect(aaEffectType type); void HandleAAAction(aaID activate); - uint32 GetAA(uint32 aa_id) const; - bool SetAA(uint32 aa_id, uint32 new_value); inline uint32 GetAAPointsSpent() { return m_pp.aapoints_spent; } int16 CalcAAFocusEffect(focusType type, uint16 focus_spell, uint16 spell_id); int16 CalcAAFocus(focusType type, uint32 aa_ID, uint16 spell_id); @@ -1493,11 +1491,7 @@ private: uint32 tribute_master_id; - FILE *SQL_log; uint32 max_AAXP; - uint32 staminacount; - AA_Array* aa[MAX_PP_AA_ARRAY]; //this list contains pointers into our player profile - std::map aa_points; bool npcflag; uint8 npclevel; bool feigned; diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 77431ecd9..c242d50e2 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -1091,7 +1091,7 @@ void Client::Handle_Connect_OP_SendAAStats(const EQApplicationPacket *app) void Client::Handle_Connect_OP_SendAATable(const EQApplicationPacket *app) { - SendAlternateAdvancementList(); + SendAlternateAdvancementTable(); return; } @@ -1440,58 +1440,60 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) if (m_pp.ldon_points_available < 0 || m_pp.ldon_points_available > 2000000000){ m_pp.ldon_points_available = 0; } /* Initialize AA's : Move to function eventually */ - for (uint32 a = 0; a < MAX_PP_AA_ARRAY; a++) - aa[a] = &m_pp.aa_array[a]; - query = StringFormat( - "SELECT " - "slot, " - "aa_id, " - "aa_value, " - "charges " - "FROM " - "`character_alternate_abilities` " - "WHERE `id` = %u ORDER BY `slot`", this->CharacterID()); - results = database.QueryDatabase(query); i = 0; - int offset = 0; // offset to fix the hole from expendables - for (auto row = results.begin(); row != results.end(); ++row) { - i = atoi(row[0]) - offset; - m_pp.aa_array[i].AA = atoi(row[1]); - m_pp.aa_array[i].value = atoi(row[2]); - m_pp.aa_array[i].charges = atoi(row[3]); - /* A used expendable could cause there to be a "hole" in the array, this is very bad. Bad things like keeping your expendable after use. - We could do a few things, one of them being reshuffling when the hole is created or defer the fixing until a later point, like during load! - Or just never making a hole in the array and just have hacks every where. Fixing the hole at load really just keeps 1 hack in Client::SendAATable - and keeping this offset that will cause the next AA to be pushed back over the hole. We also need to clean up on save so we don't have multiple - entries for a single AA. - */ - if (m_pp.aa_array[i].value == 0) - offset++; - } - for (uint32 a = 0; a < MAX_PP_AA_ARRAY; a++){ - uint32 id = aa[a]->AA; - //watch for invalid AA IDs - if (id == aaNone) - continue; - if (id >= aaHighestID) { - aa[a]->AA = aaNone; - aa[a]->value = 0; - continue; - } - if (aa[a]->value == 0) { - aa[a]->AA = aaNone; - continue; - } - if (aa[a]->value > HIGHEST_AA_VALUE) { - aa[a]->AA = aaNone; - aa[a]->value = 0; - continue; - } - - if (aa[a]->value > 1) /* hack in some stuff for sony's new AA method (where each level of each aa.has a seperate ID) */ - aa_points[(id - aa[a]->value + 1)] = aa[a]->value; - else - aa_points[id] = aa[a]->value; - } + //aa old + //for (uint32 a = 0; a < MAX_PP_AA_ARRAY; a++) + // aa[a] = &m_pp.aa_array[a]; + //query = StringFormat( + // "SELECT " + // "slot, " + // "aa_id, " + // "aa_value, " + // "charges " + // "FROM " + // "`character_alternate_abilities` " + // "WHERE `id` = %u ORDER BY `slot`", this->CharacterID()); + //results = database.QueryDatabase(query); i = 0; + //int offset = 0; // offset to fix the hole from expendables + //for (auto row = results.begin(); row != results.end(); ++row) { + // i = atoi(row[0]) - offset; + // m_pp.aa_array[i].AA = atoi(row[1]); + // m_pp.aa_array[i].value = atoi(row[2]); + // m_pp.aa_array[i].charges = atoi(row[3]); + // /* A used expendable could cause there to be a "hole" in the array, this is very bad. Bad things like keeping your expendable after use. + // We could do a few things, one of them being reshuffling when the hole is created or defer the fixing until a later point, like during load! + // Or just never making a hole in the array and just have hacks every where. Fixing the hole at load really just keeps 1 hack in Client::SendAATable + // and keeping this offset that will cause the next AA to be pushed back over the hole. We also need to clean up on save so we don't have multiple + // entries for a single AA. + // */ + // if (m_pp.aa_array[i].value == 0) + // offset++; + //} + //for (uint32 a = 0; a < MAX_PP_AA_ARRAY; a++){ + // uint32 id = aa[a]->AA; + // //watch for invalid AA IDs + // if (id == aaNone) + // continue; + // if (id >= aaHighestID) { + // aa[a]->AA = aaNone; + // aa[a]->value = 0; + // continue; + // } + // if (aa[a]->value == 0) { + // aa[a]->AA = aaNone; + // continue; + // } + // if (aa[a]->value > HIGHEST_AA_VALUE) { + // aa[a]->AA = aaNone; + // aa[a]->value = 0; + // continue; + // } + // + // //aa old +// // if (aa[a]->value > 1) /* hack in some stuff for sony's new AA method (where each level of each aa.has a seperate ID) */ +// // aa_points[(id - aa[a]->value + 1)] = aa[a]->value; +// // else +// // aa_points[id] = aa[a]->value; + //} if (SPDAT_RECORDS > 0) { for (uint32 z = 0; z #include #include @@ -860,7 +861,6 @@ public: uint32 GetZoneID() const; //for perl virtual int32 CheckAggroAmount(uint16 spell_id, bool isproc = false); virtual int32 CheckHealAggroAmount(uint16 spell_id, uint32 heal_possible = 0); - virtual uint32 GetAA(uint32 aa_id) const { return(0); } uint32 GetInstrumentMod(uint16 spell_id) const; int CalcSpellEffectValue(uint16 spell_id, int effect_id, int caster_level = 1, uint32 instrument_mod = 10, Mob *caster = nullptr, int ticsremaining = 0); @@ -956,6 +956,12 @@ public: void Tune_FindAccuaryByHitChance(Mob* defender, Mob *attacker, float hit_chance, int interval, int max_loop, int avoid_override, int Msg = 0); void Tune_FindAvoidanceByHitChance(Mob* defender, Mob *attacker, float hit_chance, int interval, int max_loop, int acc_override, int Msg = 0); + //aa new + uint32 GetAA(uint32 rank_id) const; + bool SetAA(uint32 rank_id, uint32 new_value); + bool CanUseAlternateAdvancementRank(AA::Rank *rank); + bool CanPurchaseAlternateAdvancementRank(AA::Rank *ran); + protected: void CommonDamage(Mob* other, int32 &damage, const uint16 spell_id, const SkillUseTypes attack_skill, bool &avoidable, const int8 buffslot, const bool iBuffTic); static uint16 GetProcID(uint16 spell_id, uint8 effect_index); @@ -969,7 +975,6 @@ protected: virtual bool AI_PursueCastCheck() { return(false); } virtual bool AI_IdleCastCheck() { return(false); } - bool IsFullHP; bool moved; @@ -1311,6 +1316,8 @@ protected: bool bEnraged; bool destructibleobject; + std::unordered_map aa_ranks; + private: void _StopSong(); //this is not what you think it is Mob* target; diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index b331113bd..7e91550c5 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -5231,24 +5231,25 @@ uint16 Client::GetSympatheticFocusEffect(focusType type, uint16 spell_id) { uint32 aa_AA = 0; uint32 aa_value = 0; - for (int i = 0; i < MAX_PP_AA_ARRAY; i++) - { - aa_AA = this->aa[i]->AA; - aa_value = this->aa[i]->value; - if (aa_AA < 1 || aa_value < 1) - continue; - - if (SympatheticProcList.size() > MAX_SYMPATHETIC_PROCS) - continue; - - proc_spellid = CalcAAFocus(type, aa_AA, spell_id); - - if (IsValidSpell(proc_spellid)){ - ProcChance = GetSympatheticProcChances(spell_id, GetAABase1(aa_AA, 1)); - if(zone->random.Roll(ProcChance)) - SympatheticProcList.push_back(proc_spellid); - } - } + //aa old + //for (int i = 0; i < MAX_PP_AA_ARRAY; i++) + //{ + // aa_AA = this->aa[i]->AA; + // aa_value = this->aa[i]->value; + // if (aa_AA < 1 || aa_value < 1) + // continue; + // + // if (SympatheticProcList.size() > MAX_SYMPATHETIC_PROCS) + // continue; + // + // proc_spellid = CalcAAFocus(type, aa_AA, spell_id); + // + // if (IsValidSpell(proc_spellid)){ + // ProcChance = GetSympatheticProcChances(spell_id, GetAABase1(aa_AA, 1)); + // if(zone->random.Roll(ProcChance)) + // SympatheticProcList.push_back(proc_spellid); + // } + //} } if (SympatheticProcList.size() > 0) @@ -5503,21 +5504,22 @@ int16 Client::GetFocusEffect(focusType type, uint16 spell_id) { uint32 aa_AA = 0; uint32 aa_value = 0; - for (int i = 0; i < MAX_PP_AA_ARRAY; i++) - { - aa_AA = this->aa[i]->AA; - aa_value = this->aa[i]->value; - if (aa_AA < 1 || aa_value < 1) - continue; - - Total3 = CalcAAFocus(type, aa_AA, spell_id); - if (Total3 > 0 && realTotal3 >= 0 && Total3 > realTotal3) { - realTotal3 = Total3; - } - else if (Total3 < 0 && Total3 < realTotal3) { - realTotal3 = Total3; - } - } + //aa old + //for (int i = 0; i < MAX_PP_AA_ARRAY; i++) + //{ + // aa_AA = this->aa[i]->AA; + // aa_value = this->aa[i]->value; + // if (aa_AA < 1 || aa_value < 1) + // continue; + // + // Total3 = CalcAAFocus(type, aa_AA, spell_id); + // if (Total3 > 0 && realTotal3 >= 0 && Total3 > realTotal3) { + // realTotal3 = Total3; + // } + // else if (Total3 < 0 && Total3 < realTotal3) { + // realTotal3 = Total3; + // } + //} } if(type == focusReagentCost && IsSummonPetSpell(spell_id) && GetAA(aaElementalPact)) diff --git a/zone/zone.h b/zone/zone.h index fbe1b48d1..536ff048c 100644 --- a/zone/zone.h +++ b/zone/zone.h @@ -117,6 +117,7 @@ public: //new AA void LoadAlternateAdvancement(); AA::Ability *GetAlternateAdvancementAbility(int id); + AA::Ability *GetAlternateAdvancementAbilityByRank(int rank_id); AA::Rank *GetAlternateAdvancementRank(int rank_id); //old AA From 8422ce6f25b0f047703e98f31d242609ba9e2686 Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 9 Jun 2015 22:46:53 -0700 Subject: [PATCH 07/90] Moved effects to a vector since we dont need the random access by slot --- zone/aa.cpp | 14 +++++++------- zone/aa_rank.h | 2 +- zone/aa_rank_effects.h | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index a66b533f6..c9fa78ab2 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -2120,10 +2120,10 @@ void Client::SendAlternateAdvancementRank(int aa_id, int level) { outapp->SetWritePosition(sizeof(AARankInfo_Struct)); for(auto effect : rank->effects) { - outapp->WriteSInt32(effect.second.effect_id); - outapp->WriteSInt32(effect.second.base1); - outapp->WriteSInt32(effect.second.base2); - outapp->WriteSInt32(effect.first); + outapp->WriteSInt32(effect.effect_id); + outapp->WriteSInt32(effect.base1); + outapp->WriteSInt32(effect.base2); + outapp->WriteSInt32(effect.slot); } for(auto prereq : rank->prereqs) { @@ -2361,17 +2361,17 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map 12) + if(effect.slot < 1 || effect.slot > 12) continue; if(ranks.count(rank_id) > 0) { AA::Rank *rank = ranks[rank_id].get(); - rank->effects[slot] = effect; + rank->effects.push_back(effect); } } } else { diff --git a/zone/aa_rank.h b/zone/aa_rank.h index d35582834..20628a506 100644 --- a/zone/aa_rank.h +++ b/zone/aa_rank.h @@ -47,7 +47,7 @@ public: uint32 account_time_required; int total_cost; Ability *base_ability; - std::unordered_map effects; + std::vector effects; std::vector prereqs; }; diff --git a/zone/aa_rank_effects.h b/zone/aa_rank_effects.h index fd65d507f..d68937078 100644 --- a/zone/aa_rank_effects.h +++ b/zone/aa_rank_effects.h @@ -27,6 +27,7 @@ namespace AA struct RankEffect { + int slot; int effect_id; int base1; int base2; From 1589169200d3c27cc2e76e5bb21ecaf672dc47fe Mon Sep 17 00:00:00 2001 From: KimLS Date: Wed, 10 Jun 2015 22:46:57 -0700 Subject: [PATCH 08/90] AAs should load from character data now, though will be fucked up if you already had stacked aas. --- common/eq_packet_structs.h | 2 +- common/patches/rof2.cpp | 3 +- common/patches/sod.cpp | 4 +- common/patches/sof.cpp | 4 +- common/patches/uf.cpp | 79 +- common/ptimer.h | 4 - zone/aa.cpp | 2025 +++++++++++++++------------------- zone/aa.h | 11 - zone/aa_rank.h | 1 + zone/attack.cpp | 63 +- zone/bonuses.cpp | 1533 +++++++++++++------------- zone/bot.cpp | 2126 ++++++++++++++++++------------------ zone/bot.h | 2 - zone/client.cpp | 52 +- zone/client.h | 14 +- zone/client_packet.cpp | 85 +- zone/command.cpp | 99 +- zone/exp.cpp | 2 +- zone/mob.h | 5 +- zone/net.cpp | 3 - zone/perl_client.cpp | 55 +- zone/spell_effects.cpp | 899 +++++++-------- zone/zone.cpp | 15 - zone/zone.h | 24 +- zone/zonedb.h | 13 +- 25 files changed, 3318 insertions(+), 3805 deletions(-) diff --git a/common/eq_packet_structs.h b/common/eq_packet_structs.h index 0c4335016..e562a94e5 100644 --- a/common/eq_packet_structs.h +++ b/common/eq_packet_structs.h @@ -4243,7 +4243,7 @@ struct AARankInfo_Struct int32 total_cost; int32 expansion; int32 category; - uint8 charges; + uint32 charges; uint8 grant_only; uint32 total_effects; uint32 total_prereqs; diff --git a/common/patches/rof2.cpp b/common/patches/rof2.cpp index 096467edf..a4f484a9e 100644 --- a/common/patches/rof2.cpp +++ b/common/patches/rof2.cpp @@ -2466,7 +2466,8 @@ namespace RoF2 outapp->WriteUInt32(emu->lastlogin); outapp->WriteUInt32(emu->timePlayedMin); outapp->WriteUInt32(emu->timeentitledonaccount); - outapp->WriteUInt32(0x0007ffff); // Expansion bitmask + outapp->WriteUInt32(emu->expansions); + //outapp->WriteUInt32(0x0007ffff); // Expansion bitmask outapp->WriteUInt32(structs::MAX_PP_LANGUAGE); diff --git a/common/patches/sod.cpp b/common/patches/sod.cpp index 80201da1e..69bb7f4c1 100644 --- a/common/patches/sod.cpp +++ b/common/patches/sod.cpp @@ -1677,8 +1677,8 @@ namespace SoD OUT(copper_bank); OUT(platinum_shared); // OUT(unknown13156[84]); - //OUT(expansions); - eq->expansions = 16383; + OUT(expansions); + //eq->expansions = 16383; // OUT(unknown13244[12]); OUT(autosplit); // OUT(unknown13260[16]); diff --git a/common/patches/sof.cpp b/common/patches/sof.cpp index 7b0e14c1c..2d8ec8d3a 100644 --- a/common/patches/sof.cpp +++ b/common/patches/sof.cpp @@ -1335,8 +1335,8 @@ namespace SoF OUT(copper_bank); OUT(platinum_shared); // OUT(unknown13156[84]); - //OUT(expansions); - eq->expansions = 16383; + OUT(expansions); + //eq->expansions = 16383; // OUT(unknown13244[12]); OUT(autosplit); // OUT(unknown13260[16]); diff --git a/common/patches/uf.cpp b/common/patches/uf.cpp index 81ad197d6..5b879af9d 100644 --- a/common/patches/uf.cpp +++ b/common/patches/uf.cpp @@ -1804,15 +1804,13 @@ namespace UF // OUT(unknown00224[48]); //NOTE: new client supports 300 AAs, our internal rep/PP //only supports 240.. - //for (r = 0; r < MAX_PP_AA_ARRAY; r++) { - // OUT(aa_array[r].AA); - // OUT(aa_array[r].value); - // OUT(aa_array[r].charges); - //} - // OUT(unknown02220[4]); + for (r = 0; r < MAX_PP_AA_ARRAY; r++) { + eq->aa_array[r].AA = emu->aa_array[r].AA; + eq->aa_array[r].value = emu->aa_array[r].value; + eq->aa_array[r].charges = emu->aa_array[r].charges; + } - eq->aa_array[0].AA = 6; - eq->aa_array[0].value = 5; + // OUT(unknown02220[4]); OUT(mana); OUT(cur_hp); @@ -1943,8 +1941,8 @@ namespace UF OUT(copper_bank); OUT(platinum_shared); // OUT(unknown13156[84]); - //OUT(expansions); - eq->expansions = 0xffff; + OUT(expansions); + //eq->expansions = 0x1ffff; // OUT(unknown13244[12]); OUT(autosplit); // OUT(unknown13260[16]); @@ -2149,7 +2147,6 @@ namespace UF ENCODE(OP_SendAATable) { -#if 1 EQApplicationPacket *inapp = *p; *p = nullptr; AARankInfo_Struct *emu = (AARankInfo_Struct*)inapp->pBuffer; @@ -2180,8 +2177,8 @@ namespace UF eq->last_id = emu->prev_id; eq->next_id = emu->next_id; eq->cost2 = emu->total_cost; - eq->grant_only = emu->grant_only > 0 ? true : false; - eq->expendable_charges = emu->charges ? 1 : 0; + eq->grant_only = emu->grant_only; + eq->expendable_charges = emu->charges; eq->aa_expansion = emu->expansion; eq->special_category = emu->category; eq->total_abilities = emu->total_effects; @@ -2194,65 +2191,13 @@ namespace UF } if(emu->total_prereqs > 0) { - eq->prereq_skill = -(int)inapp->ReadUInt32(); + eq->prereq_skill = inapp->ReadUInt32(); eq->prereq_minpoints = inapp->ReadUInt32(); } - Log.Out(Logs::General, Logs::Status, "%s", DumpPacketToString(outapp).c_str()); + //Log.Out(Logs::General, Logs::Status, "%s", DumpPacketToString(outapp).c_str()); dest->FastQueuePacket(&outapp); delete inapp; -#else - ENCODE_LENGTH_ATLEAST(SendAA_Struct); - SETUP_VAR_ENCODE(SendAA_Struct); - ALLOC_VAR_ENCODE(structs::SendAA_Struct, sizeof(structs::SendAA_Struct) + emu->total_abilities*sizeof(structs::AA_Ability)); - - // Check clientver field to verify this AA should be sent for SoF - // clientver 1 is for all clients and 6 is for Underfoot - if(emu->clientver <= 6) - { - OUT(id); - eq->unknown004 = 1; - //eq->hotkey_sid = (emu->hotkey_sid==4294967295UL)?0:(emu->id - emu->current_level + 1); - //eq->hotkey_sid2 = (emu->hotkey_sid2==4294967295UL)?0:(emu->id - emu->current_level + 1); - //eq->title_sid = emu->id - emu->current_level + 1; - //eq->desc_sid = emu->id - emu->current_level + 1; - eq->hotkey_sid = (emu->hotkey_sid == 4294967295UL) ? 0 : (emu->sof_next_skill); - eq->hotkey_sid2 = (emu->hotkey_sid2 == 4294967295UL) ? 0 : (emu->sof_next_skill); - eq->title_sid = emu->sof_next_skill; - eq->desc_sid = emu->sof_next_skill; - OUT(class_type); - OUT(cost); - OUT(seq); - OUT(current_level); - OUT(prereq_skill); - OUT(prereq_minpoints); - eq->type = emu->sof_type; - OUT(spellid); - OUT(spell_type); - OUT(spell_refresh); - OUT(classes); - //OUT(berserker); - //eq->max_level = emu->sof_max_level; - OUT(max_level); - OUT(last_id); - OUT(next_id); - OUT(cost2); - eq->aa_expansion = emu->aa_expansion; - eq->special_category = emu->special_category; - eq->expendable_charges = emu->special_category == 7 ? 1 : 0; // temp hack, this can actually be any number - OUT(total_abilities); - unsigned int r; - for(r = 0; r < emu->total_abilities; r++) { - OUT(abilities[r].skill_id); - OUT(abilities[r].base1); - OUT(abilities[r].base2); - OUT(abilities[r].slot); - } - } - - Log.Out(Logs::General, Logs::Status, "%s", DumpPacketToString(__packet).c_str()); - FINISH_ENCODE(); -#endif } ENCODE(OP_SendCharInfo) diff --git a/common/ptimer.h b/common/ptimer.h index 8a559a148..7194ab49b 100644 --- a/common/ptimer.h +++ b/common/ptimer.h @@ -139,8 +139,4 @@ protected: std::map _list; }; -//code prettying macros -#define AA_Choose3(val, v1, v2, v3) (val==1?v1:(val==2?v2:v3)) -#define AA_Choose5(val, v1, v2, v3, v4, v5) (val==1?v1:(val==2?v2:(val==3?v3:(val==4?v4:v5)))) - #endif diff --git a/zone/aa.cpp b/zone/aa.cpp index c9fa78ab2..4bbdf88a6 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -37,35 +37,28 @@ Copyright (C) 2001-2004 EQEMu Development Team (http://eqemulator.net) extern QueryServ* QServ; - -AA_DBAction AA_Actions[aaHighestID][MAX_AA_ACTION_RANKS]; //[aaid][rank] -std::mapaas_send; -std::map > aa_effects; //stores the effects from the aa_effects table in memory -std::map AARequiredLevelAndCost; - - int Client::GetAATimerID(aaID activate) { - SendAA_Struct* aa2 = zone->FindAA(activate); - - if(!aa2) - { - for(int i = 1;i < MAX_AA_ACTION_RANKS; ++i) - { - int a = activate - i; - - if(a <= 0) - break; - - aa2 = zone->FindAA(a); - - if(aa2 != nullptr) - break; - } - } - - if(aa2) - return aa2->spell_type; + //SendAA_Struct* aa2 = zone->FindAA(activate); + // + //if(!aa2) + //{ + // for(int i = 1;i < MAX_AA_ACTION_RANKS; ++i) + // { + // int a = activate - i; + // + // if(a <= 0) + // break; + // + // aa2 = zone->FindAA(a); + // + // if(aa2 != nullptr) + // break; + // } + //} + // + //if(aa2) + // return aa2->spell_type; return 0; } @@ -96,400 +89,400 @@ int Client::CalcAAReuseTimer(const AA_DBAction *caa) { } void Client::ActivateAA(aaID activate){ - if(activate < 0 || activate >= aaHighestID) - return; - if(IsStunned() || IsFeared() || IsMezzed() || IsSilenced() || IsPet() || IsSitting() || GetFeigned()) - return; - - int AATimerID = GetAATimerID(activate); - - SendAA_Struct* aa2 = nullptr; - aaID aaid = activate; - uint8 activate_val = GetAA(activate); - //this wasn't taking into acct multi tiered act talents before... - if(activate_val == 0){ - aa2 = zone->FindAA(activate); - if(!aa2){ - int i; - int a; - for(i=1;iFindAA(a); - if(aa2 != nullptr) - break; - } - } - if(aa2){ - aaid = (aaID) aa2->id; - activate_val = GetAA(aa2->id); - } - } - - if (activate_val == 0){ - return; - } - - if(aa2) - { - if(aa2->account_time_required) - { - if((Timer::GetTimeSeconds() + account_creation) < aa2->account_time_required) - { - return; - } - } - } - - if(!p_timers.Expired(&database, AATimerID + pTimerAAStart)) - { - uint32 aaremain = p_timers.GetRemainingTime(AATimerID + pTimerAAStart); - uint32 aaremain_hr = aaremain / (60 * 60); - uint32 aaremain_min = (aaremain / 60) % 60; - uint32 aaremain_sec = aaremain % 60; - - if(aa2) { - if (aaremain_hr >= 1) //1 hour or more - Message(13, "You can use the ability %s again in %u hour(s) %u minute(s) %u seconds", - aa2->name, aaremain_hr, aaremain_min, aaremain_sec); - else //less than an hour - Message(13, "You can use the ability %s again in %u minute(s) %u seconds", - aa2->name, aaremain_min, aaremain_sec); - } else { - if (aaremain_hr >= 1) //1 hour or more - Message(13, "You can use this ability again in %u hour(s) %u minute(s) %u seconds", - aaremain_hr, aaremain_min, aaremain_sec); - else //less than an hour - Message(13, "You can use this ability again in %u minute(s) %u seconds", - aaremain_min, aaremain_sec); - } - return; - } - - if(activate_val > MAX_AA_ACTION_RANKS) - activate_val = MAX_AA_ACTION_RANKS; - activate_val--; //to get array index. - - //get our current node, now that the indices are well bounded - const AA_DBAction *caa = &AA_Actions[aaid][activate_val]; - - if((aaid == aaImprovedHarmTouch || aaid == aaLeechTouch) && !p_timers.Expired(&database, pTimerHarmTouch)){ - Message(13,"Ability recovery time not yet met."); - return; - } - - //everything should be configured out now - - uint16 target_id = 0; - - //figure out our target - switch(caa->target) { - case aaTargetUser: - case aaTargetGroup: - target_id = GetID(); - break; - case aaTargetCurrent: - case aaTargetCurrentGroup: - if(GetTarget() == nullptr) { - Message_StringID(MT_DefaultText, AA_NO_TARGET); //You must first select a target for this ability! - p_timers.Clear(&database, AATimerID + pTimerAAStart); - return; - } - target_id = GetTarget()->GetID(); - break; - case aaTargetPet: - if(GetPet() == nullptr) { - Message(0, "A pet is required for this skill."); - return; - } - target_id = GetPetID(); - break; - } - - //handle non-spell action - if(caa->action != aaActionNone) { - if(caa->mana_cost > 0) { - if(GetMana() < caa->mana_cost) { - Message_StringID(13, INSUFFICIENT_MANA); - return; - } - SetMana(GetMana() - caa->mana_cost); - } - if(caa->reuse_time > 0) - { - uint32 timer_base = CalcAAReuseTimer(caa); - if(activate == aaImprovedHarmTouch || activate == aaLeechTouch) - { - p_timers.Start(pTimerHarmTouch, HarmTouchReuseTime); - } - p_timers.Start(AATimerID + pTimerAAStart, timer_base); - SendAATimer(AATimerID, 0, 0); - } - HandleAAAction(aaid); - } - - //cast the spell, if we have one - if(caa->spell_id > 0 && caa->spell_id < SPDAT_RECORDS) { - - if(caa->reuse_time > 0) - { - uint32 timer_base = CalcAAReuseTimer(caa); - SendAATimer(AATimerID, 0, 0); - p_timers.Start(AATimerID + pTimerAAStart, timer_base); - if(activate == aaImprovedHarmTouch || activate == aaLeechTouch) - { - p_timers.Start(pTimerHarmTouch, HarmTouchReuseTime); - } - // Bards can cast instant cast AAs while they are casting another song - if (spells[caa->spell_id].cast_time == 0 && GetClass() == BARD && IsBardSong(casting_spell_id)) { - if(!SpellFinished(caa->spell_id, entity_list.GetMob(target_id), 10, -1, -1, spells[caa->spell_id].ResistDiff, false)) { - //Reset on failed cast - SendAATimer(AATimerID, 0, 0xFFFFFF); - Message_StringID(15,ABILITY_FAILED); - p_timers.Clear(&database, AATimerID + pTimerAAStart); - return; - } - } else { - if (!CastSpell(caa->spell_id, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, AATimerID + pTimerAAStart, timer_base, 1)) { - //Reset on failed cast - SendAATimer(AATimerID, 0, 0xFFFFFF); - Message_StringID(15,ABILITY_FAILED); - p_timers.Clear(&database, AATimerID + pTimerAAStart); - return; - } - } - } - else - { - if(!CastSpell(caa->spell_id, target_id)) - return; - } - } - // Check if AA is expendable - if (aas_send[activate - activate_val]->special_category == 7) { - - // Add the AA cost to the extended profile to track overall total - m_epp.expended_aa += aas_send[activate]->cost; - - SetAA(activate, 0); - - SaveAA(); /* Save Character AA */ - SendAA(activate); - SendAATable(); - } +// if(activate < 0 || activate >= aaHighestID) +// return; +// if(IsStunned() || IsFeared() || IsMezzed() || IsSilenced() || IsPet() || IsSitting() || GetFeigned()) +// return; +// +// int AATimerID = GetAATimerID(activate); +// +// SendAA_Struct* aa2 = nullptr; +// aaID aaid = activate; +// uint8 activate_val = GetAA(activate); +// //this wasn't taking into acct multi tiered act talents before... +// if(activate_val == 0){ +// aa2 = zone->FindAA(activate); +// if(!aa2){ +// int i; +// int a; +// for(i=1;iFindAA(a); +// if(aa2 != nullptr) +// break; +// } +// } +// if(aa2){ +// aaid = (aaID) aa2->id; +// activate_val = GetAA(aa2->id); +// } +// } +// +// if (activate_val == 0){ +// return; +// } +// +// if(aa2) +// { +// if(aa2->account_time_required) +// { +// if((Timer::GetTimeSeconds() + account_creation) < aa2->account_time_required) +// { +// return; +// } +// } +// } +// +// if(!p_timers.Expired(&database, AATimerID + pTimerAAStart)) +// { +// uint32 aaremain = p_timers.GetRemainingTime(AATimerID + pTimerAAStart); +// uint32 aaremain_hr = aaremain / (60 * 60); +// uint32 aaremain_min = (aaremain / 60) % 60; +// uint32 aaremain_sec = aaremain % 60; +// +// if(aa2) { +// if (aaremain_hr >= 1) //1 hour or more +// Message(13, "You can use the ability %s again in %u hour(s) %u minute(s) %u seconds", +// aa2->name, aaremain_hr, aaremain_min, aaremain_sec); +// else //less than an hour +// Message(13, "You can use the ability %s again in %u minute(s) %u seconds", +// aa2->name, aaremain_min, aaremain_sec); +// } else { +// if (aaremain_hr >= 1) //1 hour or more +// Message(13, "You can use this ability again in %u hour(s) %u minute(s) %u seconds", +// aaremain_hr, aaremain_min, aaremain_sec); +// else //less than an hour +// Message(13, "You can use this ability again in %u minute(s) %u seconds", +// aaremain_min, aaremain_sec); +// } +// return; +// } +// +// if(activate_val > MAX_AA_ACTION_RANKS) +// activate_val = MAX_AA_ACTION_RANKS; +// activate_val--; //to get array index. +// +// //get our current node, now that the indices are well bounded +// const AA_DBAction *caa = &AA_Actions[aaid][activate_val]; +// +// if((aaid == aaImprovedHarmTouch || aaid == aaLeechTouch) && !p_timers.Expired(&database, pTimerHarmTouch)){ +// Message(13,"Ability recovery time not yet met."); +// return; +// } +// +// //everything should be configured out now +// +// uint16 target_id = 0; +// +// //figure out our target +// switch(caa->target) { +// case aaTargetUser: +// case aaTargetGroup: +// target_id = GetID(); +// break; +// case aaTargetCurrent: +// case aaTargetCurrentGroup: +// if(GetTarget() == nullptr) { +// Message_StringID(MT_DefaultText, AA_NO_TARGET); //You must first select a target for this ability! +// p_timers.Clear(&database, AATimerID + pTimerAAStart); +// return; +// } +// target_id = GetTarget()->GetID(); +// break; +// case aaTargetPet: +// if(GetPet() == nullptr) { +// Message(0, "A pet is required for this skill."); +// return; +// } +// target_id = GetPetID(); +// break; +// } +// +// //handle non-spell action +// if(caa->action != aaActionNone) { +// if(caa->mana_cost > 0) { +// if(GetMana() < caa->mana_cost) { +// Message_StringID(13, INSUFFICIENT_MANA); +// return; +// } +// SetMana(GetMana() - caa->mana_cost); +// } +// if(caa->reuse_time > 0) +// { +// uint32 timer_base = CalcAAReuseTimer(caa); +// if(activate == aaImprovedHarmTouch || activate == aaLeechTouch) +// { +// p_timers.Start(pTimerHarmTouch, HarmTouchReuseTime); +// } +// p_timers.Start(AATimerID + pTimerAAStart, timer_base); +// SendAATimer(AATimerID, 0, 0); +// } +// HandleAAAction(aaid); +// } +// +// //cast the spell, if we have one +// if(caa->spell_id > 0 && caa->spell_id < SPDAT_RECORDS) { +// +// if(caa->reuse_time > 0) +// { +// uint32 timer_base = CalcAAReuseTimer(caa); +// SendAATimer(AATimerID, 0, 0); +// p_timers.Start(AATimerID + pTimerAAStart, timer_base); +// if(activate == aaImprovedHarmTouch || activate == aaLeechTouch) +// { +// p_timers.Start(pTimerHarmTouch, HarmTouchReuseTime); +// } +// // Bards can cast instant cast AAs while they are casting another song +// if (spells[caa->spell_id].cast_time == 0 && GetClass() == BARD && IsBardSong(casting_spell_id)) { +// if(!SpellFinished(caa->spell_id, entity_list.GetMob(target_id), 10, -1, -1, spells[caa->spell_id].ResistDiff, false)) { +// //Reset on failed cast +// SendAATimer(AATimerID, 0, 0xFFFFFF); +// Message_StringID(15,ABILITY_FAILED); +// p_timers.Clear(&database, AATimerID + pTimerAAStart); +// return; +// } +// } else { +// if (!CastSpell(caa->spell_id, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, AATimerID + pTimerAAStart, timer_base, 1)) { +// //Reset on failed cast +// SendAATimer(AATimerID, 0, 0xFFFFFF); +// Message_StringID(15,ABILITY_FAILED); +// p_timers.Clear(&database, AATimerID + pTimerAAStart); +// return; +// } +// } +// } +// else +// { +// if(!CastSpell(caa->spell_id, target_id)) +// return; +// } +// } +// // Check if AA is expendable +// if (aas_send[activate - activate_val]->special_category == 7) { +// +// // Add the AA cost to the extended profile to track overall total +// m_epp.expended_aa += aas_send[activate]->cost; +// +// SetAA(activate, 0); +// +// SaveAA(); /* Save Character AA */ +// SendAA(activate); +// SendAATable(); +// } } void Client::HandleAAAction(aaID activate) { - if(activate < 0 || activate >= aaHighestID) - return; - - uint8 activate_val = GetAA(activate); - - if (activate_val == 0) - return; - - if(activate_val > MAX_AA_ACTION_RANKS) - activate_val = MAX_AA_ACTION_RANKS; - activate_val--; //to get array index. - - //get our current node, now that the indices are well bounded - const AA_DBAction *caa = &AA_Actions[activate][activate_val]; - - uint16 timer_id = 0; - uint16 timer_duration = caa->duration; - aaTargetType target = aaTargetUser; - - uint16 spell_id = SPELL_UNKNOWN; //gets cast at the end if not still unknown - - switch(caa->action) { - case aaActionAETaunt: - entity_list.AETaunt(this); - break; - - case aaActionFlamingArrows: - //toggle it - if(CheckAAEffect(aaEffectFlamingArrows)) - EnableAAEffect(aaEffectFlamingArrows); - else - DisableAAEffect(aaEffectFlamingArrows); - break; - - case aaActionFrostArrows: - if(CheckAAEffect(aaEffectFrostArrows)) - EnableAAEffect(aaEffectFrostArrows); - else - DisableAAEffect(aaEffectFrostArrows); - break; - - case aaActionRampage: - EnableAAEffect(aaEffectRampage, 10); - break; - - case aaActionSharedHealth: - if(CheckAAEffect(aaEffectSharedHealth)) - EnableAAEffect(aaEffectSharedHealth); - else - DisableAAEffect(aaEffectSharedHealth); - break; - - case aaActionCelestialRegen: { - //special because spell_id depends on a different AA - switch (GetAA(aaCelestialRenewal)) { - case 1: - spell_id = 3250; - break; - case 2: - spell_id = 3251; - break; - default: - spell_id = 2740; - break; - } - target = aaTargetCurrent; - break; - } - - case aaActionDireCharm: { - //special because spell_id depends on class - switch (GetClass()) - { - case DRUID: - spell_id = 2760; //2644? - break; - case NECROMANCER: - spell_id = 2759; //2643? - break; - case ENCHANTER: - spell_id = 2761; //2642? - break; - } - target = aaTargetCurrent; - break; - } - - case aaActionImprovedFamiliar: { - //Spell IDs might be wrong... - if (GetAA(aaAllegiantFamiliar)) - spell_id = 3264; //1994? - else - spell_id = 2758; //2155? - break; - } - - case aaActionActOfValor: - if(GetTarget() != nullptr) { - int curhp = GetTarget()->GetHP(); - target = aaTargetCurrent; - GetTarget()->HealDamage(curhp, this); - Death(this, 0, SPELL_UNKNOWN, SkillHandtoHand); - } - break; - - case aaActionSuspendedMinion: - if (GetPet()) { - target = aaTargetPet; - switch (GetAA(aaSuspendedMinion)) { - case 1: - spell_id = 3248; - break; - case 2: - spell_id = 3249; - break; - } - //do we really need to cast a spell? - - Message(0,"You call your pet to your side."); - GetPet()->WipeHateList(); - GetPet()->GMMove(GetX(),GetY(),GetZ()); - if (activate_val > 1) - entity_list.ClearFeignAggro(GetPet()); - } else { - Message(0,"You have no pet to call."); - } - break; - - case aaActionEscape: - Escape(); - break; - - // Don't think this code is used any longer for Bestial Alignment as the aa.has a spell_id and no nonspell_action. - case aaActionBeastialAlignment: - switch(GetBaseRace()) { - case BARBARIAN: - spell_id = AA_Choose3(activate_val, 4521, 4522, 4523); - break; - case TROLL: - spell_id = AA_Choose3(activate_val, 4524, 4525, 4526); - break; - case OGRE: - spell_id = AA_Choose3(activate_val, 4527, 4527, 4529); - break; - case IKSAR: - spell_id = AA_Choose3(activate_val, 4530, 4531, 4532); - break; - case VAHSHIR: - spell_id = AA_Choose3(activate_val, 4533, 4534, 4535); - break; - } - - case aaActionLeechTouch: - target = aaTargetCurrent; - spell_id = SPELL_HARM_TOUCH2; - EnableAAEffect(aaEffectLeechTouch, 1000); - break; - - case aaActionFadingMemories: - // Do nothing since spell effect works correctly, but mana isn't used. - break; - - default: - Log.Out(Logs::General, Logs::Error, "Unknown AA nonspell action type %d", caa->action); - return; - } - - - uint16 target_id = 0; - //figure out our target - switch(target) { - case aaTargetUser: - case aaTargetGroup: - target_id = GetID(); - break; - case aaTargetCurrent: - case aaTargetCurrentGroup: - if(GetTarget() == nullptr) { - Message_StringID(MT_DefaultText, AA_NO_TARGET); //You must first select a target for this ability! - p_timers.Clear(&database, timer_id + pTimerAAEffectStart); - return; - } - target_id = GetTarget()->GetID(); - break; - case aaTargetPet: - if(GetPet() == nullptr) { - Message(0, "A pet is required for this skill."); - return; - } - target_id = GetPetID(); - break; - } - - //cast the spell, if we have one - if(IsValidSpell(spell_id)) { - int aatid = GetAATimerID(activate); - if (!CastSpell(spell_id, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, pTimerAAStart + aatid, CalcAAReuseTimer(caa), 1)) { - SendAATimer(aatid, 0, 0xFFFFFF); - Message_StringID(15,ABILITY_FAILED); - p_timers.Clear(&database, pTimerAAStart + aatid); - return; - } - } - - //handle the duration timer if we have one. - if(timer_id > 0 && timer_duration > 0) { - p_timers.Start(pTimerAAEffectStart + timer_id, timer_duration); - } +// if(activate < 0 || activate >= aaHighestID) +// return; +// +// uint8 activate_val = GetAA(activate); +// +// if (activate_val == 0) +// return; +// +// if(activate_val > MAX_AA_ACTION_RANKS) +// activate_val = MAX_AA_ACTION_RANKS; +// activate_val--; //to get array index. +// +// //get our current node, now that the indices are well bounded +// const AA_DBAction *caa = &AA_Actions[activate][activate_val]; +// +// uint16 timer_id = 0; +// uint16 timer_duration = caa->duration; +// aaTargetType target = aaTargetUser; +// +// uint16 spell_id = SPELL_UNKNOWN; //gets cast at the end if not still unknown +// +// switch(caa->action) { +// case aaActionAETaunt: +// entity_list.AETaunt(this); +// break; +// +// case aaActionFlamingArrows: +// //toggle it +// if(CheckAAEffect(aaEffectFlamingArrows)) +// EnableAAEffect(aaEffectFlamingArrows); +// else +// DisableAAEffect(aaEffectFlamingArrows); +// break; +// +// case aaActionFrostArrows: +// if(CheckAAEffect(aaEffectFrostArrows)) +// EnableAAEffect(aaEffectFrostArrows); +// else +// DisableAAEffect(aaEffectFrostArrows); +// break; +// +// case aaActionRampage: +// EnableAAEffect(aaEffectRampage, 10); +// break; +// +// case aaActionSharedHealth: +// if(CheckAAEffect(aaEffectSharedHealth)) +// EnableAAEffect(aaEffectSharedHealth); +// else +// DisableAAEffect(aaEffectSharedHealth); +// break; +// +// case aaActionCelestialRegen: { +// //special because spell_id depends on a different AA +// switch (GetAA(aaCelestialRenewal)) { +// case 1: +// spell_id = 3250; +// break; +// case 2: +// spell_id = 3251; +// break; +// default: +// spell_id = 2740; +// break; +// } +// target = aaTargetCurrent; +// break; +// } +// +// case aaActionDireCharm: { +// //special because spell_id depends on class +// switch (GetClass()) +// { +// case DRUID: +// spell_id = 2760; //2644? +// break; +// case NECROMANCER: +// spell_id = 2759; //2643? +// break; +// case ENCHANTER: +// spell_id = 2761; //2642? +// break; +// } +// target = aaTargetCurrent; +// break; +// } +// +// case aaActionImprovedFamiliar: { +// //Spell IDs might be wrong... +// if (GetAA(aaAllegiantFamiliar)) +// spell_id = 3264; //1994? +// else +// spell_id = 2758; //2155? +// break; +// } +// +// case aaActionActOfValor: +// if(GetTarget() != nullptr) { +// int curhp = GetTarget()->GetHP(); +// target = aaTargetCurrent; +// GetTarget()->HealDamage(curhp, this); +// Death(this, 0, SPELL_UNKNOWN, SkillHandtoHand); +// } +// break; +// +// case aaActionSuspendedMinion: +// if (GetPet()) { +// target = aaTargetPet; +// switch (GetAA(aaSuspendedMinion)) { +// case 1: +// spell_id = 3248; +// break; +// case 2: +// spell_id = 3249; +// break; +// } +// //do we really need to cast a spell? +// +// Message(0,"You call your pet to your side."); +// GetPet()->WipeHateList(); +// GetPet()->GMMove(GetX(),GetY(),GetZ()); +// if (activate_val > 1) +// entity_list.ClearFeignAggro(GetPet()); +// } else { +// Message(0,"You have no pet to call."); +// } +// break; +// +// case aaActionEscape: +// Escape(); +// break; +// +// // Don't think this code is used any longer for Bestial Alignment as the aa.has a spell_id and no nonspell_action. +// case aaActionBeastialAlignment: +// switch(GetBaseRace()) { +// case BARBARIAN: +// spell_id = AA_Choose3(activate_val, 4521, 4522, 4523); +// break; +// case TROLL: +// spell_id = AA_Choose3(activate_val, 4524, 4525, 4526); +// break; +// case OGRE: +// spell_id = AA_Choose3(activate_val, 4527, 4527, 4529); +// break; +// case IKSAR: +// spell_id = AA_Choose3(activate_val, 4530, 4531, 4532); +// break; +// case VAHSHIR: +// spell_id = AA_Choose3(activate_val, 4533, 4534, 4535); +// break; +// } +// +// case aaActionLeechTouch: +// target = aaTargetCurrent; +// spell_id = SPELL_HARM_TOUCH2; +// EnableAAEffect(aaEffectLeechTouch, 1000); +// break; +// +// case aaActionFadingMemories: +// // Do nothing since spell effect works correctly, but mana isn't used. +// break; +// +// default: +// Log.Out(Logs::General, Logs::Error, "Unknown AA nonspell action type %d", caa->action); +// return; +// } +// +// +// uint16 target_id = 0; +// //figure out our target +// switch(target) { +// case aaTargetUser: +// case aaTargetGroup: +// target_id = GetID(); +// break; +// case aaTargetCurrent: +// case aaTargetCurrentGroup: +// if(GetTarget() == nullptr) { +// Message_StringID(MT_DefaultText, AA_NO_TARGET); //You must first select a target for this ability! +// p_timers.Clear(&database, timer_id + pTimerAAEffectStart); +// return; +// } +// target_id = GetTarget()->GetID(); +// break; +// case aaTargetPet: +// if(GetPet() == nullptr) { +// Message(0, "A pet is required for this skill."); +// return; +// } +// target_id = GetPetID(); +// break; +// } +// +// //cast the spell, if we have one +// if(IsValidSpell(spell_id)) { +// int aatid = GetAATimerID(activate); +// if (!CastSpell(spell_id, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, pTimerAAStart + aatid, CalcAAReuseTimer(caa), 1)) { +// SendAATimer(aatid, 0, 0xFFFFFF); +// Message_StringID(15,ABILITY_FAILED); +// p_timers.Clear(&database, pTimerAAStart + aatid); +// return; +// } +// } +// +// //handle the duration timer if we have one. +// if(timer_id > 0 && timer_duration > 0) { +// p_timers.Start(pTimerAAEffectStart + timer_id, timer_duration); +// } } void Mob::TemporaryPets(uint16 spell_id, Mob *targ, const char *name_override, uint32 duration_override, bool followme, bool sticktarg) { @@ -937,130 +930,119 @@ bool Client::CheckAAEffect(aaEffectType type) { return(false); } -void Client::SendAAStats() { - EQApplicationPacket* outapp = new EQApplicationPacket(OP_AAExpUpdate, sizeof(AltAdvStats_Struct)); - AltAdvStats_Struct *aps = (AltAdvStats_Struct *)outapp->pBuffer; - aps->experience = m_pp.expAA; - aps->experience = (uint32)(((float)330.0f * (float)m_pp.expAA) / (float)max_AAXP); - aps->unspent = m_pp.aapoints; - aps->percentage = m_epp.perAA; - QueuePacket(outapp); - safe_delete(outapp); -} - void Client::BuyAA(AA_Action* action) { - Log.Out(Logs::Detail, Logs::AA, "Starting to buy AA %d", action->ability); - - //find the AA information from the database - SendAA_Struct* aa2 = zone->FindAA(action->ability); - if(!aa2) { - //hunt for a lower level... - int i; - int a; - for(i=1;iability - i; - if(a <= 0) - break; - Log.Out(Logs::Detail, Logs::AA, "Could not find AA %d, trying potential parent %d", action->ability, a); - aa2 = zone->FindAA(a); - if(aa2 != nullptr) - break; - } - } - if(aa2 == nullptr) - return; //invalid ability... - - if(aa2->special_category == 1 || aa2->special_category == 2) - return; // Not purchasable progression style AAs - - if(aa2->special_category == 8 && aa2->cost == 0) - return; // Not purchasable racial AAs(set a cost to make them purchasable) - - uint32 cur_level = GetAA(aa2->id); - if((aa2->id + cur_level) != action->ability) { //got invalid AA - Log.Out(Logs::Detail, Logs::AA, "Unable to find or match AA %d (found %d + lvl %d)", action->ability, aa2->id, cur_level); - return; - } - - if(aa2->account_time_required) - { - if((Timer::GetTimeSeconds() - account_creation) < aa2->account_time_required) - { - return; - } - } - - uint32 real_cost; - uint8 req_level; - std::map::iterator RequiredLevel = AARequiredLevelAndCost.find(action->ability); - - if(RequiredLevel != AARequiredLevelAndCost.end()) { - real_cost = RequiredLevel->second.Cost; - req_level = RequiredLevel->second.Level; - } - else { - real_cost = aa2->cost + (aa2->cost_inc * cur_level); - req_level = aa2->class_type + (aa2->level_inc * cur_level); - } - - if (req_level > GetLevel()) - return; //Cheater trying to Buy AA... - - if (m_pp.aapoints >= real_cost && cur_level < aa2->max_level) { - SetAA(aa2->id, cur_level + 1); - - Log.Out(Logs::Detail, Logs::AA, "Set AA %d to level %d", aa2->id, cur_level + 1); - - m_pp.aapoints -= real_cost; - - /* Do Player Profile rank calculations and set player profile */ - SaveAA(); - /* Save to Database to avoid having to write the whole AA array to the profile, only write changes*/ - // database.SaveCharacterAA(this->CharacterID(), aa2->id, (cur_level + 1)); - - if ((RuleB(AA, Stacking) && (GetClientVersionBit() >= 4) && (aa2->hotkey_sid == 4294967295u)) - && ((aa2->max_level == (cur_level + 1)) && aa2->sof_next_id)){ - SendAA(aa2->id); - SendAA(aa2->sof_next_id); - } - else - SendAA(aa2->id); - - SendAATable(); - - /* - We are building these messages ourself instead of using the stringID to work around patch discrepencies - these are AA_GAIN_ABILITY (410) & AA_IMPROVE (411), respectively, in both Titanium & SoF. not sure about 6.2 - */ - - /* Initial purchase of an AA ability */ - if (cur_level < 1){ - Message(15, "You have gained the ability \"%s\" at a cost of %d ability %s.", aa2->name, real_cost, (real_cost>1) ? "points" : "point"); - - /* QS: Player_Log_AA_Purchases */ - if (RuleB(QueryServ, PlayerLogAAPurchases)){ - std::string event_desc = StringFormat("Initial AA Purchase :: aa_name:%s aa_id:%i at cost:%i in zoneid:%i instid:%i", aa2->name, aa2->id, real_cost, this->GetZoneID(), this->GetInstanceID()); - QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); - } - } - /* Ranked purchase of an AA ability */ - else{ - Message(15, "You have improved %s %d at a cost of %d ability %s.", aa2->name, cur_level + 1, real_cost, (real_cost > 1) ? "points" : "point"); - - /* QS: Player_Log_AA_Purchases */ - if (RuleB(QueryServ, PlayerLogAAPurchases)){ - std::string event_desc = StringFormat("Ranked AA Purchase :: aa_name:%s aa_id:%i at cost:%i in zoneid:%i instid:%i", aa2->name, aa2->id, real_cost, this->GetZoneID(), this->GetInstanceID()); - QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); - } - } - - SendAAStats(); - - CalcBonuses(); - if(title_manager.IsNewAATitleAvailable(m_pp.aapoints_spent, GetBaseClass())) - NotifyNewTitlesAvailable(); - } + //Log.Out(Logs::Detail, Logs::AA, "Starting to buy AA %d", action->ability); + // + ////find the AA information from the database + //SendAA_Struct* aa2 = zone->FindAA(action->ability); + ////if(!aa2) { + //// //hunt for a lower level... + //// int i; + //// int a; + //// for(i=1;iability - i; + //// if(a <= 0) + //// break; + //// Log.Out(Logs::Detail, Logs::AA, "Could not find AA %d, trying potential parent %d", action->ability, a); + //// aa2 = zone->FindAA(a); + //// if(aa2 != nullptr) + //// break; + //// } + ////} + //if(aa2 == nullptr) + // return; //invalid ability... + // + //if(aa2->special_category == 1 || aa2->special_category == 2) + // return; // Not purchasable progression style AAs + // + //if(aa2->special_category == 8 && aa2->cost == 0) + // return; // Not purchasable racial AAs(set a cost to make them purchasable) + // + //uint32 cur_level = GetAA(aa2->id); + //if((aa2->id + cur_level) != action->ability) { //got invalid AA + // Log.Out(Logs::Detail, Logs::AA, "Unable to find or match AA %d (found %d + lvl %d)", action->ability, aa2->id, cur_level); + // return; + //} + // + //if(aa2->account_time_required) + //{ + // if((Timer::GetTimeSeconds() - account_creation) < aa2->account_time_required) + // { + // return; + // } + //} + // + //uint32 real_cost; + //uint8 req_level; + ////std::map::iterator RequiredLevel = AARequiredLevelAndCost.find(action->ability); + //// + ////if(RequiredLevel != AARequiredLevelAndCost.end()) { + //// real_cost = RequiredLevel->second.Cost; + //// req_level = RequiredLevel->second.Level; + ////} + ////else { + //// real_cost = aa2->cost + (aa2->cost_inc * cur_level); + //// req_level = aa2->class_type + (aa2->level_inc * cur_level); + ////} + // + //if (req_level > GetLevel()) + // return; //Cheater trying to Buy AA... + // + //if (m_pp.aapoints >= real_cost && cur_level < aa2->max_level) { + // SetAA(aa2->id, cur_level + 1); + // + // Log.Out(Logs::Detail, Logs::AA, "Set AA %d to level %d", aa2->id, cur_level + 1); + // + // m_pp.aapoints -= real_cost; + // + // /* Do Player Profile rank calculations and set player profile */ + // SaveAA(); + // /* Save to Database to avoid having to write the whole AA array to the profile, only write changes*/ + // // database.SaveCharacterAA(this->CharacterID(), aa2->id, (cur_level + 1)); + // + // if ((RuleB(AA, Stacking) && (GetClientVersionBit() >= 4) && (aa2->hotkey_sid == 4294967295u)) + // && ((aa2->max_level == (cur_level + 1)) && aa2->sof_next_id)){ + // SendAA(aa2->id); + // SendAA(aa2->sof_next_id); + // } + // else + // SendAA(aa2->id); + // + // SendAATable(); + // + // /* + // We are building these messages ourself instead of using the stringID to work around patch discrepencies + // these are AA_GAIN_ABILITY (410) & AA_IMPROVE (411), respectively, in both Titanium & SoF. not sure about 6.2 + // */ + // + // /* Initial purchase of an AA ability */ + // if (cur_level < 1){ + // Message(15, "You have gained the ability \"%s\" at a cost of %d ability %s.", aa2->name, real_cost, (real_cost>1) ? "points" : "point"); + // + // /* QS: Player_Log_AA_Purchases */ + // if (RuleB(QueryServ, PlayerLogAAPurchases)){ + // std::string event_desc = StringFormat("Initial AA Purchase :: aa_name:%s aa_id:%i at cost:%i in zoneid:%i instid:%i", aa2->name, aa2->id, real_cost, this->GetZoneID(), this->GetInstanceID()); + // QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); + // } + // } + // /* Ranked purchase of an AA ability */ + // else{ + // Message(15, "You have improved %s %d at a cost of %d ability %s.", aa2->name, cur_level + 1, real_cost, (real_cost > 1) ? "points" : "point"); + // + // /* QS: Player_Log_AA_Purchases */ + // if (RuleB(QueryServ, PlayerLogAAPurchases)){ + // std::string event_desc = StringFormat("Ranked AA Purchase :: aa_name:%s aa_id:%i at cost:%i in zoneid:%i instid:%i", aa2->name, aa2->id, real_cost, this->GetZoneID(), this->GetInstanceID()); + // QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); + // } + // } + // + // //SendAAStats(); + // + // CalcBonuses(); + // if(title_manager.IsNewAATitleAvailable(m_pp.aapoints_spent, GetBaseClass())) + // NotifyNewTitlesAvailable(); + //} } void Client::SendAATimer(uint32 ability, uint32 begin, uint32 end) { @@ -1096,114 +1078,50 @@ void Client::SendAATimers() { safe_delete(outapp); } -void Client::SendAATable() { - //Log.Out(Logs::General, Logs::Status, "SendAATable()"); - //EQApplicationPacket* outapp = new EQApplicationPacket(OP_RespondAA, sizeof(AATable_Struct)); - // - //AATable_Struct* aa2 = (AATable_Struct *)outapp->pBuffer; - //aa2->aa_spent = 10; - //aa2->aa_list[0].AA = 6; - //aa2->aa_list[0].value = 4; - //aa2->aa_list[0].charges = 0; - //aa2->aa_list[1].AA = 11; - //aa2->aa_list[1].value = 4; - //aa2->aa_list[1].charges = 0; - // - ////aa2->aa_spent = GetAAPointsSpent(); - //// - ////uint32 i; - ////for(i=0;i < MAX_PP_AA_ARRAY;i++){ - //// aa2->aa_list[i].AA = aa[i]->value ? aa[i]->AA : 0; // bit of a hack to prevent expendables punching a hole - //// aa2->aa_list[i].value = aa[i]->value; - //// aa2->aa_list[i].charges = aa[i]->charges; - ////} - //QueuePacket(outapp); - //safe_delete(outapp); -} - void Client::SendPreviousAA(uint32 id, int seq){ - Log.Out(Logs::General, Logs::Status, "SendPreviousAA(%u, %i)", id, seq); - uint32 value=0; - SendAA_Struct* saa2 = nullptr; - if(id==0) - saa2 = zone->GetAABySequence(seq); - else - saa2 = zone->FindAA(id); - if(!saa2) - return; - int size=sizeof(SendAA_Struct)+sizeof(AA_Ability)*saa2->total_abilities; - uchar* buffer = new uchar[size]; - SendAA_Struct* saa=(SendAA_Struct*)buffer; - value = GetAA(saa2->id); - EQApplicationPacket* outapp = new EQApplicationPacket(OP_SendAATable); - outapp->size=size; - outapp->pBuffer=(uchar*)saa; - value--; - memcpy(saa,saa2,size); - - if(value>0){ - if(saa->spellid==0) - saa->spellid=0xFFFFFFFF; - saa->id+=value; - saa->next_id=saa->id+1; - if(value==1) - saa->last_id=saa2->id; - else - saa->last_id=saa->id-1; - saa->current_level=value+1; - saa->cost2 = 0; //cost 2 is what the client uses to calc how many points we've spent, so we have to add up the points in order - for(uint32 i = 0; i < (value+1); i++) { - saa->cost2 += saa->cost + (saa->cost_inc * i); - } - } - - database.FillAAEffects(saa); - Log.Out(Logs::General, Logs::Status, "%s", DumpPacketToString(outapp).c_str()); - QueuePacket(outapp); - safe_delete(outapp); } void Client::SendAA(uint32 id, int seq) { - Log.Out(Logs::General, Logs::Status, "SendAA(%u, %i)", id, seq); - - uint32 value=0; - SendAA_Struct* saa2 = nullptr; - SendAA_Struct* qaa = nullptr; - SendAA_Struct* saa_pp = nullptr; - bool IsBaseLevel = true; - bool aa_stack = false; - - if(id==0) - saa2 = zone->GetAABySequence(seq); - else - saa2 = zone->FindAA(id); - if(!saa2) - return; - - uint16 classes = saa2->classes; - if(!(classes & (1 << GetClass())) && (GetClass()!=BERSERKER || saa2->berserker==0)){ - return; - } - - if(saa2->account_time_required) - { - if((Timer::GetTimeSeconds() - account_creation) < saa2->account_time_required) - { - return; - } - } - - // Hide Quest/Progression AAs unless player has been granted the first level using $client->IncrementAA(skill_id). - if (saa2->special_category == 1 || saa2->special_category == 2 ) { - if(GetAA(saa2->id) == 0) - return; - // For Quest line AA(demiplane AEs) where only 1 is visible at a time, check to make sure only the highest level obtained is shown - if(saa2->aa_expansion > 0) { - qaa = zone->FindAA(saa2->id+1); - if(qaa && (saa2->aa_expansion == qaa->aa_expansion) && GetAA(qaa->id) > 0) - return; - } - } + //Log.Out(Logs::General, Logs::Status, "SendAA(%u, %i)", id, seq); + // + //uint32 value=0; + //SendAA_Struct* saa2 = nullptr; + //SendAA_Struct* qaa = nullptr; + //SendAA_Struct* saa_pp = nullptr; + //bool IsBaseLevel = true; + //bool aa_stack = false; + // + //if(id==0) + // saa2 = zone->GetAABySequence(seq); + //else + // saa2 = zone->FindAA(id); + //if(!saa2) + // return; + // + //uint16 classes = saa2->classes; + //if(!(classes & (1 << GetClass())) && (GetClass()!=BERSERKER || saa2->berserker==0)){ + // return; + //} + // + //if(saa2->account_time_required) + //{ + // if((Timer::GetTimeSeconds() - account_creation) < saa2->account_time_required) + // { + // return; + // } + //} + // + //// Hide Quest/Progression AAs unless player has been granted the first level using $client->IncrementAA(skill_id). + //if (saa2->special_category == 1 || saa2->special_category == 2 ) { + // if(GetAA(saa2->id) == 0) + // return; + // // For Quest line AA(demiplane AEs) where only 1 is visible at a time, check to make sure only the highest level obtained is shown + // if(saa2->aa_expansion > 0) { + // qaa = zone->FindAA(saa2->id+1); + // if(qaa && (saa2->aa_expansion == qaa->aa_expansion) && GetAA(qaa->id) > 0) + // return; + // } + //} /* Beginning of Shroud AAs, these categories are for Passive and Active Shroud AAs Eventually with a toggle we could have it show player list or shroud list @@ -1211,250 +1129,182 @@ void Client::SendAA(uint32 id, int seq) { return; */ // Check for racial/Drakkin blood line AAs - if (saa2->special_category == 8) - { - uint32 client_race = this->GetBaseRace(); - - // Drakkin Bloodlines - if (saa2->aa_expansion > 522) - { - if (client_race != 522) - return; // Check for Drakkin Race - - int heritage = this->GetDrakkinHeritage() + 523; // 523 = Drakkin Race(522) + Bloodline - - if (heritage != saa2->aa_expansion) - return; - } - // Racial AAs - else if (client_race != saa2->aa_expansion) - { - return; - } - } - - /* - AA stacking on SoF+ clients. - - Note: There were many ways to achieve this effect - The method used proved to be the most straight forward and consistent. - Stacking does not currently work ideally for AA's that use hotkeys, therefore they will be excluded at this time. - - TODO: Problem with aa.hotkeys - When you reach max rank of an AA tier (ie 5/5), it automatically displays the next AA in - the series and you can not transfer the hotkey to the next AA series. To the best of the my ability and through many - different variations of coding I could not find an ideal solution to this issue. - - How stacking works: - Utilizes two new fields: sof_next_id (which is the next id in the series), sof_current_level (ranks the AA's as the current level) - 1) If no AA's purchased only display the base levels of each AA series. - 2) When you purchase an AA and its rank is maxed it sends the packet for the completed AA, and the packet - for the next aa in the series. The previous tier is removed from your window, and the new AA is displayed. - 3) When you zone/buy your player profile will be checked and determine what AA can be displayed base on what you have already. - */ - - if (RuleB(AA, Stacking) && (GetClientVersionBit() >= 4) && (saa2->hotkey_sid == 4294967295u)) - aa_stack = true; - - //if (aa_stack){ - // uint32 aa_AA = 0; - // uint32 aa_value = 0; - // for (int i = 0; i < MAX_PP_AA_ARRAY; i++) { - // if (aa[i]) { - // aa_AA = aa[i]->AA; - // aa_value = aa[i]->value; + //if (saa2->special_category == 8) + //{ + // uint32 client_race = this->GetBaseRace(); // - // if (aa_AA){ + // // Drakkin Bloodlines + // if (saa2->aa_expansion > 522) + // { + // if (client_race != 522) + // return; // Check for Drakkin Race // - // if (aa_value > 0) - // aa_AA -= aa_value-1; + // int heritage = this->GetDrakkinHeritage() + 523; // 523 = Drakkin Race(522) + Bloodline // - // saa_pp = zone->FindAA(aa_AA); - // - // if (saa_pp){ - // - // if (saa_pp->sof_next_skill == saa2->sof_next_skill){ - // - // if (saa_pp->id == saa2->id) - // break; //You already have this in the player profile. - // else if ((saa_pp->sof_current_level < saa2->sof_current_level) && (aa_value < saa_pp->max_level)) - // return; //DISABLE DISPLAY HIGHER - You have not reached max level yet of your current AA. - // else if ((saa_pp->sof_current_level < saa2->sof_current_level) && (aa_value == saa_pp->max_level) && (saa_pp->sof_next_id == saa2->id)) - // IsBaseLevel = false; //ALLOW DISPLAY HIGHER - // } - // } - // } - // } + // if (heritage != saa2->aa_expansion) + // return; + // } + // // Racial AAs + // else if (client_race != saa2->aa_expansion) + // { + // return; // } //} - - //Hide higher tiers of multi tiered AA's if the base level is not fully purchased. - if (aa_stack && IsBaseLevel && saa2->sof_current_level > 0) - return; - - int size=sizeof(SendAA_Struct)+sizeof(AA_Ability)*saa2->total_abilities; - - if(size == 0) - return; - - uchar* buffer = new uchar[size]; - SendAA_Struct* saa=(SendAA_Struct*)buffer; - memcpy(saa,saa2,size); - - if(saa->spellid==0) - saa->spellid=0xFFFFFFFF; - - value=GetAA(saa->id); - uint32 orig_val = value; - - if(value && saa->id){ - - if(value < saa->max_level){ - saa->id+=value; - saa->next_id=saa->id+1; - value++; - } - - else if (aa_stack && saa->sof_next_id){ - saa->id+=value-1; - saa->next_id=saa->sof_next_id; - - //Prevent removal of previous AA from window if next AA belongs to a higher client version. - SendAA_Struct* saa_next = nullptr; - saa_next = zone->FindAA(saa->sof_next_id); - - // this check should work as long as we continue to just add the clients and just increase - // each number .... - if (saa_next && static_cast(GetClientVersion()) < saa_next->clientver - 1) { - saa->next_id=0xFFFFFFFF; - } - } - - else{ - saa->id+=value-1; - saa->next_id=0xFFFFFFFF; - } - - uint32 current_level_mod = 0; - if (aa_stack) - current_level_mod = saa->sof_current_level; - - saa->last_id=saa->id-1; - saa->current_level=value+(current_level_mod); - saa->cost = saa2->cost + (saa2->cost_inc*(value-1)); - saa->cost2 = 0; - for(uint32 i = 0; i < value; i++) { - saa->cost2 += saa2->cost + (saa2->cost_inc * i); - } - saa->class_type = saa2->class_type + (saa2->level_inc*(value-1)); - } - - if (aa_stack){ - - if (saa->sof_current_level >= 1 && value == 0) - saa->current_level = saa->sof_current_level+1; - - saa->max_level = saa->sof_max_level; - } - - database.FillAAEffects(saa); - - if(value > 0) - { - // AA_Action stores the base ID - const AA_DBAction *caa = &AA_Actions[saa->id - value + 1][value - 1]; - - if(caa && caa->reuse_time > 0) - saa->spell_refresh = CalcAAReuseTimer(caa); - } - - //You can now use the level_inc field in the altadv_vars table to accomplish this, though still needed - //for special cases like LOH/HT due to inability to implement correct stacking of AA's that use hotkeys. - std::map::iterator RequiredLevel = AARequiredLevelAndCost.find(saa->id); - - if(RequiredLevel != AARequiredLevelAndCost.end()) - { - saa->class_type = RequiredLevel->second.Level; - saa->cost = RequiredLevel->second.Cost; - } - - - EQApplicationPacket* outapp = new EQApplicationPacket(OP_SendAATable); - outapp->size=size; - outapp->pBuffer=(uchar*)saa; - - if(id==0 && value && (orig_val < saa->max_level)) //send previous AA only on zone in - SendPreviousAA(id, seq); - - QueuePacket(outapp); - safe_delete(outapp); - //will outapp delete the buffer for us even though it didnt make it? --- Yes, it should -} - -void Client::SendAAList(){ - Log.Out(Logs::General, Logs::Status, "SendAAList()"); - int total = zone->GetTotalAAs(); - - total = total > 2 ? 2 : total; - for(int i=0;i < total;i++){ - SendAA(0,i); - } -} - -SendAA_Struct* Zone::FindAA(uint32 id) { - return aas_send[id]; -} - -void Zone::LoadAAs() { - Log.Out(Logs::General, Logs::Status, "Loading AA information..."); - totalAAs = database.CountAAs(); - if(totalAAs == 0) { - Log.Out(Logs::General, Logs::Error, "Failed to load AAs!"); - aas = nullptr; - return; - } - aas = new SendAA_Struct *[totalAAs]; - - database.LoadAAs(aas); - - int i; - for(i=0; i < totalAAs; i++){ - SendAA_Struct* aa = aas[i]; - aas_send[aa->id] = aa; - } - - //load AA Effects into aa_effects - Log.Out(Logs::General, Logs::Status, "Loading AA Effects..."); - if (database.LoadAAEffects2()) - Log.Out(Logs::General, Logs::Status, "Loaded %d AA Effects.", aa_effects.size()); - else - Log.Out(Logs::General, Logs::Error, "Failed to load AA Effects!"); -} - -bool ZoneDatabase::LoadAAEffects2() { - aa_effects.clear(); //start fresh - - const std::string query = "SELECT aaid, slot, effectid, base1, base2 FROM aa_effects ORDER BY aaid ASC, slot ASC"; - auto results = QueryDatabase(query); - if (!results.Success()) { - return false; - } - - if (!results.RowCount()) { //no results - return false; - } - - for(auto row = results.begin(); row != results.end(); ++row) { - int aaid = atoi(row[0]); - int slot = atoi(row[1]); - int effectid = atoi(row[2]); - int base1 = atoi(row[3]); - int base2 = atoi(row[4]); - aa_effects[aaid][slot].skill_id = effectid; - aa_effects[aaid][slot].base1 = base1; - aa_effects[aaid][slot].base2 = base2; - aa_effects[aaid][slot].slot = slot; //not really needed, but we'll populate it just in case - } - - return true; + // + ///* + //AA stacking on SoF+ clients. + // + //Note: There were many ways to achieve this effect - The method used proved to be the most straight forward and consistent. + //Stacking does not currently work ideally for AA's that use hotkeys, therefore they will be excluded at this time. + // + //TODO: Problem with aa.hotkeys - When you reach max rank of an AA tier (ie 5/5), it automatically displays the next AA in + //the series and you can not transfer the hotkey to the next AA series. To the best of the my ability and through many + //different variations of coding I could not find an ideal solution to this issue. + // + //How stacking works: + //Utilizes two new fields: sof_next_id (which is the next id in the series), sof_current_level (ranks the AA's as the current level) + //1) If no AA's purchased only display the base levels of each AA series. + //2) When you purchase an AA and its rank is maxed it sends the packet for the completed AA, and the packet + //for the next aa in the series. The previous tier is removed from your window, and the new AA is displayed. + //3) When you zone/buy your player profile will be checked and determine what AA can be displayed base on what you have already. + //*/ + // + //if (RuleB(AA, Stacking) && (GetClientVersionBit() >= 4) && (saa2->hotkey_sid == 4294967295u)) + // aa_stack = true; + // + ////if (aa_stack){ + //// uint32 aa_AA = 0; + //// uint32 aa_value = 0; + //// for (int i = 0; i < MAX_PP_AA_ARRAY; i++) { + //// if (aa[i]) { + //// aa_AA = aa[i]->AA; + //// aa_value = aa[i]->value; + //// + //// if (aa_AA){ + //// + //// if (aa_value > 0) + //// aa_AA -= aa_value-1; + //// + //// saa_pp = zone->FindAA(aa_AA); + //// + //// if (saa_pp){ + //// + //// if (saa_pp->sof_next_skill == saa2->sof_next_skill){ + //// + //// if (saa_pp->id == saa2->id) + //// break; //You already have this in the player profile. + //// else if ((saa_pp->sof_current_level < saa2->sof_current_level) && (aa_value < saa_pp->max_level)) + //// return; //DISABLE DISPLAY HIGHER - You have not reached max level yet of your current AA. + //// else if ((saa_pp->sof_current_level < saa2->sof_current_level) && (aa_value == saa_pp->max_level) && (saa_pp->sof_next_id == saa2->id)) + //// IsBaseLevel = false; //ALLOW DISPLAY HIGHER + //// } + //// } + //// } + //// } + //// } + ////} + // + ////Hide higher tiers of multi tiered AA's if the base level is not fully purchased. + //if (aa_stack && IsBaseLevel && saa2->sof_current_level > 0) + // return; + // + //int size=sizeof(SendAA_Struct)+sizeof(AA_Ability)*saa2->total_abilities; + // + //if(size == 0) + // return; + // + //uchar* buffer = new uchar[size]; + //SendAA_Struct* saa=(SendAA_Struct*)buffer; + //memcpy(saa,saa2,size); + // + //if(saa->spellid==0) + // saa->spellid=0xFFFFFFFF; + // + //value=GetAA(saa->id); + //uint32 orig_val = value; + // + //if(value && saa->id){ + // + // if(value < saa->max_level){ + // saa->id+=value; + // saa->next_id=saa->id+1; + // value++; + // } + // + // else if (aa_stack && saa->sof_next_id){ + // saa->id+=value-1; + // saa->next_id=saa->sof_next_id; + // + // //Prevent removal of previous AA from window if next AA belongs to a higher client version. + // SendAA_Struct* saa_next = nullptr; + // saa_next = zone->FindAA(saa->sof_next_id); + // + // // this check should work as long as we continue to just add the clients and just increase + // // each number .... + // if (saa_next && static_cast(GetClientVersion()) < saa_next->clientver - 1) { + // saa->next_id=0xFFFFFFFF; + // } + // } + // + // else{ + // saa->id+=value-1; + // saa->next_id=0xFFFFFFFF; + // } + // + // uint32 current_level_mod = 0; + // if (aa_stack) + // current_level_mod = saa->sof_current_level; + // + // saa->last_id=saa->id-1; + // saa->current_level=value+(current_level_mod); + // saa->cost = saa2->cost + (saa2->cost_inc*(value-1)); + // saa->cost2 = 0; + // for(uint32 i = 0; i < value; i++) { + // saa->cost2 += saa2->cost + (saa2->cost_inc * i); + // } + // saa->class_type = saa2->class_type + (saa2->level_inc*(value-1)); + //} + // + //if (aa_stack){ + // + // if (saa->sof_current_level >= 1 && value == 0) + // saa->current_level = saa->sof_current_level+1; + // + // saa->max_level = saa->sof_max_level; + //} + // + ////database.FillAAEffects(saa); + // + ////if(value > 0) + ////{ + //// // AA_Action stores the base ID + //// const AA_DBAction *caa = &AA_Actions[saa->id - value + 1][value - 1]; + //// + //// if(caa && caa->reuse_time > 0) + //// saa->spell_refresh = CalcAAReuseTimer(caa); + ////} + // + ////You can now use the level_inc field in the altadv_vars table to accomplish this, though still needed + ////for special cases like LOH/HT due to inability to implement correct stacking of AA's that use hotkeys. + ////std::map::iterator RequiredLevel = AARequiredLevelAndCost.find(saa->id); + //// + ////if(RequiredLevel != AARequiredLevelAndCost.end()) + ////{ + //// saa->class_type = RequiredLevel->second.Level; + //// saa->cost = RequiredLevel->second.Cost; + ////} + // + // + //EQApplicationPacket* outapp = new EQApplicationPacket(OP_SendAATable); + //outapp->size=size; + //outapp->pBuffer=(uchar*)saa; + // + //if(id==0 && value && (orig_val < saa->max_level)) //send previous AA only on zone in + // SendPreviousAA(id, seq); + // + //QueuePacket(outapp); + //safe_delete(outapp); + ////will outapp delete the buffer for us even though it didnt make it? --- Yes, it should } void Client::ResetAA(){ @@ -1768,262 +1618,6 @@ void Client::InspectBuffs(Client* Inspector, int Rank) Inspector->FastQueuePacket(&outapp); } -//this really need to be renamed to LoadAAActions() -bool ZoneDatabase::LoadAAEffects() { - memset(AA_Actions, 0, sizeof(AA_Actions)); //I hope the compiler is smart about this size... - - const std::string query = "SELECT aaid, rank, reuse_time, spell_id, target, " - "nonspell_action, nonspell_mana, nonspell_duration, " - "redux_aa, redux_rate, redux_aa2, redux_rate2 FROM aa_actions"; - auto results = QueryDatabase(query); - if (!results.Success()) { - return false; - } - - for (auto row = results.begin(); row != results.end(); ++row) { - - int aaid = atoi(row[0]); - int rank = atoi(row[1]); - if(aaid < 0 || aaid >= aaHighestID || rank < 0 || rank >= MAX_AA_ACTION_RANKS) - continue; - AA_DBAction *caction = &AA_Actions[aaid][rank]; - - caction->reuse_time = atoi(row[2]); - caction->spell_id = atoi(row[3]); - caction->target = (aaTargetType) atoi(row[4]); - caction->action = (aaNonspellAction) atoi(row[5]); - caction->mana_cost = atoi(row[6]); - caction->duration = atoi(row[7]); - caction->redux_aa = (aaID) atoi(row[8]); - caction->redux_rate = atoi(row[9]); - caction->redux_aa2 = (aaID) atoi(row[10]); - caction->redux_rate2 = atoi(row[11]); - - } - - return true; -} - -//Returns the number effects an aa.has when we send them to the client -//For the purposes of sizing a packet because every skill does not -//have the same number effects, they can range from none to a few depending on AA. -//counts the # of effects by counting the different slots of an AAID in the DB. - -//AndMetal: this may now be obsolete since we have Zone::GetTotalAALevels() -uint8 ZoneDatabase::GetTotalAALevels(uint32 skill_id) { - - std::string query = StringFormat("SELECT count(slot) FROM aa_effects WHERE aaid = %i", skill_id); - auto results = QueryDatabase(query); - if (!results.Success()) { - return 0; - } - - if (results.RowCount() != 1) - return 0; - - auto row = results.begin(); - - return atoi(row[0]); -} - -//this will allow us to count the number of effects for an AA by pulling the info from memory instead of the database. hopefully this will same some CPU cycles -uint8 Zone::GetTotalAALevels(uint32 skill_id) { - size_t sz = aa_effects[skill_id].size(); - return sz >= 255 ? 255 : static_cast(sz); -} - -/* -Every AA can send the client effects, which are purely for client side effects. -Essentially it's like being able to attach a very simple version of a spell to -Any given AA, it has 4 fields: -skill_id = spell effect id -slot = ID slot, doesn't appear to have any impact on stacking like real spells, just needs to be unique. -base1 = the base field of a spell -base2 = base field 2 of a spell, most AAs do not utilize this -example: - skill_id = SE_STA - slot = 1 - base1 = 15 - This would if you filled the abilities struct with this make the client show if it had - that AA an additional 15 stamina on the client's stats -*/ -void ZoneDatabase::FillAAEffects(SendAA_Struct* aa_struct){ - if(!aa_struct) - return; - - auto it = aa_effects.find(aa_struct->id); - if (it != aa_effects.end()) { - for (uint32 slot = 0; slot < aa_struct->total_abilities; slot++) { - // aa_effects is a map of a map, so the slot reference does not start at 0 - aa_struct->abilities[slot].skill_id = it->second[slot + 1].skill_id; - aa_struct->abilities[slot].base1 = it->second[slot + 1].base1; - aa_struct->abilities[slot].base2 = it->second[slot + 1].base2; - aa_struct->abilities[slot].slot = it->second[slot + 1].slot; - } - } -} - -uint32 ZoneDatabase::CountAAs(){ - - const std::string query = "SELECT count(title_sid) FROM altadv_vars"; - auto results = QueryDatabase(query); - if (!results.Success()) { - return 0; - } - - if (results.RowCount() != 1) - return 0; - - auto row = results.begin(); - - return atoi(row[0]);; -} - -uint32 ZoneDatabase::CountAAEffects() { - - const std::string query = "SELECT count(id) FROM aa_effects"; - auto results = QueryDatabase(query); - if (!results.Success()) { - return 0; - } - - if (results.RowCount() != 1) - return 0; - - auto row = results.begin(); - - return atoi(row[0]); -} - -uint32 ZoneDatabase::GetSizeAA(){ - int size=CountAAs()*sizeof(SendAA_Struct); - if(size>0) - size+=CountAAEffects()*sizeof(AA_Ability); - return size; -} - -void ZoneDatabase::LoadAAs(SendAA_Struct **load){ - if(!load) - return; - - std::string query = "SELECT skill_id FROM altadv_vars ORDER BY skill_id"; - auto results = QueryDatabase(query); - if (results.Success()) { - int skill = 0, index = 0; - for (auto row = results.begin(); row != results.end(); ++row, ++index) { - skill = atoi(row[0]); - load[index] = GetAASkillVars(skill); - load[index]->seq = index+1; - } - } else { - } - - AARequiredLevelAndCost.clear(); - query = "SELECT skill_id, level, cost from aa_required_level_cost order by skill_id"; - results = QueryDatabase(query); - if (!results.Success()) { - return; - } - - AALevelCost_Struct aalcs; - for (auto row = results.begin(); row != results.end(); ++row) { - aalcs.Level = atoi(row[1]); - aalcs.Cost = atoi(row[2]); - AARequiredLevelAndCost[atoi(row[0])] = aalcs; - } -} - -SendAA_Struct* ZoneDatabase::GetAASkillVars(uint32 skill_id) -{ - std::string query = "SET @row = 0"; //initialize "row" variable in database for next query - auto results = QueryDatabase(query); - if (!results.Success()) { - return nullptr; - } - - query = StringFormat("SELECT a.cost, a.max_level, a.hotkey_sid, a.hotkey_sid2, a.title_sid, a.desc_sid, a.type, " - "COALESCE(" //So we can return 0 if it's null. - "(" // this is our derived table that has the row # - // that we can SELECT from, because the client is stupid. - "SELECT p.prereq_index_num " - "FROM (SELECT a2.skill_id, @row := @row + 1 AS prereq_index_num " - "FROM altadv_vars a2) AS p " - "WHERE p.skill_id = a.prereq_skill), 0) " - "AS prereq_skill_index, a.prereq_minpoints, a.spell_type, a.spell_refresh, a.classes, " - "a.berserker, a.spellid, a.class_type, a.name, a.cost_inc, a.aa_expansion, a.special_category, " - "a.sof_type, a.sof_cost_inc, a.sof_max_level, a.sof_next_skill, " - "a.clientver, " // Client Version 0 = None, 1 = All, 2 = Titanium/6.2, 4 = SoF 5 = SOD 6 = UF - "a.account_time_required, a.sof_current_level, a.sof_next_id, a.level_inc " - "FROM altadv_vars a WHERE skill_id=%i", skill_id); - results = QueryDatabase(query); - if (!results.Success()) { - return nullptr; - } - - if (results.RowCount() != 1) - return nullptr; - - int total_abilities = GetTotalAALevels(skill_id); //eventually we'll want to use zone->GetTotalAALevels(skill_id) since it should save queries to the DB - int totalsize = total_abilities * sizeof(AA_Ability) + sizeof(SendAA_Struct); - - SendAA_Struct* sendaa = nullptr; - uchar* buffer; - - buffer = new uchar[totalsize]; - memset(buffer,0,totalsize); - sendaa = (SendAA_Struct*)buffer; - - auto row = results.begin(); - - //ATOI IS NOT UNSIGNED LONG-SAFE!!! - - sendaa->cost = atoul(row[0]); - sendaa->cost2 = sendaa->cost; - sendaa->max_level = atoul(row[1]); - sendaa->hotkey_sid = atoul(row[2]); - sendaa->id = skill_id; - sendaa->hotkey_sid2 = atoul(row[3]); - sendaa->title_sid = atoul(row[4]); - sendaa->desc_sid = atoul(row[5]); - sendaa->type = atoul(row[6]); - sendaa->prereq_skill = atoul(row[7]); - sendaa->prereq_minpoints = atoul(row[8]); - sendaa->spell_type = atoul(row[9]); - sendaa->spell_refresh = atoul(row[10]); - sendaa->classes = static_cast(atoul(row[11])); - sendaa->berserker = static_cast(atoul(row[12])); - sendaa->last_id = 0xFFFFFFFF; - sendaa->current_level=1; - sendaa->spellid = atoul(row[13]); - sendaa->class_type = atoul(row[14]); - strcpy(sendaa->name,row[15]); - - sendaa->total_abilities=total_abilities; - if(sendaa->max_level > 1) - sendaa->next_id=skill_id+1; - else - sendaa->next_id=0xFFFFFFFF; - - sendaa->cost_inc = atoi(row[16]); - - // Begin SoF Specific/Adjusted AA Fields - sendaa->aa_expansion = atoul(row[17]); - sendaa->special_category = atoul(row[18]); - sendaa->sof_type = atoul(row[19]); - sendaa->sof_cost_inc = atoi(row[20]); - sendaa->sof_max_level = atoul(row[21]); - sendaa->sof_next_skill = atoul(row[22]); - sendaa->clientver = atoul(row[23]); - sendaa->account_time_required = atoul(row[24]); - - //Internal use only - not sent to client - sendaa->sof_current_level = atoul(row[25]); - sendaa->sof_next_id = atoul(row[26]); - sendaa->level_inc = static_cast(atoul(row[27])); - - return sendaa; -} - void Client::DurationRampage(uint32 duration) { if(duration) { @@ -2032,6 +1626,56 @@ void Client::DurationRampage(uint32 duration) } } +void Client::RefundAA() { +// int cur = 0; +// bool refunded = false; +// +// for(int x = 0; x < aaHighestID; x++) { +// cur = GetAA(x); +// if(cur > 0){ +// SendAA_Struct* curaa = zone->FindAA(x); +// if(cur){ +// SetAA(x, 0); +// for(int j = 0; j < cur; j++) { +// m_pp.aapoints += curaa->cost + (curaa->cost_inc * j); +// refunded = true; +// } +// } +// else +// { +// m_pp.aapoints += cur; +// SetAA(x, 0); +// refunded = true; +// } +// } +// } +// +// if(refunded) { +// SaveAA(); +// Save(); +// // Kick(); +// } +} + +void Client::IncrementAA(int aa_id) { + //SendAA_Struct* aa2 = zone->FindAA(aa_id); + // + //if(aa2 == nullptr) + // return; + // + //if(GetAA(aa_id) == aa2->max_level) + // return; + // + //SetAA(aa_id, GetAA(aa_id) + 1); + // + //SaveAA(); + // + //SendAA(aa_id); + //SendAATable(); + //SendAAStats(); + //CalcBonuses(); +} + AA_SwarmPetInfo::AA_SwarmPetInfo() { target = 0; @@ -2119,14 +1763,14 @@ void Client::SendAlternateAdvancementRank(int aa_id, int level) { aai->total_prereqs = rank->prereqs.size(); outapp->SetWritePosition(sizeof(AARankInfo_Struct)); - for(auto effect : rank->effects) { + for(auto &effect : rank->effects) { outapp->WriteSInt32(effect.effect_id); outapp->WriteSInt32(effect.base1); outapp->WriteSInt32(effect.base2); outapp->WriteSInt32(effect.slot); } - for(auto prereq : rank->prereqs) { + for(auto &prereq : rank->prereqs) { outapp->WriteSInt32(prereq.aa_id); outapp->WriteSInt32(prereq.points); } @@ -2135,6 +1779,72 @@ void Client::SendAlternateAdvancementRank(int aa_id, int level) { safe_delete(outapp); } +void Client::SendAlternateAdvancementStats() { + EQApplicationPacket* outapp = new EQApplicationPacket(OP_AAExpUpdate, sizeof(AltAdvStats_Struct)); + AltAdvStats_Struct *aps = (AltAdvStats_Struct *)outapp->pBuffer; + aps->experience = m_pp.expAA; + aps->experience = (uint32)(((float)330.0f * (float)m_pp.expAA) / (float)max_AAXP); + aps->unspent = m_pp.aapoints; + aps->percentage = m_epp.perAA; + QueuePacket(outapp); + safe_delete(outapp); +} + +void Client::SendAlternateAdvancementPoints() { + EQApplicationPacket* outapp = new EQApplicationPacket(OP_RespondAA, sizeof(AATable_Struct)); + AATable_Struct* aa2 = (AATable_Struct *)outapp->pBuffer; + + int i = 0; + for(auto &aa : zone->aa_abilities) { + auto ranks = GetAA(aa.second->first_rank_id); + if(ranks) { + AA::Rank *rank = aa.second->GetRankByPointsSpent(ranks); + if(rank) { + aa2->aa_list[i].AA = rank->id; + aa2->aa_list[i].value = ranks; + aa2->aa_list[i].charges = 0; // todo send charges + i++; + } + } + } + + + aa2->aa_spent = GetAAPointsSpent(); + QueuePacket(outapp); + safe_delete(outapp); +} + +void Client::PurchaseAlternateAdvancementRank(int rank_id) { +} + +bool ZoneDatabase::LoadAlternateAdvancement(Client *c) { + c->ClearAAs(); + std::string query = StringFormat( + "SELECT " + "aa_id, " + "aa_value, " + "charges " + "FROM " + "`character_alternate_abilities` " + "WHERE `id` = %u ORDER BY `slot`", c->CharacterID()); + MySQLRequestResult results = database.QueryDatabase(query); + + int i = 0; + for(auto row = results.begin(); row != results.end(); ++row) { + uint32 aa = atoi(row[0]); + uint32 value = atoi(row[1]); + uint32 charges = atoi(row[2]); + + c->GetPP().aa_array[i].AA = aa; + c->GetPP().aa_array[i].value = value; + c->GetPP().aa_array[i].charges = charges; + c->SetAA(aa, value, charges); + i++; + } + + return true; +} + AA::Ability *Zone::GetAlternateAdvancementAbility(int id) { auto iter = aa_abilities.find(id); if(iter != aa_abilities.end()) { @@ -2170,13 +1880,13 @@ uint32 Mob::GetAA(uint32 rank_id) const { auto iter = aa_ranks.find(ability->id); if(iter != aa_ranks.end()) { - return iter->second; + return iter->second.first; } } return 0; } -bool Mob::SetAA(uint32 rank_id, uint32 new_value) { +bool Mob::SetAA(uint32 rank_id, uint32 new_value, uint32 charges) { if(zone) { AA::Ability *ability = zone->GetAlternateAdvancementAbilityByRank(rank_id); @@ -2188,10 +1898,10 @@ bool Mob::SetAA(uint32 rank_id, uint32 new_value) { return false; } - aa_ranks[ability->id] = new_value; + aa_ranks[ability->id] = std::make_pair(new_value, charges); } - return false; + return true; } @@ -2201,6 +1911,14 @@ bool Mob::CanUseAlternateAdvancementRank(AA::Rank *rank) { if(!ability) return false; + if(!ability->classes & (1 << GetClass())) { + return false; + } + + if(!(RuleI(World, ExpansionSettings) & (1 << rank->expansion))) { + return false; + } + // Passive and Active Shroud AAs // For now we skip them if(ability->category == 3 || ability->category == 4) { @@ -2247,7 +1965,15 @@ bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank) { return false; } - //check other stuff like price later + //check that we have previous rank already + if(rank->prev) { + //rank->prev-> + } + + //check prereqs + + //check price + return true; } @@ -2268,10 +1994,12 @@ void Zone::LoadAlternateAdvancement() { //process these ranks AA::Rank *current = ability.second->first; + int i = 1; while(current) { current->prev = GetAlternateAdvancementRank(current->prev_id); current->next = GetAlternateAdvancementRank(current->next_id); current->base_ability = ability.second.get(); + current->current_value = i; if(current->prev) { current->total_cost = current->cost + current->prev->total_cost; @@ -2280,6 +2008,7 @@ void Zone::LoadAlternateAdvancement() { current->total_cost = current->cost; } + i++; current = current->next; } @@ -2366,7 +2095,7 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map 12) + if(effect.slot < 1) continue; if(ranks.count(rank_id) > 0) { @@ -2389,7 +2118,7 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map 0) { AA::Rank *rank = ranks[rank_id].get(); diff --git a/zone/aa.h b/zone/aa.h index ad41fc3ae..54d495e6e 100644 --- a/zone/aa.h +++ b/zone/aa.h @@ -2137,17 +2137,6 @@ struct AALevelCost_Struct uint32 Cost; }; -//assumes that no activatable aa.has more than 5 ranks -#define MAX_AA_ACTION_RANKS 20 -extern AA_DBAction AA_Actions[aaHighestID][MAX_AA_ACTION_RANKS]; //[aaid][rank] -extern std::map AA_SwarmPets; //key=spell_id - -#define AA_Choose3(val, v1, v2, v3) (val==1?v1:(val==2?v2:v3)) - -extern std::mapaas_send; -extern std::map > aa_effects; -extern std::map AARequiredLevelAndCost; - enum { //values of AA_Action.action aaActionActivate = 0, aaActionSetEXP = 1, diff --git a/zone/aa_rank.h b/zone/aa_rank.h index 20628a506..a824f2c82 100644 --- a/zone/aa_rank.h +++ b/zone/aa_rank.h @@ -43,6 +43,7 @@ public: Rank *prev; int next_id; Rank *next; + int current_value; int expansion; uint32 account_time_required; int total_cost; diff --git a/zone/attack.cpp b/zone/attack.cpp index a229f197e..74cb33272 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -4659,38 +4659,39 @@ void Mob::TrySkillProc(Mob *on, uint16 skill, uint16 ReuseTime, bool Success, ui proc_spell_id = 0; ProcMod = 0; - std::map >::const_iterator find_iter = aa_effects.find(aaid); - if(find_iter == aa_effects.end()) - break; + //old AA + //std::map >::const_iterator find_iter = aa_effects.find(aaid); + //if(find_iter == aa_effects.end()) + // break; - for (std::map::const_iterator iter = aa_effects[aaid].begin(); iter != aa_effects[aaid].end(); ++iter) { - effect = iter->second.skill_id; - base1 = iter->second.base1; - base2 = iter->second.base2; - slot = iter->second.slot; - - if (effect == SE_SkillProc || effect == SE_SkillProcSuccess) { - proc_spell_id = base1; - ProcMod = static_cast(base2); - } - - else if (effect == SE_LimitToSkill && base1 <= HIGHEST_SKILL) { - - if (CanProc && base1 == skill && IsValidSpell(proc_spell_id)) { - float final_chance = chance * (ProcMod / 100.0f); - - if (zone->random.Roll(final_chance)) { - ExecWeaponProc(nullptr, proc_spell_id, on); - CanProc = false; - break; - } - } - } - else { - proc_spell_id = 0; - ProcMod = 0; - } - } + //for (std::map::const_iterator iter = aa_effects[aaid].begin(); iter != aa_effects[aaid].end(); ++iter) { + // effect = iter->second.skill_id; + // base1 = iter->second.base1; + // base2 = iter->second.base2; + // slot = iter->second.slot; + // + // if (effect == SE_SkillProc || effect == SE_SkillProcSuccess) { + // proc_spell_id = base1; + // ProcMod = static_cast(base2); + // } + // + // else if (effect == SE_LimitToSkill && base1 <= HIGHEST_SKILL) { + // + // if (CanProc && base1 == skill && IsValidSpell(proc_spell_id)) { + // float final_chance = chance * (ProcMod / 100.0f); + // + // if (zone->random.Roll(final_chance)) { + // ExecWeaponProc(nullptr, proc_spell_id, on); + // CanProc = false; + // break; + // } + // } + // } + // else { + // proc_spell_id = 0; + // ProcMod = 0; + // } + //} } } } diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index a2a180cef..437befe11 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -671,772 +671,773 @@ void Client::ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon) int32 base2 = 0; //only really used for SE_RaiseStatCap & SE_ReduceSkillTimer in aa_effects table uint32 slot = 0; - std::map >::const_iterator find_iter = aa_effects.find(aaid); - if(find_iter == aa_effects.end()) - { - return; - } - - for (std::map::const_iterator iter = aa_effects[aaid].begin(); iter != aa_effects[aaid].end(); ++iter) { - effect = iter->second.skill_id; - base1 = iter->second.base1; - base2 = iter->second.base2; - slot = iter->second.slot; - - //we default to 0 (SE_CurrentHP) for the effect, so if there aren't any base1/2 values, we'll just skip it - if (effect == 0 && base1 == 0 && base2 == 0) - continue; - - //IsBlankSpellEffect() - if (effect == SE_Blank || (effect == SE_CHA && base1 == 0) || effect == SE_StackingCommand_Block || effect == SE_StackingCommand_Overwrite) - continue; - - Log.Out(Logs::Detail, Logs::AA, "Applying Effect %d from AA %u in slot %d (base1: %d, base2: %d) on %s", effect, aaid, slot, base1, base2, this->GetCleanName()); - - uint8 focus = IsFocusEffect(0, 0, true,effect); - if (focus) - { - newbon->FocusEffects[focus] = static_cast(effect); - continue; - } - - switch (effect) - { - //Note: AA effects that use accuracy are skill limited, while spell effect is not. - case SE_Accuracy: - if ((base2 == ALL_SKILLS) && (newbon->Accuracy[HIGHEST_SKILL+1] < base1)) - newbon->Accuracy[HIGHEST_SKILL+1] = base1; - else if (newbon->Accuracy[base2] < base1) - newbon->Accuracy[base2] += base1; - break; - case SE_CurrentHP: //regens - newbon->HPRegen += base1; - break; - case SE_CurrentEndurance: - newbon->EnduranceRegen += base1; - break; - case SE_MovementSpeed: - newbon->movementspeed += base1; //should we let these stack? - /*if (base1 > newbon->movementspeed) //or should we use a total value? - newbon->movementspeed = base1;*/ - break; - case SE_STR: - newbon->STR += base1; - break; - case SE_DEX: - newbon->DEX += base1; - break; - case SE_AGI: - newbon->AGI += base1; - break; - case SE_STA: - newbon->STA += base1; - break; - case SE_INT: - newbon->INT += base1; - break; - case SE_WIS: - newbon->WIS += base1; - break; - case SE_CHA: - newbon->CHA += base1; - break; - case SE_WaterBreathing: - //handled by client - break; - case SE_CurrentMana: - newbon->ManaRegen += base1; - break; - case SE_ItemManaRegenCapIncrease: - newbon->ItemManaRegenCap += base1; - break; - case SE_ResistFire: - newbon->FR += base1; - break; - case SE_ResistCold: - newbon->CR += base1; - break; - case SE_ResistPoison: - newbon->PR += base1; - break; - case SE_ResistDisease: - newbon->DR += base1; - break; - case SE_ResistMagic: - newbon->MR += base1; - break; - case SE_ResistCorruption: - newbon->Corrup += base1; - break; - case SE_IncreaseSpellHaste: - break; - case SE_IncreaseRange: - break; - case SE_MaxHPChange: - newbon->MaxHP += base1; - break; - case SE_Packrat: - newbon->Packrat += base1; - break; - case SE_TwoHandBash: - break; - case SE_SetBreathLevel: - break; - case SE_RaiseStatCap: - switch(base2) - { - //are these #define'd somewhere? - case 0: //str - newbon->STRCapMod += base1; - break; - case 1: //sta - newbon->STACapMod += base1; - break; - case 2: //agi - newbon->AGICapMod += base1; - break; - case 3: //dex - newbon->DEXCapMod += base1; - break; - case 4: //wis - newbon->WISCapMod += base1; - break; - case 5: //int - newbon->INTCapMod += base1; - break; - case 6: //cha - newbon->CHACapMod += base1; - break; - case 7: //mr - newbon->MRCapMod += base1; - break; - case 8: //cr - newbon->CRCapMod += base1; - break; - case 9: //fr - newbon->FRCapMod += base1; - break; - case 10: //pr - newbon->PRCapMod += base1; - break; - case 11: //dr - newbon->DRCapMod += base1; - break; - case 12: //corruption - newbon->CorrupCapMod += base1; - break; - } - break; - case SE_PetDiscipline2: - break; - case SE_SpellSlotIncrease: - break; - case SE_MysticalAttune: - newbon->BuffSlotIncrease += base1; - break; - case SE_TotalHP: - newbon->HP += base1; - break; - case SE_StunResist: - newbon->StunResist += base1; - break; - case SE_SpellCritChance: - newbon->CriticalSpellChance += base1; - break; - case SE_SpellCritDmgIncrease: - newbon->SpellCritDmgIncrease += base1; - break; - case SE_DotCritDmgIncrease: - newbon->DotCritDmgIncrease += base1; - break; - case SE_ResistSpellChance: - newbon->ResistSpellChance += base1; - break; - case SE_CriticalHealChance: - newbon->CriticalHealChance += base1; - break; - case SE_CriticalHealOverTime: - newbon->CriticalHealOverTime += base1; - break; - case SE_CriticalDoTChance: - newbon->CriticalDoTChance += base1; - break; - case SE_ReduceSkillTimer: - newbon->SkillReuseTime[base2] += base1; - break; - case SE_Fearless: - newbon->Fearless = true; - break; - case SE_PersistantCasting: - newbon->PersistantCasting += base1; - break; - case SE_DelayDeath: - newbon->DelayDeath += base1; - break; - case SE_FrontalStunResist: - newbon->FrontalStunResist += base1; - break; - case SE_ImprovedBindWound: - newbon->BindWound += base1; - break; - case SE_MaxBindWound: - newbon->MaxBindWound += base1; - break; - case SE_ExtraAttackChance: - newbon->ExtraAttackChance += base1; - break; - case SE_SeeInvis: - newbon->SeeInvis = base1; - break; - case SE_BaseMovementSpeed: - newbon->BaseMovementSpeed += base1; - break; - case SE_IncreaseRunSpeedCap: - newbon->IncreaseRunSpeedCap += base1; - break; - case SE_ConsumeProjectile: - newbon->ConsumeProjectile += base1; - break; - case SE_ForageAdditionalItems: - newbon->ForageAdditionalItems += base1; - break; - case SE_Salvage: - newbon->SalvageChance += base1; - break; - case SE_ArcheryDamageModifier: - newbon->ArcheryDamageModifier += base1; - break; - case SE_DoubleRangedAttack: - newbon->DoubleRangedAttack += base1; - break; - case SE_DamageShield: - newbon->DamageShield += base1; - break; - case SE_CharmBreakChance: - newbon->CharmBreakChance += base1; - break; - case SE_OffhandRiposteFail: - newbon->OffhandRiposteFail += base1; - break; - case SE_ItemAttackCapIncrease: - newbon->ItemATKCap += base1; - break; - case SE_GivePetGroupTarget: - newbon->GivePetGroupTarget = true; - break; - case SE_ItemHPRegenCapIncrease: - newbon->ItemHPRegenCap = +base1; - break; - case SE_Ambidexterity: - newbon->Ambidexterity += base1; - break; - case SE_PetMaxHP: - newbon->PetMaxHP += base1; - break; - case SE_AvoidMeleeChance: - newbon->AvoidMeleeChanceEffect += base1; - break; - case SE_CombatStability: - newbon->CombatStability += base1; - break; - case SE_AddSingingMod: - switch (base2) - { - case ItemTypeWindInstrument: - newbon->windMod += base1; - break; - case ItemTypeStringedInstrument: - newbon->stringedMod += base1; - break; - case ItemTypeBrassInstrument: - newbon->brassMod += base1; - break; - case ItemTypePercussionInstrument: - newbon->percussionMod += base1; - break; - case ItemTypeSinging: - newbon->singingMod += base1; - break; - } - break; - case SE_SongModCap: - newbon->songModCap += base1; - break; - case SE_PetCriticalHit: - newbon->PetCriticalHit += base1; - break; - case SE_PetAvoidance: - newbon->PetAvoidance += base1; - break; - case SE_ShieldBlock: - newbon->ShieldBlock += base1; - break; - case SE_ShieldEquipHateMod: - newbon->ShieldEquipHateMod += base1; - break; - case SE_ShieldEquipDmgMod: - newbon->ShieldEquipDmgMod[0] += base1; - newbon->ShieldEquipDmgMod[1] += base2; - break; - case SE_SecondaryDmgInc: - newbon->SecondaryDmgInc = true; - break; - case SE_ChangeAggro: - newbon->hatemod += base1; - break; - case SE_EndurancePool: - newbon->Endurance += base1; - break; - case SE_ChannelChanceItems: - newbon->ChannelChanceItems += base1; - break; - case SE_ChannelChanceSpells: - newbon->ChannelChanceSpells += base1; - break; - case SE_DoubleSpecialAttack: - newbon->DoubleSpecialAttack += base1; - break; - case SE_TripleBackstab: - newbon->TripleBackstab += base1; - break; - case SE_FrontalBackstabMinDmg: - newbon->FrontalBackstabMinDmg = true; - break; - case SE_FrontalBackstabChance: - newbon->FrontalBackstabChance += base1; - break; - case SE_BlockBehind: - newbon->BlockBehind += base1; - break; - - case SE_StrikeThrough: - case SE_StrikeThrough2: - newbon->StrikeThrough += base1; - break; - case SE_DoubleAttackChance: - newbon->DoubleAttackChance += base1; - break; - case SE_GiveDoubleAttack: - newbon->GiveDoubleAttack += base1; - break; - case SE_ProcChance: - newbon->ProcChanceSPA += base1; - break; - case SE_RiposteChance: - newbon->RiposteChance += base1; - break; - case SE_Flurry: - newbon->FlurryChance += base1; - break; - case SE_PetFlurry: - newbon->PetFlurry += base1; - break; - case SE_BardSongRange: - newbon->SongRange += base1; - break; - case SE_RootBreakChance: - newbon->RootBreakChance += base1; - break; - case SE_UnfailingDivinity: - newbon->UnfailingDivinity += base1; - break; - case SE_CrippBlowChance: - newbon->CrippBlowChance += base1; - break; - - case SE_HitChance: - { - if(base2 == ALL_SKILLS) - newbon->HitChanceEffect[HIGHEST_SKILL+1] += base1; - else - newbon->HitChanceEffect[base2] += base1; - } - - case SE_ProcOnKillShot: - for(int i = 0; i < MAX_SPELL_TRIGGER*3; i+=3) - { - if(!newbon->SpellOnKill[i] || ((newbon->SpellOnKill[i] == base2) && (newbon->SpellOnKill[i+1] < base1))) - { - //base1 = chance, base2 = SpellID to be triggered, base3 = min npc level - newbon->SpellOnKill[i] = base2; - newbon->SpellOnKill[i+1] = base1; - - if (GetLevel() > 15) - newbon->SpellOnKill[i+2] = GetLevel() - 15; //AA specifiy "non-trivial" - else - newbon->SpellOnKill[i+2] = 0; - - break; - } - } - break; - - case SE_SpellOnDeath: - for(int i = 0; i < MAX_SPELL_TRIGGER*2; i+=2) - { - if(!newbon->SpellOnDeath[i]) - { - // base1 = SpellID to be triggered, base2 = chance to fire - newbon->SpellOnDeath[i] = base1; - newbon->SpellOnDeath[i+1] = base2; - break; - } - } - break; - - case SE_TriggerOnCast: - - for(int i = 0; i < MAX_SPELL_TRIGGER; i++) - { - if (newbon->SpellTriggers[i] == aaid) - break; - - if(!newbon->SpellTriggers[i]) - { - //Save the 'aaid' of each triggerable effect to an array - newbon->SpellTriggers[i] = aaid; - break; - } - } - break; - - case SE_CriticalHitChance: - { - if(base2 == ALL_SKILLS) - newbon->CriticalHitChance[HIGHEST_SKILL+1] += base1; - else - newbon->CriticalHitChance[base2] += base1; - } - break; - - case SE_CriticalDamageMob: - { - // base1 = effect value, base2 = skill restrictions(-1 for all) - if(base2 == ALL_SKILLS) - newbon->CritDmgMob[HIGHEST_SKILL+1] += base1; - else - newbon->CritDmgMob[base2] += base1; - break; - } - - case SE_CriticalSpellChance: - { - newbon->CriticalSpellChance += base1; - - if (base2 > newbon->SpellCritDmgIncNoStack) - newbon->SpellCritDmgIncNoStack = base2; - - break; - } - - case SE_ResistFearChance: - { - if(base1 == 100) // If we reach 100% in a single spell/item then we should be immune to negative fear resist effects until our immunity is over - newbon->Fearless = true; - - newbon->ResistFearChance += base1; // these should stack - break; - } - - case SE_SkillDamageAmount: - { - if(base2 == ALL_SKILLS) - newbon->SkillDamageAmount[HIGHEST_SKILL+1] += base1; - else - newbon->SkillDamageAmount[base2] += base1; - break; - } - - case SE_SpecialAttackKBProc: - { - //You can only have one of these per client. [AA Dragon Punch] - newbon->SpecialAttackKBProc[0] = base1; //Chance base 100 = 25% proc rate - newbon->SpecialAttackKBProc[1] = base2; //Skill to KB Proc Off - break; - } - - case SE_DamageModifier: - { - if(base2 == ALL_SKILLS) - newbon->DamageModifier[HIGHEST_SKILL+1] += base1; - else - newbon->DamageModifier[base2] += base1; - break; - } - - case SE_DamageModifier2: - { - if(base2 == ALL_SKILLS) - newbon->DamageModifier2[HIGHEST_SKILL+1] += base1; - else - newbon->DamageModifier2[base2] += base1; - break; - } - - case SE_SlayUndead: - { - if(newbon->SlayUndead[1] < base1) - newbon->SlayUndead[0] = base1; // Rate - newbon->SlayUndead[1] = base2; // Damage Modifier - break; - } - - case SE_DoubleRiposte: - { - newbon->DoubleRiposte += base1; - } - - case SE_GiveDoubleRiposte: - { - //0=Regular Riposte 1=Skill Attack Riposte 2=Skill - if(base2 == 0){ - if(newbon->GiveDoubleRiposte[0] < base1) - newbon->GiveDoubleRiposte[0] = base1; - } - //Only for special attacks. - else if(base2 > 0 && (newbon->GiveDoubleRiposte[1] < base1)){ - newbon->GiveDoubleRiposte[1] = base1; - newbon->GiveDoubleRiposte[2] = base2; - } - - break; - } - - //Kayen: Not sure best way to implement this yet. - //Physically raises skill cap ie if 55/55 it will raise to 55/60 - case SE_RaiseSkillCap: - { - if(newbon->RaiseSkillCap[0] < base1){ - newbon->RaiseSkillCap[0] = base1; //value - newbon->RaiseSkillCap[1] = base2; //skill - } - break; - } - - case SE_MasteryofPast: - { - if(newbon->MasteryofPast < base1) - newbon->MasteryofPast = base1; - break; - } - - case SE_CastingLevel2: - case SE_CastingLevel: - { - newbon->effective_casting_level += base1; - break; - } - - case SE_DivineSave: - { - if(newbon->DivineSaveChance[0] < base1) - { - newbon->DivineSaveChance[0] = base1; - newbon->DivineSaveChance[1] = base2; - } - break; - } - - - case SE_SpellEffectResistChance: - { - for(int e = 0; e < MAX_RESISTABLE_EFFECTS*2; e+=2) - { - if(newbon->SEResist[e+1] && (newbon->SEResist[e] == base2) && (newbon->SEResist[e+1] < base1)){ - newbon->SEResist[e] = base2; //Spell Effect ID - newbon->SEResist[e+1] = base1; //Resist Chance - break; - } - else if (!newbon->SEResist[e+1]){ - newbon->SEResist[e] = base2; //Spell Effect ID - newbon->SEResist[e+1] = base1; //Resist Chance - break; - } - } - break; - } - - case SE_MitigateDamageShield: - { - if (base1 < 0) - base1 = base1*(-1); - - newbon->DSMitigationOffHand += base1; - break; - } - - case SE_FinishingBlow: - { - //base1 = chance, base2 = damage - if (newbon->FinishingBlow[1] < base2){ - newbon->FinishingBlow[0] = base1; - newbon->FinishingBlow[1] = base2; - } - break; - } - - case SE_FinishingBlowLvl: - { - //base1 = level, base2 = ??? (Set to 200 in AA data, possible proc rate mod?) - if (newbon->FinishingBlowLvl[0] < base1){ - newbon->FinishingBlowLvl[0] = base1; - newbon->FinishingBlowLvl[1] = base2; - } - break; - } - - case SE_StunBashChance: - newbon->StunBashChance += base1; - break; - - case SE_IncreaseChanceMemwipe: - newbon->IncreaseChanceMemwipe += base1; - break; - - case SE_CriticalMend: - newbon->CriticalMend += base1; - break; - - case SE_HealRate: - newbon->HealRate += base1; - break; - - case SE_MeleeLifetap: - { - - if((base1 < 0) && (newbon->MeleeLifetap > base1)) - newbon->MeleeLifetap = base1; - - else if(newbon->MeleeLifetap < base1) - newbon->MeleeLifetap = base1; - break; - } - - case SE_Vampirism: - newbon->Vampirism += base1; - break; - - case SE_FrenziedDevastation: - newbon->FrenziedDevastation += base2; - break; - - case SE_SpellProcChance: - newbon->SpellProcChance += base1; - break; - - case SE_Berserk: - newbon->BerserkSPA = true; - break; - - case SE_Metabolism: - newbon->Metabolism += base1; - break; - - case SE_ImprovedReclaimEnergy: - { - if((base1 < 0) && (newbon->ImprovedReclaimEnergy > base1)) - newbon->ImprovedReclaimEnergy = base1; - - else if(newbon->ImprovedReclaimEnergy < base1) - newbon->ImprovedReclaimEnergy = base1; - break; - } - - case SE_HeadShot: - { - if(newbon->HeadShot[1] < base2){ - newbon->HeadShot[0] = base1; - newbon->HeadShot[1] = base2; - } - break; - } - - case SE_HeadShotLevel: - { - if(newbon->HSLevel < base1) - newbon->HSLevel = base1; - break; - } - - case SE_Assassinate: - { - if(newbon->Assassinate[1] < base2){ - newbon->Assassinate[0] = base1; - newbon->Assassinate[1] = base2; - } - break; - } - - case SE_AssassinateLevel: - { - if(newbon->AssassinateLevel < base1) - newbon->AssassinateLevel = base1; - break; - } - - case SE_PetMeleeMitigation: - newbon->PetMeleeMitigation += base1; - break; - - case SE_MeleeVulnerability: - newbon->MeleeVulnerability += base1; - break; - - case SE_FactionModPct: - { - if((base1 < 0) && (newbon->FactionModPct > base1)) - newbon->FactionModPct = base1; - - else if(newbon->FactionModPct < base1) - newbon->FactionModPct = base1; - break; - } - - case SE_IllusionPersistence: - newbon->IllusionPersistence = true; - break; - - case SE_LimitToSkill:{ - if (base1 <= HIGHEST_SKILL) - newbon->LimitToSkill[base1] = true; - break; - } - - case SE_SkillProc:{ - for(int e = 0; e < MAX_SKILL_PROCS; e++) - { - if(newbon->SkillProc[e] && newbon->SkillProc[e] == aaid) - break; //Do not use the same aa id more than once. - - else if(!newbon->SkillProc[e]){ - newbon->SkillProc[e] = aaid; - break; - } - } - break; - } - - case SE_SkillProcSuccess:{ - - for(int e = 0; e < MAX_SKILL_PROCS; e++) - { - if(newbon->SkillProcSuccess[e] && newbon->SkillProcSuccess[e] == aaid) - break; //Do not use the same spell id more than once. - - else if(!newbon->SkillProcSuccess[e]){ - newbon->SkillProcSuccess[e] = aaid; - break; - } - } - break; - } - - case SE_MeleeMitigation: - newbon->MeleeMitigationEffect -= base1; - break; - - } - } + //AA old + //std::map >::const_iterator find_iter = aa_effects.find(aaid); + //if(find_iter == aa_effects.end()) + //{ + // return; + //} + // + //for (std::map::const_iterator iter = aa_effects[aaid].begin(); iter != aa_effects[aaid].end(); ++iter) { + // effect = iter->second.skill_id; + // base1 = iter->second.base1; + // base2 = iter->second.base2; + // slot = iter->second.slot; + // + // //we default to 0 (SE_CurrentHP) for the effect, so if there aren't any base1/2 values, we'll just skip it + // if (effect == 0 && base1 == 0 && base2 == 0) + // continue; + // + // //IsBlankSpellEffect() + // if (effect == SE_Blank || (effect == SE_CHA && base1 == 0) || effect == SE_StackingCommand_Block || effect == SE_StackingCommand_Overwrite) + // continue; + // + // Log.Out(Logs::Detail, Logs::AA, "Applying Effect %d from AA %u in slot %d (base1: %d, base2: %d) on %s", effect, aaid, slot, base1, base2, this->GetCleanName()); + // + // uint8 focus = IsFocusEffect(0, 0, true,effect); + // if (focus) + // { + // newbon->FocusEffects[focus] = static_cast(effect); + // continue; + // } + // + // switch (effect) + // { + // //Note: AA effects that use accuracy are skill limited, while spell effect is not. + // case SE_Accuracy: + // if ((base2 == ALL_SKILLS) && (newbon->Accuracy[HIGHEST_SKILL+1] < base1)) + // newbon->Accuracy[HIGHEST_SKILL+1] = base1; + // else if (newbon->Accuracy[base2] < base1) + // newbon->Accuracy[base2] += base1; + // break; + // case SE_CurrentHP: //regens + // newbon->HPRegen += base1; + // break; + // case SE_CurrentEndurance: + // newbon->EnduranceRegen += base1; + // break; + // case SE_MovementSpeed: + // newbon->movementspeed += base1; //should we let these stack? + // /*if (base1 > newbon->movementspeed) //or should we use a total value? + // newbon->movementspeed = base1;*/ + // break; + // case SE_STR: + // newbon->STR += base1; + // break; + // case SE_DEX: + // newbon->DEX += base1; + // break; + // case SE_AGI: + // newbon->AGI += base1; + // break; + // case SE_STA: + // newbon->STA += base1; + // break; + // case SE_INT: + // newbon->INT += base1; + // break; + // case SE_WIS: + // newbon->WIS += base1; + // break; + // case SE_CHA: + // newbon->CHA += base1; + // break; + // case SE_WaterBreathing: + // //handled by client + // break; + // case SE_CurrentMana: + // newbon->ManaRegen += base1; + // break; + // case SE_ItemManaRegenCapIncrease: + // newbon->ItemManaRegenCap += base1; + // break; + // case SE_ResistFire: + // newbon->FR += base1; + // break; + // case SE_ResistCold: + // newbon->CR += base1; + // break; + // case SE_ResistPoison: + // newbon->PR += base1; + // break; + // case SE_ResistDisease: + // newbon->DR += base1; + // break; + // case SE_ResistMagic: + // newbon->MR += base1; + // break; + // case SE_ResistCorruption: + // newbon->Corrup += base1; + // break; + // case SE_IncreaseSpellHaste: + // break; + // case SE_IncreaseRange: + // break; + // case SE_MaxHPChange: + // newbon->MaxHP += base1; + // break; + // case SE_Packrat: + // newbon->Packrat += base1; + // break; + // case SE_TwoHandBash: + // break; + // case SE_SetBreathLevel: + // break; + // case SE_RaiseStatCap: + // switch(base2) + // { + // //are these #define'd somewhere? + // case 0: //str + // newbon->STRCapMod += base1; + // break; + // case 1: //sta + // newbon->STACapMod += base1; + // break; + // case 2: //agi + // newbon->AGICapMod += base1; + // break; + // case 3: //dex + // newbon->DEXCapMod += base1; + // break; + // case 4: //wis + // newbon->WISCapMod += base1; + // break; + // case 5: //int + // newbon->INTCapMod += base1; + // break; + // case 6: //cha + // newbon->CHACapMod += base1; + // break; + // case 7: //mr + // newbon->MRCapMod += base1; + // break; + // case 8: //cr + // newbon->CRCapMod += base1; + // break; + // case 9: //fr + // newbon->FRCapMod += base1; + // break; + // case 10: //pr + // newbon->PRCapMod += base1; + // break; + // case 11: //dr + // newbon->DRCapMod += base1; + // break; + // case 12: //corruption + // newbon->CorrupCapMod += base1; + // break; + // } + // break; + // case SE_PetDiscipline2: + // break; + // case SE_SpellSlotIncrease: + // break; + // case SE_MysticalAttune: + // newbon->BuffSlotIncrease += base1; + // break; + // case SE_TotalHP: + // newbon->HP += base1; + // break; + // case SE_StunResist: + // newbon->StunResist += base1; + // break; + // case SE_SpellCritChance: + // newbon->CriticalSpellChance += base1; + // break; + // case SE_SpellCritDmgIncrease: + // newbon->SpellCritDmgIncrease += base1; + // break; + // case SE_DotCritDmgIncrease: + // newbon->DotCritDmgIncrease += base1; + // break; + // case SE_ResistSpellChance: + // newbon->ResistSpellChance += base1; + // break; + // case SE_CriticalHealChance: + // newbon->CriticalHealChance += base1; + // break; + // case SE_CriticalHealOverTime: + // newbon->CriticalHealOverTime += base1; + // break; + // case SE_CriticalDoTChance: + // newbon->CriticalDoTChance += base1; + // break; + // case SE_ReduceSkillTimer: + // newbon->SkillReuseTime[base2] += base1; + // break; + // case SE_Fearless: + // newbon->Fearless = true; + // break; + // case SE_PersistantCasting: + // newbon->PersistantCasting += base1; + // break; + // case SE_DelayDeath: + // newbon->DelayDeath += base1; + // break; + // case SE_FrontalStunResist: + // newbon->FrontalStunResist += base1; + // break; + // case SE_ImprovedBindWound: + // newbon->BindWound += base1; + // break; + // case SE_MaxBindWound: + // newbon->MaxBindWound += base1; + // break; + // case SE_ExtraAttackChance: + // newbon->ExtraAttackChance += base1; + // break; + // case SE_SeeInvis: + // newbon->SeeInvis = base1; + // break; + // case SE_BaseMovementSpeed: + // newbon->BaseMovementSpeed += base1; + // break; + // case SE_IncreaseRunSpeedCap: + // newbon->IncreaseRunSpeedCap += base1; + // break; + // case SE_ConsumeProjectile: + // newbon->ConsumeProjectile += base1; + // break; + // case SE_ForageAdditionalItems: + // newbon->ForageAdditionalItems += base1; + // break; + // case SE_Salvage: + // newbon->SalvageChance += base1; + // break; + // case SE_ArcheryDamageModifier: + // newbon->ArcheryDamageModifier += base1; + // break; + // case SE_DoubleRangedAttack: + // newbon->DoubleRangedAttack += base1; + // break; + // case SE_DamageShield: + // newbon->DamageShield += base1; + // break; + // case SE_CharmBreakChance: + // newbon->CharmBreakChance += base1; + // break; + // case SE_OffhandRiposteFail: + // newbon->OffhandRiposteFail += base1; + // break; + // case SE_ItemAttackCapIncrease: + // newbon->ItemATKCap += base1; + // break; + // case SE_GivePetGroupTarget: + // newbon->GivePetGroupTarget = true; + // break; + // case SE_ItemHPRegenCapIncrease: + // newbon->ItemHPRegenCap = +base1; + // break; + // case SE_Ambidexterity: + // newbon->Ambidexterity += base1; + // break; + // case SE_PetMaxHP: + // newbon->PetMaxHP += base1; + // break; + // case SE_AvoidMeleeChance: + // newbon->AvoidMeleeChanceEffect += base1; + // break; + // case SE_CombatStability: + // newbon->CombatStability += base1; + // break; + // case SE_AddSingingMod: + // switch (base2) + // { + // case ItemTypeWindInstrument: + // newbon->windMod += base1; + // break; + // case ItemTypeStringedInstrument: + // newbon->stringedMod += base1; + // break; + // case ItemTypeBrassInstrument: + // newbon->brassMod += base1; + // break; + // case ItemTypePercussionInstrument: + // newbon->percussionMod += base1; + // break; + // case ItemTypeSinging: + // newbon->singingMod += base1; + // break; + // } + // break; + // case SE_SongModCap: + // newbon->songModCap += base1; + // break; + // case SE_PetCriticalHit: + // newbon->PetCriticalHit += base1; + // break; + // case SE_PetAvoidance: + // newbon->PetAvoidance += base1; + // break; + // case SE_ShieldBlock: + // newbon->ShieldBlock += base1; + // break; + // case SE_ShieldEquipHateMod: + // newbon->ShieldEquipHateMod += base1; + // break; + // case SE_ShieldEquipDmgMod: + // newbon->ShieldEquipDmgMod[0] += base1; + // newbon->ShieldEquipDmgMod[1] += base2; + // break; + // case SE_SecondaryDmgInc: + // newbon->SecondaryDmgInc = true; + // break; + // case SE_ChangeAggro: + // newbon->hatemod += base1; + // break; + // case SE_EndurancePool: + // newbon->Endurance += base1; + // break; + // case SE_ChannelChanceItems: + // newbon->ChannelChanceItems += base1; + // break; + // case SE_ChannelChanceSpells: + // newbon->ChannelChanceSpells += base1; + // break; + // case SE_DoubleSpecialAttack: + // newbon->DoubleSpecialAttack += base1; + // break; + // case SE_TripleBackstab: + // newbon->TripleBackstab += base1; + // break; + // case SE_FrontalBackstabMinDmg: + // newbon->FrontalBackstabMinDmg = true; + // break; + // case SE_FrontalBackstabChance: + // newbon->FrontalBackstabChance += base1; + // break; + // case SE_BlockBehind: + // newbon->BlockBehind += base1; + // break; + // + // case SE_StrikeThrough: + // case SE_StrikeThrough2: + // newbon->StrikeThrough += base1; + // break; + // case SE_DoubleAttackChance: + // newbon->DoubleAttackChance += base1; + // break; + // case SE_GiveDoubleAttack: + // newbon->GiveDoubleAttack += base1; + // break; + // case SE_ProcChance: + // newbon->ProcChanceSPA += base1; + // break; + // case SE_RiposteChance: + // newbon->RiposteChance += base1; + // break; + // case SE_Flurry: + // newbon->FlurryChance += base1; + // break; + // case SE_PetFlurry: + // newbon->PetFlurry += base1; + // break; + // case SE_BardSongRange: + // newbon->SongRange += base1; + // break; + // case SE_RootBreakChance: + // newbon->RootBreakChance += base1; + // break; + // case SE_UnfailingDivinity: + // newbon->UnfailingDivinity += base1; + // break; + // case SE_CrippBlowChance: + // newbon->CrippBlowChance += base1; + // break; + // + // case SE_HitChance: + // { + // if(base2 == ALL_SKILLS) + // newbon->HitChanceEffect[HIGHEST_SKILL+1] += base1; + // else + // newbon->HitChanceEffect[base2] += base1; + // } + // + // case SE_ProcOnKillShot: + // for(int i = 0; i < MAX_SPELL_TRIGGER*3; i+=3) + // { + // if(!newbon->SpellOnKill[i] || ((newbon->SpellOnKill[i] == base2) && (newbon->SpellOnKill[i+1] < base1))) + // { + // //base1 = chance, base2 = SpellID to be triggered, base3 = min npc level + // newbon->SpellOnKill[i] = base2; + // newbon->SpellOnKill[i+1] = base1; + // + // if (GetLevel() > 15) + // newbon->SpellOnKill[i+2] = GetLevel() - 15; //AA specifiy "non-trivial" + // else + // newbon->SpellOnKill[i+2] = 0; + // + // break; + // } + // } + // break; + // + // case SE_SpellOnDeath: + // for(int i = 0; i < MAX_SPELL_TRIGGER*2; i+=2) + // { + // if(!newbon->SpellOnDeath[i]) + // { + // // base1 = SpellID to be triggered, base2 = chance to fire + // newbon->SpellOnDeath[i] = base1; + // newbon->SpellOnDeath[i+1] = base2; + // break; + // } + // } + // break; + // + // case SE_TriggerOnCast: + // + // for(int i = 0; i < MAX_SPELL_TRIGGER; i++) + // { + // if (newbon->SpellTriggers[i] == aaid) + // break; + // + // if(!newbon->SpellTriggers[i]) + // { + // //Save the 'aaid' of each triggerable effect to an array + // newbon->SpellTriggers[i] = aaid; + // break; + // } + // } + // break; + // + // case SE_CriticalHitChance: + // { + // if(base2 == ALL_SKILLS) + // newbon->CriticalHitChance[HIGHEST_SKILL+1] += base1; + // else + // newbon->CriticalHitChance[base2] += base1; + // } + // break; + // + // case SE_CriticalDamageMob: + // { + // // base1 = effect value, base2 = skill restrictions(-1 for all) + // if(base2 == ALL_SKILLS) + // newbon->CritDmgMob[HIGHEST_SKILL+1] += base1; + // else + // newbon->CritDmgMob[base2] += base1; + // break; + // } + // + // case SE_CriticalSpellChance: + // { + // newbon->CriticalSpellChance += base1; + // + // if (base2 > newbon->SpellCritDmgIncNoStack) + // newbon->SpellCritDmgIncNoStack = base2; + // + // break; + // } + // + // case SE_ResistFearChance: + // { + // if(base1 == 100) // If we reach 100% in a single spell/item then we should be immune to negative fear resist effects until our immunity is over + // newbon->Fearless = true; + // + // newbon->ResistFearChance += base1; // these should stack + // break; + // } + // + // case SE_SkillDamageAmount: + // { + // if(base2 == ALL_SKILLS) + // newbon->SkillDamageAmount[HIGHEST_SKILL+1] += base1; + // else + // newbon->SkillDamageAmount[base2] += base1; + // break; + // } + // + // case SE_SpecialAttackKBProc: + // { + // //You can only have one of these per client. [AA Dragon Punch] + // newbon->SpecialAttackKBProc[0] = base1; //Chance base 100 = 25% proc rate + // newbon->SpecialAttackKBProc[1] = base2; //Skill to KB Proc Off + // break; + // } + // + // case SE_DamageModifier: + // { + // if(base2 == ALL_SKILLS) + // newbon->DamageModifier[HIGHEST_SKILL+1] += base1; + // else + // newbon->DamageModifier[base2] += base1; + // break; + // } + // + // case SE_DamageModifier2: + // { + // if(base2 == ALL_SKILLS) + // newbon->DamageModifier2[HIGHEST_SKILL+1] += base1; + // else + // newbon->DamageModifier2[base2] += base1; + // break; + // } + // + // case SE_SlayUndead: + // { + // if(newbon->SlayUndead[1] < base1) + // newbon->SlayUndead[0] = base1; // Rate + // newbon->SlayUndead[1] = base2; // Damage Modifier + // break; + // } + // + // case SE_DoubleRiposte: + // { + // newbon->DoubleRiposte += base1; + // } + // + // case SE_GiveDoubleRiposte: + // { + // //0=Regular Riposte 1=Skill Attack Riposte 2=Skill + // if(base2 == 0){ + // if(newbon->GiveDoubleRiposte[0] < base1) + // newbon->GiveDoubleRiposte[0] = base1; + // } + // //Only for special attacks. + // else if(base2 > 0 && (newbon->GiveDoubleRiposte[1] < base1)){ + // newbon->GiveDoubleRiposte[1] = base1; + // newbon->GiveDoubleRiposte[2] = base2; + // } + // + // break; + // } + // + // //Kayen: Not sure best way to implement this yet. + // //Physically raises skill cap ie if 55/55 it will raise to 55/60 + // case SE_RaiseSkillCap: + // { + // if(newbon->RaiseSkillCap[0] < base1){ + // newbon->RaiseSkillCap[0] = base1; //value + // newbon->RaiseSkillCap[1] = base2; //skill + // } + // break; + // } + // + // case SE_MasteryofPast: + // { + // if(newbon->MasteryofPast < base1) + // newbon->MasteryofPast = base1; + // break; + // } + // + // case SE_CastingLevel2: + // case SE_CastingLevel: + // { + // newbon->effective_casting_level += base1; + // break; + // } + // + // case SE_DivineSave: + // { + // if(newbon->DivineSaveChance[0] < base1) + // { + // newbon->DivineSaveChance[0] = base1; + // newbon->DivineSaveChance[1] = base2; + // } + // break; + // } + // + // + // case SE_SpellEffectResistChance: + // { + // for(int e = 0; e < MAX_RESISTABLE_EFFECTS*2; e+=2) + // { + // if(newbon->SEResist[e+1] && (newbon->SEResist[e] == base2) && (newbon->SEResist[e+1] < base1)){ + // newbon->SEResist[e] = base2; //Spell Effect ID + // newbon->SEResist[e+1] = base1; //Resist Chance + // break; + // } + // else if (!newbon->SEResist[e+1]){ + // newbon->SEResist[e] = base2; //Spell Effect ID + // newbon->SEResist[e+1] = base1; //Resist Chance + // break; + // } + // } + // break; + // } + // + // case SE_MitigateDamageShield: + // { + // if (base1 < 0) + // base1 = base1*(-1); + // + // newbon->DSMitigationOffHand += base1; + // break; + // } + // + // case SE_FinishingBlow: + // { + // //base1 = chance, base2 = damage + // if (newbon->FinishingBlow[1] < base2){ + // newbon->FinishingBlow[0] = base1; + // newbon->FinishingBlow[1] = base2; + // } + // break; + // } + // + // case SE_FinishingBlowLvl: + // { + // //base1 = level, base2 = ??? (Set to 200 in AA data, possible proc rate mod?) + // if (newbon->FinishingBlowLvl[0] < base1){ + // newbon->FinishingBlowLvl[0] = base1; + // newbon->FinishingBlowLvl[1] = base2; + // } + // break; + // } + // + // case SE_StunBashChance: + // newbon->StunBashChance += base1; + // break; + // + // case SE_IncreaseChanceMemwipe: + // newbon->IncreaseChanceMemwipe += base1; + // break; + // + // case SE_CriticalMend: + // newbon->CriticalMend += base1; + // break; + // + // case SE_HealRate: + // newbon->HealRate += base1; + // break; + // + // case SE_MeleeLifetap: + // { + // + // if((base1 < 0) && (newbon->MeleeLifetap > base1)) + // newbon->MeleeLifetap = base1; + // + // else if(newbon->MeleeLifetap < base1) + // newbon->MeleeLifetap = base1; + // break; + // } + // + // case SE_Vampirism: + // newbon->Vampirism += base1; + // break; + // + // case SE_FrenziedDevastation: + // newbon->FrenziedDevastation += base2; + // break; + // + // case SE_SpellProcChance: + // newbon->SpellProcChance += base1; + // break; + // + // case SE_Berserk: + // newbon->BerserkSPA = true; + // break; + // + // case SE_Metabolism: + // newbon->Metabolism += base1; + // break; + // + // case SE_ImprovedReclaimEnergy: + // { + // if((base1 < 0) && (newbon->ImprovedReclaimEnergy > base1)) + // newbon->ImprovedReclaimEnergy = base1; + // + // else if(newbon->ImprovedReclaimEnergy < base1) + // newbon->ImprovedReclaimEnergy = base1; + // break; + // } + // + // case SE_HeadShot: + // { + // if(newbon->HeadShot[1] < base2){ + // newbon->HeadShot[0] = base1; + // newbon->HeadShot[1] = base2; + // } + // break; + // } + // + // case SE_HeadShotLevel: + // { + // if(newbon->HSLevel < base1) + // newbon->HSLevel = base1; + // break; + // } + // + // case SE_Assassinate: + // { + // if(newbon->Assassinate[1] < base2){ + // newbon->Assassinate[0] = base1; + // newbon->Assassinate[1] = base2; + // } + // break; + // } + // + // case SE_AssassinateLevel: + // { + // if(newbon->AssassinateLevel < base1) + // newbon->AssassinateLevel = base1; + // break; + // } + // + // case SE_PetMeleeMitigation: + // newbon->PetMeleeMitigation += base1; + // break; + // + // case SE_MeleeVulnerability: + // newbon->MeleeVulnerability += base1; + // break; + // + // case SE_FactionModPct: + // { + // if((base1 < 0) && (newbon->FactionModPct > base1)) + // newbon->FactionModPct = base1; + // + // else if(newbon->FactionModPct < base1) + // newbon->FactionModPct = base1; + // break; + // } + // + // case SE_IllusionPersistence: + // newbon->IllusionPersistence = true; + // break; + // + // case SE_LimitToSkill:{ + // if (base1 <= HIGHEST_SKILL) + // newbon->LimitToSkill[base1] = true; + // break; + // } + // + // case SE_SkillProc:{ + // for(int e = 0; e < MAX_SKILL_PROCS; e++) + // { + // if(newbon->SkillProc[e] && newbon->SkillProc[e] == aaid) + // break; //Do not use the same aa id more than once. + // + // else if(!newbon->SkillProc[e]){ + // newbon->SkillProc[e] = aaid; + // break; + // } + // } + // break; + // } + // + // case SE_SkillProcSuccess:{ + // + // for(int e = 0; e < MAX_SKILL_PROCS; e++) + // { + // if(newbon->SkillProcSuccess[e] && newbon->SkillProcSuccess[e] == aaid) + // break; //Do not use the same spell id more than once. + // + // else if(!newbon->SkillProcSuccess[e]){ + // newbon->SkillProcSuccess[e] = aaid; + // break; + // } + // } + // break; + // } + // + // case SE_MeleeMitigation: + // newbon->MeleeMitigationEffect -= base1; + // break; + // + // } + //} } void Mob::CalcSpellBonuses(StatBonuses* newbon) diff --git a/zone/bot.cpp b/zone/bot.cpp index 8b3741443..c6c0f6e7f 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -193,7 +193,7 @@ Bot::Bot(uint32 botID, uint32 botOwnerCharacterID, uint32 botSpellsID, double to GenerateBaseStats(); LoadTimers(); - LoadAAs(); + //LoadAAs(); old aa, replace this LoadBuffs(); CalcBotStats(false); @@ -1430,114 +1430,103 @@ void Bot::GenerateAABonuses(StatBonuses* newbon) { uint8 botLevel = GetLevel(); memset(newbon, 0, sizeof(StatBonuses)); //start fresh - - if(botLevel >= 51) { - //level 51 = 1 AA level - - int i; - int totalAAs = database.CountAAs(); - uint32 slots = 0; - uint32 aa_AA = 0; - uint32 aa_value = 0; - for (i = 0; i < totalAAs; i++) { //iterate through all of the client's AAs - std::map::iterator aa = botAAs.find(i); - if(aa != botAAs.end()) { // make sure aa exists or we'll crash zone - aa_AA = aa->second.aa_id; //same as aaid from the aa_effects table - aa_value = aa->second.total_levels; //how many points in it - if (aa_AA > 0 || aa_value > 0) { //do we have the AA? if 1 of the 2 is set, we can assume we do - //slots = database.GetTotalAALevels(aa_AA); //find out how many effects from aa_effects table - slots = zone->GetTotalAALevels(aa_AA); //find out how many effects from aa_effects, which is loaded into memory - if (slots > 0) //and does it have any effects? may be able to put this above, not sure if it runs on each iteration - ApplyAABonuses(aa_AA + aa_value -1, slots, newbon); //add the bonuses - } - } - } - } + //old aa + //if(botLevel >= 51) { + // //level 51 = 1 AA level + // + // int i; + // int totalAAs = database.CountAAs(); + // uint32 slots = 0; + // uint32 aa_AA = 0; + // uint32 aa_value = 0; + // for (i = 0; i < totalAAs; i++) { //iterate through all of the client's AAs + // std::map::iterator aa = botAAs.find(i); + // if(aa != botAAs.end()) { // make sure aa exists or we'll crash zone + // aa_AA = aa->second.aa_id; //same as aaid from the aa_effects table + // aa_value = aa->second.total_levels; //how many points in it + // if (aa_AA > 0 || aa_value > 0) { //do we have the AA? if 1 of the 2 is set, we can assume we do + // //slots = database.GetTotalAALevels(aa_AA); //find out how many effects from aa_effects table + // //slots = zone->GetTotalAALevels(aa_AA); //find out how many effects from aa_effects, which is loaded into memory + // //if (slots > 0) //and does it have any effects? may be able to put this above, not sure if it runs on each iteration + // // ApplyAABonuses(aa_AA + aa_value -1, slots, newbon); //add the bonuses + // } + // } + // } + //} } -void Bot::LoadAAs() { - int maxAAExpansion = RuleI(Bots, BotAAExpansion); //get expansion to get AAs up to - botAAs.clear(); //start fresh - - std::string query; - - if(GetClass() == BERSERKER) - query = StringFormat("SELECT skill_id FROM altadv_vars WHERE berserker = 1 AND class_type > 1 AND class_type <= %i AND aa_expansion <= %i ORDER BY skill_id;", GetLevel(), maxAAExpansion); - else - query = StringFormat("SELECT skill_id FROM altadv_vars WHERE ((classes & ( 1 << %i )) >> %i) = 1 AND class_type > 1 AND class_type <= %i AND aa_expansion <= %i ORDER BY skill_id;", GetClass(), GetClass(), GetLevel(), maxAAExpansion); - - auto results = database.QueryDatabase(query); - - if(!results.Success()) { - Log.Out(Logs::General, Logs::Error, "Error in Bot::LoadAAs()"); - return; - } - - int totalAAs = database.CountAAs(); - - for (auto row = results.begin(); row != results.end(); ++row) { - uint32 skill_id = 0; - skill_id = atoi(row[0]); - - if(skill_id <= 0 || skill_id >= totalAAs) - continue; - - SendAA_Struct *sendAA = zone->FindAA(skill_id); - - if(!sendAA) - continue; - - for(int i=0; imax_level; i++) { - //Get AA info & add to list - uint32 aaid = sendAA->id + i; - uint8 total_levels = 0; - uint8 req_level; - std::map::iterator RequiredLevel = AARequiredLevelAndCost.find(aaid); - - //Get level required for AA - if(RequiredLevel != AARequiredLevelAndCost.end()) - req_level = RequiredLevel->second.Level; - else - req_level = (sendAA->class_type + i * sendAA->level_inc); - - if(req_level > GetLevel()) - break; - - //Bot is high enough level for AA - std::map::iterator foundAA = botAAs.find(aaid); - - // AA is already in list - if(foundAA != botAAs.end()) - continue; - - if(sendAA->id == aaid) { - BotAA newAA; - - newAA.total_levels = 0; - newAA.aa_id = aaid; - newAA.req_level = req_level; - newAA.total_levels += 1; - - botAAs[aaid] = newAA; //add to list - } - else //update master AA record with number of levels a bot has in AA, based on level. - botAAs[sendAA->id].total_levels+=1; - } - } - -} - -uint32 Bot::GetAA(uint32 aa_id) { - - std::map::const_iterator find_iter = botAAs.find(aa_id); - int aaLevel = 0; - - if(find_iter != botAAs.end()) { - aaLevel = find_iter->second.total_levels; - } - - return aaLevel; -} +//old AA +//void Bot::LoadAAs() { +// int maxAAExpansion = RuleI(Bots, BotAAExpansion); //get expansion to get AAs up to +// botAAs.clear(); //start fresh +// +// std::string query; +// +// if(GetClass() == BERSERKER) +// query = StringFormat("SELECT skill_id FROM altadv_vars WHERE berserker = 1 AND class_type > 1 AND class_type <= %i AND aa_expansion <= %i ORDER BY skill_id;", GetLevel(), maxAAExpansion); +// else +// query = StringFormat("SELECT skill_id FROM altadv_vars WHERE ((classes & ( 1 << %i )) >> %i) = 1 AND class_type > 1 AND class_type <= %i AND aa_expansion <= %i ORDER BY skill_id;", GetClass(), GetClass(), GetLevel(), maxAAExpansion); +// +// auto results = database.QueryDatabase(query); +// +// if(!results.Success()) { +// Log.Out(Logs::General, Logs::Error, "Error in Bot::LoadAAs()"); +// return; +// } +// +// int totalAAs = database.CountAAs(); +// +// for (auto row = results.begin(); row != results.end(); ++row) { +// uint32 skill_id = 0; +// skill_id = atoi(row[0]); +// +// if(skill_id <= 0 || skill_id >= totalAAs) +// continue; +// +// SendAA_Struct *sendAA = zone->FindAA(skill_id); +// +// if(!sendAA) +// continue; +// +// for(int i=0; imax_level; i++) { +// //Get AA info & add to list +// uint32 aaid = sendAA->id + i; +// uint8 total_levels = 0; +// uint8 req_level; +// std::map::iterator RequiredLevel = AARequiredLevelAndCost.find(aaid); +// +// //Get level required for AA +// if(RequiredLevel != AARequiredLevelAndCost.end()) +// req_level = RequiredLevel->second.Level; +// else +// req_level = (sendAA->class_type + i * sendAA->level_inc); +// +// if(req_level > GetLevel()) +// break; +// +// //Bot is high enough level for AA +// std::map::iterator foundAA = botAAs.find(aaid); +// +// // AA is already in list +// if(foundAA != botAAs.end()) +// continue; +// +// if(sendAA->id == aaid) { +// BotAA newAA; +// +// newAA.total_levels = 0; +// newAA.aa_id = aaid; +// newAA.req_level = req_level; +// newAA.total_levels += 1; +// +// botAAs[aaid] = newAA; //add to list +// } +// else //update master AA record with number of levels a bot has in AA, based on level. +// botAAs[sendAA->id].total_levels+=1; +// } +// } +// +//} //current with Client::ApplyAABonuses 9/26/12 void Bot::ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon) @@ -1551,551 +1540,552 @@ void Bot::ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon) int32 base2 = 0; //only really used for SE_RaiseStatCap & SE_ReduceSkillTimer in aa_effects table uint32 slot = 0; - std::map >::const_iterator find_iter = aa_effects.find(aaid); - if(find_iter == aa_effects.end()) - { - return; - } - - for (std::map::const_iterator iter = aa_effects[aaid].begin(); iter != aa_effects[aaid].end(); ++iter) { - effect = iter->second.skill_id; - base1 = iter->second.base1; - base2 = iter->second.base2; - slot = iter->second.slot; - - //we default to 0 (SE_CurrentHP) for the effect, so if there aren't any base1/2 values, we'll just skip it - if (effect == 0 && base1 == 0 && base2 == 0) - continue; - - //IsBlankSpellEffect() - if (effect == SE_Blank || (effect == SE_CHA && base1 == 0) || effect == SE_StackingCommand_Block || effect == SE_StackingCommand_Overwrite) - continue; - - Log.Out(Logs::Detail, Logs::AA, "Applying Effect %d from AA %u in slot %d (base1: %d, base2: %d) on %s", effect, aaid, slot, base1, base2, this->GetCleanName()); - - uint8 focus = IsFocusEffect(0, 0, true,effect); - if (focus) - { - newbon->FocusEffects[focus] = effect; - continue; - } - - switch (effect) - { - //Note: AA effects that use accuracy are skill limited, while spell effect is not. - case SE_Accuracy: - if ((base2 == -1) && (newbon->Accuracy[HIGHEST_SKILL+1] < base1)) - newbon->Accuracy[HIGHEST_SKILL+1] = base1; - else if (newbon->Accuracy[base2] < base1) - newbon->Accuracy[base2] += base1; - break; - case SE_CurrentHP: //regens - newbon->HPRegen += base1; - break; - case SE_CurrentEndurance: - newbon->EnduranceRegen += base1; - break; - case SE_MovementSpeed: - newbon->movementspeed += base1; //should we let these stack? - /*if (base1 > newbon->movementspeed) //or should we use a total value? - newbon->movementspeed = base1;*/ - break; - case SE_STR: - newbon->STR += base1; - break; - case SE_DEX: - newbon->DEX += base1; - break; - case SE_AGI: - newbon->AGI += base1; - break; - case SE_STA: - newbon->STA += base1; - break; - case SE_INT: - newbon->INT += base1; - break; - case SE_WIS: - newbon->WIS += base1; - break; - case SE_CHA: - newbon->CHA += base1; - break; - case SE_WaterBreathing: - //handled by client - break; - case SE_CurrentMana: - newbon->ManaRegen += base1; - break; - case SE_ItemManaRegenCapIncrease: - newbon->ItemManaRegenCap += base1; - break; - case SE_ResistFire: - newbon->FR += base1; - break; - case SE_ResistCold: - newbon->CR += base1; - break; - case SE_ResistPoison: - newbon->PR += base1; - break; - case SE_ResistDisease: - newbon->DR += base1; - break; - case SE_ResistMagic: - newbon->MR += base1; - break; - case SE_ResistCorruption: - newbon->Corrup += base1; - break; - case SE_IncreaseSpellHaste: - break; - case SE_IncreaseRange: - break; - case SE_MaxHPChange: - newbon->MaxHP += base1; - break; - case SE_Packrat: - newbon->Packrat += base1; - break; - case SE_TwoHandBash: - break; - case SE_SetBreathLevel: - break; - case SE_RaiseStatCap: - switch(base2) - { - //are these #define'd somewhere? - case 0: //str - newbon->STRCapMod += base1; - break; - case 1: //sta - newbon->STACapMod += base1; - break; - case 2: //agi - newbon->AGICapMod += base1; - break; - case 3: //dex - newbon->DEXCapMod += base1; - break; - case 4: //wis - newbon->WISCapMod += base1; - break; - case 5: //int - newbon->INTCapMod += base1; - break; - case 6: //cha - newbon->CHACapMod += base1; - break; - case 7: //mr - newbon->MRCapMod += base1; - break; - case 8: //cr - newbon->CRCapMod += base1; - break; - case 9: //fr - newbon->FRCapMod += base1; - break; - case 10: //pr - newbon->PRCapMod += base1; - break; - case 11: //dr - newbon->DRCapMod += base1; - break; - case 12: //corruption - newbon->CorrupCapMod += base1; - break; - } - break; - case SE_PetDiscipline2: - break; - case SE_SpellSlotIncrease: - break; - case SE_MysticalAttune: - newbon->BuffSlotIncrease += base1; - break; - case SE_TotalHP: - newbon->HP += base1; - break; - case SE_StunResist: - newbon->StunResist += base1; - break; - case SE_SpellCritChance: - newbon->CriticalSpellChance += base1; - break; - case SE_SpellCritDmgIncrease: - newbon->SpellCritDmgIncrease += base1; - break; - case SE_DotCritDmgIncrease: - newbon->DotCritDmgIncrease += base1; - break; - case SE_ResistSpellChance: - newbon->ResistSpellChance += base1; - break; - case SE_CriticalHealChance: - newbon->CriticalHealChance += base1; - break; - case SE_CriticalHealOverTime: - newbon->CriticalHealOverTime += base1; - break; - case SE_CriticalDoTChance: - newbon->CriticalDoTChance += base1; - break; - case SE_ReduceSkillTimer: - newbon->SkillReuseTime[base2] += base1; - break; - case SE_Fearless: - newbon->Fearless = true; - break; - case SE_PersistantCasting: - newbon->PersistantCasting += base1; - break; - case SE_DelayDeath: - newbon->DelayDeath += base1; - break; - case SE_FrontalStunResist: - newbon->FrontalStunResist += base1; - break; - case SE_ImprovedBindWound: - newbon->BindWound += base1; - break; - case SE_MaxBindWound: - newbon->MaxBindWound += base1; - break; - case SE_ExtraAttackChance: - newbon->ExtraAttackChance += base1; - break; - case SE_SeeInvis: - newbon->SeeInvis = base1; - break; - case SE_BaseMovementSpeed: - newbon->BaseMovementSpeed += base1; - break; - case SE_IncreaseRunSpeedCap: - newbon->IncreaseRunSpeedCap += base1; - break; - case SE_ConsumeProjectile: - newbon->ConsumeProjectile += base1; - break; - case SE_ArcheryDamageModifier: - newbon->ArcheryDamageModifier += base1; - break; - case SE_DamageShield: - newbon->DamageShield += base1; - break; - case SE_CharmBreakChance: - newbon->CharmBreakChance += base1; - break; - case SE_OffhandRiposteFail: - newbon->OffhandRiposteFail += base1; - break; - case SE_ItemAttackCapIncrease: - newbon->ItemATKCap += base1; - break; - case SE_GivePetGroupTarget: - newbon->GivePetGroupTarget = true; - break; - case SE_ItemHPRegenCapIncrease: - newbon->ItemHPRegenCap = +base1; - break; - case SE_Ambidexterity: - newbon->Ambidexterity += base1; - break; - case SE_PetMaxHP: - newbon->PetMaxHP += base1; - break; - case SE_AvoidMeleeChance: - newbon->AvoidMeleeChance += base1; - break; - case SE_CombatStability: - newbon->CombatStability += base1; - break; - case SE_PetCriticalHit: - newbon->PetCriticalHit += base1; - break; - case SE_PetAvoidance: - newbon->PetAvoidance += base1; - break; - case SE_ShieldBlock: - newbon->ShieldBlock += base1; - break; - case SE_SecondaryDmgInc: - newbon->SecondaryDmgInc = true; - break; - case SE_ChangeAggro: - newbon->hatemod += base1; - break; - case SE_EndurancePool: - newbon->Endurance += base1; - break; - case SE_ChannelChanceItems: - newbon->ChannelChanceItems += base1; - break; - case SE_ChannelChanceSpells: - newbon->ChannelChanceSpells += base1; - break; - case SE_DoubleSpecialAttack: - newbon->DoubleSpecialAttack += base1; - break; - case SE_TripleBackstab: - newbon->TripleBackstab += base1; - break; - case SE_FrontalBackstabMinDmg: - newbon->FrontalBackstabMinDmg = true; - break; - case SE_FrontalBackstabChance: - newbon->FrontalBackstabChance += base1; - break; - case SE_BlockBehind: - newbon->BlockBehind += base1; - break; - case SE_StrikeThrough2: - newbon->StrikeThrough += base1; - break; - case SE_DoubleAttackChance: - newbon->DoubleAttackChance += base1; - break; - case SE_GiveDoubleAttack: - newbon->GiveDoubleAttack += base1; - break; - case SE_ProcChance: - newbon->ProcChance += base1; - break; - case SE_RiposteChance: - newbon->RiposteChance += base1; - break; - case SE_Flurry: - newbon->FlurryChance += base1; - break; - case SE_PetFlurry: - newbon->PetFlurry = base1; - break; - case SE_BardSongRange: - newbon->SongRange += base1; - break; - case SE_RootBreakChance: - newbon->RootBreakChance += base1; - break; - case SE_UnfailingDivinity: - newbon->UnfailingDivinity += base1; - break; - - case SE_ProcOnKillShot: - for(int i = 0; i < MAX_SPELL_TRIGGER*3; i+=3) - { - if(!newbon->SpellOnKill[i] || ((newbon->SpellOnKill[i] == base2) && (newbon->SpellOnKill[i+1] < base1))) - { - //base1 = chance, base2 = SpellID to be triggered, base3 = min npc level - newbon->SpellOnKill[i] = base2; - newbon->SpellOnKill[i+1] = base1; - - if (GetLevel() > 15) - newbon->SpellOnKill[i+2] = GetLevel() - 15; //AA specifiy "non-trivial" - else - newbon->SpellOnKill[i+2] = 0; - - break; - } - } - break; - - case SE_SpellOnDeath: - for(int i = 0; i < MAX_SPELL_TRIGGER*2; i+=2) - { - if(!newbon->SpellOnDeath[i]) - { - // base1 = SpellID to be triggered, base2 = chance to fire - newbon->SpellOnDeath[i] = base1; - newbon->SpellOnDeath[i+1] = base2; - break; - } - } - break; - - case SE_TriggerOnCast: - - for(int i = 0; i < MAX_SPELL_TRIGGER; i++) - { - if (newbon->SpellTriggers[i] == aaid) - break; - - if(!newbon->SpellTriggers[i]) - { - //Save the 'aaid' of each triggerable effect to an array - newbon->SpellTriggers[i] = aaid; - break; - } - } - break; - - case SE_CriticalHitChance: - { - if(base2 == -1) - newbon->CriticalHitChance[HIGHEST_SKILL+1] += base1; - else - newbon->CriticalHitChance[base2] += base1; - } - break; - - case SE_CriticalDamageMob: - { - // base1 = effect value, base2 = skill restrictions(-1 for all) - if(base2 == -1) - newbon->CritDmgMob[HIGHEST_SKILL+1] += base1; - else - newbon->CritDmgMob[base2] += base1; - break; - } - - case SE_CriticalSpellChance: - { - newbon->CriticalSpellChance += base1; - - if (base2 > newbon->SpellCritDmgIncrease) - newbon->SpellCritDmgIncrease = base2; - - break; - } - - case SE_ResistFearChance: - { - if(base1 == 100) // If we reach 100% in a single spell/item then we should be immune to negative fear resist effects until our immunity is over - newbon->Fearless = true; - - newbon->ResistFearChance += base1; // these should stack - break; - } - - case SE_SkillDamageAmount: - { - if(base2 == -1) - newbon->SkillDamageAmount[HIGHEST_SKILL+1] += base1; - else - newbon->SkillDamageAmount[base2] += base1; - break; - } - - case SE_SpecialAttackKBProc: - { - //You can only have one of these per client. [AA Dragon Punch] - newbon->SpecialAttackKBProc[0] = base1; //Chance base 100 = 25% proc rate - newbon->SpecialAttackKBProc[1] = base2; //Skill to KB Proc Off - break; - } - - case SE_DamageModifier: - { - if(base2 == -1) - newbon->DamageModifier[HIGHEST_SKILL+1] += base1; - else - newbon->DamageModifier[base2] += base1; - break; - } - - case SE_SlayUndead: - { - if(newbon->SlayUndead[1] < base1) - newbon->SlayUndead[0] = base1; // Rate - newbon->SlayUndead[1] = base2; // Damage Modifier - break; - } - - case SE_GiveDoubleRiposte: - { - //0=Regular Riposte 1=Skill Attack Riposte 2=Skill - if(base2 == 0){ - if(newbon->GiveDoubleRiposte[0] < base1) - newbon->GiveDoubleRiposte[0] = base1; - } - //Only for special attacks. - else if(base2 > 0 && (newbon->GiveDoubleRiposte[1] < base1)){ - newbon->GiveDoubleRiposte[1] = base1; - newbon->GiveDoubleRiposte[2] = base2; - } - - break; - } - - //Kayen: Not sure best way to implement this yet. - //Physically raises skill cap ie if 55/55 it will raise to 55/60 - case SE_RaiseSkillCap: - { - if(newbon->RaiseSkillCap[0] < base1){ - newbon->RaiseSkillCap[0] = base1; //value - newbon->RaiseSkillCap[1] = base2; //skill - } - break; - } - - case SE_MasteryofPast: - { - if(newbon->MasteryofPast < base1) - newbon->MasteryofPast = base1; - break; - } - - case SE_CastingLevel2: - case SE_CastingLevel: - { - newbon->effective_casting_level += base1; - break; - } - - - case SE_DivineSave: - { - if(newbon->DivineSaveChance[0] < base1) - { - newbon->DivineSaveChance[0] = base1; - newbon->DivineSaveChance[1] = base2; - } - break; - } - - case SE_SpellEffectResistChance: - { - for(int e = 0; e < MAX_RESISTABLE_EFFECTS*2; e+=2) - { - if(!newbon->SEResist[e] || ((newbon->SEResist[e] = base2) && (newbon->SEResist[e+1] < base1)) ){ - newbon->SEResist[e] = base2; - newbon->SEResist[e+1] = base1; - break; - } - } - break; - } - - case SE_MitigateDamageShield: - { - if (base1 < 0) - base1 = base1*(-1); - - newbon->DSMitigationOffHand += base1; - break; - } - - case SE_FinishingBlow: - { - - //base1 = chance, base2 = damage - if (newbon->FinishingBlow[1] < base2){ - newbon->FinishingBlow[0] = base1; - newbon->FinishingBlow[1] = base2; - } - break; - } - - case SE_FinishingBlowLvl: - { - //base1 = level, base2 = ??? (Set to 200 in AA data, possible proc rate mod?) - if (newbon->FinishingBlowLvl[0] < base1){ - newbon->FinishingBlowLvl[0] = base1; - newbon->FinishingBlowLvl[1] = base2; - } - break; - } - } - } + //old AA + //std::map >::const_iterator find_iter = aa_effects.find(aaid); + //if(find_iter == aa_effects.end()) + //{ + // return; + //} + // + //for (std::map::const_iterator iter = aa_effects[aaid].begin(); iter != aa_effects[aaid].end(); ++iter) { + // effect = iter->second.skill_id; + // base1 = iter->second.base1; + // base2 = iter->second.base2; + // slot = iter->second.slot; + // + // //we default to 0 (SE_CurrentHP) for the effect, so if there aren't any base1/2 values, we'll just skip it + // if (effect == 0 && base1 == 0 && base2 == 0) + // continue; + // + // //IsBlankSpellEffect() + // if (effect == SE_Blank || (effect == SE_CHA && base1 == 0) || effect == SE_StackingCommand_Block || effect == SE_StackingCommand_Overwrite) + // continue; + // + // Log.Out(Logs::Detail, Logs::AA, "Applying Effect %d from AA %u in slot %d (base1: %d, base2: %d) on %s", effect, aaid, slot, base1, base2, this->GetCleanName()); + // + // uint8 focus = IsFocusEffect(0, 0, true,effect); + // if (focus) + // { + // newbon->FocusEffects[focus] = effect; + // continue; + // } + // + // switch (effect) + // { + // //Note: AA effects that use accuracy are skill limited, while spell effect is not. + // case SE_Accuracy: + // if ((base2 == -1) && (newbon->Accuracy[HIGHEST_SKILL+1] < base1)) + // newbon->Accuracy[HIGHEST_SKILL+1] = base1; + // else if (newbon->Accuracy[base2] < base1) + // newbon->Accuracy[base2] += base1; + // break; + // case SE_CurrentHP: //regens + // newbon->HPRegen += base1; + // break; + // case SE_CurrentEndurance: + // newbon->EnduranceRegen += base1; + // break; + // case SE_MovementSpeed: + // newbon->movementspeed += base1; //should we let these stack? + // /*if (base1 > newbon->movementspeed) //or should we use a total value? + // newbon->movementspeed = base1;*/ + // break; + // case SE_STR: + // newbon->STR += base1; + // break; + // case SE_DEX: + // newbon->DEX += base1; + // break; + // case SE_AGI: + // newbon->AGI += base1; + // break; + // case SE_STA: + // newbon->STA += base1; + // break; + // case SE_INT: + // newbon->INT += base1; + // break; + // case SE_WIS: + // newbon->WIS += base1; + // break; + // case SE_CHA: + // newbon->CHA += base1; + // break; + // case SE_WaterBreathing: + // //handled by client + // break; + // case SE_CurrentMana: + // newbon->ManaRegen += base1; + // break; + // case SE_ItemManaRegenCapIncrease: + // newbon->ItemManaRegenCap += base1; + // break; + // case SE_ResistFire: + // newbon->FR += base1; + // break; + // case SE_ResistCold: + // newbon->CR += base1; + // break; + // case SE_ResistPoison: + // newbon->PR += base1; + // break; + // case SE_ResistDisease: + // newbon->DR += base1; + // break; + // case SE_ResistMagic: + // newbon->MR += base1; + // break; + // case SE_ResistCorruption: + // newbon->Corrup += base1; + // break; + // case SE_IncreaseSpellHaste: + // break; + // case SE_IncreaseRange: + // break; + // case SE_MaxHPChange: + // newbon->MaxHP += base1; + // break; + // case SE_Packrat: + // newbon->Packrat += base1; + // break; + // case SE_TwoHandBash: + // break; + // case SE_SetBreathLevel: + // break; + // case SE_RaiseStatCap: + // switch(base2) + // { + // //are these #define'd somewhere? + // case 0: //str + // newbon->STRCapMod += base1; + // break; + // case 1: //sta + // newbon->STACapMod += base1; + // break; + // case 2: //agi + // newbon->AGICapMod += base1; + // break; + // case 3: //dex + // newbon->DEXCapMod += base1; + // break; + // case 4: //wis + // newbon->WISCapMod += base1; + // break; + // case 5: //int + // newbon->INTCapMod += base1; + // break; + // case 6: //cha + // newbon->CHACapMod += base1; + // break; + // case 7: //mr + // newbon->MRCapMod += base1; + // break; + // case 8: //cr + // newbon->CRCapMod += base1; + // break; + // case 9: //fr + // newbon->FRCapMod += base1; + // break; + // case 10: //pr + // newbon->PRCapMod += base1; + // break; + // case 11: //dr + // newbon->DRCapMod += base1; + // break; + // case 12: //corruption + // newbon->CorrupCapMod += base1; + // break; + // } + // break; + // case SE_PetDiscipline2: + // break; + // case SE_SpellSlotIncrease: + // break; + // case SE_MysticalAttune: + // newbon->BuffSlotIncrease += base1; + // break; + // case SE_TotalHP: + // newbon->HP += base1; + // break; + // case SE_StunResist: + // newbon->StunResist += base1; + // break; + // case SE_SpellCritChance: + // newbon->CriticalSpellChance += base1; + // break; + // case SE_SpellCritDmgIncrease: + // newbon->SpellCritDmgIncrease += base1; + // break; + // case SE_DotCritDmgIncrease: + // newbon->DotCritDmgIncrease += base1; + // break; + // case SE_ResistSpellChance: + // newbon->ResistSpellChance += base1; + // break; + // case SE_CriticalHealChance: + // newbon->CriticalHealChance += base1; + // break; + // case SE_CriticalHealOverTime: + // newbon->CriticalHealOverTime += base1; + // break; + // case SE_CriticalDoTChance: + // newbon->CriticalDoTChance += base1; + // break; + // case SE_ReduceSkillTimer: + // newbon->SkillReuseTime[base2] += base1; + // break; + // case SE_Fearless: + // newbon->Fearless = true; + // break; + // case SE_PersistantCasting: + // newbon->PersistantCasting += base1; + // break; + // case SE_DelayDeath: + // newbon->DelayDeath += base1; + // break; + // case SE_FrontalStunResist: + // newbon->FrontalStunResist += base1; + // break; + // case SE_ImprovedBindWound: + // newbon->BindWound += base1; + // break; + // case SE_MaxBindWound: + // newbon->MaxBindWound += base1; + // break; + // case SE_ExtraAttackChance: + // newbon->ExtraAttackChance += base1; + // break; + // case SE_SeeInvis: + // newbon->SeeInvis = base1; + // break; + // case SE_BaseMovementSpeed: + // newbon->BaseMovementSpeed += base1; + // break; + // case SE_IncreaseRunSpeedCap: + // newbon->IncreaseRunSpeedCap += base1; + // break; + // case SE_ConsumeProjectile: + // newbon->ConsumeProjectile += base1; + // break; + // case SE_ArcheryDamageModifier: + // newbon->ArcheryDamageModifier += base1; + // break; + // case SE_DamageShield: + // newbon->DamageShield += base1; + // break; + // case SE_CharmBreakChance: + // newbon->CharmBreakChance += base1; + // break; + // case SE_OffhandRiposteFail: + // newbon->OffhandRiposteFail += base1; + // break; + // case SE_ItemAttackCapIncrease: + // newbon->ItemATKCap += base1; + // break; + // case SE_GivePetGroupTarget: + // newbon->GivePetGroupTarget = true; + // break; + // case SE_ItemHPRegenCapIncrease: + // newbon->ItemHPRegenCap = +base1; + // break; + // case SE_Ambidexterity: + // newbon->Ambidexterity += base1; + // break; + // case SE_PetMaxHP: + // newbon->PetMaxHP += base1; + // break; + // case SE_AvoidMeleeChance: + // newbon->AvoidMeleeChance += base1; + // break; + // case SE_CombatStability: + // newbon->CombatStability += base1; + // break; + // case SE_PetCriticalHit: + // newbon->PetCriticalHit += base1; + // break; + // case SE_PetAvoidance: + // newbon->PetAvoidance += base1; + // break; + // case SE_ShieldBlock: + // newbon->ShieldBlock += base1; + // break; + // case SE_SecondaryDmgInc: + // newbon->SecondaryDmgInc = true; + // break; + // case SE_ChangeAggro: + // newbon->hatemod += base1; + // break; + // case SE_EndurancePool: + // newbon->Endurance += base1; + // break; + // case SE_ChannelChanceItems: + // newbon->ChannelChanceItems += base1; + // break; + // case SE_ChannelChanceSpells: + // newbon->ChannelChanceSpells += base1; + // break; + // case SE_DoubleSpecialAttack: + // newbon->DoubleSpecialAttack += base1; + // break; + // case SE_TripleBackstab: + // newbon->TripleBackstab += base1; + // break; + // case SE_FrontalBackstabMinDmg: + // newbon->FrontalBackstabMinDmg = true; + // break; + // case SE_FrontalBackstabChance: + // newbon->FrontalBackstabChance += base1; + // break; + // case SE_BlockBehind: + // newbon->BlockBehind += base1; + // break; + // case SE_StrikeThrough2: + // newbon->StrikeThrough += base1; + // break; + // case SE_DoubleAttackChance: + // newbon->DoubleAttackChance += base1; + // break; + // case SE_GiveDoubleAttack: + // newbon->GiveDoubleAttack += base1; + // break; + // case SE_ProcChance: + // newbon->ProcChance += base1; + // break; + // case SE_RiposteChance: + // newbon->RiposteChance += base1; + // break; + // case SE_Flurry: + // newbon->FlurryChance += base1; + // break; + // case SE_PetFlurry: + // newbon->PetFlurry = base1; + // break; + // case SE_BardSongRange: + // newbon->SongRange += base1; + // break; + // case SE_RootBreakChance: + // newbon->RootBreakChance += base1; + // break; + // case SE_UnfailingDivinity: + // newbon->UnfailingDivinity += base1; + // break; + // + // case SE_ProcOnKillShot: + // for(int i = 0; i < MAX_SPELL_TRIGGER*3; i+=3) + // { + // if(!newbon->SpellOnKill[i] || ((newbon->SpellOnKill[i] == base2) && (newbon->SpellOnKill[i+1] < base1))) + // { + // //base1 = chance, base2 = SpellID to be triggered, base3 = min npc level + // newbon->SpellOnKill[i] = base2; + // newbon->SpellOnKill[i+1] = base1; + // + // if (GetLevel() > 15) + // newbon->SpellOnKill[i+2] = GetLevel() - 15; //AA specifiy "non-trivial" + // else + // newbon->SpellOnKill[i+2] = 0; + // + // break; + // } + // } + // break; + // + // case SE_SpellOnDeath: + // for(int i = 0; i < MAX_SPELL_TRIGGER*2; i+=2) + // { + // if(!newbon->SpellOnDeath[i]) + // { + // // base1 = SpellID to be triggered, base2 = chance to fire + // newbon->SpellOnDeath[i] = base1; + // newbon->SpellOnDeath[i+1] = base2; + // break; + // } + // } + // break; + // + // case SE_TriggerOnCast: + // + // for(int i = 0; i < MAX_SPELL_TRIGGER; i++) + // { + // if (newbon->SpellTriggers[i] == aaid) + // break; + // + // if(!newbon->SpellTriggers[i]) + // { + // //Save the 'aaid' of each triggerable effect to an array + // newbon->SpellTriggers[i] = aaid; + // break; + // } + // } + // break; + // + // case SE_CriticalHitChance: + // { + // if(base2 == -1) + // newbon->CriticalHitChance[HIGHEST_SKILL+1] += base1; + // else + // newbon->CriticalHitChance[base2] += base1; + // } + // break; + // + // case SE_CriticalDamageMob: + // { + // // base1 = effect value, base2 = skill restrictions(-1 for all) + // if(base2 == -1) + // newbon->CritDmgMob[HIGHEST_SKILL+1] += base1; + // else + // newbon->CritDmgMob[base2] += base1; + // break; + // } + // + // case SE_CriticalSpellChance: + // { + // newbon->CriticalSpellChance += base1; + // + // if (base2 > newbon->SpellCritDmgIncrease) + // newbon->SpellCritDmgIncrease = base2; + // + // break; + // } + // + // case SE_ResistFearChance: + // { + // if(base1 == 100) // If we reach 100% in a single spell/item then we should be immune to negative fear resist effects until our immunity is over + // newbon->Fearless = true; + // + // newbon->ResistFearChance += base1; // these should stack + // break; + // } + // + // case SE_SkillDamageAmount: + // { + // if(base2 == -1) + // newbon->SkillDamageAmount[HIGHEST_SKILL+1] += base1; + // else + // newbon->SkillDamageAmount[base2] += base1; + // break; + // } + // + // case SE_SpecialAttackKBProc: + // { + // //You can only have one of these per client. [AA Dragon Punch] + // newbon->SpecialAttackKBProc[0] = base1; //Chance base 100 = 25% proc rate + // newbon->SpecialAttackKBProc[1] = base2; //Skill to KB Proc Off + // break; + // } + // + // case SE_DamageModifier: + // { + // if(base2 == -1) + // newbon->DamageModifier[HIGHEST_SKILL+1] += base1; + // else + // newbon->DamageModifier[base2] += base1; + // break; + // } + // + // case SE_SlayUndead: + // { + // if(newbon->SlayUndead[1] < base1) + // newbon->SlayUndead[0] = base1; // Rate + // newbon->SlayUndead[1] = base2; // Damage Modifier + // break; + // } + // + // case SE_GiveDoubleRiposte: + // { + // //0=Regular Riposte 1=Skill Attack Riposte 2=Skill + // if(base2 == 0){ + // if(newbon->GiveDoubleRiposte[0] < base1) + // newbon->GiveDoubleRiposte[0] = base1; + // } + // //Only for special attacks. + // else if(base2 > 0 && (newbon->GiveDoubleRiposte[1] < base1)){ + // newbon->GiveDoubleRiposte[1] = base1; + // newbon->GiveDoubleRiposte[2] = base2; + // } + // + // break; + // } + // + // //Kayen: Not sure best way to implement this yet. + // //Physically raises skill cap ie if 55/55 it will raise to 55/60 + // case SE_RaiseSkillCap: + // { + // if(newbon->RaiseSkillCap[0] < base1){ + // newbon->RaiseSkillCap[0] = base1; //value + // newbon->RaiseSkillCap[1] = base2; //skill + // } + // break; + // } + // + // case SE_MasteryofPast: + // { + // if(newbon->MasteryofPast < base1) + // newbon->MasteryofPast = base1; + // break; + // } + // + // case SE_CastingLevel2: + // case SE_CastingLevel: + // { + // newbon->effective_casting_level += base1; + // break; + // } + // + // + // case SE_DivineSave: + // { + // if(newbon->DivineSaveChance[0] < base1) + // { + // newbon->DivineSaveChance[0] = base1; + // newbon->DivineSaveChance[1] = base2; + // } + // break; + // } + // + // case SE_SpellEffectResistChance: + // { + // for(int e = 0; e < MAX_RESISTABLE_EFFECTS*2; e+=2) + // { + // if(!newbon->SEResist[e] || ((newbon->SEResist[e] = base2) && (newbon->SEResist[e+1] < base1)) ){ + // newbon->SEResist[e] = base2; + // newbon->SEResist[e+1] = base1; + // break; + // } + // } + // break; + // } + // + // case SE_MitigateDamageShield: + // { + // if (base1 < 0) + // base1 = base1*(-1); + // + // newbon->DSMitigationOffHand += base1; + // break; + // } + // + // case SE_FinishingBlow: + // { + // + // //base1 = chance, base2 = damage + // if (newbon->FinishingBlow[1] < base2){ + // newbon->FinishingBlow[0] = base1; + // newbon->FinishingBlow[1] = base2; + // } + // break; + // } + // + // case SE_FinishingBlowLvl: + // { + // //base1 = level, base2 = ??? (Set to 200 in AA data, possible proc rate mod?) + // if (newbon->FinishingBlowLvl[0] < base1){ + // newbon->FinishingBlowLvl[0] = base1; + // newbon->FinishingBlowLvl[1] = base2; + // } + // break; + // } + // } + //} } bool Bot::IsValidRaceClassCombo() { @@ -6326,398 +6316,399 @@ int32 Bot::CalcBotAAFocus(BotfocusType type, uint32 aa_ID, uint16 spell_id) bool LimitFound = false; int FocusCount = 0; - std::map >::const_iterator find_iter = aa_effects.find(aa_ID); - if(find_iter == aa_effects.end()) - { - return 0; - } + //old AA + //std::map >::const_iterator find_iter = aa_effects.find(aa_ID); + //if(find_iter == aa_effects.end()) + //{ + // return 0; + //} + // + //for (std::map::const_iterator iter = aa_effects[aa_ID].begin(); iter != aa_effects[aa_ID].end(); ++iter) + //{ + // effect = iter->second.skill_id; + // base1 = iter->second.base1; + // base2 = iter->second.base2; + // slot = iter->second.slot; + // + // //AA Foci's can contain multiple focus effects within the same AA. + // //To handle this we will not automatically return zero if a limit is found. + // //Instead if limit is found and multiple effects, we will reset the limit check + // //when the next valid focus effect is found. + // if (IsFocusEffect(0, 0, true,effect) || (effect == SE_TriggerOnCast)){ + // FocusCount++; + // //If limit found on prior check next, else end loop. + // if (FocusCount > 1){ + // if (LimitFound){ + // value = 0; + // LimitFound = false; + // } + // + // else{ + // break; + // } + // } + // } + // + // + // switch (effect) + // { + // case SE_Blank: + // break; + // + // //Handle Focus Limits + // case SE_LimitResist: + // if(base1) + // { + // if(spell.resisttype != base1) + // LimitFound = true; + // } + // break; + // case SE_LimitInstant: + // if(spell.buffduration) + // LimitFound = true; + // break; + // case SE_LimitMaxLevel: + // spell_level = spell.classes[(GetClass()%16) - 1]; + // lvldiff = spell_level - base1; + // //every level over cap reduces the effect by base2 percent unless from a clicky when ItemCastsUseFocus is true + // if(lvldiff > 0 && (spell_level <= RuleI(Character, MaxLevel) || RuleB(Character, ItemCastsUseFocus) == false)) + // { + // if(base2 > 0) + // { + // lvlModifier -= base2*lvldiff; + // if(lvlModifier < 1) + // LimitFound = true; + // } + // else { + // LimitFound = true; + // } + // } + // break; + // case SE_LimitMinLevel: + // if((spell.classes[(GetClass()%16) - 1]) < base1) + // LimitFound = true; + // break; + // case SE_LimitCastTimeMin: + // if (spell.cast_time < base1) + // LimitFound = true; + // break; + // case SE_LimitSpell: + // // Exclude spell(any but this) + // if(base1 < 0) { + // if (spell_id == (base1*-1)) + // LimitFound = true; + // } + // else { + // // Include Spell(only this) + // if (spell_id != base1) + // LimitFound = true; + // } + // break; + // case SE_LimitMinDur: + // if (base1 > CalcBuffDuration_formula(GetLevel(), spell.buffdurationformula, spell.buffduration)) + // LimitFound = true; + // break; + // case SE_LimitEffect: + // // Exclude effect(any but this) + // if(base1 < 0) { + // if(IsEffectInSpell(spell_id,(base1*-1))) + // LimitFound = true; + // } + // else { + // // Include effect(only this) + // if(!IsEffectInSpell(spell_id,base1)) + // LimitFound = true; + // } + // break; + // case SE_LimitSpellType: + // switch(base1) + // { + // case 0: + // if (!IsDetrimentalSpell(spell_id)) + // LimitFound = true; + // break; + // case 1: + // if (!IsBeneficialSpell(spell_id)) + // LimitFound = true; + // break; + // } + // break; + // + // case SE_LimitManaMin: + // if(spell.mana < base1) + // LimitFound = true; + // break; + // + // case SE_LimitTarget: + // // Exclude + // if(base1 < 0){ + // if(-base1 == spell.targettype) + // LimitFound = true; + // } + // // Include + // else { + // if(base1 != spell.targettype) + // LimitFound = true; + // } + // break; + // + // case SE_LimitCombatSkills: + // // 1 is for disciplines only + // if(base1 == 1 && !IsDiscipline(spell_id)) + // LimitFound = true; + // // 0 is spells only + // else if(base1 == 0 && IsDiscipline(spell_id)) + // LimitFound = true; + // break; + // + // case SE_LimitSpellGroup: + // if(base1 > 0 && base1 != spell.spellgroup) + // LimitFound = true; + // else if(base1 < 0 && base1 == spell.spellgroup) + // LimitFound = true; + // break; + // + // + // case SE_LimitCastingSkill: + // LimitSpellSkill = true; + // if(base1 == spell.skill) + // SpellSkill_Found = true; + // break; + // + // case SE_LimitClass: + // //Do not use this limit more then once per spell. If multiple class, treat value like items would. + // if (!PassLimitClass(base1, GetClass())) + // LimitFound = true; + // break; + // + // + // //Handle Focus Effects + // case SE_ImprovedDamage: + // if (type == focusImprovedDamage && base1 > value) + // value = base1; + // break; + // + // case SE_ImprovedHeal: + // if (type == focusImprovedHeal && base1 > value) + // value = base1; + // break; + // + // case SE_ReduceManaCost: + // if (type == focusManaCost ) + // value = base1; + // break; + // + // case SE_IncreaseSpellHaste: + // if (type == focusSpellHaste && base1 > value) + // value = base1; + // break; + // + // case SE_IncreaseSpellDuration: + // if (type == focusSpellDuration && base1 > value) + // value = base1; + // break; + // + // case SE_SpellDurationIncByTic: + // if (type == focusSpellDurByTic && base1 > value) + // value = base1; + // break; + // + // case SE_SwarmPetDuration: + // if (type == focusSwarmPetDuration && base1 > value) + // value = base1; + // break; + // + // case SE_IncreaseRange: + // if (type == focusRange && base1 > value) + // value = base1; + // break; + // + // case SE_ReduceReagentCost: + // if (type == focusReagentCost && base1 > value) + // value = base1; + // break; + // + // case SE_PetPowerIncrease: + // if (type == focusPetPower && base1 > value) + // value = base1; + // break; + // + // case SE_SpellResistReduction: + // if (type == focusResistRate && base1 > value) + // value = base1; + // break; + // + // case SE_SpellHateMod: + // if (type == focusSpellHateMod) + // { + // if(value != 0) + // { + // if(value > 0) + // { + // if(base1 > value) + // { + // value = base1; + // } + // } + // else + // { + // if(base1 < value) + // { + // value = base1; + // } + // } + // } + // else + // value = base1; + // } + // break; + // + // case SE_ReduceReuseTimer: + // { + // if(type == focusReduceRecastTime) + // value = base1 / 1000; + // + // break; + // } + // + // case SE_TriggerOnCast: + // { + // if(type == focusTriggerOnCast) + // { + // if(zone->random.Int(0, 100) <= base1){ + // value = base2; + // } + // + // else{ + // value = 0; + // LimitFound = true; + // } + // } + // break; + // } + // case SE_FcSpellVulnerability: + // { + // if(type == focusSpellVulnerability) + // { + // value = base1; + // } + // break; + // } + // case SE_BlockNextSpellFocus: + // { + // if(type == focusBlockNextSpell) + // { + // if(zone->random.Int(1, 100) <= base1) + // value = 1; + // } + // break; + // } + // case SE_FcTwincast: + // { + // if(type == focusTwincast) + // { + // value = base1; + // } + // break; + // } + // + // /* + // case SE_SympatheticProc: + // { + // if(type == focusSympatheticProc) + // { + // float ProcChance, ProcBonus; + // int16 ProcRateMod = base1; //Baseline is 100 for most Sympathetic foci + // int32 cast_time = GetActSpellCasttime(spell_id, spells[spell_id].cast_time); + // GetSympatheticProcChances(ProcBonus, ProcChance, cast_time, ProcRateMod); + // + // if(zone->random.Real(0, 1) <= ProcChance) + // value = focus_id; + // + // else + // value = 0; + // } + // break; + // } + // */ + // case SE_FcDamageAmt: + // { + // if(type == focusFcDamageAmt) + // value = base1; + // + // break; + // } + // + // case SE_FcDamageAmtCrit: + // { + // if(type == focusFcDamageAmtCrit) + // value = base1; + // + // break; + // } + // + // case SE_FcDamageAmtIncoming: + // { + // if(type == focusFcDamageAmtIncoming) + // value = base1; + // + // break; + // } + // + // case SE_FcHealAmtIncoming: + // if(type == focusFcHealAmtIncoming) + // value = base1; + // break; + // + // case SE_FcHealPctCritIncoming: + // if (type == focusFcHealPctCritIncoming) + // value = base1; + // break; + // + // case SE_FcHealAmtCrit: + // if(type == focusFcHealAmtCrit) + // value = base1; + // break; + // + // case SE_FcHealAmt: + // if(type == focusFcHealAmt) + // value = base1; + // break; + // + // case SE_FcHealPctIncoming: + // if(type == focusFcHealPctIncoming) + // value = base1; + // break; + // + // case SE_FcBaseEffects: + // { + // if (type == focusFcBaseEffects) + // value = base1; + // + // break; + // } + // case SE_FcDamagePctCrit: + // { + // if(type == focusFcDamagePctCrit) + // value = base1; + // + // break; + // } + // + // case SE_FcIncreaseNumHits: + // { + // if(type == focusIncreaseNumHits) + // value = base1; + // + // break; + // } - for (std::map::const_iterator iter = aa_effects[aa_ID].begin(); iter != aa_effects[aa_ID].end(); ++iter) - { - effect = iter->second.skill_id; - base1 = iter->second.base1; - base2 = iter->second.base2; - slot = iter->second.slot; - - //AA Foci's can contain multiple focus effects within the same AA. - //To handle this we will not automatically return zero if a limit is found. - //Instead if limit is found and multiple effects, we will reset the limit check - //when the next valid focus effect is found. - if (IsFocusEffect(0, 0, true,effect) || (effect == SE_TriggerOnCast)){ - FocusCount++; - //If limit found on prior check next, else end loop. - if (FocusCount > 1){ - if (LimitFound){ - value = 0; - LimitFound = false; - } - - else{ - break; - } - } - } - - - switch (effect) - { - case SE_Blank: - break; - - //Handle Focus Limits - case SE_LimitResist: - if(base1) - { - if(spell.resisttype != base1) - LimitFound = true; - } - break; - case SE_LimitInstant: - if(spell.buffduration) - LimitFound = true; - break; - case SE_LimitMaxLevel: - spell_level = spell.classes[(GetClass()%16) - 1]; - lvldiff = spell_level - base1; - //every level over cap reduces the effect by base2 percent unless from a clicky when ItemCastsUseFocus is true - if(lvldiff > 0 && (spell_level <= RuleI(Character, MaxLevel) || RuleB(Character, ItemCastsUseFocus) == false)) - { - if(base2 > 0) - { - lvlModifier -= base2*lvldiff; - if(lvlModifier < 1) - LimitFound = true; - } - else { - LimitFound = true; - } - } - break; - case SE_LimitMinLevel: - if((spell.classes[(GetClass()%16) - 1]) < base1) - LimitFound = true; - break; - case SE_LimitCastTimeMin: - if (spell.cast_time < base1) - LimitFound = true; - break; - case SE_LimitSpell: - // Exclude spell(any but this) - if(base1 < 0) { - if (spell_id == (base1*-1)) - LimitFound = true; - } - else { - // Include Spell(only this) - if (spell_id != base1) - LimitFound = true; - } - break; - case SE_LimitMinDur: - if (base1 > CalcBuffDuration_formula(GetLevel(), spell.buffdurationformula, spell.buffduration)) - LimitFound = true; - break; - case SE_LimitEffect: - // Exclude effect(any but this) - if(base1 < 0) { - if(IsEffectInSpell(spell_id,(base1*-1))) - LimitFound = true; - } - else { - // Include effect(only this) - if(!IsEffectInSpell(spell_id,base1)) - LimitFound = true; - } - break; - case SE_LimitSpellType: - switch(base1) - { - case 0: - if (!IsDetrimentalSpell(spell_id)) - LimitFound = true; - break; - case 1: - if (!IsBeneficialSpell(spell_id)) - LimitFound = true; - break; - } - break; - - case SE_LimitManaMin: - if(spell.mana < base1) - LimitFound = true; - break; - - case SE_LimitTarget: - // Exclude - if(base1 < 0){ - if(-base1 == spell.targettype) - LimitFound = true; - } - // Include - else { - if(base1 != spell.targettype) - LimitFound = true; - } - break; - - case SE_LimitCombatSkills: - // 1 is for disciplines only - if(base1 == 1 && !IsDiscipline(spell_id)) - LimitFound = true; - // 0 is spells only - else if(base1 == 0 && IsDiscipline(spell_id)) - LimitFound = true; - break; - - case SE_LimitSpellGroup: - if(base1 > 0 && base1 != spell.spellgroup) - LimitFound = true; - else if(base1 < 0 && base1 == spell.spellgroup) - LimitFound = true; - break; - - - case SE_LimitCastingSkill: - LimitSpellSkill = true; - if(base1 == spell.skill) - SpellSkill_Found = true; - break; - - case SE_LimitClass: - //Do not use this limit more then once per spell. If multiple class, treat value like items would. - if (!PassLimitClass(base1, GetClass())) - LimitFound = true; - break; - - - //Handle Focus Effects - case SE_ImprovedDamage: - if (type == focusImprovedDamage && base1 > value) - value = base1; - break; - - case SE_ImprovedHeal: - if (type == focusImprovedHeal && base1 > value) - value = base1; - break; - - case SE_ReduceManaCost: - if (type == focusManaCost ) - value = base1; - break; - - case SE_IncreaseSpellHaste: - if (type == focusSpellHaste && base1 > value) - value = base1; - break; - - case SE_IncreaseSpellDuration: - if (type == focusSpellDuration && base1 > value) - value = base1; - break; - - case SE_SpellDurationIncByTic: - if (type == focusSpellDurByTic && base1 > value) - value = base1; - break; - - case SE_SwarmPetDuration: - if (type == focusSwarmPetDuration && base1 > value) - value = base1; - break; - - case SE_IncreaseRange: - if (type == focusRange && base1 > value) - value = base1; - break; - - case SE_ReduceReagentCost: - if (type == focusReagentCost && base1 > value) - value = base1; - break; - - case SE_PetPowerIncrease: - if (type == focusPetPower && base1 > value) - value = base1; - break; - - case SE_SpellResistReduction: - if (type == focusResistRate && base1 > value) - value = base1; - break; - - case SE_SpellHateMod: - if (type == focusSpellHateMod) - { - if(value != 0) - { - if(value > 0) - { - if(base1 > value) - { - value = base1; - } - } - else - { - if(base1 < value) - { - value = base1; - } - } - } - else - value = base1; - } - break; - - case SE_ReduceReuseTimer: - { - if(type == focusReduceRecastTime) - value = base1 / 1000; - - break; - } - - case SE_TriggerOnCast: - { - if(type == focusTriggerOnCast) - { - if(zone->random.Int(0, 100) <= base1){ - value = base2; - } - - else{ - value = 0; - LimitFound = true; - } - } - break; - } - case SE_FcSpellVulnerability: - { - if(type == focusSpellVulnerability) - { - value = base1; - } - break; - } - case SE_BlockNextSpellFocus: - { - if(type == focusBlockNextSpell) - { - if(zone->random.Int(1, 100) <= base1) - value = 1; - } - break; - } - case SE_FcTwincast: - { - if(type == focusTwincast) - { - value = base1; - } - break; - } - - /* - case SE_SympatheticProc: - { - if(type == focusSympatheticProc) - { - float ProcChance, ProcBonus; - int16 ProcRateMod = base1; //Baseline is 100 for most Sympathetic foci - int32 cast_time = GetActSpellCasttime(spell_id, spells[spell_id].cast_time); - GetSympatheticProcChances(ProcBonus, ProcChance, cast_time, ProcRateMod); - - if(zone->random.Real(0, 1) <= ProcChance) - value = focus_id; - - else - value = 0; - } - break; - } - */ - case SE_FcDamageAmt: - { - if(type == focusFcDamageAmt) - value = base1; - - break; - } - - case SE_FcDamageAmtCrit: - { - if(type == focusFcDamageAmtCrit) - value = base1; - - break; - } - - case SE_FcDamageAmtIncoming: - { - if(type == focusFcDamageAmtIncoming) - value = base1; - - break; - } - - case SE_FcHealAmtIncoming: - if(type == focusFcHealAmtIncoming) - value = base1; - break; - - case SE_FcHealPctCritIncoming: - if (type == focusFcHealPctCritIncoming) - value = base1; - break; - - case SE_FcHealAmtCrit: - if(type == focusFcHealAmtCrit) - value = base1; - break; - - case SE_FcHealAmt: - if(type == focusFcHealAmt) - value = base1; - break; - - case SE_FcHealPctIncoming: - if(type == focusFcHealPctIncoming) - value = base1; - break; - - case SE_FcBaseEffects: - { - if (type == focusFcBaseEffects) - value = base1; - - break; - } - case SE_FcDamagePctCrit: - { - if(type == focusFcDamagePctCrit) - value = base1; - - break; - } - - case SE_FcIncreaseNumHits: - { - if(type == focusIncreaseNumHits) - value = base1; - - break; - } - - //Check for spell skill limits. - if ((LimitSpellSkill) && (!SpellSkill_Found)) - return 0; - - } - } + ////Check for spell skill limits. + //if ((LimitSpellSkill) && (!SpellSkill_Found)) + // return 0; + // + // } + //} if (LimitFound){ return 0; @@ -6885,30 +6876,30 @@ int32 Bot::GetBotFocusEffect(BotfocusType bottype, uint16 spell_id) { // AA Focus if (aabonuses.FocusEffects[bottype]){ - - int totalAAs = database.CountAAs(); - int32 Total3 = 0; - uint32 slots = 0; - uint32 aa_AA = 0; - uint32 aa_value = 0; - - for (int i = 0; i < totalAAs; i++) { //iterate through all of the client's AAs - std::map::iterator aa = botAAs.find(i); - if(aa != botAAs.end()) { // make sure aa exists or we'll crash zone - aa_AA = aa->second.aa_id; //same as aaid from the aa_effects table - aa_value = aa->second.total_levels; //how many points in it - if (aa_AA < 1 || aa_value < 1) - continue; - - Total3 = CalcBotAAFocus(bottype, aa_AA, spell_id); - if (Total3 > 0 && realTotal3 >= 0 && Total3 > realTotal3) { - realTotal3 = Total3; - } - else if (Total3 < 0 && Total3 < realTotal3) { - realTotal3 = Total3; - } - } - } + //old aa + //int totalAAs = database.CountAAs(); + //int32 Total3 = 0; + //uint32 slots = 0; + //uint32 aa_AA = 0; + //uint32 aa_value = 0; + // + //for (int i = 0; i < totalAAs; i++) { //iterate through all of the client's AAs + // std::map::iterator aa = botAAs.find(i); + // if(aa != botAAs.end()) { // make sure aa exists or we'll crash zone + // aa_AA = aa->second.aa_id; //same as aaid from the aa_effects table + // aa_value = aa->second.total_levels; //how many points in it + // if (aa_AA < 1 || aa_value < 1) + // continue; + // + // Total3 = CalcBotAAFocus(bottype, aa_AA, spell_id); + // if (Total3 > 0 && realTotal3 >= 0 && Total3 > realTotal3) { + // realTotal3 = Total3; + // } + // else if (Total3 < 0 && Total3 < realTotal3) { + // realTotal3 = Total3; + // } + // } + //} } if(bottype == BotfocusReagentCost && IsSummonPetSpell(spell_id) && GetAA(aaElementalPact)) @@ -8940,6 +8931,7 @@ int32 Bot::GetActSpellCost(uint16 spell_id, int32 cost) { break; } + //aa old bonus += 0.05 * GetAA(aaAdvancedSpellCastingMastery); if(SuccessChance <= (SpecializeSkill * 0.3 * bonus)) diff --git a/zone/bot.h b/zone/bot.h index 25e0d1c52..1f1262ffc 100644 --- a/zone/bot.h +++ b/zone/bot.h @@ -448,8 +448,6 @@ public: bool IsBotWISCaster() { return (GetClass() == CLERIC || GetClass() == DRUID || GetClass() == SHAMAN); } bool CanHeal(); int GetRawACNoShield(int &shield_ac); - void LoadAAs(); - uint32 GetAA(uint32 aa_id); void ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon); bool GetHasBeenSummoned() { return _hasBeenSummoned; } const glm::vec3 GetPreSummonLocation() const { return m_PreSummonLocation; } diff --git a/zone/client.cpp b/zone/client.cpp index f7510f855..24968f005 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -439,7 +439,7 @@ void Client::SendZoneInPackets() //Send AA Exp packet: if (GetLevel() >= 51) - SendAAStats(); + SendAlternateAdvancementStats(); // Send exp packets outapp = new EQApplicationPacket(OP_ExpUpdate, sizeof(ExpUpdate_Struct)); @@ -8040,56 +8040,6 @@ void Client::TryItemTimer(int slot) } } -void Client::RefundAA() { - int cur = 0; - bool refunded = false; - - for(int x = 0; x < aaHighestID; x++) { - cur = GetAA(x); - if(cur > 0){ - SendAA_Struct* curaa = zone->FindAA(x); - if(cur){ - SetAA(x, 0); - for(int j = 0; j < cur; j++) { - m_pp.aapoints += curaa->cost + (curaa->cost_inc * j); - refunded = true; - } - } - else - { - m_pp.aapoints += cur; - SetAA(x, 0); - refunded = true; - } - } - } - - if(refunded) { - SaveAA(); - Save(); - // Kick(); - } -} - -void Client::IncrementAA(int aa_id) { - SendAA_Struct* aa2 = zone->FindAA(aa_id); - - if(aa2 == nullptr) - return; - - if(GetAA(aa_id) == aa2->max_level) - return; - - SetAA(aa_id, GetAA(aa_id) + 1); - - SaveAA(); - - SendAA(aa_id); - SendAATable(); - SendAAStats(); - CalcBonuses(); -} - void Client::SendItemScale(ItemInst *inst) { int slot = m_inv.GetSlotByItemInst(inst); if(slot != -1) { diff --git a/zone/client.h b/zone/client.h index 0b105c3ef..bd2c5371d 100644 --- a/zone/client.h +++ b/zone/client.h @@ -762,9 +762,16 @@ public: //New AA Methods void SendAlternateAdvancementRank(int aa_id, int level); void SendAlternateAdvancementTable(); + void SendAlternateAdvancementStats(); + void PurchaseAlternateAdvancementRank(int rank_id); + void SendAlternateAdvancementPoints(); + + void SetAAPoints(uint32 points) { m_pp.aapoints = points; SendAlternateAdvancementStats(); } + void AddAAPoints(uint32 points) { m_pp.aapoints += points; SendAlternateAdvancementStats(); } + int GetAAPoints() { return m_pp.aapoints; } + int GetSpentAA() { return m_pp.aapoints_spent; } //old AA Methods - void SendAAList(); void ResetAA(); void SendClearAA(); void SendAA(uint32 id, int seq=1); @@ -776,7 +783,6 @@ public: void SetTitleSuffix(const char *txt); inline uint32 GetMaxAAXP(void) const { return max_AAXP; } inline uint32 GetAAXP() const { return m_pp.expAA; } - void SendAAStats(); void SendAATable(); void SendAATimers(); int GetAATimerID(aaID activate); @@ -790,10 +796,6 @@ public: inline uint32 GetAAPointsSpent() { return m_pp.aapoints_spent; } int16 CalcAAFocusEffect(focusType type, uint16 focus_spell, uint16 spell_id); int16 CalcAAFocus(focusType type, uint32 aa_ID, uint16 spell_id); - void SetAAPoints(uint32 points) { m_pp.aapoints = points; SendAAStats(); } - void AddAAPoints(uint32 points) { m_pp.aapoints += points; SendAAStats(); } - int GetAAPoints() { return m_pp.aapoints; } - int GetSpentAA() { return m_pp.aapoints_spent; } void RefundAA(); void IncrementAA(int aa_id); int32 GetAAEffectDataBySlot(uint32 aa_ID, uint32 slot_id, bool GetEffect, bool GetBase1, bool GetBase2); diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index f97873db3..e7d3b61a7 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -1152,7 +1152,7 @@ void Client::Handle_Connect_OP_TGB(const EQApplicationPacket *app) void Client::Handle_Connect_OP_UpdateAA(const EQApplicationPacket *app) { - SendAATable(); + SendAlternateAdvancementPoints(); } void Client::Handle_Connect_OP_WearChange(const EQApplicationPacket *app) @@ -1439,61 +1439,9 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) if (m_pp.ldon_points_tak < 0 || m_pp.ldon_points_tak > 2000000000){ m_pp.ldon_points_tak = 0; } if (m_pp.ldon_points_available < 0 || m_pp.ldon_points_available > 2000000000){ m_pp.ldon_points_available = 0; } - /* Initialize AA's : Move to function eventually */ - //aa old - //for (uint32 a = 0; a < MAX_PP_AA_ARRAY; a++) - // aa[a] = &m_pp.aa_array[a]; - //query = StringFormat( - // "SELECT " - // "slot, " - // "aa_id, " - // "aa_value, " - // "charges " - // "FROM " - // "`character_alternate_abilities` " - // "WHERE `id` = %u ORDER BY `slot`", this->CharacterID()); - //results = database.QueryDatabase(query); i = 0; - //int offset = 0; // offset to fix the hole from expendables - //for (auto row = results.begin(); row != results.end(); ++row) { - // i = atoi(row[0]) - offset; - // m_pp.aa_array[i].AA = atoi(row[1]); - // m_pp.aa_array[i].value = atoi(row[2]); - // m_pp.aa_array[i].charges = atoi(row[3]); - // /* A used expendable could cause there to be a "hole" in the array, this is very bad. Bad things like keeping your expendable after use. - // We could do a few things, one of them being reshuffling when the hole is created or defer the fixing until a later point, like during load! - // Or just never making a hole in the array and just have hacks every where. Fixing the hole at load really just keeps 1 hack in Client::SendAATable - // and keeping this offset that will cause the next AA to be pushed back over the hole. We also need to clean up on save so we don't have multiple - // entries for a single AA. - // */ - // if (m_pp.aa_array[i].value == 0) - // offset++; - //} - //for (uint32 a = 0; a < MAX_PP_AA_ARRAY; a++){ - // uint32 id = aa[a]->AA; - // //watch for invalid AA IDs - // if (id == aaNone) - // continue; - // if (id >= aaHighestID) { - // aa[a]->AA = aaNone; - // aa[a]->value = 0; - // continue; - // } - // if (aa[a]->value == 0) { - // aa[a]->AA = aaNone; - // continue; - // } - // if (aa[a]->value > HIGHEST_AA_VALUE) { - // aa[a]->AA = aaNone; - // aa[a]->value = 0; - // continue; - // } - // - // //aa old -// // if (aa[a]->value > 1) /* hack in some stuff for sony's new AA method (where each level of each aa.has a seperate ID) */ -// // aa_points[(id - aa[a]->value + 1)] = aa[a]->value; -// // else -// // aa_points[id] = aa[a]->value; - //} + if(!database.LoadAlternateAdvancement(this)) { + Log.Out(Logs::General, Logs::Error, "Error loading AA points for %s", GetName()); + } if (SPDAT_RECORDS > 0) { for (uint32 z = 0; zsize != sizeof(AA_Action)){ - printf("Error! OP_AAAction size didnt match!\n"); + Log.Out(Logs::General, Logs::AA, "Error! OP_AAAction size didnt match!"); return; } AA_Action* action = (AA_Action*)app->pBuffer; if (action->action == aaActionActivate) {//AA Hotkey Log.Out(Logs::Detail, Logs::AA, "Activating AA %d", action->ability); - ActivateAA((aaID)action->ability); + //ActivateAlternateAdvancementAbility(action->ability); } else if (action->action == aaActionBuy) { - BuyAA(action); + PurchaseAlternateAdvancementRank(action->ability); } else if (action->action == aaActionDisableEXP){ //Turn Off AA Exp if (m_epp.perAA > 0) Message_StringID(0, AA_OFF); + m_epp.perAA = 0; - SendAAStats(); + SendAlternateAdvancementStats(); } else if (action->action == aaActionSetEXP) { if (m_epp.perAA == 0) Message_StringID(0, AA_ON); m_epp.perAA = action->exp_value; - if (m_epp.perAA<0 || m_epp.perAA>100) m_epp.perAA = 0; // stop exploit with sanity check + if (m_epp.perAA < 0 || m_epp.perAA > 100) + m_epp.perAA = 0; // stop exploit with sanity check + // send an update - SendAAStats(); - SendAATable(); + SendAlternateAdvancementStats(); + SendAlternateAdvancementTable(); } else { - printf("Unknown AA action: %u %u 0x%x %d\n", action->action, action->ability, action->unknown08, action->exp_value); + Log.Out(Logs::General, Logs::AA, "Unknown AA action : %u %u 0x%x %d", action->action, action->ability, action->unknown08, action->exp_value); } - - return; } void Client::Handle_OP_AcceptNewTask(const EQApplicationPacket *app) diff --git a/zone/command.cpp b/zone/command.cpp index f2a84baaa..298022dc9 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -5600,8 +5600,8 @@ void command_setaapts(Client *c, const Seperator *sep) t->SetLeadershipEXP(t->GetGroupEXP(), atoi(sep->arg[2])*RAID_EXP_PER_POINT); } else { t->SetEXP(t->GetEXP(),t->GetMaxAAXP()*atoi(sep->arg[2]),false); - t->SendAAStats(); - t->SendAATable(); + t->SendAlternateAdvancementStats(); + t->SendAlternateAdvancementTable(); } } @@ -7684,54 +7684,55 @@ void command_reloadtitles(Client *c, const Seperator *sep) } +//old aa, probably to be removed void command_altactivate(Client *c, const Seperator *sep){ - if(sep->arg[1][0] == '\0'){ - c->Message(10, "Invalid argument, usage:"); - c->Message(10, "#altactivate list - lists the AA ID numbers that are available to you"); - c->Message(10, "#altactivate time [argument] - returns the time left until you can use the AA with the ID that matches the argument."); - c->Message(10, "#altactivate [argument] - activates the AA with the ID that matches the argument."); - return; - } - if(!strcasecmp(sep->arg[1], "help")){ - c->Message(10, "Usage:"); - c->Message(10, "#altactivate list - lists the AA ID numbers that are available to you"); - c->Message(10, "#altactivate time [argument] - returns the time left until you can use the AA with the ID that matches the argument."); - c->Message(10, "#altactivate [argument] - activates the AA with the ID that matches the argument."); - return; - } - if(!strcasecmp(sep->arg[1], "list")){ - c->Message(10, "You have access to the following AA Abilities:"); - int x, val; - SendAA_Struct* saa = nullptr; - for(x = 0; x < aaHighestID; x++){ - if(AA_Actions[x][0].spell_id || AA_Actions[x][0].action){ //if there's an action or spell associated we assume it's a valid - val = 0; //and assume if they don't have a value for the first rank then it isn't valid for any rank - saa = nullptr; - val = c->GetAA(x); - if(val){ - saa = zone->FindAA(x); - c->Message(10, "%d: %s %d", x, saa->name, val); - } - } - } - } - else if(!strcasecmp(sep->arg[1], "time")){ - int ability = atoi(sep->arg[2]); - if(c->GetAA(ability)){ - int remain = c->GetPTimers().GetRemainingTime(pTimerAAStart + ability); - if(remain) - c->Message(10, "You may use that ability in %d minutes and %d seconds.", (remain/60), (remain%60)); - else - c->Message(10, "You may use that ability now."); - } - else{ - c->Message(10, "You do not have access to that ability."); - } - } - else - { - c->ActivateAA((aaID) atoi(sep->arg[1])); - } +// if(sep->arg[1][0] == '\0'){ +// c->Message(10, "Invalid argument, usage:"); +// c->Message(10, "#altactivate list - lists the AA ID numbers that are available to you"); +// c->Message(10, "#altactivate time [argument] - returns the time left until you can use the AA with the ID that matches the argument."); +// c->Message(10, "#altactivate [argument] - activates the AA with the ID that matches the argument."); +// return; +// } +// if(!strcasecmp(sep->arg[1], "help")){ +// c->Message(10, "Usage:"); +// c->Message(10, "#altactivate list - lists the AA ID numbers that are available to you"); +// c->Message(10, "#altactivate time [argument] - returns the time left until you can use the AA with the ID that matches the argument."); +// c->Message(10, "#altactivate [argument] - activates the AA with the ID that matches the argument."); +// return; +// } +// if(!strcasecmp(sep->arg[1], "list")){ +// c->Message(10, "You have access to the following AA Abilities:"); +// int x, val; +// SendAA_Struct* saa = nullptr; +// for(x = 0; x < aaHighestID; x++){ +// if(AA_Actions[x][0].spell_id || AA_Actions[x][0].action){ //if there's an action or spell associated we assume it's a valid +// val = 0; //and assume if they don't have a value for the first rank then it isn't valid for any rank +// saa = nullptr; +// val = c->GetAA(x); +// if(val){ +// saa = zone->FindAA(x); +// c->Message(10, "%d: %s %d", x, saa->name, val); +// } +// } +// } +// } +// else if(!strcasecmp(sep->arg[1], "time")){ +// int ability = atoi(sep->arg[2]); +// if(c->GetAA(ability)){ +// int remain = c->GetPTimers().GetRemainingTime(pTimerAAStart + ability); +// if(remain) +// c->Message(10, "You may use that ability in %d minutes and %d seconds.", (remain/60), (remain%60)); +// else +// c->Message(10, "You may use that ability now."); +// } +// else{ +// c->Message(10, "You do not have access to that ability."); +// } +// } +// else +// { +// c->ActivateAA((aaID) atoi(sep->arg[1])); +// } } void command_traindisc(Client *c, const Seperator *sep) diff --git a/zone/exp.cpp b/zone/exp.cpp index 826b12e67..0172263e7 100644 --- a/zone/exp.cpp +++ b/zone/exp.cpp @@ -515,7 +515,7 @@ void Client::SetEXP(uint32 set_exp, uint32 set_aaxp, bool isrezzexp) { if (GetLevel() < 51) { m_epp.perAA = 0; // turn off aa exp if they drop below 51 } else - SendAAStats(); //otherwise, send them an AA update + SendAlternateAdvancementStats(); //otherwise, send them an AA update //send the expdata in any case so the xp bar isnt stuck after leveling uint32 tmpxp1 = GetEXPForLevel(GetLevel()+1); diff --git a/zone/mob.h b/zone/mob.h index b074782b3..bbc841f48 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -958,7 +958,8 @@ public: //aa new uint32 GetAA(uint32 rank_id) const; - bool SetAA(uint32 rank_id, uint32 new_value); + bool SetAA(uint32 rank_id, uint32 new_value, uint32 charges = 0); + void ClearAAs() { aa_ranks.clear(); } bool CanUseAlternateAdvancementRank(AA::Rank *rank); bool CanPurchaseAlternateAdvancementRank(AA::Rank *ran); @@ -1316,7 +1317,7 @@ protected: bool bEnraged; bool destructibleobject; - std::unordered_map aa_ranks; + std::unordered_map> aa_ranks; private: void _StopSong(); //this is not what you think it is diff --git a/zone/net.cpp b/zone/net.cpp index 0178eff21..1bca0571b 100644 --- a/zone/net.cpp +++ b/zone/net.cpp @@ -248,9 +248,6 @@ int main(int argc, char** argv) { Log.Out(Logs::General, Logs::Zone_Server, "Loading titles"); title_manager.LoadTitles(); - Log.Out(Logs::General, Logs::Zone_Server, "Loading AA effects"); - database.LoadAAEffects(); - Log.Out(Logs::General, Logs::Zone_Server, "Loading tributes"); database.LoadTributes(); diff --git a/zone/perl_client.cpp b/zone/perl_client.cpp index eed8305f4..d564a341e 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -4077,33 +4077,34 @@ XS(XS_Client_RefundAA) { if(THIS == nullptr) Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - int curpt = 0; - bool refunded = false; - - for(int x1=0;x1GetAA(x1); - if(curpt > 0){ - SendAA_Struct* curaa = zone->FindAA(x1); - if(curaa){ - THIS->SetAA(x1, 0); - for(int x2=0;x2GetPP().aapoints += curaa->cost + (curaa->cost_inc * x2); - refunded = true; - } - } - else //aa doesn't exist.. but if they bought it then it had at least a cost of 1 point each - { //so give back what we can - THIS->GetPP().aapoints += curpt; - THIS->SetAA(x1, 0); - refunded = true; - } - } - } - - if(refunded){ - THIS->Save(); //save of course - THIS->Kick(); //client gets all buggy if we don't immediatly relog so just force it on them - } + //old aa + //int curpt = 0; + //bool refunded = false; + // + //for(int x1=0;x1GetAA(x1); + // if(curpt > 0){ + // SendAA_Struct* curaa = zone->FindAA(x1); + // if(curaa){ + // THIS->SetAA(x1, 0); + // for(int x2=0;x2GetPP().aapoints += curaa->cost + (curaa->cost_inc * x2); + // refunded = true; + // } + // } + // else //aa doesn't exist.. but if they bought it then it had at least a cost of 1 point each + // { //so give back what we can + // THIS->GetPP().aapoints += curpt; + // THIS->SetAA(x1, 0); + // refunded = true; + // } + // } + //} + // + //if(refunded){ + // THIS->Save(); //save of course + // THIS->Kick(); //client gets all buggy if we don't immediatly relog so just force it on them + //} } XSRETURN_EMPTY; } diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 7e91550c5..8ac60c125 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -4157,30 +4157,30 @@ int32 Client::GetAAEffectDataBySlot(uint32 aa_ID, uint32 slot_id, bool GetEffect int32 base2 = 0; uint32 slot = 0; - - std::map >::const_iterator find_iter = aa_effects.find(aa_ID); - if(find_iter == aa_effects.end()) - return 0; - - for (std::map::const_iterator iter = aa_effects[aa_ID].begin(); iter != aa_effects[aa_ID].end(); ++iter) - { - effect = iter->second.skill_id; - base1 = iter->second.base1; - base2 = iter->second.base2; - slot = iter->second.slot; - - if (slot && slot == slot_id) { - - if (GetEffect) - return effect; - - if (GetBase1) - return base1; - - if (GetBase2) - return base2; - } - } + //old aa + //std::map >::const_iterator find_iter = aa_effects.find(aa_ID); + //if(find_iter == aa_effects.end()) + // return 0; + // + //for (std::map::const_iterator iter = aa_effects[aa_ID].begin(); iter != aa_effects[aa_ID].end(); ++iter) + //{ + // effect = iter->second.skill_id; + // base1 = iter->second.base1; + // base2 = iter->second.base2; + // slot = iter->second.slot; + // + // if (slot && slot == slot_id) { + // + // if (GetEffect) + // return effect; + // + // if (GetBase1) + // return base1; + // + // if (GetBase2) + // return base2; + // } + //} return 0; } @@ -4214,431 +4214,432 @@ int16 Client::CalcAAFocus(focusType type, uint32 aa_ID, uint16 spell_id) */ int FocusCount = 0; - std::map >::const_iterator find_iter = aa_effects.find(aa_ID); - if(find_iter == aa_effects.end()) - { - return 0; - } - - for (std::map::const_iterator iter = aa_effects[aa_ID].begin(); iter != aa_effects[aa_ID].end(); ++iter) - { - effect = iter->second.skill_id; - base1 = iter->second.base1; - base2 = iter->second.base2; - slot = iter->second.slot; - - /* - AA Foci's can contain multiple focus effects within the same AA. - To handle this we will not automatically return zero if a limit is found. - Instead if limit is found and multiple focus effects, we will reset the limit check - when the next valid focus effect is found. - */ - - if (IsFocusEffect(0, 0, true,effect) || (effect == SE_TriggerOnCast)){ - FocusCount++; - //If limit found on prior check next, else end loop. - if (FocusCount > 1){ - - for(int e = 0; e < MaxLimitInclude; e+=2) { - if (LimitInclude[e] && !LimitInclude[e+1]) - LimitFailure = true; - } - - if (LimitFailure){ - value = 0; - LimitFailure = false; - - for(int e = 0; e < MaxLimitInclude; e++) { - LimitInclude[e] = false; //Reset array - } - } - - else{ - break; - } - } - } - - - switch (effect) - { - case SE_Blank: - break; - - //Handle Focus Limits - - case SE_LimitResist: - if(base1 < 0){ - if(spell.resisttype == -base1) //Exclude - LimitFailure = true; - } - else { - LimitInclude[0] = true; - if (spell.resisttype == base1) //Include - LimitInclude[1] = true; - } - break; - - case SE_LimitInstant: - if(base1 == 1 && spell.buffduration) //Fail if not instant - LimitFailure = true; - if(base1 == 0 && (spell.buffduration == 0)) //Fail if instant - LimitFailure = true; - - break; - - case SE_LimitMaxLevel: - spell_level = spell.classes[(GetClass()%16) - 1]; - lvldiff = spell_level - base1; - //every level over cap reduces the effect by base2 percent unless from a clicky when ItemCastsUseFocus is true - if(lvldiff > 0 && (spell_level <= RuleI(Character, MaxLevel) || RuleB(Character, ItemCastsUseFocus) == false)) { - if(base2 > 0){ - lvlModifier -= base2*lvldiff; - if(lvlModifier < 1) - LimitFailure = true; - } - else - LimitFailure = true; - } - break; - - case SE_LimitMinLevel: - if((spell.classes[(GetClass()%16) - 1]) < base1) - LimitFailure = true; - break; - - case SE_LimitCastTimeMin: - if (static_cast(spell.cast_time) < base1) - LimitFailure = true; - break; - - case SE_LimitCastTimeMax: - if (static_cast(spell.cast_time) > base1) - LimitFailure = true; - break; - - case SE_LimitSpell: - if(base1 < 0) { //Exclude - if (spell_id == -base1) - LimitFailure = true; - } - else { - LimitInclude[2] = true; - if (spell_id == base1) //Include - LimitInclude[3] = true; - } - break; - - case SE_LimitMinDur: - if (base1 > CalcBuffDuration_formula(GetLevel(), spell.buffdurationformula, spell.buffduration)) - LimitFailure = true; - - break; - - case SE_LimitEffect: - if(base1 < 0){ - if(IsEffectInSpell(spell_id,-base1)) //Exclude - LimitFailure = true; - } - else{ - LimitInclude[4] = true; - if(IsEffectInSpell(spell_id,base1)) //Include - LimitInclude[5] = true; - } - break; - - case SE_LimitSpellType: - switch(base1) - { - case 0: - if (!IsDetrimentalSpell(spell_id)) - LimitFailure = true; - break; - case 1: - if (!IsBeneficialSpell(spell_id)) - LimitFailure = true; - break; - } - break; - - case SE_LimitManaMin: - if(spell.mana < base1) - LimitFailure = true; - break; - - case SE_LimitTarget: - if (base1 < 0) { - if (-base1 == spell.targettype) //Exclude - LimitFailure = true; - } - else { - LimitInclude[6] = true; - if (base1 == spell.targettype) //Include - LimitInclude[7] = true; - } - break; - - case SE_LimitCombatSkills: - if (base1 == 0 && (IsCombatSkill(spell_id) || IsCombatProc(spell_id))) //Exclude Discs / Procs - LimitFailure = true; - else if (base1 == 1 && (!IsCombatSkill(spell_id) || !IsCombatProc(spell_id))) //Exclude Spells - LimitFailure = true; - - break; - - case SE_LimitSpellGroup: - if(base1 < 0) { - if (-base1 == spell.spellgroup) //Exclude - LimitFailure = true; - } - else { - LimitInclude[8] = true; - if (base1 == spell.spellgroup) //Include - LimitInclude[9] = true; - } - break; - - case SE_LimitCastingSkill: - if(base1 < 0) { - if(-base1 == spell.skill) - LimitFailure = true; - } - else { - LimitInclude[10] = true; - if(base1 == spell.skill) - LimitInclude[11] = true; - } - break; - - case SE_LimitSpellClass: - if(base1 < 0) { //Exclude - if (CheckSpellCategory(spell_id, base1, SE_LimitSpellClass)) - return(0); - } - else { - LimitInclude[12] = true; - if (CheckSpellCategory(spell_id, base1, SE_LimitSpellClass)) //Include - LimitInclude[13] = true; - } - break; - - case SE_LimitSpellSubclass: - if(base1 < 0) { //Exclude - if (CheckSpellCategory(spell_id, base1, SE_LimitSpellSubclass)) - return(0); - } - else { - LimitInclude[14] = true; - if (CheckSpellCategory(spell_id, base1, SE_LimitSpellSubclass)) //Include - LimitInclude[15] = true; - } - break; - - case SE_LimitClass: - //Do not use this limit more then once per spell. If multiple class, treat value like items would. - if (!PassLimitClass(base1, GetClass())) - LimitFailure = true; - break; - - case SE_LimitRace: - if (base1 != GetRace()) - LimitFailure = true; - break; - - case SE_LimitUseMin: - if (base1 > spell.numhits) - LimitFailure = true; - break; - - case SE_LimitUseType: - if (base1 != spell.numhitstype) - LimitFailure = true; - break; - - //Handle Focus Effects - case SE_ImprovedDamage: - if (type == focusImprovedDamage && base1 > value) - value = base1; - break; - - case SE_ImprovedHeal: - if (type == focusImprovedHeal && base1 > value) - value = base1; - break; - - case SE_ReduceManaCost: - if (type == focusManaCost) - value = base1; - break; - - case SE_IncreaseSpellHaste: - if (type == focusSpellHaste && base1 > value) - value = base1; - break; - - case SE_IncreaseSpellDuration: - if (type == focusSpellDuration && base1 > value) - value = base1; - break; - - case SE_SpellDurationIncByTic: - if (type == focusSpellDurByTic && base1 > value) - value = base1; - break; - - case SE_SwarmPetDuration: - if (type == focusSwarmPetDuration && base1 > value) - value = base1; - break; - - case SE_IncreaseRange: - if (type == focusRange && base1 > value) - value = base1; - break; - - case SE_ReduceReagentCost: - if (type == focusReagentCost && base1 > value) - value = base1; - break; - - case SE_PetPowerIncrease: - if (type == focusPetPower && base1 > value) - value = base1; - break; - - case SE_SpellResistReduction: - if (type == focusResistRate && base1 > value) - value = base1; - break; - - case SE_SpellHateMod: - if (type == focusSpellHateMod ) { - if(value != 0) { - if(value > 0){ - if(base1 > value) - value = base1; - } - else{ - if(base1 < value) - value = base1; - } - } - else - value = base1; - } - break; - - case SE_ReduceReuseTimer: - if(type == focusReduceRecastTime) - value = base1 / 1000; - break; - - case SE_TriggerOnCast: - if(type == focusTriggerOnCast){ - if(zone->random.Roll(base1)) { - value = base2; - } else { - value = 0; - LimitFailure = true; - } - break; - } - - case SE_FcSpellVulnerability: - if(type == focusSpellVulnerability) - value = base1; - break; - - case SE_BlockNextSpellFocus: - if(type == focusBlockNextSpell){ - if(zone->random.Roll(base1)) - value = 1; - } - break; - - case SE_FcTwincast: - if(type == focusTwincast) - value = base1; - break; - - //Note if using these as AA, make sure this is first focus used. - case SE_SympatheticProc: - if(type == focusSympatheticProc) - value = base2; - break; - - case SE_FcDamageAmt: - if(type == focusFcDamageAmt) - value = base1; - break; - - case SE_FcDamageAmtCrit: - if(type == focusFcDamageAmtCrit) - value = base1; - break; - - case SE_FcDamageAmtIncoming: - if(type == focusFcDamageAmtIncoming) - value = base1; - break; - - case SE_FcHealAmtIncoming: - if(type == focusFcHealAmtIncoming) - value = base1; - break; - - case SE_FcHealPctCritIncoming: - if (type == focusFcHealPctCritIncoming) - value = base1; - break; - - case SE_FcHealAmtCrit: - if(type == focusFcHealAmtCrit) - value = base1; - break; - - case SE_FcHealAmt: - if(type == focusFcHealAmt) - value = base1; - break; - - case SE_FcHealPctIncoming: - if(type == focusFcHealPctIncoming) - value = base1; - break; - - case SE_FcBaseEffects: - if (type == focusFcBaseEffects) - value = base1; - break; - - case SE_FcDamagePctCrit: - if(type == focusFcDamagePctCrit) - value = base1; - break; - - case SE_FcIncreaseNumHits: - if(type == focusIncreaseNumHits) - value = base1; - break; - - case SE_FcLimitUse: - if(type == focusFcLimitUse) - value = base1; - break; - - case SE_FcMute: - if(type == focusFcMute) - value = base1; - break; - - case SE_FcStunTimeMod: - if(type == focusFcStunTimeMod) - value = base1; - break; - - } - } + //old AA + //std::map >::const_iterator find_iter = aa_effects.find(aa_ID); + //if(find_iter == aa_effects.end()) + //{ + // return 0; + //} + // + //for (std::map::const_iterator iter = aa_effects[aa_ID].begin(); iter != aa_effects[aa_ID].end(); ++iter) + //{ + // effect = iter->second.skill_id; + // base1 = iter->second.base1; + // base2 = iter->second.base2; + // slot = iter->second.slot; + // + // /* + // AA Foci's can contain multiple focus effects within the same AA. + // To handle this we will not automatically return zero if a limit is found. + // Instead if limit is found and multiple focus effects, we will reset the limit check + // when the next valid focus effect is found. + // */ + // + // if (IsFocusEffect(0, 0, true,effect) || (effect == SE_TriggerOnCast)){ + // FocusCount++; + // //If limit found on prior check next, else end loop. + // if (FocusCount > 1){ + // + // for(int e = 0; e < MaxLimitInclude; e+=2) { + // if (LimitInclude[e] && !LimitInclude[e+1]) + // LimitFailure = true; + // } + // + // if (LimitFailure){ + // value = 0; + // LimitFailure = false; + // + // for(int e = 0; e < MaxLimitInclude; e++) { + // LimitInclude[e] = false; //Reset array + // } + // } + // + // else{ + // break; + // } + // } + // } + // + // + // switch (effect) + // { + // case SE_Blank: + // break; + // + // //Handle Focus Limits + // + // case SE_LimitResist: + // if(base1 < 0){ + // if(spell.resisttype == -base1) //Exclude + // LimitFailure = true; + // } + // else { + // LimitInclude[0] = true; + // if (spell.resisttype == base1) //Include + // LimitInclude[1] = true; + // } + // break; + // + // case SE_LimitInstant: + // if(base1 == 1 && spell.buffduration) //Fail if not instant + // LimitFailure = true; + // if(base1 == 0 && (spell.buffduration == 0)) //Fail if instant + // LimitFailure = true; + // + // break; + // + // case SE_LimitMaxLevel: + // spell_level = spell.classes[(GetClass()%16) - 1]; + // lvldiff = spell_level - base1; + // //every level over cap reduces the effect by base2 percent unless from a clicky when ItemCastsUseFocus is true + // if(lvldiff > 0 && (spell_level <= RuleI(Character, MaxLevel) || RuleB(Character, ItemCastsUseFocus) == false)) { + // if(base2 > 0){ + // lvlModifier -= base2*lvldiff; + // if(lvlModifier < 1) + // LimitFailure = true; + // } + // else + // LimitFailure = true; + // } + // break; + // + // case SE_LimitMinLevel: + // if((spell.classes[(GetClass()%16) - 1]) < base1) + // LimitFailure = true; + // break; + // + // case SE_LimitCastTimeMin: + // if (static_cast(spell.cast_time) < base1) + // LimitFailure = true; + // break; + // + // case SE_LimitCastTimeMax: + // if (static_cast(spell.cast_time) > base1) + // LimitFailure = true; + // break; + // + // case SE_LimitSpell: + // if(base1 < 0) { //Exclude + // if (spell_id == -base1) + // LimitFailure = true; + // } + // else { + // LimitInclude[2] = true; + // if (spell_id == base1) //Include + // LimitInclude[3] = true; + // } + // break; + // + // case SE_LimitMinDur: + // if (base1 > CalcBuffDuration_formula(GetLevel(), spell.buffdurationformula, spell.buffduration)) + // LimitFailure = true; + // + // break; + // + // case SE_LimitEffect: + // if(base1 < 0){ + // if(IsEffectInSpell(spell_id,-base1)) //Exclude + // LimitFailure = true; + // } + // else{ + // LimitInclude[4] = true; + // if(IsEffectInSpell(spell_id,base1)) //Include + // LimitInclude[5] = true; + // } + // break; + // + // case SE_LimitSpellType: + // switch(base1) + // { + // case 0: + // if (!IsDetrimentalSpell(spell_id)) + // LimitFailure = true; + // break; + // case 1: + // if (!IsBeneficialSpell(spell_id)) + // LimitFailure = true; + // break; + // } + // break; + // + // case SE_LimitManaMin: + // if(spell.mana < base1) + // LimitFailure = true; + // break; + // + // case SE_LimitTarget: + // if (base1 < 0) { + // if (-base1 == spell.targettype) //Exclude + // LimitFailure = true; + // } + // else { + // LimitInclude[6] = true; + // if (base1 == spell.targettype) //Include + // LimitInclude[7] = true; + // } + // break; + // + // case SE_LimitCombatSkills: + // if (base1 == 0 && (IsCombatSkill(spell_id) || IsCombatProc(spell_id))) //Exclude Discs / Procs + // LimitFailure = true; + // else if (base1 == 1 && (!IsCombatSkill(spell_id) || !IsCombatProc(spell_id))) //Exclude Spells + // LimitFailure = true; + // + // break; + // + // case SE_LimitSpellGroup: + // if(base1 < 0) { + // if (-base1 == spell.spellgroup) //Exclude + // LimitFailure = true; + // } + // else { + // LimitInclude[8] = true; + // if (base1 == spell.spellgroup) //Include + // LimitInclude[9] = true; + // } + // break; + // + // case SE_LimitCastingSkill: + // if(base1 < 0) { + // if(-base1 == spell.skill) + // LimitFailure = true; + // } + // else { + // LimitInclude[10] = true; + // if(base1 == spell.skill) + // LimitInclude[11] = true; + // } + // break; + // + // case SE_LimitSpellClass: + // if(base1 < 0) { //Exclude + // if (CheckSpellCategory(spell_id, base1, SE_LimitSpellClass)) + // return(0); + // } + // else { + // LimitInclude[12] = true; + // if (CheckSpellCategory(spell_id, base1, SE_LimitSpellClass)) //Include + // LimitInclude[13] = true; + // } + // break; + // + // case SE_LimitSpellSubclass: + // if(base1 < 0) { //Exclude + // if (CheckSpellCategory(spell_id, base1, SE_LimitSpellSubclass)) + // return(0); + // } + // else { + // LimitInclude[14] = true; + // if (CheckSpellCategory(spell_id, base1, SE_LimitSpellSubclass)) //Include + // LimitInclude[15] = true; + // } + // break; + // + // case SE_LimitClass: + // //Do not use this limit more then once per spell. If multiple class, treat value like items would. + // if (!PassLimitClass(base1, GetClass())) + // LimitFailure = true; + // break; + // + // case SE_LimitRace: + // if (base1 != GetRace()) + // LimitFailure = true; + // break; + // + // case SE_LimitUseMin: + // if (base1 > spell.numhits) + // LimitFailure = true; + // break; + // + // case SE_LimitUseType: + // if (base1 != spell.numhitstype) + // LimitFailure = true; + // break; + // + // //Handle Focus Effects + // case SE_ImprovedDamage: + // if (type == focusImprovedDamage && base1 > value) + // value = base1; + // break; + // + // case SE_ImprovedHeal: + // if (type == focusImprovedHeal && base1 > value) + // value = base1; + // break; + // + // case SE_ReduceManaCost: + // if (type == focusManaCost) + // value = base1; + // break; + // + // case SE_IncreaseSpellHaste: + // if (type == focusSpellHaste && base1 > value) + // value = base1; + // break; + // + // case SE_IncreaseSpellDuration: + // if (type == focusSpellDuration && base1 > value) + // value = base1; + // break; + // + // case SE_SpellDurationIncByTic: + // if (type == focusSpellDurByTic && base1 > value) + // value = base1; + // break; + // + // case SE_SwarmPetDuration: + // if (type == focusSwarmPetDuration && base1 > value) + // value = base1; + // break; + // + // case SE_IncreaseRange: + // if (type == focusRange && base1 > value) + // value = base1; + // break; + // + // case SE_ReduceReagentCost: + // if (type == focusReagentCost && base1 > value) + // value = base1; + // break; + // + // case SE_PetPowerIncrease: + // if (type == focusPetPower && base1 > value) + // value = base1; + // break; + // + // case SE_SpellResistReduction: + // if (type == focusResistRate && base1 > value) + // value = base1; + // break; + // + // case SE_SpellHateMod: + // if (type == focusSpellHateMod ) { + // if(value != 0) { + // if(value > 0){ + // if(base1 > value) + // value = base1; + // } + // else{ + // if(base1 < value) + // value = base1; + // } + // } + // else + // value = base1; + // } + // break; + // + // case SE_ReduceReuseTimer: + // if(type == focusReduceRecastTime) + // value = base1 / 1000; + // break; + // + // case SE_TriggerOnCast: + // if(type == focusTriggerOnCast){ + // if(zone->random.Roll(base1)) { + // value = base2; + // } else { + // value = 0; + // LimitFailure = true; + // } + // break; + // } + // + // case SE_FcSpellVulnerability: + // if(type == focusSpellVulnerability) + // value = base1; + // break; + // + // case SE_BlockNextSpellFocus: + // if(type == focusBlockNextSpell){ + // if(zone->random.Roll(base1)) + // value = 1; + // } + // break; + // + // case SE_FcTwincast: + // if(type == focusTwincast) + // value = base1; + // break; + // + // //Note if using these as AA, make sure this is first focus used. + // case SE_SympatheticProc: + // if(type == focusSympatheticProc) + // value = base2; + // break; + // + // case SE_FcDamageAmt: + // if(type == focusFcDamageAmt) + // value = base1; + // break; + // + // case SE_FcDamageAmtCrit: + // if(type == focusFcDamageAmtCrit) + // value = base1; + // break; + // + // case SE_FcDamageAmtIncoming: + // if(type == focusFcDamageAmtIncoming) + // value = base1; + // break; + // + // case SE_FcHealAmtIncoming: + // if(type == focusFcHealAmtIncoming) + // value = base1; + // break; + // + // case SE_FcHealPctCritIncoming: + // if (type == focusFcHealPctCritIncoming) + // value = base1; + // break; + // + // case SE_FcHealAmtCrit: + // if(type == focusFcHealAmtCrit) + // value = base1; + // break; + // + // case SE_FcHealAmt: + // if(type == focusFcHealAmt) + // value = base1; + // break; + // + // case SE_FcHealPctIncoming: + // if(type == focusFcHealPctIncoming) + // value = base1; + // break; + // + // case SE_FcBaseEffects: + // if (type == focusFcBaseEffects) + // value = base1; + // break; + // + // case SE_FcDamagePctCrit: + // if(type == focusFcDamagePctCrit) + // value = base1; + // break; + // + // case SE_FcIncreaseNumHits: + // if(type == focusIncreaseNumHits) + // value = base1; + // break; + // + // case SE_FcLimitUse: + // if(type == focusFcLimitUse) + // value = base1; + // break; + // + // case SE_FcMute: + // if(type == focusFcMute) + // value = base1; + // break; + // + // case SE_FcStunTimeMod: + // if(type == focusFcStunTimeMod) + // value = base1; + // break; + // + // } + //} for(int e = 0; e < MaxLimitInclude; e+=2) { if (LimitInclude[e] && !LimitInclude[e+1]) diff --git a/zone/zone.cpp b/zone/zone.cpp index 31bc27b41..e5e30f01a 100644 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -804,8 +804,6 @@ Zone::Zone(uint32 in_zoneid, uint32 in_instanceid, const char* in_short_name) weather_intensity = 0; blocked_spells = nullptr; totalBS = 0; - aas = nullptr; - totalAAs = 0; zone_has_current_time = false; Instance_Shutdown_Timer = nullptr; @@ -864,16 +862,6 @@ Zone::~Zone() { safe_delete(qGlobals); safe_delete_array(adv_data); safe_delete_array(map_name); - - if(aas != nullptr) { - int r; - for(r = 0; r < totalAAs; r++) { - uchar *data = (uchar *) aas[r]; - safe_delete_array(data); - } - safe_delete_array(aas); - } - safe_delete(GuildBanks); } @@ -952,9 +940,6 @@ bool Zone::Init(bool iStaticZone) { zone->LoadAlternateCurrencies(); zone->LoadNPCEmotes(&NPCEmoteList); - //Load AA information - LoadAAs(); - LoadAlternateAdvancement(); //Load merchant data diff --git a/zone/zone.h b/zone/zone.h index 536ff048c..a4a49b8b2 100644 --- a/zone/zone.h +++ b/zone/zone.h @@ -120,14 +120,7 @@ public: AA::Ability *GetAlternateAdvancementAbilityByRank(int rank_id); AA::Rank *GetAlternateAdvancementRank(int rank_id); - //old AA - void LoadAAs(); - int GetTotalAAs() { return totalAAs; } - SendAA_Struct* GetAABySequence(uint32 seq) { return aas[seq]; } - SendAA_Struct* FindAA(uint32 id); - uint8 GetTotalAALevels(uint32 skill_id); - - void LoadZoneDoors(const char* zone, int16 version); + void LoadZoneDoors(const char* zone, int16 version); bool LoadZoneObjects(); bool LoadGroundSpawns(); void ReloadStaticData(); @@ -202,6 +195,10 @@ public: char *adv_data; bool did_adventure_actions; + //new AA + std::unordered_map> aa_abilities; + std::unordered_map> aa_ranks; + void DoAdventureCountIncrease(); void DoAdventureAssassinationCountIncrease(); void DoAdventureActions(); @@ -322,17 +319,6 @@ private: int totalBS; ZoneSpellsBlocked *blocked_spells; -public: - //new AA - std::unordered_map> aa_abilities; - std::unordered_map> aa_ranks; - -private: - - //old AA - int totalAAs; - SendAA_Struct **aas; //array of AA structs - /* Spawn related things */ diff --git a/zone/zonedb.h b/zone/zonedb.h index ddd9450d2..35275b654 100644 --- a/zone/zonedb.h +++ b/zone/zonedb.h @@ -343,18 +343,7 @@ public: /* AAs New */ bool LoadAlternateAdvancementAbilities(std::unordered_map> &abilities, std::unordered_map> &ranks); - - /* AAs Old */ - bool LoadAAEffects(); - bool LoadAAEffects2(); - bool LoadSwarmSpells(); - SendAA_Struct*GetAASkillVars(uint32 skill_id); - uint8 GetTotalAALevels(uint32 skill_id); - uint32 GetSizeAA(); - uint32 CountAAs(); - void LoadAAs(SendAA_Struct **load); - uint32 CountAAEffects(); - void FillAAEffects(SendAA_Struct* aa_struct); + bool LoadAlternateAdvancement(Client *c); /* Zone related */ bool GetZoneCFG(uint32 zoneid, uint16 instance_id, NewZone_Struct *data, bool &can_bind, bool &can_combat, bool &can_levitate, bool &can_castoutdoor, bool &is_city, bool &is_hotzone, bool &allow_mercs, uint8 &zone_type, int &ruleset, char **map_filename); From bad4a94b84c31d9f5bec2a357f3acf723e1be1f3 Mon Sep 17 00:00:00 2001 From: KimLS Date: Thu, 11 Jun 2015 01:45:55 -0700 Subject: [PATCH 09/90] Apply RoF2 patch demon gave me for AAs --- common/patches/rof2.cpp | 120 ++++++++++++++++++++++++---------------- 1 file changed, 71 insertions(+), 49 deletions(-) diff --git a/common/patches/rof2.cpp b/common/patches/rof2.cpp index a4f484a9e..3d96ae182 100644 --- a/common/patches/rof2.cpp +++ b/common/patches/rof2.cpp @@ -2936,58 +2936,80 @@ namespace RoF2 ENCODE(OP_SendAATable) { - ENCODE_LENGTH_ATLEAST(SendAA_Struct); - SETUP_VAR_ENCODE(SendAA_Struct); - ALLOC_VAR_ENCODE(structs::SendAA_Struct, sizeof(structs::SendAA_Struct) + emu->total_abilities*sizeof(structs::AA_Ability)); + EQApplicationPacket *inapp = *p; + *p = nullptr; + AARankInfo_Struct *emu = (AARankInfo_Struct*)inapp->pBuffer; + + // the structs::SendAA_Struct includes enough space for 1 prereq which is the min even if it has no prereqs + auto prereq_size = emu->total_prereqs > 1 ? (emu->total_prereqs - 1) * 8 : 0; + auto outapp = new EQApplicationPacket(OP_SendAATable, sizeof(structs::SendAA_Struct) + emu->total_effects * sizeof(structs::AA_Ability) + prereq_size); + inapp->SetReadPosition(sizeof(AARankInfo_Struct)+emu->total_effects * sizeof(AARankEffect_Struct)); + - // Check clientver field to verify this AA should be sent for SoF - // clientver 1 is for all clients and 5 is for Live - if (emu->clientver <= 8) - { - OUT(id); - eq->unknown004 = 1; - //eq->hotkey_sid = (emu->hotkey_sid==4294967295UL)?0:(emu->id - emu->current_level + 1); - //eq->hotkey_sid2 = (emu->hotkey_sid2==4294967295UL)?0:(emu->id - emu->current_level + 1); - //eq->title_sid = emu->id - emu->current_level + 1; - //eq->desc_sid = emu->id - emu->current_level + 1; - eq->hotkey_sid = (emu->hotkey_sid == 4294967295UL) ? -1 : (emu->sof_next_skill); - eq->hotkey_sid2 = (emu->hotkey_sid2 == 4294967295UL) ? -1 : (emu->sof_next_skill); - eq->title_sid = emu->sof_next_skill; - eq->desc_sid = emu->sof_next_skill; - OUT(class_type); - OUT(cost); - OUT(seq); - OUT(current_level); - eq->prereq_skill_count = 1; // min 1 - OUT(prereq_skill); - eq->prereq_minpoints_count = 1; // min 1 - OUT(prereq_minpoints); - eq->type = emu->sof_type; - OUT(spellid); - eq->unknown057 = 1; // Introduced during HoT - OUT(spell_type); - OUT(spell_refresh); - OUT(classes); - OUT(berserker); - //eq->max_level = emu->sof_max_level; - OUT(max_level); - OUT(last_id); - OUT(next_id); - OUT(cost2); - eq->aa_expansion = emu->aa_expansion; - eq->special_category = emu->special_category; - OUT(total_abilities); - eq->expendable_charges = emu->special_category == 7 ? 1 : 0; // temp hack, this can actually be any number - unsigned int r; - for (r = 0; r < emu->total_abilities; r++) { - OUT(abilities[r].skill_id); - OUT(abilities[r].base1); - OUT(abilities[r].base2); - OUT(abilities[r].slot); - } + std::vector skill; + std::vector points; + for(auto i = 0; i < emu->total_prereqs; ++i) { + skill.push_back(inapp->ReadUInt32()); + points.push_back(inapp->ReadUInt32()); } - FINISH_ENCODE(); + outapp->WriteUInt32(emu->id); + outapp->WriteUInt8(1); + outapp->WriteSInt32(emu->upper_hotkey_sid); + outapp->WriteSInt32(emu->lower_hotkey_sid); + outapp->WriteSInt32(emu->title_sid); + outapp->WriteSInt32(emu->desc_sid); + outapp->WriteSInt32(emu->level_req); + outapp->WriteSInt32(emu->cost); + outapp->WriteUInt32(emu->seq); + outapp->WriteUInt32(emu->current_level); + + if (emu->total_prereqs) { + outapp->WriteUInt32(emu->total_prereqs); + for (auto &e : skill) + outapp->WriteSInt32(e); + outapp->WriteUInt32(emu->total_prereqs); + for (auto &e : points) + outapp->WriteSInt32(e); + } else { + outapp->WriteUInt32(1); + outapp->WriteUInt32(0); + outapp->WriteUInt32(1); + outapp->WriteUInt32(0); + } + + outapp->WriteSInt32(emu->type); + outapp->WriteSInt32(emu->spell); + outapp->WriteSInt32(1); + outapp->WriteSInt32(emu->spell_type); + outapp->WriteSInt32(emu->spell_refresh); + outapp->WriteSInt32(emu->classes); + outapp->WriteSInt32(emu->max_level); + outapp->WriteSInt32(emu->prev_id); + outapp->WriteSInt32(emu->next_id); + outapp->WriteSInt32(emu->total_cost); + outapp->WriteUInt8(0); + outapp->WriteUInt8(emu->grant_only); + outapp->WriteUInt8(0); + outapp->WriteUInt32(emu->charges); + outapp->WriteSInt32(emu->expansion); + outapp->WriteSInt32(emu->category); + outapp->WriteUInt8(0); // shroud + outapp->WriteUInt8(0); // unknown109 + outapp->WriteUInt8(0); // loh + outapp->WriteUInt8(0); // unknown111 + outapp->WriteUInt32(emu->total_effects); + + inapp->SetReadPosition(sizeof(AARankInfo_Struct)); + for(auto i = 0; i < emu->total_effects; ++i) { + outapp->WriteUInt32(inapp->ReadUInt32()); // skill_id + outapp->WriteUInt32(inapp->ReadUInt32()); // base1 + outapp->WriteUInt32(inapp->ReadUInt32()); // base2 + outapp->WriteUInt32(inapp->ReadUInt32()); // slot + } + + dest->FastQueuePacket(&outapp); + delete inapp; } ENCODE(OP_SendCharInfo) From 985d969384e9a4b64668f96070cffd843db50224 Mon Sep 17 00:00:00 2001 From: KimLS Date: Thu, 11 Jun 2015 17:04:59 -0700 Subject: [PATCH 10/90] AA purchasing works --- zone/aa.cpp | 115 +++++++++++++++++++++++++++++++++++++++++++----- zone/client.cpp | 80 ++++++++++++++++----------------- zone/mob.h | 2 +- 3 files changed, 143 insertions(+), 54 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index 4bbdf88a6..868c1f62c 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1796,13 +1796,14 @@ void Client::SendAlternateAdvancementPoints() { int i = 0; for(auto &aa : zone->aa_abilities) { - auto ranks = GetAA(aa.second->first_rank_id); + uint32 charges = 0; + auto ranks = GetAA(aa.second->first_rank_id, &charges); if(ranks) { AA::Rank *rank = aa.second->GetRankByPointsSpent(ranks); if(rank) { aa2->aa_list[i].AA = rank->id; aa2->aa_list[i].value = ranks; - aa2->aa_list[i].charges = 0; // todo send charges + aa2->aa_list[i].charges = charges; i++; } } @@ -1815,6 +1816,65 @@ void Client::SendAlternateAdvancementPoints() { } void Client::PurchaseAlternateAdvancementRank(int rank_id) { + AA::Rank *rank = zone->GetAlternateAdvancementRank(rank_id); + if(!rank) { + return; + } + + if(!rank->base_ability) { + return; + } + + if(!CanPurchaseAlternateAdvancementRank(rank)) { + return; + } + + if(rank->base_ability->charges > 0) { + SetAA(rank_id, rank->current_value, rank->base_ability->charges); + } else { + SetAA(rank_id, rank->current_value, 0); + + //if not max then send next aa + if(rank->next) { + SendAlternateAdvancementRank(rank->base_ability->id, rank->next->current_value); + } + } + + m_pp.aapoints -= rank->cost; + SaveAA(); + + SendAlternateAdvancementPoints(); + SendAlternateAdvancementStats(); + + if(rank->prev) { + Message_StringID(15, AA_IMPROVE, + std::to_string(rank->title_sid).c_str(), + std::to_string(rank->prev->current_value).c_str(), + std::to_string(rank->cost).c_str(), + std::to_string(AA_POINTS).c_str()); + + //QS stuff broke with new aa, todo: fix later + /* QS: Player_Log_AA_Purchases */ + // if (RuleB(QueryServ, PlayerLogAAPurchases)){ + // std::string event_desc = StringFormat("Ranked AA Purchase :: aa_name:%s aa_id:%i at cost:%i in zoneid:%i instid:%i", aa2->name, aa2->id, real_cost, this->GetZoneID(), this->GetInstanceID()); + // QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); + // } + } else { + Message_StringID(15, AA_GAIN_ABILITY, + std::to_string(rank->title_sid).c_str(), + std::to_string(rank->cost).c_str(), + std::to_string(AA_POINTS).c_str()); + //QS stuff broke with new aa, todo: fix later + /* QS: Player_Log_AA_Purchases */ + // if (RuleB(QueryServ, PlayerLogAAPurchases)){ + // std::string event_desc = StringFormat("Initial AA Purchase :: aa_name:%s aa_id:%i at cost:%i in zoneid:%i instid:%i", aa2->name, aa2->id, real_cost, this->GetZoneID(), this->GetInstanceID()); + // QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); + // } + } + + CalcBonuses(); + if(title_manager.IsNewAATitleAvailable(m_pp.aapoints_spent, GetBaseClass())) + NotifyNewTitlesAvailable(); } bool ZoneDatabase::LoadAlternateAdvancement(Client *c) { @@ -1872,7 +1932,7 @@ AA::Rank *Zone::GetAlternateAdvancementRank(int rank_id) { return nullptr; } -uint32 Mob::GetAA(uint32 rank_id) const { +uint32 Mob::GetAA(uint32 rank_id, uint32 *charges) const { if(zone) { AA::Ability *ability = zone->GetAlternateAdvancementAbilityByRank(rank_id); if(!ability) @@ -1880,6 +1940,9 @@ uint32 Mob::GetAA(uint32 rank_id) const { auto iter = aa_ranks.find(ability->id); if(iter != aa_ranks.end()) { + if(charges) { + *charges = iter->second.second; + } return iter->second.first; } } @@ -1915,10 +1978,6 @@ bool Mob::CanUseAlternateAdvancementRank(AA::Rank *rank) { return false; } - if(!(RuleI(World, ExpansionSettings) & (1 << rank->expansion))) { - return false; - } - // Passive and Active Shroud AAs // For now we skip them if(ability->category == 3 || ability->category == 4) { @@ -1965,14 +2024,50 @@ bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank) { return false; } - //check that we have previous rank already + if(!(RuleI(World, ExpansionSettings) & (1 << rank->expansion))) { + return false; + } + + //check level req + if(rank->level_req > GetLevel()) { + return false; + } + + uint32 current_charges = 0; + auto points = GetAA(rank->id, ¤t_charges); + + //check that we are on previous rank already (if exists) if(rank->prev) { - //rank->prev-> + if(points != rank->prev->current_value) { + return false; + } + } + + //if expendable only let us purchase if we have no charges already + //not quite sure on how this functions client side atm + //I intend to look into it later to make sure the behavior is right + if(ability->charges > 0 && current_charges > 0) { + return false; } //check prereqs + for(auto &prereq : rank->prereqs) { + AA::Ability *prereq_ability = zone->GetAlternateAdvancementAbility(prereq.aa_id); - //check price + if(prereq_ability) { + auto ranks = GetAA(prereq_ability->first_rank_id); + if(ranks < prereq.points) { + return false; + } + } + } + + //check price, if client + if(IsClient()) { + if(rank->cost > CastToClient()->GetAAPoints()) { + return false; + } + } return true; } diff --git a/zone/client.cpp b/zone/client.cpp index 24968f005..f36609b9c 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -523,49 +523,43 @@ void Client::ReportConnectingState() { }; } -bool Client::SaveAA(){ - //aa old - //int first_entry = 0; - //std::string rquery; - ///* Save Player AA */ - //int spentpoints = 0; - //for (int a = 0; a < MAX_PP_AA_ARRAY; a++) { - // uint32 points = aa[a]->value; - // if (points > HIGHEST_AA_VALUE) { - // aa[a]->value = HIGHEST_AA_VALUE; - // points = HIGHEST_AA_VALUE; - // } - // if (points > 0) { - // SendAA_Struct* curAA = zone->FindAA(aa[a]->AA - aa[a]->value + 1); - // if (curAA) { - // for (int rank = 0; rank::iterator RequiredLevel = AARequiredLevelAndCost.find(aa[a]->AA - aa[a]->value + 1 + rank); - // if (RequiredLevel != AARequiredLevelAndCost.end()) { - // spentpoints += RequiredLevel->second.Cost; - // } - // else - // spentpoints += (curAA->cost + (curAA->cost_inc * rank)); - // } - // } - // } - //} - //m_pp.aapoints_spent = spentpoints + m_epp.expended_aa; - //int highest = 0; - //for (int a = 0; a < MAX_PP_AA_ARRAY; a++) { - // if (aa[a]->AA > 0) { // those with value 0 will be cleaned up on next load - // if (first_entry != 1){ - // rquery = StringFormat("REPLACE INTO `character_alternate_abilities` (id, slot, aa_id, aa_value, charges)" - // " VALUES (%u, %u, %u, %u, %u)", character_id, a, aa[a]->AA, aa[a]->value, aa[a]->charges); - // first_entry = 1; - // } else { - // rquery = rquery + StringFormat(", (%u, %u, %u, %u, %u)", character_id, a, aa[a]->AA, aa[a]->value, aa[a]->charges); - // } - // highest = a; - // } - //} - //auto results = database.QueryDatabase(rquery); - ///* This is another part of the hack to clean up holes left by expendable AAs */ - //rquery = StringFormat("DELETE FROM `character_alternate_abilities` WHERE `id` = %u AND `slot` > %d", character_id, highest); +bool Client::SaveAA() { + std::string dquery; + std::string iquery; + int spentpoints = 0; + int i = 0; + for(auto &rank : aa_ranks) { + AA::Ability *ability = zone->GetAlternateAdvancementAbility(rank.first); + if(!ability) + continue; + + if(rank.second.first > 0) { + AA::Rank *r = ability->GetRankByPointsSpent(rank.second.first); + + if(!r) + continue; + + spentpoints += r->total_cost; + + if(i == 0) { + iquery = StringFormat("INSERT INTO `character_alternate_abilities` (id, slot, aa_id, aa_value, charges)" + " VALUES (%u, %u, %u, %u, %u)", character_id, i, ability->first_rank_id, rank.second.first, rank.second.second); + } else { + iquery += StringFormat(", (%u, %u, %u, %u, %u)", character_id, i, ability->first_rank_id, rank.second.first, rank.second.second); + } + i++; + } + } + + m_pp.aapoints_spent = spentpoints + m_epp.expended_aa; + + dquery = StringFormat("DELETE FROM `character_alternate_abilities` WHERE id=%u", character_id); + database.QueryDatabase(dquery); + + if(iquery.length() > 0) { + database.QueryDatabase(iquery); + } + return true; } diff --git a/zone/mob.h b/zone/mob.h index bbc841f48..ce9fe3634 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -957,7 +957,7 @@ public: void Tune_FindAvoidanceByHitChance(Mob* defender, Mob *attacker, float hit_chance, int interval, int max_loop, int acc_override, int Msg = 0); //aa new - uint32 GetAA(uint32 rank_id) const; + uint32 GetAA(uint32 rank_id, uint32 *charges = nullptr) const; bool SetAA(uint32 rank_id, uint32 new_value, uint32 charges = 0); void ClearAAs() { aa_ranks.clear(); } bool CanUseAlternateAdvancementRank(AA::Rank *rank); From 63928caacebd29c4e6eaa6910e37edbafb72a3d3 Mon Sep 17 00:00:00 2001 From: KimLS Date: Thu, 11 Jun 2015 18:38:46 -0700 Subject: [PATCH 11/90] Removing cruft, patches should *all* work now even titanium, incrementaa has been implemented (untested atm) --- common/patches/rof.cpp | 123 ++++++---- common/patches/rof2.cpp | 2 +- common/patches/sod.cpp | 93 ++++---- common/patches/sof.cpp | 94 ++++---- common/patches/titanium.cpp | 82 +++---- common/patches/uf.cpp | 5 +- zone/aa.cpp | 449 +++++++----------------------------- zone/client.h | 6 +- zone/client_packet.cpp | 2 +- zone/lua_client.cpp | 2 +- zone/mob.h | 2 +- zone/perl_client.cpp | 2 +- zone/titles.cpp | 4 +- 13 files changed, 299 insertions(+), 567 deletions(-) diff --git a/common/patches/rof.cpp b/common/patches/rof.cpp index f4f01e300..0596ee95b 100644 --- a/common/patches/rof.cpp +++ b/common/patches/rof.cpp @@ -2810,7 +2810,7 @@ namespace RoF eq->aa_spent = emu->aa_spent; // These fields may need to be correctly populated at some point - eq->aapoints_assigned = emu->aa_spent + 1; + eq->aapoints_assigned = 0; eq->aa_spent_general = 0; eq->aa_spent_archetype = 0; eq->aa_spent_class = 0; @@ -2846,58 +2846,81 @@ namespace RoF ENCODE(OP_SendAATable) { - ENCODE_LENGTH_ATLEAST(SendAA_Struct); - SETUP_VAR_ENCODE(SendAA_Struct); - ALLOC_VAR_ENCODE(structs::SendAA_Struct, sizeof(structs::SendAA_Struct) + emu->total_abilities*sizeof(structs::AA_Ability)); + EQApplicationPacket *inapp = *p; + *p = nullptr; + AARankInfo_Struct *emu = (AARankInfo_Struct*)inapp->pBuffer; - // Check clientver field to verify this AA should be sent for SoF - // clientver 1 is for all clients and 5 is for Live - if (emu->clientver <= 7) - { - OUT(id); - eq->unknown004 = 1; - //eq->hotkey_sid = (emu->hotkey_sid==4294967295UL)?0:(emu->id - emu->current_level + 1); - //eq->hotkey_sid2 = (emu->hotkey_sid2==4294967295UL)?0:(emu->id - emu->current_level + 1); - //eq->title_sid = emu->id - emu->current_level + 1; - //eq->desc_sid = emu->id - emu->current_level + 1; - eq->hotkey_sid = (emu->hotkey_sid == 4294967295UL) ? -1 : (emu->sof_next_skill); - eq->hotkey_sid2 = (emu->hotkey_sid2 == 4294967295UL) ? -1 : (emu->sof_next_skill); - eq->title_sid = emu->sof_next_skill; - eq->desc_sid = emu->sof_next_skill; - OUT(class_type); - OUT(cost); - OUT(seq); - OUT(current_level); - eq->prereq_skill_count = 1; // min 1 - OUT(prereq_skill); - eq->prereq_minpoints_count = 1; // min 1 - OUT(prereq_minpoints); - eq->type = emu->sof_type; - OUT(spellid); - eq->unknown057 = 1; // Introduced during HoT - OUT(spell_type); - OUT(spell_refresh); - OUT(classes); - OUT(berserker); - //eq->max_level = emu->sof_max_level; - OUT(max_level); - OUT(last_id); - OUT(next_id); - OUT(cost2); - eq->aa_expansion = emu->aa_expansion; - eq->special_category = emu->special_category; - eq->expendable_charges = emu->special_category == 7 ? 1 : 0; // temp hack, this can actually be any number - OUT(total_abilities); - unsigned int r; - for (r = 0; r < emu->total_abilities; r++) { - OUT(abilities[r].skill_id); - OUT(abilities[r].base1); - OUT(abilities[r].base2); - OUT(abilities[r].slot); - } + // the structs::SendAA_Struct includes enough space for 1 prereq which is the min even if it has no prereqs + auto prereq_size = emu->total_prereqs > 1 ? (emu->total_prereqs - 1) * 8 : 0; + auto outapp = new EQApplicationPacket(OP_SendAATable, sizeof(structs::SendAA_Struct) + emu->total_effects * sizeof(structs::AA_Ability) + prereq_size); + inapp->SetReadPosition(sizeof(AARankInfo_Struct)+emu->total_effects * sizeof(AARankEffect_Struct)); + + + std::vector skill; + std::vector points; + for(auto i = 0; i < emu->total_prereqs; ++i) { + skill.push_back(inapp->ReadUInt32()); + points.push_back(inapp->ReadUInt32()); } - FINISH_ENCODE(); + outapp->WriteUInt32(emu->id); + outapp->WriteUInt8(1); + outapp->WriteSInt32(emu->upper_hotkey_sid); + outapp->WriteSInt32(emu->lower_hotkey_sid); + outapp->WriteSInt32(emu->title_sid); + outapp->WriteSInt32(emu->desc_sid); + outapp->WriteSInt32(emu->level_req); + outapp->WriteSInt32(emu->cost); + outapp->WriteUInt32(emu->seq); + outapp->WriteUInt32(emu->current_level); + + if(emu->total_prereqs) { + outapp->WriteUInt32(emu->total_prereqs); + for(auto &e : skill) + outapp->WriteSInt32(e); + outapp->WriteUInt32(emu->total_prereqs); + for(auto &e : points) + outapp->WriteSInt32(e); + } + else { + outapp->WriteUInt32(1); + outapp->WriteUInt32(0); + outapp->WriteUInt32(1); + outapp->WriteUInt32(0); + } + + outapp->WriteSInt32(emu->type); + outapp->WriteSInt32(emu->spell); + outapp->WriteSInt32(1); + outapp->WriteSInt32(emu->spell_type); + outapp->WriteSInt32(emu->spell_refresh); + outapp->WriteSInt32(emu->classes); + outapp->WriteSInt32(emu->max_level); + outapp->WriteSInt32(emu->prev_id); + outapp->WriteSInt32(emu->next_id); + outapp->WriteSInt32(emu->total_cost); + outapp->WriteUInt8(0); + outapp->WriteUInt8(emu->grant_only); + outapp->WriteUInt8(0); + outapp->WriteUInt32(emu->charges); + outapp->WriteSInt32(emu->expansion); + outapp->WriteSInt32(emu->category); + outapp->WriteUInt8(0); // shroud + outapp->WriteUInt8(0); // unknown109 + outapp->WriteUInt8(0); // loh + outapp->WriteUInt8(0); // unknown111 + outapp->WriteUInt32(emu->total_effects); + + inapp->SetReadPosition(sizeof(AARankInfo_Struct)); + for(auto i = 0; i < emu->total_effects; ++i) { + outapp->WriteUInt32(inapp->ReadUInt32()); // skill_id + outapp->WriteUInt32(inapp->ReadUInt32()); // base1 + outapp->WriteUInt32(inapp->ReadUInt32()); // base2 + outapp->WriteUInt32(inapp->ReadUInt32()); // slot + } + + dest->FastQueuePacket(&outapp); + delete inapp; } ENCODE(OP_SendCharInfo) diff --git a/common/patches/rof2.cpp b/common/patches/rof2.cpp index 3d96ae182..ba2099710 100644 --- a/common/patches/rof2.cpp +++ b/common/patches/rof2.cpp @@ -2900,7 +2900,7 @@ namespace RoF2 eq->aa_spent = emu->aa_spent; // These fields may need to be correctly populated at some point - eq->aapoints_assigned = emu->aa_spent + 1; + eq->aapoints_assigned = 0; eq->aa_spent_general = 0; eq->aa_spent_archetype = 0; eq->aa_spent_class = 0; diff --git a/common/patches/sod.cpp b/common/patches/sod.cpp index 69bb7f4c1..1910a96e4 100644 --- a/common/patches/sod.cpp +++ b/common/patches/sod.cpp @@ -1862,55 +1862,56 @@ namespace SoD ENCODE(OP_SendAATable) { - ENCODE_LENGTH_ATLEAST(SendAA_Struct); - SETUP_VAR_ENCODE(SendAA_Struct); - ALLOC_VAR_ENCODE(structs::SendAA_Struct, sizeof(structs::SendAA_Struct) + emu->total_abilities*sizeof(structs::AA_Ability)); + EQApplicationPacket *inapp = *p; + *p = nullptr; + AARankInfo_Struct *emu = (AARankInfo_Struct*)inapp->pBuffer; - // Check clientver field to verify this AA should be sent for SoF - // clientver 1 is for all clients and 5 is for SoD - if (emu->clientver <= 5) - { - OUT(id); - eq->unknown004 = 1; - //eq->hotkey_sid = (emu->hotkey_sid==4294967295UL)?0:(emu->id - emu->current_level + 1); - //eq->hotkey_sid2 = (emu->hotkey_sid2==4294967295UL)?0:(emu->id - emu->current_level + 1); - //eq->title_sid = emu->id - emu->current_level + 1; - //eq->desc_sid = emu->id - emu->current_level + 1; - eq->hotkey_sid = (emu->hotkey_sid == 4294967295UL) ? 0 : (emu->sof_next_skill); - eq->hotkey_sid2 = (emu->hotkey_sid2 == 4294967295UL) ? 0 : (emu->sof_next_skill); - eq->title_sid = emu->sof_next_skill; - eq->desc_sid = emu->sof_next_skill; - OUT(class_type); - OUT(cost); - OUT(seq); - OUT(current_level); - OUT(prereq_skill); - OUT(prereq_minpoints); - eq->type = emu->sof_type; - OUT(spellid); - OUT(spell_type); - OUT(spell_refresh); - OUT(classes); - OUT(berserker); - //eq->max_level = emu->sof_max_level; - OUT(max_level); - OUT(last_id); - OUT(next_id); - OUT(cost2); - eq->aa_expansion = emu->aa_expansion; - eq->special_category = emu->special_category; - eq->expendable_charges = emu->special_category == 7 ? 1 : 0; // temp hack, this can actually be any number - OUT(total_abilities); - unsigned int r; - for (r = 0; r < emu->total_abilities; r++) { - OUT(abilities[r].skill_id); - OUT(abilities[r].base1); - OUT(abilities[r].base2); - OUT(abilities[r].slot); - } + EQApplicationPacket *outapp = new EQApplicationPacket(OP_SendAATable, sizeof(structs::SendAA_Struct) + emu->total_effects * sizeof(structs::AA_Ability)); + structs::SendAA_Struct *eq = (structs::SendAA_Struct*)outapp->pBuffer; + + inapp->SetReadPosition(sizeof(AARankInfo_Struct)); + outapp->SetWritePosition(sizeof(structs::SendAA_Struct)); + + eq->id = emu->id; + eq->unknown004 = 1; + eq->id = emu->id; + eq->hotkey_sid = emu->upper_hotkey_sid; + eq->hotkey_sid2 = emu->lower_hotkey_sid; + eq->desc_sid = emu->desc_sid; + eq->title_sid = emu->title_sid; + eq->class_type = emu->level_req; + eq->cost = emu->cost; + eq->seq = emu->seq; + eq->current_level = emu->current_level; + eq->type = emu->type; + eq->spellid = emu->spell; + eq->spell_type = emu->spell_type; + eq->spell_refresh = emu->spell_refresh; + eq->classes = emu->classes; + eq->max_level = emu->max_level; + eq->last_id = emu->prev_id; + eq->next_id = emu->next_id; + eq->cost2 = emu->total_cost; + eq->grant_only = emu->grant_only; + eq->expendable_charges = emu->charges; + eq->aa_expansion = emu->expansion; + eq->special_category = emu->category; + eq->total_abilities = emu->total_effects; + + for(auto i = 0; i < eq->total_abilities; ++i) { + eq->abilities[i].skill_id = inapp->ReadUInt32(); + eq->abilities[i].base1 = inapp->ReadUInt32(); + eq->abilities[i].base2 = inapp->ReadUInt32(); + eq->abilities[i].slot = inapp->ReadUInt32(); } - FINISH_ENCODE(); + if(emu->total_prereqs > 0) { + eq->prereq_skill = inapp->ReadUInt32(); + eq->prereq_minpoints = inapp->ReadUInt32(); + } + + dest->FastQueuePacket(&outapp); + delete inapp; } ENCODE(OP_SendCharInfo) diff --git a/common/patches/sof.cpp b/common/patches/sof.cpp index 2d8ec8d3a..421903970 100644 --- a/common/patches/sof.cpp +++ b/common/patches/sof.cpp @@ -1520,56 +1520,56 @@ namespace SoF ENCODE(OP_SendAATable) { - ENCODE_LENGTH_ATLEAST(SendAA_Struct); + EQApplicationPacket *inapp = *p; + *p = nullptr; + AARankInfo_Struct *emu = (AARankInfo_Struct*)inapp->pBuffer; - SETUP_VAR_ENCODE(SendAA_Struct); - ALLOC_VAR_ENCODE(structs::SendAA_Struct, sizeof(structs::SendAA_Struct) + emu->total_abilities*sizeof(structs::AA_Ability)); + EQApplicationPacket *outapp = new EQApplicationPacket(OP_SendAATable, sizeof(structs::SendAA_Struct) + emu->total_effects * sizeof(structs::AA_Ability)); + structs::SendAA_Struct *eq = (structs::SendAA_Struct*)outapp->pBuffer; - // Check clientver field to verify this AA should be sent for SoF - // clientver 1 is for all clients and 4 is for SoF - if (emu->clientver <= 4) - { - OUT(id); - eq->unknown004 = 1; - //eq->hotkey_sid = (emu->hotkey_sid==4294967295UL)?0:(emu->id - emu->current_level + 1); - //eq->hotkey_sid2 = (emu->hotkey_sid2==4294967295UL)?0:(emu->id - emu->current_level + 1); - //eq->title_sid = emu->id - emu->current_level + 1; - //eq->desc_sid = emu->id - emu->current_level + 1; - eq->hotkey_sid = (emu->hotkey_sid == 4294967295UL) ? 0 : (emu->sof_next_skill); - eq->hotkey_sid2 = (emu->hotkey_sid2 == 4294967295UL) ? 0 : (emu->sof_next_skill); - eq->title_sid = emu->sof_next_skill; - eq->desc_sid = emu->sof_next_skill; - OUT(class_type); - OUT(cost); - OUT(seq); - OUT(current_level); - OUT(prereq_skill); - OUT(prereq_minpoints); - eq->type = emu->sof_type; - OUT(spellid); - OUT(spell_type); - OUT(spell_refresh); - OUT(classes); - OUT(berserker); - //eq->max_level = emu->sof_max_level; - OUT(max_level); - OUT(last_id); - OUT(next_id); - OUT(cost2); - eq->aa_expansion = emu->aa_expansion; - eq->special_category = emu->special_category; - eq->expendable_charges = emu->special_category == 7 ? 1 : 0; // temp hack, this can actually be any number - OUT(total_abilities); - unsigned int r; - for (r = 0; r < emu->total_abilities; r++) { - OUT(abilities[r].skill_id); - OUT(abilities[r].base1); - OUT(abilities[r].base2); - OUT(abilities[r].slot); - } + inapp->SetReadPosition(sizeof(AARankInfo_Struct)); + outapp->SetWritePosition(sizeof(structs::SendAA_Struct)); + + eq->id = emu->id; + eq->unknown004 = 1; + eq->id = emu->id; + eq->hotkey_sid = emu->upper_hotkey_sid; + eq->hotkey_sid2 = emu->lower_hotkey_sid; + eq->desc_sid = emu->desc_sid; + eq->title_sid = emu->title_sid; + eq->class_type = emu->level_req; + eq->cost = emu->cost; + eq->seq = emu->seq; + eq->current_level = emu->current_level; + eq->type = emu->type; + eq->spellid = emu->spell; + eq->spell_type = emu->spell_type; + eq->spell_refresh = emu->spell_refresh; + eq->classes = emu->classes; + eq->max_level = emu->max_level; + eq->last_id = emu->prev_id; + eq->next_id = emu->next_id; + eq->cost2 = emu->total_cost; + eq->grant_only = emu->grant_only; + eq->expendable_charges = emu->charges; + eq->aa_expansion = emu->expansion; + eq->special_category = emu->category; + eq->total_abilities = emu->total_effects; + + for(auto i = 0; i < eq->total_abilities; ++i) { + eq->abilities[i].skill_id = inapp->ReadUInt32(); + eq->abilities[i].base1 = inapp->ReadUInt32(); + eq->abilities[i].base2 = inapp->ReadUInt32(); + eq->abilities[i].slot = inapp->ReadUInt32(); } - FINISH_ENCODE(); + if(emu->total_prereqs > 0) { + eq->prereq_skill = inapp->ReadUInt32(); + eq->prereq_minpoints = inapp->ReadUInt32(); + } + + dest->FastQueuePacket(&outapp); + delete inapp; } ENCODE(OP_SendCharInfo) @@ -1665,8 +1665,6 @@ namespace SoF emu_ptr += sizeof(CharacterSelectEntry_Struct); eq_ptr += sizeof(structs::CharacterSelectEntry_Struct); } - - FINISH_ENCODE(); } //hack hack hack diff --git a/common/patches/titanium.cpp b/common/patches/titanium.cpp index 2fda4038a..ec25aba61 100644 --- a/common/patches/titanium.cpp +++ b/common/patches/titanium.cpp @@ -1107,50 +1107,52 @@ namespace Titanium ENCODE(OP_SendAATable) { - ENCODE_LENGTH_ATLEAST(SendAA_Struct); + EQApplicationPacket *inapp = *p; + *p = nullptr; + AARankInfo_Struct *emu = (AARankInfo_Struct*)inapp->pBuffer; - SETUP_VAR_ENCODE(SendAA_Struct); - ALLOC_VAR_ENCODE(structs::SendAA_Struct, sizeof(structs::SendAA_Struct) + emu->total_abilities*sizeof(structs::AA_Ability)); + EQApplicationPacket *outapp = new EQApplicationPacket(OP_SendAATable, sizeof(structs::SendAA_Struct) + emu->total_effects * sizeof(structs::AA_Ability)); + structs::SendAA_Struct *eq = (structs::SendAA_Struct*)outapp->pBuffer; - // Check clientver field to verify this AA should be sent for Titanium - // clientver 1 is for all clients and 3 is for Titanium - if (emu->clientver <= 3) - { - OUT(id); - eq->unknown004 = 1; - eq->hotkey_sid = (emu->hotkey_sid == 4294967295UL) ? 0 : (emu->id - emu->current_level + 1); - eq->hotkey_sid2 = (emu->hotkey_sid2 == 4294967295UL) ? 0 : (emu->id - emu->current_level + 1); - eq->title_sid = emu->id - emu->current_level + 1; - eq->desc_sid = emu->id - emu->current_level + 1; - OUT(class_type); - OUT(cost); - OUT(seq); - OUT(current_level); - OUT(prereq_skill); - OUT(prereq_minpoints); - OUT(type); - OUT(spellid); - OUT(spell_type); - OUT(spell_refresh); - OUT(classes); - OUT(berserker); - OUT(max_level); - OUT(last_id); - OUT(next_id); - OUT(cost2); - OUT(unknown80[0]); - OUT(unknown80[1]); - OUT(total_abilities); - unsigned int r; - for (r = 0; r < emu->total_abilities; r++) { - OUT(abilities[r].skill_id); - OUT(abilities[r].base1); - OUT(abilities[r].base2); - OUT(abilities[r].slot); - } + inapp->SetReadPosition(sizeof(AARankInfo_Struct)); + outapp->SetWritePosition(sizeof(structs::SendAA_Struct)); + + eq->id = emu->id; + eq->unknown004 = 1; + eq->id = emu->id; + eq->hotkey_sid = emu->upper_hotkey_sid; + eq->hotkey_sid2 = emu->lower_hotkey_sid; + eq->desc_sid = emu->desc_sid; + eq->title_sid = emu->title_sid; + eq->class_type = emu->level_req; + eq->cost = emu->cost; + eq->seq = emu->seq; + eq->current_level = emu->current_level; + eq->type = emu->type; + eq->spellid = emu->spell; + eq->spell_type = emu->spell_type; + eq->spell_refresh = emu->spell_refresh; + eq->classes = emu->classes; + eq->max_level = emu->max_level; + eq->last_id = emu->prev_id; + eq->next_id = emu->next_id; + eq->cost2 = emu->total_cost; + eq->total_abilities = emu->total_effects; + + for(auto i = 0; i < eq->total_abilities; ++i) { + eq->abilities[i].skill_id = inapp->ReadUInt32(); + eq->abilities[i].base1 = inapp->ReadUInt32(); + eq->abilities[i].base2 = inapp->ReadUInt32(); + eq->abilities[i].slot = inapp->ReadUInt32(); } - FINISH_ENCODE(); + if(emu->total_prereqs > 0) { + eq->prereq_skill = inapp->ReadUInt32(); + eq->prereq_minpoints = inapp->ReadUInt32(); + } + + dest->FastQueuePacket(&outapp); + delete inapp; } ENCODE(OP_SendCharInfo) diff --git a/common/patches/uf.cpp b/common/patches/uf.cpp index 5b879af9d..df6fa9615 100644 --- a/common/patches/uf.cpp +++ b/common/patches/uf.cpp @@ -2129,8 +2129,8 @@ namespace UF SETUP_DIRECT_ENCODE(AATable_Struct, structs::AATable_Struct); eq->aa_spent = emu->aa_spent; - eq->aa_assigned = emu->aa_spent; - eq->aa_spent3 = emu->aa_spent; + eq->aa_assigned = 0; + eq->aa_spent3 = 0; eq->unknown012 = 0; eq->unknown016 = 0; eq->unknown020 = 0; @@ -2195,7 +2195,6 @@ namespace UF eq->prereq_minpoints = inapp->ReadUInt32(); } - //Log.Out(Logs::General, Logs::Status, "%s", DumpPacketToString(outapp).c_str()); dest->FastQueuePacket(&outapp); delete inapp; } diff --git a/zone/aa.cpp b/zone/aa.cpp index 868c1f62c..d6be92fe7 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -930,121 +930,6 @@ bool Client::CheckAAEffect(aaEffectType type) { return(false); } -void Client::BuyAA(AA_Action* action) -{ - //Log.Out(Logs::Detail, Logs::AA, "Starting to buy AA %d", action->ability); - // - ////find the AA information from the database - //SendAA_Struct* aa2 = zone->FindAA(action->ability); - ////if(!aa2) { - //// //hunt for a lower level... - //// int i; - //// int a; - //// for(i=1;iability - i; - //// if(a <= 0) - //// break; - //// Log.Out(Logs::Detail, Logs::AA, "Could not find AA %d, trying potential parent %d", action->ability, a); - //// aa2 = zone->FindAA(a); - //// if(aa2 != nullptr) - //// break; - //// } - ////} - //if(aa2 == nullptr) - // return; //invalid ability... - // - //if(aa2->special_category == 1 || aa2->special_category == 2) - // return; // Not purchasable progression style AAs - // - //if(aa2->special_category == 8 && aa2->cost == 0) - // return; // Not purchasable racial AAs(set a cost to make them purchasable) - // - //uint32 cur_level = GetAA(aa2->id); - //if((aa2->id + cur_level) != action->ability) { //got invalid AA - // Log.Out(Logs::Detail, Logs::AA, "Unable to find or match AA %d (found %d + lvl %d)", action->ability, aa2->id, cur_level); - // return; - //} - // - //if(aa2->account_time_required) - //{ - // if((Timer::GetTimeSeconds() - account_creation) < aa2->account_time_required) - // { - // return; - // } - //} - // - //uint32 real_cost; - //uint8 req_level; - ////std::map::iterator RequiredLevel = AARequiredLevelAndCost.find(action->ability); - //// - ////if(RequiredLevel != AARequiredLevelAndCost.end()) { - //// real_cost = RequiredLevel->second.Cost; - //// req_level = RequiredLevel->second.Level; - ////} - ////else { - //// real_cost = aa2->cost + (aa2->cost_inc * cur_level); - //// req_level = aa2->class_type + (aa2->level_inc * cur_level); - ////} - // - //if (req_level > GetLevel()) - // return; //Cheater trying to Buy AA... - // - //if (m_pp.aapoints >= real_cost && cur_level < aa2->max_level) { - // SetAA(aa2->id, cur_level + 1); - // - // Log.Out(Logs::Detail, Logs::AA, "Set AA %d to level %d", aa2->id, cur_level + 1); - // - // m_pp.aapoints -= real_cost; - // - // /* Do Player Profile rank calculations and set player profile */ - // SaveAA(); - // /* Save to Database to avoid having to write the whole AA array to the profile, only write changes*/ - // // database.SaveCharacterAA(this->CharacterID(), aa2->id, (cur_level + 1)); - // - // if ((RuleB(AA, Stacking) && (GetClientVersionBit() >= 4) && (aa2->hotkey_sid == 4294967295u)) - // && ((aa2->max_level == (cur_level + 1)) && aa2->sof_next_id)){ - // SendAA(aa2->id); - // SendAA(aa2->sof_next_id); - // } - // else - // SendAA(aa2->id); - // - // SendAATable(); - // - // /* - // We are building these messages ourself instead of using the stringID to work around patch discrepencies - // these are AA_GAIN_ABILITY (410) & AA_IMPROVE (411), respectively, in both Titanium & SoF. not sure about 6.2 - // */ - // - // /* Initial purchase of an AA ability */ - // if (cur_level < 1){ - // Message(15, "You have gained the ability \"%s\" at a cost of %d ability %s.", aa2->name, real_cost, (real_cost>1) ? "points" : "point"); - // - // /* QS: Player_Log_AA_Purchases */ - // if (RuleB(QueryServ, PlayerLogAAPurchases)){ - // std::string event_desc = StringFormat("Initial AA Purchase :: aa_name:%s aa_id:%i at cost:%i in zoneid:%i instid:%i", aa2->name, aa2->id, real_cost, this->GetZoneID(), this->GetInstanceID()); - // QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); - // } - // } - // /* Ranked purchase of an AA ability */ - // else{ - // Message(15, "You have improved %s %d at a cost of %d ability %s.", aa2->name, cur_level + 1, real_cost, (real_cost > 1) ? "points" : "point"); - // - // /* QS: Player_Log_AA_Purchases */ - // if (RuleB(QueryServ, PlayerLogAAPurchases)){ - // std::string event_desc = StringFormat("Ranked AA Purchase :: aa_name:%s aa_id:%i at cost:%i in zoneid:%i instid:%i", aa2->name, aa2->id, real_cost, this->GetZoneID(), this->GetInstanceID()); - // QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); - // } - // } - // - // //SendAAStats(); - // - // CalcBonuses(); - // if(title_manager.IsNewAATitleAvailable(m_pp.aapoints_spent, GetBaseClass())) - // NotifyNewTitlesAvailable(); - //} -} - void Client::SendAATimer(uint32 ability, uint32 begin, uint32 end) { EQApplicationPacket* outapp = new EQApplicationPacket(OP_AAAction,sizeof(UseAA_Struct)); UseAA_Struct* uaaout = (UseAA_Struct*)outapp->pBuffer; @@ -1078,235 +963,6 @@ void Client::SendAATimers() { safe_delete(outapp); } -void Client::SendPreviousAA(uint32 id, int seq){ -} - -void Client::SendAA(uint32 id, int seq) { - //Log.Out(Logs::General, Logs::Status, "SendAA(%u, %i)", id, seq); - // - //uint32 value=0; - //SendAA_Struct* saa2 = nullptr; - //SendAA_Struct* qaa = nullptr; - //SendAA_Struct* saa_pp = nullptr; - //bool IsBaseLevel = true; - //bool aa_stack = false; - // - //if(id==0) - // saa2 = zone->GetAABySequence(seq); - //else - // saa2 = zone->FindAA(id); - //if(!saa2) - // return; - // - //uint16 classes = saa2->classes; - //if(!(classes & (1 << GetClass())) && (GetClass()!=BERSERKER || saa2->berserker==0)){ - // return; - //} - // - //if(saa2->account_time_required) - //{ - // if((Timer::GetTimeSeconds() - account_creation) < saa2->account_time_required) - // { - // return; - // } - //} - // - //// Hide Quest/Progression AAs unless player has been granted the first level using $client->IncrementAA(skill_id). - //if (saa2->special_category == 1 || saa2->special_category == 2 ) { - // if(GetAA(saa2->id) == 0) - // return; - // // For Quest line AA(demiplane AEs) where only 1 is visible at a time, check to make sure only the highest level obtained is shown - // if(saa2->aa_expansion > 0) { - // qaa = zone->FindAA(saa2->id+1); - // if(qaa && (saa2->aa_expansion == qaa->aa_expansion) && GetAA(qaa->id) > 0) - // return; - // } - //} - -/* Beginning of Shroud AAs, these categories are for Passive and Active Shroud AAs - Eventually with a toggle we could have it show player list or shroud list - if (saa2->special_category == 3 || saa2->special_category == 4) - return; -*/ - // Check for racial/Drakkin blood line AAs - //if (saa2->special_category == 8) - //{ - // uint32 client_race = this->GetBaseRace(); - // - // // Drakkin Bloodlines - // if (saa2->aa_expansion > 522) - // { - // if (client_race != 522) - // return; // Check for Drakkin Race - // - // int heritage = this->GetDrakkinHeritage() + 523; // 523 = Drakkin Race(522) + Bloodline - // - // if (heritage != saa2->aa_expansion) - // return; - // } - // // Racial AAs - // else if (client_race != saa2->aa_expansion) - // { - // return; - // } - //} - // - ///* - //AA stacking on SoF+ clients. - // - //Note: There were many ways to achieve this effect - The method used proved to be the most straight forward and consistent. - //Stacking does not currently work ideally for AA's that use hotkeys, therefore they will be excluded at this time. - // - //TODO: Problem with aa.hotkeys - When you reach max rank of an AA tier (ie 5/5), it automatically displays the next AA in - //the series and you can not transfer the hotkey to the next AA series. To the best of the my ability and through many - //different variations of coding I could not find an ideal solution to this issue. - // - //How stacking works: - //Utilizes two new fields: sof_next_id (which is the next id in the series), sof_current_level (ranks the AA's as the current level) - //1) If no AA's purchased only display the base levels of each AA series. - //2) When you purchase an AA and its rank is maxed it sends the packet for the completed AA, and the packet - //for the next aa in the series. The previous tier is removed from your window, and the new AA is displayed. - //3) When you zone/buy your player profile will be checked and determine what AA can be displayed base on what you have already. - //*/ - // - //if (RuleB(AA, Stacking) && (GetClientVersionBit() >= 4) && (saa2->hotkey_sid == 4294967295u)) - // aa_stack = true; - // - ////if (aa_stack){ - //// uint32 aa_AA = 0; - //// uint32 aa_value = 0; - //// for (int i = 0; i < MAX_PP_AA_ARRAY; i++) { - //// if (aa[i]) { - //// aa_AA = aa[i]->AA; - //// aa_value = aa[i]->value; - //// - //// if (aa_AA){ - //// - //// if (aa_value > 0) - //// aa_AA -= aa_value-1; - //// - //// saa_pp = zone->FindAA(aa_AA); - //// - //// if (saa_pp){ - //// - //// if (saa_pp->sof_next_skill == saa2->sof_next_skill){ - //// - //// if (saa_pp->id == saa2->id) - //// break; //You already have this in the player profile. - //// else if ((saa_pp->sof_current_level < saa2->sof_current_level) && (aa_value < saa_pp->max_level)) - //// return; //DISABLE DISPLAY HIGHER - You have not reached max level yet of your current AA. - //// else if ((saa_pp->sof_current_level < saa2->sof_current_level) && (aa_value == saa_pp->max_level) && (saa_pp->sof_next_id == saa2->id)) - //// IsBaseLevel = false; //ALLOW DISPLAY HIGHER - //// } - //// } - //// } - //// } - //// } - ////} - // - ////Hide higher tiers of multi tiered AA's if the base level is not fully purchased. - //if (aa_stack && IsBaseLevel && saa2->sof_current_level > 0) - // return; - // - //int size=sizeof(SendAA_Struct)+sizeof(AA_Ability)*saa2->total_abilities; - // - //if(size == 0) - // return; - // - //uchar* buffer = new uchar[size]; - //SendAA_Struct* saa=(SendAA_Struct*)buffer; - //memcpy(saa,saa2,size); - // - //if(saa->spellid==0) - // saa->spellid=0xFFFFFFFF; - // - //value=GetAA(saa->id); - //uint32 orig_val = value; - // - //if(value && saa->id){ - // - // if(value < saa->max_level){ - // saa->id+=value; - // saa->next_id=saa->id+1; - // value++; - // } - // - // else if (aa_stack && saa->sof_next_id){ - // saa->id+=value-1; - // saa->next_id=saa->sof_next_id; - // - // //Prevent removal of previous AA from window if next AA belongs to a higher client version. - // SendAA_Struct* saa_next = nullptr; - // saa_next = zone->FindAA(saa->sof_next_id); - // - // // this check should work as long as we continue to just add the clients and just increase - // // each number .... - // if (saa_next && static_cast(GetClientVersion()) < saa_next->clientver - 1) { - // saa->next_id=0xFFFFFFFF; - // } - // } - // - // else{ - // saa->id+=value-1; - // saa->next_id=0xFFFFFFFF; - // } - // - // uint32 current_level_mod = 0; - // if (aa_stack) - // current_level_mod = saa->sof_current_level; - // - // saa->last_id=saa->id-1; - // saa->current_level=value+(current_level_mod); - // saa->cost = saa2->cost + (saa2->cost_inc*(value-1)); - // saa->cost2 = 0; - // for(uint32 i = 0; i < value; i++) { - // saa->cost2 += saa2->cost + (saa2->cost_inc * i); - // } - // saa->class_type = saa2->class_type + (saa2->level_inc*(value-1)); - //} - // - //if (aa_stack){ - // - // if (saa->sof_current_level >= 1 && value == 0) - // saa->current_level = saa->sof_current_level+1; - // - // saa->max_level = saa->sof_max_level; - //} - // - ////database.FillAAEffects(saa); - // - ////if(value > 0) - ////{ - //// // AA_Action stores the base ID - //// const AA_DBAction *caa = &AA_Actions[saa->id - value + 1][value - 1]; - //// - //// if(caa && caa->reuse_time > 0) - //// saa->spell_refresh = CalcAAReuseTimer(caa); - ////} - // - ////You can now use the level_inc field in the altadv_vars table to accomplish this, though still needed - ////for special cases like LOH/HT due to inability to implement correct stacking of AA's that use hotkeys. - ////std::map::iterator RequiredLevel = AARequiredLevelAndCost.find(saa->id); - //// - ////if(RequiredLevel != AARequiredLevelAndCost.end()) - ////{ - //// saa->class_type = RequiredLevel->second.Level; - //// saa->cost = RequiredLevel->second.Cost; - ////} - // - // - //EQApplicationPacket* outapp = new EQApplicationPacket(OP_SendAATable); - //outapp->size=size; - //outapp->pBuffer=(uchar*)saa; - // - //if(id==0 && value && (orig_val < saa->max_level)) //send previous AA only on zone in - // SendPreviousAA(id, seq); - // - //QueuePacket(outapp); - //safe_delete(outapp); - ////will outapp delete the buffer for us even though it didnt make it? --- Yes, it should -} - void Client::ResetAA(){ // RefundAA(); // uint32 i; @@ -1657,25 +1313,6 @@ void Client::RefundAA() { // } } -void Client::IncrementAA(int aa_id) { - //SendAA_Struct* aa2 = zone->FindAA(aa_id); - // - //if(aa2 == nullptr) - // return; - // - //if(GetAA(aa_id) == aa2->max_level) - // return; - // - //SetAA(aa_id, GetAA(aa_id) + 1); - // - //SaveAA(); - // - //SendAA(aa_id); - //SendAATable(); - //SendAAStats(); - //CalcBonuses(); -} - AA_SwarmPetInfo::AA_SwarmPetInfo() { target = 0; @@ -1753,7 +1390,12 @@ void Client::SendAlternateAdvancementRank(int aa_id, int level) { aai->current_level = level; aai->max_level = ability->GetMaxLevel(); aai->prev_id = rank->prev_id; - aai->next_id = rank->next_id; + + if(rank->next && !CanUseAlternateAdvancementRank(rank->next)) { + aai->next_id = -1; + } else { + aai->next_id = rank->next_id; + } aai->total_cost = rank->total_cost; aai->expansion = rank->expansion; aai->category = ability->category; @@ -1810,7 +1452,7 @@ void Client::SendAlternateAdvancementPoints() { } - aa2->aa_spent = GetAAPointsSpent(); + aa2->aa_spent = GetSpentAA(); QueuePacket(outapp); safe_delete(outapp); } @@ -1825,7 +1467,7 @@ void Client::PurchaseAlternateAdvancementRank(int rank_id) { return; } - if(!CanPurchaseAlternateAdvancementRank(rank)) { + if(!CanPurchaseAlternateAdvancementRank(rank, true)) { return; } @@ -1877,6 +1519,67 @@ void Client::PurchaseAlternateAdvancementRank(int rank_id) { NotifyNewTitlesAvailable(); } +void Client::IncrementAlternateAdvancementRank(int rank_id) { + AA::Rank *rank = zone->GetAlternateAdvancementRank(rank_id); + if(!rank) { + return; + } + + if(!rank->base_ability) { + return; + } + + if(!CanPurchaseAlternateAdvancementRank(rank, false)) { + return; + } + + if(rank->base_ability->charges > 0) { + SetAA(rank_id, rank->current_value, rank->base_ability->charges); + } + else { + SetAA(rank_id, rank->current_value, 0); + + //if not max then send next aa + if(rank->next) { + SendAlternateAdvancementRank(rank->base_ability->id, rank->next->current_value); + } + } + + SaveAA(); + + SendAlternateAdvancementPoints(); + SendAlternateAdvancementStats(); + + if(rank->prev) { + Message_StringID(15, AA_IMPROVE, + std::to_string(rank->title_sid).c_str(), + std::to_string(rank->prev->current_value).c_str(), + std::to_string(rank->cost).c_str(), + std::to_string(AA_POINTS).c_str()); + + //QS stuff broke with new aa, todo: fix later + /* QS: Player_Log_AA_Purchases */ + // if (RuleB(QueryServ, PlayerLogAAPurchases)){ + // std::string event_desc = StringFormat("Ranked AA Purchase :: aa_name:%s aa_id:%i at cost:%i in zoneid:%i instid:%i", aa2->name, aa2->id, real_cost, this->GetZoneID(), this->GetInstanceID()); + // QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); + // } + } + else { + Message_StringID(15, AA_GAIN_ABILITY, + std::to_string(rank->title_sid).c_str(), + std::to_string(rank->cost).c_str(), + std::to_string(AA_POINTS).c_str()); + //QS stuff broke with new aa, todo: fix later + /* QS: Player_Log_AA_Purchases */ + // if (RuleB(QueryServ, PlayerLogAAPurchases)){ + // std::string event_desc = StringFormat("Initial AA Purchase :: aa_name:%s aa_id:%i at cost:%i in zoneid:%i instid:%i", aa2->name, aa2->id, real_cost, this->GetZoneID(), this->GetInstanceID()); + // QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); + // } + } + + CalcBonuses(); +} + bool ZoneDatabase::LoadAlternateAdvancement(Client *c) { c->ClearAAs(); std::string query = StringFormat( @@ -1984,6 +1687,16 @@ bool Mob::CanUseAlternateAdvancementRank(AA::Rank *rank) { return false; } + //the one titanium hack i will allow + //just to make sure we dont crash the client with newer aas + //we'll exclude any expendable ones + if(IsClient() && CastToClient()->GetClientVersionBit() & BIT_TitaniumAndEarlier) { + if(ability->charges > 0) { + return false; + } + } + + //I might add a races behind the scenes field to take care of this // Check for racial/Drakkin blood line AAs if(ability->category == 8) { @@ -2009,7 +1722,7 @@ bool Mob::CanUseAlternateAdvancementRank(AA::Rank *rank) { return true; } -bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank) { +bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price) { AA::Ability *ability = rank->base_ability; if(!ability) @@ -2063,7 +1776,7 @@ bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank) { } //check price, if client - if(IsClient()) { + if(check_price && IsClient()) { if(rank->cost > CastToClient()->GetAAPoints()) { return false; } diff --git a/zone/client.h b/zone/client.h index bd2c5371d..082d86fdc 100644 --- a/zone/client.h +++ b/zone/client.h @@ -764,6 +764,7 @@ public: void SendAlternateAdvancementTable(); void SendAlternateAdvancementStats(); void PurchaseAlternateAdvancementRank(int rank_id); + void IncrementAlternateAdvancementRank(int rank_id); void SendAlternateAdvancementPoints(); void SetAAPoints(uint32 points) { m_pp.aapoints = points; SendAlternateAdvancementStats(); } @@ -774,9 +775,6 @@ public: //old AA Methods void ResetAA(); void SendClearAA(); - void SendAA(uint32 id, int seq=1); - void SendPreviousAA(uint32 id, int seq=1); - void BuyAA(AA_Action* action); //this function is used by some AA stuff void MemorizeSpell(uint32 slot,uint32 spellid,uint32 scribing); void SetAATitle(const char *Title); @@ -793,11 +791,9 @@ public: void DisableAAEffect(aaEffectType type); bool CheckAAEffect(aaEffectType type); void HandleAAAction(aaID activate); - inline uint32 GetAAPointsSpent() { return m_pp.aapoints_spent; } int16 CalcAAFocusEffect(focusType type, uint16 focus_spell, uint16 spell_id); int16 CalcAAFocus(focusType type, uint32 aa_ID, uint16 spell_id); void RefundAA(); - void IncrementAA(int aa_id); int32 GetAAEffectDataBySlot(uint32 aa_ID, uint32 slot_id, bool GetEffect, bool GetBase1, bool GetBase2); int32 GetAAEffectid(uint32 aa_ID, uint32 slot_id) { return GetAAEffectDataBySlot(aa_ID, slot_id, true, false,false); } int32 GetAABase1(uint32 aa_ID, uint32 slot_id) { return GetAAEffectDataBySlot(aa_ID, slot_id, false, true,false); } diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index e7d3b61a7..2068a815c 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -8801,7 +8801,7 @@ void Client::Handle_OP_LFGuild(const EQApplicationPacket *app) pack->WriteUInt32(QSG_LFGuild_UpdatePlayerInfo); pack->WriteUInt32(GetBaseClass()); pack->WriteUInt32(GetLevel()); - pack->WriteUInt32(GetAAPointsSpent()); + pack->WriteUInt32(GetSpentAA()); pack->WriteString(pts->Comment); pack->WriteUInt32(pts->Toggle); pack->WriteUInt32(pts->TimeZone); diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index 47607b705..37f379a06 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -1024,7 +1024,7 @@ void Lua_Client::AddLevelBasedExp(int exp_pct, int max_level) { void Lua_Client::IncrementAA(int aa) { Lua_Safe_Call_Void(); - self->IncrementAA(aa); + self->IncrementAlternateAdvancementRank(aa); } void Lua_Client::MarkSingleCompassLoc(float in_x, float in_y, float in_z) { diff --git a/zone/mob.h b/zone/mob.h index ce9fe3634..db3879257 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -961,7 +961,7 @@ public: bool SetAA(uint32 rank_id, uint32 new_value, uint32 charges = 0); void ClearAAs() { aa_ranks.clear(); } bool CanUseAlternateAdvancementRank(AA::Rank *rank); - bool CanPurchaseAlternateAdvancementRank(AA::Rank *ran); + bool CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price); protected: void CommonDamage(Mob* other, int32 &damage, const uint16 spell_id, const SkillUseTypes attack_skill, bool &avoidable, const int8 buffslot, const bool iBuffTic); diff --git a/zone/perl_client.cpp b/zone/perl_client.cpp index d564a341e..95fc146ae 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -4916,7 +4916,7 @@ XS(XS_Client_IncrementAA) if(THIS == nullptr) Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - THIS->IncrementAA(aaskillid); + THIS->IncrementAlternateAdvancementRank(aaskillid); } XSRETURN_EMPTY; } diff --git a/zone/titles.cpp b/zone/titles.cpp index 3a4162060..8e6115aee 100644 --- a/zone/titles.cpp +++ b/zone/titles.cpp @@ -179,10 +179,10 @@ bool TitleManager::IsClientEligibleForTitle(Client *c, std::vector:: if((Title->Class >= 0) && (c->GetBaseClass() != Title->Class)) return false; - if((Title->MinAAPoints >= 0) && (c->GetAAPointsSpent() < static_cast(Title->MinAAPoints))) + if((Title->MinAAPoints >= 0) && (c->GetSpentAA() < static_cast(Title->MinAAPoints))) return false; - if((Title->MaxAAPoints >= 0) && (c->GetAAPointsSpent() > static_cast(Title->MaxAAPoints))) + if((Title->MaxAAPoints >= 0) && (c->GetSpentAA() > static_cast(Title->MaxAAPoints))) return false; if(Title->SkillID >= 0) From dd345c01de2be23d6dbd711d8e811776e2a5d833 Mon Sep 17 00:00:00 2001 From: KimLS Date: Thu, 11 Jun 2015 21:33:39 -0700 Subject: [PATCH 12/90] Activating AAs now works, don't have expend charges working quite yet so they can just be cast over and over. --- common/eq_packet_structs.h | 2 +- common/patches/rof.cpp | 2 +- common/patches/rof2.cpp | 2 +- common/patches/rof2_structs.h | 2 +- common/patches/rof_structs.h | 2 +- common/patches/sod_structs.h | 2 +- common/patches/sof_structs.h | 2 +- common/patches/titanium_structs.h | 2 +- common/patches/uf.cpp | 2 +- common/patches/uf_structs.h | 2 +- common/spdat.h | 2 +- zone/aa.cpp | 233 ++++++++++++++++++++---------- zone/client.cpp | 2 +- zone/client.h | 6 +- zone/client_packet.cpp | 8 +- zone/mob.h | 1 + zone/spells.cpp | 5 +- 17 files changed, 176 insertions(+), 101 deletions(-) diff --git a/common/eq_packet_structs.h b/common/eq_packet_structs.h index e562a94e5..7b604fc47 100644 --- a/common/eq_packet_structs.h +++ b/common/eq_packet_structs.h @@ -4319,7 +4319,7 @@ struct SendAA_Struct { struct AA_Action { /*00*/ uint32 action; /*04*/ uint32 ability; -/*08*/ uint32 unknown08; +/*08*/ uint32 target_id; /*12*/ uint32 exp_value; }; diff --git a/common/patches/rof.cpp b/common/patches/rof.cpp index 0596ee95b..e76f33bbe 100644 --- a/common/patches/rof.cpp +++ b/common/patches/rof.cpp @@ -2810,7 +2810,7 @@ namespace RoF eq->aa_spent = emu->aa_spent; // These fields may need to be correctly populated at some point - eq->aapoints_assigned = 0; + eq->aapoints_assigned = emu->aa_spent; eq->aa_spent_general = 0; eq->aa_spent_archetype = 0; eq->aa_spent_class = 0; diff --git a/common/patches/rof2.cpp b/common/patches/rof2.cpp index ba2099710..ec5752f79 100644 --- a/common/patches/rof2.cpp +++ b/common/patches/rof2.cpp @@ -2900,7 +2900,7 @@ namespace RoF2 eq->aa_spent = emu->aa_spent; // These fields may need to be correctly populated at some point - eq->aapoints_assigned = 0; + eq->aapoints_assigned = emu->aa_spent; eq->aa_spent_general = 0; eq->aa_spent_archetype = 0; eq->aa_spent_class = 0; diff --git a/common/patches/rof2_structs.h b/common/patches/rof2_structs.h index 812e9c464..bc49fe88f 100644 --- a/common/patches/rof2_structs.h +++ b/common/patches/rof2_structs.h @@ -4289,7 +4289,7 @@ struct AA_List { struct AA_Action { /*00*/ uint32 action; /*04*/ uint32 ability; -/*08*/ uint32 unknown08; +/*08*/ uint32 target_id; /*12*/ uint32 exp_value; /*16*/ }; diff --git a/common/patches/rof_structs.h b/common/patches/rof_structs.h index a87b530c4..eb7c6edfb 100644 --- a/common/patches/rof_structs.h +++ b/common/patches/rof_structs.h @@ -4288,7 +4288,7 @@ struct AA_List { struct AA_Action { /*00*/ uint32 action; /*04*/ uint32 ability; -/*08*/ uint32 unknown08; +/*08*/ uint32 target_id; /*12*/ uint32 exp_value; /*16*/ }; diff --git a/common/patches/sod_structs.h b/common/patches/sod_structs.h index 2f5d2c2db..6e1a77b6b 100644 --- a/common/patches/sod_structs.h +++ b/common/patches/sod_structs.h @@ -3840,7 +3840,7 @@ struct AA_List { struct AA_Action { /*00*/ uint32 action; /*04*/ uint32 ability; -/*08*/ uint32 unknown08; +/*08*/ uint32 target_id; /*12*/ uint32 exp_value; }; diff --git a/common/patches/sof_structs.h b/common/patches/sof_structs.h index afd34ba68..faa306ab0 100644 --- a/common/patches/sof_structs.h +++ b/common/patches/sof_structs.h @@ -3702,7 +3702,7 @@ struct AA_List { struct AA_Action { /*00*/ uint32 action; /*04*/ uint32 ability; -/*08*/ uint32 unknown08; +/*08*/ uint32 target_id; /*12*/ uint32 exp_value; }; diff --git a/common/patches/titanium_structs.h b/common/patches/titanium_structs.h index f836395c9..e5fa44a8e 100644 --- a/common/patches/titanium_structs.h +++ b/common/patches/titanium_structs.h @@ -3175,7 +3175,7 @@ struct AA_List { struct AA_Action { /*00*/ uint32 action; /*04*/ uint32 ability; -/*08*/ uint32 unknown08; +/*08*/ uint32 target_id; /*12*/ uint32 exp_value; }; diff --git a/common/patches/uf.cpp b/common/patches/uf.cpp index df6fa9615..ef224d574 100644 --- a/common/patches/uf.cpp +++ b/common/patches/uf.cpp @@ -2129,7 +2129,7 @@ namespace UF SETUP_DIRECT_ENCODE(AATable_Struct, structs::AATable_Struct); eq->aa_spent = emu->aa_spent; - eq->aa_assigned = 0; + eq->aa_assigned = emu->aa_spent; eq->aa_spent3 = 0; eq->unknown012 = 0; eq->unknown016 = 0; diff --git a/common/patches/uf_structs.h b/common/patches/uf_structs.h index 36d6dea74..882158492 100644 --- a/common/patches/uf_structs.h +++ b/common/patches/uf_structs.h @@ -3912,7 +3912,7 @@ struct AA_List { struct AA_Action { /*00*/ uint32 action; /*04*/ uint32 ability; -/*08*/ uint32 unknown08; +/*08*/ uint32 target_id; /*12*/ uint32 exp_value; }; diff --git a/common/spdat.h b/common/spdat.h index bf2d23f30..bb71c1e88 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -417,7 +417,7 @@ typedef enum { #define SE_SongModCap 261 // implemented[AA] - Song Mod cap increase (no longer used on live) #define SE_RaiseStatCap 262 // implemented //#define SE_TradeSkillMastery 263 // not implemented - lets you raise more than one tradeskill above master. -//#define SE_HastenedAASkill 264 // not implemented as bonus - Use redux field in aa_actions table for this effect +#define SE_HastenedAASkill 264 // implemented #define SE_MasteryofPast 265 // implemented[AA] - Spells less than effect values level can not be fizzled #define SE_ExtraAttackChance 266 // implemented - increase chance to score an extra attack with a 2-Handed Weapon. #define SE_PetDiscipline2 267 // *not implemented - /pet focus, /pet no cast diff --git a/zone/aa.cpp b/zone/aa.cpp index d6be92fe7..368eda225 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -37,32 +37,6 @@ Copyright (C) 2001-2004 EQEMu Development Team (http://eqemulator.net) extern QueryServ* QServ; -int Client::GetAATimerID(aaID activate) -{ - //SendAA_Struct* aa2 = zone->FindAA(activate); - // - //if(!aa2) - //{ - // for(int i = 1;i < MAX_AA_ACTION_RANKS; ++i) - // { - // int a = activate - i; - // - // if(a <= 0) - // break; - // - // aa2 = zone->FindAA(a); - // - // if(aa2 != nullptr) - // break; - // } - //} - // - //if(aa2) - // return aa2->spell_type; - - return 0; -} - int Client::CalcAAReuseTimer(const AA_DBAction *caa) { if(!caa) @@ -930,39 +904,6 @@ bool Client::CheckAAEffect(aaEffectType type) { return(false); } -void Client::SendAATimer(uint32 ability, uint32 begin, uint32 end) { - EQApplicationPacket* outapp = new EQApplicationPacket(OP_AAAction,sizeof(UseAA_Struct)); - UseAA_Struct* uaaout = (UseAA_Struct*)outapp->pBuffer; - uaaout->ability = ability; - uaaout->begin = begin; - uaaout->end = end; - QueuePacket(outapp); - safe_delete(outapp); -} - -//sends all AA timers. -void Client::SendAATimers() { - //we dont use SendAATimer because theres no reason to allocate the EQApplicationPacket every time - EQApplicationPacket* outapp = new EQApplicationPacket(OP_AAAction,sizeof(UseAA_Struct)); - UseAA_Struct* uaaout = (UseAA_Struct*)outapp->pBuffer; - - PTimerList::iterator c,e; - c = p_timers.begin(); - e = p_timers.end(); - for(; c != e; ++c) { - PersistentTimer *cur = c->second; - if(cur->GetType() < pTimerAAStart || cur->GetType() > pTimerAAEnd) - continue; //not an AA timer - //send timer - uaaout->begin = cur->GetStartTime(); - uaaout->end = static_cast(time(nullptr)); - uaaout->ability = cur->GetType() - pTimerAAStart; // uuaaout->ability is really a shared timer number - QueuePacket(outapp); - } - - safe_delete(outapp); -} - void Client::ResetAA(){ // RefundAA(); // uint32 i; @@ -1457,6 +1398,39 @@ void Client::SendAlternateAdvancementPoints() { safe_delete(outapp); } +void Client::SendAlternateAdvancementTimer(int ability, int begin, int end) { + EQApplicationPacket* outapp = new EQApplicationPacket(OP_AAAction, sizeof(UseAA_Struct)); + UseAA_Struct* uaaout = (UseAA_Struct*)outapp->pBuffer; + uaaout->ability = ability; + uaaout->begin = begin; + uaaout->end = end; + QueuePacket(outapp); + safe_delete(outapp); +} + +//sends all AA timers. +void Client::SendAlternateAdvancementTimers() { + //we dont use SendAATimer because theres no reason to allocate the EQApplicationPacket every time + EQApplicationPacket* outapp = new EQApplicationPacket(OP_AAAction, sizeof(UseAA_Struct)); + UseAA_Struct* uaaout = (UseAA_Struct*)outapp->pBuffer; + + PTimerList::iterator c, e; + c = p_timers.begin(); + e = p_timers.end(); + for(; c != e; ++c) { + PersistentTimer *cur = c->second; + if(cur->GetType() < pTimerAAStart || cur->GetType() > pTimerAAEnd) + continue; //not an AA timer + //send timer + uaaout->begin = cur->GetStartTime(); + uaaout->end = static_cast(time(nullptr)); + uaaout->ability = cur->GetType() - pTimerAAStart; // uuaaout->ability is really a shared timer number + QueuePacket(outapp); + } + + safe_delete(outapp); +} + void Client::PurchaseAlternateAdvancementRank(int rank_id) { AA::Rank *rank = zone->GetAlternateAdvancementRank(rank_id); if(!rank) { @@ -1495,23 +1469,21 @@ void Client::PurchaseAlternateAdvancementRank(int rank_id) { std::to_string(rank->cost).c_str(), std::to_string(AA_POINTS).c_str()); - //QS stuff broke with new aa, todo: fix later /* QS: Player_Log_AA_Purchases */ - // if (RuleB(QueryServ, PlayerLogAAPurchases)){ - // std::string event_desc = StringFormat("Ranked AA Purchase :: aa_name:%s aa_id:%i at cost:%i in zoneid:%i instid:%i", aa2->name, aa2->id, real_cost, this->GetZoneID(), this->GetInstanceID()); - // QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); - // } + if (RuleB(QueryServ, PlayerLogAAPurchases)){ + std::string event_desc = StringFormat("Ranked AA Purchase :: aa_id:%i at cost:%i in zoneid:%i instid:%i", rank->id, rank->cost, GetZoneID(), GetInstanceID()); + QServ->PlayerLogEvent(Player_Log_AA_Purchases, CharacterID(), event_desc); + } } else { Message_StringID(15, AA_GAIN_ABILITY, std::to_string(rank->title_sid).c_str(), std::to_string(rank->cost).c_str(), std::to_string(AA_POINTS).c_str()); - //QS stuff broke with new aa, todo: fix later /* QS: Player_Log_AA_Purchases */ - // if (RuleB(QueryServ, PlayerLogAAPurchases)){ - // std::string event_desc = StringFormat("Initial AA Purchase :: aa_name:%s aa_id:%i at cost:%i in zoneid:%i instid:%i", aa2->name, aa2->id, real_cost, this->GetZoneID(), this->GetInstanceID()); - // QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); - // } + if (RuleB(QueryServ, PlayerLogAAPurchases)){ + std::string event_desc = StringFormat("Initial AA Purchase :: aa_id:%i at cost:%i in zoneid:%i instid:%i", rank->id, rank->cost, GetZoneID(), GetInstanceID()); + QServ->PlayerLogEvent(Player_Log_AA_Purchases, CharacterID(), event_desc); + } } CalcBonuses(); @@ -1557,29 +1529,132 @@ void Client::IncrementAlternateAdvancementRank(int rank_id) { std::to_string(rank->cost).c_str(), std::to_string(AA_POINTS).c_str()); - //QS stuff broke with new aa, todo: fix later /* QS: Player_Log_AA_Purchases */ - // if (RuleB(QueryServ, PlayerLogAAPurchases)){ - // std::string event_desc = StringFormat("Ranked AA Purchase :: aa_name:%s aa_id:%i at cost:%i in zoneid:%i instid:%i", aa2->name, aa2->id, real_cost, this->GetZoneID(), this->GetInstanceID()); - // QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); - // } + if (RuleB(QueryServ, PlayerLogAAPurchases)){ + std::string event_desc = StringFormat("Ranked AA Purchase :: aa_id:%i at cost:%i in zoneid:%i instid:%i", rank->id, rank->cost, GetZoneID(), GetInstanceID()); + QServ->PlayerLogEvent(Player_Log_AA_Purchases, CharacterID(), event_desc); + } } else { Message_StringID(15, AA_GAIN_ABILITY, std::to_string(rank->title_sid).c_str(), std::to_string(rank->cost).c_str(), std::to_string(AA_POINTS).c_str()); - //QS stuff broke with new aa, todo: fix later + /* QS: Player_Log_AA_Purchases */ - // if (RuleB(QueryServ, PlayerLogAAPurchases)){ - // std::string event_desc = StringFormat("Initial AA Purchase :: aa_name:%s aa_id:%i at cost:%i in zoneid:%i instid:%i", aa2->name, aa2->id, real_cost, this->GetZoneID(), this->GetInstanceID()); - // QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); - // } + if (RuleB(QueryServ, PlayerLogAAPurchases)){ + std::string event_desc = StringFormat("Initial AA Purchase :: aa_id:%i at cost:%i in zoneid:%i instid:%i", rank->id, rank->cost, GetZoneID(), GetInstanceID()); + QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); + } } CalcBonuses(); } +void Client::ActivateAlternateAdvancementAbility(int rank_id, int target_id) { + AA::Rank *rank = zone->GetAlternateAdvancementRank(rank_id); + if(!rank) { + return; + } + + AA::Ability *ability = rank->base_ability; + if(!ability) { + return; + } + + if(!IsValidSpell(rank->spell)) { + return; + } + + if(!CanUseAlternateAdvancementRank(rank)) { + return; + } + + //make sure it's activateable type + if(!(ability->type == 3 || ability->type == 4)) { + return; + } + + //check cooldown + if(!p_timers.Expired(&database, rank->spell_type + pTimerAAStart)) { + uint32 aaremain = p_timers.GetRemainingTime(rank->spell_type + pTimerAAStart); + uint32 aaremain_hr = aaremain / (60 * 60); + uint32 aaremain_min = (aaremain / 60) % 60; + uint32 aaremain_sec = aaremain % 60; + + if(aaremain_hr >= 1) { + Message(13, "You can use this ability again in %u hour(s) %u minute(s) %u seconds", + aaremain_hr, aaremain_min, aaremain_sec); + } + else { + Message(13, "You can use this ability again in %u minute(s) %u seconds", + aaremain_min, aaremain_sec); + } + + return; + } + + //calculate cooldown + int cooldown = rank->recast_time - GetAlternateAdvancementCooldownReduction(rank); + if(cooldown < 0) { + cooldown = 0; + } + + // Bards can cast instant cast AAs while they are casting another song + if(spells[rank->spell].cast_time == 0 && GetClass() == BARD && IsBardSong(casting_spell_id)) { + if(!SpellFinished(rank->spell, entity_list.GetMob(target_id), 10, -1, -1, spells[rank->spell].ResistDiff, false)) { + //Reset on failed cast + SendAlternateAdvancementTimer(rank->spell_type, 0, -1); + Message_StringID(15, ABILITY_FAILED); + p_timers.Clear(&database, rank->spell_type + pTimerAAStart); + return; + } + } else { + if(!CastSpell(rank->spell, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, rank->spell_type + pTimerAAStart, cooldown, 1)) { + //Reset on failed cast + SendAlternateAdvancementTimer(rank->spell_type, 0, -1); + Message_StringID(15, ABILITY_FAILED); + p_timers.Clear(&database, rank->spell_type + pTimerAAStart); + return; + } + } + + if(cooldown > 0) { + SendAlternateAdvancementTimer(rank->spell_type, 0, 0); + } +} + +int Mob::GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in) { + if(!rank_in) { + return 0; + } + + AA::Ability *ability_in = rank_in->base_ability; + if(!ability_in) { + return 0; + } + + for(auto &aa : aa_ranks) { + AA::Ability *ability = zone->GetAlternateAdvancementAbility(aa.first); + if(!ability) { + continue; + } + + AA::Rank *rank = ability->GetRankByPointsSpent(aa.second.first); + if(!rank) { + continue; + } + + for(auto &effect : rank->effects) { + if(effect.effect_id == SE_HastenedAASkill && effect.base2 == ability_in->id) { + return effect.base1; + } + } + } + + return 0; +} + bool ZoneDatabase::LoadAlternateAdvancement(Client *c) { c->ClearAAs(); std::string query = StringFormat( diff --git a/zone/client.cpp b/zone/client.cpp index f36609b9c..5ef3e84e5 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -456,7 +456,7 @@ void Client::SendZoneInPackets() } safe_delete(outapp); - SendAATimers(); + SendAlternateAdvancementTimers(); outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(ZoneInSendName_Struct)); ZoneInSendName_Struct* zonesendname = (ZoneInSendName_Struct*)outapp->pBuffer; diff --git a/zone/client.h b/zone/client.h index 082d86fdc..dd283596d 100644 --- a/zone/client.h +++ b/zone/client.h @@ -765,7 +765,10 @@ public: void SendAlternateAdvancementStats(); void PurchaseAlternateAdvancementRank(int rank_id); void IncrementAlternateAdvancementRank(int rank_id); + void ActivateAlternateAdvancementAbility(int rank_id, int target_id); void SendAlternateAdvancementPoints(); + void SendAlternateAdvancementTimer(int ability, int begin, int end); + void SendAlternateAdvancementTimers(); void SetAAPoints(uint32 points) { m_pp.aapoints = points; SendAlternateAdvancementStats(); } void AddAAPoints(uint32 points) { m_pp.aapoints += points; SendAlternateAdvancementStats(); } @@ -782,11 +785,8 @@ public: inline uint32 GetMaxAAXP(void) const { return max_AAXP; } inline uint32 GetAAXP() const { return m_pp.expAA; } void SendAATable(); - void SendAATimers(); - int GetAATimerID(aaID activate); int CalcAAReuseTimer(const AA_DBAction *caa); void ActivateAA(aaID activate); - void SendAATimer(uint32 ability, uint32 begin, uint32 end); void EnableAAEffect(aaEffectType type, uint32 duration = 0); void DisableAAEffect(aaEffectType type); bool CheckAAEffect(aaEffectType type); diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 2068a815c..b76c11d8c 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -1082,7 +1082,7 @@ void Client::Handle_Connect_OP_ReqNewZone(const EQApplicationPacket *app) void Client::Handle_Connect_OP_SendAAStats(const EQApplicationPacket *app) { - SendAATimers(); + SendAlternateAdvancementTimers(); EQApplicationPacket* outapp = new EQApplicationPacket(OP_SendAAStats, 0); QueuePacket(outapp); safe_delete(outapp); @@ -1749,7 +1749,7 @@ void Client::Handle_OP_AAAction(const EQApplicationPacket *app) if (action->action == aaActionActivate) {//AA Hotkey Log.Out(Logs::Detail, Logs::AA, "Activating AA %d", action->ability); - //ActivateAlternateAdvancementAbility(action->ability); + ActivateAlternateAdvancementAbility(action->ability, action->target_id); } else if (action->action == aaActionBuy) { PurchaseAlternateAdvancementRank(action->ability); @@ -1773,7 +1773,7 @@ void Client::Handle_OP_AAAction(const EQApplicationPacket *app) SendAlternateAdvancementTable(); } else { - Log.Out(Logs::General, Logs::AA, "Unknown AA action : %u %u 0x%x %d", action->action, action->ability, action->unknown08, action->exp_value); + Log.Out(Logs::General, Logs::AA, "Unknown AA action : %u %u %u %d", action->action, action->ability, action->target_id, action->exp_value); } } @@ -3847,8 +3847,6 @@ void Client::Handle_OP_CastSpell(const EQApplicationPacket *app) return; } - m_TargetRing = glm::vec3(castspell->x_pos, castspell->y_pos, castspell->z_pos); - CastSpell(spell_to_cast, castspell->target_id, castspell->slot); } /* Spell Slot or Potion Belt Slot */ diff --git a/zone/mob.h b/zone/mob.h index db3879257..08c6cd482 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -962,6 +962,7 @@ public: void ClearAAs() { aa_ranks.clear(); } bool CanUseAlternateAdvancementRank(AA::Rank *rank); bool CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price); + int GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in); protected: void CommonDamage(Mob* other, int32 &damage, const uint16 spell_id, const SkillUseTypes attack_skill, bool &avoidable, const int8 buffslot, const bool iBuffTic); diff --git a/zone/spells.cpp b/zone/spells.cpp index 868180dff..4ef1337a7 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -817,8 +817,8 @@ void Mob::InterruptSpell(uint16 message, uint16 color, uint16 spellid) } if(casting_spell_type == 1 && IsClient()) { //Rest AA Timer on failed cast - CastToClient()->SendAATimer(casting_spell_timer - pTimerAAStart, 0, 0xFFFFFF); - CastToClient()->Message_StringID(15,ABILITY_FAILED); + CastToClient()->SendAlternateAdvancementTimer(casting_spell_timer - pTimerAAStart, 0, -1); + CastToClient()->Message_StringID(15, ABILITY_FAILED); CastToClient()->GetPTimers().Clear(&database, casting_spell_timer); } @@ -2276,6 +2276,7 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, uint16 slot, uint16 { if(spell_id == casting_spell_id && casting_spell_timer != 0xFFFFFFFF) { + //aa new todo: aa expendable charges here CastToClient()->GetPTimers().Start(casting_spell_timer, casting_spell_timer_duration); Log.Out(Logs::Detail, Logs::Spells, "Spell %d: Setting custom reuse timer %d to %d", spell_id, casting_spell_timer, casting_spell_timer_duration); } From afaa9ee6c995dbad567477dac038816fd8fe4fae Mon Sep 17 00:00:00 2001 From: KimLS Date: Thu, 11 Jun 2015 23:08:17 -0700 Subject: [PATCH 13/90] Expendable aa work --- zone/aa.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++----- zone/bot.cpp | 9 ++++---- zone/bot.h | 5 +++-- zone/mob.cpp | 1 + zone/mob.h | 8 +++++-- zone/spells.cpp | 15 +++++++++---- 6 files changed, 77 insertions(+), 17 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index 368eda225..20009d281 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1276,7 +1276,8 @@ Mob *AA_SwarmPetInfo::GetOwner() //New AA void Client::SendAlternateAdvancementTable() { for(auto &aa : zone->aa_abilities) { - auto ranks = GetAA(aa.second->first_rank_id); + uint32 charges = 0; + auto ranks = GetAA(aa.second->first_rank_id, &charges); if(ranks) { if(aa.second->GetMaxLevel() == ranks) { SendAlternateAdvancementRank(aa.first, ranks); @@ -1446,7 +1447,12 @@ void Client::PurchaseAlternateAdvancementRank(int rank_id) { } if(rank->base_ability->charges > 0) { - SetAA(rank_id, rank->current_value, rank->base_ability->charges); + uint32 charges = 0; + GetAA(rank_id, &charges); + + if(charges == 0) { + SetAA(rank_id, rank->current_value, rank->base_ability->charges); + } } else { SetAA(rank_id, rank->current_value, 0); @@ -1570,11 +1576,21 @@ void Client::ActivateAlternateAdvancementAbility(int rank_id, int target_id) { return; } - //make sure it's activateable type - if(!(ability->type == 3 || ability->type == 4)) { + //make sure it is not a passive + if(rank->effects.size() > 0) { return; } + //if expendable make sure we have charges + if(ability->charges > 0) { + uint32 charges = 0; + GetAA(rank_id, &charges); + + if(charges < 0) { + return; + } + } + //check cooldown if(!p_timers.Expired(&database, rank->spell_type + pTimerAAStart)) { uint32 aaremain = p_timers.GetRemainingTime(rank->spell_type + pTimerAAStart); @@ -1609,8 +1625,9 @@ void Client::ActivateAlternateAdvancementAbility(int rank_id, int target_id) { p_timers.Clear(&database, rank->spell_type + pTimerAAStart); return; } + ExpendAlternateAdvancementCharge(ability->id); } else { - if(!CastSpell(rank->spell, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, rank->spell_type + pTimerAAStart, cooldown, 1)) { + if(!CastSpell(rank->spell, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, rank->spell_type + pTimerAAStart, cooldown, 1, nullptr, ability->id)) { //Reset on failed cast SendAlternateAdvancementTimer(rank->spell_type, 0, -1); Message_StringID(15, ABILITY_FAILED); @@ -1655,6 +1672,35 @@ int Mob::GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in) { return 0; } +void Mob::ExpendAlternateAdvancementCharge(uint32 aa_id) { + for(auto &iter : aa_ranks) { + AA::Ability *ability = zone->GetAlternateAdvancementAbility(iter.first); + if(ability && aa_id == ability->id) { + if(iter.second.second > 0) { + iter.second.second -= 1; + + if(iter.second.second == 0) { + aa_ranks.erase(iter.first); + if(IsClient()) { + AA::Rank *r = ability->GetRankByPointsSpent(iter.second.first); + if(r) { + CastToClient()->GetEPP().expended_aa += r->cost; + } + } + } + + if(IsClient()) { + Client *c = CastToClient(); + c->SaveAA(); + c->SendAlternateAdvancementPoints(); + } + } + + return; + } + } +} + bool ZoneDatabase::LoadAlternateAdvancement(Client *c) { c->ClearAAs(); std::string query = StringFormat( diff --git a/zone/bot.cpp b/zone/bot.cpp index c6c0f6e7f..1d8c16f57 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -9078,7 +9078,8 @@ void Bot::DoBuffTic(const Buffs_Struct &buff, int slot, Mob* caster) { Mob::DoBuffTic(buff, slot, caster); } -bool Bot::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot, int16 *resist_adjust) { +bool Bot::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_time, int32 mana_cost, + uint32* oSpellWillFinish, uint32 item_slot, int16 *resist_adjust, uint32 aa_id) { bool Result = false; if(zone && !zone->IsSpellBlocked(spell_id, glm::vec3(GetPosition()))) { @@ -9143,7 +9144,7 @@ bool Bot::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_t bardsong_timer.Disable(); } - Result = DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot); + Result = DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, aa_id); } return Result; @@ -9305,7 +9306,7 @@ bool Bot::DetermineSpellTargets(uint16 spell_id, Mob *&spell_target, Mob *&ae_ce return Result; } -bool Bot::DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot) { +bool Bot::DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot, uint32 aa_id) { bool Result = false; if(GetClass() == BARD) { @@ -9313,7 +9314,7 @@ bool Bot::DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast cast_time = 0; } - Result = Mob::DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot); + Result = Mob::DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, aa_id); if(oSpellWillFinish) { const SPDat_Spell_Struct &spell = spells[spell_id]; diff --git a/zone/bot.h b/zone/bot.h index 1f1262ffc..4a88c5f18 100644 --- a/zone/bot.h +++ b/zone/bot.h @@ -314,11 +314,12 @@ public: virtual float GetAOERange(uint16 spell_id); virtual bool SpellEffect(Mob* caster, uint16 spell_id, float partial = 100); virtual void DoBuffTic(const Buffs_Struct &buff, int slot, Mob* caster = nullptr); - virtual bool CastSpell(uint16 spell_id, uint16 target_id, uint16 slot = USE_ITEM_SPELL_SLOT, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF, int16 *resist_adjust = nullptr); + virtual bool CastSpell(uint16 spell_id, uint16 target_id, uint16 slot = USE_ITEM_SPELL_SLOT, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, + uint32 item_slot = 0xFFFFFFFF, int16 *resist_adjust = nullptr, uint32 aa_id = 0); virtual bool SpellOnTarget(uint16 spell_id, Mob* spelltar); virtual bool IsImmuneToSpell(uint16 spell_id, Mob *caster); virtual bool DetermineSpellTargets(uint16 spell_id, Mob *&spell_target, Mob *&ae_center, CastAction_type &CastAction); - virtual bool DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot = USE_ITEM_SPELL_SLOT, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF); + virtual bool DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot = USE_ITEM_SPELL_SLOT, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF, uint32 aa_id = 0); // Bot Action Command Methods bool MesmerizeTarget(Mob* target); diff --git a/zone/mob.cpp b/zone/mob.cpp index b107565bc..645b42325 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -309,6 +309,7 @@ Mob::Mob(const char* in_name, casting_spell_timer_duration = 0; casting_spell_type = 0; casting_spell_inventory_slot = 0; + casting_spell_aa_id = 0; target = 0; ActiveProjectileATK = false; diff --git a/zone/mob.h b/zone/mob.h index 08c6cd482..ed5d68c2c 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -222,10 +222,12 @@ public: virtual void SpellProcess(); virtual bool CastSpell(uint16 spell_id, uint16 target_id, uint16 slot = USE_ITEM_SPELL_SLOT, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF, - uint32 timer = 0xFFFFFFFF, uint32 timer_duration = 0, uint32 type = 0, int16 *resist_adjust = nullptr); + uint32 timer = 0xFFFFFFFF, uint32 timer_duration = 0, uint32 type = 0, int16 *resist_adjust = nullptr, + uint32 aa_id = 0); virtual bool DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot = 10, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF, - uint32 timer = 0xFFFFFFFF, uint32 timer_duration = 0, uint32 type = 0, int16 resist_adjust = 0); + uint32 timer = 0xFFFFFFFF, uint32 timer_duration = 0, uint32 type = 0, int16 resist_adjust = 0, + uint32 aa_id = 0); void CastedSpellFinished(uint16 spell_id, uint32 target_id, uint16 slot, uint16 mana_used, uint32 inventory_slot = 0xFFFFFFFF, int16 resist_adjust = 0); bool SpellFinished(uint16 spell_id, Mob *target, uint16 slot = 10, uint16 mana_used = 0, @@ -963,6 +965,7 @@ public: bool CanUseAlternateAdvancementRank(AA::Rank *rank); bool CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price); int GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in); + void ExpendAlternateAdvancementCharge(uint32 aa_id); protected: void CommonDamage(Mob* other, int32 &damage, const uint16 spell_id, const SkillUseTypes attack_skill, bool &avoidable, const int8 buffslot, const bool iBuffTic); @@ -1152,6 +1155,7 @@ protected: uint32 casting_spell_timer_duration; uint32 casting_spell_type; int16 casting_spell_resist_adjust; + uint32 casting_spell_aa_id; bool casting_spell_checks; uint16 bardsong; uint8 bardsong_slot; diff --git a/zone/spells.cpp b/zone/spells.cpp index 4ef1337a7..ea4d1068b 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -146,7 +146,8 @@ void NPC::SpellProcess() // to allow procs to work bool Mob::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot, - uint32 timer, uint32 timer_duration, uint32 type, int16 *resist_adjust) + uint32 timer, uint32 timer_duration, uint32 type, int16 *resist_adjust, + uint32 aa_id) { Log.Out(Logs::Detail, Logs::Spells, "CastSpell called for spell %s (%d) on entity %d, slot %d, time %d, mana %d, from item slot %d", (IsValidSpell(spell_id))?spells[spell_id].name:"UNKNOWN SPELL", spell_id, target_id, slot, cast_time, mana_cost, (item_slot==0xFFFFFFFF)?999:item_slot); @@ -318,11 +319,11 @@ bool Mob::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot, if(resist_adjust) { - return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, type, *resist_adjust)); + return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, type, *resist_adjust, aa_id)); } else { - return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, type, spells[spell_id].ResistDiff)); + return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, type, spells[spell_id].ResistDiff, aa_id)); } } @@ -337,7 +338,7 @@ bool Mob::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot, bool Mob::DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot, uint32 timer, uint32 timer_duration, uint32 type, - int16 resist_adjust) + int16 resist_adjust, uint32 aa_id) { Mob* pMob = nullptr; int32 orgcasttime; @@ -361,6 +362,7 @@ bool Mob::DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot, casting_spell_timer = timer; casting_spell_timer_duration = timer_duration; } + casting_spell_aa_id = aa_id; casting_spell_type = type; SaveSpellLoc(); @@ -786,6 +788,7 @@ void Mob::ZeroCastingVars() casting_spell_type = 0; casting_spell_resist_adjust = 0; casting_spell_checks = false; + casting_spell_aa_id = 0; delaytimer = false; } @@ -2297,6 +2300,10 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, uint16 slot, uint16 Log.Out(Logs::Detail, Logs::Spells, "Spell %d: Setting long reuse timer to %d s (orig %d)", spell_id, recast, spells[spell_id].recast_time); CastToClient()->GetPTimers().Start(pTimerSpellStart + spell_id, recast); } + + if(casting_spell_aa_id) { + ExpendAlternateAdvancementCharge(casting_spell_aa_id); + } } if(IsClient() && ((slot == USE_ITEM_SPELL_SLOT) || (slot == POTION_BELT_SPELL_SLOT) || (slot == TARGET_RING_SPELL_SLOT))) From e5d1e98793dce69f38945452883d7f9a1a3bb44d Mon Sep 17 00:00:00 2001 From: KimLS Date: Fri, 12 Jun 2015 02:56:51 -0700 Subject: [PATCH 14/90] Added deity and race checking to AAs, doubled over the sanity check code and found a mistake, added code to make boats move smoother after loading into oot 50 times and seeing it skip every time. --- zone/aa.cpp | 92 ++++++++++++++++++++++++++------------------- zone/aa_ability.cpp | 14 ++++--- zone/aa_ability.h | 7 +++- zone/mob.cpp | 4 ++ zone/waypoints.cpp | 4 +- 5 files changed, 72 insertions(+), 49 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index 20009d281..fc1923506 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -23,7 +23,7 @@ Copyright (C) 2001-2004 EQEMu Development Team (http://eqemulator.net) #include "../common/races.h" #include "../common/spdat.h" #include "../common/string_util.h" - +#include "../common/deity.h" #include "aa.h" #include "client.h" #include "corpse.h" @@ -1279,7 +1279,7 @@ void Client::SendAlternateAdvancementTable() { uint32 charges = 0; auto ranks = GetAA(aa.second->first_rank_id, &charges); if(ranks) { - if(aa.second->GetMaxLevel() == ranks) { + if(aa.second->GetMaxLevel(this) == ranks) { SendAlternateAdvancementRank(aa.first, ranks); } else { SendAlternateAdvancementRank(aa.first, ranks); @@ -1330,7 +1330,7 @@ void Client::SendAlternateAdvancementRank(int aa_id, int level) { aai->classes = ability->classes; aai->level_req = rank->level_req; aai->current_level = level; - aai->max_level = ability->GetMaxLevel(); + aai->max_level = ability->GetMaxLevel(this); aai->prev_id = rank->prev_id; if(rank->next && !CanUseAlternateAdvancementRank(rank->next)) { @@ -1450,9 +1450,11 @@ void Client::PurchaseAlternateAdvancementRank(int rank_id) { uint32 charges = 0; GetAA(rank_id, &charges); - if(charges == 0) { - SetAA(rank_id, rank->current_value, rank->base_ability->charges); + if(charges > 0) { + return; } + + SetAA(rank_id, rank->current_value, rank->base_ability->charges); } else { SetAA(rank_id, rank->current_value, 0); @@ -1781,7 +1783,7 @@ bool Mob::SetAA(uint32 rank_id, uint32 new_value, uint32 charges) { return false; } - if(new_value > ability->GetMaxLevel()) { + if(new_value > ability->GetMaxLevel(this)) { return false; } @@ -1817,29 +1819,44 @@ bool Mob::CanUseAlternateAdvancementRank(AA::Rank *rank) { } } - //I might add a races behind the scenes field to take care of this - // Check for racial/Drakkin blood line AAs - if(ability->category == 8) - { - uint32 client_race = GetBaseRace(); - - // Drakkin Bloodlines - if(rank->expansion > 522) - { - if(client_race != 522) - return false; - - int heritage = this->GetDrakkinHeritage() + 523; // 523 = Drakkin Race(522) + Bloodline - - if(heritage != rank->expansion) - return false; - } - else if(client_race != rank->expansion) - { - return false; - } + if(!(RuleI(World, ExpansionSettings) & (1 << rank->expansion))) { + return false; } + auto race = GetArrayRace(GetBaseRace()); + race = race > 16 ? 1 : race; + if(!(ability->races & (1 << (race - 1)))) { + return false; + } + + auto deity = ConvertDeityToBitDeity((DeityTypes)GetDeity()); + if(!(ability->deities & deity)) { + return false; + } + + // Check for racial/Drakkin blood line AAs + //Commented this out for now, will add a drakkin heritage field later + //if(ability->category == 8) + //{ + // uint32 client_race = GetBaseRace(); + // + // // Drakkin Bloodlines + // if(rank->expansion > 522) + // { + // if(client_race != 522) + // return false; + // + // int heritage = this->GetDrakkinHeritage() + 523; // 523 = Drakkin Race(522) + Bloodline + // + // if(heritage != rank->expansion) + // return false; + // } + // else if(client_race != rank->expansion) + // { + // return false; + // } + //} + return true; } @@ -1858,10 +1875,6 @@ bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price) return false; } - if(!(RuleI(World, ExpansionSettings) & (1 << rank->expansion))) { - return false; - } - //check level req if(rank->level_req > GetLevel()) { return false; @@ -1940,8 +1953,6 @@ void Zone::LoadAlternateAdvancement() { i++; current = current->next; } - - ability.second->GetMaxLevel(true); } Log.Out(Logs::General, Logs::Status, "Loaded Alternate Advancement Data"); @@ -1952,7 +1963,7 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_mapid = atoi(row[0]); ability->name = row[1]; ability->category = atoi(row[2]); - ability->classes = atoi(row[3]); - ability->type = atoi(row[4]); - ability->charges = atoi(row[5]); - ability->grant_only = atoi(row[6]) != 0 ? true : false; - ability->first_rank_id = atoi(row[7]); + //EQ client has classes left shifted by one bit for some odd reason + ability->classes = atoi(row[3]) << 1; + ability->races = atoi(row[4]); + ability->deities = atoi(row[5]); + ability->type = atoi(row[6]); + ability->charges = atoi(row[7]); + ability->grant_only = atoi(row[8]) != 0 ? true : false; + ability->first_rank_id = atoi(row[9]); ability->first = nullptr; abilities[ability->id] = std::unique_ptr(ability); diff --git a/zone/aa_ability.cpp b/zone/aa_ability.cpp index 8f9cb8da4..3612b00c7 100644 --- a/zone/aa_ability.cpp +++ b/zone/aa_ability.cpp @@ -18,6 +18,7 @@ #include "../common/global_define.h" #include "../common/types.h" +#include "masterentity.h" #include "aa_ability.h" AA::Rank *AA::Ability::GetMaxRank() { @@ -53,16 +54,17 @@ AA::Rank *AA::Ability::GetRankByPointsSpent(int current_level) { return current; } -int AA::Ability::GetMaxLevel(bool force_calc) { - if(!force_calc) - return max_level; - - max_level = 0; +int AA::Ability::GetMaxLevel(Mob *who) { + int max_level = 0; Rank *current = first; while(current) { + if(!who->CanUseAlternateAdvancementRank(current)) { + return max_level; + } + max_level++; current = current->next; } - + return max_level; } \ No newline at end of file diff --git a/zone/aa_ability.h b/zone/aa_ability.h index a31bc06e3..bd2b9e306 100644 --- a/zone/aa_ability.h +++ b/zone/aa_ability.h @@ -27,6 +27,8 @@ #include "aa_rank_prereqs.h" #include "aa_rank.h" +class Mob; + namespace AA { @@ -39,17 +41,18 @@ public: Rank *GetMaxRank(); Rank *GetRankByLevel(int level); Rank *GetRankByPointsSpent(int current_level); - int GetMaxLevel(bool force_calc = false); + int GetMaxLevel(Mob *who); int id; std::string name; int category; int classes; + int races; + int deities; bool grant_only; int type; int charges; int first_rank_id; - int max_level; Rank *first; }; diff --git a/zone/mob.cpp b/zone/mob.cpp index 645b42325..965007fcf 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -1143,6 +1143,10 @@ void Mob::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) else ns->spawn.flymode = flymode; + if(IsBoat()) { + ns->spawn.flymode = 1; + } + ns->spawn.lastName[0] = '\0'; strn0cpy(ns->spawn.lastName, lastname, sizeof(ns->spawn.lastName)); diff --git a/zone/waypoints.cpp b/zone/waypoints.cpp index 7570165a3..834109dd1 100644 --- a/zone/waypoints.cpp +++ b/zone/waypoints.cpp @@ -212,7 +212,7 @@ void NPC::UpdateWaypoint(int wp_index) Log.Out(Logs::Detail, Logs::AI, "Next waypoint %d: (%.3f, %.3f, %.3f, %.3f)", wp_index, m_CurrentWayPoint.x, m_CurrentWayPoint.y, m_CurrentWayPoint.z, m_CurrentWayPoint.w); //fix up pathing Z - if(zone->HasMap() && RuleB(Map, FixPathingZAtWaypoints)) + if(zone->HasMap() && RuleB(Map, FixPathingZAtWaypoints) && !IsBoat()) { if(!RuleB(Watermap, CheckForWaterAtWaypoints) || !zone->HasWaterMap() || @@ -521,7 +521,7 @@ bool Mob::MakeNewPositionAndSendUpdate(float x, float y, float z, int speed, boo } bool send_update = false; - int compare_steps = IsBoat() ? 1 : 20; + int compare_steps = 20; if(tar_ndx < compare_steps && m_TargetLocation.x==x && m_TargetLocation.y==y) { float new_x = m_Position.x + m_TargetV.x*tar_vector; From 65ac9683a3035691ecdcdfb33cacd3285486a081 Mon Sep 17 00:00:00 2001 From: KimLS Date: Fri, 12 Jun 2015 13:39:20 -0700 Subject: [PATCH 15/90] Removed fluff code, added drakkin heritage and status can use modifiers to aa abilities --- zone/aa.cpp | 468 ++--------------------------------- zone/aa.h | 605 ---------------------------------------------- zone/aa_ability.h | 2 + zone/client.h | 3 - zone/command.cpp | 83 ------- zone/command.h | 2 - 6 files changed, 20 insertions(+), 1143 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index fc1923506..cf2fb0685 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -37,428 +37,6 @@ Copyright (C) 2001-2004 EQEMu Development Team (http://eqemulator.net) extern QueryServ* QServ; -int Client::CalcAAReuseTimer(const AA_DBAction *caa) { - - if(!caa) - return 0; - - int ReuseTime = caa->reuse_time; - - if(ReuseTime > 0) - { - int ReductionPercentage; - - if(caa->redux_aa > 0 && caa->redux_aa < aaHighestID) - { - ReductionPercentage = GetAA(caa->redux_aa) * caa->redux_rate; - - if(caa->redux_aa2 > 0 && caa->redux_aa2 < aaHighestID) - ReductionPercentage += (GetAA(caa->redux_aa2) * caa->redux_rate2); - - ReuseTime = caa->reuse_time * (100 - ReductionPercentage) / 100; - } - - } - return ReuseTime; -} - -void Client::ActivateAA(aaID activate){ -// if(activate < 0 || activate >= aaHighestID) -// return; -// if(IsStunned() || IsFeared() || IsMezzed() || IsSilenced() || IsPet() || IsSitting() || GetFeigned()) -// return; -// -// int AATimerID = GetAATimerID(activate); -// -// SendAA_Struct* aa2 = nullptr; -// aaID aaid = activate; -// uint8 activate_val = GetAA(activate); -// //this wasn't taking into acct multi tiered act talents before... -// if(activate_val == 0){ -// aa2 = zone->FindAA(activate); -// if(!aa2){ -// int i; -// int a; -// for(i=1;iFindAA(a); -// if(aa2 != nullptr) -// break; -// } -// } -// if(aa2){ -// aaid = (aaID) aa2->id; -// activate_val = GetAA(aa2->id); -// } -// } -// -// if (activate_val == 0){ -// return; -// } -// -// if(aa2) -// { -// if(aa2->account_time_required) -// { -// if((Timer::GetTimeSeconds() + account_creation) < aa2->account_time_required) -// { -// return; -// } -// } -// } -// -// if(!p_timers.Expired(&database, AATimerID + pTimerAAStart)) -// { -// uint32 aaremain = p_timers.GetRemainingTime(AATimerID + pTimerAAStart); -// uint32 aaremain_hr = aaremain / (60 * 60); -// uint32 aaremain_min = (aaremain / 60) % 60; -// uint32 aaremain_sec = aaremain % 60; -// -// if(aa2) { -// if (aaremain_hr >= 1) //1 hour or more -// Message(13, "You can use the ability %s again in %u hour(s) %u minute(s) %u seconds", -// aa2->name, aaremain_hr, aaremain_min, aaremain_sec); -// else //less than an hour -// Message(13, "You can use the ability %s again in %u minute(s) %u seconds", -// aa2->name, aaremain_min, aaremain_sec); -// } else { -// if (aaremain_hr >= 1) //1 hour or more -// Message(13, "You can use this ability again in %u hour(s) %u minute(s) %u seconds", -// aaremain_hr, aaremain_min, aaremain_sec); -// else //less than an hour -// Message(13, "You can use this ability again in %u minute(s) %u seconds", -// aaremain_min, aaremain_sec); -// } -// return; -// } -// -// if(activate_val > MAX_AA_ACTION_RANKS) -// activate_val = MAX_AA_ACTION_RANKS; -// activate_val--; //to get array index. -// -// //get our current node, now that the indices are well bounded -// const AA_DBAction *caa = &AA_Actions[aaid][activate_val]; -// -// if((aaid == aaImprovedHarmTouch || aaid == aaLeechTouch) && !p_timers.Expired(&database, pTimerHarmTouch)){ -// Message(13,"Ability recovery time not yet met."); -// return; -// } -// -// //everything should be configured out now -// -// uint16 target_id = 0; -// -// //figure out our target -// switch(caa->target) { -// case aaTargetUser: -// case aaTargetGroup: -// target_id = GetID(); -// break; -// case aaTargetCurrent: -// case aaTargetCurrentGroup: -// if(GetTarget() == nullptr) { -// Message_StringID(MT_DefaultText, AA_NO_TARGET); //You must first select a target for this ability! -// p_timers.Clear(&database, AATimerID + pTimerAAStart); -// return; -// } -// target_id = GetTarget()->GetID(); -// break; -// case aaTargetPet: -// if(GetPet() == nullptr) { -// Message(0, "A pet is required for this skill."); -// return; -// } -// target_id = GetPetID(); -// break; -// } -// -// //handle non-spell action -// if(caa->action != aaActionNone) { -// if(caa->mana_cost > 0) { -// if(GetMana() < caa->mana_cost) { -// Message_StringID(13, INSUFFICIENT_MANA); -// return; -// } -// SetMana(GetMana() - caa->mana_cost); -// } -// if(caa->reuse_time > 0) -// { -// uint32 timer_base = CalcAAReuseTimer(caa); -// if(activate == aaImprovedHarmTouch || activate == aaLeechTouch) -// { -// p_timers.Start(pTimerHarmTouch, HarmTouchReuseTime); -// } -// p_timers.Start(AATimerID + pTimerAAStart, timer_base); -// SendAATimer(AATimerID, 0, 0); -// } -// HandleAAAction(aaid); -// } -// -// //cast the spell, if we have one -// if(caa->spell_id > 0 && caa->spell_id < SPDAT_RECORDS) { -// -// if(caa->reuse_time > 0) -// { -// uint32 timer_base = CalcAAReuseTimer(caa); -// SendAATimer(AATimerID, 0, 0); -// p_timers.Start(AATimerID + pTimerAAStart, timer_base); -// if(activate == aaImprovedHarmTouch || activate == aaLeechTouch) -// { -// p_timers.Start(pTimerHarmTouch, HarmTouchReuseTime); -// } -// // Bards can cast instant cast AAs while they are casting another song -// if (spells[caa->spell_id].cast_time == 0 && GetClass() == BARD && IsBardSong(casting_spell_id)) { -// if(!SpellFinished(caa->spell_id, entity_list.GetMob(target_id), 10, -1, -1, spells[caa->spell_id].ResistDiff, false)) { -// //Reset on failed cast -// SendAATimer(AATimerID, 0, 0xFFFFFF); -// Message_StringID(15,ABILITY_FAILED); -// p_timers.Clear(&database, AATimerID + pTimerAAStart); -// return; -// } -// } else { -// if (!CastSpell(caa->spell_id, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, AATimerID + pTimerAAStart, timer_base, 1)) { -// //Reset on failed cast -// SendAATimer(AATimerID, 0, 0xFFFFFF); -// Message_StringID(15,ABILITY_FAILED); -// p_timers.Clear(&database, AATimerID + pTimerAAStart); -// return; -// } -// } -// } -// else -// { -// if(!CastSpell(caa->spell_id, target_id)) -// return; -// } -// } -// // Check if AA is expendable -// if (aas_send[activate - activate_val]->special_category == 7) { -// -// // Add the AA cost to the extended profile to track overall total -// m_epp.expended_aa += aas_send[activate]->cost; -// -// SetAA(activate, 0); -// -// SaveAA(); /* Save Character AA */ -// SendAA(activate); -// SendAATable(); -// } -} - -void Client::HandleAAAction(aaID activate) { -// if(activate < 0 || activate >= aaHighestID) -// return; -// -// uint8 activate_val = GetAA(activate); -// -// if (activate_val == 0) -// return; -// -// if(activate_val > MAX_AA_ACTION_RANKS) -// activate_val = MAX_AA_ACTION_RANKS; -// activate_val--; //to get array index. -// -// //get our current node, now that the indices are well bounded -// const AA_DBAction *caa = &AA_Actions[activate][activate_val]; -// -// uint16 timer_id = 0; -// uint16 timer_duration = caa->duration; -// aaTargetType target = aaTargetUser; -// -// uint16 spell_id = SPELL_UNKNOWN; //gets cast at the end if not still unknown -// -// switch(caa->action) { -// case aaActionAETaunt: -// entity_list.AETaunt(this); -// break; -// -// case aaActionFlamingArrows: -// //toggle it -// if(CheckAAEffect(aaEffectFlamingArrows)) -// EnableAAEffect(aaEffectFlamingArrows); -// else -// DisableAAEffect(aaEffectFlamingArrows); -// break; -// -// case aaActionFrostArrows: -// if(CheckAAEffect(aaEffectFrostArrows)) -// EnableAAEffect(aaEffectFrostArrows); -// else -// DisableAAEffect(aaEffectFrostArrows); -// break; -// -// case aaActionRampage: -// EnableAAEffect(aaEffectRampage, 10); -// break; -// -// case aaActionSharedHealth: -// if(CheckAAEffect(aaEffectSharedHealth)) -// EnableAAEffect(aaEffectSharedHealth); -// else -// DisableAAEffect(aaEffectSharedHealth); -// break; -// -// case aaActionCelestialRegen: { -// //special because spell_id depends on a different AA -// switch (GetAA(aaCelestialRenewal)) { -// case 1: -// spell_id = 3250; -// break; -// case 2: -// spell_id = 3251; -// break; -// default: -// spell_id = 2740; -// break; -// } -// target = aaTargetCurrent; -// break; -// } -// -// case aaActionDireCharm: { -// //special because spell_id depends on class -// switch (GetClass()) -// { -// case DRUID: -// spell_id = 2760; //2644? -// break; -// case NECROMANCER: -// spell_id = 2759; //2643? -// break; -// case ENCHANTER: -// spell_id = 2761; //2642? -// break; -// } -// target = aaTargetCurrent; -// break; -// } -// -// case aaActionImprovedFamiliar: { -// //Spell IDs might be wrong... -// if (GetAA(aaAllegiantFamiliar)) -// spell_id = 3264; //1994? -// else -// spell_id = 2758; //2155? -// break; -// } -// -// case aaActionActOfValor: -// if(GetTarget() != nullptr) { -// int curhp = GetTarget()->GetHP(); -// target = aaTargetCurrent; -// GetTarget()->HealDamage(curhp, this); -// Death(this, 0, SPELL_UNKNOWN, SkillHandtoHand); -// } -// break; -// -// case aaActionSuspendedMinion: -// if (GetPet()) { -// target = aaTargetPet; -// switch (GetAA(aaSuspendedMinion)) { -// case 1: -// spell_id = 3248; -// break; -// case 2: -// spell_id = 3249; -// break; -// } -// //do we really need to cast a spell? -// -// Message(0,"You call your pet to your side."); -// GetPet()->WipeHateList(); -// GetPet()->GMMove(GetX(),GetY(),GetZ()); -// if (activate_val > 1) -// entity_list.ClearFeignAggro(GetPet()); -// } else { -// Message(0,"You have no pet to call."); -// } -// break; -// -// case aaActionEscape: -// Escape(); -// break; -// -// // Don't think this code is used any longer for Bestial Alignment as the aa.has a spell_id and no nonspell_action. -// case aaActionBeastialAlignment: -// switch(GetBaseRace()) { -// case BARBARIAN: -// spell_id = AA_Choose3(activate_val, 4521, 4522, 4523); -// break; -// case TROLL: -// spell_id = AA_Choose3(activate_val, 4524, 4525, 4526); -// break; -// case OGRE: -// spell_id = AA_Choose3(activate_val, 4527, 4527, 4529); -// break; -// case IKSAR: -// spell_id = AA_Choose3(activate_val, 4530, 4531, 4532); -// break; -// case VAHSHIR: -// spell_id = AA_Choose3(activate_val, 4533, 4534, 4535); -// break; -// } -// -// case aaActionLeechTouch: -// target = aaTargetCurrent; -// spell_id = SPELL_HARM_TOUCH2; -// EnableAAEffect(aaEffectLeechTouch, 1000); -// break; -// -// case aaActionFadingMemories: -// // Do nothing since spell effect works correctly, but mana isn't used. -// break; -// -// default: -// Log.Out(Logs::General, Logs::Error, "Unknown AA nonspell action type %d", caa->action); -// return; -// } -// -// -// uint16 target_id = 0; -// //figure out our target -// switch(target) { -// case aaTargetUser: -// case aaTargetGroup: -// target_id = GetID(); -// break; -// case aaTargetCurrent: -// case aaTargetCurrentGroup: -// if(GetTarget() == nullptr) { -// Message_StringID(MT_DefaultText, AA_NO_TARGET); //You must first select a target for this ability! -// p_timers.Clear(&database, timer_id + pTimerAAEffectStart); -// return; -// } -// target_id = GetTarget()->GetID(); -// break; -// case aaTargetPet: -// if(GetPet() == nullptr) { -// Message(0, "A pet is required for this skill."); -// return; -// } -// target_id = GetPetID(); -// break; -// } -// -// //cast the spell, if we have one -// if(IsValidSpell(spell_id)) { -// int aatid = GetAATimerID(activate); -// if (!CastSpell(spell_id, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, pTimerAAStart + aatid, CalcAAReuseTimer(caa), 1)) { -// SendAATimer(aatid, 0, 0xFFFFFF); -// Message_StringID(15,ABILITY_FAILED); -// p_timers.Clear(&database, pTimerAAStart + aatid); -// return; -// } -// } -// -// //handle the duration timer if we have one. -// if(timer_id > 0 && timer_duration > 0) { -// p_timers.Start(pTimerAAEffectStart + timer_id, timer_duration); -// } -} - void Mob::TemporaryPets(uint16 spell_id, Mob *targ, const char *name_override, uint32 duration_override, bool followme, bool sticktarg) { //It might not be a bad idea to put these into the database, eventually.. @@ -1333,7 +911,7 @@ void Client::SendAlternateAdvancementRank(int aa_id, int level) { aai->max_level = ability->GetMaxLevel(this); aai->prev_id = rank->prev_id; - if(rank->next && !CanUseAlternateAdvancementRank(rank->next)) { + if(rank->next && !CanUseAlternateAdvancementRank(rank->next) || ability->charges > 0) { aai->next_id = -1; } else { aai->next_id = rank->next_id; @@ -1834,28 +1412,16 @@ bool Mob::CanUseAlternateAdvancementRank(AA::Rank *rank) { return false; } - // Check for racial/Drakkin blood line AAs - //Commented this out for now, will add a drakkin heritage field later - //if(ability->category == 8) - //{ - // uint32 client_race = GetBaseRace(); - // - // // Drakkin Bloodlines - // if(rank->expansion > 522) - // { - // if(client_race != 522) - // return false; - // - // int heritage = this->GetDrakkinHeritage() + 523; // 523 = Drakkin Race(522) + Bloodline - // - // if(heritage != rank->expansion) - // return false; - // } - // else if(client_race != rank->expansion) - // { - // return false; - // } - //} + if(IsClient() && CastToClient()->Admin() < ability->status) { + return false; + } + + if(GetBaseRace() == 522) { + //drakkin_heritage + if(!(ability->drakkin_heritage & (1 << GetDrakkinHeritage()))) { + return false; + } + } return true; } @@ -1963,7 +1529,7 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_mapclasses = atoi(row[3]) << 1; ability->races = atoi(row[4]); ability->deities = atoi(row[5]); - ability->type = atoi(row[6]); - ability->charges = atoi(row[7]); - ability->grant_only = atoi(row[8]) != 0 ? true : false; - ability->first_rank_id = atoi(row[9]); + ability->drakkin_heritage = atoi(row[6]); + ability->status = atoi(row[7]); + ability->type = atoi(row[8]); + ability->charges = atoi(row[9]); + ability->grant_only = atoi(row[10]) != 0 ? true : false; + ability->first_rank_id = atoi(row[11]); ability->first = nullptr; abilities[ability->id] = std::unique_ptr(ability); diff --git a/zone/aa.h b/zone/aa.h index 54d495e6e..0ee32c99a 100644 --- a/zone/aa.h +++ b/zone/aa.h @@ -1,27 +1,8 @@ - #ifndef AA_H #define AA_H -struct AA_Ability; -struct SendAA_Struct; - - -#define MANA_BURN 664 - -#include - #define MAX_SWARM_PETS 12 //this can change as long as you make more coords (swarm_pet_x/swarm_pet_y) -//this might be missing some, and some might not be used... -typedef enum { //AA Targeting Constants - aaTargetUser = 1, - aaTargetCurrent = 2, //use current target - aaTargetGroup = 3, //target group of user - aaTargetCurrentGroup = 4, //target group of current target - aaTargetPet = 5 //target the user's pet -} aaTargetType; - - typedef enum { aaActionNone = 0, aaActionAETaunt = 1, @@ -133,571 +114,6 @@ static const uint8 LeadershipAACosts[_maxLeaderAA][MAX_LEADERSHIP_TIERS] = { { 0, 0, 0, 0, 0, 0 }, //raidAA15 }; -/* -typedef enum { //AA IDs - aaNone = 0, - aaInnateStrength = 2, //works - aaInnateStamina = 7, //works - aaInnateAgility = 12, //works - //aaCompleteHeal = 13,/ //not implemented, but is in dbstr_us.txt - aaInnateDexterity = 17, //works - aaInnateIntelligence = 22, //works - aaInnateWisdom = 27, //works - aaInnateCharisma = 32, //works - aaInnateFireProtection = 37, //works - aaInnateColdProtection = 42, //works - aaInnateMagicProtection = 47, //works - aaInnatePoisonProtection = 52, //works - aaInnateDiseaseProtection = 57, //works - aaInnateRunSpeed = 62, //works - aaInnateRegeneration = 65, //works - aaInnateMetabolism = 68, - aaInnateLungCapacity = 71, //handled by client - aaFirstAid = 74, //untested - aaHealingAdept = 77, //untested - aaHealingGift = 80, //untested - aaSpellCastingMastery = 83, //untested - aaSpellCastingReinforcement = 86, //untested - aaMentalClarity = 89, - aaSpellCastingFury = 92, //untested - aaChanellingFocus = 95, - aaSpellCastingSubtlety = 98, //untested - aaSpellCastingExpertise = 101, //untested - aaSpellCastingDeftness = 104, //untested - aaNaturalDurability = 107, //works - aaNaturalHealing = 110, //untested - aaCombatFury = 113, //untested - aaFearResistance = 116, //untested - aaFinishingBlow = 119, //untested - aaCombatStability = 122, - aaCombatAgility = 125, - aaMassGroupBuff = 128, //untested - aaDivineResurrection = 129, //DB - aaInnateInvisToUndead = 130, //DB - aaCelestialRegeneration = 131, //untested - aaBestowDivineAura = 132, //DB - aaTurnUndead = 133, //DB - aaPurifySoul = 136, //DB - aaQuickEvacuation = 137, //untested - aaExodus = 140, //untested - aaQuickDamage = 141, //untested - aaEnhancedRoot = 144, - aaDireCharm = 145, //untested - aaCannibalization = 146, //DB - aaQuickBuff = 147, //untested - aaAlchemyMastery = 150, - aaRabidBear = 153, //DB - aaManaBurn = 154, //DB - aaImprovedFamiliar = 155, //untested, implemented? - aaNexusGate = 156, //DB - aaUnknown54 = 157, - aaPermanentIllusion = 158, - aaJewelCraftMastery = 159, - aaGatherMana = 162, //DB - aaMendCompanion = 163, //DB - aaQuickSummoning = 164, //untested - aaFrenziedBurnout = 167, //DB - aaElementalFormFire = 168, //DB - aaElementalFormWater = 171, //DB - aaElementalFormEarth = 174, //DB - aaElementalFormAir = 177, //DB - aaImprovedReclaimEnergy = 180, //untested - aaTurnSummoned = 181, //DB - aaElementalPact = 182, //DB - aaLifeBurn = 183, //DB - aaDeadMesmerization = 184, //DB - aaFearstorm = 185, //DB - aaFleshToBone = 186, //DB - aaCallToCorpse = 187, //DB - aaDivineStun = 188, //DB - aaImprovedLayOnHands = 189, - aaSlayUndead = 190, - aaActOfValor = 193, //DB - aaHolySteed = 194, //DB - aaFearless = 195, - aa2HandBash = 196, //works. handled by client? - aaInnateCamouflage = 197, //DB - aaAmbidexterity = 198, //untested - aaArcheryMastery = 199, //untested - aaFletchingMastery = 202, //removed from db? - aaEndlessQuiver = 205, //untested - aaUnholySteed = 206, //DB - aaImprovedHarmTouch = 207, //untested - aaLeechTouch = 208, //DB - aaDeathPeace = 209, - aaSoulAbrasion = 210, //untested - aaInstrumentMastery = 213, //untested - aaUnknown91 = 216, //not used - aaUnknown92 = 219, //not used - aaUnknown93 = 222, //not used - aaJamFest = 225, - aaUnknown95 = 228, - aaSonicCall = 229, - aaCriticalMend = 230, //untested - aaPurifyBody = 233, //DB - aaChainCombo = 234, - aaRapidFeign = 237, //works - aaReturnKick = 240, - aaEscape = 243, //DB - aaPoisonMastery = 244, - aaDoubleRiposte = 247, //untested - aaQuickHide = 250, - aaQuickThrow = 253, //corrected from dbstr_us.txt - aaPurgePoison = 254, //DB - aaFlurry = 255, //untested - aaRampage = 258, //untested - aaAreaTaunt = 259, //untested - aaWarcry = 260, //DB - aaBandageWound = 263, //untested - aaSpellCastingReinforcementMastery = 266, //untested - aaSpellCastingFuryMastery = 267, //untested - aaExtendedNotes = 270, //untested - aaDragonPunch = 273, - aaStrongRoot = 274, //DB - aaSingingMastery = 275, //untested - aaBodyAndMindRejuvenation = 278, //added - aaPhysicalEnhancement = 279, //untested - aaAdvTrapNegotiation = 280, //untested - aaAcrobatics = 283, //untested - aaScribbleNotes = 286, - aaChaoticStab = 287, //untested - aaPetDiscipline = 288, //added - aaHobbleofSpirits = 289, //DB - aaFrenzyofSpirit = 290, //DB - aaParagonofSpirit = 291, //DB - aaAdvancedInnateStrength = 292, //works - aaAdvancedInnateStamina = 302, //works - aaAdvancedInnateAgility = 312, //works - aaAdvancedInnateDexterity = 322, //works - aaAdvancedInnateIntelligence = 332, //works - aaAdvancedInnateWisdom = 342, //works - aaAdvancedInnateCharisma = 352, //works - aaWardingofSolusek = 362, //works - aaBlessingofEci = 372, //works - aaMarrsProtection = 382, //works - aaShroudofTheFaceless = 392, //works - aaBertoxxulousGift = 402, //works - aaNewTanaanCraftingMastery = 412, - aaPlanarPower = 418, //untested - aaPlanarDurability = 423, //added - aaInnateEnlightenment = 426, //added - aaAdvancedSpellCastingMastery = 431,//untested - aaAdvancedHealingAdept = 434, //untested - aaAdvancedHealingGift = 437, //untested - aaCoupdeGrace = 440, //added - aaFuryoftheAges = 443, //added - aaMasteryofthePast = 446, //untested - aaLightningReflexes = 449, //added - aaInnateDefense = 454, //added - aaRadiantCure = 459, //DB - aaHastenedDivinity = 462, //DB - aaHastenedTurning = 465, //DB - aaHastenedPurificationofSoul = 468, //DB - aaHastenedGathering = 471, //DB - aaHastenedRabidity = 474, //DB - aaHastenedExodus = 477, //DB - aaHastenedRoot = 480, //DB - aaHastenedMending = 483, //DB - aaHastenedBanishment = 486, //DB - aaHastenedInstigation = 489, //DB, maybe - aaFuriousRampage = 492, //DB - aaHastenedPurificationoftheBody = 495,//DB - aaHastyExit = 498, //DB - aaHastenedPurification = 501, //DB - aaFlashofSteel = 504, - aaDivineArbitration = 507, //DB - aaWrathoftheWild = 510, //DB - aaVirulentParalysis = 513, //DB - aaHarvestofDruzzil = 516, //DB - aaEldritchRune = 517, //DB - aaServantofRo = 520, //DB - aaWaketheDead = 523, //DB - aaSuspendedMinion = 526, //untested - aaSpiritCall = 528, //DB - aaCelestialRenewal = 531, //DB - aaAllegiantFamiliar = 533, - aaHandofPiety = 534, //DB - aaMithanielsBinding = 537, //untested - aaMendingoftheTranquil = 539, - aaRagingFlurry = 542, - aaGuardianoftheForest = 545, //DB - aaSpiritoftheWood = 548, //DB - aaBestialFrenzy = 551, //untested - aaHarmoniousAttack = 556, //untested - aaKnightsAdvantage = 561, - aaFerocity = 564, - aaViscidRoots = 567, - aaSionachiesCrescendo = 568, //untested - aaAyonaesTutelage = 571, - aaFeignedMinion = 574, - aaUnfailingDivinity = 577, - aaAnimationEmpathy = 580, // Implemented - aaRushtoJudgement = 583, - aaLivingShield = 586, - aaConsumptionoftheSoul = 589, //untested - aaBoastfulBellow = 592, //DB - aaFervrentBlessing = 593, //untested - aaTouchoftheWicked = 596, //untested - aaPunishingBlade = 599, - aaSpeedoftheKnight = 602, - aaShroudofStealth = 605, - aaNimbleEvasion = 606, - aaTechniqueofMasterWu = 611, - aaHostoftheElements = 616, //DB - aaCallofXuzl = 619, //DB - aaHastenedStealth = 622, - aaIngenuity = 625, - aaFleetofFoot = 628, - aaFadingMemories = 630, - aaTacticalMastery = 631, - aaTheftofLife = 634, - aaFuryofMagic = 637, - aaFuryofMagicMastery2 = 640, //whats the difference? - aaProjectIllusion = 643, - aaHeadshot = 644, //added - aaEntrap = 645, //DB - aaUnholyTouch = 646, //untested - aaTotalDomination = 649, // Implemented - aaStalwartEndurance = 652, //implemented as bonus - aaQuickSummoning2 = 655, //whats the difference? - aaMentalClarity2 = 658, //whats the difference? - aaInnateRegeneration2 = 661, //whats the difference? - aaManaBurn2 = 664, //whats the difference? - aaExtendedNotes2 = 665, //not implemented - later expansions replaced Extended Notes with this. - aaSionachiesCrescendo2 = 668, //not implemented - later expansions replaced Sionachies Crescendo with this. - aaImprovedReclaimEnergy2 = 671, //whats the difference? untetsed - aaSwiftJourney = 672, //implemented as bonus - aaConvalescence = 674, //added 9/26/08 - aaLastingBreath = 676, //handled by client - aaPackrat = 678, //added 9/29/08 - aaHeightenedEndurance = 683, - aaWeaponAffinity = 686, //implemented - aaSecondaryForte = 691, - aaPersistantCasting = 692, - aaTuneofPursuance = 695, - aaImprovedInstrumentMastery = 700, - aaImprovedSingingMastery =701, - aaExultantBellowing = 702, - aaEchoofTaelosia = 707, - aaInternalMetronome = 710, //In 2006 this AA was removed. - aaPiousSupplication = 715, - aaBeastialAlignment = 718, //untested - aaWrathofXuzl = 721, - aaFeralSwipe = 723, //DB? - aaWardersFury = 724, - aaWardersAlacrity = 729, - aaPetAffinity = 734, // Implemented - aaMasteryofthePast2 = 735, //whats the difference? - aaSpellCastingSubtlety2 = 738, //whats the difference? - aaTouchoftheDivine = 741, - aaDivineAvatar = 746, //DB - aaExquisiteBenediction = 749, //DB - aaQuickenedCuring = 754, - aaNaturesBoon = 757, //DB - aaAdvancedTracking = 762, - aaCriticalAffliction = 767, - aaFuryofMagicMastery = 770, //whats the difference? - aaDoppelganger = 773, - aaEnchancedForgetfulness = 776, - aaMesmerizationMastery = 781, - aaQuickMassGroupBuff = 782, - aaSharedHealth = 785, - aaElementalFury = 790, - aaElementalAlacrity = 795, - aaElementalAgility = 800, - aaElementalDurability = 803, - aaSinisterStrikes = 806, - aaStrikethrough = 807, - aaStonewall = 810, - aaRapidStrikes = 815, - aaKickMastery = 820, - aaHightenedAwareness = 823, - aaDestructiveForce = 828, //DB - aaSwarmofDecay = 831, //DB - aaDeathsFury = 834, - aaQuickeningofDeath = 839, - aaAdvancedTheftofLife = 844, - aaTripleBackstab = 846, - aaHastenedPiety = 849, - aaImmobilizingBash = 852, - aaViciousSmash = 855, - aaRadiantCure2 = 860, //whats the difference? - aaPurification = 863, - aaPrecisionofthePathfinder = 864, - aaCoatofThistles = 867, - aaFlamingArrows = 872, //untested - aaFrostArrows = 875, //untested - aaSeizedOpportunity = 878, - aaTrapCircumvention = 881, - aaImprovedHastyExit = 886, - aaVirulentVenom = 888, - aaImprovedConsumptionofSoul = 893, - aaIntenseHatred = 895, - aaAdvancedSpiritCall = 900, - aaCalloftheAncients = 902, //DB - aaSturdiness = 907, - aaWarlordsTenacity = 912, //DB - aaStrengthenedStrike = 915, - aaExtendedShielding = 918, - aaRosFlamingFamiliar = 921, //DB - aaEcisIcyFamiliar = 922, //DB - aaDruzzilsMysticalFamiliar = 923, //DB - aaAdvancedFuryofMagicMastery = 924, //added 9/29/08 - aaWardofDestruction = 926, //DB - aaFrenziedDevastation = 931, //DB - aaCombatFury2 = 934, //whats the difference? - aaCombatFury3 = 937, //whats the difference? - aaCombatFury4 = 940, //whats the difference? - aaFuryoftheAges2 = 943, //whats the difference? - aaFuryoftheAges3 = 946, //whats the difference? - aaFuryoftheAges4 = 949, //whats the difference? - aaPlanarDurability2 = 952, //whats the difference? - aaInnateEnlightenment2 = 955, //whats the difference? - aaDireCharm2 = 960, //whats the difference? - aaDireCharm3 = 961, //whats the difference? - aaTouchoftheDivine2 = 962, //whats the difference? - aaTouchofDecay = 967, - aaCalloftheAncients2 = 970, //whats the difference? - aaImprovedVision = 975, - aaEternalBreath = 978, //handled by client - aaBlacksmithingMastery = 979, //added 9/29/08 - aaBakingMastery = 982, //added 9/29/08 - aaBrewingMastery = 985, //added 9/29/08 - aaFletchingMastery2 = 988, //added 9/29/08 - aaPotteryMastery = 991, //added 9/29/08 - aaTailoringMastery = 994, //added 9/29/08 - aaSalvage = 997, - aaOrigin = 1000, //spell - aaChaoticPotential = 1001, //added - aaDiscordantDefiance = 1006, //added 9/29/08 - aaTrialsofMataMuram = 1011, - aaMysticalAttuning = 1021, - aaDelayDeath = 1026, - aaHealthyAura = 1031, - aaFitness = 1036, - aaVeteransWrath = 1041, //added 9/29/08 - aaVeteransWrath2 = 1044, //whats the difference? - aaVeteransWrath3 = 1047, //whats the difference? - aaVeteransWrath4 = 1050, //whats the difference? - aaDeathblow = 1053, - aaReflexiveMastery = 1061, - aaDefensiveInstincts = 1066, - aaMnemonicRetention = 1071, //Implemented - aaExpansiveMind = 1072, //added 9/29/08 - aaSleightofHand = 1077, - aaSleightofHand2 = 1080, //whats the difference? - aaHealingAdeptMastery = 1083, - aaHealingGiftMastery = 1086, - aaArcaneTongues = 1089, - aaMasterofDisguise = 1092, - aaSlipperyAttacks = 1093, - aaImprovedCriticalAffliction = 1099, - aaFortifiedBellowing = 1102, - aaFuryofMagic2 = 1107, //whats the difference? - aaDanceofBlades = 1110, - aaShieldofNotes = 1116, - aaRoarofThunder = 1119, - aaPersistentMinion = 1122, - aaPerfectionofSpirit = 1123, - aaReplentishCompanion = 1126, - aaAdvancedPetDiscipline = 1129, - aaThrowingMastery = 1131, - aaBlurofAxes = 1134, - aaHastenedWarCry = 1137, - aaDeadAim = 1140, - aaFrenziedDefense = 1143, - aaTirelessSprint = 1146, - aaDesperation = 1149, - aaUntamedRage = 1150, - aaEchoingCries = 1155, - aaViciousFrenzy = 1158, - aaCrazedOnslaught = 1163, - aaOverwhelmingAttack = 1172, - aaFuriousRage = 1175, - aaBloodPact = 1178, - aaShieldingResistance = 1181, - aaHealingBoon = 1186, - aaResplendentCure = 1189, - aaCelestialHammer = 1192, - aaDivineRetribution = 1195, - aaCelestialRejuvination = 1203, - aaFerventBenediction = 1206, - aaSanctuary = 1209, - aaDestructiveFury = 1210, //added 9/29/08 - aaDestructiveFury2 = 1213, //whats the difference? - aaBoonoftheForest = 1222, - aaSpiritoftheGrove = 1225, - aaCalloftheWild = 1228, - aaSecondaryRecall = 1229, - aaNaturesBounty = 1230, - aaStasis = 1233, - aaColorShock = 1239, - aaMindOverMatter = 1242, - aaSoothingWords = 1245, - aaElementalSwarm = 1248, - aaHeartofFlames = 1251, - aaHeartofVapor = 1252, - aaHeartofIce = 1253, - aaHeartofStone = 1254, - aaImitateDeath = 1255, - aaCripplingStrike = 1256, - aaStunningKick = 1259, - aaEyeGouge = 1262, - aaIronKicks = 1265, - aaStyleoftheMimic = 1268, - aaDeathPeace2 = 1272, //whats the difference? - aaArmyoftheDead = 1274, - aaCelestialStun = 1277, - aaHandofDevotion = 1278, - aaSteadfastWill = 1284, - aaShieldBlock = 1287, - aaScoutsEfficiency = 1290, - aaGuardianoftheGlade = 1293, - aaTrackingMastery = 1296, - aaFlurryofKnives = 1301, - aaPrecision = 1304, - aaNervesofSteel = 1307, - aaTouchoftheCursed = 1313, - aaSpiritualCorrosion = 1316, - aaSoulThief = 1319, - aaSpiritualChanneling = 1323, - aaBoonoftheAncients = 1324, - aaAncestralAid = 1327, - aaResoluteDefiance = 1330, - aaPresstheAttack = 1333, - aaMindCrash = 1334, - aaProlongedDestruction = 1337, - aaRosGreaterFamiliar = 1340, - aaEcisGreaterFamiliar = 1341, - aaDruzzilsGreaterFamiliar = 1342, - aaTeleportBind = 1343, - aaDevotedFamiliar = 1344, - aaAuspiceoftheHunter = 1345, - aaSavageSpirit = 1348, - aaPresstheAttack2 = 1351, //whats the difference? - aaCripplingStrike2 = 1352, //whats the difference? - aaStunningKick2 = 1353, //whats the difference? - aaEyeGouge2 = 1358, //whats the difference? - - //Dragons of Norrath - //good info here: http://www.eqthieves.com/exp-don-progression.htm and here: http://everquest.allakhazam.com/db/guides.html?guide=811 - aaGiftoftheDarkReign = 1361, //from dbstr_us.txt - aaTenacityoftheDarkReign = 1362, //from dbstr_us.txt - aaEmbraceoftheDarkReign = 1363, //from dbstr_us.txt - aaPoweroftheDarkReign = 1364, //from dbstr_us.txt - aaFervoroftheDarkReign = 1365, //from dbstr_us.txt - aaGiftoftheKeepers = 1366, //from dbstr_us.txt - aaValoroftheKeepers = 1367, //from dbstr_us.txt - aaEmbraceoftheKeepers = 1368, //from dbstr_us.txt - aaPoweroftheKeepers = 1369, //from dbstr_us.txt - aaSanctityoftheKeepers = 1370, //from dbstr_us.txt - - //Veteran AAs - aaLessonoftheDevoted = 1371, //from dbstr_us.txt - aaInfusionoftheFaithful = 1372, //from dbstr_us.txt - aaChaoticJester = 1373, //from dbstr_us.txt - aaExpedientRecovery = 1374, //from dbstr_us.txt - aaSteadfastServant = 1375, //from dbstr_us.txt - aaStaunchRecovery = 1376, //from dbstr_us.txt - aaIntensityoftheResolute = 1377, //from dbstr_us.txt - - //Depths of Darkhollow - - //the following 5 look to be used as flags for completion of the Blood Raids for access to the Demiplane of Blood - //quest info here: http://everquest.allakhazam.com/db/quest.html?quest=3582 - //"You must also complete the five Blood Raids in any order: The Council of Nine, Emperor Draygun, Bloodeye, Matriarch Shyra, Sendaii, the Hive Queen" - //"The AA's you receive are: Curse of Blood (1/5), Affliction of Blood (2/5), Torment of Blood (3/5), Temptation of Blood (4/5), Invitation of Blood (5/5)." - aaCurseofBlood = 1378, //from dbstr_us.txt - aaAfflictionofBlood = 1379, //from dbstr_us.txt - aaTormentofBlood = 1380, //from dbstr_us.txt - aaTemptationofBlood = 1381, //from dbstr_us.txt - aaInvitationofBlood = 1382, //from dbstr_us.txt - - aaTurnUndead2 = 1383, //from dbstr_us.txt, Class AA changed in DoD - aaWrackUndead = 1386, //from dbstr_us.txt, PoP Class AA changed in DoD - aaEradicateUndead = 1387, //from dbstr_us.txt - aaInnateSeeInvis = 1388, //from dbstr_us.txt - aaProlongedMortality = 1389, //from dbstr_us.txt - aaPrecognition = 1394, //from dbstr_us.txt - aaThickSkin = 1399, //from dbstr_us.txt - aaSilentCasting = 1404, //from dbstr_us.txt - aaSilentCasting2 = 1409, //from dbstr_us.txt - aaHastenedMindCrash = 1414, //from dbstr_us.txt - aaFieldDressing = 1417, //from dbstr_us.txt - aaBandageWounds = 1420, //from dbstr_us.txt - aaCascadingRage = 1425, //from dbstr_us.txt - aaElementalFerocity = 1430, //from dbstr_us.txt - aaGiftofMana = 1435, //from dbstr_us.txt - aaRuneofShadows = 1440, //from dbstr_us.txt - aaChannelingMastery = 1445, //from dbstr_us.txt - aaConservation = 1453, //from dbstr_us.txt - aaCryofBattle = 1458, //from dbstr_us.txt - aaWardofPurity = 1459, //from dbstr_us.txt - aaTurnSummoned2 = 1462, //from dbstr_us.txt - aaWrackSummoned = 1465, //from dbstr_us.txt - aaEradicateSummoned = 1466, //from dbstr_us.txt - aaWardersSavagery = 1467, //from dbstr_us.txt - aaShackleofSpirits = 1470, //from dbstr_us.txt - aaHastenedThunder = 1471, //from dbstr_us.txt - aaTranslocationalAnchor = 1474, //from dbstr_us.txt - aaStealthyGetaway = 1477, //from dbstr_us.txt - aaPyromancy = 1478, //from dbstr_us.txt - aaMasteryofFury = 1483, //from dbstr_us.txt - aaAbundantHealing = 1486, //from dbstr_us.txt - aaGreaterAvatar = 1491, //from dbstr_us.txt - aaSharedCamouflage = 1494, //from dbstr_us.txt - aaConvergenceofSpirits = 1495, //from dbstr_us.txt - aaNaturesGuardian = 1498, //from dbstr_us.txt - aaEdictofCommand = 1501, //from dbstr_us.txt - aaExtendedBurnout = 1504, //from dbstr_us.txt - aaGuardianofRo = 1507, //from dbstr_us.txt - aaBloodMagic = 1510, //from dbstr_us.txt - aaGraverobbing = 1511, //from dbstr_us.txt - aaAfflictionMastery = 1514, //from dbstr_us.txt - aaGreaterRabidBear = 1517, //from dbstr_us.txt - aaAncestralGuard = 1520, //from dbstr_us.txt - aaCloakofLight = 1523, //from dbstr_us.txt - aaVanquishUndead = 1524, //from dbstr_us.txt - aaCloakofShadows = 1527, //from dbstr_us.txt - aaWillfulDeath = 1528, //from dbstr_us.txt - aaSwiftBlade = 1533, //from dbstr_us.txt - aaWickedBlade = 1536, //from dbstr_us.txt - aaForcedOpening = 1539, //from dbstr_us.txt - aaAppraisal = 1542, //from dbstr_us.txt - aaPreciseStrikes = 1543, //from dbstr_us.txt - aaHastenedDeath = 1546, //from dbstr_us.txt - aaUnflinchingResolve = 1549, //from dbstr_us.txt - aaWeightlessSteps = 1552, //from dbstr_us.txt - aaHastenedBlades = 1555, //from dbstr_us.txt - aaImprovedHarmoniousAttack = 1563, //from dbstr_us.txt - aaImprovedBestialFrenzy = 1566, //from dbstr_us.txt - aaSongofStone = 1569, //from dbstr_us.txt - aaDeepSleep = 1572, //from dbstr_us.txt - aaCompanionsGift = 1577, //from dbstr_us.txt - aaHastenedDefiance = 1583, //from dbstr_us.txt - aaDauntlessPerseverance = 1586, //from dbstr_us.txt - aaConcentration = 1587, //from dbstr_us.txt - aaEnhancedAggression = 1592, //from dbstr_us.txt - aaCallofChallenge = 1597, //from dbstr_us.txt - aaCacophony = 1598, //from dbstr_us.txt - aaImprovedHeadshot = 1601, //from dbstr_us.txt - aaAnatomy = 1604, //from dbstr_us.txt - aaFetterofSpirits = 1607, //from dbstr_us.txt - aaTrickShot = 1608, //from dbstr_us.txt - aaLightningStrikes = 1616, //from dbstr_us.txt - aaRelentlessAssault = 1621, //from dbstr_us.txt - aaKnightsExpertise = 1624, //from dbstr_us.txt - aaSelosEnduringCadence = 1627, //from dbstr_us.txt - aaHarmTouch = 7800, //from dbstr_us.txt - aaLayonHands = 7850, //from dbstr_us.txt - aaLayonHandsRank16 = 7866, - - aaHighestID //this should always be last, and should always - //follow the highest AA ID -} aaID; -*/ - - typedef enum { //AA IDs aaNone =0, aaInnateStrength =2,//implemented as bonus @@ -2109,21 +1525,6 @@ typedef enum { //AA IDs //follow the highest AA ID } aaID; - -//Structure representing the database's AA actions -struct AA_DBAction { - uint32 reuse_time; //in seconds - uint16 spell_id; //spell to cast, SPELL_UNKNOWN=no spell - aaTargetType target; //from aaTargetType - aaNonspellAction action; //non-spell action to take - uint16 mana_cost; //mana the NON-SPELL action costs - uint16 duration; //duration of NON-SPELL effect, 0=N/A - aaID redux_aa; //AA which reduces reuse time - int32 redux_rate; //%/point in redux_aa reduction in reuse time - aaID redux_aa2; //AA which reduces reuse time - int32 redux_rate2; //%/point in redux_aa reduction in reuse time -}; - //Structure representing the database's swarm pet configs struct AA_SwarmPet { uint8 count; //number to summon @@ -2131,12 +1532,6 @@ struct AA_SwarmPet { uint16 duration; //how long they last, in seconds }; -struct AALevelCost_Struct -{ - uint32 Level; - uint32 Cost; -}; - enum { //values of AA_Action.action aaActionActivate = 0, aaActionSetEXP = 1, diff --git a/zone/aa_ability.h b/zone/aa_ability.h index bd2b9e306..ba152fb06 100644 --- a/zone/aa_ability.h +++ b/zone/aa_ability.h @@ -49,6 +49,8 @@ public: int classes; int races; int deities; + int drakkin_heritage; + int status; bool grant_only; int type; int charges; diff --git a/zone/client.h b/zone/client.h index dd283596d..faa4eeb3a 100644 --- a/zone/client.h +++ b/zone/client.h @@ -784,9 +784,6 @@ public: void SetTitleSuffix(const char *txt); inline uint32 GetMaxAAXP(void) const { return max_AAXP; } inline uint32 GetAAXP() const { return m_pp.expAA; } - void SendAATable(); - int CalcAAReuseTimer(const AA_DBAction *caa); - void ActivateAA(aaID activate); void EnableAAEffect(aaEffectType type, uint32 duration = 0); void DisableAAEffect(aaEffectType type); bool CheckAAEffect(aaEffectType type); diff --git a/zone/command.cpp b/zone/command.cpp index 298022dc9..0554a5e68 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -167,7 +167,6 @@ int command_init(void) { command_add("aggro", "(range) [-v] - Display aggro information for all mobs 'range' distance from your target. -v is verbose faction info.", 80, command_aggro) || command_add("aggrozone", "[aggro] - Aggro every mob in the zone with X aggro. Default is 0. Not recommend if you're not invulnerable.", 100, command_aggrozone) || command_add("ai", "[factionid/spellslist/con/guard/roambox/stop/start] - Modify AI on NPC target", 100, command_ai) || - command_add("altactivate", "[argument] - activates alternate advancement abilities, use altactivate help for more information", 0, command_altactivate) || command_add("appearance", "[type] [value] - Send an appearance packet for you or your target", 150, command_appearance) || command_add("attack", "[targetname] - Make your NPC target attack targetname", 150, command_attack) || command_add("augmentitem", "Force augments an item. Must have the augment item window open.", 250, command_augmentitem) || @@ -273,7 +272,6 @@ int command_init(void) { command_add("los", nullptr,0, command_checklos) || command_add("makepet", "[level] [class] [race] [texture] - Make a pet", 50, command_makepet) || command_add("mana", "- Fill your or your target's mana", 50, command_mana) || - command_add("manaburn", "- Use AA Wizard class skill manaburn on target", 10, command_manaburn) || command_add("maxskills", "Maxes skills for you.", 200, command_max_all_skills) || command_add("memspell", "[slotid] [spellid] - Memorize spellid in the specified slot", 50, command_memspell) || command_add("merchant_close_shop", "Closes a merchant shop", 100, command_merchantcloseshop) || @@ -4848,36 +4846,6 @@ void command_zonestatus(Client *c, const Seperator *sep) } } -void command_manaburn(Client *c, const Seperator *sep) -{ - Mob* target=c->GetTarget(); - - if (c->GetTarget() == 0) - c->Message(0, "#Manaburn needs a target."); - else { - int cur_level=c->GetAA(MANA_BURN);//ManaBurn ID - if (DistanceSquared(c->GetPosition(), target->GetPosition()) > 200) - c->Message(0,"You are too far away from your target."); - else { - if(cur_level == 1) { - if(c->IsAttackAllowed(target)) - { - c->SetMana(0); - int nukedmg=(c->GetMana())*2; - if (nukedmg>0) - { - target->Damage(c, nukedmg, 2751, SkillAbjuration/*hackish*/); - c->Message(4,"You unleash an enormous blast of magical energies."); - } - Log.Out(Logs::General, Logs::Normal, "Manaburn request from %s, damage: %d", c->GetName(), nukedmg); - } - } - else - c->Message(0, "You have not learned this skill."); - } - } -} - void command_doanim(Client *c, const Seperator *sep) { if (!sep->IsNumber(1)) @@ -7684,57 +7652,6 @@ void command_reloadtitles(Client *c, const Seperator *sep) } -//old aa, probably to be removed -void command_altactivate(Client *c, const Seperator *sep){ -// if(sep->arg[1][0] == '\0'){ -// c->Message(10, "Invalid argument, usage:"); -// c->Message(10, "#altactivate list - lists the AA ID numbers that are available to you"); -// c->Message(10, "#altactivate time [argument] - returns the time left until you can use the AA with the ID that matches the argument."); -// c->Message(10, "#altactivate [argument] - activates the AA with the ID that matches the argument."); -// return; -// } -// if(!strcasecmp(sep->arg[1], "help")){ -// c->Message(10, "Usage:"); -// c->Message(10, "#altactivate list - lists the AA ID numbers that are available to you"); -// c->Message(10, "#altactivate time [argument] - returns the time left until you can use the AA with the ID that matches the argument."); -// c->Message(10, "#altactivate [argument] - activates the AA with the ID that matches the argument."); -// return; -// } -// if(!strcasecmp(sep->arg[1], "list")){ -// c->Message(10, "You have access to the following AA Abilities:"); -// int x, val; -// SendAA_Struct* saa = nullptr; -// for(x = 0; x < aaHighestID; x++){ -// if(AA_Actions[x][0].spell_id || AA_Actions[x][0].action){ //if there's an action or spell associated we assume it's a valid -// val = 0; //and assume if they don't have a value for the first rank then it isn't valid for any rank -// saa = nullptr; -// val = c->GetAA(x); -// if(val){ -// saa = zone->FindAA(x); -// c->Message(10, "%d: %s %d", x, saa->name, val); -// } -// } -// } -// } -// else if(!strcasecmp(sep->arg[1], "time")){ -// int ability = atoi(sep->arg[2]); -// if(c->GetAA(ability)){ -// int remain = c->GetPTimers().GetRemainingTime(pTimerAAStart + ability); -// if(remain) -// c->Message(10, "You may use that ability in %d minutes and %d seconds.", (remain/60), (remain%60)); -// else -// c->Message(10, "You may use that ability now."); -// } -// else{ -// c->Message(10, "You do not have access to that ability."); -// } -// } -// else -// { -// c->ActivateAA((aaID) atoi(sep->arg[1])); -// } -} - void command_traindisc(Client *c, const Seperator *sep) { uint8 max_level, min_level; diff --git a/zone/command.h b/zone/command.h index 0560b8eff..f44362ea7 100644 --- a/zone/command.h +++ b/zone/command.h @@ -216,7 +216,6 @@ void command_time(Client *c, const Seperator *sep); void command_guild(Client *c, const Seperator *sep); bool helper_guild_edit(Client *c, uint32 dbid, uint32 eqid, uint8 rank, const char* what, const char* value); void command_zonestatus(Client *c, const Seperator *sep); -void command_manaburn(Client *c, const Seperator *sep); void command_doanim(Client *c, const Seperator *sep); void command_randomfeatures(Client *c, const Seperator *sep); void command_face(Client *c, const Seperator *sep); @@ -276,7 +275,6 @@ void command_guildlist(Client *c, const Seperator *sep); void command_rules(Client *c, const Seperator *sep); void command_task(Client *c, const Seperator *sep); void command_reloadtitles(Client *c, const Seperator *sep); -void command_altactivate(Client *c, const Seperator *sep); void command_refundaa(Client *c, const Seperator *sep); void command_traindisc(Client *c, const Seperator *sep); void command_deletegraveyard(Client *c, const Seperator *sep); From ed11ee8bea0b5a60082cead55a6bf5ec3d44498d Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Fri, 12 Jun 2015 22:41:18 -0400 Subject: [PATCH 16/90] AA effects and focus should work Still need to verify all effects and implement currently unhandled --- common/spdat.h | 14 +- zone/attack.cpp | 7 + zone/bonuses.cpp | 1588 +++++++++++++++++++------------------- zone/bot.cpp | 6 +- zone/client.h | 4 +- zone/client_mods.cpp | 2 +- zone/common.h | 2 +- zone/mob.cpp | 8 +- zone/special_attacks.cpp | 32 +- zone/spell_effects.cpp | 1145 +++++++++++++-------------- 10 files changed, 1391 insertions(+), 1417 deletions(-) diff --git a/common/spdat.h b/common/spdat.h index bb71c1e88..ab128a37c 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -401,7 +401,7 @@ typedef enum { //#define SE_TrapCircumvention 245 // *not implemented[AA] - decreases the chance that you will set off a trap when opening a chest #define SE_SetBreathLevel 246 // *not implemented as bonus #define SE_RaiseSkillCap 247 // *not implemented[AA] - adds skill over the skill cap. -//#define SE_SecondaryForte 248 // not implemented as bonus(gives you a 2nd specialize skill that can go past 50 to 100) +#define SE_SecondaryForte 248 // not implemented as bonus(gives you a 2nd specialize skill that can go past 50 to 100) #define SE_SecondaryDmgInc 249 // implemented[AA] Allows off hand weapon to recieve a damage bonus (Sinister Strikes) #define SE_SpellProcChance 250 // implemented - Increase chance to proc from melee proc spells (ie Spirit of Panther) #define SE_ConsumeProjectile 251 // implemented[AA] - chance to not consume an arrow (ConsumeProjectile = 100) @@ -416,12 +416,12 @@ typedef enum { #define SE_AddSingingMod 260 // implemented[AA] - Instrument/Singing Mastery, base1 is the mod, base2 is the ItemType #define SE_SongModCap 261 // implemented[AA] - Song Mod cap increase (no longer used on live) #define SE_RaiseStatCap 262 // implemented -//#define SE_TradeSkillMastery 263 // not implemented - lets you raise more than one tradeskill above master. +#define SE_TradeSkillMastery 263 // not implemented - lets you raise more than one tradeskill above master. #define SE_HastenedAASkill 264 // implemented #define SE_MasteryofPast 265 // implemented[AA] - Spells less than effect values level can not be fizzled #define SE_ExtraAttackChance 266 // implemented - increase chance to score an extra attack with a 2-Handed Weapon. #define SE_PetDiscipline2 267 // *not implemented - /pet focus, /pet no cast -//#define SE_ReduceTradeskillFail 268 // *not implemented? - reduces chance to fail with given tradeskill by a percent chance +#define SE_ReduceTradeskillFail 268 // *not implemented? - reduces chance to fail with given tradeskill by a percent chance #define SE_MaxBindWound 269 // implemented[AA] - Increase max HP you can bind wound. #define SE_BardSongRange 270 // implemented[AA] - increase range of beneficial bard songs (Sionachie's Crescendo) #define SE_BaseMovementSpeed 271 // implemented[AA] - mods basemove speed, doesn't stack with other move mods @@ -441,7 +441,7 @@ typedef enum { //#define SE_NimbleEvasion 285 // *not implemented - base1 = 100 for max #define SE_FcDamageAmt 286 // implemented - adds direct spell damage #define SE_SpellDurationIncByTic 287 // implemented -#define SE_SpecialAttackKBProc 288 // implemented[AA] - Chance to to do a knockback from special attacks [AA Dragon Punch]. +#define SE_SkillAttackProc 288 // implemented[AA] - Chance to proc spell on skill attack usage (ex. Dragon Punch) #define SE_CastOnFadeEffect 289 // implemented - Triggers only if fades after natural duration. #define SE_IncreaseRunSpeedCap 290 // implemented[AA] - increases run speed over the hard cap #define SE_Purify 291 // implemented - Removes determental effects @@ -515,8 +515,8 @@ typedef enum { //#define SE_PassiveSenseTrap 359 // *not implemented - Invulnerability (Brell's Blessing) #define SE_ProcOnKillShot 360 // implemented - a buff that has a base1 % to cast spell base2 when you kill a "challenging foe" base3 min level #define SE_SpellOnDeath 361 // implemented - casts spell on death of buffed -//#define SE_PotionBeltSlots 362 // *not implemented[AA] 'Quick Draw' expands the potion belt by one additional available item slot per rank. -//#define SE_BandolierSlots 363 // *not implemented[AA] 'Battle Ready' expands the bandolier by one additional save slot per rank. +#define SE_PotionBeltSlots 362 // *not implemented[AA] 'Quick Draw' expands the potion belt by one additional available item slot per rank. +#define SE_BandolierSlots 363 // *not implemented[AA] 'Battle Ready' expands the bandolier by one additional save slot per rank. #define SE_TripleAttackChance 364 // implemented #define SE_ProcOnSpellKillShot 365 // implemented - chance to trigger a spell on kill when the kill is caused by a specific spell with this effect in it (10470 Venin) #define SE_ShieldEquipDmgMod 366 // implemented[AA] Damage modifier to melee if shield equiped. (base1 = dmg mod , base2 = ?) ie Shield Specialist AA @@ -525,7 +525,7 @@ typedef enum { #define SE_CorruptionCounter 369 // implemented #define SE_ResistCorruption 370 // implemented #define SE_AttackSpeed4 371 // implemented - stackable slow effect 'Inhibit Melee' -//#define SE_ForageSkill 372 // *not implemented[AA] Will increase the skill cap for those that have the Forage skill and grant the skill and raise the cap to those that do not. +#define SE_ForageSkill 372 // *not implemented[AA] Will increase the skill cap for those that have the Forage skill and grant the skill and raise the cap to those that do not. #define SE_CastOnFadeEffectAlways 373 // implemented - Triggers if fades after natural duration OR from rune/numhits fades. #define SE_ApplyEffect 374 // implemented #define SE_DotCritDmgIncrease 375 // implemented - Increase damage of DoT critical amount diff --git a/zone/attack.cpp b/zone/attack.cpp index 74cb33272..cecf37ff1 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -1372,6 +1372,13 @@ bool Client::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, b /////////////////////////////////////////////////////////// ////// Send Attack Damage /////////////////////////////////////////////////////////// + if (damage > 0 && aabonuses.SkillAttackProc[0] && aabonuses.SkillAttackProc[1] == skillinuse && + IsValidSpell(aabonuses.SkillAttackProc[2])) { + float chance = aabonuses.SkillAttackProc[0] / 1000.0f; + if (zone->random.Roll(chance)) + SpellFinished(aabonuses.SkillAttackProc[2], other, 10, 0, -1, + spells[aabonuses.SkillAttackProc[2]].ResistDiff); + } other->Damage(this, damage, SPELL_UNKNOWN, skillinuse); if (IsDead()) return false; diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index 437befe11..23a896979 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -632,812 +632,814 @@ void Client::CalcEdibleBonuses(StatBonuses* newbon) { } } -void Client::CalcAABonuses(StatBonuses* newbon) { - memset(newbon, 0, sizeof(StatBonuses)); //start fresh +void Client::CalcAABonuses(StatBonuses *newbon) +{ + memset(newbon, 0, sizeof(StatBonuses)); // start fresh - int i; - uint32 slots = 0; - uint32 aa_AA = 0; - uint32 aa_value = 0; - //aa old - //if(this->aa) { - // for (i = 0; i < MAX_PP_AA_ARRAY; i++) { //iterate through all of the client's AAs - // if (this->aa[i]) { // make sure aa exists or we'll crash zone - // aa_AA = this->aa[i]->AA; //same as aaid from the aa_effects table - // aa_value = this->aa[i]->value; //how many points in it - // if (aa_AA > 0 || aa_value > 0) { //do we have the AA? if 1 of the 2 is set, we can assume we do - // //slots = database.GetTotalAALevels(aa_AA); //find out how many effects from aa_effects table - // slots = zone->GetTotalAALevels(aa_AA); //find out how many effects from aa_effects, which is loaded into memory - // if (slots > 0) //and does it have any effects? may be able to put this above, not sure if it runs on each iteration - // ApplyAABonuses(aa_AA, slots, newbon); //add the bonuses - // } - // } - // } - //} + for (const auto &aa : aa_ranks) { + auto ability = zone->GetAlternateAdvancementAbility(aa.first); + // zone doesn't know about this! bad data some where + if (!ability) + continue; + + auto rank = ability->GetRankByPointsSpent(aa.second.first); + // bad data or no effects + if (!rank || rank->effects.empty()) + continue; + + ApplyAABonuses(*rank, newbon); + } } - //A lot of the normal spell functions (IsBlankSpellEffect, etc) are set for just spells (in common/spdat.h). //For now, we'll just put them directly into the code and comment with the corresponding normal function //Maybe we'll fix it later? :-D -void Client::ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon) +void Client::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) { - if(slots == 0) //sanity check. why bother if no slots to fill? + if (rank.effects.empty()) // sanity check. why bother if no slots to fill? return; - //from AA_Ability struct uint32 effect = 0; int32 base1 = 0; - int32 base2 = 0; //only really used for SE_RaiseStatCap & SE_ReduceSkillTimer in aa_effects table + int32 base2 = 0; // only really used for SE_RaiseStatCap & SE_ReduceSkillTimer in aa_effects table uint32 slot = 0; - //AA old - //std::map >::const_iterator find_iter = aa_effects.find(aaid); - //if(find_iter == aa_effects.end()) - //{ - // return; - //} - // - //for (std::map::const_iterator iter = aa_effects[aaid].begin(); iter != aa_effects[aaid].end(); ++iter) { - // effect = iter->second.skill_id; - // base1 = iter->second.base1; - // base2 = iter->second.base2; - // slot = iter->second.slot; - // - // //we default to 0 (SE_CurrentHP) for the effect, so if there aren't any base1/2 values, we'll just skip it - // if (effect == 0 && base1 == 0 && base2 == 0) - // continue; - // - // //IsBlankSpellEffect() - // if (effect == SE_Blank || (effect == SE_CHA && base1 == 0) || effect == SE_StackingCommand_Block || effect == SE_StackingCommand_Overwrite) - // continue; - // - // Log.Out(Logs::Detail, Logs::AA, "Applying Effect %d from AA %u in slot %d (base1: %d, base2: %d) on %s", effect, aaid, slot, base1, base2, this->GetCleanName()); - // - // uint8 focus = IsFocusEffect(0, 0, true,effect); - // if (focus) - // { - // newbon->FocusEffects[focus] = static_cast(effect); - // continue; - // } - // - // switch (effect) - // { - // //Note: AA effects that use accuracy are skill limited, while spell effect is not. - // case SE_Accuracy: - // if ((base2 == ALL_SKILLS) && (newbon->Accuracy[HIGHEST_SKILL+1] < base1)) - // newbon->Accuracy[HIGHEST_SKILL+1] = base1; - // else if (newbon->Accuracy[base2] < base1) - // newbon->Accuracy[base2] += base1; - // break; - // case SE_CurrentHP: //regens - // newbon->HPRegen += base1; - // break; - // case SE_CurrentEndurance: - // newbon->EnduranceRegen += base1; - // break; - // case SE_MovementSpeed: - // newbon->movementspeed += base1; //should we let these stack? - // /*if (base1 > newbon->movementspeed) //or should we use a total value? - // newbon->movementspeed = base1;*/ - // break; - // case SE_STR: - // newbon->STR += base1; - // break; - // case SE_DEX: - // newbon->DEX += base1; - // break; - // case SE_AGI: - // newbon->AGI += base1; - // break; - // case SE_STA: - // newbon->STA += base1; - // break; - // case SE_INT: - // newbon->INT += base1; - // break; - // case SE_WIS: - // newbon->WIS += base1; - // break; - // case SE_CHA: - // newbon->CHA += base1; - // break; - // case SE_WaterBreathing: - // //handled by client - // break; - // case SE_CurrentMana: - // newbon->ManaRegen += base1; - // break; - // case SE_ItemManaRegenCapIncrease: - // newbon->ItemManaRegenCap += base1; - // break; - // case SE_ResistFire: - // newbon->FR += base1; - // break; - // case SE_ResistCold: - // newbon->CR += base1; - // break; - // case SE_ResistPoison: - // newbon->PR += base1; - // break; - // case SE_ResistDisease: - // newbon->DR += base1; - // break; - // case SE_ResistMagic: - // newbon->MR += base1; - // break; - // case SE_ResistCorruption: - // newbon->Corrup += base1; - // break; - // case SE_IncreaseSpellHaste: - // break; - // case SE_IncreaseRange: - // break; - // case SE_MaxHPChange: - // newbon->MaxHP += base1; - // break; - // case SE_Packrat: - // newbon->Packrat += base1; - // break; - // case SE_TwoHandBash: - // break; - // case SE_SetBreathLevel: - // break; - // case SE_RaiseStatCap: - // switch(base2) - // { - // //are these #define'd somewhere? - // case 0: //str - // newbon->STRCapMod += base1; - // break; - // case 1: //sta - // newbon->STACapMod += base1; - // break; - // case 2: //agi - // newbon->AGICapMod += base1; - // break; - // case 3: //dex - // newbon->DEXCapMod += base1; - // break; - // case 4: //wis - // newbon->WISCapMod += base1; - // break; - // case 5: //int - // newbon->INTCapMod += base1; - // break; - // case 6: //cha - // newbon->CHACapMod += base1; - // break; - // case 7: //mr - // newbon->MRCapMod += base1; - // break; - // case 8: //cr - // newbon->CRCapMod += base1; - // break; - // case 9: //fr - // newbon->FRCapMod += base1; - // break; - // case 10: //pr - // newbon->PRCapMod += base1; - // break; - // case 11: //dr - // newbon->DRCapMod += base1; - // break; - // case 12: //corruption - // newbon->CorrupCapMod += base1; - // break; - // } - // break; - // case SE_PetDiscipline2: - // break; - // case SE_SpellSlotIncrease: - // break; - // case SE_MysticalAttune: - // newbon->BuffSlotIncrease += base1; - // break; - // case SE_TotalHP: - // newbon->HP += base1; - // break; - // case SE_StunResist: - // newbon->StunResist += base1; - // break; - // case SE_SpellCritChance: - // newbon->CriticalSpellChance += base1; - // break; - // case SE_SpellCritDmgIncrease: - // newbon->SpellCritDmgIncrease += base1; - // break; - // case SE_DotCritDmgIncrease: - // newbon->DotCritDmgIncrease += base1; - // break; - // case SE_ResistSpellChance: - // newbon->ResistSpellChance += base1; - // break; - // case SE_CriticalHealChance: - // newbon->CriticalHealChance += base1; - // break; - // case SE_CriticalHealOverTime: - // newbon->CriticalHealOverTime += base1; - // break; - // case SE_CriticalDoTChance: - // newbon->CriticalDoTChance += base1; - // break; - // case SE_ReduceSkillTimer: - // newbon->SkillReuseTime[base2] += base1; - // break; - // case SE_Fearless: - // newbon->Fearless = true; - // break; - // case SE_PersistantCasting: - // newbon->PersistantCasting += base1; - // break; - // case SE_DelayDeath: - // newbon->DelayDeath += base1; - // break; - // case SE_FrontalStunResist: - // newbon->FrontalStunResist += base1; - // break; - // case SE_ImprovedBindWound: - // newbon->BindWound += base1; - // break; - // case SE_MaxBindWound: - // newbon->MaxBindWound += base1; - // break; - // case SE_ExtraAttackChance: - // newbon->ExtraAttackChance += base1; - // break; - // case SE_SeeInvis: - // newbon->SeeInvis = base1; - // break; - // case SE_BaseMovementSpeed: - // newbon->BaseMovementSpeed += base1; - // break; - // case SE_IncreaseRunSpeedCap: - // newbon->IncreaseRunSpeedCap += base1; - // break; - // case SE_ConsumeProjectile: - // newbon->ConsumeProjectile += base1; - // break; - // case SE_ForageAdditionalItems: - // newbon->ForageAdditionalItems += base1; - // break; - // case SE_Salvage: - // newbon->SalvageChance += base1; - // break; - // case SE_ArcheryDamageModifier: - // newbon->ArcheryDamageModifier += base1; - // break; - // case SE_DoubleRangedAttack: - // newbon->DoubleRangedAttack += base1; - // break; - // case SE_DamageShield: - // newbon->DamageShield += base1; - // break; - // case SE_CharmBreakChance: - // newbon->CharmBreakChance += base1; - // break; - // case SE_OffhandRiposteFail: - // newbon->OffhandRiposteFail += base1; - // break; - // case SE_ItemAttackCapIncrease: - // newbon->ItemATKCap += base1; - // break; - // case SE_GivePetGroupTarget: - // newbon->GivePetGroupTarget = true; - // break; - // case SE_ItemHPRegenCapIncrease: - // newbon->ItemHPRegenCap = +base1; - // break; - // case SE_Ambidexterity: - // newbon->Ambidexterity += base1; - // break; - // case SE_PetMaxHP: - // newbon->PetMaxHP += base1; - // break; - // case SE_AvoidMeleeChance: - // newbon->AvoidMeleeChanceEffect += base1; - // break; - // case SE_CombatStability: - // newbon->CombatStability += base1; - // break; - // case SE_AddSingingMod: - // switch (base2) - // { - // case ItemTypeWindInstrument: - // newbon->windMod += base1; - // break; - // case ItemTypeStringedInstrument: - // newbon->stringedMod += base1; - // break; - // case ItemTypeBrassInstrument: - // newbon->brassMod += base1; - // break; - // case ItemTypePercussionInstrument: - // newbon->percussionMod += base1; - // break; - // case ItemTypeSinging: - // newbon->singingMod += base1; - // break; - // } - // break; - // case SE_SongModCap: - // newbon->songModCap += base1; - // break; - // case SE_PetCriticalHit: - // newbon->PetCriticalHit += base1; - // break; - // case SE_PetAvoidance: - // newbon->PetAvoidance += base1; - // break; - // case SE_ShieldBlock: - // newbon->ShieldBlock += base1; - // break; - // case SE_ShieldEquipHateMod: - // newbon->ShieldEquipHateMod += base1; - // break; - // case SE_ShieldEquipDmgMod: - // newbon->ShieldEquipDmgMod[0] += base1; - // newbon->ShieldEquipDmgMod[1] += base2; - // break; - // case SE_SecondaryDmgInc: - // newbon->SecondaryDmgInc = true; - // break; - // case SE_ChangeAggro: - // newbon->hatemod += base1; - // break; - // case SE_EndurancePool: - // newbon->Endurance += base1; - // break; - // case SE_ChannelChanceItems: - // newbon->ChannelChanceItems += base1; - // break; - // case SE_ChannelChanceSpells: - // newbon->ChannelChanceSpells += base1; - // break; - // case SE_DoubleSpecialAttack: - // newbon->DoubleSpecialAttack += base1; - // break; - // case SE_TripleBackstab: - // newbon->TripleBackstab += base1; - // break; - // case SE_FrontalBackstabMinDmg: - // newbon->FrontalBackstabMinDmg = true; - // break; - // case SE_FrontalBackstabChance: - // newbon->FrontalBackstabChance += base1; - // break; - // case SE_BlockBehind: - // newbon->BlockBehind += base1; - // break; - // - // case SE_StrikeThrough: - // case SE_StrikeThrough2: - // newbon->StrikeThrough += base1; - // break; - // case SE_DoubleAttackChance: - // newbon->DoubleAttackChance += base1; - // break; - // case SE_GiveDoubleAttack: - // newbon->GiveDoubleAttack += base1; - // break; - // case SE_ProcChance: - // newbon->ProcChanceSPA += base1; - // break; - // case SE_RiposteChance: - // newbon->RiposteChance += base1; - // break; - // case SE_Flurry: - // newbon->FlurryChance += base1; - // break; - // case SE_PetFlurry: - // newbon->PetFlurry += base1; - // break; - // case SE_BardSongRange: - // newbon->SongRange += base1; - // break; - // case SE_RootBreakChance: - // newbon->RootBreakChance += base1; - // break; - // case SE_UnfailingDivinity: - // newbon->UnfailingDivinity += base1; - // break; - // case SE_CrippBlowChance: - // newbon->CrippBlowChance += base1; - // break; - // - // case SE_HitChance: - // { - // if(base2 == ALL_SKILLS) - // newbon->HitChanceEffect[HIGHEST_SKILL+1] += base1; - // else - // newbon->HitChanceEffect[base2] += base1; - // } - // - // case SE_ProcOnKillShot: - // for(int i = 0; i < MAX_SPELL_TRIGGER*3; i+=3) - // { - // if(!newbon->SpellOnKill[i] || ((newbon->SpellOnKill[i] == base2) && (newbon->SpellOnKill[i+1] < base1))) - // { - // //base1 = chance, base2 = SpellID to be triggered, base3 = min npc level - // newbon->SpellOnKill[i] = base2; - // newbon->SpellOnKill[i+1] = base1; - // - // if (GetLevel() > 15) - // newbon->SpellOnKill[i+2] = GetLevel() - 15; //AA specifiy "non-trivial" - // else - // newbon->SpellOnKill[i+2] = 0; - // - // break; - // } - // } - // break; - // - // case SE_SpellOnDeath: - // for(int i = 0; i < MAX_SPELL_TRIGGER*2; i+=2) - // { - // if(!newbon->SpellOnDeath[i]) - // { - // // base1 = SpellID to be triggered, base2 = chance to fire - // newbon->SpellOnDeath[i] = base1; - // newbon->SpellOnDeath[i+1] = base2; - // break; - // } - // } - // break; - // - // case SE_TriggerOnCast: - // - // for(int i = 0; i < MAX_SPELL_TRIGGER; i++) - // { - // if (newbon->SpellTriggers[i] == aaid) - // break; - // - // if(!newbon->SpellTriggers[i]) - // { - // //Save the 'aaid' of each triggerable effect to an array - // newbon->SpellTriggers[i] = aaid; - // break; - // } - // } - // break; - // - // case SE_CriticalHitChance: - // { - // if(base2 == ALL_SKILLS) - // newbon->CriticalHitChance[HIGHEST_SKILL+1] += base1; - // else - // newbon->CriticalHitChance[base2] += base1; - // } - // break; - // - // case SE_CriticalDamageMob: - // { - // // base1 = effect value, base2 = skill restrictions(-1 for all) - // if(base2 == ALL_SKILLS) - // newbon->CritDmgMob[HIGHEST_SKILL+1] += base1; - // else - // newbon->CritDmgMob[base2] += base1; - // break; - // } - // - // case SE_CriticalSpellChance: - // { - // newbon->CriticalSpellChance += base1; - // - // if (base2 > newbon->SpellCritDmgIncNoStack) - // newbon->SpellCritDmgIncNoStack = base2; - // - // break; - // } - // - // case SE_ResistFearChance: - // { - // if(base1 == 100) // If we reach 100% in a single spell/item then we should be immune to negative fear resist effects until our immunity is over - // newbon->Fearless = true; - // - // newbon->ResistFearChance += base1; // these should stack - // break; - // } - // - // case SE_SkillDamageAmount: - // { - // if(base2 == ALL_SKILLS) - // newbon->SkillDamageAmount[HIGHEST_SKILL+1] += base1; - // else - // newbon->SkillDamageAmount[base2] += base1; - // break; - // } - // - // case SE_SpecialAttackKBProc: - // { - // //You can only have one of these per client. [AA Dragon Punch] - // newbon->SpecialAttackKBProc[0] = base1; //Chance base 100 = 25% proc rate - // newbon->SpecialAttackKBProc[1] = base2; //Skill to KB Proc Off - // break; - // } - // - // case SE_DamageModifier: - // { - // if(base2 == ALL_SKILLS) - // newbon->DamageModifier[HIGHEST_SKILL+1] += base1; - // else - // newbon->DamageModifier[base2] += base1; - // break; - // } - // - // case SE_DamageModifier2: - // { - // if(base2 == ALL_SKILLS) - // newbon->DamageModifier2[HIGHEST_SKILL+1] += base1; - // else - // newbon->DamageModifier2[base2] += base1; - // break; - // } - // - // case SE_SlayUndead: - // { - // if(newbon->SlayUndead[1] < base1) - // newbon->SlayUndead[0] = base1; // Rate - // newbon->SlayUndead[1] = base2; // Damage Modifier - // break; - // } - // - // case SE_DoubleRiposte: - // { - // newbon->DoubleRiposte += base1; - // } - // - // case SE_GiveDoubleRiposte: - // { - // //0=Regular Riposte 1=Skill Attack Riposte 2=Skill - // if(base2 == 0){ - // if(newbon->GiveDoubleRiposte[0] < base1) - // newbon->GiveDoubleRiposte[0] = base1; - // } - // //Only for special attacks. - // else if(base2 > 0 && (newbon->GiveDoubleRiposte[1] < base1)){ - // newbon->GiveDoubleRiposte[1] = base1; - // newbon->GiveDoubleRiposte[2] = base2; - // } - // - // break; - // } - // - // //Kayen: Not sure best way to implement this yet. - // //Physically raises skill cap ie if 55/55 it will raise to 55/60 - // case SE_RaiseSkillCap: - // { - // if(newbon->RaiseSkillCap[0] < base1){ - // newbon->RaiseSkillCap[0] = base1; //value - // newbon->RaiseSkillCap[1] = base2; //skill - // } - // break; - // } - // - // case SE_MasteryofPast: - // { - // if(newbon->MasteryofPast < base1) - // newbon->MasteryofPast = base1; - // break; - // } - // - // case SE_CastingLevel2: - // case SE_CastingLevel: - // { - // newbon->effective_casting_level += base1; - // break; - // } - // - // case SE_DivineSave: - // { - // if(newbon->DivineSaveChance[0] < base1) - // { - // newbon->DivineSaveChance[0] = base1; - // newbon->DivineSaveChance[1] = base2; - // } - // break; - // } - // - // - // case SE_SpellEffectResistChance: - // { - // for(int e = 0; e < MAX_RESISTABLE_EFFECTS*2; e+=2) - // { - // if(newbon->SEResist[e+1] && (newbon->SEResist[e] == base2) && (newbon->SEResist[e+1] < base1)){ - // newbon->SEResist[e] = base2; //Spell Effect ID - // newbon->SEResist[e+1] = base1; //Resist Chance - // break; - // } - // else if (!newbon->SEResist[e+1]){ - // newbon->SEResist[e] = base2; //Spell Effect ID - // newbon->SEResist[e+1] = base1; //Resist Chance - // break; - // } - // } - // break; - // } - // - // case SE_MitigateDamageShield: - // { - // if (base1 < 0) - // base1 = base1*(-1); - // - // newbon->DSMitigationOffHand += base1; - // break; - // } - // - // case SE_FinishingBlow: - // { - // //base1 = chance, base2 = damage - // if (newbon->FinishingBlow[1] < base2){ - // newbon->FinishingBlow[0] = base1; - // newbon->FinishingBlow[1] = base2; - // } - // break; - // } - // - // case SE_FinishingBlowLvl: - // { - // //base1 = level, base2 = ??? (Set to 200 in AA data, possible proc rate mod?) - // if (newbon->FinishingBlowLvl[0] < base1){ - // newbon->FinishingBlowLvl[0] = base1; - // newbon->FinishingBlowLvl[1] = base2; - // } - // break; - // } - // - // case SE_StunBashChance: - // newbon->StunBashChance += base1; - // break; - // - // case SE_IncreaseChanceMemwipe: - // newbon->IncreaseChanceMemwipe += base1; - // break; - // - // case SE_CriticalMend: - // newbon->CriticalMend += base1; - // break; - // - // case SE_HealRate: - // newbon->HealRate += base1; - // break; - // - // case SE_MeleeLifetap: - // { - // - // if((base1 < 0) && (newbon->MeleeLifetap > base1)) - // newbon->MeleeLifetap = base1; - // - // else if(newbon->MeleeLifetap < base1) - // newbon->MeleeLifetap = base1; - // break; - // } - // - // case SE_Vampirism: - // newbon->Vampirism += base1; - // break; - // - // case SE_FrenziedDevastation: - // newbon->FrenziedDevastation += base2; - // break; - // - // case SE_SpellProcChance: - // newbon->SpellProcChance += base1; - // break; - // - // case SE_Berserk: - // newbon->BerserkSPA = true; - // break; - // - // case SE_Metabolism: - // newbon->Metabolism += base1; - // break; - // - // case SE_ImprovedReclaimEnergy: - // { - // if((base1 < 0) && (newbon->ImprovedReclaimEnergy > base1)) - // newbon->ImprovedReclaimEnergy = base1; - // - // else if(newbon->ImprovedReclaimEnergy < base1) - // newbon->ImprovedReclaimEnergy = base1; - // break; - // } - // - // case SE_HeadShot: - // { - // if(newbon->HeadShot[1] < base2){ - // newbon->HeadShot[0] = base1; - // newbon->HeadShot[1] = base2; - // } - // break; - // } - // - // case SE_HeadShotLevel: - // { - // if(newbon->HSLevel < base1) - // newbon->HSLevel = base1; - // break; - // } - // - // case SE_Assassinate: - // { - // if(newbon->Assassinate[1] < base2){ - // newbon->Assassinate[0] = base1; - // newbon->Assassinate[1] = base2; - // } - // break; - // } - // - // case SE_AssassinateLevel: - // { - // if(newbon->AssassinateLevel < base1) - // newbon->AssassinateLevel = base1; - // break; - // } - // - // case SE_PetMeleeMitigation: - // newbon->PetMeleeMitigation += base1; - // break; - // - // case SE_MeleeVulnerability: - // newbon->MeleeVulnerability += base1; - // break; - // - // case SE_FactionModPct: - // { - // if((base1 < 0) && (newbon->FactionModPct > base1)) - // newbon->FactionModPct = base1; - // - // else if(newbon->FactionModPct < base1) - // newbon->FactionModPct = base1; - // break; - // } - // - // case SE_IllusionPersistence: - // newbon->IllusionPersistence = true; - // break; - // - // case SE_LimitToSkill:{ - // if (base1 <= HIGHEST_SKILL) - // newbon->LimitToSkill[base1] = true; - // break; - // } - // - // case SE_SkillProc:{ - // for(int e = 0; e < MAX_SKILL_PROCS; e++) - // { - // if(newbon->SkillProc[e] && newbon->SkillProc[e] == aaid) - // break; //Do not use the same aa id more than once. - // - // else if(!newbon->SkillProc[e]){ - // newbon->SkillProc[e] = aaid; - // break; - // } - // } - // break; - // } - // - // case SE_SkillProcSuccess:{ - // - // for(int e = 0; e < MAX_SKILL_PROCS; e++) - // { - // if(newbon->SkillProcSuccess[e] && newbon->SkillProcSuccess[e] == aaid) - // break; //Do not use the same spell id more than once. - // - // else if(!newbon->SkillProcSuccess[e]){ - // newbon->SkillProcSuccess[e] = aaid; - // break; - // } - // } - // break; - // } - // - // case SE_MeleeMitigation: - // newbon->MeleeMitigationEffect -= base1; - // break; - // - // } - //} + for (const auto &e : rank.effects) { + effect = e.effect_id; + base1 = e.base1; + base2 = e.base2; + slot = e.slot; + + // we default to 0 (SE_CurrentHP) for the effect, so if there aren't any base1/2 values, we'll just skip it + if (effect == 0 && base1 == 0 && base2 == 0) + continue; + + // IsBlankSpellEffect() + if (effect == SE_Blank || (effect == SE_CHA && base1 == 0) || effect == SE_StackingCommand_Block || + effect == SE_StackingCommand_Overwrite) + continue; + + Log.Out(Logs::Detail, Logs::AA, "Applying Effect %d from AA %u in slot %d (base1: %d, base2: %d) on %s", + effect, rank.id, slot, base1, base2, GetCleanName()); + + uint8 focus = IsFocusEffect(0, 0, true, effect); + if (focus) { + newbon->FocusEffects[focus] = static_cast(effect); + continue; + } + + switch (effect) { + // Note: AA effects that use accuracy are skill limited, while spell effect is not. + case SE_Accuracy: + if ((base2 == ALL_SKILLS) && (newbon->Accuracy[HIGHEST_SKILL + 1] < base1)) + newbon->Accuracy[HIGHEST_SKILL + 1] = base1; + else if (newbon->Accuracy[base2] < base1) + newbon->Accuracy[base2] += base1; + break; + case SE_CurrentHP: // regens + newbon->HPRegen += base1; + break; + case SE_CurrentEndurance: + newbon->EnduranceRegen += base1; + break; + case SE_MovementSpeed: + newbon->movementspeed += base1; // should we let these stack? + /*if (base1 > newbon->movementspeed) //or should we use a total value? + newbon->movementspeed = base1;*/ + break; + case SE_STR: + newbon->STR += base1; + break; + case SE_DEX: + newbon->DEX += base1; + break; + case SE_AGI: + newbon->AGI += base1; + break; + case SE_STA: + newbon->STA += base1; + break; + case SE_INT: + newbon->INT += base1; + break; + case SE_WIS: + newbon->WIS += base1; + break; + case SE_CHA: + newbon->CHA += base1; + break; + case SE_WaterBreathing: + // handled by client + break; + case SE_CurrentMana: + newbon->ManaRegen += base1; + break; + case SE_ManaPool: + newbon->Mana += base1; + break; + case SE_ItemManaRegenCapIncrease: + newbon->ItemManaRegenCap += base1; + break; + case SE_ResistFire: + newbon->FR += base1; + break; + case SE_ResistCold: + newbon->CR += base1; + break; + case SE_ResistPoison: + newbon->PR += base1; + break; + case SE_ResistDisease: + newbon->DR += base1; + break; + case SE_ResistMagic: + newbon->MR += base1; + break; + case SE_ResistCorruption: + newbon->Corrup += base1; + break; + case SE_IncreaseSpellHaste: + break; + case SE_IncreaseRange: + break; + case SE_MaxHPChange: + newbon->MaxHP += base1; + break; + case SE_Packrat: + newbon->Packrat += base1; + break; + case SE_TwoHandBash: + break; + case SE_SetBreathLevel: + break; + case SE_RaiseStatCap: + switch (base2) { + // are these #define'd somewhere? + case 0: // str + newbon->STRCapMod += base1; + break; + case 1: // sta + newbon->STACapMod += base1; + break; + case 2: // agi + newbon->AGICapMod += base1; + break; + case 3: // dex + newbon->DEXCapMod += base1; + break; + case 4: // wis + newbon->WISCapMod += base1; + break; + case 5: // int + newbon->INTCapMod += base1; + break; + case 6: // cha + newbon->CHACapMod += base1; + break; + case 7: // mr + newbon->MRCapMod += base1; + break; + case 8: // cr + newbon->CRCapMod += base1; + break; + case 9: // fr + newbon->FRCapMod += base1; + break; + case 10: // pr + newbon->PRCapMod += base1; + break; + case 11: // dr + newbon->DRCapMod += base1; + break; + case 12: // corruption + newbon->CorrupCapMod += base1; + break; + } + break; + case SE_PetDiscipline2: + break; + case SE_SpellSlotIncrease: + break; + case SE_MysticalAttune: + newbon->BuffSlotIncrease += base1; + break; + case SE_TotalHP: + newbon->HP += base1; + break; + case SE_StunResist: + newbon->StunResist += base1; + break; + case SE_SpellCritChance: + newbon->CriticalSpellChance += base1; + break; + case SE_SpellCritDmgIncrease: + newbon->SpellCritDmgIncrease += base1; + break; + case SE_DotCritDmgIncrease: + newbon->DotCritDmgIncrease += base1; + break; + case SE_ResistSpellChance: + newbon->ResistSpellChance += base1; + break; + case SE_CriticalHealChance: + newbon->CriticalHealChance += base1; + break; + case SE_CriticalHealOverTime: + newbon->CriticalHealOverTime += base1; + break; + case SE_CriticalDoTChance: + newbon->CriticalDoTChance += base1; + break; + case SE_ReduceSkillTimer: + newbon->SkillReuseTime[base2] += base1; + break; + case SE_Fearless: + newbon->Fearless = true; + break; + case SE_PersistantCasting: + newbon->PersistantCasting += base1; + break; + case SE_DelayDeath: + newbon->DelayDeath += base1; + break; + case SE_FrontalStunResist: + newbon->FrontalStunResist += base1; + break; + case SE_ImprovedBindWound: + newbon->BindWound += base1; + break; + case SE_MaxBindWound: + newbon->MaxBindWound += base1; + break; + case SE_ExtraAttackChance: + newbon->ExtraAttackChance += base1; + break; + case SE_SeeInvis: + newbon->SeeInvis = base1; + break; + case SE_BaseMovementSpeed: + newbon->BaseMovementSpeed += base1; + break; + case SE_IncreaseRunSpeedCap: + newbon->IncreaseRunSpeedCap += base1; + break; + case SE_ConsumeProjectile: + newbon->ConsumeProjectile += base1; + break; + case SE_ForageAdditionalItems: + newbon->ForageAdditionalItems += base1; + break; + case SE_Salvage: + newbon->SalvageChance += base1; + break; + case SE_ArcheryDamageModifier: + newbon->ArcheryDamageModifier += base1; + break; + case SE_DoubleRangedAttack: + newbon->DoubleRangedAttack += base1; + break; + case SE_DamageShield: + newbon->DamageShield += base1; + break; + case SE_CharmBreakChance: + newbon->CharmBreakChance += base1; + break; + case SE_OffhandRiposteFail: + newbon->OffhandRiposteFail += base1; + break; + case SE_ItemAttackCapIncrease: + newbon->ItemATKCap += base1; + break; + case SE_GivePetGroupTarget: + newbon->GivePetGroupTarget = true; + break; + case SE_ItemHPRegenCapIncrease: + newbon->ItemHPRegenCap = +base1; + break; + case SE_Ambidexterity: + newbon->Ambidexterity += base1; + break; + case SE_PetMaxHP: + newbon->PetMaxHP += base1; + break; + case SE_AvoidMeleeChance: + newbon->AvoidMeleeChanceEffect += base1; + break; + case SE_CombatStability: + newbon->CombatStability += base1; + break; + case SE_AddSingingMod: + switch (base2) { + case ItemTypeWindInstrument: + newbon->windMod += base1; + break; + case ItemTypeStringedInstrument: + newbon->stringedMod += base1; + break; + case ItemTypeBrassInstrument: + newbon->brassMod += base1; + break; + case ItemTypePercussionInstrument: + newbon->percussionMod += base1; + break; + case ItemTypeSinging: + newbon->singingMod += base1; + break; + } + break; + case SE_SongModCap: + newbon->songModCap += base1; + break; + case SE_PetCriticalHit: + newbon->PetCriticalHit += base1; + break; + case SE_PetAvoidance: + newbon->PetAvoidance += base1; + break; + case SE_ShieldBlock: + newbon->ShieldBlock += base1; + break; + case SE_ShieldEquipHateMod: + newbon->ShieldEquipHateMod += base1; + break; + case SE_ShieldEquipDmgMod: + newbon->ShieldEquipDmgMod[0] += base1; + newbon->ShieldEquipDmgMod[1] += base2; + break; + case SE_SecondaryDmgInc: + newbon->SecondaryDmgInc = true; + break; + case SE_ChangeAggro: + newbon->hatemod += base1; + break; + case SE_EndurancePool: + newbon->Endurance += base1; + break; + case SE_ChannelChanceItems: + newbon->ChannelChanceItems += base1; + break; + case SE_ChannelChanceSpells: + newbon->ChannelChanceSpells += base1; + break; + case SE_DoubleSpecialAttack: + newbon->DoubleSpecialAttack += base1; + break; + case SE_TripleBackstab: + newbon->TripleBackstab += base1; + break; + case SE_FrontalBackstabMinDmg: + newbon->FrontalBackstabMinDmg = true; + break; + case SE_FrontalBackstabChance: + newbon->FrontalBackstabChance += base1; + break; + case SE_BlockBehind: + newbon->BlockBehind += base1; + break; + + case SE_StrikeThrough: + case SE_StrikeThrough2: + newbon->StrikeThrough += base1; + break; + case SE_DoubleAttackChance: + newbon->DoubleAttackChance += base1; + break; + case SE_GiveDoubleAttack: + newbon->GiveDoubleAttack += base1; + break; + case SE_ProcChance: + newbon->ProcChanceSPA += base1; + break; + case SE_RiposteChance: + newbon->RiposteChance += base1; + break; + case SE_Flurry: + newbon->FlurryChance += base1; + break; + case SE_PetFlurry: + newbon->PetFlurry += base1; + break; + case SE_BardSongRange: + newbon->SongRange += base1; + break; + case SE_RootBreakChance: + newbon->RootBreakChance += base1; + break; + case SE_UnfailingDivinity: + newbon->UnfailingDivinity += base1; + break; + case SE_CrippBlowChance: + newbon->CrippBlowChance += base1; + break; + + case SE_HitChance: { + if (base2 == ALL_SKILLS) + newbon->HitChanceEffect[HIGHEST_SKILL + 1] += base1; + else + newbon->HitChanceEffect[base2] += base1; + } + + case SE_ProcOnKillShot: + for (int i = 0; i < MAX_SPELL_TRIGGER * 3; i += 3) { + if (!newbon->SpellOnKill[i] || + ((newbon->SpellOnKill[i] == base2) && (newbon->SpellOnKill[i + 1] < base1))) { + // base1 = chance, base2 = SpellID to be triggered, base3 = min npc level + newbon->SpellOnKill[i] = base2; + newbon->SpellOnKill[i + 1] = base1; + + if (GetLevel() > 15) + newbon->SpellOnKill[i + 2] = + GetLevel() - 15; // AA specifiy "non-trivial" + else + newbon->SpellOnKill[i + 2] = 0; + + break; + } + } + break; + + case SE_SpellOnDeath: + for (int i = 0; i < MAX_SPELL_TRIGGER * 2; i += 2) { + if (!newbon->SpellOnDeath[i]) { + // base1 = SpellID to be triggered, base2 = chance to fire + newbon->SpellOnDeath[i] = base1; + newbon->SpellOnDeath[i + 1] = base2; + break; + } + } + break; + + case SE_TriggerOnCast: + + for (int i = 0; i < MAX_SPELL_TRIGGER; i++) { + if (newbon->SpellTriggers[i] == rank.id) + break; + + if (!newbon->SpellTriggers[i]) { + // Save the 'rank.id' of each triggerable effect to an array + newbon->SpellTriggers[i] = rank.id; + break; + } + } + break; + + case SE_CriticalHitChance: { + if (base2 == ALL_SKILLS) + newbon->CriticalHitChance[HIGHEST_SKILL + 1] += base1; + else + newbon->CriticalHitChance[base2] += base1; + } break; + + case SE_CriticalDamageMob: { + // base1 = effect value, base2 = skill restrictions(-1 for all) + if (base2 == ALL_SKILLS) + newbon->CritDmgMob[HIGHEST_SKILL + 1] += base1; + else + newbon->CritDmgMob[base2] += base1; + break; + } + + case SE_CriticalSpellChance: { + newbon->CriticalSpellChance += base1; + + if (base2 > newbon->SpellCritDmgIncNoStack) + newbon->SpellCritDmgIncNoStack = base2; + + break; + } + + case SE_ResistFearChance: { + if (base1 == 100) // If we reach 100% in a single spell/item then we should be immune to + // negative fear resist effects until our immunity is over + newbon->Fearless = true; + + newbon->ResistFearChance += base1; // these should stack + break; + } + + case SE_SkillDamageAmount: { + if (base2 == ALL_SKILLS) + newbon->SkillDamageAmount[HIGHEST_SKILL + 1] += base1; + else + newbon->SkillDamageAmount[base2] += base1; + break; + } + + case SE_SkillAttackProc: { + // You can only have one of these per client. [AA Dragon Punch] + newbon->SkillAttackProc[0] = base1; // Chance base 1000 = 100% proc rate + newbon->SkillAttackProc[1] = base2; // Skill to Proc Off + newbon->SkillAttackProc[2] = rank.spell; // spell to proc + break; + } + + case SE_DamageModifier: { + if (base2 == ALL_SKILLS) + newbon->DamageModifier[HIGHEST_SKILL + 1] += base1; + else + newbon->DamageModifier[base2] += base1; + break; + } + + case SE_DamageModifier2: { + if (base2 == ALL_SKILLS) + newbon->DamageModifier2[HIGHEST_SKILL + 1] += base1; + else + newbon->DamageModifier2[base2] += base1; + break; + } + + case SE_SlayUndead: { + if (newbon->SlayUndead[1] < base1) + newbon->SlayUndead[0] = base1; // Rate + newbon->SlayUndead[1] = base2; // Damage Modifier + break; + } + + case SE_DoubleRiposte: { + newbon->DoubleRiposte += base1; + } + + case SE_GiveDoubleRiposte: { + // 0=Regular Riposte 1=Skill Attack Riposte 2=Skill + if (base2 == 0) { + if (newbon->GiveDoubleRiposte[0] < base1) + newbon->GiveDoubleRiposte[0] = base1; + } + // Only for special attacks. + else if (base2 > 0 && (newbon->GiveDoubleRiposte[1] < base1)) { + newbon->GiveDoubleRiposte[1] = base1; + newbon->GiveDoubleRiposte[2] = base2; + } + + break; + } + + // Kayen: Not sure best way to implement this yet. + // Physically raises skill cap ie if 55/55 it will raise to 55/60 + case SE_RaiseSkillCap: { + if (newbon->RaiseSkillCap[0] < base1) { + newbon->RaiseSkillCap[0] = base1; // value + newbon->RaiseSkillCap[1] = base2; // skill + } + break; + } + + case SE_MasteryofPast: { + if (newbon->MasteryofPast < base1) + newbon->MasteryofPast = base1; + break; + } + + case SE_CastingLevel2: + case SE_CastingLevel: { + newbon->effective_casting_level += base1; + break; + } + + case SE_DivineSave: { + if (newbon->DivineSaveChance[0] < base1) { + newbon->DivineSaveChance[0] = base1; + newbon->DivineSaveChance[1] = base2; + } + break; + } + + case SE_SpellEffectResistChance: { + for (int e = 0; e < MAX_RESISTABLE_EFFECTS * 2; e += 2) { + if (newbon->SEResist[e + 1] && (newbon->SEResist[e] == base2) && + (newbon->SEResist[e + 1] < base1)) { + newbon->SEResist[e] = base2; // Spell Effect ID + newbon->SEResist[e + 1] = base1; // Resist Chance + break; + } else if (!newbon->SEResist[e + 1]) { + newbon->SEResist[e] = base2; // Spell Effect ID + newbon->SEResist[e + 1] = base1; // Resist Chance + break; + } + } + break; + } + + case SE_MitigateDamageShield: { + if (base1 < 0) + base1 = base1 * (-1); + + newbon->DSMitigationOffHand += base1; + break; + } + + case SE_FinishingBlow: { + // base1 = chance, base2 = damage + if (newbon->FinishingBlow[1] < base2) { + newbon->FinishingBlow[0] = base1; + newbon->FinishingBlow[1] = base2; + } + break; + } + + case SE_FinishingBlowLvl: { + // base1 = level, base2 = ??? (Set to 200 in AA data, possible proc rate mod?) + if (newbon->FinishingBlowLvl[0] < base1) { + newbon->FinishingBlowLvl[0] = base1; + newbon->FinishingBlowLvl[1] = base2; + } + break; + } + + case SE_StunBashChance: + newbon->StunBashChance += base1; + break; + + case SE_IncreaseChanceMemwipe: + newbon->IncreaseChanceMemwipe += base1; + break; + + case SE_CriticalMend: + newbon->CriticalMend += base1; + break; + + case SE_HealRate: + newbon->HealRate += base1; + break; + + case SE_MeleeLifetap: { + + if ((base1 < 0) && (newbon->MeleeLifetap > base1)) + newbon->MeleeLifetap = base1; + + else if (newbon->MeleeLifetap < base1) + newbon->MeleeLifetap = base1; + break; + } + + case SE_Vampirism: + newbon->Vampirism += base1; + break; + + case SE_FrenziedDevastation: + newbon->FrenziedDevastation += base2; + break; + + case SE_SpellProcChance: + newbon->SpellProcChance += base1; + break; + + case SE_Berserk: + newbon->BerserkSPA = true; + break; + + case SE_Metabolism: + newbon->Metabolism += base1; + break; + + case SE_ImprovedReclaimEnergy: { + if ((base1 < 0) && (newbon->ImprovedReclaimEnergy > base1)) + newbon->ImprovedReclaimEnergy = base1; + + else if (newbon->ImprovedReclaimEnergy < base1) + newbon->ImprovedReclaimEnergy = base1; + break; + } + + case SE_HeadShot: { + if (newbon->HeadShot[1] < base2) { + newbon->HeadShot[0] = base1; + newbon->HeadShot[1] = base2; + } + break; + } + + case SE_HeadShotLevel: { + if (newbon->HSLevel < base1) + newbon->HSLevel = base1; + break; + } + + case SE_Assassinate: { + if (newbon->Assassinate[1] < base2) { + newbon->Assassinate[0] = base1; + newbon->Assassinate[1] = base2; + } + break; + } + + case SE_AssassinateLevel: { + if (newbon->AssassinateLevel < base1) + newbon->AssassinateLevel = base1; + break; + } + + case SE_PetMeleeMitigation: + newbon->PetMeleeMitigation += base1; + break; + + case SE_MeleeVulnerability: + newbon->MeleeVulnerability += base1; + break; + + case SE_FactionModPct: { + if ((base1 < 0) && (newbon->FactionModPct > base1)) + newbon->FactionModPct = base1; + + else if (newbon->FactionModPct < base1) + newbon->FactionModPct = base1; + break; + } + + case SE_IllusionPersistence: + newbon->IllusionPersistence = true; + break; + + case SE_LimitToSkill: { + if (base1 <= HIGHEST_SKILL) + newbon->LimitToSkill[base1] = true; + break; + } + + case SE_SkillProc: { + for (int e = 0; e < MAX_SKILL_PROCS; e++) { + if (newbon->SkillProc[e] && newbon->SkillProc[e] == rank.id) + break; // Do not use the same aa id more than once. + + else if (!newbon->SkillProc[e]) { + newbon->SkillProc[e] = rank.id; + break; + } + } + break; + } + + case SE_SkillProcSuccess: { + + for (int e = 0; e < MAX_SKILL_PROCS; e++) { + if (newbon->SkillProcSuccess[e] && newbon->SkillProcSuccess[e] == rank.id) + break; // Do not use the same spell id more than once. + + else if (!newbon->SkillProcSuccess[e]) { + newbon->SkillProcSuccess[e] = rank.id; + break; + } + } + break; + } + + case SE_MeleeMitigation: + newbon->MeleeMitigationEffect -= base1; + break; + + case SE_ATK: + newbon->ATK += base1; + break; + // to do + case SE_ReduceTradeskillFail: + break; + case SE_PotionBeltSlots: + break; + case SE_BandolierSlots: + break; + case SE_ForageSkill: + break; + case SE_TradeSkillMastery: + break; + case SE_SecondaryForte: + break; + + // not handled here + case SE_HastenedAASkill: + // not handled here but don't want to clutter debug log -- these may need to be verified to ignore + case SE_LimitMaxLevel: + case SE_LimitResist: + case SE_LimitTarget: + case SE_LimitEffect: + case SE_LimitSpellType: + case SE_LimitMinDur: + case SE_LimitInstant: + case SE_LimitMinLevel: + case SE_LimitCastTimeMin: + case SE_LimitCastTimeMax: + case SE_LimitSpell: + case SE_LimitCombatSkills: + case SE_LimitManaMin: + case SE_LimitSpellGroup: + case SE_LimitSpellClass: + case SE_LimitSpellSubclass: + case SE_LimitHPPercent: + case SE_LimitManaPercent: + case SE_LimitEndPercent: + case SE_LimitClass: + case SE_LimitRace: + case SE_LimitCastingSkill: + case SE_LimitUseMin: + case SE_LimitUseType: + break; + + default: + Log.Out(Logs::Detail, Logs::AA, "SPA %d not accounted for in AA %s (%d)", effect, rank.base_ability->name.c_str(), rank.id); + break; + } + + } } void Mob::CalcSpellBonuses(StatBonuses* newbon) diff --git a/zone/bot.cpp b/zone/bot.cpp index 1d8c16f57..5200f3e95 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -7712,14 +7712,14 @@ void Bot::DoSpecialAttackDamage(Mob *who, SkillUseTypes skill, int32 max_damage, CheckNumHitsRemaining(NumHit::OutgoingHitSuccess); //[AA Dragon Punch] value[0] = 100 for 25%, chance value[1] = skill - if(aabonuses.SpecialAttackKBProc[0] && aabonuses.SpecialAttackKBProc[1] == skill){ +/* if(aabonuses.SpecialAttackKBProc[0] && aabonuses.SpecialAttackKBProc[1] == skill){ int kb_chance = 25; kb_chance += kb_chance*(100-aabonuses.SpecialAttackKBProc[0])/100; if (zone->random.Int(0, 99) < kb_chance) SpellFinished(904, who, 10, 0, -1, spells[904].ResistDiff); //who->Stun(100); Kayen: This effect does not stun on live, it only moves the NPC. - } + }*/ if (HasSkillProcs()) TrySkillProc(who, skill, ReuseTime*1000); @@ -9078,7 +9078,7 @@ void Bot::DoBuffTic(const Buffs_Struct &buff, int slot, Mob* caster) { Mob::DoBuffTic(buff, slot, caster); } -bool Bot::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_time, int32 mana_cost, +bool Bot::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot, int16 *resist_adjust, uint32 aa_id) { bool Result = false; diff --git a/zone/client.h b/zone/client.h index faa4eeb3a..014747576 100644 --- a/zone/client.h +++ b/zone/client.h @@ -789,7 +789,7 @@ public: bool CheckAAEffect(aaEffectType type); void HandleAAAction(aaID activate); int16 CalcAAFocusEffect(focusType type, uint16 focus_spell, uint16 spell_id); - int16 CalcAAFocus(focusType type, uint32 aa_ID, uint16 spell_id); + int16 CalcAAFocus(focusType type, const AA::Rank &rank, uint16 spell_id); void RefundAA(); int32 GetAAEffectDataBySlot(uint32 aa_ID, uint32 slot_id, bool GetEffect, bool GetBase1, bool GetBase2); int32 GetAAEffectid(uint32 aa_ID, uint32 slot_id) { return GetAAEffectDataBySlot(aa_ID, slot_id, true, false,false); } @@ -1265,7 +1265,7 @@ protected: int CalcRecommendedLevelBonus(uint8 level, uint8 reclevel, int basestat); void CalcEdibleBonuses(StatBonuses* newbon); void CalcAABonuses(StatBonuses* newbon); - void ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon); + void ApplyAABonuses(const AA::Rank &rank, StatBonuses* newbon); void ProcessItemCaps(); void MakeBuffFadePacket(uint16 spell_id, int slot_id, bool send_message = true); bool client_data_loaded; diff --git a/zone/client_mods.cpp b/zone/client_mods.cpp index f12c20064..56a22de9a 100644 --- a/zone/client_mods.cpp +++ b/zone/client_mods.cpp @@ -1121,7 +1121,7 @@ int32 Client::CalcMaxMana() switch (GetCasterClass()) { case 'I': case 'W': { - max_mana = (CalcBaseMana() + itembonuses.Mana + spellbonuses.Mana + GroupLeadershipAAManaEnhancement()); + max_mana = (CalcBaseMana() + itembonuses.Mana + spellbonuses.Mana + aabonuses.Mana + GroupLeadershipAAManaEnhancement()); break; } case 'N': { diff --git a/zone/common.h b/zone/common.h index d9e3637a8..e658a352d 100644 --- a/zone/common.h +++ b/zone/common.h @@ -412,7 +412,7 @@ struct StatBonuses { int8 BaseMovementSpeed; // Adjust base run speed, does not stack with other movement bonuses. uint8 IncreaseRunSpeedCap; // Increase max run speed above cap. int32 DoubleSpecialAttack; // Chance to to perform a double special attack (ie flying kick 2x) - int32 SpecialAttackKBProc[2]; // Chance to to do a knockback from special attacks. (0 = chance 1 = Skill) + int32 SkillAttackProc[3]; // [0] chance to proc [2] spell on [1] skill usage uint8 FrontalStunResist; // Chance to resist a frontal stun int32 BindWound; // Increase amount of HP by percent. int32 MaxBindWound; // Increase max amount of HP you can bind wound. diff --git a/zone/mob.cpp b/zone/mob.cpp index 965007fcf..35b0d62d2 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -3510,9 +3510,11 @@ void Mob::TriggerOnCast(uint32 focus_spell, uint32 spell_id, bool aa_trigger) uint32 trigger_spell_id = 0; - if (aa_trigger && IsClient()){ - //focus_spell = aaid - trigger_spell_id = CastToClient()->CalcAAFocus(focusTriggerOnCast, focus_spell, spell_id); + if (aa_trigger && IsClient()) { + // focus_spell = aaid + auto rank = zone->GetAlternateAdvancementRank(focus_spell); + if (rank) + trigger_spell_id = CastToClient()->CalcAAFocus(focusTriggerOnCast, *rank, spell_id); if(IsValidSpell(trigger_spell_id) && GetTarget()) SpellFinished(trigger_spell_id, GetTarget(), 10, 0, -1, spells[trigger_spell_id].ResistDiff); diff --git a/zone/special_attacks.cpp b/zone/special_attacks.cpp index a3557d021..0021350a4 100644 --- a/zone/special_attacks.cpp +++ b/zone/special_attacks.cpp @@ -149,22 +149,19 @@ void Mob::DoSpecialAttackDamage(Mob *who, SkillUseTypes skill, int32 max_damage, } who->AddToHateList(this, hate, 0, false); + if (max_damage > 0 && aabonuses.SkillAttackProc[0] && aabonuses.SkillAttackProc[1] == skill && + IsValidSpell(aabonuses.SkillAttackProc[2])) { + float chance = aabonuses.SkillAttackProc[0] / 1000.0f; + if (zone->random.Roll(chance)) + SpellFinished(aabonuses.SkillAttackProc[2], who, 10, 0, -1, + spells[aabonuses.SkillAttackProc[2]].ResistDiff); + } who->Damage(this, max_damage, SPELL_UNKNOWN, skill, false); //Make sure 'this' has not killed the target and 'this' is not dead (Damage shield ect). if(!GetTarget())return; if (HasDied()) return; - //[AA Dragon Punch] value[0] = 100 for 25%, chance value[1] = skill - if(aabonuses.SpecialAttackKBProc[0] && aabonuses.SpecialAttackKBProc[1] == skill){ - int kb_chance = 25; - kb_chance += kb_chance*(100-aabonuses.SpecialAttackKBProc[0])/100; - - if (zone->random.Roll(kb_chance)) - SpellFinished(904, who, 10, 0, -1, spells[904].ResistDiff); - //who->Stun(100); Kayen: This effect does not stun on live, it only moves the NPC. - } - if (HasSkillProcs()) TrySkillProc(who, skill, ReuseTime*1000); @@ -2442,19 +2439,18 @@ void Mob::DoMeleeSkillAttackDmg(Mob* other, uint16 weapon_damage, SkillUseTypes } other->AddToHateList(this, hate, 0, false); + if (damage > 0 && aabonuses.SkillAttackProc[0] && aabonuses.SkillAttackProc[1] == skillinuse && + IsValidSpell(aabonuses.SkillAttackProc[2])) { + float chance = aabonuses.SkillAttackProc[0] / 1000.0f; + if (zone->random.Roll(chance)) + SpellFinished(aabonuses.SkillAttackProc[2], other, 10, 0, -1, + spells[aabonuses.SkillAttackProc[2]].ResistDiff); + } other->Damage(this, damage, SPELL_UNKNOWN, skillinuse); if (HasDied()) return; - if(aabonuses.SpecialAttackKBProc[0] && aabonuses.SpecialAttackKBProc[1] == skillinuse){ - int kb_chance = 25; - kb_chance += kb_chance*(100-aabonuses.SpecialAttackKBProc[0])/100; - - if (zone->random.Roll(kb_chance)) - SpellFinished(904, other, 10, 0, -1, spells[904].ResistDiff); - } - if (CanSkillProc && HasSkillProcs()) TrySkillProc(other, skillinuse, ReuseTime); diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 8ac60c125..0bb7b78b9 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -4186,7 +4186,7 @@ int32 Client::GetAAEffectDataBySlot(uint32 aa_ID, uint32 slot_id, bool GetEffect } -int16 Client::CalcAAFocus(focusType type, uint32 aa_ID, uint16 spell_id) +int16 Client::CalcAAFocus(focusType type, const AA::Rank &rank, uint16 spell_id) { const SPDat_Spell_Struct &spell = spells[spell_id]; @@ -4200,8 +4200,9 @@ int16 Client::CalcAAFocus(focusType type, uint32 aa_ID, uint16 spell_id) uint32 slot = 0; bool LimitFailure = false; - bool LimitInclude[MaxLimitInclude] = { false }; - /* Certain limits require only one of several Include conditions to be true. Ie. Add damage to fire OR ice spells. + bool LimitInclude[MaxLimitInclude] = {false}; + /* Certain limits require only one of several Include conditions to be true. Ie. Add damage to fire OR ice + spells. 0/1 SE_LimitResist 2/3 SE_LimitSpell 4/5 SE_LimitEffect @@ -4214,452 +4215,431 @@ int16 Client::CalcAAFocus(focusType type, uint32 aa_ID, uint16 spell_id) */ int FocusCount = 0; - //old AA - //std::map >::const_iterator find_iter = aa_effects.find(aa_ID); - //if(find_iter == aa_effects.end()) - //{ - // return 0; - //} - // - //for (std::map::const_iterator iter = aa_effects[aa_ID].begin(); iter != aa_effects[aa_ID].end(); ++iter) - //{ - // effect = iter->second.skill_id; - // base1 = iter->second.base1; - // base2 = iter->second.base2; - // slot = iter->second.slot; - // - // /* - // AA Foci's can contain multiple focus effects within the same AA. - // To handle this we will not automatically return zero if a limit is found. - // Instead if limit is found and multiple focus effects, we will reset the limit check - // when the next valid focus effect is found. - // */ - // - // if (IsFocusEffect(0, 0, true,effect) || (effect == SE_TriggerOnCast)){ - // FocusCount++; - // //If limit found on prior check next, else end loop. - // if (FocusCount > 1){ - // - // for(int e = 0; e < MaxLimitInclude; e+=2) { - // if (LimitInclude[e] && !LimitInclude[e+1]) - // LimitFailure = true; - // } - // - // if (LimitFailure){ - // value = 0; - // LimitFailure = false; - // - // for(int e = 0; e < MaxLimitInclude; e++) { - // LimitInclude[e] = false; //Reset array - // } - // } - // - // else{ - // break; - // } - // } - // } - // - // - // switch (effect) - // { - // case SE_Blank: - // break; - // - // //Handle Focus Limits - // - // case SE_LimitResist: - // if(base1 < 0){ - // if(spell.resisttype == -base1) //Exclude - // LimitFailure = true; - // } - // else { - // LimitInclude[0] = true; - // if (spell.resisttype == base1) //Include - // LimitInclude[1] = true; - // } - // break; - // - // case SE_LimitInstant: - // if(base1 == 1 && spell.buffduration) //Fail if not instant - // LimitFailure = true; - // if(base1 == 0 && (spell.buffduration == 0)) //Fail if instant - // LimitFailure = true; - // - // break; - // - // case SE_LimitMaxLevel: - // spell_level = spell.classes[(GetClass()%16) - 1]; - // lvldiff = spell_level - base1; - // //every level over cap reduces the effect by base2 percent unless from a clicky when ItemCastsUseFocus is true - // if(lvldiff > 0 && (spell_level <= RuleI(Character, MaxLevel) || RuleB(Character, ItemCastsUseFocus) == false)) { - // if(base2 > 0){ - // lvlModifier -= base2*lvldiff; - // if(lvlModifier < 1) - // LimitFailure = true; - // } - // else - // LimitFailure = true; - // } - // break; - // - // case SE_LimitMinLevel: - // if((spell.classes[(GetClass()%16) - 1]) < base1) - // LimitFailure = true; - // break; - // - // case SE_LimitCastTimeMin: - // if (static_cast(spell.cast_time) < base1) - // LimitFailure = true; - // break; - // - // case SE_LimitCastTimeMax: - // if (static_cast(spell.cast_time) > base1) - // LimitFailure = true; - // break; - // - // case SE_LimitSpell: - // if(base1 < 0) { //Exclude - // if (spell_id == -base1) - // LimitFailure = true; - // } - // else { - // LimitInclude[2] = true; - // if (spell_id == base1) //Include - // LimitInclude[3] = true; - // } - // break; - // - // case SE_LimitMinDur: - // if (base1 > CalcBuffDuration_formula(GetLevel(), spell.buffdurationformula, spell.buffduration)) - // LimitFailure = true; - // - // break; - // - // case SE_LimitEffect: - // if(base1 < 0){ - // if(IsEffectInSpell(spell_id,-base1)) //Exclude - // LimitFailure = true; - // } - // else{ - // LimitInclude[4] = true; - // if(IsEffectInSpell(spell_id,base1)) //Include - // LimitInclude[5] = true; - // } - // break; - // - // case SE_LimitSpellType: - // switch(base1) - // { - // case 0: - // if (!IsDetrimentalSpell(spell_id)) - // LimitFailure = true; - // break; - // case 1: - // if (!IsBeneficialSpell(spell_id)) - // LimitFailure = true; - // break; - // } - // break; - // - // case SE_LimitManaMin: - // if(spell.mana < base1) - // LimitFailure = true; - // break; - // - // case SE_LimitTarget: - // if (base1 < 0) { - // if (-base1 == spell.targettype) //Exclude - // LimitFailure = true; - // } - // else { - // LimitInclude[6] = true; - // if (base1 == spell.targettype) //Include - // LimitInclude[7] = true; - // } - // break; - // - // case SE_LimitCombatSkills: - // if (base1 == 0 && (IsCombatSkill(spell_id) || IsCombatProc(spell_id))) //Exclude Discs / Procs - // LimitFailure = true; - // else if (base1 == 1 && (!IsCombatSkill(spell_id) || !IsCombatProc(spell_id))) //Exclude Spells - // LimitFailure = true; - // - // break; - // - // case SE_LimitSpellGroup: - // if(base1 < 0) { - // if (-base1 == spell.spellgroup) //Exclude - // LimitFailure = true; - // } - // else { - // LimitInclude[8] = true; - // if (base1 == spell.spellgroup) //Include - // LimitInclude[9] = true; - // } - // break; - // - // case SE_LimitCastingSkill: - // if(base1 < 0) { - // if(-base1 == spell.skill) - // LimitFailure = true; - // } - // else { - // LimitInclude[10] = true; - // if(base1 == spell.skill) - // LimitInclude[11] = true; - // } - // break; - // - // case SE_LimitSpellClass: - // if(base1 < 0) { //Exclude - // if (CheckSpellCategory(spell_id, base1, SE_LimitSpellClass)) - // return(0); - // } - // else { - // LimitInclude[12] = true; - // if (CheckSpellCategory(spell_id, base1, SE_LimitSpellClass)) //Include - // LimitInclude[13] = true; - // } - // break; - // - // case SE_LimitSpellSubclass: - // if(base1 < 0) { //Exclude - // if (CheckSpellCategory(spell_id, base1, SE_LimitSpellSubclass)) - // return(0); - // } - // else { - // LimitInclude[14] = true; - // if (CheckSpellCategory(spell_id, base1, SE_LimitSpellSubclass)) //Include - // LimitInclude[15] = true; - // } - // break; - // - // case SE_LimitClass: - // //Do not use this limit more then once per spell. If multiple class, treat value like items would. - // if (!PassLimitClass(base1, GetClass())) - // LimitFailure = true; - // break; - // - // case SE_LimitRace: - // if (base1 != GetRace()) - // LimitFailure = true; - // break; - // - // case SE_LimitUseMin: - // if (base1 > spell.numhits) - // LimitFailure = true; - // break; - // - // case SE_LimitUseType: - // if (base1 != spell.numhitstype) - // LimitFailure = true; - // break; - // - // //Handle Focus Effects - // case SE_ImprovedDamage: - // if (type == focusImprovedDamage && base1 > value) - // value = base1; - // break; - // - // case SE_ImprovedHeal: - // if (type == focusImprovedHeal && base1 > value) - // value = base1; - // break; - // - // case SE_ReduceManaCost: - // if (type == focusManaCost) - // value = base1; - // break; - // - // case SE_IncreaseSpellHaste: - // if (type == focusSpellHaste && base1 > value) - // value = base1; - // break; - // - // case SE_IncreaseSpellDuration: - // if (type == focusSpellDuration && base1 > value) - // value = base1; - // break; - // - // case SE_SpellDurationIncByTic: - // if (type == focusSpellDurByTic && base1 > value) - // value = base1; - // break; - // - // case SE_SwarmPetDuration: - // if (type == focusSwarmPetDuration && base1 > value) - // value = base1; - // break; - // - // case SE_IncreaseRange: - // if (type == focusRange && base1 > value) - // value = base1; - // break; - // - // case SE_ReduceReagentCost: - // if (type == focusReagentCost && base1 > value) - // value = base1; - // break; - // - // case SE_PetPowerIncrease: - // if (type == focusPetPower && base1 > value) - // value = base1; - // break; - // - // case SE_SpellResistReduction: - // if (type == focusResistRate && base1 > value) - // value = base1; - // break; - // - // case SE_SpellHateMod: - // if (type == focusSpellHateMod ) { - // if(value != 0) { - // if(value > 0){ - // if(base1 > value) - // value = base1; - // } - // else{ - // if(base1 < value) - // value = base1; - // } - // } - // else - // value = base1; - // } - // break; - // - // case SE_ReduceReuseTimer: - // if(type == focusReduceRecastTime) - // value = base1 / 1000; - // break; - // - // case SE_TriggerOnCast: - // if(type == focusTriggerOnCast){ - // if(zone->random.Roll(base1)) { - // value = base2; - // } else { - // value = 0; - // LimitFailure = true; - // } - // break; - // } - // - // case SE_FcSpellVulnerability: - // if(type == focusSpellVulnerability) - // value = base1; - // break; - // - // case SE_BlockNextSpellFocus: - // if(type == focusBlockNextSpell){ - // if(zone->random.Roll(base1)) - // value = 1; - // } - // break; - // - // case SE_FcTwincast: - // if(type == focusTwincast) - // value = base1; - // break; - // - // //Note if using these as AA, make sure this is first focus used. - // case SE_SympatheticProc: - // if(type == focusSympatheticProc) - // value = base2; - // break; - // - // case SE_FcDamageAmt: - // if(type == focusFcDamageAmt) - // value = base1; - // break; - // - // case SE_FcDamageAmtCrit: - // if(type == focusFcDamageAmtCrit) - // value = base1; - // break; - // - // case SE_FcDamageAmtIncoming: - // if(type == focusFcDamageAmtIncoming) - // value = base1; - // break; - // - // case SE_FcHealAmtIncoming: - // if(type == focusFcHealAmtIncoming) - // value = base1; - // break; - // - // case SE_FcHealPctCritIncoming: - // if (type == focusFcHealPctCritIncoming) - // value = base1; - // break; - // - // case SE_FcHealAmtCrit: - // if(type == focusFcHealAmtCrit) - // value = base1; - // break; - // - // case SE_FcHealAmt: - // if(type == focusFcHealAmt) - // value = base1; - // break; - // - // case SE_FcHealPctIncoming: - // if(type == focusFcHealPctIncoming) - // value = base1; - // break; - // - // case SE_FcBaseEffects: - // if (type == focusFcBaseEffects) - // value = base1; - // break; - // - // case SE_FcDamagePctCrit: - // if(type == focusFcDamagePctCrit) - // value = base1; - // break; - // - // case SE_FcIncreaseNumHits: - // if(type == focusIncreaseNumHits) - // value = base1; - // break; - // - // case SE_FcLimitUse: - // if(type == focusFcLimitUse) - // value = base1; - // break; - // - // case SE_FcMute: - // if(type == focusFcMute) - // value = base1; - // break; - // - // case SE_FcStunTimeMod: - // if(type == focusFcStunTimeMod) - // value = base1; - // break; - // - // } - //} + for (const auto &e : rank.effects) { + effect = e.effect_id; + base1 = e.base1; + base2 = e.base2; + slot = e.slot; - for(int e = 0; e < MaxLimitInclude; e+=2) { - if (LimitInclude[e] && !LimitInclude[e+1]) + /* + AA Foci's can contain multiple focus effects within the same AA. + To handle this we will not automatically return zero if a limit is found. + Instead if limit is found and multiple focus effects, we will reset the limit check + when the next valid focus effect is found. + */ + + if (IsFocusEffect(0, 0, true, effect) || (effect == SE_TriggerOnCast)) { + FocusCount++; + // If limit found on prior check next, else end loop. + if (FocusCount > 1) { + + for (int e = 0; e < MaxLimitInclude; e += 2) { + if (LimitInclude[e] && !LimitInclude[e + 1]) + LimitFailure = true; + } + + if (LimitFailure) { + value = 0; + LimitFailure = false; + + for (int e = 0; e < MaxLimitInclude; e++) { + LimitInclude[e] = false; // Reset array + } + } + + else { + break; + } + } + } + + switch (effect) { + case SE_Blank: + break; + + // Handle Focus Limits + + case SE_LimitResist: + if (base1 < 0) { + if (spell.resisttype == -base1) // Exclude + LimitFailure = true; + } else { + LimitInclude[0] = true; + if (spell.resisttype == base1) // Include + LimitInclude[1] = true; + } + break; + + case SE_LimitInstant: + if (base1 == 1 && spell.buffduration) // Fail if not instant + LimitFailure = true; + if (base1 == 0 && (spell.buffduration == 0)) // Fail if instant + LimitFailure = true; + + break; + + case SE_LimitMaxLevel: + spell_level = spell.classes[(GetClass() % 16) - 1]; + lvldiff = spell_level - base1; + // every level over cap reduces the effect by base2 percent unless from a clicky when + // ItemCastsUseFocus is true + if (lvldiff > 0 && (spell_level <= RuleI(Character, MaxLevel) || + RuleB(Character, ItemCastsUseFocus) == false)) { + if (base2 > 0) { + lvlModifier -= base2 * lvldiff; + if (lvlModifier < 1) + LimitFailure = true; + } else + LimitFailure = true; + } + break; + + case SE_LimitMinLevel: + if ((spell.classes[(GetClass() % 16) - 1]) < base1) + LimitFailure = true; + break; + + case SE_LimitCastTimeMin: + if (static_cast(spell.cast_time) < base1) + LimitFailure = true; + break; + + case SE_LimitCastTimeMax: + if (static_cast(spell.cast_time) > base1) + LimitFailure = true; + break; + + case SE_LimitSpell: + if (base1 < 0) { // Exclude + if (spell_id == -base1) + LimitFailure = true; + } else { + LimitInclude[2] = true; + if (spell_id == base1) // Include + LimitInclude[3] = true; + } + break; + + case SE_LimitMinDur: + if (base1 > CalcBuffDuration_formula(GetLevel(), spell.buffdurationformula, spell.buffduration)) + LimitFailure = true; + + break; + + case SE_LimitEffect: + if (base1 < 0) { + if (IsEffectInSpell(spell_id, -base1)) // Exclude + LimitFailure = true; + } else { + LimitInclude[4] = true; + if (IsEffectInSpell(spell_id, base1)) // Include + LimitInclude[5] = true; + } + break; + + case SE_LimitSpellType: + switch (base1) { + case 0: + if (!IsDetrimentalSpell(spell_id)) + LimitFailure = true; + break; + case 1: + if (!IsBeneficialSpell(spell_id)) + LimitFailure = true; + break; + } + break; + + case SE_LimitManaMin: + if (spell.mana < base1) + LimitFailure = true; + break; + + case SE_LimitTarget: + if (base1 < 0) { + if (-base1 == spell.targettype) // Exclude + LimitFailure = true; + } else { + LimitInclude[6] = true; + if (base1 == spell.targettype) // Include + LimitInclude[7] = true; + } + break; + + case SE_LimitCombatSkills: + if (base1 == 0 && (IsCombatSkill(spell_id) || IsCombatProc(spell_id))) // Exclude Discs / Procs + LimitFailure = true; + else if (base1 == 1 && (!IsCombatSkill(spell_id) || !IsCombatProc(spell_id))) // Exclude Spells + LimitFailure = true; + + break; + + case SE_LimitSpellGroup: + if (base1 < 0) { + if (-base1 == spell.spellgroup) // Exclude + LimitFailure = true; + } else { + LimitInclude[8] = true; + if (base1 == spell.spellgroup) // Include + LimitInclude[9] = true; + } + break; + + case SE_LimitCastingSkill: + if (base1 < 0) { + if (-base1 == spell.skill) + LimitFailure = true; + } else { + LimitInclude[10] = true; + if (base1 == spell.skill) + LimitInclude[11] = true; + } + break; + + case SE_LimitSpellClass: + if (base1 < 0) { // Exclude + if (CheckSpellCategory(spell_id, base1, SE_LimitSpellClass)) + return (0); + } else { + LimitInclude[12] = true; + if (CheckSpellCategory(spell_id, base1, SE_LimitSpellClass)) // Include + LimitInclude[13] = true; + } + break; + + case SE_LimitSpellSubclass: + if (base1 < 0) { // Exclude + if (CheckSpellCategory(spell_id, base1, SE_LimitSpellSubclass)) + return (0); + } else { + LimitInclude[14] = true; + if (CheckSpellCategory(spell_id, base1, SE_LimitSpellSubclass)) // Include + LimitInclude[15] = true; + } + break; + + case SE_LimitClass: + // Do not use this limit more then once per spell. If multiple class, treat value like items + // would. + if (!PassLimitClass(base1, GetClass())) + LimitFailure = true; + break; + + case SE_LimitRace: + if (base1 != GetRace()) + LimitFailure = true; + break; + + case SE_LimitUseMin: + if (base1 > spell.numhits) + LimitFailure = true; + break; + + case SE_LimitUseType: + if (base1 != spell.numhitstype) + LimitFailure = true; + break; + + // Handle Focus Effects + case SE_ImprovedDamage: + if (type == focusImprovedDamage && base1 > value) + value = base1; + break; + + case SE_ImprovedHeal: + if (type == focusImprovedHeal && base1 > value) + value = base1; + break; + + case SE_ReduceManaCost: + if (type == focusManaCost) + value = base1; + break; + + case SE_IncreaseSpellHaste: + if (type == focusSpellHaste && base1 > value) + value = base1; + break; + + case SE_IncreaseSpellDuration: + if (type == focusSpellDuration && base1 > value) + value = base1; + break; + + case SE_SpellDurationIncByTic: + if (type == focusSpellDurByTic && base1 > value) + value = base1; + break; + + case SE_SwarmPetDuration: + if (type == focusSwarmPetDuration && base1 > value) + value = base1; + break; + + case SE_IncreaseRange: + if (type == focusRange && base1 > value) + value = base1; + break; + + case SE_ReduceReagentCost: + if (type == focusReagentCost && base1 > value) + value = base1; + break; + + case SE_PetPowerIncrease: + if (type == focusPetPower && base1 > value) + value = base1; + break; + + case SE_SpellResistReduction: + if (type == focusResistRate && base1 > value) + value = base1; + break; + + case SE_SpellHateMod: + if (type == focusSpellHateMod) { + if (value != 0) { + if (value > 0) { + if (base1 > value) + value = base1; + } else { + if (base1 < value) + value = base1; + } + } else + value = base1; + } + break; + + case SE_ReduceReuseTimer: + if (type == focusReduceRecastTime) + value = base1 / 1000; + break; + + case SE_TriggerOnCast: + if (type == focusTriggerOnCast) { + if (zone->random.Roll(base1)) { + value = base2; + } else { + value = 0; + LimitFailure = true; + } + break; + } + + case SE_FcSpellVulnerability: + if (type == focusSpellVulnerability) + value = base1; + break; + + case SE_BlockNextSpellFocus: + if (type == focusBlockNextSpell) { + if (zone->random.Roll(base1)) + value = 1; + } + break; + + case SE_FcTwincast: + if (type == focusTwincast) + value = base1; + break; + + // Note if using these as AA, make sure this is first focus used. + case SE_SympatheticProc: + if (type == focusSympatheticProc) + value = base2; + break; + + case SE_FcDamageAmt: + if (type == focusFcDamageAmt) + value = base1; + break; + + case SE_FcDamageAmtCrit: + if (type == focusFcDamageAmtCrit) + value = base1; + break; + + case SE_FcDamageAmtIncoming: + if (type == focusFcDamageAmtIncoming) + value = base1; + break; + + case SE_FcHealAmtIncoming: + if (type == focusFcHealAmtIncoming) + value = base1; + break; + + case SE_FcHealPctCritIncoming: + if (type == focusFcHealPctCritIncoming) + value = base1; + break; + + case SE_FcHealAmtCrit: + if (type == focusFcHealAmtCrit) + value = base1; + break; + + case SE_FcHealAmt: + if (type == focusFcHealAmt) + value = base1; + break; + + case SE_FcHealPctIncoming: + if (type == focusFcHealPctIncoming) + value = base1; + break; + + case SE_FcBaseEffects: + if (type == focusFcBaseEffects) + value = base1; + break; + + case SE_FcDamagePctCrit: + if (type == focusFcDamagePctCrit) + value = base1; + break; + + case SE_FcIncreaseNumHits: + if (type == focusIncreaseNumHits) + value = base1; + break; + + case SE_FcLimitUse: + if (type == focusFcLimitUse) + value = base1; + break; + + case SE_FcMute: + if (type == focusFcMute) + value = base1; + break; + + case SE_FcStunTimeMod: + if (type == focusFcStunTimeMod) + value = base1; + break; + } + } + + for (int e = 0; e < MaxLimitInclude; e += 2) { + if (LimitInclude[e] && !LimitInclude[e + 1]) return 0; } if (LimitFailure) return 0; - return(value*lvlModifier/100); + return (value * lvlModifier / 100); } //given an item/spell's focus ID and the spell being cast, determine the focus ammount, if any //assumes that spell_id is not a bard spell and that both ids are valid spell ids -int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, bool best_focus) { - - if(!IsValidSpell(focus_id) || !IsValidSpell(spell_id)) +int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, bool best_focus) +{ + if (!IsValidSpell(focus_id) || !IsValidSpell(spell_id)) return 0; - const SPDat_Spell_Struct &focus_spell = spells[focus_id]; const SPDat_Spell_Struct &spell = spells[spell_id]; @@ -4669,8 +4649,9 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo int lvldiff = 0; uint32 Caston_spell_id = 0; - bool LimitInclude[MaxLimitInclude] = { false }; - /* Certain limits require only one of several Include conditions to be true. Ie. Add damage to fire OR ice spells. + bool LimitInclude[MaxLimitInclude] = {false}; + /* Certain limits require only one of several Include conditions to be true. Ie. Add damage to fire OR ice + spells. 0/1 SE_LimitResist 2/3 SE_LimitSpell 4/5 SE_LimitEffect @@ -4690,21 +4671,20 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo break; case SE_LimitResist: - if(focus_spell.base[i] < 0){ - if (spell.resisttype == -focus_spell.base[i]) //Exclude + if (focus_spell.base[i] < 0) { + if (spell.resisttype == -focus_spell.base[i]) // Exclude return 0; - } - else { + } else { LimitInclude[0] = true; - if (spell.resisttype == focus_spell.base[i]) //Include + if (spell.resisttype == focus_spell.base[i]) // Include LimitInclude[1] = true; } break; case SE_LimitInstant: - if(focus_spell.base[i] == 1 && spell.buffduration) //Fail if not instant + if (focus_spell.base[i] == 1 && spell.buffduration) // Fail if not instant return 0; - if(focus_spell.base[i] == 0 && (spell.buffduration == 0)) //Fail if instant + if (focus_spell.base[i] == 0 && (spell.buffduration == 0)) // Fail if instant return 0; break; @@ -4712,16 +4692,17 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo case SE_LimitMaxLevel: if (IsNPC()) break; - spell_level = spell.classes[(GetClass()%16) - 1]; + spell_level = spell.classes[(GetClass() % 16) - 1]; lvldiff = spell_level - focus_spell.base[i]; - //every level over cap reduces the effect by focus_spell.base2[i] percent unless from a clicky when ItemCastsUseFocus is true - if(lvldiff > 0 && (spell_level <= RuleI(Character, MaxLevel) || RuleB(Character, ItemCastsUseFocus) == false)){ - if(focus_spell.base2[i] > 0){ - lvlModifier -= focus_spell.base2[i]*lvldiff; - if(lvlModifier < 1) + // every level over cap reduces the effect by focus_spell.base2[i] percent unless from a clicky + // when ItemCastsUseFocus is true + if (lvldiff > 0 && (spell_level <= RuleI(Character, MaxLevel) || + RuleB(Character, ItemCastsUseFocus) == false)) { + if (focus_spell.base2[i] > 0) { + lvlModifier -= focus_spell.base2[i] * lvldiff; + if (lvlModifier < 1) return 0; - } - else + } else return 0; } break; @@ -4729,116 +4710,115 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo case SE_LimitMinLevel: if (IsNPC()) break; - if (spell.classes[(GetClass()%16) - 1] < focus_spell.base[i]) - return(0); + if (spell.classes[(GetClass() % 16) - 1] < focus_spell.base[i]) + return (0); break; case SE_LimitCastTimeMin: if (spells[spell_id].cast_time < (uint16)focus_spell.base[i]) - return(0); + return (0); break; case SE_LimitCastTimeMax: if (spells[spell_id].cast_time > (uint16)focus_spell.base[i]) - return(0); + return (0); break; case SE_LimitSpell: - if(focus_spell.base[i] < 0) { //Exclude + if (focus_spell.base[i] < 0) { // Exclude if (spell_id == -focus_spell.base[i]) - return(0); - } - else { + return (0); + } else { LimitInclude[2] = true; - if (spell_id == focus_spell.base[i]) //Include + if (spell_id == focus_spell.base[i]) // Include LimitInclude[3] = true; } break; case SE_LimitMinDur: - if (focus_spell.base[i] > CalcBuffDuration_formula(GetLevel(), spell.buffdurationformula, spell.buffduration)) - return(0); + if (focus_spell.base[i] > + CalcBuffDuration_formula(GetLevel(), spell.buffdurationformula, spell.buffduration)) + return (0); break; case SE_LimitEffect: - if(focus_spell.base[i] < 0){ - if(IsEffectInSpell(spell_id,-focus_spell.base[i])) //Exclude + if (focus_spell.base[i] < 0) { + if (IsEffectInSpell(spell_id, -focus_spell.base[i])) // Exclude return 0; - } - else{ + } else { LimitInclude[4] = true; - if(IsEffectInSpell(spell_id,focus_spell.base[i])) //Include + if (IsEffectInSpell(spell_id, focus_spell.base[i])) // Include LimitInclude[5] = true; } break; - case SE_LimitSpellType: - switch( focus_spell.base[i]){ - case 0: - if (!IsDetrimentalSpell(spell_id)) - return 0; - break; - case 1: - if (!IsBeneficialSpell(spell_id)) - return 0; - break; - default: - Log.Out(Logs::General, Logs::Normal, "CalcFocusEffect: unknown limit spelltype %d", focus_spell.base[i]); + switch (focus_spell.base[i]) { + case 0: + if (!IsDetrimentalSpell(spell_id)) + return 0; + break; + case 1: + if (!IsBeneficialSpell(spell_id)) + return 0; + break; + default: + Log.Out(Logs::General, Logs::Normal, "CalcFocusEffect: unknown limit spelltype %d", + focus_spell.base[i]); } break; case SE_LimitManaMin: - if(spell.mana < focus_spell.base[i]) + if (spell.mana < focus_spell.base[i]) return 0; break; case SE_LimitTarget: if (focus_spell.base[i] < 0) { - if (-focus_spell.base[i] == spell.targettype) //Exclude + if (-focus_spell.base[i] == spell.targettype) // Exclude return 0; - } - else { + } else { LimitInclude[6] = true; - if (focus_spell.base[i] == spell.targettype) //Include + if (focus_spell.base[i] == spell.targettype) // Include LimitInclude[7] = true; } break; case SE_LimitCombatSkills: - if (focus_spell.base[i] == 0 && (IsCombatSkill(spell_id) || IsCombatProc(spell_id))) //Exclude Discs / Procs + if (focus_spell.base[i] == 0 && + (IsCombatSkill(spell_id) || IsCombatProc(spell_id))) // Exclude Discs / Procs return 0; - else if (focus_spell.base[i] == 1 && (!IsCombatSkill(spell_id) || !IsCombatProc(spell_id))) //Exclude Spells + else if (focus_spell.base[i] == 1 && + (!IsCombatSkill(spell_id) || !IsCombatProc(spell_id))) // Exclude Spells return 0; break; case SE_LimitSpellGroup: - if(focus_spell.base[i] < 0) { - if (-focus_spell.base[i] == spell.spellgroup) //Exclude + if (focus_spell.base[i] < 0) { + if (-focus_spell.base[i] == spell.spellgroup) // Exclude return 0; - } - else { + } else { LimitInclude[8] = true; - if (focus_spell.base[i] == spell.spellgroup) //Include + if (focus_spell.base[i] == spell.spellgroup) // Include LimitInclude[9] = true; } break; case SE_LimitCastingSkill: - if(focus_spell.base[i] < 0) { - if(-focus_spell.base[i] == spell.skill) + if (focus_spell.base[i] < 0) { + if (-focus_spell.base[i] == spell.skill) return 0; - } - else { + } else { LimitInclude[10] = true; - if(focus_spell.base[i] == spell.skill) + if (focus_spell.base[i] == spell.skill) LimitInclude[11] = true; } break; case SE_LimitClass: - //Do not use this limit more then once per spell. If multiple class, treat value like items would. + // Do not use this limit more then once per spell. If multiple class, treat value like items + // would. if (!PassLimitClass(focus_spell.base[i], GetClass())) return 0; break; @@ -4864,40 +4844,38 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo break; case SE_LimitSpellClass: - if(focus_spell.base[i] < 0) { //Exclude + if (focus_spell.base[i] < 0) { // Exclude if (CheckSpellCategory(spell_id, focus_spell.base[i], SE_LimitSpellClass)) - return(0); - } - else { + return (0); + } else { LimitInclude[12] = true; - if (CheckSpellCategory(spell_id, focus_spell.base[i], SE_LimitSpellClass)) //Include + if (CheckSpellCategory(spell_id, focus_spell.base[i], SE_LimitSpellClass)) // Include LimitInclude[13] = true; } break; case SE_LimitSpellSubclass: - if(focus_spell.base[i] < 0) { //Exclude + if (focus_spell.base[i] < 0) { // Exclude if (CheckSpellCategory(spell_id, focus_spell.base[i], SE_LimitSpellSubclass)) - return(0); - } - else { + return (0); + } else { LimitInclude[14] = true; - if (CheckSpellCategory(spell_id, focus_spell.base[i], SE_LimitSpellSubclass)) //Include + if (CheckSpellCategory(spell_id, focus_spell.base[i], SE_LimitSpellSubclass)) // Include LimitInclude[15] = true; } break; - - //handle effects + // handle effects case SE_ImprovedDamage: if (type == focusImprovedDamage) { // This is used to determine which focus should be used for the random calculation - if(best_focus) { + if (best_focus) { // If the spell contains a value in the base2 field then that is the max value if (focus_spell.base2[i] != 0) { value = focus_spell.base2[i]; } - // If the spell does not contain a base2 value, then its a straight non random value + // If the spell does not contain a base2 value, then its a straight non random + // value else { value = focus_spell.base[i]; } @@ -4905,8 +4883,7 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo // Actual focus calculation starts here else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) { value = focus_spell.base[i]; - } - else { + } else { value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]); } } @@ -4914,18 +4891,15 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo case SE_ImprovedHeal: if (type == focusImprovedHeal) { - if(best_focus) { + if (best_focus) { if (focus_spell.base2[i] != 0) { value = focus_spell.base2[i]; - } - else { + } else { value = focus_spell.base[i]; } - } - else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) { + } else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) { value = focus_spell.base[i]; - } - else { + } else { value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]); } } @@ -4933,18 +4907,15 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo case SE_ReduceManaCost: if (type == focusManaCost) { - if(best_focus) { + if (best_focus) { if (focus_spell.base2[i] != 0) { value = focus_spell.base2[i]; - } - else { + } else { value = focus_spell.base[i]; } - } - else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) { + } else if (focus_spell.base2[i] == 0 || focus_spell.base[i] == focus_spell.base2[i]) { value = focus_spell.base[i]; - } - else { + } else { value = zone->random.Int(focus_spell.base[i], focus_spell.base2[i]); } } @@ -4991,30 +4962,28 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo break; case SE_SpellHateMod: - if (type == focusSpellHateMod){ - if(value != 0){ - if(value > 0){ - if(focus_spell.base[i] > value) + if (type == focusSpellHateMod) { + if (value != 0) { + if (value > 0) { + if (focus_spell.base[i] > value) + value = focus_spell.base[i]; + } else { + if (focus_spell.base[i] < value) value = focus_spell.base[i]; } - else{ - if(focus_spell.base[i] < value) - value = focus_spell.base[i]; - } - } - else + } else value = focus_spell.base[i]; } break; case SE_ReduceReuseTimer: - if(type == focusReduceRecastTime) + if (type == focusReduceRecastTime) value = focus_spell.base[i] / 1000; break; case SE_TriggerOnCast: - if(type == focusTriggerOnCast){ - if(zone->random.Roll(focus_spell.base[i])) + if (type == focusTriggerOnCast) { + if (zone->random.Roll(focus_spell.base[i])) value = focus_spell.base2[i]; else value = 0; @@ -5022,50 +4991,50 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo break; case SE_BlockNextSpellFocus: - if(type == focusBlockNextSpell){ - if(zone->random.Roll(focus_spell.base[i])) + if (type == focusBlockNextSpell) { + if (zone->random.Roll(focus_spell.base[i])) value = 1; } break; case SE_SympatheticProc: - if(type == focusSympatheticProc) { + if (type == focusSympatheticProc) { value = focus_id; } break; case SE_FcSpellVulnerability: - if(type == focusSpellVulnerability) + if (type == focusSpellVulnerability) value = focus_spell.base[i]; break; case SE_FcTwincast: - if(type == focusTwincast) + if (type == focusTwincast) value = focus_spell.base[i]; break; case SE_FcDamageAmt: - if(type == focusFcDamageAmt) + if (type == focusFcDamageAmt) value = focus_spell.base[i]; break; case SE_FcDamageAmtCrit: - if(type == focusFcDamageAmtCrit) + if (type == focusFcDamageAmtCrit) value = focus_spell.base[i]; break; case SE_FcDamageAmtIncoming: - if(type == focusFcDamageAmtIncoming) + if (type == focusFcDamageAmtIncoming) value = focus_spell.base[i]; break; case SE_FcHealAmtIncoming: - if(type == focusFcHealAmtIncoming) + if (type == focusFcHealAmtIncoming) value = focus_spell.base[i]; break; case SE_FcDamagePctCrit: - if(type == focusFcDamagePctCrit) + if (type == focusFcDamagePctCrit) value = focus_spell.base[i]; break; @@ -5075,17 +5044,17 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo break; case SE_FcHealAmtCrit: - if(type == focusFcHealAmtCrit) + if (type == focusFcHealAmtCrit) value = focus_spell.base[i]; break; - case SE_FcHealAmt: - if(type == focusFcHealAmt) + case SE_FcHealAmt: + if (type == focusFcHealAmt) value = focus_spell.base[i]; break; case SE_FcHealPctIncoming: - if(type == focusFcHealPctIncoming) + if (type == focusFcHealPctIncoming) value = focus_spell.base[i]; break; @@ -5095,51 +5064,51 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo break; case SE_FcIncreaseNumHits: - if(type == focusIncreaseNumHits) + if (type == focusIncreaseNumHits) value = focus_spell.base[i]; break; case SE_FcLimitUse: - if(type == focusFcLimitUse) + if (type == focusFcLimitUse) value = focus_spell.base[i]; break; case SE_FcMute: - if(type == focusFcMute) + if (type == focusFcMute) value = focus_spell.base[i]; break; case SE_FcStunTimeMod: - if(type == focusFcStunTimeMod) + if (type == focusFcStunTimeMod) value = focus_spell.base[i]; break; case SE_FcTimerRefresh: - if(type == focusFcTimerRefresh) + if (type == focusFcTimerRefresh) value = focus_spell.base[i]; break; #if EQDEBUG >= 6 - //this spits up a lot of garbage when calculating spell focuses - //since they have all kinds of extra effects on them. + // this spits up a lot of garbage when calculating spell focuses + // since they have all kinds of extra effects on them. default: - Log.Out(Logs::General, Logs::Normal, "CalcFocusEffect: unknown effectid %d", focus_spell.effectid[i]); + Log.Out(Logs::General, Logs::Normal, "CalcFocusEffect: unknown effectid %d", + focus_spell.effectid[i]); #endif } - } - for(int e = 0; e < MaxLimitInclude; e+=2) { - if (LimitInclude[e] && !LimitInclude[e+1]) + for (int e = 0; e < MaxLimitInclude; e += 2) { + if (LimitInclude[e] && !LimitInclude[e + 1]) return 0; } - if (Caston_spell_id){ - if(IsValidSpell(Caston_spell_id) && (Caston_spell_id != spell_id)) + if (Caston_spell_id) { + if (IsValidSpell(Caston_spell_id) && (Caston_spell_id != spell_id)) SpellFinished(Caston_spell_id, this, 10, 0, -1, spells[Caston_spell_id].ResistDiff); } - return(value*lvlModifier/100); + return (value * lvlModifier / 100); } uint16 Client::GetSympatheticFocusEffect(focusType type, uint16 spell_id) { @@ -5501,26 +5470,24 @@ int16 Client::GetFocusEffect(focusType type, uint16 spell_id) { if (aabonuses.FocusEffects[type]){ int16 Total3 = 0; - uint32 slots = 0; - uint32 aa_AA = 0; - uint32 aa_value = 0; - //aa old - //for (int i = 0; i < MAX_PP_AA_ARRAY; i++) - //{ - // aa_AA = this->aa[i]->AA; - // aa_value = this->aa[i]->value; - // if (aa_AA < 1 || aa_value < 1) - // continue; - // - // Total3 = CalcAAFocus(type, aa_AA, spell_id); - // if (Total3 > 0 && realTotal3 >= 0 && Total3 > realTotal3) { - // realTotal3 = Total3; - // } - // else if (Total3 < 0 && Total3 < realTotal3) { - // realTotal3 = Total3; - // } - //} + for (const auto &aa : aa_ranks) { + auto ability = zone->GetAlternateAdvancementAbility(aa.first); + if (!ability) + continue; + + auto rank = ability->GetRankByPointsSpent(aa.second.first); + if (!rank || rank->effects.empty()) + continue; + + Total3 = CalcAAFocus(type, *rank, spell_id); + if (Total3 > 0 && realTotal3 >= 0 && Total3 > realTotal3) { + realTotal3 = Total3; + } + else if (Total3 < 0 && Total3 < realTotal3) { + realTotal3 = Total3; + } + } } if(type == focusReagentCost && IsSummonPetSpell(spell_id) && GetAA(aaElementalPact)) From 4898bfd822cf1bb08ba6549b7f6c9ab5a1bfbb20 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sat, 13 Jun 2015 02:12:17 -0400 Subject: [PATCH 17/90] Fix focusReagenCost for pets All focus seem to use 33 ... --- zone/spell_effects.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 0bb7b78b9..7fcba77e9 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -4332,8 +4332,14 @@ int16 Client::CalcAAFocus(focusType type, const AA::Rank &rank, uint16 spell_id) LimitFailure = true; } else { LimitInclude[4] = true; - if (IsEffectInSpell(spell_id, base1)) // Include - LimitInclude[5] = true; + // they use 33 here for all classes ... unsure if the type check is really needed + if (base1 == SE_SummonPet && type == focusReagentCost) { + if (IsSummonPetSpell(spell_id) || IsSummonSkeletonSpell(spell_id)) + LimitInclude[5] = true; + } else { + if (IsEffectInSpell(spell_id, base1)) // Include + LimitInclude[5] = true; + } } break; @@ -5490,9 +5496,6 @@ int16 Client::GetFocusEffect(focusType type, uint16 spell_id) { } } - if(type == focusReagentCost && IsSummonPetSpell(spell_id) && GetAA(aaElementalPact)) - return 100; - if(type == focusReagentCost && (IsEffectInSpell(spell_id, SE_SummonItem) || IsSacrificeSpell(spell_id))) return 0; //Summon Spells that require reagents are typically imbue type spells, enchant metal, sacrifice and shouldn't be affected From 106e0c69abf140dd1b1f15daac2a4bf8e680dcc0 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sat, 13 Jun 2015 02:43:00 -0400 Subject: [PATCH 18/90] Added todo list to ApplyAABonuses Probably incomplete --- common/spdat.h | 20 ++++++++++---------- zone/bonuses.cpp | 24 ++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/common/spdat.h b/common/spdat.h index ab128a37c..a0c74c16a 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -381,24 +381,24 @@ typedef enum { #define SE_GiveDoubleAttack 225 // implemented[AA] - Allow any class to double attack with set chance. #define SE_TwoHandBash 226 // *not implemented as bonus #define SE_ReduceSkillTimer 227 // implemented -//#define SE_ReduceFallDamage 228 // not implented as bonus - reduce the damage that you take from falling +#define SE_ReduceFallDamage 228 // not implented as bonus - reduce the damage that you take from falling #define SE_PersistantCasting 229 // implemented -//#define SE_ExtendedShielding 230 // not used as bonus - increase range of /shield ability +#define SE_ExtendedShielding 230 // not used as bonus - increase range of /shield ability #define SE_StunBashChance 231 // implemented - increase chance to stun from bash. #define SE_DivineSave 232 // implemented (base1 == % chance on death to insta-res) (base2 == spell cast on save) #define SE_Metabolism 233 // implemented - Modifies food/drink consumption rates. -//#define SE_ReduceApplyPoisonTime 234 // not implemented as bonus - reduces the time to apply poison +#define SE_ReduceApplyPoisonTime 234 // not implemented as bonus - reduces the time to apply poison #define SE_ChannelChanceSpells 235 // implemented[AA] - chance to channel from SPELLS *No longer used on live. //#define SE_FreePet 236 // not used #define SE_GivePetGroupTarget 237 // implemented[AA] - (Pet Affinity) #define SE_IllusionPersistence 238 // implemented - lends persistence to your illusionary disguises, causing them to last until you die or the illusion is forcibly removed. -//#define SE_FeignedCastOnChance 239 // *not implemented as bonus - ability gives you an increasing chance for your feigned deaths to not be revealed by spells cast upon you. +#define SE_FeignedCastOnChance 239 // *not implemented as bonus - ability gives you an increasing chance for your feigned deaths to not be revealed by spells cast upon you. //#define SE_StringUnbreakable 240 // not used [Likely related to above - you become immune to feign breaking on a resisted spell and have a good chance of feigning through a spell that successfully lands upon you.] #define SE_ImprovedReclaimEnergy 241 // implemented - increase the amount of mana returned to you when reclaiming your pet. #define SE_IncreaseChanceMemwipe 242 // implemented - increases the chance to wipe hate with memory blurr #define SE_CharmBreakChance 243 // implemented - Total Domination #define SE_RootBreakChance 244 // implemented[AA] reduce the chance that your root will break. -//#define SE_TrapCircumvention 245 // *not implemented[AA] - decreases the chance that you will set off a trap when opening a chest +#define SE_TrapCircumvention 245 // *not implemented[AA] - decreases the chance that you will set off a trap when opening a chest #define SE_SetBreathLevel 246 // *not implemented as bonus #define SE_RaiseSkillCap 247 // *not implemented[AA] - adds skill over the skill cap. #define SE_SecondaryForte 248 // not implemented as bonus(gives you a 2nd specialize skill that can go past 50 to 100) @@ -408,9 +408,9 @@ typedef enum { #define SE_FrontalBackstabChance 252 // implemented[AA] - chance to perform a full damage backstab from front. #define SE_FrontalBackstabMinDmg 253 // implemented[AA] - allow a frontal backstab for mininum damage. #define SE_Blank 254 // implemented -//#define SE_ShieldDuration 255 // not implemented as bonus - increases duration of /shield -//#define SE_ShroudofStealth 256 // not implemented as bonus - rogue improved invs -//#define SE_PetDiscipline 257 // not implemented as bonus - /pet hold +#define SE_ShieldDuration 255 // not implemented as bonus - increases duration of /shield +#define SE_ShroudofStealth 256 // not implemented as bonus - rogue improved invs +#define SE_PetDiscipline 257 // not implemented as bonus - /pet hold #define SE_TripleBackstab 258 // implemented[AA] - chance to perform a triple backstab #define SE_CombatStability 259 // implemented[AA] - damage mitigation #define SE_AddSingingMod 260 // implemented[AA] - Instrument/Singing Mastery, base1 is the mod, base2 is the ItemType @@ -434,11 +434,11 @@ typedef enum { #define SE_FinishingBlow 278 // implemented[AA] - chance to do massive damage under 10% HP (base1 = chance, base2 = damage) #define SE_Flurry 279 // implemented #define SE_PetFlurry 280 // implemented[AA] -//#define SE_FeignedMinion 281 // *not implemented[AA] ability allows you to instruct your pet to feign death via the '/pet feign' command. value = succeed chance +#define SE_FeignedMinion 281 // *not implemented[AA] ability allows you to instruct your pet to feign death via the '/pet feign' command. value = succeed chance #define SE_ImprovedBindWound 282 // implemented[AA] - increase bind wound amount by percent. #define SE_DoubleSpecialAttack 283 // implemented[AA] - Chance to perform second special attack as monk //#define SE_LoHSetHeal 284 // not used -//#define SE_NimbleEvasion 285 // *not implemented - base1 = 100 for max +#define SE_NimbleEvasion 285 // *not implemented - base1 = 100 for max #define SE_FcDamageAmt 286 // implemented - adds direct spell damage #define SE_SpellDurationIncByTic 287 // implemented #define SE_SkillAttackProc 288 // implemented[AA] - Chance to proc spell on skill attack usage (ex. Dragon Punch) diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index 23a896979..8e7b56721 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -816,8 +816,6 @@ void Client::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) break; } break; - case SE_PetDiscipline2: - break; case SE_SpellSlotIncrease: break; case SE_MysticalAttune: @@ -1392,6 +1390,10 @@ void Client::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) newbon->ATK += base1; break; // to do + case SE_PetDiscipline: + break; + case SE_PetDiscipline2: + break; case SE_ReduceTradeskillFail: break; case SE_PotionBeltSlots: @@ -1404,7 +1406,25 @@ void Client::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) break; case SE_SecondaryForte: break; + case SE_FeignedCastOnChance: + break; + case SE_ExtendedShielding: + break; + case SE_ShieldDuration: + break; + case SE_ReduceApplyPoisonTime: + break; + case SE_NimbleEvasion: + break; + case SE_TrapCircumvention: + break; + case SE_ShroudofStealth: + break; + case SE_FeignedMinion: + break; + // handled client side + case SE_ReduceFallDamage: // not handled here case SE_HastenedAASkill: // not handled here but don't want to clutter debug log -- these may need to be verified to ignore From 121af489c4c094fc5c6056f48f145bdae4a44dae Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sat, 13 Jun 2015 17:53:21 -0400 Subject: [PATCH 19/90] Support for Eyes Wide Open This probably needs testing on older clients ... --- common/spdat.h | 2 +- zone/bonuses.cpp | 6 ++++++ zone/common.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/common/spdat.h b/common/spdat.h index a0c74c16a..24e982aee 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -579,7 +579,7 @@ typedef enum { #define SE_LimitUseType 423 // implemented - limit a focus to require a certain numhits type #define SE_GravityEffect 424 // implemented - Pulls/pushes you toward/away the mob at a set pace //#define SE_Display 425 // *not implemented - Illusion: Flying Dragon(21626) -//#define SE_IncreaseExtTargetWindow 426 // *not implmented[AA] - increases the capacity of your extended target window +#define SE_IncreaseExtTargetWindow 426 // *not implmented[AA] - increases the capacity of your extended target window #define SE_SkillProc 427 // implemented - chance to proc when using a skill(ie taunt) #define SE_LimitToSkill 428 // implemented - limits what skills will effect a skill proc #define SE_SkillProcSuccess 429 // implemented - chance to proc when tje skill in use successfully fires. diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index 8e7b56721..b0c48f205 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -113,6 +113,9 @@ void Client::CalcBonuses() rooted = FindType(SE_Root); XPRate = 100 + spellbonuses.XPRateMod; + + if (GetMaxXTargets() != 5 + aabonuses.extra_xtargets) + SetMaxXTargets(5 + aabonuses.extra_xtargets); } int Client::CalcRecommendedLevelBonus(uint8 level, uint8 reclevel, int basestat) @@ -1389,6 +1392,9 @@ void Client::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) case SE_ATK: newbon->ATK += base1; break; + case SE_IncreaseExtTargetWindow: + newbon->extra_xtargets += base1; + break; // to do case SE_PetDiscipline: break; diff --git a/zone/common.h b/zone/common.h index e658a352d..d21a0039d 100644 --- a/zone/common.h +++ b/zone/common.h @@ -461,6 +461,7 @@ struct StatBonuses { uint8 AssassinateLevel; // Max Level Assassinate will be effective at. int32 PetMeleeMitigation; // Add AC to owner's pet. bool IllusionPersistence; // Causes illusions not to fade. + uint16 extra_xtargets; // extra xtarget entries }; typedef struct From 335470d3dbe040b8de5be739c270c7ea103d9308 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sat, 13 Jun 2015 22:49:32 -0400 Subject: [PATCH 20/90] Port up AA sympathetic procs --- zone/spell_effects.cpp | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 7fcba77e9..c78e80be8 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -5202,33 +5202,29 @@ uint16 Client::GetSympatheticFocusEffect(focusType type, uint16 spell_id) { /*Note: At present, ff designing custom AA to have a sympathetic proc effect, only use one focus effect within the aa_effects data for each AA*[No live AA's use this effect to my knowledge]*/ - if (aabonuses.FocusEffects[type]){ + if (aabonuses.FocusEffects[type]) { + for (const auto &aa : aa_ranks) { + if (SympatheticProcList.size() > MAX_SYMPATHETIC_PROCS) + break; - uint32 aa_AA = 0; - uint32 aa_value = 0; + auto ability = zone->GetAlternateAdvancementAbility(aa.first); + if (!ability) + continue; - //aa old - //for (int i = 0; i < MAX_PP_AA_ARRAY; i++) - //{ - // aa_AA = this->aa[i]->AA; - // aa_value = this->aa[i]->value; - // if (aa_AA < 1 || aa_value < 1) - // continue; - // - // if (SympatheticProcList.size() > MAX_SYMPATHETIC_PROCS) - // continue; - // - // proc_spellid = CalcAAFocus(type, aa_AA, spell_id); - // - // if (IsValidSpell(proc_spellid)){ - // ProcChance = GetSympatheticProcChances(spell_id, GetAABase1(aa_AA, 1)); - // if(zone->random.Roll(ProcChance)) - // SympatheticProcList.push_back(proc_spellid); - // } - //} + auto rank = ability->GetRankByPointsSpent(aa.second.first); + if (!rank || rank->effects.empty()) + continue; + + proc_spellid = CalcAAFocus(type, *rank, spell_id); + if (IsValidSpell(proc_spellid)) { + ProcChance = GetSympatheticProcChances(spell_id, rank->effects[0].base1); + if (zone->random.Roll(ProcChance)) + SympatheticProcList.push_back(proc_spellid); + } + } } - if (SympatheticProcList.size() > 0) + if (!SympatheticProcList.empty()) { uint8 random = zone->random.Int(0, SympatheticProcList.size()-1); int FinalSympatheticProc = SympatheticProcList[random]; From 34f01064379c192fcf9099b78bb1bb2c098791a0 Mon Sep 17 00:00:00 2001 From: KimLS Date: Mon, 15 Jun 2015 13:57:18 -0700 Subject: [PATCH 21/90] Added reset aa command for rof2 (50 status req), fixed #resetaa command --- common/emu_oplist.h | 1 + utils/patches/patch_RoF2.conf | 1 + zone/aa.cpp | 116 ++++++++++++++++------------------ zone/client_packet.cpp | 10 ++- zone/client_packet.h | 1 + zone/command.cpp | 24 +++---- 6 files changed, 72 insertions(+), 81 deletions(-) diff --git a/common/emu_oplist.h b/common/emu_oplist.h index e4793826e..4ef1761bd 100644 --- a/common/emu_oplist.h +++ b/common/emu_oplist.h @@ -548,4 +548,5 @@ N(OP_ZoneServerInfo), N(OP_ZoneServerReady), N(OP_ZoneSpawns), N(OP_ZoneUnavail), +N(OP_ResetAA), // mail and chat opcodes located in ../mail_oplist.h diff --git a/utils/patches/patch_RoF2.conf b/utils/patches/patch_RoF2.conf index 1ebf05442..b22cc66d5 100644 --- a/utils/patches/patch_RoF2.conf +++ b/utils/patches/patch_RoF2.conf @@ -353,6 +353,7 @@ OP_OpenContainer=0x0000 OP_Marquee=0x502e OP_ItemRecastDelay=0x15a9 #OP_OpenInventory=0x0000 # Likely does not exist in RoF -U +OP_ResetAA=0x1669 # Expeditions OP_DzAddPlayer=0x4701 diff --git a/zone/aa.cpp b/zone/aa.cpp index cf2fb0685..c2a3d63cf 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -482,40 +482,35 @@ bool Client::CheckAAEffect(aaEffectType type) { return(false); } -void Client::ResetAA(){ -// RefundAA(); -// uint32 i; -// for (i=0; i < MAX_PP_AA_ARRAY; i++) { -// aa[i]->AA = 0; -// aa[i]->value = 0; -// aa[i]->charges = 0; -// m_pp.aa_array[i].AA = 0; -// m_pp.aa_array[i].value = 0; -// m_pp.aa_array[i].charges= 0; -// } -// -// std::map::iterator itr; -// for(itr = aa_points.begin(); itr != aa_points.end(); ++itr) -// aa_points[itr->first] = 0; -// -// for(int i = 0; i < _maxLeaderAA; ++i) -// m_pp.leader_abilities.ranks[i] = 0; -// -// m_pp.group_leadership_points = 0; -// m_pp.raid_leadership_points = 0; -// m_pp.group_leadership_exp = 0; -// m_pp.raid_leadership_exp = 0; -// -// database.DeleteCharacterAAs(this->CharacterID()); -// SaveAA(); -// SendClearAA(); -// SendAAList(); -// SendAATable(); -// SendAAStats(); -// database.DeleteCharacterLeadershipAAs(this->CharacterID()); -// // undefined for these clients -// if (GetClientVersionBit() & BIT_TitaniumAndEarlier) -// Kick(); +void Client::ResetAA() { + RefundAA(); + uint32 i; + for (i=0; i < MAX_PP_AA_ARRAY; i++) { + m_pp.aa_array[i].AA = 0; + m_pp.aa_array[i].value = 0; + m_pp.aa_array[i].charges= 0; + } + + aa_ranks.clear(); + + for(int i = 0; i < _maxLeaderAA; ++i) + m_pp.leader_abilities.ranks[i] = 0; + + m_pp.group_leadership_points = 0; + m_pp.raid_leadership_points = 0; + m_pp.group_leadership_exp = 0; + m_pp.raid_leadership_exp = 0; + + database.DeleteCharacterAAs(CharacterID()); + SaveAA(); + SendClearAA(); + SendAlternateAdvancementTable(); + SendAlternateAdvancementPoints(); + SendAlternateAdvancementStats(); + database.DeleteCharacterLeadershipAAs(this->CharacterID()); + // undefined for these clients + if (GetClientVersionBit() & BIT_TitaniumAndEarlier) + Kick(); } void Client::SendClearAA() @@ -802,34 +797,31 @@ void Client::DurationRampage(uint32 duration) } void Client::RefundAA() { -// int cur = 0; -// bool refunded = false; -// -// for(int x = 0; x < aaHighestID; x++) { -// cur = GetAA(x); -// if(cur > 0){ -// SendAA_Struct* curaa = zone->FindAA(x); -// if(cur){ -// SetAA(x, 0); -// for(int j = 0; j < cur; j++) { -// m_pp.aapoints += curaa->cost + (curaa->cost_inc * j); -// refunded = true; -// } -// } -// else -// { -// m_pp.aapoints += cur; -// SetAA(x, 0); -// refunded = true; -// } -// } -// } -// -// if(refunded) { -// SaveAA(); -// Save(); -// // Kick(); -// } + int refunded = 0; + + for(auto &rank_value : aa_ranks) { + AA::Ability *ability = zone->GetAlternateAdvancementAbility(rank_value.first); + if(!ability) { + continue; + } + + if(ability->charges > 0 && rank_value.second.second < 1) { + continue; + } + + AA::Rank *rank = ability->GetRankByPointsSpent(rank_value.second.first); + if(!rank) { + continue; + } + + refunded += rank->total_cost; + } + + if(refunded > 0) { + m_pp.aapoints += refunded; + SaveAA(); + Save(); + } } AA_SwarmPetInfo::AA_SwarmPetInfo() diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index b76c11d8c..d01bcf109 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -389,6 +389,7 @@ void MapOpcodes() ConnectedOpcodes[OP_XTargetRequest] = &Client::Handle_OP_XTargetRequest; ConnectedOpcodes[OP_YellForHelp] = &Client::Handle_OP_YellForHelp; ConnectedOpcodes[OP_ZoneChange] = &Client::Handle_OP_ZoneChange; + ConnectedOpcodes[OP_ResetAA] = &Client::Handle_OP_ResetAA; } void ClearMappedOpcode(EmuOpcode op) @@ -14163,9 +14164,12 @@ void Client::Handle_OP_YellForHelp(const EQApplicationPacket *app) return; } -/* -void Client::Handle_OP_ZoneChange(const EQApplicationPacket *app) +void Client::Handle_OP_ResetAA(const EQApplicationPacket *app) { + if(Admin() >= 50) { + Message(0, "Resetting AA points."); + ResetAA(); + } return; } -*/ + diff --git a/zone/client_packet.h b/zone/client_packet.h index 1a9591f4c..a39e3fb74 100644 --- a/zone/client_packet.h +++ b/zone/client_packet.h @@ -295,3 +295,4 @@ void Handle_OP_XTargetRequest(const EQApplicationPacket *app); void Handle_OP_YellForHelp(const EQApplicationPacket *app); void Handle_OP_ZoneChange(const EQApplicationPacket *app); + void Handle_OP_ResetAA(const EQApplicationPacket *app); diff --git a/zone/command.cpp b/zone/command.cpp index 0554a5e68..16f50e7d7 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -332,7 +332,7 @@ int command_init(void) { command_add("reloadzonepoints", "- Reload zone points from database", 150, command_reloadzps) || command_add("reloadzps", nullptr,0, command_reloadzps) || command_add("repop", "[delay] - Repop the zone with optional delay", 100, command_repop) || - command_add("resetaa", "- Resets a Player's AA in their profile and refunds spent AA's to unspent, disconnects player.", 200, command_resetaa) || + command_add("resetaa", "- Resets a Player's AA in their profile and refunds spent AA's to unspent, may disconnect player.", 200, command_resetaa) || command_add("revoke", "[charname] [1/0] - Makes charname unable to talk on OOC", 200, command_revoke) || command_add("rules", "(subcommand) - Manage server rules", 250, command_rules) || command_add("save", "- Force your player or player corpse target to be saved to the database", 50, command_save) || @@ -671,21 +671,13 @@ void command_incstat(Client* c, const Seperator* sep){ } } -void command_resetaa(Client* c,const Seperator *sep){ - - //if(sep->IsNumber(1) && atoi(sep->arg[1]) == 1) { - // c->SendAlternateAdvancement(2, 2); - //} - //else if(sep->IsNumber(1) && atoi(sep->arg[1]) == 2) { - // c->SendAlternateAdvancement(2, 3); - //} - - //if(c->GetTarget()!=0 && c->GetTarget()->IsClient()){ - // c->GetTarget()->CastToClient()->ResetAA(); - // c->Message(13,"Successfully reset %s's AAs", c->GetTarget()->GetName()); - //} - //else - // c->Message(0,"Usage: Target a client and use #resetaa to reset the AA data in their Profile."); +void command_resetaa(Client* c,const Seperator *sep) { + if(c->GetTarget() && c->GetTarget()->IsClient()){ + c->GetTarget()->CastToClient()->ResetAA(); + c->Message(13,"Successfully reset %s's AAs", c->GetTarget()->GetName()); + } + else + c->Message(0,"Usage: Target a client and use #resetaa to reset the AA data in their Profile."); } void command_help(Client *c, const Seperator *sep) From a984e9bd7c116a07085e279c7745766d43bfbe76 Mon Sep 17 00:00:00 2001 From: KimLS Date: Mon, 15 Jun 2015 15:09:06 -0700 Subject: [PATCH 22/90] Some cleanup as well as fix for a certain type of aa proc --- zone/aa.cpp | 65 +++++++++++++++++++++++++++------------ zone/attack.cpp | 70 ++++++++++++++++++++++-------------------- zone/bonuses.cpp | 14 +++++---- zone/client.h | 24 ++++++--------- zone/mob.h | 1 + zone/perl_client.cpp | 29 +---------------- zone/spell_effects.cpp | 63 ++++++++++--------------------------- zone/zone.h | 1 + 8 files changed, 120 insertions(+), 147 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index c2a3d63cf..1f0b5b086 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -800,7 +800,10 @@ void Client::RefundAA() { int refunded = 0; for(auto &rank_value : aa_ranks) { - AA::Ability *ability = zone->GetAlternateAdvancementAbility(rank_value.first); + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(rank_value.first, rank_value.second.first); + auto ability = ability_rank.first; + auto rank = ability_rank.second; + if(!ability) { continue; } @@ -809,11 +812,6 @@ void Client::RefundAA() { continue; } - AA::Rank *rank = ability->GetRankByPointsSpent(rank_value.second.first); - if(!rank) { - continue; - } - refunded += rank->total_cost; } @@ -864,20 +862,19 @@ void Client::SendAlternateAdvancementTable() { void Client::SendAlternateAdvancementRank(int aa_id, int level) { if(!zone) return; - - AA::Ability *ability = zone->GetAlternateAdvancementAbility(aa_id); - if(!ability) + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa_id, level); + auto ability = ability_rank.first; + auto rank = ability_rank.second; + + if(!ability) { return; + } if(!(ability->classes & (1 << GetClass()))) { return; } - AA::Rank *rank = ability->GetRankByPointsSpent(level); - if(!rank) - return; - if(!CanUseAlternateAdvancementRank(rank)) { return; } @@ -1224,13 +1221,11 @@ int Mob::GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in) { } for(auto &aa : aa_ranks) { - AA::Ability *ability = zone->GetAlternateAdvancementAbility(aa.first); - if(!ability) { - continue; - } + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa.first, aa.second.first); + auto ability = ability_rank.first; + auto rank = ability_rank.second; - AA::Rank *rank = ability->GetRankByPointsSpent(aa.second.first); - if(!rank) { + if(!ability) { continue; } @@ -1328,6 +1323,21 @@ AA::Rank *Zone::GetAlternateAdvancementRank(int rank_id) { return nullptr; } +std::pair Zone::GetAlternateAdvancementAbilityAndRank(int id, int points_spent) { + AA::Ability *ability = GetAlternateAdvancementAbility(id); + + if(!ability) { + return std::make_pair(nullptr, nullptr); + } + + AA::Rank *rank = ability->GetRankByPointsSpent(points_spent); + if(!rank) { + return std::make_pair(nullptr, nullptr); + } + + return std::make_pair(ability, rank); +} + uint32 Mob::GetAA(uint32 rank_id, uint32 *charges) const { if(zone) { AA::Ability *ability = zone->GetAlternateAdvancementAbilityByRank(rank_id); @@ -1345,6 +1355,23 @@ uint32 Mob::GetAA(uint32 rank_id, uint32 *charges) const { return 0; } +uint32 Mob::GetAAByAAID(uint32 aa_id, uint32 *charges) const { + if(zone) { + AA::Ability *ability = zone->GetAlternateAdvancementAbility(aa_id); + + if(!ability) + return 0; + + auto iter = aa_ranks.find(ability->id); + if(iter != aa_ranks.end()) { + if(charges) { + *charges = iter->second.second; + } + return iter->second.first; + } + } +} + bool Mob::SetAA(uint32 rank_id, uint32 new_value, uint32 charges) { if(zone) { AA::Ability *ability = zone->GetAlternateAdvancementAbilityByRank(rank_id); diff --git a/zone/attack.cpp b/zone/attack.cpp index cecf37ff1..fda7837ab 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -4647,7 +4647,7 @@ void Mob::TrySkillProc(Mob *on, uint16 skill, uint16 ReuseTime, bool Success, ui if (IsClient() && aabonuses.LimitToSkill[skill]){ CanProc = true; - uint32 effect = 0; + uint32 effect_id = 0; int32 base1 = 0; int32 base2 = 0; uint32 slot = 0; @@ -4666,39 +4666,43 @@ void Mob::TrySkillProc(Mob *on, uint16 skill, uint16 ReuseTime, bool Success, ui proc_spell_id = 0; ProcMod = 0; - //old AA - //std::map >::const_iterator find_iter = aa_effects.find(aaid); - //if(find_iter == aa_effects.end()) - // break; + for(auto &rank_info : aa_ranks) { + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(rank_info.first, rank_info.second.first); + auto ability = ability_rank.first; + auto rank = ability_rank.second; - //for (std::map::const_iterator iter = aa_effects[aaid].begin(); iter != aa_effects[aaid].end(); ++iter) { - // effect = iter->second.skill_id; - // base1 = iter->second.base1; - // base2 = iter->second.base2; - // slot = iter->second.slot; - // - // if (effect == SE_SkillProc || effect == SE_SkillProcSuccess) { - // proc_spell_id = base1; - // ProcMod = static_cast(base2); - // } - // - // else if (effect == SE_LimitToSkill && base1 <= HIGHEST_SKILL) { - // - // if (CanProc && base1 == skill && IsValidSpell(proc_spell_id)) { - // float final_chance = chance * (ProcMod / 100.0f); - // - // if (zone->random.Roll(final_chance)) { - // ExecWeaponProc(nullptr, proc_spell_id, on); - // CanProc = false; - // break; - // } - // } - // } - // else { - // proc_spell_id = 0; - // ProcMod = 0; - // } - //} + if(!ability) { + continue; + } + + for(auto &effect : rank->effects) { + effect_id = effect.effect_id; + base1 = effect.base1; + base2 = effect.base2; + slot = effect.slot; + + if(effect_id == SE_SkillProc || effect_id == SE_SkillProcSuccess) { + proc_spell_id = base1; + ProcMod = static_cast(base2); + } + else if(effect_id == SE_LimitToSkill && base1 <= HIGHEST_SKILL) { + + if (CanProc && base1 == skill && IsValidSpell(proc_spell_id)) { + float final_chance = chance * (ProcMod / 100.0f); + + if (zone->random.Roll(final_chance)) { + ExecWeaponProc(nullptr, proc_spell_id, on); + CanProc = false; + break; + } + } + } + else { + proc_spell_id = 0; + ProcMod = 0; + } + } + } } } } diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index b0c48f205..6d12b1eac 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -640,14 +640,16 @@ void Client::CalcAABonuses(StatBonuses *newbon) memset(newbon, 0, sizeof(StatBonuses)); // start fresh for (const auto &aa : aa_ranks) { - auto ability = zone->GetAlternateAdvancementAbility(aa.first); - // zone doesn't know about this! bad data some where - if (!ability) - continue; + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa.first, aa.second.first); + auto ability = ability_rank.first; + auto rank = ability_rank.second; + + if(!ability) { + continue; + } - auto rank = ability->GetRankByPointsSpent(aa.second.first); // bad data or no effects - if (!rank || rank->effects.empty()) + if (rank->effects.empty()) continue; ApplyAABonuses(*rank, newbon); diff --git a/zone/client.h b/zone/client.h index 014747576..e830edfa8 100644 --- a/zone/client.h +++ b/zone/client.h @@ -774,27 +774,23 @@ public: void AddAAPoints(uint32 points) { m_pp.aapoints += points; SendAlternateAdvancementStats(); } int GetAAPoints() { return m_pp.aapoints; } int GetSpentAA() { return m_pp.aapoints_spent; } - - //old AA Methods + + //old AA methods that we still use void ResetAA(); + void RefundAA(); void SendClearAA(); - //this function is used by some AA stuff - void MemorizeSpell(uint32 slot,uint32 spellid,uint32 scribing); - void SetAATitle(const char *Title); - void SetTitleSuffix(const char *txt); inline uint32 GetMaxAAXP(void) const { return max_AAXP; } inline uint32 GetAAXP() const { return m_pp.expAA; } + int16 CalcAAFocus(focusType type, const AA::Rank &rank, uint16 spell_id); + void SetAATitle(const char *Title); + void SetTitleSuffix(const char *txt); + + //old AA Methods that are slated for removal + void MemorizeSpell(uint32 slot,uint32 spellid,uint32 scribing); void EnableAAEffect(aaEffectType type, uint32 duration = 0); void DisableAAEffect(aaEffectType type); bool CheckAAEffect(aaEffectType type); - void HandleAAAction(aaID activate); - int16 CalcAAFocusEffect(focusType type, uint16 focus_spell, uint16 spell_id); - int16 CalcAAFocus(focusType type, const AA::Rank &rank, uint16 spell_id); - void RefundAA(); - int32 GetAAEffectDataBySlot(uint32 aa_ID, uint32 slot_id, bool GetEffect, bool GetBase1, bool GetBase2); - int32 GetAAEffectid(uint32 aa_ID, uint32 slot_id) { return GetAAEffectDataBySlot(aa_ID, slot_id, true, false,false); } - int32 GetAABase1(uint32 aa_ID, uint32 slot_id) { return GetAAEffectDataBySlot(aa_ID, slot_id, false, true,false); } - int32 GetAABase2(uint32 aa_ID, uint32 slot_id) { return GetAAEffectDataBySlot(aa_ID, slot_id, false, false,true); } + int32 acmod(); // Item methods diff --git a/zone/mob.h b/zone/mob.h index ed5d68c2c..3e4f5ea39 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -960,6 +960,7 @@ public: //aa new uint32 GetAA(uint32 rank_id, uint32 *charges = nullptr) const; + uint32 GetAAByAAID(uint32 aa_id, uint32 *charges = nullptr) const; bool SetAA(uint32 rank_id, uint32 new_value, uint32 charges = 0); void ClearAAs() { aa_ranks.clear(); } bool CanUseAlternateAdvancementRank(AA::Rank *rank); diff --git a/zone/perl_client.cpp b/zone/perl_client.cpp index 95fc146ae..eea9918cd 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -4077,34 +4077,7 @@ XS(XS_Client_RefundAA) { if(THIS == nullptr) Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - //old aa - //int curpt = 0; - //bool refunded = false; - // - //for(int x1=0;x1GetAA(x1); - // if(curpt > 0){ - // SendAA_Struct* curaa = zone->FindAA(x1); - // if(curaa){ - // THIS->SetAA(x1, 0); - // for(int x2=0;x2GetPP().aapoints += curaa->cost + (curaa->cost_inc * x2); - // refunded = true; - // } - // } - // else //aa doesn't exist.. but if they bought it then it had at least a cost of 1 point each - // { //so give back what we can - // THIS->GetPP().aapoints += curpt; - // THIS->SetAA(x1, 0); - // refunded = true; - // } - // } - //} - // - //if(refunded){ - // THIS->Save(); //save of course - // THIS->Kick(); //client gets all buggy if we don't immediatly relog so just force it on them - //} + THIS->RefundAA(); } XSRETURN_EMPTY; } diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index c78e80be8..a7c5643a1 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -4149,43 +4149,6 @@ void Mob::BuffFadeBySlot(int slot, bool iRecalcBonuses) CalcBonuses(); } -int32 Client::GetAAEffectDataBySlot(uint32 aa_ID, uint32 slot_id, bool GetEffect, bool GetBase1, bool GetBase2) -{ - int32 aa_effects_data[3] = { 0 }; - uint32 effect = 0; - int32 base1 = 0; - int32 base2 = 0; - uint32 slot = 0; - - //old aa - //std::map >::const_iterator find_iter = aa_effects.find(aa_ID); - //if(find_iter == aa_effects.end()) - // return 0; - // - //for (std::map::const_iterator iter = aa_effects[aa_ID].begin(); iter != aa_effects[aa_ID].end(); ++iter) - //{ - // effect = iter->second.skill_id; - // base1 = iter->second.base1; - // base2 = iter->second.base2; - // slot = iter->second.slot; - // - // if (slot && slot == slot_id) { - // - // if (GetEffect) - // return effect; - // - // if (GetBase1) - // return base1; - // - // if (GetBase2) - // return base2; - // } - //} - - return 0; -} - - int16 Client::CalcAAFocus(focusType type, const AA::Rank &rank, uint16 spell_id) { const SPDat_Spell_Struct &spell = spells[spell_id]; @@ -5207,12 +5170,15 @@ uint16 Client::GetSympatheticFocusEffect(focusType type, uint16 spell_id) { if (SympatheticProcList.size() > MAX_SYMPATHETIC_PROCS) break; - auto ability = zone->GetAlternateAdvancementAbility(aa.first); - if (!ability) - continue; + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa.first, aa.second.first); + auto ability = ability_rank.first; + auto rank = ability_rank.second; - auto rank = ability->GetRankByPointsSpent(aa.second.first); - if (!rank || rank->effects.empty()) + if(!ability) { + continue; + } + + if (rank->effects.empty()) continue; proc_spellid = CalcAAFocus(type, *rank, spell_id); @@ -5474,12 +5440,15 @@ int16 Client::GetFocusEffect(focusType type, uint16 spell_id) { int16 Total3 = 0; for (const auto &aa : aa_ranks) { - auto ability = zone->GetAlternateAdvancementAbility(aa.first); - if (!ability) - continue; + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa.first, aa.second.first); + auto ability = ability_rank.first; + auto rank = ability_rank.second; - auto rank = ability->GetRankByPointsSpent(aa.second.first); - if (!rank || rank->effects.empty()) + if(!ability) { + continue; + } + + if (rank->effects.empty()) continue; Total3 = CalcAAFocus(type, *rank, spell_id); diff --git a/zone/zone.h b/zone/zone.h index a4a49b8b2..94bba72e4 100644 --- a/zone/zone.h +++ b/zone/zone.h @@ -119,6 +119,7 @@ public: AA::Ability *GetAlternateAdvancementAbility(int id); AA::Ability *GetAlternateAdvancementAbilityByRank(int rank_id); AA::Rank *GetAlternateAdvancementRank(int rank_id); + std::pair GetAlternateAdvancementAbilityAndRank(int id, int points_spent); void LoadZoneDoors(const char* zone, int16 version); bool LoadZoneObjects(); From 1b088b7157c4e120fd598890b37474e584c6e3b4 Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 16 Jun 2015 11:34:43 -0700 Subject: [PATCH 23/90] AA bonus calc -> Mob from Client, Bots should now work with their aa stuff again (untested) --- zone/bonuses.cpp | 15 +- zone/bot.cpp | 1533 ++++++++++++++-------------------------------- zone/bot.h | 5 +- zone/client.h | 2 - zone/mob.h | 2 + 5 files changed, 463 insertions(+), 1094 deletions(-) diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index 6d12b1eac..c19755aae 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -42,6 +42,7 @@ void Mob::CalcBonuses() { CalcSpellBonuses(&spellbonuses); + CalcAABonuses(&aabonuses); CalcMaxHP(); CalcMaxMana(); SetAttackTimer(); @@ -51,9 +52,7 @@ void Mob::CalcBonuses() void NPC::CalcBonuses() { - Mob::CalcBonuses(); - memset(&aabonuses, 0, sizeof(StatBonuses)); - + memset(&itembonuses, 0, sizeof(StatBonuses)); if(RuleB(NPC, UseItemBonusesForNonPets)){ memset(&itembonuses, 0, sizeof(StatBonuses)); CalcItemBonuses(&itembonuses); @@ -74,12 +73,8 @@ void Client::CalcBonuses() memset(&itembonuses, 0, sizeof(StatBonuses)); CalcItemBonuses(&itembonuses); CalcEdibleBonuses(&itembonuses); - CalcSpellBonuses(&spellbonuses); - - Log.Out(Logs::Detail, Logs::AA, "Calculating AA Bonuses for %s.", this->GetCleanName()); - CalcAABonuses(&aabonuses); //we're not quite ready for this - Log.Out(Logs::Detail, Logs::AA, "Finished calculating AA Bonuses for %s.", this->GetCleanName()); + CalcAABonuses(&aabonuses); ProcessItemCaps(); // caps that depend on spell/aa bonuses @@ -635,7 +630,7 @@ void Client::CalcEdibleBonuses(StatBonuses* newbon) { } } -void Client::CalcAABonuses(StatBonuses *newbon) +void Mob::CalcAABonuses(StatBonuses *newbon) { memset(newbon, 0, sizeof(StatBonuses)); // start fresh @@ -659,7 +654,7 @@ void Client::CalcAABonuses(StatBonuses *newbon) //A lot of the normal spell functions (IsBlankSpellEffect, etc) are set for just spells (in common/spdat.h). //For now, we'll just put them directly into the code and comment with the corresponding normal function //Maybe we'll fix it later? :-D -void Client::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) +void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) { if (rank.effects.empty()) // sanity check. why bother if no slots to fill? return; diff --git a/zone/bot.cpp b/zone/bot.cpp index 5200f3e95..ea6739c79 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -193,7 +193,7 @@ Bot::Bot(uint32 botID, uint32 botOwnerCharacterID, uint32 botSpellsID, double to GenerateBaseStats(); LoadTimers(); - //LoadAAs(); old aa, replace this + LoadAAs(); LoadBuffs(); CalcBotStats(false); @@ -1424,668 +1424,41 @@ int32 Bot::GenerateBaseHitPoints() return new_base_hp; } -void Bot::GenerateAABonuses(StatBonuses* newbon) { - // General AA bonus - uint8 botClass = GetClass(); - uint8 botLevel = GetLevel(); +void Bot::LoadAAs() { + int maxAAExpansion = RuleI(Bots, BotAAExpansion); //get expansion to get AAs up to + aa_ranks.clear(); - memset(newbon, 0, sizeof(StatBonuses)); //start fresh - //old aa - //if(botLevel >= 51) { - // //level 51 = 1 AA level - // - // int i; - // int totalAAs = database.CountAAs(); - // uint32 slots = 0; - // uint32 aa_AA = 0; - // uint32 aa_value = 0; - // for (i = 0; i < totalAAs; i++) { //iterate through all of the client's AAs - // std::map::iterator aa = botAAs.find(i); - // if(aa != botAAs.end()) { // make sure aa exists or we'll crash zone - // aa_AA = aa->second.aa_id; //same as aaid from the aa_effects table - // aa_value = aa->second.total_levels; //how many points in it - // if (aa_AA > 0 || aa_value > 0) { //do we have the AA? if 1 of the 2 is set, we can assume we do - // //slots = database.GetTotalAALevels(aa_AA); //find out how many effects from aa_effects table - // //slots = zone->GetTotalAALevels(aa_AA); //find out how many effects from aa_effects, which is loaded into memory - // //if (slots > 0) //and does it have any effects? may be able to put this above, not sure if it runs on each iteration - // // ApplyAABonuses(aa_AA + aa_value -1, slots, newbon); //add the bonuses - // } - // } - // } - //} -} + int id = 0; + int points = 0; + auto iter = zone->aa_abilities.begin(); + while(iter != zone->aa_abilities.end()) { + AA::Ability *ability = (*iter).second.get(); -//old AA -//void Bot::LoadAAs() { -// int maxAAExpansion = RuleI(Bots, BotAAExpansion); //get expansion to get AAs up to -// botAAs.clear(); //start fresh -// -// std::string query; -// -// if(GetClass() == BERSERKER) -// query = StringFormat("SELECT skill_id FROM altadv_vars WHERE berserker = 1 AND class_type > 1 AND class_type <= %i AND aa_expansion <= %i ORDER BY skill_id;", GetLevel(), maxAAExpansion); -// else -// query = StringFormat("SELECT skill_id FROM altadv_vars WHERE ((classes & ( 1 << %i )) >> %i) = 1 AND class_type > 1 AND class_type <= %i AND aa_expansion <= %i ORDER BY skill_id;", GetClass(), GetClass(), GetLevel(), maxAAExpansion); -// -// auto results = database.QueryDatabase(query); -// -// if(!results.Success()) { -// Log.Out(Logs::General, Logs::Error, "Error in Bot::LoadAAs()"); -// return; -// } -// -// int totalAAs = database.CountAAs(); -// -// for (auto row = results.begin(); row != results.end(); ++row) { -// uint32 skill_id = 0; -// skill_id = atoi(row[0]); -// -// if(skill_id <= 0 || skill_id >= totalAAs) -// continue; -// -// SendAA_Struct *sendAA = zone->FindAA(skill_id); -// -// if(!sendAA) -// continue; -// -// for(int i=0; imax_level; i++) { -// //Get AA info & add to list -// uint32 aaid = sendAA->id + i; -// uint8 total_levels = 0; -// uint8 req_level; -// std::map::iterator RequiredLevel = AARequiredLevelAndCost.find(aaid); -// -// //Get level required for AA -// if(RequiredLevel != AARequiredLevelAndCost.end()) -// req_level = RequiredLevel->second.Level; -// else -// req_level = (sendAA->class_type + i * sendAA->level_inc); -// -// if(req_level > GetLevel()) -// break; -// -// //Bot is high enough level for AA -// std::map::iterator foundAA = botAAs.find(aaid); -// -// // AA is already in list -// if(foundAA != botAAs.end()) -// continue; -// -// if(sendAA->id == aaid) { -// BotAA newAA; -// -// newAA.total_levels = 0; -// newAA.aa_id = aaid; -// newAA.req_level = req_level; -// newAA.total_levels += 1; -// -// botAAs[aaid] = newAA; //add to list -// } -// else //update master AA record with number of levels a bot has in AA, based on level. -// botAAs[sendAA->id].total_levels+=1; -// } -// } -// -//} + //skip expendables + if(!ability->first || ability->charges > 0) { + continue; + } -//current with Client::ApplyAABonuses 9/26/12 -void Bot::ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon) -{ - if(slots == 0) //sanity check. why bother if no slots to fill? - return; + id = ability->first->id; + points = 0; - //from AA_Ability struct - uint32 effect = 0; - int32 base1 = 0; - int32 base2 = 0; //only really used for SE_RaiseStatCap & SE_ReduceSkillTimer in aa_effects table - uint32 slot = 0; + AA::Rank *current = ability->first; - //old AA - //std::map >::const_iterator find_iter = aa_effects.find(aaid); - //if(find_iter == aa_effects.end()) - //{ - // return; - //} - // - //for (std::map::const_iterator iter = aa_effects[aaid].begin(); iter != aa_effects[aaid].end(); ++iter) { - // effect = iter->second.skill_id; - // base1 = iter->second.base1; - // base2 = iter->second.base2; - // slot = iter->second.slot; - // - // //we default to 0 (SE_CurrentHP) for the effect, so if there aren't any base1/2 values, we'll just skip it - // if (effect == 0 && base1 == 0 && base2 == 0) - // continue; - // - // //IsBlankSpellEffect() - // if (effect == SE_Blank || (effect == SE_CHA && base1 == 0) || effect == SE_StackingCommand_Block || effect == SE_StackingCommand_Overwrite) - // continue; - // - // Log.Out(Logs::Detail, Logs::AA, "Applying Effect %d from AA %u in slot %d (base1: %d, base2: %d) on %s", effect, aaid, slot, base1, base2, this->GetCleanName()); - // - // uint8 focus = IsFocusEffect(0, 0, true,effect); - // if (focus) - // { - // newbon->FocusEffects[focus] = effect; - // continue; - // } - // - // switch (effect) - // { - // //Note: AA effects that use accuracy are skill limited, while spell effect is not. - // case SE_Accuracy: - // if ((base2 == -1) && (newbon->Accuracy[HIGHEST_SKILL+1] < base1)) - // newbon->Accuracy[HIGHEST_SKILL+1] = base1; - // else if (newbon->Accuracy[base2] < base1) - // newbon->Accuracy[base2] += base1; - // break; - // case SE_CurrentHP: //regens - // newbon->HPRegen += base1; - // break; - // case SE_CurrentEndurance: - // newbon->EnduranceRegen += base1; - // break; - // case SE_MovementSpeed: - // newbon->movementspeed += base1; //should we let these stack? - // /*if (base1 > newbon->movementspeed) //or should we use a total value? - // newbon->movementspeed = base1;*/ - // break; - // case SE_STR: - // newbon->STR += base1; - // break; - // case SE_DEX: - // newbon->DEX += base1; - // break; - // case SE_AGI: - // newbon->AGI += base1; - // break; - // case SE_STA: - // newbon->STA += base1; - // break; - // case SE_INT: - // newbon->INT += base1; - // break; - // case SE_WIS: - // newbon->WIS += base1; - // break; - // case SE_CHA: - // newbon->CHA += base1; - // break; - // case SE_WaterBreathing: - // //handled by client - // break; - // case SE_CurrentMana: - // newbon->ManaRegen += base1; - // break; - // case SE_ItemManaRegenCapIncrease: - // newbon->ItemManaRegenCap += base1; - // break; - // case SE_ResistFire: - // newbon->FR += base1; - // break; - // case SE_ResistCold: - // newbon->CR += base1; - // break; - // case SE_ResistPoison: - // newbon->PR += base1; - // break; - // case SE_ResistDisease: - // newbon->DR += base1; - // break; - // case SE_ResistMagic: - // newbon->MR += base1; - // break; - // case SE_ResistCorruption: - // newbon->Corrup += base1; - // break; - // case SE_IncreaseSpellHaste: - // break; - // case SE_IncreaseRange: - // break; - // case SE_MaxHPChange: - // newbon->MaxHP += base1; - // break; - // case SE_Packrat: - // newbon->Packrat += base1; - // break; - // case SE_TwoHandBash: - // break; - // case SE_SetBreathLevel: - // break; - // case SE_RaiseStatCap: - // switch(base2) - // { - // //are these #define'd somewhere? - // case 0: //str - // newbon->STRCapMod += base1; - // break; - // case 1: //sta - // newbon->STACapMod += base1; - // break; - // case 2: //agi - // newbon->AGICapMod += base1; - // break; - // case 3: //dex - // newbon->DEXCapMod += base1; - // break; - // case 4: //wis - // newbon->WISCapMod += base1; - // break; - // case 5: //int - // newbon->INTCapMod += base1; - // break; - // case 6: //cha - // newbon->CHACapMod += base1; - // break; - // case 7: //mr - // newbon->MRCapMod += base1; - // break; - // case 8: //cr - // newbon->CRCapMod += base1; - // break; - // case 9: //fr - // newbon->FRCapMod += base1; - // break; - // case 10: //pr - // newbon->PRCapMod += base1; - // break; - // case 11: //dr - // newbon->DRCapMod += base1; - // break; - // case 12: //corruption - // newbon->CorrupCapMod += base1; - // break; - // } - // break; - // case SE_PetDiscipline2: - // break; - // case SE_SpellSlotIncrease: - // break; - // case SE_MysticalAttune: - // newbon->BuffSlotIncrease += base1; - // break; - // case SE_TotalHP: - // newbon->HP += base1; - // break; - // case SE_StunResist: - // newbon->StunResist += base1; - // break; - // case SE_SpellCritChance: - // newbon->CriticalSpellChance += base1; - // break; - // case SE_SpellCritDmgIncrease: - // newbon->SpellCritDmgIncrease += base1; - // break; - // case SE_DotCritDmgIncrease: - // newbon->DotCritDmgIncrease += base1; - // break; - // case SE_ResistSpellChance: - // newbon->ResistSpellChance += base1; - // break; - // case SE_CriticalHealChance: - // newbon->CriticalHealChance += base1; - // break; - // case SE_CriticalHealOverTime: - // newbon->CriticalHealOverTime += base1; - // break; - // case SE_CriticalDoTChance: - // newbon->CriticalDoTChance += base1; - // break; - // case SE_ReduceSkillTimer: - // newbon->SkillReuseTime[base2] += base1; - // break; - // case SE_Fearless: - // newbon->Fearless = true; - // break; - // case SE_PersistantCasting: - // newbon->PersistantCasting += base1; - // break; - // case SE_DelayDeath: - // newbon->DelayDeath += base1; - // break; - // case SE_FrontalStunResist: - // newbon->FrontalStunResist += base1; - // break; - // case SE_ImprovedBindWound: - // newbon->BindWound += base1; - // break; - // case SE_MaxBindWound: - // newbon->MaxBindWound += base1; - // break; - // case SE_ExtraAttackChance: - // newbon->ExtraAttackChance += base1; - // break; - // case SE_SeeInvis: - // newbon->SeeInvis = base1; - // break; - // case SE_BaseMovementSpeed: - // newbon->BaseMovementSpeed += base1; - // break; - // case SE_IncreaseRunSpeedCap: - // newbon->IncreaseRunSpeedCap += base1; - // break; - // case SE_ConsumeProjectile: - // newbon->ConsumeProjectile += base1; - // break; - // case SE_ArcheryDamageModifier: - // newbon->ArcheryDamageModifier += base1; - // break; - // case SE_DamageShield: - // newbon->DamageShield += base1; - // break; - // case SE_CharmBreakChance: - // newbon->CharmBreakChance += base1; - // break; - // case SE_OffhandRiposteFail: - // newbon->OffhandRiposteFail += base1; - // break; - // case SE_ItemAttackCapIncrease: - // newbon->ItemATKCap += base1; - // break; - // case SE_GivePetGroupTarget: - // newbon->GivePetGroupTarget = true; - // break; - // case SE_ItemHPRegenCapIncrease: - // newbon->ItemHPRegenCap = +base1; - // break; - // case SE_Ambidexterity: - // newbon->Ambidexterity += base1; - // break; - // case SE_PetMaxHP: - // newbon->PetMaxHP += base1; - // break; - // case SE_AvoidMeleeChance: - // newbon->AvoidMeleeChance += base1; - // break; - // case SE_CombatStability: - // newbon->CombatStability += base1; - // break; - // case SE_PetCriticalHit: - // newbon->PetCriticalHit += base1; - // break; - // case SE_PetAvoidance: - // newbon->PetAvoidance += base1; - // break; - // case SE_ShieldBlock: - // newbon->ShieldBlock += base1; - // break; - // case SE_SecondaryDmgInc: - // newbon->SecondaryDmgInc = true; - // break; - // case SE_ChangeAggro: - // newbon->hatemod += base1; - // break; - // case SE_EndurancePool: - // newbon->Endurance += base1; - // break; - // case SE_ChannelChanceItems: - // newbon->ChannelChanceItems += base1; - // break; - // case SE_ChannelChanceSpells: - // newbon->ChannelChanceSpells += base1; - // break; - // case SE_DoubleSpecialAttack: - // newbon->DoubleSpecialAttack += base1; - // break; - // case SE_TripleBackstab: - // newbon->TripleBackstab += base1; - // break; - // case SE_FrontalBackstabMinDmg: - // newbon->FrontalBackstabMinDmg = true; - // break; - // case SE_FrontalBackstabChance: - // newbon->FrontalBackstabChance += base1; - // break; - // case SE_BlockBehind: - // newbon->BlockBehind += base1; - // break; - // case SE_StrikeThrough2: - // newbon->StrikeThrough += base1; - // break; - // case SE_DoubleAttackChance: - // newbon->DoubleAttackChance += base1; - // break; - // case SE_GiveDoubleAttack: - // newbon->GiveDoubleAttack += base1; - // break; - // case SE_ProcChance: - // newbon->ProcChance += base1; - // break; - // case SE_RiposteChance: - // newbon->RiposteChance += base1; - // break; - // case SE_Flurry: - // newbon->FlurryChance += base1; - // break; - // case SE_PetFlurry: - // newbon->PetFlurry = base1; - // break; - // case SE_BardSongRange: - // newbon->SongRange += base1; - // break; - // case SE_RootBreakChance: - // newbon->RootBreakChance += base1; - // break; - // case SE_UnfailingDivinity: - // newbon->UnfailingDivinity += base1; - // break; - // - // case SE_ProcOnKillShot: - // for(int i = 0; i < MAX_SPELL_TRIGGER*3; i+=3) - // { - // if(!newbon->SpellOnKill[i] || ((newbon->SpellOnKill[i] == base2) && (newbon->SpellOnKill[i+1] < base1))) - // { - // //base1 = chance, base2 = SpellID to be triggered, base3 = min npc level - // newbon->SpellOnKill[i] = base2; - // newbon->SpellOnKill[i+1] = base1; - // - // if (GetLevel() > 15) - // newbon->SpellOnKill[i+2] = GetLevel() - 15; //AA specifiy "non-trivial" - // else - // newbon->SpellOnKill[i+2] = 0; - // - // break; - // } - // } - // break; - // - // case SE_SpellOnDeath: - // for(int i = 0; i < MAX_SPELL_TRIGGER*2; i+=2) - // { - // if(!newbon->SpellOnDeath[i]) - // { - // // base1 = SpellID to be triggered, base2 = chance to fire - // newbon->SpellOnDeath[i] = base1; - // newbon->SpellOnDeath[i+1] = base2; - // break; - // } - // } - // break; - // - // case SE_TriggerOnCast: - // - // for(int i = 0; i < MAX_SPELL_TRIGGER; i++) - // { - // if (newbon->SpellTriggers[i] == aaid) - // break; - // - // if(!newbon->SpellTriggers[i]) - // { - // //Save the 'aaid' of each triggerable effect to an array - // newbon->SpellTriggers[i] = aaid; - // break; - // } - // } - // break; - // - // case SE_CriticalHitChance: - // { - // if(base2 == -1) - // newbon->CriticalHitChance[HIGHEST_SKILL+1] += base1; - // else - // newbon->CriticalHitChance[base2] += base1; - // } - // break; - // - // case SE_CriticalDamageMob: - // { - // // base1 = effect value, base2 = skill restrictions(-1 for all) - // if(base2 == -1) - // newbon->CritDmgMob[HIGHEST_SKILL+1] += base1; - // else - // newbon->CritDmgMob[base2] += base1; - // break; - // } - // - // case SE_CriticalSpellChance: - // { - // newbon->CriticalSpellChance += base1; - // - // if (base2 > newbon->SpellCritDmgIncrease) - // newbon->SpellCritDmgIncrease = base2; - // - // break; - // } - // - // case SE_ResistFearChance: - // { - // if(base1 == 100) // If we reach 100% in a single spell/item then we should be immune to negative fear resist effects until our immunity is over - // newbon->Fearless = true; - // - // newbon->ResistFearChance += base1; // these should stack - // break; - // } - // - // case SE_SkillDamageAmount: - // { - // if(base2 == -1) - // newbon->SkillDamageAmount[HIGHEST_SKILL+1] += base1; - // else - // newbon->SkillDamageAmount[base2] += base1; - // break; - // } - // - // case SE_SpecialAttackKBProc: - // { - // //You can only have one of these per client. [AA Dragon Punch] - // newbon->SpecialAttackKBProc[0] = base1; //Chance base 100 = 25% proc rate - // newbon->SpecialAttackKBProc[1] = base2; //Skill to KB Proc Off - // break; - // } - // - // case SE_DamageModifier: - // { - // if(base2 == -1) - // newbon->DamageModifier[HIGHEST_SKILL+1] += base1; - // else - // newbon->DamageModifier[base2] += base1; - // break; - // } - // - // case SE_SlayUndead: - // { - // if(newbon->SlayUndead[1] < base1) - // newbon->SlayUndead[0] = base1; // Rate - // newbon->SlayUndead[1] = base2; // Damage Modifier - // break; - // } - // - // case SE_GiveDoubleRiposte: - // { - // //0=Regular Riposte 1=Skill Attack Riposte 2=Skill - // if(base2 == 0){ - // if(newbon->GiveDoubleRiposte[0] < base1) - // newbon->GiveDoubleRiposte[0] = base1; - // } - // //Only for special attacks. - // else if(base2 > 0 && (newbon->GiveDoubleRiposte[1] < base1)){ - // newbon->GiveDoubleRiposte[1] = base1; - // newbon->GiveDoubleRiposte[2] = base2; - // } - // - // break; - // } - // - // //Kayen: Not sure best way to implement this yet. - // //Physically raises skill cap ie if 55/55 it will raise to 55/60 - // case SE_RaiseSkillCap: - // { - // if(newbon->RaiseSkillCap[0] < base1){ - // newbon->RaiseSkillCap[0] = base1; //value - // newbon->RaiseSkillCap[1] = base2; //skill - // } - // break; - // } - // - // case SE_MasteryofPast: - // { - // if(newbon->MasteryofPast < base1) - // newbon->MasteryofPast = base1; - // break; - // } - // - // case SE_CastingLevel2: - // case SE_CastingLevel: - // { - // newbon->effective_casting_level += base1; - // break; - // } - // - // - // case SE_DivineSave: - // { - // if(newbon->DivineSaveChance[0] < base1) - // { - // newbon->DivineSaveChance[0] = base1; - // newbon->DivineSaveChance[1] = base2; - // } - // break; - // } - // - // case SE_SpellEffectResistChance: - // { - // for(int e = 0; e < MAX_RESISTABLE_EFFECTS*2; e+=2) - // { - // if(!newbon->SEResist[e] || ((newbon->SEResist[e] = base2) && (newbon->SEResist[e+1] < base1)) ){ - // newbon->SEResist[e] = base2; - // newbon->SEResist[e+1] = base1; - // break; - // } - // } - // break; - // } - // - // case SE_MitigateDamageShield: - // { - // if (base1 < 0) - // base1 = base1*(-1); - // - // newbon->DSMitigationOffHand += base1; - // break; - // } - // - // case SE_FinishingBlow: - // { - // - // //base1 = chance, base2 = damage - // if (newbon->FinishingBlow[1] < base2){ - // newbon->FinishingBlow[0] = base1; - // newbon->FinishingBlow[1] = base2; - // } - // break; - // } - // - // case SE_FinishingBlowLvl: - // { - // //base1 = level, base2 = ??? (Set to 200 in AA data, possible proc rate mod?) - // if (newbon->FinishingBlowLvl[0] < base1){ - // newbon->FinishingBlowLvl[0] = base1; - // newbon->FinishingBlowLvl[1] = base2; - // } - // break; - // } - // } - //} + while(current) { + if(!CanUseAlternateAdvancementRank(current)) { + current = nullptr; + } else { + current = current->next; + points++; + } + } + + if(points > 0) { + SetAA(id, points); + } + + ++iter; + } } bool Bot::IsValidRaceClassCombo() { @@ -6298,7 +5671,7 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b return false; } -int32 Bot::CalcBotAAFocus(BotfocusType type, uint32 aa_ID, uint16 spell_id) +int32 Bot::CalcBotAAFocus(BotfocusType type, uint32 aa_ID, uint32 points, uint16 spell_id) { const SPDat_Spell_Struct &spell = spells[spell_id]; @@ -6316,401 +5689,401 @@ int32 Bot::CalcBotAAFocus(BotfocusType type, uint32 aa_ID, uint16 spell_id) bool LimitFound = false; int FocusCount = 0; - //old AA - //std::map >::const_iterator find_iter = aa_effects.find(aa_ID); - //if(find_iter == aa_effects.end()) - //{ - // return 0; - //} - // - //for (std::map::const_iterator iter = aa_effects[aa_ID].begin(); iter != aa_effects[aa_ID].end(); ++iter) - //{ - // effect = iter->second.skill_id; - // base1 = iter->second.base1; - // base2 = iter->second.base2; - // slot = iter->second.slot; - // - // //AA Foci's can contain multiple focus effects within the same AA. - // //To handle this we will not automatically return zero if a limit is found. - // //Instead if limit is found and multiple effects, we will reset the limit check - // //when the next valid focus effect is found. - // if (IsFocusEffect(0, 0, true,effect) || (effect == SE_TriggerOnCast)){ - // FocusCount++; - // //If limit found on prior check next, else end loop. - // if (FocusCount > 1){ - // if (LimitFound){ - // value = 0; - // LimitFound = false; - // } - // - // else{ - // break; - // } - // } - // } - // - // - // switch (effect) - // { - // case SE_Blank: - // break; - // - // //Handle Focus Limits - // case SE_LimitResist: - // if(base1) - // { - // if(spell.resisttype != base1) - // LimitFound = true; - // } - // break; - // case SE_LimitInstant: - // if(spell.buffduration) - // LimitFound = true; - // break; - // case SE_LimitMaxLevel: - // spell_level = spell.classes[(GetClass()%16) - 1]; - // lvldiff = spell_level - base1; - // //every level over cap reduces the effect by base2 percent unless from a clicky when ItemCastsUseFocus is true - // if(lvldiff > 0 && (spell_level <= RuleI(Character, MaxLevel) || RuleB(Character, ItemCastsUseFocus) == false)) - // { - // if(base2 > 0) - // { - // lvlModifier -= base2*lvldiff; - // if(lvlModifier < 1) - // LimitFound = true; - // } - // else { - // LimitFound = true; - // } - // } - // break; - // case SE_LimitMinLevel: - // if((spell.classes[(GetClass()%16) - 1]) < base1) - // LimitFound = true; - // break; - // case SE_LimitCastTimeMin: - // if (spell.cast_time < base1) - // LimitFound = true; - // break; - // case SE_LimitSpell: - // // Exclude spell(any but this) - // if(base1 < 0) { - // if (spell_id == (base1*-1)) - // LimitFound = true; - // } - // else { - // // Include Spell(only this) - // if (spell_id != base1) - // LimitFound = true; - // } - // break; - // case SE_LimitMinDur: - // if (base1 > CalcBuffDuration_formula(GetLevel(), spell.buffdurationformula, spell.buffduration)) - // LimitFound = true; - // break; - // case SE_LimitEffect: - // // Exclude effect(any but this) - // if(base1 < 0) { - // if(IsEffectInSpell(spell_id,(base1*-1))) - // LimitFound = true; - // } - // else { - // // Include effect(only this) - // if(!IsEffectInSpell(spell_id,base1)) - // LimitFound = true; - // } - // break; - // case SE_LimitSpellType: - // switch(base1) - // { - // case 0: - // if (!IsDetrimentalSpell(spell_id)) - // LimitFound = true; - // break; - // case 1: - // if (!IsBeneficialSpell(spell_id)) - // LimitFound = true; - // break; - // } - // break; - // - // case SE_LimitManaMin: - // if(spell.mana < base1) - // LimitFound = true; - // break; - // - // case SE_LimitTarget: - // // Exclude - // if(base1 < 0){ - // if(-base1 == spell.targettype) - // LimitFound = true; - // } - // // Include - // else { - // if(base1 != spell.targettype) - // LimitFound = true; - // } - // break; - // - // case SE_LimitCombatSkills: - // // 1 is for disciplines only - // if(base1 == 1 && !IsDiscipline(spell_id)) - // LimitFound = true; - // // 0 is spells only - // else if(base1 == 0 && IsDiscipline(spell_id)) - // LimitFound = true; - // break; - // - // case SE_LimitSpellGroup: - // if(base1 > 0 && base1 != spell.spellgroup) - // LimitFound = true; - // else if(base1 < 0 && base1 == spell.spellgroup) - // LimitFound = true; - // break; - // - // - // case SE_LimitCastingSkill: - // LimitSpellSkill = true; - // if(base1 == spell.skill) - // SpellSkill_Found = true; - // break; - // - // case SE_LimitClass: - // //Do not use this limit more then once per spell. If multiple class, treat value like items would. - // if (!PassLimitClass(base1, GetClass())) - // LimitFound = true; - // break; - // - // - // //Handle Focus Effects - // case SE_ImprovedDamage: - // if (type == focusImprovedDamage && base1 > value) - // value = base1; - // break; - // - // case SE_ImprovedHeal: - // if (type == focusImprovedHeal && base1 > value) - // value = base1; - // break; - // - // case SE_ReduceManaCost: - // if (type == focusManaCost ) - // value = base1; - // break; - // - // case SE_IncreaseSpellHaste: - // if (type == focusSpellHaste && base1 > value) - // value = base1; - // break; - // - // case SE_IncreaseSpellDuration: - // if (type == focusSpellDuration && base1 > value) - // value = base1; - // break; - // - // case SE_SpellDurationIncByTic: - // if (type == focusSpellDurByTic && base1 > value) - // value = base1; - // break; - // - // case SE_SwarmPetDuration: - // if (type == focusSwarmPetDuration && base1 > value) - // value = base1; - // break; - // - // case SE_IncreaseRange: - // if (type == focusRange && base1 > value) - // value = base1; - // break; - // - // case SE_ReduceReagentCost: - // if (type == focusReagentCost && base1 > value) - // value = base1; - // break; - // - // case SE_PetPowerIncrease: - // if (type == focusPetPower && base1 > value) - // value = base1; - // break; - // - // case SE_SpellResistReduction: - // if (type == focusResistRate && base1 > value) - // value = base1; - // break; - // - // case SE_SpellHateMod: - // if (type == focusSpellHateMod) - // { - // if(value != 0) - // { - // if(value > 0) - // { - // if(base1 > value) - // { - // value = base1; - // } - // } - // else - // { - // if(base1 < value) - // { - // value = base1; - // } - // } - // } - // else - // value = base1; - // } - // break; - // - // case SE_ReduceReuseTimer: - // { - // if(type == focusReduceRecastTime) - // value = base1 / 1000; - // - // break; - // } - // - // case SE_TriggerOnCast: - // { - // if(type == focusTriggerOnCast) - // { - // if(zone->random.Int(0, 100) <= base1){ - // value = base2; - // } - // - // else{ - // value = 0; - // LimitFound = true; - // } - // } - // break; - // } - // case SE_FcSpellVulnerability: - // { - // if(type == focusSpellVulnerability) - // { - // value = base1; - // } - // break; - // } - // case SE_BlockNextSpellFocus: - // { - // if(type == focusBlockNextSpell) - // { - // if(zone->random.Int(1, 100) <= base1) - // value = 1; - // } - // break; - // } - // case SE_FcTwincast: - // { - // if(type == focusTwincast) - // { - // value = base1; - // } - // break; - // } - // - // /* - // case SE_SympatheticProc: - // { - // if(type == focusSympatheticProc) - // { - // float ProcChance, ProcBonus; - // int16 ProcRateMod = base1; //Baseline is 100 for most Sympathetic foci - // int32 cast_time = GetActSpellCasttime(spell_id, spells[spell_id].cast_time); - // GetSympatheticProcChances(ProcBonus, ProcChance, cast_time, ProcRateMod); - // - // if(zone->random.Real(0, 1) <= ProcChance) - // value = focus_id; - // - // else - // value = 0; - // } - // break; - // } - // */ - // case SE_FcDamageAmt: - // { - // if(type == focusFcDamageAmt) - // value = base1; - // - // break; - // } - // - // case SE_FcDamageAmtCrit: - // { - // if(type == focusFcDamageAmtCrit) - // value = base1; - // - // break; - // } - // - // case SE_FcDamageAmtIncoming: - // { - // if(type == focusFcDamageAmtIncoming) - // value = base1; - // - // break; - // } - // - // case SE_FcHealAmtIncoming: - // if(type == focusFcHealAmtIncoming) - // value = base1; - // break; - // - // case SE_FcHealPctCritIncoming: - // if (type == focusFcHealPctCritIncoming) - // value = base1; - // break; - // - // case SE_FcHealAmtCrit: - // if(type == focusFcHealAmtCrit) - // value = base1; - // break; - // - // case SE_FcHealAmt: - // if(type == focusFcHealAmt) - // value = base1; - // break; - // - // case SE_FcHealPctIncoming: - // if(type == focusFcHealPctIncoming) - // value = base1; - // break; - // - // case SE_FcBaseEffects: - // { - // if (type == focusFcBaseEffects) - // value = base1; - // - // break; - // } - // case SE_FcDamagePctCrit: - // { - // if(type == focusFcDamagePctCrit) - // value = base1; - // - // break; - // } - // - // case SE_FcIncreaseNumHits: - // { - // if(type == focusIncreaseNumHits) - // value = base1; - // - // break; - // } + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa_ID, points); + auto ability = ability_rank.first; + auto rank = ability_rank.second; - ////Check for spell skill limits. - //if ((LimitSpellSkill) && (!SpellSkill_Found)) - // return 0; - // - // } - //} + if(!ability) { + return 0; + } - if (LimitFound){ + for(auto &eff : rank->effects) { + effect = eff.effect_id; + base1 = eff.base1; + base2 = eff.base2; + slot = eff.slot; + + //AA Foci's can contain multiple focus effects within the same AA. + //To handle this we will not automatically return zero if a limit is found. + //Instead if limit is found and multiple effects, we will reset the limit check + //when the next valid focus effect is found. + if (IsFocusEffect(0, 0, true,effect) || (effect == SE_TriggerOnCast)){ + FocusCount++; + //If limit found on prior check next, else end loop. + if (FocusCount > 1){ + if (LimitFound){ + value = 0; + LimitFound = false; + } + + else{ + break; + } + } + } + + + switch (effect) + { + case SE_Blank: + break; + + //Handle Focus Limits + case SE_LimitResist: + if(base1) + { + if(spell.resisttype != base1) + LimitFound = true; + } + break; + case SE_LimitInstant: + if(spell.buffduration) + LimitFound = true; + break; + case SE_LimitMaxLevel: + spell_level = spell.classes[(GetClass()%16) - 1]; + lvldiff = spell_level - base1; + //every level over cap reduces the effect by base2 percent unless from a clicky when ItemCastsUseFocus is true + if(lvldiff > 0 && (spell_level <= RuleI(Character, MaxLevel) || RuleB(Character, ItemCastsUseFocus) == false)) + { + if(base2 > 0) + { + lvlModifier -= base2*lvldiff; + if(lvlModifier < 1) + LimitFound = true; + } + else { + LimitFound = true; + } + } + break; + case SE_LimitMinLevel: + if((spell.classes[(GetClass()%16) - 1]) < base1) + LimitFound = true; + break; + case SE_LimitCastTimeMin: + if (spell.cast_time < base1) + LimitFound = true; + break; + case SE_LimitSpell: + // Exclude spell(any but this) + if(base1 < 0) { + if (spell_id == (base1*-1)) + LimitFound = true; + } + else { + // Include Spell(only this) + if (spell_id != base1) + LimitFound = true; + } + break; + case SE_LimitMinDur: + if (base1 > CalcBuffDuration_formula(GetLevel(), spell.buffdurationformula, spell.buffduration)) + LimitFound = true; + break; + case SE_LimitEffect: + // Exclude effect(any but this) + if(base1 < 0) { + if(IsEffectInSpell(spell_id,(base1*-1))) + LimitFound = true; + } + else { + // Include effect(only this) + if(!IsEffectInSpell(spell_id,base1)) + LimitFound = true; + } + break; + case SE_LimitSpellType: + switch(base1) + { + case 0: + if (!IsDetrimentalSpell(spell_id)) + LimitFound = true; + break; + case 1: + if (!IsBeneficialSpell(spell_id)) + LimitFound = true; + break; + } + break; + + case SE_LimitManaMin: + if(spell.mana < base1) + LimitFound = true; + break; + + case SE_LimitTarget: + // Exclude + if(base1 < 0){ + if(-base1 == spell.targettype) + LimitFound = true; + } + // Include + else { + if(base1 != spell.targettype) + LimitFound = true; + } + break; + + case SE_LimitCombatSkills: + // 1 is for disciplines only + if(base1 == 1 && !IsDiscipline(spell_id)) + LimitFound = true; + // 0 is spells only + else if(base1 == 0 && IsDiscipline(spell_id)) + LimitFound = true; + break; + + case SE_LimitSpellGroup: + if(base1 > 0 && base1 != spell.spellgroup) + LimitFound = true; + else if(base1 < 0 && base1 == spell.spellgroup) + LimitFound = true; + break; + + + case SE_LimitCastingSkill: + LimitSpellSkill = true; + if(base1 == spell.skill) + SpellSkill_Found = true; + break; + + case SE_LimitClass: + //Do not use this limit more then once per spell. If multiple class, treat value like items would. + if (!PassLimitClass(base1, GetClass())) + LimitFound = true; + break; + + + //Handle Focus Effects + case SE_ImprovedDamage: + if (type == focusImprovedDamage && base1 > value) + value = base1; + break; + + case SE_ImprovedHeal: + if (type == focusImprovedHeal && base1 > value) + value = base1; + break; + + case SE_ReduceManaCost: + if (type == focusManaCost ) + value = base1; + break; + + case SE_IncreaseSpellHaste: + if (type == focusSpellHaste && base1 > value) + value = base1; + break; + + case SE_IncreaseSpellDuration: + if (type == focusSpellDuration && base1 > value) + value = base1; + break; + + case SE_SpellDurationIncByTic: + if (type == focusSpellDurByTic && base1 > value) + value = base1; + break; + + case SE_SwarmPetDuration: + if (type == focusSwarmPetDuration && base1 > value) + value = base1; + break; + + case SE_IncreaseRange: + if (type == focusRange && base1 > value) + value = base1; + break; + + case SE_ReduceReagentCost: + if (type == focusReagentCost && base1 > value) + value = base1; + break; + + case SE_PetPowerIncrease: + if (type == focusPetPower && base1 > value) + value = base1; + break; + + case SE_SpellResistReduction: + if (type == focusResistRate && base1 > value) + value = base1; + break; + + case SE_SpellHateMod: + if (type == focusSpellHateMod) + { + if(value != 0) + { + if(value > 0) + { + if(base1 > value) + { + value = base1; + } + } + else + { + if(base1 < value) + { + value = base1; + } + } + } + else + value = base1; + } + break; + + case SE_ReduceReuseTimer: + { + if(type == focusReduceRecastTime) + value = base1 / 1000; + + break; + } + + case SE_TriggerOnCast: + { + if(type == focusTriggerOnCast) + { + if(zone->random.Int(0, 100) <= base1){ + value = base2; + } + + else{ + value = 0; + LimitFound = true; + } + } + break; + } + case SE_FcSpellVulnerability: + { + if(type == focusSpellVulnerability) + { + value = base1; + } + break; + } + case SE_BlockNextSpellFocus: + { + if(type == focusBlockNextSpell) + { + if(zone->random.Int(1, 100) <= base1) + value = 1; + } + break; + } + case SE_FcTwincast: + { + if(type == focusTwincast) + { + value = base1; + } + break; + } + + /* + case SE_SympatheticProc: + { + if(type == focusSympatheticProc) + { + float ProcChance, ProcBonus; + int16 ProcRateMod = base1; //Baseline is 100 for most Sympathetic foci + int32 cast_time = GetActSpellCasttime(spell_id, spells[spell_id].cast_time); + GetSympatheticProcChances(ProcBonus, ProcChance, cast_time, ProcRateMod); + + if(zone->random.Real(0, 1) <= ProcChance) + value = focus_id; + + else + value = 0; + } + break; + } + */ + case SE_FcDamageAmt: + { + if(type == focusFcDamageAmt) + value = base1; + + break; + } + + case SE_FcDamageAmtCrit: + { + if(type == focusFcDamageAmtCrit) + value = base1; + + break; + } + + case SE_FcDamageAmtIncoming: + { + if(type == focusFcDamageAmtIncoming) + value = base1; + + break; + } + + case SE_FcHealAmtIncoming: + if(type == focusFcHealAmtIncoming) + value = base1; + break; + + case SE_FcHealPctCritIncoming: + if (type == focusFcHealPctCritIncoming) + value = base1; + break; + + case SE_FcHealAmtCrit: + if(type == focusFcHealAmtCrit) + value = base1; + break; + + case SE_FcHealAmt: + if(type == focusFcHealAmt) + value = base1; + break; + + case SE_FcHealPctIncoming: + if(type == focusFcHealPctIncoming) + value = base1; + break; + + case SE_FcBaseEffects: + { + if (type == focusFcBaseEffects) + value = base1; + + break; + } + case SE_FcDamagePctCrit: + { + if(type == focusFcDamagePctCrit) + value = base1; + + break; + } + + case SE_FcIncreaseNumHits: + { + if(type == focusIncreaseNumHits) + value = base1; + + break; + } + } + + //Check for spell skill limits. + if ((LimitSpellSkill) && (!SpellSkill_Found)) { + return 0; + } + } + + if (LimitFound) { return 0; } @@ -6875,31 +6248,34 @@ int32 Bot::GetBotFocusEffect(BotfocusType bottype, uint16 spell_id) { } // AA Focus - if (aabonuses.FocusEffects[bottype]){ - //old aa - //int totalAAs = database.CountAAs(); - //int32 Total3 = 0; - //uint32 slots = 0; - //uint32 aa_AA = 0; - //uint32 aa_value = 0; - // - //for (int i = 0; i < totalAAs; i++) { //iterate through all of the client's AAs - // std::map::iterator aa = botAAs.find(i); - // if(aa != botAAs.end()) { // make sure aa exists or we'll crash zone - // aa_AA = aa->second.aa_id; //same as aaid from the aa_effects table - // aa_value = aa->second.total_levels; //how many points in it - // if (aa_AA < 1 || aa_value < 1) - // continue; - // - // Total3 = CalcBotAAFocus(bottype, aa_AA, spell_id); - // if (Total3 > 0 && realTotal3 >= 0 && Total3 > realTotal3) { - // realTotal3 = Total3; - // } - // else if (Total3 < 0 && Total3 < realTotal3) { - // realTotal3 = Total3; - // } - // } - //} + if (aabonuses.FocusEffects[bottype]) { + int32 Total3 = 0; + uint32 slots = 0; + uint32 aa_AA = 0; + uint32 aa_value = 0; + + for(auto &aa : aa_ranks) { + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa.first, aa.second.first); + auto ability = ability_rank.first; + auto rank = ability_rank.second; + + if(!ability) { + continue; + } + + aa_AA = ability->id; + aa_value = aa.second.first; + if (aa_AA < 1 || aa_value < 1) + continue; + + Total3 = CalcBotAAFocus(bottype, aa_AA, aa_value, spell_id); + if (Total3 > 0 && realTotal3 >= 0 && Total3 > realTotal3) { + realTotal3 = Total3; + } + else if (Total3 < 0 && Total3 < realTotal3) { + realTotal3 = Total3; + } + } } if(bottype == BotfocusReagentCost && IsSummonPetSpell(spell_id) && GetAA(aaElementalPact)) @@ -8931,7 +8307,6 @@ int32 Bot::GetActSpellCost(uint16 spell_id, int32 cost) { break; } - //aa old bonus += 0.05 * GetAA(aaAdvancedSpellCastingMastery); if(SuccessChance <= (SpecializeSkill * 0.3 * bonus)) @@ -9559,7 +8934,7 @@ void Bot::CalcBonuses() { GenerateBaseStats(); CalcItemBonuses(&itembonuses); CalcSpellBonuses(&spellbonuses); - GenerateAABonuses(&aabonuses); + CalcAABonuses(&aabonuses); SetAttackTimer(); CalcATK(); diff --git a/zone/bot.h b/zone/bot.h index 4a88c5f18..6103fa7f2 100644 --- a/zone/bot.h +++ b/zone/bot.h @@ -449,7 +449,6 @@ public: bool IsBotWISCaster() { return (GetClass() == CLERIC || GetClass() == DRUID || GetClass() == SHAMAN); } bool CanHeal(); int GetRawACNoShield(int &shield_ac); - void ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon); bool GetHasBeenSummoned() { return _hasBeenSummoned; } const glm::vec3 GetPreSummonLocation() const { return m_PreSummonLocation; } bool GetGroupMessagesOn() { return _groupMessagesOn; } @@ -561,7 +560,7 @@ protected: virtual bool CheckBotDoubleAttack(bool Triple = false); virtual int32 GetBotFocusEffect(BotfocusType bottype, uint16 spell_id); virtual int32 CalcBotFocusEffect(BotfocusType bottype, uint16 focus_id, uint16 spell_id, bool best_focus=false); - virtual int32 CalcBotAAFocus(BotfocusType type, uint32 aa_ID, uint16 spell_id); + virtual int32 CalcBotAAFocus(BotfocusType type, uint32 aa_ID, uint32 points, uint16 spell_id); virtual void PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* client); virtual bool AIDoSpellCast(uint8 i, Mob* tar, int32 mana_cost, uint32* oDontDoAgainBefore = 0); virtual float GetMaxMeleeRangeToTarget(Mob* target); @@ -642,12 +641,12 @@ private: uint8 _baseGender; // Bots gender. Necessary to preserve the original value otherwise it can be changed by illusions. // Class Methods + void LoadAAs(); int32 acmod(); void GenerateBaseStats(); void GenerateAppearance(); void GenerateArmorClass(); int32 GenerateBaseHitPoints(); - void GenerateAABonuses(StatBonuses* newbon); int32 GenerateBaseManaPoints(); void GenerateSpecialAttacks(); void SetBotID(uint32 botID); diff --git a/zone/client.h b/zone/client.h index e830edfa8..2689964f0 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1260,8 +1260,6 @@ protected: void AdditiveWornBonuses(const ItemInst *inst, StatBonuses* newbon, bool isAug = false); int CalcRecommendedLevelBonus(uint8 level, uint8 reclevel, int basestat); void CalcEdibleBonuses(StatBonuses* newbon); - void CalcAABonuses(StatBonuses* newbon); - void ApplyAABonuses(const AA::Rank &rank, StatBonuses* newbon); void ProcessItemCaps(); void MakeBuffFadePacket(uint16 spell_id, int slot_id, bool send_message = true); bool client_data_loaded; diff --git a/zone/mob.h b/zone/mob.h index 3e4f5ea39..959c5e543 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -967,6 +967,8 @@ public: bool CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price); int GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in); void ExpendAlternateAdvancementCharge(uint32 aa_id); + void CalcAABonuses(StatBonuses* newbon); + void ApplyAABonuses(const AA::Rank &rank, StatBonuses* newbon); protected: void CommonDamage(Mob* other, int32 &damage, const uint16 spell_id, const SkillUseTypes attack_skill, bool &avoidable, const int8 buffslot, const bool iBuffTic); From d3280c9676ae24e2d3995c14b1badd7552232bed Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 16 Jun 2015 12:33:14 -0700 Subject: [PATCH 24/90] Removing old code, need to reimplement warcry and rampage still at least --- zone/aa.cpp | 51 ------------------------------------- zone/aa.h | 15 ----------- zone/attack.cpp | 8 ------ zone/client.h | 9 +------ zone/client_process.cpp | 37 ++++++++++++++------------- zone/command.cpp | 15 ++++++++--- zone/spell_effects.cpp | 56 ++++++++++++++++++++--------------------- zone/spells.cpp | 15 ++++++----- 8 files changed, 65 insertions(+), 141 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index 1f0b5b086..766057e2f 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -440,48 +440,6 @@ void Mob::WakeTheDead(uint16 spell_id, Mob *target, uint32 duration) target->AddToHateList(this, 1, 0); } -//turn on an AA effect -//duration == 0 means no time limit, used for one-shot deals, etc.. -void Client::EnableAAEffect(aaEffectType type, uint32 duration) { - if(type > _maxaaEffectType) - return; //for now, special logic needed. - m_epp.aa_effects |= 1 << (type-1); - - if(duration > 0) { - p_timers.Start(pTimerAAEffectStart + type, duration); - } else { - p_timers.Clear(&database, pTimerAAEffectStart + type); - } -} - -void Client::DisableAAEffect(aaEffectType type) { - if(type > _maxaaEffectType) - return; //for now, special logic needed. - uint32 bit = 1 << (type-1); - if(m_epp.aa_effects & bit) { - m_epp.aa_effects ^= bit; - } - p_timers.Clear(&database, pTimerAAEffectStart + type); -} - -/* -By default an AA effect is a one shot deal, unless -a duration timer is set. -*/ -bool Client::CheckAAEffect(aaEffectType type) { - if(type > _maxaaEffectType) - return(false); //for now, special logic needed. - if(m_epp.aa_effects & (1 << (type-1))) { //is effect enabled? - //has our timer expired? - if(p_timers.Expired(&database, pTimerAAEffectStart + type)) { - DisableAAEffect(type); - return(false); - } - return(true); - } - return(false); -} - void Client::ResetAA() { RefundAA(); uint32 i; @@ -788,14 +746,6 @@ void Client::InspectBuffs(Client* Inspector, int Rank) Inspector->FastQueuePacket(&outapp); } -void Client::DurationRampage(uint32 duration) -{ - if(duration) { - m_epp.aa_effects |= 1 << (aaEffectRampage-1); - p_timers.Start(pTimerAAEffectStart + aaEffectRampage, duration); - } -} - void Client::RefundAA() { int refunded = 0; @@ -933,7 +883,6 @@ void Client::SendAlternateAdvancementRank(int aa_id, int level) { void Client::SendAlternateAdvancementStats() { EQApplicationPacket* outapp = new EQApplicationPacket(OP_AAExpUpdate, sizeof(AltAdvStats_Struct)); AltAdvStats_Struct *aps = (AltAdvStats_Struct *)outapp->pBuffer; - aps->experience = m_pp.expAA; aps->experience = (uint32)(((float)330.0f * (float)m_pp.expAA) / (float)max_AAXP); aps->unspent = m_pp.aapoints; aps->percentage = m_epp.perAA; diff --git a/zone/aa.h b/zone/aa.h index 0ee32c99a..76df0f388 100644 --- a/zone/aa.h +++ b/zone/aa.h @@ -23,21 +23,6 @@ typedef enum { aaActionFadingMemories = 16 } aaNonspellAction; -//use these for AAs which dont cast spells, yet need effects -//if this list grows beyond 32, more work is needed in *AAEffect -typedef enum { //AA Effect IDs - aaEffectMassGroupBuff = 1, //unused - Handled via spell effect. - aaEffectRampage, - aaEffectSharedHealth, - aaEffectFlamingArrows, - aaEffectFrostArrows, - aaEffectWarcry, - aaEffectLeechTouch, - aaEffectProjectIllusion, // unused - Handled via spell effect - _maxaaEffectType = 32 -} aaEffectType; - - enum { //leadership AA indexes groupAAMarkNPC = 0, groupAANPCHealth, diff --git a/zone/attack.cpp b/zone/attack.cpp index fda7837ab..864efa3e7 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -3519,14 +3519,6 @@ void Mob::CommonDamage(Mob* attacker, int32 &damage, const uint16 spell_id, cons if(damage > 0) { //if there is some damage being done and theres an attacker involved if(attacker) { - if(spell_id == SPELL_HARM_TOUCH2 && attacker->IsClient() && attacker->CastToClient()->CheckAAEffect(aaEffectLeechTouch)){ - int healed = damage; - healed = attacker->GetActSpellHealing(spell_id, healed); - attacker->HealDamage(healed); - entity_list.MessageClose(this, true, 300, MT_Emote, "%s beams a smile at %s", attacker->GetCleanName(), this->GetCleanName() ); - attacker->CastToClient()->DisableAAEffect(aaEffectLeechTouch); - } - // if spell is lifetap add hp to the caster if (spell_id != SPELL_UNKNOWN && IsLifetapSpell( spell_id )) { int healed = damage; diff --git a/zone/client.h b/zone/client.h index 2689964f0..034ff83b4 100644 --- a/zone/client.h +++ b/zone/client.h @@ -541,7 +541,6 @@ public: bool Flurry(); bool Rampage(); - void DurationRampage(uint32 duration); inline uint32 GetEXP() const { return m_pp.exp; } @@ -784,13 +783,7 @@ public: int16 CalcAAFocus(focusType type, const AA::Rank &rank, uint16 spell_id); void SetAATitle(const char *Title); void SetTitleSuffix(const char *txt); - - //old AA Methods that are slated for removal - void MemorizeSpell(uint32 slot,uint32 spellid,uint32 scribing); - void EnableAAEffect(aaEffectType type, uint32 duration = 0); - void DisableAAEffect(aaEffectType type); - bool CheckAAEffect(aaEffectType type); - + void MemorizeSpell(uint32 slot, uint32 spellid, uint32 scribing); int32 acmod(); // Item methods diff --git a/zone/client_process.cpp b/zone/client_process.cpp index 4a16e7698..603636a82 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -391,12 +391,13 @@ bool Client::Process() { } else if (auto_attack_target->GetHP() > -10) // -10 so we can watch people bleed in PvP { - if(CheckAAEffect(aaEffectRampage)) - { - entity_list.AEAttack(this, 30); - } else { + //old aa + //if(CheckAAEffect(aaEffectRampage)) + //{ + // entity_list.AEAttack(this, 30); + //} else { Attack(auto_attack_target, MainPrimary); // Kaiyodo - added attacking hand to arguments - } + //} ItemInst *wpn = GetInv().GetItem(MainPrimary); TryWeaponProc(wpn, auto_attack_target, MainPrimary); @@ -406,11 +407,11 @@ bool Client::Process() { CheckIncreaseSkill(SkillDoubleAttack, auto_attack_target, -10); if(CheckDoubleAttack()) { //should we allow rampage on double attack? - if(CheckAAEffect(aaEffectRampage)) { - entity_list.AEAttack(this, 30); - } else { + //if(CheckAAEffect(aaEffectRampage)) { + // entity_list.AEAttack(this, 30); + //} else { Attack(auto_attack_target, MainPrimary, false); - } + //} } //triple attack: rangers, monks, warriors, berserkers over level 60 @@ -499,21 +500,21 @@ bool Client::Process() { float random = zone->random.Real(0, 1); CheckIncreaseSkill(SkillDualWield, auto_attack_target, -10); if (random < DualWieldProbability){ // Max 78% of DW - if(CheckAAEffect(aaEffectRampage)) { - entity_list.AEAttack(this, 30, MainSecondary); - } else { + //if(CheckAAEffect(aaEffectRampage)) { + // entity_list.AEAttack(this, 30, MainSecondary); + //} else { Attack(auto_attack_target, MainSecondary); // Single attack with offhand - } + //} ItemInst *wpn = GetInv().GetItem(MainSecondary); TryWeaponProc(wpn, auto_attack_target, MainSecondary); if( CanThisClassDoubleAttack() && CheckDoubleAttack()) { - if(CheckAAEffect(aaEffectRampage)) { - entity_list.AEAttack(this, 30, MainSecondary); - } else { - if(auto_attack_target && auto_attack_target->GetHP() > -10) + //if(CheckAAEffect(aaEffectRampage)) { + // entity_list.AEAttack(this, 30, MainSecondary); + //} else { + // if(auto_attack_target && auto_attack_target->GetHP() > -10) Attack(auto_attack_target, MainSecondary); // Single attack with offhand - } + //} } } } diff --git a/zone/command.cpp b/zone/command.cpp index 16f50e7d7..ab2b4ad78 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -5555,13 +5555,20 @@ void command_setaapts(Client *c, const Seperator *sep) else if(atoi(sep->arg[2]) <= 0 || atoi(sep->arg[2]) > 200) c->Message(0, "You must have a number greater than 0 for points and no more than 200."); else if(!strcasecmp(sep->arg[1], "group")) { - t->SetLeadershipEXP(atoi(sep->arg[2])*GROUP_EXP_PER_POINT, t->GetRaidEXP()); + t->GetPP().group_leadership_points = atoi(sep->arg[2]); + t->GetPP().group_leadership_exp = 0; + t->Message(MT_Experience, "Setting Group AA points to %u", t->GetPP().group_leadership_points); + t->SendLeadershipEXPUpdate(); } else if(!strcasecmp(sep->arg[1], "raid")) { - t->SetLeadershipEXP(t->GetGroupEXP(), atoi(sep->arg[2])*RAID_EXP_PER_POINT); + t->GetPP().raid_leadership_points = atoi(sep->arg[2]); + t->GetPP().raid_leadership_exp = 0; + t->Message(MT_Experience, "Setting Raid AA points to %u", t->GetPP().raid_leadership_points); + t->SendLeadershipEXPUpdate(); } else { - t->SetEXP(t->GetEXP(),t->GetMaxAAXP()*atoi(sep->arg[2]),false); + t->GetPP().aapoints = atoi(sep->arg[2]); + t->GetPP().expAA = 0; + t->Message(MT_Experience, "Setting personal AA points to %u", t->GetPP().aapoints); t->SendAlternateAdvancementStats(); - t->SendAlternateAdvancementTable(); } } diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index a7c5643a1..3c0c8fad4 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -651,27 +651,28 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove group_id_caster = (GetRaid()->GetGroup(CastToClient()) == 0xFFFF) ? 0 : (GetRaid()->GetGroup(CastToClient()) + 1); } } - if(group_id_caster){ - Group *g = entity_list.GetGroupByID(group_id_caster); - uint32 time = spell.base[i]*10; - if(g){ - for(int gi=0; gi < 6; gi++){ - if(g->members[gi] && g->members[gi]->IsClient()) - { - g->members[gi]->CastToClient()->EnableAAEffect(aaEffectWarcry , time); - if (g->members[gi]->GetID() != caster->GetID()) - g->members[gi]->Message(13, "You hear the war cry."); - else - Message(13, "You let loose a fierce war cry."); - } - } - } - } - - else{ - CastToClient()->EnableAAEffect(aaEffectWarcry , time); - Message(13, "You let loose a fierce war cry."); - } + //old aa + //if(group_id_caster){ + // Group *g = entity_list.GetGroupByID(group_id_caster); + // uint32 time = spell.base[i]*10; + // if(g){ + // for(int gi=0; gi < 6; gi++){ + // if(g->members[gi] && g->members[gi]->IsClient()) + // { + // g->members[gi]->CastToClient()->EnableAAEffect(aaEffectWarcry , time); + // if (g->members[gi]->GetID() != caster->GetID()) + // g->members[gi]->Message(13, "You hear the war cry."); + // else + // Message(13, "You let loose a fierce war cry."); + // } + // } + // } + //} + // + //else{ + // CastToClient()->EnableAAEffect(aaEffectWarcry , time); + // Message(13, "You let loose a fierce war cry."); + //} break; } @@ -2232,12 +2233,14 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove case SE_AEMelee: { + //old aa + #ifdef SPELL_EFFECT_SPAM snprintf(effect_desc, _EDLEN, "Duration Rampage"); #endif - if (caster && caster->IsClient()) { // will tidy this up later so that NPCs can duration ramp from spells too - CastToClient()->DurationRampage(effect_value*12); - } + //if (caster && caster->IsClient()) { // will tidy this up later so that NPCs can duration ramp from spells too + // CastToClient()->DurationRampage(effect_value*12); + //} break; } @@ -3435,11 +3438,6 @@ void Mob::DoBuffTic(const Buffs_Struct &buff, int slot, Mob *caster) } } - // Check for non buff spell effects to fade - // AE melee effects - if (IsClient()) - CastToClient()->CheckAAEffect(aaEffectRampage); - for (int i = 0; i < EFFECT_COUNT; i++) { if (IsBlankSpellEffect(buff.spellid, i)) continue; diff --git a/zone/spells.cpp b/zone/spells.cpp index ea4d1068b..3ea0a5ddd 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -4124,14 +4124,13 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster) } return true; } - - else if (IsClient() && CastToClient()->CheckAAEffect(aaEffectWarcry)) - { - Message(13, "Your are immune to fear."); - Log.Out(Logs::Detail, Logs::Spells, "Clients has WarCry effect, immune to fear!"); - caster->Message_StringID(MT_Shout, IMMUNE_FEAR); - return true; - } + //else if (IsClient() && CastToClient()->CheckAAEffect(aaEffectWarcry)) //old aa + //{ + // Message(13, "Your are immune to fear."); + // Log.Out(Logs::Detail, Logs::Spells, "Clients has WarCry effect, immune to fear!"); + // caster->Message_StringID(MT_Shout, IMMUNE_FEAR); + // return true; + //} } if(IsCharmSpell(spell_id)) From f4c22d711144cf339721dc1606c3c1132386fcef Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Tue, 16 Jun 2015 17:10:47 -0400 Subject: [PATCH 25/90] Fix double riposte --- zone/attack.cpp | 53 ++++++++++++++++++++++++++++++------------------ zone/bonuses.cpp | 1 + 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/zone/attack.cpp b/zone/attack.cpp index 864efa3e7..146bcdce6 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -4412,42 +4412,55 @@ bool Mob::TryFinishingBlow(Mob *defender, SkillUseTypes skillinuse) return false; } -void Mob::DoRiposte(Mob* defender) { +void Mob::DoRiposte(Mob *defender) +{ Log.Out(Logs::Detail, Logs::Combat, "Preforming a riposte"); if (!defender) return; defender->Attack(this, MainPrimary, true); - if (HasDied()) return; + if (HasDied()) + return; - int32 DoubleRipChance = defender->aabonuses.GiveDoubleRiposte[0] + - defender->spellbonuses.GiveDoubleRiposte[0] + - defender->itembonuses.GiveDoubleRiposte[0]; + // this effect isn't used on live? See no AAs or spells + int32 DoubleRipChance = defender->aabonuses.DoubleRiposte + defender->spellbonuses.DoubleRiposte + + defender->itembonuses.DoubleRiposte; - DoubleRipChance = defender->aabonuses.DoubleRiposte + - defender->spellbonuses.DoubleRiposte + - defender->itembonuses.DoubleRiposte; - - //Live AA - Double Riposte - if(DoubleRipChance && zone->random.Roll(DoubleRipChance)) { - Log.Out(Logs::Detail, Logs::Combat, "Preforming a double riposed (%d percent chance)", DoubleRipChance); + if (DoubleRipChance && zone->random.Roll(DoubleRipChance)) { + Log.Out(Logs::Detail, Logs::Combat, + "Preforming a double riposted from SE_DoubleRiposte (%d percent chance)", DoubleRipChance); defender->Attack(this, MainPrimary, true); - if (HasDied()) return; + if (HasDied()) + return; } - //Double Riposte effect, allows for a chance to do RIPOSTE with a skill specfic special attack (ie Return Kick). - //Coded narrowly: Limit to one per client. Limit AA only. [1 = Skill Attack Chance, 2 = Skill] + DoubleRipChance = defender->aabonuses.GiveDoubleRiposte[0] + defender->spellbonuses.GiveDoubleRiposte[0] + + defender->itembonuses.GiveDoubleRiposte[0]; + + // Live AA - Double Riposte + if (DoubleRipChance && zone->random.Roll(DoubleRipChance)) { + Log.Out(Logs::Detail, Logs::Combat, + "Preforming a double riposted from SE_GiveDoubleRiposte base1 == 0 (%d percent chance)", + DoubleRipChance); + defender->Attack(this, MainPrimary, true); + if (HasDied()) + return; + } + + // Double Riposte effect, allows for a chance to do RIPOSTE with a skill specific special attack (ie Return Kick). + // Coded narrowly: Limit to one per client. Limit AA only. [1 = Skill Attack Chance, 2 = Skill] DoubleRipChance = defender->aabonuses.GiveDoubleRiposte[1]; - if(DoubleRipChance && zone->random.Roll(DoubleRipChance)) { - Log.Out(Logs::Detail, Logs::Combat, "Preforming a return SPECIAL ATTACK (%d percent chance)", DoubleRipChance); + if (DoubleRipChance && zone->random.Roll(DoubleRipChance)) { + Log.Out(Logs::Detail, Logs::Combat, "Preforming a return SPECIAL ATTACK (%d percent chance)", + DoubleRipChance); if (defender->GetClass() == MONK) defender->MonkSpecialAttack(this, defender->aabonuses.GiveDoubleRiposte[2]); else if (defender->IsClient()) - defender->CastToClient()->DoClassAttacks(this,defender->aabonuses.GiveDoubleRiposte[2], true); + defender->CastToClient()->DoClassAttacks(this, defender->aabonuses.GiveDoubleRiposte[2], true); } } @@ -4678,10 +4691,10 @@ void Mob::TrySkillProc(Mob *on, uint16 skill, uint16 ReuseTime, bool Success, ui ProcMod = static_cast(base2); } else if(effect_id == SE_LimitToSkill && base1 <= HIGHEST_SKILL) { - + if (CanProc && base1 == skill && IsValidSpell(proc_spell_id)) { float final_chance = chance * (ProcMod / 100.0f); - + if (zone->random.Roll(final_chance)) { ExecWeaponProc(nullptr, proc_spell_id, on); CanProc = false; diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index c19755aae..e90f9626a 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -1156,6 +1156,7 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) case SE_DoubleRiposte: { newbon->DoubleRiposte += base1; + break; } case SE_GiveDoubleRiposte: { From 60f2e312404e679fd432aa48bdc0bf76042dc87f Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 16 Jun 2015 21:43:51 -0700 Subject: [PATCH 26/90] Retooled how cooldowns work so they should be more consistent with how the client shows them --- zone/aa.cpp | 14 ++------------ zone/spells.cpp | 9 +++------ 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index 766057e2f..a99a81ada 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1137,26 +1137,16 @@ void Client::ActivateAlternateAdvancementAbility(int rank_id, int target_id) { // Bards can cast instant cast AAs while they are casting another song if(spells[rank->spell].cast_time == 0 && GetClass() == BARD && IsBardSong(casting_spell_id)) { if(!SpellFinished(rank->spell, entity_list.GetMob(target_id), 10, -1, -1, spells[rank->spell].ResistDiff, false)) { - //Reset on failed cast - SendAlternateAdvancementTimer(rank->spell_type, 0, -1); - Message_StringID(15, ABILITY_FAILED); - p_timers.Clear(&database, rank->spell_type + pTimerAAStart); return; } + CastToClient()->GetPTimers().Start(rank->spell_type, cooldown); + SendAlternateAdvancementTimer(rank->spell_type, 0, 0); ExpendAlternateAdvancementCharge(ability->id); } else { if(!CastSpell(rank->spell, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, rank->spell_type + pTimerAAStart, cooldown, 1, nullptr, ability->id)) { - //Reset on failed cast - SendAlternateAdvancementTimer(rank->spell_type, 0, -1); - Message_StringID(15, ABILITY_FAILED); - p_timers.Clear(&database, rank->spell_type + pTimerAAStart); return; } } - - if(cooldown > 0) { - SendAlternateAdvancementTimer(rank->spell_type, 0, 0); - } } int Mob::GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in) { diff --git a/zone/spells.cpp b/zone/spells.cpp index 3ea0a5ddd..5002e8104 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -819,12 +819,6 @@ void Mob::InterruptSpell(uint16 message, uint16 color, uint16 spellid) CastToNPC()->AI_Event_SpellCastFinished(false, casting_spell_slot); } - if(casting_spell_type == 1 && IsClient()) { //Rest AA Timer on failed cast - CastToClient()->SendAlternateAdvancementTimer(casting_spell_timer - pTimerAAStart, 0, -1); - CastToClient()->Message_StringID(15, ABILITY_FAILED); - CastToClient()->GetPTimers().Clear(&database, casting_spell_timer); - } - ZeroCastingVars(); // resets all the state keeping stuff Log.Out(Logs::Detail, Logs::Spells, "Spell %d has been interrupted.", spellid); @@ -2282,6 +2276,9 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, uint16 slot, uint16 //aa new todo: aa expendable charges here CastToClient()->GetPTimers().Start(casting_spell_timer, casting_spell_timer_duration); Log.Out(Logs::Detail, Logs::Spells, "Spell %d: Setting custom reuse timer %d to %d", spell_id, casting_spell_timer, casting_spell_timer_duration); + if(casting_spell_aa_id) { + CastToClient()->SendAlternateAdvancementTimer(casting_spell_timer - pTimerAAStart, 0, 0); + } } else if(spells[spell_id].recast_time > 1000 && !spells[spell_id].IsDisciplineBuff) { int recast = spells[spell_id].recast_time/1000; From c445f631869648dfad0bc716ef5a706f8a4ee3df Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 16 Jun 2015 23:41:46 -0700 Subject: [PATCH 27/90] Okay timers now work right, for real this time --- zone/aa.cpp | 5 ++++- zone/lua_mob.cpp | 2 +- zone/mob.cpp | 1 - zone/mob.h | 4 ++-- zone/mob_ai.cpp | 2 +- zone/perl_mob.cpp | 4 ++-- zone/spells.cpp | 39 +++++++++++++++++++++++---------------- 7 files changed, 33 insertions(+), 24 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index a99a81ada..21e1de1b2 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1143,10 +1143,13 @@ void Client::ActivateAlternateAdvancementAbility(int rank_id, int target_id) { SendAlternateAdvancementTimer(rank->spell_type, 0, 0); ExpendAlternateAdvancementCharge(ability->id); } else { - if(!CastSpell(rank->spell, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, rank->spell_type + pTimerAAStart, cooldown, 1, nullptr, ability->id)) { + if(!CastSpell(rank->spell, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, rank->spell_type + pTimerAAStart, cooldown, nullptr, rank->id)) { return; } } + + CastToClient()->GetPTimers().Start(rank->spell_type + pTimerAAStart, cooldown); + SendAlternateAdvancementTimer(rank->spell_type, 0, 0); } int Mob::GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in) { diff --git a/zone/lua_mob.cpp b/zone/lua_mob.cpp index f4d7d64cb..11124d50f 100644 --- a/zone/lua_mob.cpp +++ b/zone/lua_mob.cpp @@ -790,7 +790,7 @@ bool Lua_Mob::CastSpell(int spell_id, int target_id, int slot, int cast_time, in int16 res = resist_adjust; return self->CastSpell(spell_id, target_id, slot, cast_time, mana_cost, nullptr, static_cast(item_slot), - static_cast(timer), static_cast(timer_duration), 0, &res); + static_cast(timer), static_cast(timer_duration), &res); } bool Lua_Mob::SpellFinished(int spell_id, Lua_Mob target) { diff --git a/zone/mob.cpp b/zone/mob.cpp index 35b0d62d2..4eb87f7ad 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -307,7 +307,6 @@ Mob::Mob(const char* in_name, casting_spell_id = 0; casting_spell_timer = 0; casting_spell_timer_duration = 0; - casting_spell_type = 0; casting_spell_inventory_slot = 0; casting_spell_aa_id = 0; target = 0; diff --git a/zone/mob.h b/zone/mob.h index 959c5e543..20ec928e7 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -222,11 +222,11 @@ public: virtual void SpellProcess(); virtual bool CastSpell(uint16 spell_id, uint16 target_id, uint16 slot = USE_ITEM_SPELL_SLOT, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF, - uint32 timer = 0xFFFFFFFF, uint32 timer_duration = 0, uint32 type = 0, int16 *resist_adjust = nullptr, + uint32 timer = 0xFFFFFFFF, uint32 timer_duration = 0, int16 *resist_adjust = nullptr, uint32 aa_id = 0); virtual bool DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot = 10, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF, - uint32 timer = 0xFFFFFFFF, uint32 timer_duration = 0, uint32 type = 0, int16 resist_adjust = 0, + uint32 timer = 0xFFFFFFFF, uint32 timer_duration = 0, int16 resist_adjust = 0, uint32 aa_id = 0); void CastedSpellFinished(uint16 spell_id, uint32 target_id, uint16 slot, uint16 mana_used, uint32 inventory_slot = 0xFFFFFFFF, int16 resist_adjust = 0); diff --git a/zone/mob_ai.cpp b/zone/mob_ai.cpp index 650ba350c..fb6714087 100644 --- a/zone/mob_ai.cpp +++ b/zone/mob_ai.cpp @@ -342,7 +342,7 @@ bool NPC::AIDoSpellCast(uint8 i, Mob* tar, int32 mana_cost, uint32* oDontDoAgain SetCurrentSpeed(0); } - return CastSpell(AIspells[i].spellid, tar->GetID(), 1, AIspells[i].manacost == -2 ? 0 : -1, mana_cost, oDontDoAgainBefore, -1, -1, 0, 0, &(AIspells[i].resist_adjust)); + return CastSpell(AIspells[i].spellid, tar->GetID(), 1, AIspells[i].manacost == -2 ? 0 : -1, mana_cost, oDontDoAgainBefore, -1, -1, 0, &(AIspells[i].resist_adjust)); } bool EntityList::AICheckCloseBeneficialSpells(NPC* caster, uint8 iChance, float iRange, uint16 iSpellTypes) { diff --git a/zone/perl_mob.cpp b/zone/perl_mob.cpp index f5ef80a4c..80ca97484 100644 --- a/zone/perl_mob.cpp +++ b/zone/perl_mob.cpp @@ -3998,9 +3998,9 @@ XS(XS_Mob_CastSpell) } if (resist_adjust == 0)//If you do not pass resist adjust as nullptr it will ignore the spells default resist adjust - THIS->CastSpell(spell_id, target_id, slot, casttime, mana_cost, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0); + THIS->CastSpell(spell_id, target_id, slot, casttime, mana_cost, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0); else - THIS->CastSpell(spell_id, target_id, slot, casttime, mana_cost, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0, 0, &resist_adjust); + THIS->CastSpell(spell_id, target_id, slot, casttime, mana_cost, 0, 0xFFFFFFFF, 0xFFFFFFFF, 0, &resist_adjust); } XSRETURN_EMPTY; } diff --git a/zone/spells.cpp b/zone/spells.cpp index 5002e8104..310e2bd01 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -146,7 +146,7 @@ void NPC::SpellProcess() // to allow procs to work bool Mob::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot, - uint32 timer, uint32 timer_duration, uint32 type, int16 *resist_adjust, + uint32 timer, uint32 timer_duration, int16 *resist_adjust, uint32 aa_id) { Log.Out(Logs::Detail, Logs::Spells, "CastSpell called for spell %s (%d) on entity %d, slot %d, time %d, mana %d, from item slot %d", @@ -319,11 +319,11 @@ bool Mob::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot, if(resist_adjust) { - return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, type, *resist_adjust, aa_id)); + return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, *resist_adjust, aa_id)); } else { - return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, type, spells[spell_id].ResistDiff, aa_id)); + return(DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, timer, timer_duration, spells[spell_id].ResistDiff, aa_id)); } } @@ -337,7 +337,7 @@ bool Mob::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot, // bool Mob::DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, - uint32 item_slot, uint32 timer, uint32 timer_duration, uint32 type, + uint32 item_slot, uint32 timer, uint32 timer_duration, int16 resist_adjust, uint32 aa_id) { Mob* pMob = nullptr; @@ -363,7 +363,6 @@ bool Mob::DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot, casting_spell_timer_duration = timer_duration; } casting_spell_aa_id = aa_id; - casting_spell_type = type; SaveSpellLoc(); Log.Out(Logs::Detail, Logs::Spells, "Casting %d Started at (%.3f,%.3f,%.3f)", spell_id, m_SpellLocation.x, m_SpellLocation.y, m_SpellLocation.z); @@ -785,7 +784,6 @@ void Mob::ZeroCastingVars() casting_spell_inventory_slot = 0; casting_spell_timer = 0; casting_spell_timer_duration = 0; - casting_spell_type = 0; casting_spell_resist_adjust = 0; casting_spell_checks = false; casting_spell_aa_id = 0; @@ -819,6 +817,15 @@ void Mob::InterruptSpell(uint16 message, uint16 color, uint16 spellid) CastToNPC()->AI_Event_SpellCastFinished(false, casting_spell_slot); } + if(casting_spell_aa_id && IsClient()) { //Rest AA Timer on failed cast + AA::Rank *rank = zone->GetAlternateAdvancementRank(casting_spell_aa_id); + if(rank) { + CastToClient()->SendAlternateAdvancementTimer(rank->spell_type, 0, 0x7fffffff); + CastToClient()->Message_StringID(15, ABILITY_FAILED); + CastToClient()->GetPTimers().Clear(&database, rank->spell_type + pTimerAAStart); + } + } + ZeroCastingVars(); // resets all the state keeping stuff Log.Out(Logs::Detail, Logs::Spells, "Spell %d has been interrupted.", spellid); @@ -2075,7 +2082,7 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, uint16 slot, uint16 else if(!SpellOnTarget(spell_id, spell_target, false, true, resist_adjust, false, level_override)) { if(IsBuffSpell(spell_id) && IsBeneficialSpell(spell_id)) { // Prevent mana usage/timers being set for beneficial buffs - if(casting_spell_type == 1) + if(casting_spell_aa_id) InterruptSpell(); return false; } @@ -2271,14 +2278,18 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, uint16 slot, uint16 //set our reuse timer on long ass reuse_time spells... if(IsClient() && !isproc) { - if(spell_id == casting_spell_id && casting_spell_timer != 0xFFFFFFFF) + if(casting_spell_aa_id) { + AA::Rank *rank = zone->GetAlternateAdvancementRank(casting_spell_aa_id); + + if(rank && rank->base_ability) { + ExpendAlternateAdvancementCharge(rank->base_ability->id); + } + } + else if(spell_id == casting_spell_id && casting_spell_timer != 0xFFFFFFFF) { //aa new todo: aa expendable charges here CastToClient()->GetPTimers().Start(casting_spell_timer, casting_spell_timer_duration); Log.Out(Logs::Detail, Logs::Spells, "Spell %d: Setting custom reuse timer %d to %d", spell_id, casting_spell_timer, casting_spell_timer_duration); - if(casting_spell_aa_id) { - CastToClient()->SendAlternateAdvancementTimer(casting_spell_timer - pTimerAAStart, 0, 0); - } } else if(spells[spell_id].recast_time > 1000 && !spells[spell_id].IsDisciplineBuff) { int recast = spells[spell_id].recast_time/1000; @@ -2297,10 +2308,6 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, uint16 slot, uint16 Log.Out(Logs::Detail, Logs::Spells, "Spell %d: Setting long reuse timer to %d s (orig %d)", spell_id, recast, spells[spell_id].recast_time); CastToClient()->GetPTimers().Start(pTimerSpellStart + spell_id, recast); } - - if(casting_spell_aa_id) { - ExpendAlternateAdvancementCharge(casting_spell_aa_id); - } } if(IsClient() && ((slot == USE_ITEM_SPELL_SLOT) || (slot == POTION_BELT_SPELL_SLOT) || (slot == TARGET_RING_SPELL_SLOT))) @@ -3758,7 +3765,7 @@ bool Mob::SpellOnTarget(uint16 spell_id, Mob *spelltar, bool reflect, bool use_r // if SpellEffect returned false there's a problem applying the // spell. It's most likely a buff that can't stack. Log.Out(Logs::Detail, Logs::Spells, "Spell %d could not apply its effects %s -> %s\n", spell_id, GetName(), spelltar->GetName()); - if(casting_spell_type != 1) // AA is handled differently + if(casting_spell_aa_id) Message_StringID(MT_SpellFailure, SPELL_NO_HOLD); safe_delete(action_packet); return false; From 0447321d92f00803ab3bc3611e55f12987a02d33 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Wed, 17 Jun 2015 02:47:05 -0400 Subject: [PATCH 28/90] Implement songcap needed for the AA revamp Added rule Character:UseSpellFileSongCap defaulted to true since most servers will probably be updating everything. --- common/ruletypes.h | 1 + common/shareddb.cpp | 5 +++-- common/spdat.h | 4 ++-- zone/client_mods.cpp | 11 ++++++++--- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/common/ruletypes.h b/common/ruletypes.h index 9a36b77f4..f066b9115 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -99,6 +99,7 @@ RULE_BOOL ( Character, EnableXTargetting, true) // Enable Extended Targetting Wi RULE_BOOL ( Character, KeepLevelOverMax, false) // Don't delevel a character that has somehow gone over the level cap RULE_INT ( Character, FoodLossPerUpdate, 35) // How much food/water you lose per stamina update RULE_INT ( Character, BaseInstrumentSoftCap, 36) // Softcap for instrument mods, 36 commonly referred to as "3.6" as well. +RULE_BOOL ( Character, UseSpellFileSongCap, true) // When they removed the AA that increased the cap they removed the above and just use the spell field RULE_INT ( Character, BaseRunSpeedCap, 158) // Base Run Speed Cap, on live it's 158% which will give you a runspeed of 1.580 hard capped to 225. RULE_INT ( Character, OrnamentationAugmentType, 20) //Ornamentation Augment Type RULE_REAL(Character, EnvironmentDamageMulipliter, 1) diff --git a/common/shareddb.cpp b/common/shareddb.cpp index aa4924665..c9106ea04 100644 --- a/common/shareddb.cpp +++ b/common/shareddb.cpp @@ -1682,6 +1682,7 @@ void SharedDatabase::LoadSpells(void *data, int max_spells) { sp[tempid].not_extendable = atoi(row[197]) != 0; sp[tempid].suspendable = atoi(row[200]) != 0; sp[tempid].viral_range = atoi(row[201]); + sp[tempid].songcap = atoi(row[202]); sp[tempid].no_block = atoi(row[205]); sp[tempid].spellgroup=atoi(row[207]); sp[tempid].rank = atoi(row[208]); @@ -2021,7 +2022,7 @@ const LootDrop_Struct* SharedDatabase::GetLootDrop(uint32 lootdrop_id) { void SharedDatabase::LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct* message) { std::string query = StringFormat("SELECT `inspect_message` FROM `character_inspect_messages` WHERE `id` = %u LIMIT 1", character_id); - auto results = QueryDatabase(query); + auto results = QueryDatabase(query); auto row = results.begin(); memset(message, '\0', sizeof(InspectMessage_Struct)); for (auto row = results.begin(); row != results.end(); ++row) { @@ -2031,7 +2032,7 @@ void SharedDatabase::LoadCharacterInspectMessage(uint32 character_id, InspectMes void SharedDatabase::SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* message) { std::string query = StringFormat("REPLACE INTO `character_inspect_messages` (id, inspect_message) VALUES (%u, '%s')", character_id, EscapeString(message->text).c_str()); - auto results = QueryDatabase(query); + auto results = QueryDatabase(query); } void SharedDatabase::GetBotInspectMessage(uint32 botid, InspectMessage_Struct* message) { diff --git a/common/spdat.h b/common/spdat.h index 24e982aee..c8e039f15 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -735,8 +735,8 @@ struct SPDat_Spell_Struct /* 198- 199 */ /* 200 */ bool suspendable; // buff is suspended in suspended buff zones /* 201 */ int viral_range; -/* 202 */ -/* 203 */ //int songcap; // individual song cap (how live currently does it, not implemented) +/* 202 */ int songcap; // individual song cap +/* 203 */ /* 204 */ /* 205 */ bool no_block; /* 206 */ diff --git a/zone/client_mods.cpp b/zone/client_mods.cpp index 56a22de9a..76ce5195c 100644 --- a/zone/client_mods.cpp +++ b/zone/client_mods.cpp @@ -1978,7 +1978,11 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id) const return 10; uint32 effectmod = 10; - int effectmodcap = RuleI(Character, BaseInstrumentSoftCap); + int effectmodcap = 0; + if (RuleB(Character, UseSpellFileSongCap)) + effectmodcap = spells[spell_id].songcap / 10; + else + effectmodcap = RuleI(Character, BaseInstrumentSoftCap); // this should never use spell modifiers... // if a spell grants better modifers, they are copied into the item mods // because the spells are supposed to act just like having the intrument. @@ -2048,10 +2052,11 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id) const effectmod = 10; return effectmod; } - effectmodcap += aabonuses.songModCap + spellbonuses.songModCap + itembonuses.songModCap; + if (!RuleB(Character, UseSpellFileSongCap)) + effectmodcap += aabonuses.songModCap + spellbonuses.songModCap + itembonuses.songModCap; if (effectmod < 10) effectmod = 10; - if (effectmod > effectmodcap) + if (effectmodcap && effectmod > effectmodcap) // if the cap is calculated to be 0 using new rules, no cap. effectmod = effectmodcap; Log.Out(Logs::Detail, Logs::Spells, "%s::GetInstrumentMod() spell=%d mod=%d modcap=%d\n", GetName(), spell_id, effectmod, effectmodcap); From 065363480f14c88c5604ea97c692e65e21d82f83 Mon Sep 17 00:00:00 2001 From: KimLS Date: Wed, 17 Jun 2015 12:05:09 -0700 Subject: [PATCH 29/90] Added AA grant to quest system, fixed a bug here or there noticed incrementaa needs to be fixed or removed --- zone/aa.cpp | 55 ++++++++++++++++++++++++++--- zone/aa_ability.h | 1 - zone/aa_rank.h | 1 - zone/client.cpp | 4 +++ zone/lua_mob.cpp | 24 +++++++++++++ zone/lua_mob.h | 4 +++ zone/mob.h | 1 + zone/perl_mob.cpp | 90 +++++++++++++++++++++++++++++++++++++++++++++-- zone/spells.cpp | 2 +- 9 files changed, 171 insertions(+), 11 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index 21e1de1b2..741a15aff 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1015,6 +1015,7 @@ void Client::PurchaseAlternateAdvancementRank(int rank_id) { NotifyNewTitlesAvailable(); } +//need to rewrite this void Client::IncrementAlternateAdvancementRank(int rank_id) { AA::Rank *rank = zone->GetAlternateAdvancementRank(rank_id); if(!rank) { @@ -1139,8 +1140,6 @@ void Client::ActivateAlternateAdvancementAbility(int rank_id, int target_id) { if(!SpellFinished(rank->spell, entity_list.GetMob(target_id), 10, -1, -1, spells[rank->spell].ResistDiff, false)) { return; } - CastToClient()->GetPTimers().Start(rank->spell_type, cooldown); - SendAlternateAdvancementTimer(rank->spell_type, 0, 0); ExpendAlternateAdvancementCharge(ability->id); } else { if(!CastSpell(rank->spell, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, rank->spell_type + pTimerAAStart, cooldown, nullptr, rank->id)) { @@ -1312,6 +1311,8 @@ uint32 Mob::GetAAByAAID(uint32 aa_id, uint32 *charges) const { return iter->second.first; } } + + return 0; } bool Mob::SetAA(uint32 rank_id, uint32 new_value, uint32 charges) { @@ -1474,9 +1475,14 @@ void Zone::LoadAlternateAdvancement() { current->total_cost = current->cost + current->prev->total_cost; } else { + current->prev_id = -1; current->total_cost = current->cost; } + if(!current->next) { + current->next_id = -1; + } + i++; current = current->next; } @@ -1490,7 +1496,8 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_mapprev_id = atoi(row[10]); rank->next_id = atoi(row[11]); rank->expansion = atoi(row[12]); - rank->account_time_required = atoul(row[13]); rank->base_ability = nullptr; rank->total_cost = 0; rank->next = nullptr; @@ -1606,3 +1612,42 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_mapGetAlternateAdvancementAbilityAndRank(aa_id, points); + auto ability = ability_rank.first; + auto rank = ability_rank.second; + + if(!ability) { + return; + } + + if(ability->charges > 0) { + return; + } + + if(!ability->grant_only) { + return; + } + + if(!CanUseAlternateAdvancementRank(rank)) { + return; + } + + SetAA(ability->first_rank_id, rank->current_value, 0); + + if(IsClient()) { + Client *c = CastToClient(); + + if(rank->next) { + c->SendAlternateAdvancementRank(rank->base_ability->id, rank->next->current_value); + } + + c->SendAlternateAdvancementPoints(); + c->SendAlternateAdvancementStats(); + c->CalcBonuses(); + } +} \ No newline at end of file diff --git a/zone/aa_ability.h b/zone/aa_ability.h index ba152fb06..4a2d41f3e 100644 --- a/zone/aa_ability.h +++ b/zone/aa_ability.h @@ -39,7 +39,6 @@ public: ~Ability() { } Rank *GetMaxRank(); - Rank *GetRankByLevel(int level); Rank *GetRankByPointsSpent(int current_level); int GetMaxLevel(Mob *who); diff --git a/zone/aa_rank.h b/zone/aa_rank.h index a824f2c82..977a07680 100644 --- a/zone/aa_rank.h +++ b/zone/aa_rank.h @@ -45,7 +45,6 @@ public: Rank *next; int current_value; int expansion; - uint32 account_time_required; int total_cost; Ability *base_ability; std::vector effects; diff --git a/zone/client.cpp b/zone/client.cpp index 5ef3e84e5..0ce7292ef 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -533,6 +533,10 @@ bool Client::SaveAA() { if(!ability) continue; + if(ability->grant_only) { + continue; + } + if(rank.second.first > 0) { AA::Rank *r = ability->GetRankByPointsSpent(rank.second.first); diff --git a/zone/lua_mob.cpp b/zone/lua_mob.cpp index 11124d50f..31719d364 100644 --- a/zone/lua_mob.cpp +++ b/zone/lua_mob.cpp @@ -1195,6 +1195,26 @@ int Lua_Mob::GetAA(int id) { return self->GetAA(id); } +int Lua_Mob::GetAAByAAID(int id) { + Lua_Safe_Call_Int(); + return self->GetAAByAAID(id); +} + +bool Lua_Mob::SetAA(int rank_id, int new_value) { + Lua_Safe_Call_Bool(); + return self->SetAA(rank_id, new_value); +} + +bool Lua_Mob::SetAA(int rank_id, int new_value, int charges) { + Lua_Safe_Call_Bool(); + return self->SetAA(rank_id, new_value, charges); +} + +void Lua_Mob::GrantAlternateAdvancementAbility(int aa_id, int points) { + Lua_Safe_Call_Void(); + self->GrantAlternateAdvancementAbility(aa_id, points); +} + bool Lua_Mob::DivineAura() { Lua_Safe_Call_Bool(); return self->DivineAura(); @@ -2074,6 +2094,10 @@ luabind::scope lua_register_mob() { .def("CheckHealAggroAmount", (int(Lua_Mob::*)(int))&Lua_Mob::CheckHealAggroAmount) .def("CheckHealAggroAmount", (int(Lua_Mob::*)(int,uint32))&Lua_Mob::CheckHealAggroAmount) .def("GetAA", (int(Lua_Mob::*)(int))&Lua_Mob::GetAA) + .def("GetAAByAAID", (int(Lua_Mob::*)(int))&Lua_Mob::GetAAByAAID) + .def("SetAA", (bool(Lua_Mob::*)(int,int))&Lua_Mob::SetAA) + .def("SetAA", (bool(Lua_Mob::*)(int,int,int))&Lua_Mob::SetAA) + .def("GrantAlternateAdvancementAbility", (void(Lua_Mob::*)(int, int))&Lua_Mob::GrantAlternateAdvancementAbility) .def("DivineAura", (bool(Lua_Mob::*)(void))&Lua_Mob::DivineAura) .def("SetOOCRegen", (void(Lua_Mob::*)(int))&Lua_Mob::SetOOCRegen) .def("GetEntityVariable", (const char*(Lua_Mob::*)(const char*))&Lua_Mob::GetEntityVariable) diff --git a/zone/lua_mob.h b/zone/lua_mob.h index 023fedd2a..914f46c5d 100644 --- a/zone/lua_mob.h +++ b/zone/lua_mob.h @@ -249,6 +249,10 @@ public: int CheckHealAggroAmount(int spell_id); int CheckHealAggroAmount(int spell_id, uint32 heal_possible); int GetAA(int id); + int GetAAByAAID(int id); + bool SetAA(int rank_id, int new_value); + bool SetAA(int rank_id, int new_value, int charges); + void GrantAlternateAdvancementAbility(int aa_id, int points); bool DivineAura(); void SetOOCRegen(int regen); const char* GetEntityVariable(const char *name); diff --git a/zone/mob.h b/zone/mob.h index 20ec928e7..1c3d7ab15 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -969,6 +969,7 @@ public: void ExpendAlternateAdvancementCharge(uint32 aa_id); void CalcAABonuses(StatBonuses* newbon); void ApplyAABonuses(const AA::Rank &rank, StatBonuses* newbon); + void GrantAlternateAdvancementAbility(int aa_id, int points); protected: void CommonDamage(Mob* other, int32 &damage, const uint16 spell_id, const SkillUseTypes attack_skill, bool &avoidable, const int8 buffslot, const bool iBuffTic); diff --git a/zone/perl_mob.cpp b/zone/perl_mob.cpp index 80ca97484..612d9f868 100644 --- a/zone/perl_mob.cpp +++ b/zone/perl_mob.cpp @@ -6360,12 +6360,12 @@ XS(XS_Mob_GetAA) { dXSARGS; if (items != 2) - Perl_croak(aTHX_ "Usage: Mob::GetAA(THIS, aa_id)"); + Perl_croak(aTHX_ "Usage: Mob::GetAA(THIS, rank_id)"); { Mob * THIS; uint32 RETVAL; dXSTARG; - uint32 aa_id = (uint32)SvUV(ST(1)); + uint32 rank_id = (uint32)SvUV(ST(1)); if (sv_derived_from(ST(0), "Mob")) { IV tmp = SvIV((SV*)SvRV(ST(0))); @@ -6376,12 +6376,93 @@ XS(XS_Mob_GetAA) if(THIS == nullptr) Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - RETVAL = THIS->GetAA(aa_id); + RETVAL = THIS->GetAA(rank_id); XSprePUSH; PUSHu((UV)RETVAL); } XSRETURN(1); } +XS(XS_Mob_GetAAByAAID); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Mob_GetAAByAAID) +{ + dXSARGS; + if(items != 2) + Perl_croak(aTHX_ "Usage: Mob::GetAAByAAID(THIS, aa_id)"); + { + Mob * THIS; + uint32 RETVAL; + dXSTARG; + uint32 aa_id = (uint32)SvUV(ST(1)); + + 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 == nullptr) + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); + + RETVAL = THIS->GetAAByAAID(aa_id); + XSprePUSH; PUSHu((UV)RETVAL); + } + XSRETURN(1); +} + +XS(XS_Mob_SetAA); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Mob_SetAA) +{ + dXSARGS; + if(items < 3 || items > 4) + Perl_croak(aTHX_ "Usage: Mob::SetAA(THIS, aa_id, points, [charges])"); + { + Mob * THIS; + bool RETVAL; + int aa_id = (int)SvIV(ST(1)); + int points = (int)SvIV(ST(2)); + int charges = (items == 4) ? (int)SvIV(ST(3)) : 0; + + 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 == nullptr) + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); + + RETVAL = THIS->SetAA(aa_id, points, charges); + ST(0) = boolSV(RETVAL); + sv_2mortal(ST(0)); + } + XSRETURN(1); +} + +XS(XS_Mob_GrantAlternateAdvancementAbility); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Mob_GrantAlternateAdvancementAbility) +{ + dXSARGS; + if(items != 3) + Perl_croak(aTHX_ "Usage: Mob::GrantAlternateAdvancementAbility(THIS, aa_id, points)"); + { + Mob * THIS; + int aa_id = (int)SvIV(ST(1)); + int points = (int)SvIV(ST(2)); + + 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 == nullptr) + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); + + THIS->GrantAlternateAdvancementAbility(aa_id, points); + } + XSRETURN_EMPTY; +} + XS(XS_Mob_DivineAura); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_DivineAura) { @@ -8625,6 +8706,9 @@ XS(boot_Mob) newXSproto(strcpy(buf, "CheckAggroAmount"), XS_Mob_CheckAggroAmount, file, "$$"); newXSproto(strcpy(buf, "CheckHealAggroAmount"), XS_Mob_CheckHealAggroAmount, file, "$$"); newXSproto(strcpy(buf, "GetAA"), XS_Mob_GetAA, file, "$$"); + newXSproto(strcpy(buf, "GetAAByAAID"), XS_Mob_GetAAByAAID, file, "$$"); + newXSproto(strcpy(buf, "SetAA"), XS_Mob_SetAA, file, "$$$;$"); + newXSproto(strcpy(buf, "GrantAlternateAdvancementAbility"), XS_Mob_GrantAlternateAdvancementAbility, file, "$$$"); newXSproto(strcpy(buf, "DivineAura"), XS_Mob_DivineAura, file, "$"); newXSproto(strcpy(buf, "AddFeignMemory"), XS_Mob_AddFeignMemory, file, "$$"); newXSproto(strcpy(buf, "RemoveFromFeignMemory"), XS_Mob_RemoveFromFeignMemory, file, "$$"); diff --git a/zone/spells.cpp b/zone/spells.cpp index 310e2bd01..ec872d1c9 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -820,8 +820,8 @@ void Mob::InterruptSpell(uint16 message, uint16 color, uint16 spellid) if(casting_spell_aa_id && IsClient()) { //Rest AA Timer on failed cast AA::Rank *rank = zone->GetAlternateAdvancementRank(casting_spell_aa_id); if(rank) { + CastToClient()->Message_StringID(MT_SpellFailure, ABILITY_FAILED); CastToClient()->SendAlternateAdvancementTimer(rank->spell_type, 0, 0x7fffffff); - CastToClient()->Message_StringID(15, ABILITY_FAILED); CastToClient()->GetPTimers().Clear(&database, rank->spell_type + pTimerAAStart); } } From 635ac692eaa3492cdd9a36c62b19612ece91df55 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Fri, 19 Jun 2015 21:48:34 -0400 Subject: [PATCH 30/90] Fix merge ... --- zone/bot.cpp | 271 +++++++++++++++++++++++++-------------------------- 1 file changed, 134 insertions(+), 137 deletions(-) diff --git a/zone/bot.cpp b/zone/bot.cpp index 0d601dec7..9dae2fc6a 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -172,17 +172,17 @@ Bot::Bot(uint32 botID, uint32 botOwnerCharacterID, uint32 botSpellsID, double to end_regen = CalcEnduranceRegen(); if(cur_hp > max_hp) cur_hp = max_hp; - + if(cur_hp <= 0) { SetHP(max_hp/5); SetMana(0); BuffFadeAll(); SpellOnTarget(756, this); // Rezz effects } - + if(cur_mana > max_mana) cur_mana = max_mana; - + cur_end = max_end; } @@ -1140,7 +1140,7 @@ void Bot::GenerateArmorClass() { iksarlevel -= 10; if(iksarlevel > 25) iksarlevel = 25; - + if(iksarlevel > 0) displayed += (iksarlevel * 12 / 10); } @@ -1535,7 +1535,7 @@ bool Bot::IsBotNameAvailable(char *botName, std::string* errorMessage) { *errorMessage = std::string(results.ErrorMessage()); return false; } - + if (results.RowCount()) return false; @@ -1568,7 +1568,7 @@ bool Bot::Save() { auto botOwner = GetBotOwner(); if (botOwner) botOwner->Message(13, results.ErrorMessage().c_str()); - + return false; } @@ -1607,7 +1607,7 @@ bool Bot::Save() { auto botOwner = GetBotOwner(); if (botOwner) botOwner->Message(13, results.ErrorMessage().c_str()); - + return false; } SaveBuffs(); @@ -2043,7 +2043,7 @@ void Bot::BotMeditate(bool isSitting) { if(IsSitting()) Stand(); } - + if(IsSitting()) { if(!rest_timer.Enabled()) rest_timer.Start(RuleI(Character, RestRegenTimeToActivate) * 1000); @@ -2087,14 +2087,14 @@ void Bot::BotRangedAttack(Mob* other) { BuffFadeByEffect(SE_Invisibility2); invisible = false; } - + if(invisible_undead) { Log.Out(Logs::Detail, Logs::Combat, "Removing invisibility vs. undead due to melee attack."); BuffFadeByEffect(SE_InvisVsUndead); BuffFadeByEffect(SE_InvisVsUndead2); invisible_undead = false; } - + if(invisible_animals) { Log.Out(Logs::Detail, Logs::Combat, "Removing invisibility vs. animals due to melee attack."); BuffFadeByEffect(SE_InvisVsAnimals); @@ -2218,11 +2218,11 @@ void Bot::DoMeleeSkillAttackDmg(Mob* other, uint16 weapon_damage, SkillUseTypes const Item_Struct* botweapon = 0; if(inst) botweapon = inst->GetItem(); - + if(botweapon) { if(botweapon->ItemType == ItemTypeShield) hate += botweapon->AC; - + hate = (hate * (100 + GetFuriousBash(botweapon->Focus.Effect)) / 100); } } @@ -2278,7 +2278,7 @@ void Bot::ApplySpecialAttackMod(SkillUseTypes skill, int32 &dmg, int32 &mindmg) const Item_Struct* botweapon = 0; if(inst) botweapon = inst->GetItem(); - + if(botweapon) dmg += botweapon->AC * (RuleI(Combat, SpecialAttackACBonus))/100; } @@ -2391,7 +2391,7 @@ void Bot::AI_Process() { if(!GetTarget() || (IsBotCaster() && !IsBotCasterCombatRange(GetTarget())) || (IsBotArcher() && IsArcheryRange(GetTarget())) || (DistanceSquaredNoZ(static_cast(m_Position), m_PreSummonLocation) < 10)) { if(GetTarget()) FaceTarget(GetTarget()); - + SetHasBeenSummoned(false); } else if(!IsRooted()) { if(GetTarget() && GetTarget()->GetHateTop() && GetTarget()->GetHateTop() != this) { @@ -2410,7 +2410,7 @@ void Bot::AI_Process() { } else { if(GetTarget()) FaceTarget(GetTarget()); - + SetHasBeenSummoned(false); } return; @@ -2619,7 +2619,7 @@ void Bot::AI_Process() { entity_list.MessageClose_StringID(this, false, 200, 0, BERSERK_START, GetName()); this->berserk = true; } - + if (berserk && this->GetHPRatio() > 30) { entity_list.MessageClose_StringID(this, false, 200, 0, BERSERK_END, GetName()); this->berserk = false; @@ -2846,16 +2846,16 @@ void Bot::PetAIProcess() { aa_skill += botPet->GetOwner()->GetAA(aaWardersAlacrity); if(aa_skill >= 1) aa_chance += ((aa_skill > 5 ? 5 : aa_skill) * 4); - + if(aa_skill >= 6) aa_chance += ((aa_skill - 5 > 3 ? 3 : aa_skill - 5) * 7); - + if(aa_skill >= 9) aa_chance += ((aa_skill - 8 > 3 ? 3 : aa_skill - 8) * 3); - + if(aa_skill >= 12) aa_chance += ((aa_skill - 11) * 1); - + //aa_chance += botPet->GetOwner()->GetAA(aaCompanionsAlacrity) * 3; @@ -3035,7 +3035,7 @@ void Bot::Spawn(Client* botCharacterOwner, std::string* errorMessage) { uint8 materialFromSlot = 0xFF; for(int i = EmuConstants::EQUIPMENT_BEGIN; i <= EmuConstants::EQUIPMENT_END; ++i) { itemID = GetBotItemBySlot(i); - if(itemID != 0) { + if(itemID != 0) { materialFromSlot = Inventory::CalcMaterialFromSlot(i); if(materialFromSlot != 0xFF) this->SendWearChange(materialFromSlot); @@ -3273,7 +3273,7 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) { if(item) { if(strlen(item->IDFile) > 2) ns->spawn.equipment[MaterialPrimary].Material = atoi(&item->IDFile[2]); - + ns->spawn.colors[MaterialPrimary].Color = GetEquipmentColor(MaterialPrimary); } } @@ -3284,7 +3284,7 @@ void Bot::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) { if(item) { if(strlen(item->IDFile) > 2) ns->spawn.equipment[MaterialSecondary].Material = atoi(&item->IDFile[2]); - + ns->spawn.colors[MaterialSecondary].Color = GetEquipmentColor(MaterialSecondary); } } @@ -4138,7 +4138,7 @@ bool Bot::Bot_Command_CharmTarget(int charmtype, Mob *target) { charmid = 198; else if((charmlevel >= 31) && (charmlevel <= 46)) charmid = 197; - else if((charmlevel >= 18) && (charmlevel <= 30)) + else if((charmlevel >= 18) && (charmlevel <= 30)) charmid = 196; break; case 3: // Druid @@ -4240,7 +4240,7 @@ bool Bot::Bot_Command_RezzTarget(Mob *target) { rezid = 2172; else if(rezlevel >= 37) rezid = 388; - else if(rezlevel >= 32) + else if(rezlevel >= 32) rezid = 2171; else if(rezlevel >= 27) rezid = 391; @@ -4382,11 +4382,11 @@ void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* cli "Left Finger", "Right Finger", "Chest", "Legs", "Feet", "Waist", "Ammo", "Powersource" }; bool success = false; int how_many_slots = 0; - for(int j = EmuConstants::EQUIPMENT_BEGIN; j <= (EmuConstants::EQUIPMENT_END + 1); ++j) { + for(int j = EmuConstants::EQUIPMENT_BEGIN; j <= (EmuConstants::EQUIPMENT_END + 1); ++j) { if((mWeaponItem->Slots & (1 << j))) { if (j == 22) j = 9999; - + how_many_slots++; if(!GetBotItem(j)) { if(j == MainPrimary) { @@ -4447,7 +4447,7 @@ void Bot::PerformTradeWithClient(int16 beginSlotID, int16 endSlotID, Client* cli if((mWeaponItem->Slots & (1 << j))) { if (j == 22) j = 9999; - + swap_item = GetBotItem(j); failedLoreCheck = false; for (int k = AUG_BEGIN; k < EmuConstants::ITEM_COMMON_SIZE; ++k) { @@ -4634,7 +4634,7 @@ void Bot::Damage(Mob *from, int32 damage, uint16 spell_id, SkillUseTypes attack_ Log.Out(Logs::Detail, Logs::Combat, "Triggering EVENT_ATTACK due to attack by %s", from->GetName()); parse->EventNPC(EVENT_ATTACK, this, from, "", 0); } - + attacked_timer.Start(CombatEventTimer_expire); // if spell is lifetap add hp to the caster if (spell_id != SPELL_UNKNOWN && IsLifetapSpell(spell_id)) { @@ -4685,7 +4685,7 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b if ((IsCasting() && (GetClass() != BARD) && !IsFromSpell) || other == nullptr || (GetHP() < 0) || (GetAppearance() == eaDead) || (!IsAttackAllowed(other))) { if(this->GetOwnerID()) entity_list.MessageClose(this, 1, 200, 10, "%s says, '%s is not a legal target master.'", this->GetCleanName(), this->GetTarget()->GetCleanName()); - + if(other) { RemoveFromHateList(other); Log.Out(Logs::Detail, Logs::Combat, "I am not allowed to attack %s", other->GetCleanName()); @@ -4697,14 +4697,14 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b Log.Out(Logs::Detail, Logs::Combat, "Attack canceled, Divine Aura is in effect."); return false; } - + FaceTarget(GetTarget()); ItemInst* weapon = nullptr; if(Hand == MainPrimary) { weapon = GetBotItem(MainPrimary); OffHandAtk(false); } - + if(Hand == MainSecondary) { weapon = GetBotItem(MainSecondary); OffHandAtk(true); @@ -4731,7 +4731,7 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b uint32 hate = 0; if (weapon) hate = (weapon->GetItem()->Damage + weapon->GetItem()->ElemDmgAmt); - + int weapon_damage = GetWeaponDamage(other, weapon, &hate); if (hate == 0 && weapon_damage > 1) hate = weapon_damage; @@ -4896,14 +4896,14 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b BuffFadeByEffect(SE_Invisibility2); invisible = false; } - + if(invisible_undead) { Log.Out(Logs::Detail, Logs::Combat, "Removing invisibility vs. undead due to melee attack."); BuffFadeByEffect(SE_InvisVsUndead); BuffFadeByEffect(SE_InvisVsUndead2); invisible_undead = false; } - + if(invisible_animals){ Log.Out(Logs::Detail, Logs::Combat, "Removing invisibility vs. animals due to melee attack."); BuffFadeByEffect(SE_InvisVsAnimals); @@ -4963,7 +4963,7 @@ int32 Bot::CalcBotAAFocus(BotfocusType type, uint32 aa_ID, uint32 points, uint16 base1 = eff.base1; base2 = eff.base2; slot = eff.slot; - + //AA Foci's can contain multiple focus effects within the same AA. //To handle this we will not automatically return zero if a limit is found. //Instead if limit is found and multiple effects, we will reset the limit check @@ -5175,10 +5175,8 @@ int32 Bot::CalcBotAAFocus(BotfocusType type, uint32 aa_ID, uint32 points, uint16 case SE_FcTwincast: { if(type == focusTwincast) value = base1; - } break; } - /* case SE_SympatheticProc: { @@ -5188,10 +5186,10 @@ int32 Bot::CalcBotAAFocus(BotfocusType type, uint32 aa_ID, uint32 points, uint16 int16 ProcRateMod = base1; //Baseline is 100 for most Sympathetic foci int32 cast_time = GetActSpellCasttime(spell_id, spells[spell_id].cast_time); GetSympatheticProcChances(ProcBonus, ProcChance, cast_time, ProcRateMod); - + if(zone->random.Real(0, 1) <= ProcChance) value = focus_id; - + else value = 0; } @@ -5247,7 +5245,6 @@ int32 Bot::CalcBotAAFocus(BotfocusType type, uint32 aa_ID, uint32 points, uint16 value = base1; break; } - } //Check for spell skill limits. if ((LimitSpellSkill) && (!SpellSkill_Found)) @@ -5289,7 +5286,7 @@ int32 Bot::GetBotFocusEffect(BotfocusType bottype, uint16 spell_id) { ItemInst* ins = GetBotItem(x); if (!ins) continue; - + TempItem = ins->GetItem(); if (TempItem && TempItem->Focus.Effect > 0 && TempItem->Focus.Effect != SPELL_UNKNOWN) { if(rand_effectiveness) { @@ -5400,7 +5397,7 @@ int32 Bot::GetBotFocusEffect(BotfocusType bottype, uint16 spell_id) { aa_value = aa.second.first; if (aa_AA < 1 || aa_value < 1) continue; - + Total3 = CalcBotAAFocus(bottype, aa_AA, aa_value, spell_id); if (Total3 > 0 && realTotal3 >= 0 && Total3 > realTotal3) { realTotal3 = Total3; @@ -5470,7 +5467,7 @@ int32 Bot::CalcBotFocusEffect(BotfocusType bottype, uint16 focus_id, uint16 spel if (spell.classes[(GetClass() % 16) - 1] < focus_spell.base[i]) return 0; break; - + case SE_LimitCastTimeMin: if (spells[spell_id].cast_time < (uint32)focus_spell.base[i]) return 0; @@ -5501,8 +5498,8 @@ int32 Bot::CalcBotFocusEffect(BotfocusType bottype, uint16 focus_id, uint16 spel return 0; } break; - - + + case SE_LimitSpellType: switch(focus_spell.base[i]) { case 0: @@ -5517,7 +5514,7 @@ int32 Bot::CalcBotFocusEffect(BotfocusType bottype, uint16 focus_id, uint16 spel Log.Out(Logs::General, Logs::Normal, "CalcFocusEffect: unknown limit spelltype %d", focus_spell.base[i]); } break; - + case SE_LimitManaMin: if(spell.mana < focus_spell.base[i]) return 0; @@ -5712,19 +5709,19 @@ int32 Bot::CalcBotFocusEffect(BotfocusType bottype, uint16 focus_id, uint16 spel case SE_FcBaseEffects: { if (bottype == BotfocusFcBaseEffects) value = focus_spell.base[i]; - + break; } case SE_FcDamagePctCrit: { if(bottype == BotfocusFcDamagePctCrit) value = focus_spell.base[i]; - + break; } case SE_FcIncreaseNumHits: { if(bottype == BotfocusIncreaseNumHits) value = focus_spell.base[i]; - + break; } default: @@ -5791,7 +5788,7 @@ bool Bot::AvoidDamage(Mob* other, int32 &damage, bool CanRiposte) { damage = -3; Log.Out(Logs::Detail, Logs::Combat, "I am enraged, riposting frontal attack."); } - + float riposte_chance = 0.0f; if (CanRiposte && damage > 0 && CanThisClassRiposte() && !other->BehindMob(this, other->GetX(), other->GetY())) { riposte_chance = ((100.0f + (float)defender->GetAABonuses().RiposteChance + (float)defender->GetSpellBonuses().RiposteChance + (float)defender->GetItemBonuses().RiposteChance) / 100.0f); @@ -5802,7 +5799,7 @@ bool Bot::AvoidDamage(Mob* other, int32 &damage, bool CanRiposte) { RollTable[0] = (bonus + (itembonuses.HeroicDEX / 25)); } } - + bool bBlockFromRear = false; bool bShieldBlockFromRear = false; if (this->IsBot()) { @@ -5894,7 +5891,7 @@ bool Bot::AvoidDamage(Mob* other, int32 &damage, bool CanRiposte) { if (damage < 0) return true; - + return false; } @@ -5977,11 +5974,11 @@ void Bot::DoSpecialAttackDamage(Mob *who, SkillUseTypes skill, int32 max_damage, const Item_Struct* botweapon = 0; if(inst) botweapon = inst->GetItem(); - + if(botweapon) { if(botweapon->ItemType == ItemTypeShield) hate += botweapon->AC; - + hate = (hate * (100 + GetFuriousBash(botweapon->Focus.Effect)) / 100); } } @@ -6046,7 +6043,7 @@ void Bot::TryBackstab(Mob *other, int ReuseTime) { const Item_Struct* botpiercer = nullptr; if(inst) botpiercer = inst->GetItem(); - + if(!botpiercer || (botpiercer->ItemType != ItemType1HPiercing)) { BotGroupSay(this, "I can't backstab with this weapon!"); return; @@ -6218,7 +6215,7 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) { bool canBash = false; if((GetRace() == OGRE || GetRace() == TROLL || GetRace() == BARBARIAN) || (m_inv.GetItem(MainSecondary) && m_inv.GetItem(MainSecondary)->GetItem()->ItemType == ItemTypeShield) || (m_inv.GetItem(MainPrimary) && (m_inv.GetItem(MainPrimary)->GetItem()->ItemType == ItemType2HSlash || m_inv.GetItem(MainPrimary)->GetItem()->ItemType == ItemType2HBlunt || m_inv.GetItem(MainPrimary)->GetItem()->ItemType == ItemType2HPiercing) && GetAA(aa2HandBash) >= 1)) canBash = true; - + if(!canBash || zone->random.Int(0, 100) > 25) skill_to_use = SkillKick; else @@ -6671,7 +6668,7 @@ void Bot::SetAttackTimer() { } else { delay = ItemToUse->Delay; } - + speed = (RuleB(Spells, Jun182014HundredHandsRevamp) ? static_cast(((delay / haste_mod) + ((hhe / 1000.0f) * (delay / haste_mod))) * 100) : static_cast(((delay / haste_mod) + ((hhe / 100.0f) * delay)) * 100)); TimerToUse->SetAtTrigger(std::max(RuleI(Combat, MinHastedDelay), speed), true); @@ -6982,7 +6979,7 @@ int32 Bot::GetActSpellDuration(uint16 spell_id, int32 duration) { increase += 30; if (GetAA(aaSpellCastingReinforcementMastery) == 1) increase += 20; - + break; } @@ -7001,7 +6998,7 @@ float Bot::GetAOERange(uint16 spell_id) { range = spells[spell_id].aoerange; if(range == 0) range = spells[spell_id].range; - + if(range == 0) range = 10; @@ -7048,14 +7045,14 @@ bool Bot::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_t Log.Out(Logs::Detail, Logs::Spells, "Spell casting canceled: not able to cast now. Valid? %d, casting %d, waiting? %d, spellend? %d, stunned? %d, feared? %d, mezed? %d, silenced? %d", IsValidSpell(spell_id), casting_spell_id, delaytimer, spellend_timer.Enabled(), IsStunned(), IsFeared(), IsMezzed(), IsSilenced() ); if(IsSilenced() && !IsDiscipline(spell_id)) Message_StringID(13, SILENCED_STRING); - + if(IsAmnesiad() && IsDiscipline(spell_id)) - + Message_StringID(13, MELEE_SILENCE); - + if(casting_spell_id) AI_Event_SpellCastFinished(false, casting_spell_slot); - + return false; } } @@ -7064,7 +7061,7 @@ bool Bot::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_t Message_StringID(13, SPELL_WOULDNT_HOLD); if(casting_spell_id) AI_Event_SpellCastFinished(false, casting_spell_slot); - + return false; } @@ -7073,7 +7070,7 @@ bool Bot::CastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_t InterruptSpell(173, 0x121, false); return false; } - + if(slot < MAX_PP_MEMSPELL && !CheckFizzle(spell_id)) { int fizzle_msg = IsBardSong(spell_id) ? MISS_NOTE : SPELL_FIZZLE; InterruptSpell(fizzle_msg, 0x121, spell_id); @@ -7233,7 +7230,7 @@ bool Bot::DetermineSpellTargets(uint16 spell_id, Mob *&spell_target, Mob *&ae_ce bool Bot::DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot, int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot, uint32 aa_id) { bool Result = false; - if(GetClass() == BARD) + if(GetClass() == BARD) cast_time = 0; Result = Mob::DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, aa_id); @@ -7263,7 +7260,7 @@ int32 Bot::GenerateBaseManaPoints() { } else ConvertedWisInt = WisInt; - + if(GetLevel() < 41) { wisint_mana = (GetLevel() * 75 * ConvertedWisInt / 1000); base_mana = (GetLevel() * 15); @@ -7280,7 +7277,7 @@ int32 Bot::GenerateBaseManaPoints() { MindLesserFactor = ((WisInt - 199) / 2); else MindLesserFactor = 0; - + MindFactor = WisInt - MindLesserFactor; if(WisInt > 100) bot_mana = (((5 * (MindFactor + 20)) / 2) * 3 * GetLevel() / 40); @@ -7297,7 +7294,7 @@ int32 Bot::GenerateBaseManaPoints() { ConvertedWisInt -= ((WisInt - 201) * 5 / 4); } else ConvertedWisInt = WisInt; - + if(GetLevel() < 41) { wisint_mana = (GetLevel() * 75 * ConvertedWisInt / 1000); base_mana = (GetLevel() * 15); @@ -7314,7 +7311,7 @@ int32 Bot::GenerateBaseManaPoints() { MindLesserFactor = ((WisInt - 199) / 2); else MindLesserFactor = 0; - + MindFactor = (WisInt - MindLesserFactor); if(WisInt > 100) bot_mana = (((5 * (MindFactor + 20)) / 2) * 3 * GetLevel() / 40); @@ -7339,7 +7336,7 @@ bool Bot::DoFinishedSpellAETarget(uint16 spell_id, Mob* spellTarget, uint16 slot if(GetClass() == BARD) { if(!ApplyNextBardPulse(bardsong, this, bardsong_slot)) InterruptSpell(SONG_ENDS_ABRUPTLY, 0x121, bardsong); - + stopLogic = true; } return true; @@ -7381,7 +7378,7 @@ bool Bot::DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, uint16 } else SpellOnTarget(thespell, g->members[i]); - + if(g->members[i] && g->members[i]->GetPetID()) SpellOnTarget(thespell, g->members[i]->GetPet()); } @@ -7548,7 +7545,7 @@ int32 Bot::CalcSTR() { int32 mod = aabonuses.STR; if(val > 255 && GetLevel() <= 60) val = 255; - + STR = (val + mod); if(STR < 1) STR = 1; @@ -7565,7 +7562,7 @@ int32 Bot::CalcSTA() { int32 mod = aabonuses.STA; if(val > 255 && GetLevel() <= 60) val = 255; - + STA = (val + mod); if(STA < 1) STA = 1; @@ -7599,7 +7596,7 @@ int32 Bot::CalcDEX() { int32 mod = aabonuses.DEX; if(val > 255 && GetLevel() <= 60) val = 255; - + DEX = (val + mod); if(DEX < 1) DEX = 1; @@ -7616,12 +7613,12 @@ int32 Bot::CalcINT() { int32 mod = aabonuses.INT; if(val > 255 && GetLevel() <= 60) val = 255; - + INT = (val + mod); if(INT < 1) INT = 1; - + int m = GetMaxINT(); if(INT > m) INT = m; @@ -7634,7 +7631,7 @@ int32 Bot::CalcWIS() { int32 mod = aabonuses.WIS; if(val > 255 && GetLevel() <= 60) val = 255; - + WIS = (val + mod); if(WIS < 1) @@ -7652,7 +7649,7 @@ int32 Bot::CalcCHA() { int32 mod = aabonuses.CHA; if(val > 255 && GetLevel() <= 60) val = 255; - + CHA = (val + mod); if(CHA < 1) @@ -8049,10 +8046,10 @@ void Bot::DoEnduranceUpkeep() { if(cost_redux > 0) { if(upkeep <= cost_redux) continue; - + upkeep -= cost_redux; } - + if((upkeep+upkeep_sum) > GetEndurance()) BuffFadeBySlot(buffs_i); else @@ -8196,7 +8193,7 @@ bool Bot::CanHeal() { if(botSpell.SpellId != 0) result = true; - + return result; } @@ -9010,7 +9007,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if (!results.Success()) return; - for (int i = 0; i < 7; i++) { + for (int i = 0; i < 7; i++) { uint8 slotmaterial = Inventory::CalcMaterialFromSlot((uint8)slots[i]); c->GetTarget()->CastToBot()->SendWearChange(slotmaterial); } @@ -9030,7 +9027,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } return; } - + if(!strcasecmp(sep->arg[1], "help") && !strcasecmp(sep->arg[2], "armorcolor")){ c->Message(0, "-----------------#bot armorcolor help-----------------------------"); c->Message(0, "Armor: -1(All), 2(Helm), 7(Arms), 9(Bracer), 12(Hands), 17(Chest/Robe), 18(Legs), 19(Boots)"); @@ -9504,7 +9501,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { failedLoreCheck = true; } } - + if(c->CheckLoreConflict(itm)) failedLoreCheck = true; } @@ -9645,12 +9642,12 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { binder = g->members[i]; } } - + if(!hasbinder) c->Message(15, "You must have a Cleric in your group."); } } - + if(hasbinder) { binder->CastToBot()->BotGroupSay(binder->CastToBot(), "Attempting to bind you %s.", c->GetName()); binder->CastToNPC()->CastSpell(35, c->GetID(), 1, -1, -1); @@ -9671,12 +9668,12 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { runeer = g->members[i]; } } - + if(!hasruneer) c->Message(15, "You must have an Enchanter in your group."); } } - + if(hasruneer) { if (c->GetLevel() <= 12) { runeer->CastToBot()->BotGroupSay(runeer->CastToBot(), "I need to be level 13 or higher for this..."); @@ -9886,7 +9883,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { mezzer->CastToBot()->MesmerizeTarget(target); } } - + if(!hasmezzer) c->Message(15, "You must have an Enchanter in your group."); } @@ -9905,22 +9902,22 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { case ENCHANTER: if(casterlevel >= 15) hascaster = true; - + break; case WIZARD: if(casterlevel >= 14) hascaster = true; - + break; case NECROMANCER: if(casterlevel >= 17) hascaster = true; - + break; case MAGICIAN: if(casterlevel >= 13) hascaster = true; - + break; default: break; @@ -9932,12 +9929,12 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } } } - + if(!hascaster) c->Message(15, "You don't see anyone in your group that can cast Identify."); } else c->Message(15, "You don't see anyone in your group that can cast Identify."); - + return; } @@ -9961,12 +9958,12 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { break; } } - + if(!hasrezzer) c->Message(15, "You must have a Cleric in your group!"); } else c->Message(15, "You must have a Cleric in your group!"); - + return; } @@ -9979,7 +9976,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->GetTarget()->CastToBot()->BotGroupSay(c->GetTarget()->CastToBot(), "I don't have any pets yet."); return; } - + if(!strcasecmp(sep->arg[2], "water")) { c->GetTarget()->CastToBot()->SetPetChooserID(0); } else if(!strcasecmp(sep->arg[2], "fire")) { @@ -10007,7 +10004,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } else c->GetTarget()->CastToBot()->SetPetChooserID(4); } - + if(c->GetTarget()->GetPet()) { uint16 id = c->GetTarget()->GetPetID(); c->GetTarget()->SetPetID(0); @@ -10016,7 +10013,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } } else c->Message(15, "You must target your Magician bot!"); - + return; } @@ -10026,7 +10023,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(15, "You must select player with his corpse in the zone!"); return; } - + if(c->IsGrouped()) { bool hassummoner = false; Mob *t = c->GetTarget(); @@ -10060,10 +10057,10 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } } } - + if (!hassummoner) c->Message(15, "You must have a Necromancer or Shadow Knight in your group."); - + return; } } @@ -10084,7 +10081,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(pacer->Bot_Command_CalmTarget(target)) { if(target->FindType(SE_Lull) || target->FindType(SE_Harmony) || target->FindType(SE_InstantHate)) c->Message(0, "I have successfully pacified %s.", target->GetCleanName()); - + return; } else c->Message(0, "I failed to pacify %s.", target->GetCleanName()); @@ -10097,7 +10094,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(pacer->Bot_Command_CalmTarget(target)) { if(target->FindType(SE_Lull) || target->FindType(SE_Harmony) || target->FindType(SE_InstantHate)) c->Message(0, "I have successfully pacified %s.", target->GetCleanName()); - + return; } else c->Message(0, "I failed to pacify %s.", target->GetCleanName()); @@ -10116,7 +10113,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(15, "You must select a monster!"); return; } - + uint32 DBtype = c->GetTarget()->GetBodyType(); Mob *Charmer; uint32 CharmerClass = 0; @@ -10202,7 +10199,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(15, "You must target your Enchanter, Necromancer, or Druid bot."); } else c->Message(15, "You must target an Enchanter, Necromancer, or Druid bot."); - + return; } @@ -10290,18 +10287,18 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { evac = g->members[i]; } } - + if(!hasevac) c->Message(15, "You must have a Druid in your group."); } } - + if((hasevac) && (c->GetLevel() >= 18)) { evac->CastToBot()->BotGroupSay(evac->CastToBot(), "Attempting to evacuate you, %s.", c->GetName()); evac->CastToClient()->CastSpell(2183, c->GetID(), 1, -1, -1); } else if((hasevac) && (c->GetLevel() <= 17)) evac->CastToBot()->BotGroupSay(evac->CastToBot(), "I'm not level 18 yet.", c->GetName()); - + return; } @@ -11470,7 +11467,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { for(int i = 0; i < MAX_GROUP_MEMBERS; i++) { if(!g->members[i]) continue; - + if((g->members[i]->IsClient() && g->members[i]->CastToClient()->GetAggroCount()) || g->members[i]->IsEngaged()) { c->Message(0, "You can't spawn bots while your group is engaged."); return; @@ -11559,7 +11556,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(13, "Unable to create botgroup."); return; } - + Group *newBotGroup = botGroupLeader->GetGroup(); if(!newBotGroup) { c->Message(13, "Unable to find valid botgroup"); @@ -11576,7 +11573,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { safe_delete(botGroupMember); return; } - + if(!botGroupMember) { safe_delete(botGroupMember); continue; @@ -11664,15 +11661,15 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { float Size = target->GetSize(); if (!strcasecmp(sep->arg[1], "hair")) HairStyle = atoi(sep->arg[2]); - + if (!strcasecmp(sep->arg[1], "haircolor")) HairColor = atoi(sep->arg[2]); - + if (!strcasecmp(sep->arg[1], "beard") || !strcasecmp(sep->arg[1], "beardcolor")) { if (!Gender || Race == 8) { if (!strcasecmp(sep->arg[1], "beard")) Beard = atoi(sep->arg[2]); - + if (!strcasecmp(sep->arg[1], "beardcolor")) BeardColor = atoi(sep->arg[2]); } else { @@ -11680,7 +11677,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { return; } } - + if (!strcasecmp(sep->arg[1], "face")) LuclinFace = atoi(sep->arg[2]); @@ -11688,19 +11685,19 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { EyeColor1 = EyeColor2 = atoi(sep->arg[2]); c->Message(0, "Eye Values = 0 - 11"); } - + if(!strcasecmp(sep->arg[1], "heritage") || !strcasecmp(sep->arg[1], "tattoo") || !strcasecmp(sep->arg[1], "details")) { if(Race == 522) { if(!strcasecmp(sep->arg[1], "heritage")) { DrakkinHeritage = atoi(sep->arg[2]); c->Message(0, "Heritage Values = 0 - 6"); } - + if(!strcasecmp(sep->arg[1], "tattoo")) { DrakkinTattoo = atoi(sep->arg[2]); c->Message(0, "Tattoo Values = 0 - 7"); } - + if(!strcasecmp(sep->arg[1], "details")) { DrakkinDetails = atoi(sep->arg[2]); c->Message(0, "Details Values = 0 - 7"); @@ -11847,7 +11844,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(13, "You must name a valid bot."); } else c->Message(0, "Usage #bot stance [name] [stance (id)] (Passive = 0, Balanced = 1, Efficient = 2, Reactive = 3, Aggressive = 4, Burn = 5, BurnAE = 6)"); - + return; } @@ -11899,7 +11896,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } } else c->Message(0, "Usage #bot groupmessages [on|off] [bot name|all]"); - + return; } @@ -11967,7 +11964,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { tempBot->UseDiscipline(defensiveSpellID, tempBot->GetID()); } else c->Message(13, "You must name a valid bot."); - + return; } @@ -12555,7 +12552,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(0, "Usage #bot bardoutofcombat [on|off]"); return; } - + if(!strcasecmp(sep->arg[1], "showhelm")) { bool showhelm = true; if (sep->arg[2]) { @@ -12567,10 +12564,10 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(0, "Usage #bot showhelm [on|off]"); return; } - + Mob *target = c->GetTarget(); if (target && target->IsBot() && (c == target->GetOwner()->CastToClient())) { - Bot* b = target->CastToBot(); + Bot* b = target->CastToBot(); if (b) { b->SetShowHelm(showhelm); c->Message(0, "Your bot will %s show their helmet.", (showhelm ? "now" : "no longer")); @@ -12578,7 +12575,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } } else c->Message(0, "Usage #bot showhelm [on|off]"); - + return; } } @@ -12738,7 +12735,7 @@ Mob* EntityList::GetMobByBotID(uint32 botID) { for (auto it = mob_list.begin(); it != mob_list.end(); ++it) { if(!it->second) continue; - + if(it->second->IsBot() && it->second->CastToBot()->GetBotID() == botID) { Result = it->second; break; @@ -13032,7 +13029,7 @@ uint32 Bot::CalcCurrentWeight() { for(int i = EmuConstants::EQUIPMENT_BEGIN; i <= EmuConstants::EQUIPMENT_END; ++i) { inst = GetBotItem(i); if(inst) { - TempItem = inst->GetItem(); + TempItem = inst->GetItem(); if (TempItem) Total += TempItem->Weight; } @@ -13041,7 +13038,7 @@ uint32 Bot::CalcCurrentWeight() { float Packrat = ((float)spellbonuses.Packrat + (float)aabonuses.Packrat); if (Packrat > 0) Total = (uint32)((float)Total * (1.0f - ((Packrat * 1.0f) / 100.0f))); - + return Total; } @@ -13174,7 +13171,7 @@ void Bot::SetDefaultBotStance() { BotStanceType defaultStance = BotStanceBalanced; if (GetClass() == WARRIOR) defaultStance = BotStanceAggressive; - + _baseBotStance = BotStancePassive; _botStance = defaultStance; } @@ -13324,21 +13321,21 @@ void Bot::SetPrevHealRotationMember( Bot* healer ) { Bot* Bot::GetHealRotationLeader( ) { if(_healRotationLeader) return entity_list.GetBotByBotID(_healRotationLeader); - + return 0; } Bot* Bot::GetNextHealRotationMember( ) { if(_healRotationMemberNext) return entity_list.GetBotByBotID(_healRotationMemberNext); - + return 0; } Bot* Bot::GetPrevHealRotationMember( ) { if(_healRotationMemberNext) return entity_list.GetBotByBotID(_healRotationMemberPrev); - + return 0; } @@ -13352,7 +13349,7 @@ bool Bot::AddHealRotationTarget( Mob* target ) { } else if(!strcasecmp(tempTarget->GetCleanName(), target->GetCleanName())) { if(tempTarget->GetID() != target->GetID()) _healRotationTargets[i] = target->GetID(); - + return false; } } From d5098a56e0d50af6b687874b5e7374b3d43055d9 Mon Sep 17 00:00:00 2001 From: KimLS Date: Sat, 20 Jun 2015 19:44:00 -0700 Subject: [PATCH 31/90] Timers and some more loading stuff --- common/clientversions.h | 22 ++++++++ common/ruletypes.h | 1 + world/client.cpp | 8 ++- zone/aa.cpp | 122 ++++++++++++++++++++++++++++++++-------- zone/aa.h | 7 +++ zone/aa_ability.h | 1 - zone/aa_rank.h | 2 +- zone/aa_rank_prereqs.h | 33 ----------- zone/client.cpp | 10 +--- zone/client.h | 3 +- zone/client_packet.cpp | 10 +++- zone/command.cpp | 34 +++++++++++ zone/command.h | 4 +- zone/entity.cpp | 8 +++ zone/entity.h | 2 +- zone/mob.h | 2 + zone/npc.cpp | 1 - zone/spells.cpp | 8 +-- 18 files changed, 199 insertions(+), 79 deletions(-) delete mode 100644 zone/aa_rank_prereqs.h diff --git a/common/clientversions.h b/common/clientversions.h index 675429eab..4e575f8f4 100644 --- a/common/clientversions.h +++ b/common/clientversions.h @@ -150,4 +150,26 @@ static ClientVersion ClientVersionFromBit(uint32 clientVersionBit) } } +static uint32 ExpansionFromClientVersion(ClientVersion clientVersion) +{ + switch(clientVersion) + { + case ClientVersion::Unknown: + case ClientVersion::Client62: + case ClientVersion::Titanium: + return 0x000007FFU; + case ClientVersion::SoF: + return 0x00007FFFU; + case ClientVersion::SoD: + return 0x0000FFFFU; + case ClientVersion::UF: + return 0x0001FFFFU; + case ClientVersion::RoF: + case ClientVersion::RoF2: + return 0x000FFFFFU; + default: + return 0; + } +} + #endif /* CLIENTVERSIONS_H */ diff --git a/common/ruletypes.h b/common/ruletypes.h index 4c9430998..8dffc82e5 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -184,6 +184,7 @@ RULE_INT(World, MinGMAntiHackStatus, 1) //Minimum GM status to check against Ant RULE_INT(World, SoFStartZoneID, -1) //Sets the Starting Zone for SoF Clients separate from Titanium Clients (-1 is disabled) RULE_INT(World, TitaniumStartZoneID, -1) //Sets the Starting Zone for Titanium Clients (-1 is disabled). Replaces the old method. RULE_INT(World, ExpansionSettings, 16383) // Sets the expansion settings for the server, This is sent on login to world and affects client expansion settings. Defaults to all expansions enabled up to TSS. +RULE_BOOL(World, UseClientBasedExpansionSettings, true) // if true it will overrule World, ExpansionSettings and set someone's expansion based on the client they're using RULE_INT(World, PVPSettings, 0) // Sets the PVP settings for the server, 1 = Rallos Zek RuleSet, 2 = Tallon/Vallon Zek Ruleset, 4 = Sullon Zek Ruleset, 6 = Discord Ruleset, anything above 6 is the Discord Ruleset without the no-drop restrictions removed. TODO: Edit IsAttackAllowed in Zone to accomodate for these rules. RULE_BOOL (World, IsGMPetitionWindowEnabled, false) RULE_INT (World, FVNoDropFlag, 0) // Sets the Firiona Vie settings on the client. If set to 2, the flag will be set for GMs only, allowing trading of no-drop items. diff --git a/world/client.cpp b/world/client.cpp index 26a69222b..2c476902a 100644 --- a/world/client.cpp +++ b/world/client.cpp @@ -152,7 +152,13 @@ void Client::SendEnterWorld(std::string name) void Client::SendExpansionInfo() { auto outapp = new EQApplicationPacket(OP_ExpansionInfo, sizeof(ExpansionInfo_Struct)); ExpansionInfo_Struct *eis = (ExpansionInfo_Struct*)outapp->pBuffer; - eis->Expansions = (RuleI(World, ExpansionSettings)); + if(RuleB(World, UseClientBasedExpansionSettings)) { + eis->Expansions = ExpansionFromClientVersion(eqs->GetClientVersion()); + //eis->Expansions = ExpansionFromClientVersion(this->GetCLE. + } else { + eis->Expansions = (RuleI(World, ExpansionSettings)); + } + QueuePacket(outapp); safe_delete(outapp); } diff --git a/zone/aa.cpp b/zone/aa.cpp index 741a15aff..0c31034c7 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -872,8 +872,8 @@ void Client::SendAlternateAdvancementRank(int aa_id, int level) { } for(auto &prereq : rank->prereqs) { - outapp->WriteSInt32(prereq.aa_id); - outapp->WriteSInt32(prereq.points); + outapp->WriteSInt32(prereq.first); + outapp->WriteSInt32(prereq.second); } QueuePacket(outapp); @@ -948,6 +948,41 @@ void Client::SendAlternateAdvancementTimers() { safe_delete(outapp); } +void Client::ResetAlternateAdvancementTimer(int ability) { + AA::Rank *rank = zone->GetAlternateAdvancementRank(casting_spell_aa_id); + if(rank) { + SendAlternateAdvancementTimer(rank->spell_type, 0, time(0)); + p_timers.Clear(&database, rank->spell_type + pTimerAAStart); + } +} + +void Client::ResetAlternateAdvancementTimers() { + EQApplicationPacket* outapp = new EQApplicationPacket(OP_AAAction, sizeof(UseAA_Struct)); + UseAA_Struct* uaaout = (UseAA_Struct*)outapp->pBuffer; + + PTimerList::iterator c, e; + c = p_timers.begin(); + e = p_timers.end(); + std::vector r_timers; + for(; c != e; ++c) { + PersistentTimer *cur = c->second; + if(cur->GetType() < pTimerAAStart || cur->GetType() > pTimerAAEnd) + continue; + //send timer + uaaout->begin = 0; + uaaout->end = static_cast(time(nullptr)); + uaaout->ability = cur->GetType() - pTimerAAStart; + r_timers.push_back(cur->GetType()); + QueuePacket(outapp); + } + + for(auto &i : r_timers) { + p_timers.Clear(&database, i); + } + + safe_delete(outapp); +} + void Client::PurchaseAlternateAdvancementRank(int rank_id) { AA::Rank *rank = zone->GetAlternateAdvancementRank(rank_id); if(!rank) { @@ -1212,13 +1247,13 @@ void Mob::ExpendAlternateAdvancementCharge(uint32 aa_id) { bool ZoneDatabase::LoadAlternateAdvancement(Client *c) { c->ClearAAs(); std::string query = StringFormat( - "SELECT " - "aa_id, " - "aa_value, " - "charges " - "FROM " - "`character_alternate_abilities` " - "WHERE `id` = %u ORDER BY `slot`", c->CharacterID()); + "SELECT " + "aa_id, " + "aa_value, " + "charges " + "FROM " + "`character_alternate_abilities` " + "WHERE `id` = %u", c->CharacterID()); MySQLRequestResult results = database.QueryDatabase(query); int i = 0; @@ -1227,11 +1262,25 @@ bool ZoneDatabase::LoadAlternateAdvancement(Client *c) { uint32 value = atoi(row[1]); uint32 charges = atoi(row[2]); - c->GetPP().aa_array[i].AA = aa; - c->GetPP().aa_array[i].value = value; - c->GetPP().aa_array[i].charges = charges; - c->SetAA(aa, value, charges); - i++; + auto rank = zone->GetAlternateAdvancementRank(aa); + if(!rank) { + continue; + } + + auto ability = rank->base_ability; + if(!ability) { + continue; + } + + rank = ability->GetRankByPointsSpent(value); + + if(c->CanUseAlternateAdvancementRank(rank)) { + c->GetPP().aa_array[i].AA = aa; + c->GetPP().aa_array[i].value = value; + c->GetPP().aa_array[i].charges = charges; + c->SetAA(aa, value, charges); + i++; + } } return true; @@ -1359,8 +1408,14 @@ bool Mob::CanUseAlternateAdvancementRank(AA::Rank *rank) { } } - if(!(RuleI(World, ExpansionSettings) & (1 << rank->expansion))) { - return false; + if(IsClient()) { + if(!(CastToClient()->GetPP().expansions & (1 << rank->expansion))) { + return false; + } + } else { + if(!(RuleI(World, ExpansionSettings) & (1 << rank->expansion))) { + return false; + } } auto race = GetArrayRace(GetBaseRace()); @@ -1427,11 +1482,11 @@ bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price) //check prereqs for(auto &prereq : rank->prereqs) { - AA::Ability *prereq_ability = zone->GetAlternateAdvancementAbility(prereq.aa_id); + AA::Ability *prereq_ability = zone->GetAlternateAdvancementAbility(prereq.first); if(prereq_ability) { auto ranks = GetAA(prereq_ability->first_rank_id); - if(ranks < prereq.points) { + if(ranks < prereq.second) { return false; } } @@ -1473,6 +1528,24 @@ void Zone::LoadAlternateAdvancement() { if(current->prev) { current->total_cost = current->cost + current->prev->total_cost; + + //check prereqs here + for(auto &prev_prereq : current->prev->prereqs) { + // //if prev has an aa we dont have set + // // then set it here too + // //if prev has an aa we have and the count is different + // // then set to whichever is highest + // + auto iter = current->prereqs.find(prev_prereq.first); + if(iter == current->prereqs.end()) { + //not found + current->prereqs[prev_prereq.first] = prev_prereq.second; + } else { + //they already have it too! + auto points = std::max(iter->second, prev_prereq.second); + current->prereqs[iter->first] = points; + } + } } else { current->prev_id = -1; @@ -1593,14 +1666,17 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map 0) { AA::Rank *rank = ranks[rank_id].get(); - rank->prereqs.push_back(prereq); + rank->prereqs[aa_id] = points; } } } else { @@ -1650,4 +1726,4 @@ void Mob::GrantAlternateAdvancementAbility(int aa_id, int points) { c->SendAlternateAdvancementStats(); c->CalcBonuses(); } -} \ No newline at end of file +} diff --git a/zone/aa.h b/zone/aa.h index 76df0f388..280f56d53 100644 --- a/zone/aa.h +++ b/zone/aa.h @@ -1536,4 +1536,11 @@ public: uint32 owner_id; }; +enum AATimers +{ + aaTimerRampage, + aaTimerWarcry, + aaTimerMax +}; + #endif diff --git a/zone/aa_ability.h b/zone/aa_ability.h index 4a2d41f3e..0d6a240c4 100644 --- a/zone/aa_ability.h +++ b/zone/aa_ability.h @@ -24,7 +24,6 @@ #include #include #include "aa_rank_effects.h" -#include "aa_rank_prereqs.h" #include "aa_rank.h" class Mob; diff --git a/zone/aa_rank.h b/zone/aa_rank.h index 977a07680..c328e4ebb 100644 --- a/zone/aa_rank.h +++ b/zone/aa_rank.h @@ -48,7 +48,7 @@ public: int total_cost; Ability *base_ability; std::vector effects; - std::vector prereqs; + std::map prereqs; }; } diff --git a/zone/aa_rank_prereqs.h b/zone/aa_rank_prereqs.h deleted file mode 100644 index b1620be6c..000000000 --- a/zone/aa_rank_prereqs.h +++ /dev/null @@ -1,33 +0,0 @@ -/* EQEMu: Everquest Server Emulator - Copyright (C) 2001-2015 EQEMu Development Team (http://eqemulator.net) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; version 2 of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY except by those people which sell it, which - are required to give you total support for your newly bought product; - without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ - -#ifndef EQEMU_ZONE_AA_RANK_PREREQS_H -#define EQEMU_ZONE_AA_RANK_PREREQS_H - -namespace AA -{ - -struct RankPrereq -{ - int aa_id; - int points; -}; - -} - -#endif diff --git a/zone/client.cpp b/zone/client.cpp index 0ce7292ef..ae0ceedff 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -524,7 +524,6 @@ void Client::ReportConnectingState() { } bool Client::SaveAA() { - std::string dquery; std::string iquery; int spentpoints = 0; int i = 0; @@ -546,10 +545,10 @@ bool Client::SaveAA() { spentpoints += r->total_cost; if(i == 0) { - iquery = StringFormat("INSERT INTO `character_alternate_abilities` (id, slot, aa_id, aa_value, charges)" - " VALUES (%u, %u, %u, %u, %u)", character_id, i, ability->first_rank_id, rank.second.first, rank.second.second); + iquery = StringFormat("REPLACE INTO `character_alternate_abilities` (id, aa_id, aa_value, charges)" + " VALUES (%u, %u, %u, %u)", character_id, ability->first_rank_id, rank.second.first, rank.second.second); } else { - iquery += StringFormat(", (%u, %u, %u, %u, %u)", character_id, i, ability->first_rank_id, rank.second.first, rank.second.second); + iquery += StringFormat(", (%u, %u, %u, %u)", character_id, ability->first_rank_id, rank.second.first, rank.second.second); } i++; } @@ -557,9 +556,6 @@ bool Client::SaveAA() { m_pp.aapoints_spent = spentpoints + m_epp.expended_aa; - dquery = StringFormat("DELETE FROM `character_alternate_abilities` WHERE id=%u", character_id); - database.QueryDatabase(dquery); - if(iquery.length() > 0) { database.QueryDatabase(iquery); } diff --git a/zone/client.h b/zone/client.h index 034ff83b4..07d42a313 100644 --- a/zone/client.h +++ b/zone/client.h @@ -45,7 +45,6 @@ struct Item_Struct; #include "../common/item_struct.h" #include "../common/clientversions.h" -#include "aa.h" #include "common.h" #include "merc.h" #include "mob.h" @@ -768,6 +767,8 @@ public: void SendAlternateAdvancementPoints(); void SendAlternateAdvancementTimer(int ability, int begin, int end); void SendAlternateAdvancementTimers(); + void ResetAlternateAdvancementTimer(int ability); + void ResetAlternateAdvancementTimers(); void SetAAPoints(uint32 points) { m_pp.aapoints = points; SendAlternateAdvancementStats(); } void AddAAPoints(uint32 points) { m_pp.aapoints += points; SendAlternateAdvancementStats(); } diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index d01bcf109..8f4b55004 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -1440,6 +1440,13 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) if (m_pp.ldon_points_tak < 0 || m_pp.ldon_points_tak > 2000000000){ m_pp.ldon_points_tak = 0; } if (m_pp.ldon_points_available < 0 || m_pp.ldon_points_available > 2000000000){ m_pp.ldon_points_available = 0; } + if(RuleB(World, UseClientBasedExpansionSettings)) { + m_pp.expansions = ExpansionFromClientVersion(GetClientVersion()); + } + else { + m_pp.expansions = RuleI(World, ExpansionSettings); + } + if(!database.LoadAlternateAdvancement(this)) { Log.Out(Logs::General, Logs::Error, "Error loading AA points for %s", GetName()); } @@ -1566,9 +1573,6 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app) /* Update LFP in case any (or all) of our group disbanded while we were zoning. */ if (IsLFP()) { UpdateLFP(); } - /* Get Expansions from variables table and ship via PP */ - m_pp.expansions = RuleI(World, ExpansionSettings); - p_timers.SetCharID(CharacterID()); if (!p_timers.Load(&database)) { Log.Out(Logs::General, Logs::Error, "Unable to load ability timers from the database for %s (%i)!", GetCleanName(), CharacterID()); diff --git a/zone/command.cpp b/zone/command.cpp index ab2b4ad78..59f4bfa8a 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -320,6 +320,7 @@ int command_init(void) { command_add("raidloot", "LEADER|GROUPLEADER|SELECTED|ALL - Sets your raid loot settings if you have permission to do so.", 0, command_raidloot) || command_add("randomfeatures", "- Temporarily randomizes the Facial Features of your target", 80, command_randomfeatures) || command_add("refreshgroup", "- Refreshes Group.", 0, command_refreshgroup) || + command_add("reloadaa", "Reloads AA data", 200, command_reloadaa) || command_add("reloadallrules", "Executes a reload of all rules.", 80, command_reloadallrules) || command_add("reloademote", "Reloads NPC Emotes", 80, command_reloademote) || command_add("reloadlevelmods", nullptr,255, command_reloadlevelmods) || @@ -333,6 +334,7 @@ int command_init(void) { command_add("reloadzps", nullptr,0, command_reloadzps) || command_add("repop", "[delay] - Repop the zone with optional delay", 100, command_repop) || command_add("resetaa", "- Resets a Player's AA in their profile and refunds spent AA's to unspent, may disconnect player.", 200, command_resetaa) || + command_add("resetaa_timer", "Command to reset AA cooldown timers.", 200, command_resetaa_timer) || command_add("revoke", "[charname] [1/0] - Makes charname unable to talk on OOC", 200, command_revoke) || command_add("rules", "(subcommand) - Manage server rules", 250, command_rules) || command_add("save", "- Force your player or player corpse target to be saved to the database", 50, command_save) || @@ -10580,3 +10582,35 @@ void command_mysqltest(Client *c, const Seperator *sep) } Log.Out(Logs::General, Logs::Debug, "MySQL Test... Took %f seconds", ((float)(std::clock() - t)) / CLOCKS_PER_SEC); } + +void command_resetaa_timer(Client *c, const Seperator *sep) { + Client *target = nullptr; + if(!c->GetTarget() || !c->GetTarget()->IsClient()) { + target = c; + } else { + target = c->GetTarget()->CastToClient(); + } + + if(sep->IsNumber(1)) + { + int timer_id = atoi(sep->arg[1]); + c->Message(0, "Reset of timer %i for %s", timer_id, c->GetName()); + c->ResetAlternateAdvancementTimer(timer_id); + } + else if(!strcasecmp(sep->arg[1], "all")) + { + c->Message(0, "Reset all timers for %s", c->GetName()); + c->ResetAlternateAdvancementTimers(); + } + else + { + c->Message(0, "usage: #resetaa_timer [all | timer_id]"); + } +} + +void command_reloadaa(Client *c, const Seperator *sep) { + c->Message(0, "Reloading Alternate Advancement Data..."); + zone->LoadAlternateAdvancement(); + c->Message(0, "Alternate Advancement Data Reloaded"); + entity_list.SendAlternateAdvancementStats(); +} \ No newline at end of file diff --git a/zone/command.h b/zone/command.h index f44362ea7..795f75919 100644 --- a/zone/command.h +++ b/zone/command.h @@ -323,7 +323,9 @@ void command_tune(Client *c, const Seperator *sep); void command_logtest(Client *c, const Seperator *sep); void command_mysqltest(Client *c, const Seperator *sep); void command_logs(Client *c, const Seperator *sep); - +void command_resetaa_timer(Client *c, const Seperator *sep); +void command_reloadaa(Client *c, const Seperator *sep); + #ifdef EQPROFILE void command_profiledump(Client *c, const Seperator *sep); void command_profilereset(Client *c, const Seperator *sep); diff --git a/zone/entity.cpp b/zone/entity.cpp index 5033c52fe..8749b102c 100644 --- a/zone/entity.cpp +++ b/zone/entity.cpp @@ -4704,3 +4704,11 @@ void EntityList::StopMobAI() mob.second->AI_ShutDown(); } } + +void EntityList::SendAlternateAdvancementStats() { + for(auto &c : client_list) { + c.second->SendAlternateAdvancementTable(); + c.second->SendAlternateAdvancementStats(); + c.second->SendAlternateAdvancementPoints(); + } +} diff --git a/zone/entity.h b/zone/entity.h index 446c5d505..1adf23783 100644 --- a/zone/entity.h +++ b/zone/entity.h @@ -398,7 +398,6 @@ public: void SaveAllClientsTaskState(); void ReloadAllClientsTaskState(int TaskID=0); - uint16 CreateGroundObject(uint32 itemid, const glm::vec4& position, uint32 decay_time = 300000); uint16 CreateGroundObjectFromModel(const char *model, const glm::vec4& position, uint8 type = 0x00, uint32 decay_time = 0); uint16 CreateDoor(const char *model, const glm::vec4& position, uint8 type = 0, uint16 size = 100); @@ -429,6 +428,7 @@ public: uint16 GetFreeID(); void RefreshAutoXTargets(Client *c); void RefreshClientXTargets(Client *c); + void SendAlternateAdvancementStats(); protected: friend class Zone; diff --git a/zone/mob.h b/zone/mob.h index 1c3d7ab15..8352d764e 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -24,6 +24,7 @@ #include "pathing.h" #include "position.h" #include "aa_ability.h" +#include "aa.h" #include #include #include @@ -1327,6 +1328,7 @@ protected: bool destructibleobject; std::unordered_map> aa_ranks; + Timer aa_timers[aaTimerMax]; private: void _StopSong(); //this is not what you think it is diff --git a/zone/npc.cpp b/zone/npc.cpp index d4a33b6d0..2d0c1f13b 100644 --- a/zone/npc.cpp +++ b/zone/npc.cpp @@ -31,7 +31,6 @@ #include "../common/linked_list.h" #include "../common/servertalk.h" -#include "aa.h" #include "client.h" #include "entity.h" #include "npc.h" diff --git a/zone/spells.cpp b/zone/spells.cpp index ec872d1c9..4f492c343 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -818,12 +818,8 @@ void Mob::InterruptSpell(uint16 message, uint16 color, uint16 spellid) } if(casting_spell_aa_id && IsClient()) { //Rest AA Timer on failed cast - AA::Rank *rank = zone->GetAlternateAdvancementRank(casting_spell_aa_id); - if(rank) { - CastToClient()->Message_StringID(MT_SpellFailure, ABILITY_FAILED); - CastToClient()->SendAlternateAdvancementTimer(rank->spell_type, 0, 0x7fffffff); - CastToClient()->GetPTimers().Clear(&database, rank->spell_type + pTimerAAStart); - } + CastToClient()->Message_StringID(MT_SpellFailure, ABILITY_FAILED); + CastToClient()->ResetAlternateAdvancementTimer(casting_spell_aa_id); } ZeroCastingVars(); // resets all the state keeping stuff From d34b4a786b63e39d9705ae35f736da119ad0b03d Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 21 Jun 2015 02:01:48 -0400 Subject: [PATCH 32/90] Implement duration ramp and war cry with new AA system Rampage also correctly does a full attack round for classes other than monk and ranger --- zone/aa.cpp | 43 ++++++++++++++------- zone/attack.cpp | 36 ++++++++++++++++++ zone/client.h | 3 +- zone/client_process.cpp | 84 +++-------------------------------------- zone/effects.cpp | 7 +++- zone/mob.h | 1 + zone/spell_effects.cpp | 53 ++++++++------------------ zone/spells.cpp | 16 ++++---- 8 files changed, 102 insertions(+), 141 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index 0c31034c7..41be9a0cf 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -828,7 +828,7 @@ void Client::SendAlternateAdvancementRank(int aa_id, int level) { if(!CanUseAlternateAdvancementRank(rank)) { return; } - + int size = sizeof(AARankInfo_Struct) + (sizeof(AARankEffect_Struct) * rank->effects.size()) + (sizeof(AARankPrereq_Struct) * rank->prereqs.size()); EQApplicationPacket *outapp = new EQApplicationPacket(OP_SendAATable, size); AARankInfo_Struct *aai = (AARankInfo_Struct*)outapp->pBuffer; @@ -996,7 +996,7 @@ void Client::PurchaseAlternateAdvancementRank(int rank_id) { if(!CanPurchaseAlternateAdvancementRank(rank, true)) { return; } - + if(rank->base_ability->charges > 0) { uint32 charges = 0; GetAA(rank_id, &charges); @@ -1004,7 +1004,7 @@ void Client::PurchaseAlternateAdvancementRank(int rank_id) { if(charges > 0) { return; } - + SetAA(rank_id, rank->current_value, rank->base_ability->charges); } else { SetAA(rank_id, rank->current_value, 0); @@ -1022,10 +1022,10 @@ void Client::PurchaseAlternateAdvancementRank(int rank_id) { SendAlternateAdvancementStats(); if(rank->prev) { - Message_StringID(15, AA_IMPROVE, - std::to_string(rank->title_sid).c_str(), - std::to_string(rank->prev->current_value).c_str(), - std::to_string(rank->cost).c_str(), + Message_StringID(15, AA_IMPROVE, + std::to_string(rank->title_sid).c_str(), + std::to_string(rank->prev->current_value).c_str(), + std::to_string(rank->cost).c_str(), std::to_string(AA_POINTS).c_str()); /* QS: Player_Log_AA_Purchases */ @@ -1034,9 +1034,9 @@ void Client::PurchaseAlternateAdvancementRank(int rank_id) { QServ->PlayerLogEvent(Player_Log_AA_Purchases, CharacterID(), event_desc); } } else { - Message_StringID(15, AA_GAIN_ABILITY, - std::to_string(rank->title_sid).c_str(), - std::to_string(rank->cost).c_str(), + Message_StringID(15, AA_GAIN_ABILITY, + std::to_string(rank->title_sid).c_str(), + std::to_string(rank->cost).c_str(), std::to_string(AA_POINTS).c_str()); /* QS: Player_Log_AA_Purchases */ if (RuleB(QueryServ, PlayerLogAAPurchases)){ @@ -1125,7 +1125,7 @@ void Client::ActivateAlternateAdvancementAbility(int rank_id, int target_id) { if(!IsValidSpell(rank->spell)) { return; } - + if(!CanUseAlternateAdvancementRank(rank)) { return; } @@ -1448,7 +1448,7 @@ bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price) if(!ability) return false; - + if(!CanUseAlternateAdvancementRank(rank)) { return false; } @@ -1474,7 +1474,7 @@ bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price) } //if expendable only let us purchase if we have no charges already - //not quite sure on how this functions client side atm + //not quite sure on how this functions client side atm //I intend to look into it later to make sure the behavior is right if(ability->charges > 0 && current_charges > 0) { return false; @@ -1565,7 +1565,7 @@ void Zone::LoadAlternateAdvancement() { } bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_map> &abilities, - std::unordered_map> &ranks) + std::unordered_map> &ranks) { Log.Out(Logs::General, Logs::Status, "Loading Alternate Advancement Abilities..."); abilities.clear(); @@ -1727,3 +1727,18 @@ void Mob::GrantAlternateAdvancementAbility(int aa_id, int points) { c->CalcBonuses(); } } + +bool Mob::CheckAATimer(int timer) +{ + if (timer >= aaTimerMax) + return false; + if (aa_timers[timer].Enabled()) { + if (aa_timers[timer].Check(false)) { + aa_timers[timer].Disable(); + return false; + } else { + return true; + } + } + return false; +} diff --git a/zone/attack.cpp b/zone/attack.cpp index 6a8125507..202ad77b6 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -5056,3 +5056,39 @@ void NPC::SetAttackTimer() TimerToUse->SetAtTrigger(std::max(RuleI(Combat, MinHastedDelay), speed), true, true); } } + +void Client::DoAttackRounds(Mob *target, int hand, bool IsFromSpell) +{ + if (!target) + return; + + Attack(target, hand, false, false, IsFromSpell); + + if (CanThisClassDoubleAttack()) { + CheckIncreaseSkill(SkillDoubleAttack, target, -10); + if (CheckDoubleAttack()) + Attack(target, hand, false, false, IsFromSpell); + if (hand == MainPrimary && GetLevel() >= 60 && + (GetClass() == MONK || GetClass() == WARRIOR || GetClass() == RANGER || GetClass() == BERSERKER) && + CheckDoubleAttack(true)) + Attack(target, hand, false, false, IsFromSpell); + } + if (hand == MainPrimary) { + auto flurrychance = aabonuses.FlurryChance + spellbonuses.FlurryChance + itembonuses.FlurryChance; + if (flurrychance && zone->random.Roll(flurrychance)) { + Message_StringID(MT_NPCFlurry, YOU_FLURRY); + Attack(target, hand, false, false, IsFromSpell); + Attack(target, hand, false, false, IsFromSpell); + } + + auto extraattackchance = aabonuses.ExtraAttackChance + spellbonuses.ExtraAttackChance + itembonuses.ExtraAttackChance; + if (extraattackchance) { + auto wpn = GetInv().GetItem(MainPrimary); + if (wpn && (wpn->GetItem()->ItemType == ItemType2HBlunt || + wpn->GetItem()->ItemType == ItemType2HSlash || + wpn->GetItem()->ItemType == ItemType2HPiercing)) + if (zone->random.Roll(extraattackchance)) + Attack(target, hand, false, false, IsFromSpell); + } + } +} diff --git a/zone/client.h b/zone/client.h index 07d42a313..44e86f971 100644 --- a/zone/client.h +++ b/zone/client.h @@ -226,6 +226,7 @@ public: virtual int32 GetMeleeMitDmg(Mob *attacker, int32 damage, int32 minhit, float mit_rating, float atk_rating); virtual void SetAttackTimer(); float GetQuiverHaste(); + void DoAttackRounds(Mob *target, int hand, bool IsFromSpell = false); void AI_Init(); void AI_Start(uint32 iMoveDelay = 0); @@ -774,7 +775,7 @@ public: void AddAAPoints(uint32 points) { m_pp.aapoints += points; SendAlternateAdvancementStats(); } int GetAAPoints() { return m_pp.aapoints; } int GetSpentAA() { return m_pp.aapoints_spent; } - + //old AA methods that we still use void ResetAA(); void RefundAA(); diff --git a/zone/client_process.cpp b/zone/client_process.cpp index 603636a82..42c244e6b 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -391,74 +391,12 @@ bool Client::Process() { } else if (auto_attack_target->GetHP() > -10) // -10 so we can watch people bleed in PvP { - //old aa - //if(CheckAAEffect(aaEffectRampage)) - //{ - // entity_list.AEAttack(this, 30); - //} else { - Attack(auto_attack_target, MainPrimary); // Kaiyodo - added attacking hand to arguments - //} ItemInst *wpn = GetInv().GetItem(MainPrimary); TryWeaponProc(wpn, auto_attack_target, MainPrimary); - bool tripleAttackSuccess = false; - if( auto_attack_target && CanThisClassDoubleAttack() ) { - - CheckIncreaseSkill(SkillDoubleAttack, auto_attack_target, -10); - if(CheckDoubleAttack()) { - //should we allow rampage on double attack? - //if(CheckAAEffect(aaEffectRampage)) { - // entity_list.AEAttack(this, 30); - //} else { - Attack(auto_attack_target, MainPrimary, false); - //} - } - - //triple attack: rangers, monks, warriors, berserkers over level 60 - if((((GetClass() == MONK || GetClass() == WARRIOR || GetClass() == RANGER || GetClass() == BERSERKER) - && GetLevel() >= 60) || GetSpecialAbility(SPECATK_TRIPLE)) - && CheckDoubleAttack(true)) - { - tripleAttackSuccess = true; - Attack(auto_attack_target, MainPrimary, false); - } - - //quad attack, does this belong here?? - if(GetSpecialAbility(SPECATK_QUAD) && CheckDoubleAttack(true)) - { - Attack(auto_attack_target, MainPrimary, false); - } - } - - //Live AA - Flurry, Rapid Strikes ect (Flurry does not require Triple Attack). - int16 flurrychance = aabonuses.FlurryChance + spellbonuses.FlurryChance + itembonuses.FlurryChance; - - if (auto_attack_target && flurrychance) - { - if(zone->random.Int(0, 99) < flurrychance) - { - Message_StringID(MT_NPCFlurry, YOU_FLURRY); - Attack(auto_attack_target, MainPrimary, false); - Attack(auto_attack_target, MainPrimary, false); - } - } - - int16 ExtraAttackChanceBonus = spellbonuses.ExtraAttackChance + itembonuses.ExtraAttackChance + aabonuses.ExtraAttackChance; - - if (auto_attack_target && ExtraAttackChanceBonus) { - ItemInst *wpn = GetInv().GetItem(MainPrimary); - if(wpn){ - if(wpn->GetItem()->ItemType == ItemType2HSlash || - wpn->GetItem()->ItemType == ItemType2HBlunt || - wpn->GetItem()->ItemType == ItemType2HPiercing ) - { - if(zone->random.Int(0, 99) < ExtraAttackChanceBonus) - { - Attack(auto_attack_target, MainPrimary, false); - } - } - } - } + DoAttackRounds(auto_attack_target, MainPrimary); + if (CheckAATimer(aaTimerRampage)) + entity_list.AEAttack(this, 30); } } @@ -499,23 +437,11 @@ bool Client::Process() { float random = zone->random.Real(0, 1); CheckIncreaseSkill(SkillDualWield, auto_attack_target, -10); - if (random < DualWieldProbability){ // Max 78% of DW - //if(CheckAAEffect(aaEffectRampage)) { - // entity_list.AEAttack(this, 30, MainSecondary); - //} else { - Attack(auto_attack_target, MainSecondary); // Single attack with offhand - //} + if (random < DualWieldProbability) { // Max 78% of DW ItemInst *wpn = GetInv().GetItem(MainSecondary); TryWeaponProc(wpn, auto_attack_target, MainSecondary); - if( CanThisClassDoubleAttack() && CheckDoubleAttack()) { - //if(CheckAAEffect(aaEffectRampage)) { - // entity_list.AEAttack(this, 30, MainSecondary); - //} else { - // if(auto_attack_target && auto_attack_target->GetHP() > -10) - Attack(auto_attack_target, MainSecondary); // Single attack with offhand - //} - } + DoAttackRounds(auto_attack_target, MainSecondary); } } } diff --git a/zone/effects.cpp b/zone/effects.cpp index 55e56cdac..68e68e78d 100644 --- a/zone/effects.cpp +++ b/zone/effects.cpp @@ -878,7 +878,7 @@ void EntityList::AEBardPulse(Mob *caster, Mob *center, uint16 spell_id, bool aff caster->CastToClient()->CheckSongSkillIncrease(spell_id); } -//Dook- Rampage and stuff for clients. +// Rampage and stuff for clients. Normal and Duration rampages //NPCs handle it differently in Mob::Rampage void EntityList::AEAttack(Mob *attacker, float dist, int Hand, int count, bool IsFromSpell) { //Dook- Will need tweaking, currently no pets or players or horses @@ -896,7 +896,10 @@ void EntityList::AEAttack(Mob *attacker, float dist, int Hand, int count, bool I && curmob->GetRace() != 216 && curmob->GetRace() != 472 /* dont attack horses */ && (DistanceSquared(curmob->GetPosition(), attacker->GetPosition()) <= dist2) ) { - attacker->Attack(curmob, Hand, false, false, IsFromSpell); + if (!attacker->IsClient() || attacker->GetClass() == MONK || attacker->GetClass() == RANGER) + attacker->Attack(curmob, Hand, false, false, IsFromSpell); + else + attacker->CastToClient()->DoAttackRounds(curmob, Hand, IsFromSpell); hit++; if (count != 0 && hit >= count) return; diff --git a/zone/mob.h b/zone/mob.h index 8352d764e..c9ba4471d 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -971,6 +971,7 @@ public: void CalcAABonuses(StatBonuses* newbon); void ApplyAABonuses(const AA::Rank &rank, StatBonuses* newbon); void GrantAlternateAdvancementAbility(int aa_id, int points); + bool CheckAATimer(int timer); protected: void CommonDamage(Mob* other, int32 &damage, const uint16 spell_id, const SkillUseTypes attack_skill, bool &avoidable, const int8 buffslot, const bool iBuffTic); diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 3c0c8fad4..5c30185aa 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -638,42 +638,23 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove snprintf(effect_desc, _EDLEN, "Group Fear Immunity"); #endif //Added client messages to give some indication this effect is active. - uint32 group_id_caster = 0; - uint32 time = spell.base[i]*10; - if(caster->IsClient()) - { - if(caster->IsGrouped()) - { - group_id_caster = GetGroup()->GetID(); - } - else if(caster->IsRaidGrouped()) - { - group_id_caster = (GetRaid()->GetGroup(CastToClient()) == 0xFFFF) ? 0 : (GetRaid()->GetGroup(CastToClient()) + 1); + // Is there a message generated? Too disgusted by raids. + uint32 time = spell.base[i] * 10 * 1000; + if (caster->IsClient()) { + if (caster->IsGrouped()) { + auto group = caster->GetGroup(); + for (int i = 0; i < 6; ++i) + if (group->members[i]) + group->members[i]->aa_timers[aaTimerWarcry].Start(time); + } else if (caster->IsRaidGrouped()) { + auto raid = caster->GetRaid(); + uint32 gid = raid->GetGroup(caster->CastToClient()); + if (gid < 12) + for (int i = 0; i < MAX_RAID_MEMBERS; ++i) + if (raid->members[i].member && raid->members[i].GroupNumber == gid) + raid->members[i].member->aa_timers[aaTimerWarcry].Start(time); } } - //old aa - //if(group_id_caster){ - // Group *g = entity_list.GetGroupByID(group_id_caster); - // uint32 time = spell.base[i]*10; - // if(g){ - // for(int gi=0; gi < 6; gi++){ - // if(g->members[gi] && g->members[gi]->IsClient()) - // { - // g->members[gi]->CastToClient()->EnableAAEffect(aaEffectWarcry , time); - // if (g->members[gi]->GetID() != caster->GetID()) - // g->members[gi]->Message(13, "You hear the war cry."); - // else - // Message(13, "You let loose a fierce war cry."); - // } - // } - // } - //} - // - //else{ - // CastToClient()->EnableAAEffect(aaEffectWarcry , time); - // Message(13, "You let loose a fierce war cry."); - //} - break; } @@ -2238,9 +2219,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove #ifdef SPELL_EFFECT_SPAM snprintf(effect_desc, _EDLEN, "Duration Rampage"); #endif - //if (caster && caster->IsClient()) { // will tidy this up later so that NPCs can duration ramp from spells too - // CastToClient()->DurationRampage(effect_value*12); - //} + aa_timers[aaTimerRampage].Start(effect_value * 10 * 1000); // Live bug, was suppose to be 1 second per value break; } diff --git a/zone/spells.cpp b/zone/spells.cpp index 4f492c343..c3e777b5c 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -2280,7 +2280,7 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, uint16 slot, uint16 if(rank && rank->base_ability) { ExpendAlternateAdvancementCharge(rank->base_ability->id); } - } + } else if(spell_id == casting_spell_id && casting_spell_timer != 0xFFFFFFFF) { //aa new todo: aa expendable charges here @@ -4124,13 +4124,13 @@ bool Mob::IsImmuneToSpell(uint16 spell_id, Mob *caster) } return true; } - //else if (IsClient() && CastToClient()->CheckAAEffect(aaEffectWarcry)) //old aa - //{ - // Message(13, "Your are immune to fear."); - // Log.Out(Logs::Detail, Logs::Spells, "Clients has WarCry effect, immune to fear!"); - // caster->Message_StringID(MT_Shout, IMMUNE_FEAR); - // return true; - //} + else if (CheckAATimer(aaTimerWarcry)) + { + Message(13, "Your are immune to fear."); + Log.Out(Logs::Detail, Logs::Spells, "Clients has WarCry effect, immune to fear!"); + caster->Message_StringID(MT_Shout, IMMUNE_FEAR); + return true; + } } if(IsCharmSpell(spell_id)) From c0ea82f9e108a43c6bede64a6c5a05bf46917e08 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 21 Jun 2015 02:58:43 -0400 Subject: [PATCH 33/90] SE_MeleeVulnerability really really is Max Mana limit Also found the cause of bard song tick increase and removed the uneeded code Also removed the IsBardSong check from GetFocusEffect, it really shouldn't be needed, but will need to keep an eye out. The focus effects should most often limit out the bard songs anyways --- common/spdat.h | 2 +- zone/bonuses.cpp | 14 -------------- zone/common.h | 1 - zone/effects.cpp | 6 ------ zone/mob.cpp | 3 --- zone/spell_effects.cpp | 21 ++++++++++++++------- 6 files changed, 15 insertions(+), 32 deletions(-) diff --git a/common/spdat.h b/common/spdat.h index c8e039f15..938b659e1 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -544,7 +544,7 @@ typedef enum { //#define SE_SummonCorpseZone 388 // *not implemented - summons a corpse from any zone(nec AA) #define SE_FcTimerRefresh 389 // implemented - Refresh spell icons //#define SE_FcTimerLockout 390 // *not implemented - Sets recast timers to specific value, focus limited. -#define SE_MeleeVulnerability 391 // implemented [Live SPA has this as LimitManaMax however that is clearly not the effect used] +#define SE_LimitManaMax 391 // implemented #define SE_FcHealAmt 392 // implemented - Adds or removes healing from spells #define SE_FcHealPctIncoming 393 // implemented - HealRate with focus restrictions. #define SE_FcHealAmtIncoming 394 // implemented - Adds/Removes amount of healing on target by X value with foucs restrictions. diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index e90f9626a..7ff8e7fc7 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -1333,10 +1333,6 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) newbon->PetMeleeMitigation += base1; break; - case SE_MeleeVulnerability: - newbon->MeleeVulnerability += base1; - break; - case SE_FactionModPct: { if ((base1 < 0) && (newbon->FactionModPct > base1)) newbon->FactionModPct = base1; @@ -3008,10 +3004,6 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne new_bonus->PetMeleeMitigation += effect_value; break; - case SE_MeleeVulnerability: - new_bonus->MeleeVulnerability += effect_value; - break; - case SE_Sanctuary: new_bonus->Sanctuary = true; break; @@ -4588,12 +4580,6 @@ void Mob::NegateSpellsBonuses(uint16 spell_id) aabonuses.FactionModPct = effect_value; break; - case SE_MeleeVulnerability: - spellbonuses.MeleeVulnerability = effect_value; - itembonuses.MeleeVulnerability = effect_value; - aabonuses.MeleeVulnerability = effect_value; - break; - case SE_IllusionPersistence: spellbonuses.IllusionPersistence = false; itembonuses.IllusionPersistence = false; diff --git a/zone/common.h b/zone/common.h index d21a0039d..e9521cb94 100644 --- a/zone/common.h +++ b/zone/common.h @@ -400,7 +400,6 @@ struct StatBonuses { int32 Metabolism; // Food/drink consumption rates. bool Sanctuary; // Sanctuary effect, lowers place on hate list until cast on others. int32 FactionModPct; // Modifies amount of faction gained. - int32 MeleeVulnerability; // Weakness/mitigation to melee damage bool LimitToSkill[HIGHEST_SKILL+2]; // Determines if we need to search for a skill proc. uint32 SkillProc[MAX_SKILL_PROCS]; // Max number of spells containing skill_procs. uint32 SkillProcSuccess[MAX_SKILL_PROCS]; // Max number of spells containing skill_procs_success. diff --git a/zone/effects.cpp b/zone/effects.cpp index 68e68e78d..85a858c94 100644 --- a/zone/effects.cpp +++ b/zone/effects.cpp @@ -421,12 +421,6 @@ int32 Mob::GetActSpellDuration(uint16 spell_id, int32 duration) int tic_inc = 0; tic_inc = GetFocusEffect(focusSpellDurByTic, spell_id); - // unsure on the exact details, but bard songs that don't cost mana at some point get an extra tick, 60 for now - // a level 53 bard reported getting 2 tics - // bard DOTs do get this extra tick, but beneficial long bard songs don't? (invul, crescendo) - if ((IsShortDurationBuff(spell_id) || IsDetrimentalSpell(spell_id)) && IsBardSong(spell_id) && - spells[spell_id].mana == 0 && GetClass() == BARD && GetLevel() > 60) - tic_inc++; float focused = ((duration * increase) / 100.0f) + tic_inc; int ifocused = static_cast(focused); diff --git a/zone/mob.cpp b/zone/mob.cpp index 4eb87f7ad..1777bb7a3 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -3769,11 +3769,8 @@ int16 Mob::GetSkillDmgTaken(const SkillUseTypes skill_used) skilldmg_mod += itembonuses.SkillDmgTaken[HIGHEST_SKILL+1] + spellbonuses.SkillDmgTaken[HIGHEST_SKILL+1] + itembonuses.SkillDmgTaken[skill_used] + spellbonuses.SkillDmgTaken[skill_used]; - skilldmg_mod += SkillDmgTaken_Mod[skill_used] + SkillDmgTaken_Mod[HIGHEST_SKILL+1]; - skilldmg_mod += spellbonuses.MeleeVulnerability + itembonuses.MeleeVulnerability + aabonuses.MeleeVulnerability; - if(skilldmg_mod < -100) skilldmg_mod = -100; diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 5c30185aa..71740e589 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -2948,7 +2948,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove case SE_FcIncreaseNumHits: case SE_CastonFocusEffect: case SE_FcHealAmtIncoming: - case SE_MeleeVulnerability: + case SE_LimitManaMax: case SE_DoubleRangedAttack: case SE_ShieldEquipHateMod: case SE_ShieldEquipDmgMod: @@ -3356,7 +3356,7 @@ void Mob::BuffProcess() { --buffs[buffs_i].ticsremaining; - if ((buffs[buffs_i].ticsremaining == 0 && !IsShortDurationBuff(buffs[buffs_i].spellid)) || buffs[buffs_i].ticsremaining < 0) { + if ((buffs[buffs_i].ticsremaining == 0 && !(IsShortDurationBuff(buffs[buffs_i].spellid) || IsBardSong(buffs[buffs_i].spellid))) || buffs[buffs_i].ticsremaining < 0) { Log.Out(Logs::Detail, Logs::Spells, "Buff %d in slot %d has expired. Fading.", buffs[buffs_i].spellid, buffs_i); BuffFadeBySlot(buffs_i); } @@ -4301,6 +4301,11 @@ int16 Client::CalcAAFocus(focusType type, const AA::Rank &rank, uint16 spell_id) LimitFailure = true; break; + case SE_LimitManaMax: + if (spell.mana > base1) + LimitFailure = true; + break; + case SE_LimitTarget: if (base1 < 0) { if (-base1 == spell.targettype) // Exclude @@ -4719,6 +4724,11 @@ int16 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo return 0; break; + case SE_LimitManaMax: + if (spell.mana > focus_spell.base[i]) + return 0; + break; + case SE_LimitTarget: if (focus_spell.base[i] < 0) { if (-focus_spell.base[i] == spell.targettype) // Exclude @@ -5178,11 +5188,8 @@ uint16 Client::GetSympatheticFocusEffect(focusType type, uint16 spell_id) { return 0; } -int16 Client::GetFocusEffect(focusType type, uint16 spell_id) { - - if (IsBardSong(spell_id) && type != focusFcBaseEffects) - return 0; - +int16 Client::GetFocusEffect(focusType type, uint16 spell_id) +{ int16 realTotal = 0; int16 realTotal2 = 0; int16 realTotal3 = 0; From 77f050b653e77ea1cde5b3aea90f1f4513f77186 Mon Sep 17 00:00:00 2001 From: KimLS Date: Sun, 21 Jun 2015 01:25:34 -0700 Subject: [PATCH 34/90] setaapts command will now let you have up to 5k AA points, from 200. Removed the need to specify a prev_id in alternate_abilities table it can deduce that by itself. --- zone/aa.cpp | 21 ++++++++++++--------- zone/command.cpp | 4 ++-- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index 0c31034c7..974ccef13 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1520,7 +1520,9 @@ void Zone::LoadAlternateAdvancement() { //process these ranks AA::Rank *current = ability.second->first; int i = 1; + int prev_id = -1; while(current) { + current->prev_id = prev_id; current->prev = GetAlternateAdvancementRank(current->prev_id); current->next = GetAlternateAdvancementRank(current->next_id); current->base_ability = ability.second.get(); @@ -1531,11 +1533,11 @@ void Zone::LoadAlternateAdvancement() { //check prereqs here for(auto &prev_prereq : current->prev->prereqs) { - // //if prev has an aa we dont have set - // // then set it here too - // //if prev has an aa we have and the count is different - // // then set to whichever is highest - // + //if prev has an aa we dont have set + // then set it here too + //if prev has an aa we have + // then set to whichever is highest + auto iter = current->prereqs.find(prev_prereq.first); if(iter == current->prereqs.end()) { //not found @@ -1557,6 +1559,7 @@ void Zone::LoadAlternateAdvancement() { } i++; + prev_id = current->id; current = current->next; } } @@ -1602,7 +1605,7 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_mapspell = atoi(row[7]); rank->spell_type = atoi(row[8]); rank->recast_time = atoi(row[9]); - rank->prev_id = atoi(row[10]); - rank->next_id = atoi(row[11]); - rank->expansion = atoi(row[12]); + rank->next_id = atoi(row[10]); + rank->expansion = atoi(row[11]); rank->base_ability = nullptr; rank->total_cost = 0; + rank->prev_id = -1; rank->next = nullptr; rank->prev = nullptr; diff --git a/zone/command.cpp b/zone/command.cpp index 59f4bfa8a..7114244b3 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -5554,8 +5554,8 @@ void command_setaapts(Client *c, const Seperator *sep) if(sep->arg[1][0] == '\0' || sep->arg[2][0] == '\0') c->Message(0, "Usage: #setaapts "); - else if(atoi(sep->arg[2]) <= 0 || atoi(sep->arg[2]) > 200) - c->Message(0, "You must have a number greater than 0 for points and no more than 200."); + else if(atoi(sep->arg[2]) <= 0 || atoi(sep->arg[2]) > 5000) + c->Message(0, "You must have a number greater than 0 for points and no more than 5000."); else if(!strcasecmp(sep->arg[1], "group")) { t->GetPP().group_leadership_points = atoi(sep->arg[2]); t->GetPP().group_leadership_exp = 0; From fd989cdbc84447a026d084e99ac258f0f2eea477 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Mon, 22 Jun 2015 00:08:21 -0400 Subject: [PATCH 35/90] Add back in the bard song focus check But also allowed focusSpellDuration through for that AA --- zone/spell_effects.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 71740e589..9134e8ff7 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -5190,6 +5190,9 @@ uint16 Client::GetSympatheticFocusEffect(focusType type, uint16 spell_id) { int16 Client::GetFocusEffect(focusType type, uint16 spell_id) { + if (IsBardSong(spell_id) && type != focusFcBaseEffects && type != focusSpellDuration) + return 0; + int16 realTotal = 0; int16 realTotal2 = 0; int16 realTotal3 = 0; From ce5e185738a4d0f643a7a925c4f9654746951e2a Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 23 Jun 2015 00:36:43 -0700 Subject: [PATCH 36/90] Reworked how grant aa works --- zone/aa.cpp | 86 ++++++++++++++++++++------------------------ zone/client.cpp | 4 --- zone/client.h | 3 ++ zone/lua_client.cpp | 6 ++++ zone/lua_client.h | 1 + zone/lua_mob.cpp | 6 ---- zone/lua_mob.h | 1 - zone/mob.h | 3 +- zone/perl_client.cpp | 29 +++++++++++++++ zone/perl_mob.cpp | 26 -------------- 10 files changed, 78 insertions(+), 87 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index 5cbb5da14..8a4df6293 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -902,7 +902,7 @@ void Client::SendAlternateAdvancementPoints() { AA::Rank *rank = aa.second->GetRankByPointsSpent(ranks); if(rank) { aa2->aa_list[i].AA = rank->id; - aa2->aa_list[i].value = ranks; + aa2->aa_list[i].value = rank->total_cost; aa2->aa_list[i].charges = charges; i++; } @@ -993,10 +993,37 @@ void Client::PurchaseAlternateAdvancementRank(int rank_id) { return; } - if(!CanPurchaseAlternateAdvancementRank(rank, true)) { + if(!CanPurchaseAlternateAdvancementRank(rank, true, true)) { return; } + FinishAlternateAdvancementPurchase(rank); +} + +bool Client::GrantAlternateAdvancementAbility(int aa_id, int points) { + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa_id, points); + auto ability = ability_rank.first; + auto rank = ability_rank.second; + + if(!rank) { + return false; + } + + if(!rank->base_ability) { + return false; + } + + if(!CanPurchaseAlternateAdvancementRank(rank, true, false)) { + return false; + } + + FinishAlternateAdvancementPurchase(rank); + return true; +} + +void Client::FinishAlternateAdvancementPurchase(AA::Rank *rank) { + int rank_id = rank->base_ability->first_rank_id; + if(rank->base_ability->charges > 0) { uint32 charges = 0; GetAA(rank_id, &charges); @@ -1006,7 +1033,8 @@ void Client::PurchaseAlternateAdvancementRank(int rank_id) { } SetAA(rank_id, rank->current_value, rank->base_ability->charges); - } else { + } + else { SetAA(rank_id, rank->current_value, 0); //if not max then send next aa @@ -1029,17 +1057,18 @@ void Client::PurchaseAlternateAdvancementRank(int rank_id) { std::to_string(AA_POINTS).c_str()); /* QS: Player_Log_AA_Purchases */ - if (RuleB(QueryServ, PlayerLogAAPurchases)){ + if(RuleB(QueryServ, PlayerLogAAPurchases)){ std::string event_desc = StringFormat("Ranked AA Purchase :: aa_id:%i at cost:%i in zoneid:%i instid:%i", rank->id, rank->cost, GetZoneID(), GetInstanceID()); QServ->PlayerLogEvent(Player_Log_AA_Purchases, CharacterID(), event_desc); } - } else { + } + else { Message_StringID(15, AA_GAIN_ABILITY, std::to_string(rank->title_sid).c_str(), std::to_string(rank->cost).c_str(), std::to_string(AA_POINTS).c_str()); /* QS: Player_Log_AA_Purchases */ - if (RuleB(QueryServ, PlayerLogAAPurchases)){ + if(RuleB(QueryServ, PlayerLogAAPurchases)){ std::string event_desc = StringFormat("Initial AA Purchase :: aa_id:%i at cost:%i in zoneid:%i instid:%i", rank->id, rank->cost, GetZoneID(), GetInstanceID()); QServ->PlayerLogEvent(Player_Log_AA_Purchases, CharacterID(), event_desc); } @@ -1061,7 +1090,7 @@ void Client::IncrementAlternateAdvancementRank(int rank_id) { return; } - if(!CanPurchaseAlternateAdvancementRank(rank, false)) { + if(!CanPurchaseAlternateAdvancementRank(rank, false, true)) { return; } @@ -1443,7 +1472,7 @@ bool Mob::CanUseAlternateAdvancementRank(AA::Rank *rank) { return true; } -bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price) { +bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price, bool check_grant) { AA::Ability *ability = rank->base_ability; if(!ability) @@ -1454,7 +1483,7 @@ bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price) } //You can't purchase grant only AAs they can only be assigned - if(ability->grant_only) { + if(check_grant && ability->grant_only) { return false; } @@ -1692,45 +1721,6 @@ bool ZoneDatabase::LoadAlternateAdvancementAbilities(std::unordered_mapGetAlternateAdvancementAbilityAndRank(aa_id, points); - auto ability = ability_rank.first; - auto rank = ability_rank.second; - - if(!ability) { - return; - } - - if(ability->charges > 0) { - return; - } - - if(!ability->grant_only) { - return; - } - - if(!CanUseAlternateAdvancementRank(rank)) { - return; - } - - SetAA(ability->first_rank_id, rank->current_value, 0); - - if(IsClient()) { - Client *c = CastToClient(); - - if(rank->next) { - c->SendAlternateAdvancementRank(rank->base_ability->id, rank->next->current_value); - } - - c->SendAlternateAdvancementPoints(); - c->SendAlternateAdvancementStats(); - c->CalcBonuses(); - } -} - bool Mob::CheckAATimer(int timer) { if (timer >= aaTimerMax) diff --git a/zone/client.cpp b/zone/client.cpp index ae0ceedff..240902d09 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -532,10 +532,6 @@ bool Client::SaveAA() { if(!ability) continue; - if(ability->grant_only) { - continue; - } - if(rank.second.first > 0) { AA::Rank *r = ability->GetRankByPointsSpent(rank.second.first); diff --git a/zone/client.h b/zone/client.h index 44e86f971..8b0522162 100644 --- a/zone/client.h +++ b/zone/client.h @@ -763,6 +763,7 @@ public: void SendAlternateAdvancementTable(); void SendAlternateAdvancementStats(); void PurchaseAlternateAdvancementRank(int rank_id); + bool GrantAlternateAdvancementAbility(int aa_id, int points); void IncrementAlternateAdvancementRank(int rank_id); void ActivateAlternateAdvancementAbility(int rank_id, int target_id); void SendAlternateAdvancementPoints(); @@ -1262,6 +1263,8 @@ protected: int16 GetFocusEffect(focusType type, uint16 spell_id); uint16 GetSympatheticFocusEffect(focusType type, uint16 spell_id); + void FinishAlternateAdvancementPurchase(AA::Rank *rank); + Mob* bind_sight_target; glm::vec4 m_AutoAttackPosition; diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index 37f379a06..8f2106b04 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -1027,6 +1027,11 @@ void Lua_Client::IncrementAA(int aa) { self->IncrementAlternateAdvancementRank(aa); } +bool Lua_Client::GrantAlternateAdvancementAbility(int aa_id, int points) { + Lua_Safe_Call_Bool(); + self->GrantAlternateAdvancementAbility(aa_id, points); +} + void Lua_Client::MarkSingleCompassLoc(float in_x, float in_y, float in_z) { Lua_Safe_Call_Void(); self->MarkSingleCompassLoc(in_x, in_y, in_z); @@ -1500,6 +1505,7 @@ luabind::scope lua_register_client() { .def("AddLevelBasedExp", (void(Lua_Client::*)(int))&Lua_Client::AddLevelBasedExp) .def("AddLevelBasedExp", (void(Lua_Client::*)(int,int))&Lua_Client::AddLevelBasedExp) .def("IncrementAA", (void(Lua_Client::*)(int))&Lua_Client::IncrementAA) + .def("GrantAlternateAdvancementAbility", (bool(Lua_Client::*)(int, int))&Lua_Client::GrantAlternateAdvancementAbility) .def("MarkSingleCompassLoc", (void(Lua_Client::*)(float,float,float))&Lua_Client::MarkSingleCompassLoc) .def("MarkSingleCompassLoc", (void(Lua_Client::*)(float,float,float,int))&Lua_Client::MarkSingleCompassLoc) .def("GetNextAvailableSpellBookSlot", (int(Lua_Client::*)(void))&Lua_Client::GetNextAvailableSpellBookSlot) diff --git a/zone/lua_client.h b/zone/lua_client.h index 8f930fc26..a20f4fb57 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -233,6 +233,7 @@ public: void AddLevelBasedExp(int exp_pct); void AddLevelBasedExp(int exp_pct, int max_level); void IncrementAA(int aa); + bool GrantAlternateAdvancementAbility(int aa_id, int points); void MarkSingleCompassLoc(float in_x, float in_y, float in_z); void MarkSingleCompassLoc(float in_x, float in_y, float in_z, int count); int GetNextAvailableSpellBookSlot(); diff --git a/zone/lua_mob.cpp b/zone/lua_mob.cpp index 31719d364..9662d1931 100644 --- a/zone/lua_mob.cpp +++ b/zone/lua_mob.cpp @@ -1210,11 +1210,6 @@ bool Lua_Mob::SetAA(int rank_id, int new_value, int charges) { return self->SetAA(rank_id, new_value, charges); } -void Lua_Mob::GrantAlternateAdvancementAbility(int aa_id, int points) { - Lua_Safe_Call_Void(); - self->GrantAlternateAdvancementAbility(aa_id, points); -} - bool Lua_Mob::DivineAura() { Lua_Safe_Call_Bool(); return self->DivineAura(); @@ -2097,7 +2092,6 @@ luabind::scope lua_register_mob() { .def("GetAAByAAID", (int(Lua_Mob::*)(int))&Lua_Mob::GetAAByAAID) .def("SetAA", (bool(Lua_Mob::*)(int,int))&Lua_Mob::SetAA) .def("SetAA", (bool(Lua_Mob::*)(int,int,int))&Lua_Mob::SetAA) - .def("GrantAlternateAdvancementAbility", (void(Lua_Mob::*)(int, int))&Lua_Mob::GrantAlternateAdvancementAbility) .def("DivineAura", (bool(Lua_Mob::*)(void))&Lua_Mob::DivineAura) .def("SetOOCRegen", (void(Lua_Mob::*)(int))&Lua_Mob::SetOOCRegen) .def("GetEntityVariable", (const char*(Lua_Mob::*)(const char*))&Lua_Mob::GetEntityVariable) diff --git a/zone/lua_mob.h b/zone/lua_mob.h index 914f46c5d..4f427aca5 100644 --- a/zone/lua_mob.h +++ b/zone/lua_mob.h @@ -252,7 +252,6 @@ public: int GetAAByAAID(int id); bool SetAA(int rank_id, int new_value); bool SetAA(int rank_id, int new_value, int charges); - void GrantAlternateAdvancementAbility(int aa_id, int points); bool DivineAura(); void SetOOCRegen(int regen); const char* GetEntityVariable(const char *name); diff --git a/zone/mob.h b/zone/mob.h index c9ba4471d..60a40711b 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -965,12 +965,11 @@ public: bool SetAA(uint32 rank_id, uint32 new_value, uint32 charges = 0); void ClearAAs() { aa_ranks.clear(); } bool CanUseAlternateAdvancementRank(AA::Rank *rank); - bool CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price); + bool CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price, bool check_grant); int GetAlternateAdvancementCooldownReduction(AA::Rank *rank_in); void ExpendAlternateAdvancementCharge(uint32 aa_id); void CalcAABonuses(StatBonuses* newbon); void ApplyAABonuses(const AA::Rank &rank, StatBonuses* newbon); - void GrantAlternateAdvancementAbility(int aa_id, int points); bool CheckAATimer(int timer); protected: diff --git a/zone/perl_client.cpp b/zone/perl_client.cpp index eea9918cd..c836e378e 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -4894,6 +4894,34 @@ XS(XS_Client_IncrementAA) XSRETURN_EMPTY; } +XS(XS_Client_GrantAlternateAdvancementAbility); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_GrantAlternateAdvancementAbility) +{ + dXSARGS; + if(items != 3) + Perl_croak(aTHX_ "Usage: Client::GrantAlternateAdvancementAbility(THIS, aa_id, points)"); + { + Client * THIS; + bool RETVAL; + int aa_id = (int)SvIV(ST(1)); + int points = (int)SvIV(ST(2)); + + if(sv_derived_from(ST(0), "Client")) { + IV tmp = SvIV((SV*)SvRV(ST(0))); + THIS = INT2PTR(Client *, tmp); + } + else + Perl_croak(aTHX_ "THIS is not of type Client"); + if(THIS == nullptr) + Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); + + RETVAL = THIS->GrantAlternateAdvancementAbility(aa_id, points); + ST(0) = boolSV(RETVAL); + sv_2mortal(ST(0)); + } + XSRETURN(1); +} + XS(XS_Client_GetAALevel); XS(XS_Client_GetAALevel) { @@ -6437,6 +6465,7 @@ XS(boot_Client) newXSproto(strcpy(buf, "GetIP"), XS_Client_GetIP, file, "$"); newXSproto(strcpy(buf, "AddLevelBasedExp"), XS_Client_AddLevelBasedExp, file, "$$;$"); newXSproto(strcpy(buf, "IncrementAA"), XS_Client_IncrementAA, file, "$$"); + newXSproto(strcpy(buf, "GrantAlternateAdvancementAbility"), XS_Client_GrantAlternateAdvancementAbility, file, "$$$"); newXSproto(strcpy(buf, "GetAALevel"), XS_Client_GetAALevel, file, "$$"); newXSproto(strcpy(buf, "MarkCompassLoc"), XS_Client_MarkCompassLoc, file, "$$$$"); newXSproto(strcpy(buf, "ClearCompassMark"), XS_Client_ClearCompassMark, file, "$"); diff --git a/zone/perl_mob.cpp b/zone/perl_mob.cpp index 612d9f868..dcd999a3e 100644 --- a/zone/perl_mob.cpp +++ b/zone/perl_mob.cpp @@ -6438,31 +6438,6 @@ XS(XS_Mob_SetAA) XSRETURN(1); } -XS(XS_Mob_GrantAlternateAdvancementAbility); /* prototype to pass -Wmissing-prototypes */ -XS(XS_Mob_GrantAlternateAdvancementAbility) -{ - dXSARGS; - if(items != 3) - Perl_croak(aTHX_ "Usage: Mob::GrantAlternateAdvancementAbility(THIS, aa_id, points)"); - { - Mob * THIS; - int aa_id = (int)SvIV(ST(1)); - int points = (int)SvIV(ST(2)); - - 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 == nullptr) - Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - - THIS->GrantAlternateAdvancementAbility(aa_id, points); - } - XSRETURN_EMPTY; -} - XS(XS_Mob_DivineAura); /* prototype to pass -Wmissing-prototypes */ XS(XS_Mob_DivineAura) { @@ -8708,7 +8683,6 @@ XS(boot_Mob) newXSproto(strcpy(buf, "GetAA"), XS_Mob_GetAA, file, "$$"); newXSproto(strcpy(buf, "GetAAByAAID"), XS_Mob_GetAAByAAID, file, "$$"); newXSproto(strcpy(buf, "SetAA"), XS_Mob_SetAA, file, "$$$;$"); - newXSproto(strcpy(buf, "GrantAlternateAdvancementAbility"), XS_Mob_GrantAlternateAdvancementAbility, file, "$$$"); newXSproto(strcpy(buf, "DivineAura"), XS_Mob_DivineAura, file, "$"); newXSproto(strcpy(buf, "AddFeignMemory"), XS_Mob_AddFeignMemory, file, "$$"); newXSproto(strcpy(buf, "RemoveFromFeignMemory"), XS_Mob_RemoveFromFeignMemory, file, "$$"); From a41570677f698805c0d86cc525bcbea73db05dc4 Mon Sep 17 00:00:00 2001 From: KimLS Date: Tue, 23 Jun 2015 12:53:46 -0700 Subject: [PATCH 37/90] More work on Granting, incrementaa now uses grant internally which should make it work more consistently with its old behavior --- zone/aa.cpp | 130 +++++++++++++++++-------------------------- zone/client.h | 4 +- zone/lua_client.cpp | 6 ++ zone/lua_client.h | 1 + zone/perl_client.cpp | 13 +++-- 5 files changed, 70 insertions(+), 84 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index 8a4df6293..c97ff7af4 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -762,6 +762,10 @@ void Client::RefundAA() { continue; } + if(ability->grant_only) { + continue; + } + refunded += rank->total_cost; } @@ -997,31 +1001,36 @@ void Client::PurchaseAlternateAdvancementRank(int rank_id) { return; } - FinishAlternateAdvancementPurchase(rank); + FinishAlternateAdvancementPurchase(rank, false); } -bool Client::GrantAlternateAdvancementAbility(int aa_id, int points) { - auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa_id, points); - auto ability = ability_rank.first; - auto rank = ability_rank.second; +bool Client::GrantAlternateAdvancementAbility(int aa_id, int points, bool ignore_cost) { + bool ret = false; + for(int i = 1; i <= points; ++i) { + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(aa_id, i); + auto ability = ability_rank.first; + auto rank = ability_rank.second; - if(!rank) { - return false; + if(!rank) { + continue; + } + + if(!rank->base_ability) { + continue; + } + + if(!CanPurchaseAlternateAdvancementRank(rank, !ignore_cost, false)) { + continue; + } + + ret = true; + FinishAlternateAdvancementPurchase(rank, ignore_cost); } - if(!rank->base_ability) { - return false; - } - - if(!CanPurchaseAlternateAdvancementRank(rank, true, false)) { - return false; - } - - FinishAlternateAdvancementPurchase(rank); - return true; + return ret; } -void Client::FinishAlternateAdvancementPurchase(AA::Rank *rank) { +void Client::FinishAlternateAdvancementPurchase(AA::Rank *rank, bool ignore_cost) { int rank_id = rank->base_ability->first_rank_id; if(rank->base_ability->charges > 0) { @@ -1043,7 +1052,9 @@ void Client::FinishAlternateAdvancementPurchase(AA::Rank *rank) { } } - m_pp.aapoints -= rank->cost; + int cost = !ignore_cost ? rank->cost : 0; + + m_pp.aapoints -= cost ; SaveAA(); SendAlternateAdvancementPoints(); @@ -1053,30 +1064,33 @@ void Client::FinishAlternateAdvancementPurchase(AA::Rank *rank) { Message_StringID(15, AA_IMPROVE, std::to_string(rank->title_sid).c_str(), std::to_string(rank->prev->current_value).c_str(), - std::to_string(rank->cost).c_str(), - std::to_string(AA_POINTS).c_str()); + std::to_string(cost).c_str(), + cost == 1 ? std::to_string(AA_POINT).c_str() : std::to_string(AA_POINTS).c_str()); /* QS: Player_Log_AA_Purchases */ - if(RuleB(QueryServ, PlayerLogAAPurchases)){ - std::string event_desc = StringFormat("Ranked AA Purchase :: aa_id:%i at cost:%i in zoneid:%i instid:%i", rank->id, rank->cost, GetZoneID(), GetInstanceID()); + if(RuleB(QueryServ, PlayerLogAAPurchases)) { + std::string event_desc = StringFormat("Ranked AA Purchase :: aa_id:%i at cost:%i in zoneid:%i instid:%i", rank->id, cost, GetZoneID(), GetInstanceID()); QServ->PlayerLogEvent(Player_Log_AA_Purchases, CharacterID(), event_desc); } } else { Message_StringID(15, AA_GAIN_ABILITY, std::to_string(rank->title_sid).c_str(), - std::to_string(rank->cost).c_str(), - std::to_string(AA_POINTS).c_str()); + std::to_string(cost).c_str(), + cost == 1 ? std::to_string(AA_POINT).c_str() : std::to_string(AA_POINTS).c_str()); /* QS: Player_Log_AA_Purchases */ - if(RuleB(QueryServ, PlayerLogAAPurchases)){ - std::string event_desc = StringFormat("Initial AA Purchase :: aa_id:%i at cost:%i in zoneid:%i instid:%i", rank->id, rank->cost, GetZoneID(), GetInstanceID()); + if(RuleB(QueryServ, PlayerLogAAPurchases)) { + std::string event_desc = StringFormat("Initial AA Purchase :: aa_id:%i at cost:%i in zoneid:%i instid:%i", rank->id, cost, GetZoneID(), GetInstanceID()); QServ->PlayerLogEvent(Player_Log_AA_Purchases, CharacterID(), event_desc); } } CalcBonuses(); - if(title_manager.IsNewAATitleAvailable(m_pp.aapoints_spent, GetBaseClass())) - NotifyNewTitlesAvailable(); + + if(cost > 0) { + if(title_manager.IsNewAATitleAvailable(m_pp.aapoints_spent, GetBaseClass())) + NotifyNewTitlesAvailable(); + } } //need to rewrite this @@ -1090,54 +1104,8 @@ void Client::IncrementAlternateAdvancementRank(int rank_id) { return; } - if(!CanPurchaseAlternateAdvancementRank(rank, false, true)) { - return; - } - - if(rank->base_ability->charges > 0) { - SetAA(rank_id, rank->current_value, rank->base_ability->charges); - } - else { - SetAA(rank_id, rank->current_value, 0); - - //if not max then send next aa - if(rank->next) { - SendAlternateAdvancementRank(rank->base_ability->id, rank->next->current_value); - } - } - - SaveAA(); - - SendAlternateAdvancementPoints(); - SendAlternateAdvancementStats(); - - if(rank->prev) { - Message_StringID(15, AA_IMPROVE, - std::to_string(rank->title_sid).c_str(), - std::to_string(rank->prev->current_value).c_str(), - std::to_string(rank->cost).c_str(), - std::to_string(AA_POINTS).c_str()); - - /* QS: Player_Log_AA_Purchases */ - if (RuleB(QueryServ, PlayerLogAAPurchases)){ - std::string event_desc = StringFormat("Ranked AA Purchase :: aa_id:%i at cost:%i in zoneid:%i instid:%i", rank->id, rank->cost, GetZoneID(), GetInstanceID()); - QServ->PlayerLogEvent(Player_Log_AA_Purchases, CharacterID(), event_desc); - } - } - else { - Message_StringID(15, AA_GAIN_ABILITY, - std::to_string(rank->title_sid).c_str(), - std::to_string(rank->cost).c_str(), - std::to_string(AA_POINTS).c_str()); - - /* QS: Player_Log_AA_Purchases */ - if (RuleB(QueryServ, PlayerLogAAPurchases)){ - std::string event_desc = StringFormat("Initial AA Purchase :: aa_id:%i at cost:%i in zoneid:%i instid:%i", rank->id, rank->cost, GetZoneID(), GetInstanceID()); - QServ->PlayerLogEvent(Player_Log_AA_Purchases, this->CharacterID(), event_desc); - } - } - - CalcBonuses(); + int points = GetAA(rank_id); + GrantAlternateAdvancementAbility(rank->base_ability->id, points + 1, true); } void Client::ActivateAlternateAdvancementAbility(int rank_id, int target_id) { @@ -1496,12 +1464,18 @@ bool Mob::CanPurchaseAlternateAdvancementRank(AA::Rank *rank, bool check_price, auto points = GetAA(rank->id, ¤t_charges); //check that we are on previous rank already (if exists) - if(rank->prev) { + //grant ignores the req to own the previous rank. + if(check_grant && rank->prev) { if(points != rank->prev->current_value) { return false; } } + //check that we aren't already on this rank or one ahead of us + if(points >= rank->current_value) { + return false; + } + //if expendable only let us purchase if we have no charges already //not quite sure on how this functions client side atm //I intend to look into it later to make sure the behavior is right diff --git a/zone/client.h b/zone/client.h index 8b0522162..7ab3749e1 100644 --- a/zone/client.h +++ b/zone/client.h @@ -763,7 +763,7 @@ public: void SendAlternateAdvancementTable(); void SendAlternateAdvancementStats(); void PurchaseAlternateAdvancementRank(int rank_id); - bool GrantAlternateAdvancementAbility(int aa_id, int points); + bool GrantAlternateAdvancementAbility(int aa_id, int points, bool ignore_cost = false); void IncrementAlternateAdvancementRank(int rank_id); void ActivateAlternateAdvancementAbility(int rank_id, int target_id); void SendAlternateAdvancementPoints(); @@ -1263,7 +1263,7 @@ protected: int16 GetFocusEffect(focusType type, uint16 spell_id); uint16 GetSympatheticFocusEffect(focusType type, uint16 spell_id); - void FinishAlternateAdvancementPurchase(AA::Rank *rank); + void FinishAlternateAdvancementPurchase(AA::Rank *rank, bool ignore_cost); Mob* bind_sight_target; diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index 8f2106b04..0c5bf8cc1 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -1032,6 +1032,11 @@ bool Lua_Client::GrantAlternateAdvancementAbility(int aa_id, int points) { self->GrantAlternateAdvancementAbility(aa_id, points); } +bool Lua_Client::GrantAlternateAdvancementAbility(int aa_id, int points, bool ignore_cost) { + Lua_Safe_Call_Bool(); + self->GrantAlternateAdvancementAbility(aa_id, points, ignore_cost); +} + void Lua_Client::MarkSingleCompassLoc(float in_x, float in_y, float in_z) { Lua_Safe_Call_Void(); self->MarkSingleCompassLoc(in_x, in_y, in_z); @@ -1506,6 +1511,7 @@ luabind::scope lua_register_client() { .def("AddLevelBasedExp", (void(Lua_Client::*)(int,int))&Lua_Client::AddLevelBasedExp) .def("IncrementAA", (void(Lua_Client::*)(int))&Lua_Client::IncrementAA) .def("GrantAlternateAdvancementAbility", (bool(Lua_Client::*)(int, int))&Lua_Client::GrantAlternateAdvancementAbility) + .def("GrantAlternateAdvancementAbility", (bool(Lua_Client::*)(int, int, bool))&Lua_Client::GrantAlternateAdvancementAbility) .def("MarkSingleCompassLoc", (void(Lua_Client::*)(float,float,float))&Lua_Client::MarkSingleCompassLoc) .def("MarkSingleCompassLoc", (void(Lua_Client::*)(float,float,float,int))&Lua_Client::MarkSingleCompassLoc) .def("GetNextAvailableSpellBookSlot", (int(Lua_Client::*)(void))&Lua_Client::GetNextAvailableSpellBookSlot) diff --git a/zone/lua_client.h b/zone/lua_client.h index a20f4fb57..0639cd6da 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -234,6 +234,7 @@ public: void AddLevelBasedExp(int exp_pct, int max_level); void IncrementAA(int aa); bool GrantAlternateAdvancementAbility(int aa_id, int points); + bool GrantAlternateAdvancementAbility(int aa_id, int points, bool ignore_cost); void MarkSingleCompassLoc(float in_x, float in_y, float in_z); void MarkSingleCompassLoc(float in_x, float in_y, float in_z, int count); int GetNextAvailableSpellBookSlot(); diff --git a/zone/perl_client.cpp b/zone/perl_client.cpp index c836e378e..ee4ee943d 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -4898,13 +4898,14 @@ XS(XS_Client_GrantAlternateAdvancementAbility); /* prototype to pass -Wmissing-p XS(XS_Client_GrantAlternateAdvancementAbility) { dXSARGS; - if(items != 3) - Perl_croak(aTHX_ "Usage: Client::GrantAlternateAdvancementAbility(THIS, aa_id, points)"); + if(items < 3 || items > 4) + Perl_croak(aTHX_ "Usage: Client::GrantAlternateAdvancementAbility(THIS, aa_id, points, [ignore_cost])"); { Client * THIS; bool RETVAL; int aa_id = (int)SvIV(ST(1)); int points = (int)SvIV(ST(2)); + bool ignore_cost = false; if(sv_derived_from(ST(0), "Client")) { IV tmp = SvIV((SV*)SvRV(ST(0))); @@ -4915,7 +4916,11 @@ XS(XS_Client_GrantAlternateAdvancementAbility) if(THIS == nullptr) Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); - RETVAL = THIS->GrantAlternateAdvancementAbility(aa_id, points); + if(items > 3) { + ignore_cost = (bool)SvTRUE(ST(3)); + } + + RETVAL = THIS->GrantAlternateAdvancementAbility(aa_id, points, ignore_cost); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); } @@ -6465,7 +6470,7 @@ XS(boot_Client) newXSproto(strcpy(buf, "GetIP"), XS_Client_GetIP, file, "$"); newXSproto(strcpy(buf, "AddLevelBasedExp"), XS_Client_AddLevelBasedExp, file, "$$;$"); newXSproto(strcpy(buf, "IncrementAA"), XS_Client_IncrementAA, file, "$$"); - newXSproto(strcpy(buf, "GrantAlternateAdvancementAbility"), XS_Client_GrantAlternateAdvancementAbility, file, "$$$"); + newXSproto(strcpy(buf, "GrantAlternateAdvancementAbility"), XS_Client_GrantAlternateAdvancementAbility, file, "$$$;$"); newXSproto(strcpy(buf, "GetAALevel"), XS_Client_GetAALevel, file, "$$"); newXSproto(strcpy(buf, "MarkCompassLoc"), XS_Client_MarkCompassLoc, file, "$$$$"); newXSproto(strcpy(buf, "ClearCompassMark"), XS_Client_ClearCompassMark, file, "$"); From 8f156b3c91a2fef24b1ca7c86cd050784f83f7c3 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Tue, 23 Jun 2015 18:37:24 -0400 Subject: [PATCH 38/90] Add Client:GetAccountAge to Lua --- zone/client.h | 1 + zone/lua_client.cpp | 6 ++++++ zone/lua_client.h | 5 +++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/zone/client.h b/zone/client.h index 7ab3749e1..4298bcc46 100644 --- a/zone/client.h +++ b/zone/client.h @@ -622,6 +622,7 @@ public: inline uint32 AccountID() const { return account_id; } inline const char* AccountName()const { return account_name; } + inline int GetAccountCreation() const { return account_creation; } inline int16 Admin() const { return admin; } inline uint32 CharacterID() const { return character_id; } void UpdateAdmin(bool iFromDB = true); diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index 0c5bf8cc1..d69924577 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -350,6 +350,11 @@ const char *Lua_Client::AccountName() { return self->AccountName(); } +int Lua_Client::GetAccountAge() { + Lua_Safe_Call_Int(); + return time(nullptr) - self->GetAccountCreation(); +} + int Lua_Client::Admin() { Lua_Safe_Call_Bool(); return self->Admin(); @@ -1375,6 +1380,7 @@ luabind::scope lua_register_client() { .def("GetRawItemAC", (int(Lua_Client::*)(void))&Lua_Client::GetRawItemAC) .def("AccountID", (uint32(Lua_Client::*)(void))&Lua_Client::AccountID) .def("AccountName", (const char *(Lua_Client::*)(void))&Lua_Client::AccountName) + .def("GetAccountAge", (int(Lua_Client::*)(void))&Lua_Client::GetAccountAge) .def("Admin", (int(Lua_Client::*)(void))&Lua_Client::Admin) .def("CharacterID", (uint32(Lua_Client::*)(void))&Lua_Client::CharacterID) .def("GuildRank", (int(Lua_Client::*)(void))&Lua_Client::GuildRank) diff --git a/zone/lua_client.h b/zone/lua_client.h index 0639cd6da..dd1059a0a 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -166,9 +166,9 @@ public: void SummonItem(uint32 item_id, int charges, uint32 aug1, uint32 aug2, uint32 aug3); void SummonItem(uint32 item_id, int charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4); void SummonItem(uint32 item_id, int charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5); - void SummonItem(uint32 item_id, int charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, + void SummonItem(uint32 item_id, int charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, bool attuned); - void SummonItem(uint32 item_id, int charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, + void SummonItem(uint32 item_id, int charges, uint32 aug1, uint32 aug2, uint32 aug3, uint32 aug4, uint32 aug5, bool attuned, int to_slot); void SetStats(int type, int value); void IncStats(int type, int value); @@ -262,6 +262,7 @@ public: bool HasSpellScribed(int spell_id); void SetAccountFlag(std::string flag, std::string val); std::string GetAccountFlag(std::string flag); + int GetAccountAge(); Lua_Group GetGroup(); Lua_Raid GetRaid(); bool PutItemInInventory(int slot_id, Lua_ItemInst inst); From 31301e0a2603fa665a6659d8bbbf3e0b77a48273 Mon Sep 17 00:00:00 2001 From: KimLS Date: Wed, 24 Jun 2015 01:25:49 -0700 Subject: [PATCH 39/90] ResetAA should hopefully play better with granted AA points now --- zone/aa.cpp | 48 +++++++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index c97ff7af4..07adc2805 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -441,15 +441,26 @@ void Mob::WakeTheDead(uint16 spell_id, Mob *target, uint32 duration) } void Client::ResetAA() { + SendClearAA(); RefundAA(); - uint32 i; - for (i=0; i < MAX_PP_AA_ARRAY; i++) { - m_pp.aa_array[i].AA = 0; - m_pp.aa_array[i].value = 0; - m_pp.aa_array[i].charges= 0; - } - aa_ranks.clear(); + memset(&m_pp.aa_array[0], 0, sizeof(AA_Array) * MAX_PP_AA_ARRAY); + + int i = 0; + for(auto &rank_value : aa_ranks) { + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(rank_value.first, rank_value.second.first); + auto ability = ability_rank.first; + auto rank = ability_rank.second; + + if(!rank) { + continue; + } + + m_pp.aa_array[i].AA = rank_value.first; + m_pp.aa_array[i].value = rank_value.second.first; + m_pp.aa_array[i].charges = rank_value.second.second; + ++i; + } for(int i = 0; i < _maxLeaderAA; ++i) m_pp.leader_abilities.ranks[i] = 0; @@ -459,13 +470,7 @@ void Client::ResetAA() { m_pp.group_leadership_exp = 0; m_pp.raid_leadership_exp = 0; - database.DeleteCharacterAAs(CharacterID()); - SaveAA(); - SendClearAA(); - SendAlternateAdvancementTable(); - SendAlternateAdvancementPoints(); - SendAlternateAdvancementStats(); - database.DeleteCharacterLeadershipAAs(this->CharacterID()); + database.DeleteCharacterLeadershipAAs(CharacterID()); // undefined for these clients if (GetClientVersionBit() & BIT_TitaniumAndEarlier) Kick(); @@ -749,24 +754,29 @@ void Client::InspectBuffs(Client* Inspector, int Rank) void Client::RefundAA() { int refunded = 0; - for(auto &rank_value : aa_ranks) { - auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(rank_value.first, rank_value.second.first); + auto rank_value = aa_ranks.begin(); + while(rank_value != aa_ranks.end()) { + auto ability_rank = zone->GetAlternateAdvancementAbilityAndRank(rank_value->first, rank_value->second.first); auto ability = ability_rank.first; auto rank = ability_rank.second; if(!ability) { + ++rank_value; continue; } - if(ability->charges > 0 && rank_value.second.second < 1) { + if(ability->charges > 0 && rank_value->second.second < 1) { + ++rank_value; continue; } if(ability->grant_only) { + ++rank_value; continue; } refunded += rank->total_cost; + rank_value = aa_ranks.erase(rank_value); } if(refunded > 0) { @@ -774,6 +784,10 @@ void Client::RefundAA() { SaveAA(); Save(); } + + SendAlternateAdvancementTable(); + SendAlternateAdvancementPoints(); + SendAlternateAdvancementStats(); } AA_SwarmPetInfo::AA_SwarmPetInfo() From 476ee10ca02b6d4bfee8a4126f87e393d9e7c260 Mon Sep 17 00:00:00 2001 From: KimLS Date: Wed, 24 Jun 2015 20:02:11 -0700 Subject: [PATCH 40/90] Fix for Berserkers not seeing AAs on SoD and below clients. --- common/patches/sod_structs.h | 3 +-- common/patches/sof_structs.h | 3 +-- common/patches/titanium_structs.h | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/common/patches/sod_structs.h b/common/patches/sod_structs.h index 6e1a77b6b..816bff323 100644 --- a/common/patches/sod_structs.h +++ b/common/patches/sod_structs.h @@ -3813,8 +3813,7 @@ struct SendAA_Struct { /*0049*/ uint32 spellid; /*0053*/ uint32 spell_type; /*0057*/ uint32 spell_refresh; -/*0061*/ uint16 classes; -/*0063*/ uint16 berserker; //seems to be 1 if its a berserker ability +/*0061*/ uint32 classes; /*0065*/ uint32 max_level; /*0069*/ uint32 last_id; /*0073*/ uint32 next_id; diff --git a/common/patches/sof_structs.h b/common/patches/sof_structs.h index faa306ab0..49ad7ba3e 100644 --- a/common/patches/sof_structs.h +++ b/common/patches/sof_structs.h @@ -3677,8 +3677,7 @@ struct SendAA_Struct { /*0049*/ uint32 spellid; /*0053*/ uint32 spell_type; /*0057*/ uint32 spell_refresh; -/*0061*/ uint16 classes; -/*0063*/ uint16 berserker; //seems to be 1 if its a berserker ability +/*0061*/ uint32 classes; /*0065*/ uint32 max_level; /*0069*/ uint32 last_id; /*0073*/ uint32 next_id; diff --git a/common/patches/titanium_structs.h b/common/patches/titanium_structs.h index e5fa44a8e..36cf2df3d 100644 --- a/common/patches/titanium_structs.h +++ b/common/patches/titanium_structs.h @@ -3157,8 +3157,7 @@ struct SendAA_Struct { /*0052*/ uint32 spellid; /*0056*/ uint32 spell_type; /*0060*/ uint32 spell_refresh; -/*0064*/ uint16 classes; -/*0066*/ uint16 berserker; //seems to be 1 if its a berserker ability +/*0064*/ uint32 classes; /*0068*/ uint32 max_level; /*0072*/ uint32 last_id; /*0076*/ uint32 next_id; From c3a805923ca940faa713ab59b59d148edb595f63 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Thu, 25 Jun 2015 13:21:02 -0400 Subject: [PATCH 41/90] Up the bard level check to 255 again 1-254 actually has special bard logic and client expects it --- common/spdat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/spdat.cpp b/common/spdat.cpp index 7dd21479c..bb6097566 100644 --- a/common/spdat.cpp +++ b/common/spdat.cpp @@ -447,7 +447,7 @@ bool IsTGBCompatibleSpell(uint16 spell_id) bool IsBardSong(uint16 spell_id) { - if (IsValidSpell(spell_id) && spells[spell_id].classes[BARD - 1] < 127 && !spells[spell_id].IsDisciplineBuff) + if (IsValidSpell(spell_id) && spells[spell_id].classes[BARD - 1] < 255 && !spells[spell_id].IsDisciplineBuff) return true; return false; From 4b64e8c39c4abdbe75e5520085fb5768e37d9338 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Fri, 26 Jun 2015 02:04:33 -0400 Subject: [PATCH 42/90] Ignore skills out of range for bonuses --- zone/bonuses.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index 7ff8e7fc7..1e719dceb 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -691,6 +691,9 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) switch (effect) { // Note: AA effects that use accuracy are skill limited, while spell effect is not. case SE_Accuracy: + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if ((base2 == ALL_SKILLS) && (newbon->Accuracy[HIGHEST_SKILL + 1] < base1)) newbon->Accuracy[HIGHEST_SKILL + 1] = base1; else if (newbon->Accuracy[base2] < base1) @@ -1031,6 +1034,9 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) break; case SE_HitChance: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if (base2 == ALL_SKILLS) newbon->HitChanceEffect[HIGHEST_SKILL + 1] += base1; else @@ -1082,6 +1088,9 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) break; case SE_CriticalHitChance: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if (base2 == ALL_SKILLS) newbon->CriticalHitChance[HIGHEST_SKILL + 1] += base1; else @@ -1089,6 +1098,9 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) } break; case SE_CriticalDamageMob: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; // base1 = effect value, base2 = skill restrictions(-1 for all) if (base2 == ALL_SKILLS) newbon->CritDmgMob[HIGHEST_SKILL + 1] += base1; @@ -1116,6 +1128,9 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) } case SE_SkillDamageAmount: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if (base2 == ALL_SKILLS) newbon->SkillDamageAmount[HIGHEST_SKILL + 1] += base1; else @@ -1132,6 +1147,9 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) } case SE_DamageModifier: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if (base2 == ALL_SKILLS) newbon->DamageModifier[HIGHEST_SKILL + 1] += base1; else @@ -1140,6 +1158,9 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) } case SE_DamageModifier2: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if (base2 == ALL_SKILLS) newbon->DamageModifier2[HIGHEST_SKILL + 1] += base1; else @@ -1347,6 +1368,9 @@ void Mob::ApplyAABonuses(const AA::Rank &rank, StatBonuses *newbon) break; case SE_LimitToSkill: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if (base1 <= HIGHEST_SKILL) newbon->LimitToSkill[base1] = true; break; @@ -1899,6 +1923,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_CriticalHitChance: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if (AdditiveWornBonus) { if(base2 == ALL_SKILLS) new_bonus->CriticalHitChance[HIGHEST_SKILL+1] += effect_value; @@ -2102,6 +2129,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_HitChance: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if (AdditiveWornBonus){ if(base2 == ALL_SKILLS) @@ -2136,6 +2166,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_DamageModifier: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if(base2 == ALL_SKILLS) new_bonus->DamageModifier[HIGHEST_SKILL+1] += effect_value; else @@ -2145,6 +2178,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_DamageModifier2: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if(base2 == ALL_SKILLS) new_bonus->DamageModifier2[HIGHEST_SKILL+1] += effect_value; else @@ -2154,6 +2190,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_MinDamageModifier: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if(base2 == ALL_SKILLS) new_bonus->MinDamageModifier[HIGHEST_SKILL+1] += effect_value; else @@ -2227,6 +2266,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_Accuracy: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if ((effect_value < 0) && (new_bonus->Accuracy[HIGHEST_SKILL+1] > effect_value)) new_bonus->Accuracy[HIGHEST_SKILL+1] = effect_value; @@ -2250,6 +2292,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_SkillDamageTaken: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; //When using npc_spells_effects if MAX value set, use stackable quest based modifier. if (IsAISpellEffect && max){ if(base2 == ALL_SKILLS) @@ -2368,6 +2413,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_CriticalDamageMob: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if(base2 == ALL_SKILLS) new_bonus->CritDmgMob[HIGHEST_SKILL+1] += effect_value; else @@ -2384,6 +2432,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_SkillDamageAmount: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if(base2 == ALL_SKILLS) new_bonus->SkillDamageAmount[HIGHEST_SKILL+1] += effect_value; else @@ -2489,6 +2540,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne case SE_SkillDamageAmount2: { + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if(base2 == ALL_SKILLS) new_bonus->SkillDamageAmount2[HIGHEST_SKILL+1] += effect_value; else @@ -3023,6 +3077,9 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne break; case SE_LimitToSkill:{ + // Bad data or unsupported new skill + if (base2 > HIGHEST_SKILL) + break; if (effect_value <= HIGHEST_SKILL){ new_bonus->LimitToSkill[effect_value] = true; } From cee7e401dd87c50cac3272c6f722a3aa10c7217c Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Fri, 26 Jun 2015 02:19:13 -0400 Subject: [PATCH 43/90] Fix issue with initial cast of level override proc buffs --- zone/spell_effects.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 9134e8ff7..4c1f1fa45 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -1770,9 +1770,9 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove #endif if(spells[spell_id].base2[i] == 0) - AddProcToWeapon(procid, false, 100, spell_id, level_override); + AddProcToWeapon(procid, false, 100, spell_id, caster_level); else - AddProcToWeapon(procid, false, spells[spell_id].base2[i]+100, spell_id, level_override); + AddProcToWeapon(procid, false, spells[spell_id].base2[i]+100, spell_id, caster_level); break; } From 337ce2d74b6b911213e963679f838e3ba92845c0 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Fri, 26 Jun 2015 18:00:15 -0400 Subject: [PATCH 44/90] Fix crash for Bard Furious Refrain This does a frenzy, which bards don't have. Live this AA is broken. --- zone/attack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zone/attack.cpp b/zone/attack.cpp index 202ad77b6..f6690c58f 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -4459,7 +4459,7 @@ void Mob::DoRiposte(Mob *defender) if (defender->GetClass() == MONK) defender->MonkSpecialAttack(this, defender->aabonuses.GiveDoubleRiposte[2]); - else if (defender->IsClient()) + else if (defender->IsClient() && defender->CastToClient()->HasSkill((SkillUseTypes)defender->aabonuses.GiveDoubleRiposte[2])) defender->CastToClient()->DoClassAttacks(this, defender->aabonuses.GiveDoubleRiposte[2], true); } } From 5a6685d12951acde8d6bc4a607fdf60992e6f580 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sat, 27 Jun 2015 18:39:13 -0400 Subject: [PATCH 45/90] Fix issue with AA cast mana consumption AAs will now cast from slot "0xFF" instead of the itemslot to avoid special behavior of items. Mana reduction also moved down to the same place consumption takes place like live. --- zone/aa.cpp | 6 +++--- zone/common.h | 1 + zone/spells.cpp | 27 +++++++++++++++------------ 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index 07adc2805..db765e813 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1183,12 +1183,12 @@ void Client::ActivateAlternateAdvancementAbility(int rank_id, int target_id) { // Bards can cast instant cast AAs while they are casting another song if(spells[rank->spell].cast_time == 0 && GetClass() == BARD && IsBardSong(casting_spell_id)) { - if(!SpellFinished(rank->spell, entity_list.GetMob(target_id), 10, -1, -1, spells[rank->spell].ResistDiff, false)) { + if(!SpellFinished(rank->spell, entity_list.GetMob(target_id), ALTERNATE_ABILITY_SPELL_SLOT, spells[rank->spell].mana, -1, spells[rank->spell].ResistDiff, false)) { return; } ExpendAlternateAdvancementCharge(ability->id); } else { - if(!CastSpell(rank->spell, target_id, USE_ITEM_SPELL_SLOT, -1, -1, 0, -1, rank->spell_type + pTimerAAStart, cooldown, nullptr, rank->id)) { + if(!CastSpell(rank->spell, target_id, ALTERNATE_ABILITY_SPELL_SLOT, -1, -1, 0, -1, rank->spell_type + pTimerAAStart, cooldown, nullptr, rank->id)) { return; } } @@ -1554,7 +1554,7 @@ void Zone::LoadAlternateAdvancement() { // then set it here too //if prev has an aa we have // then set to whichever is highest - + auto iter = current->prereqs.find(prev_prereq.first); if(iter == current->prereqs.end()) { //not found diff --git a/zone/common.h b/zone/common.h index e9521cb94..0b875456b 100644 --- a/zone/common.h +++ b/zone/common.h @@ -22,6 +22,7 @@ #define TARGET_RING_SPELL_SLOT 12 #define DISCIPLINE_SPELL_SLOT 10 #define ABILITY_SPELL_SLOT 9 +#define ALTERNATE_ABILITY_SPELL_SLOT 0xFF //LOS Parameters: #define HEAD_POSITION 0.9f //ratio of GetSize() where NPCs see from diff --git a/zone/spells.cpp b/zone/spells.cpp index 30e3b02d9..0a4dc29b3 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -409,24 +409,19 @@ bool Mob::DoCastSpell(uint16 spell_id, uint16 target_id, uint16 slot, // ok now we know the target casting_spell_targetid = target_id; - if (mana_cost == -1) { + // We don't get actual mana cost here, that's done when we consume the mana + if (mana_cost == -1) mana_cost = spell.mana; - mana_cost = GetActSpellCost(spell_id, mana_cost); - } - - if(HasMGB() && spells[spell_id].can_mgb) - mana_cost *= 2; // mana is checked for clients on the frontend. we need to recheck it for NPCs though - // fix: items dont need mana :-/ // If you're at full mana, let it cast even if you dont have enough mana // we calculated this above, now enforce it - if(mana_cost > 0 && slot != 10) + if(mana_cost > 0 && slot != USE_ITEM_SPELL_SLOT) { int my_curmana = GetMana(); int my_maxmana = GetMaxMana(); - if(my_curmana < spell.mana) // not enough mana + if(my_curmana < mana_cost) // not enough mana { //this is a special case for NPCs with no mana... if(IsNPC() && my_curmana == my_maxmana) @@ -2157,11 +2152,11 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, uint16 slot, uint16 } #endif //BOTS + // We hold off turning MBG off so we can still use it to calc the mana cost if(spells[spell_id].can_mgb && HasMGB()) { SpellOnTarget(spell_id, this); entity_list.MassGroupBuff(this, this, spell_id, true); - SetMGB(false); } else { @@ -2262,13 +2257,21 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, uint16 slot, uint16 } // if this was a spell slot or an ability use up the mana for it - // CastSpell already reduced the cost for it if we're a client with focus if(slot != USE_ITEM_SPELL_SLOT && slot != POTION_BELT_SPELL_SLOT && slot != TARGET_RING_SPELL_SLOT && mana_used > 0) { + mana_used = GetActSpellCost(spell_id, mana_used); + if (HasMGB() && spells[spell_id].can_mgb) { + mana_used *= 2; + SetMGB(false); + } + // clamp if we some how got focused above our current mana + if (GetMana() < mana_used) + mana_used = GetMana(); Log.Out(Logs::Detail, Logs::Spells, "Spell %d: consuming %d mana", spell_id, mana_used); - if (!DoHPToManaCovert(mana_used)) + if (!DoHPToManaCovert(mana_used)) { SetMana(GetMana() - mana_used); TryTriggerOnValueAmount(false, true); + } } //set our reuse timer on long ass reuse_time spells... From 009918cbd10fdfe3e4ce9a7ea587e44b83e31d90 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sat, 27 Jun 2015 22:43:00 -0400 Subject: [PATCH 46/90] Fix songcap implementation --- zone/client_mods.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/zone/client_mods.cpp b/zone/client_mods.cpp index 76ce5195c..13a8130bd 100644 --- a/zone/client_mods.cpp +++ b/zone/client_mods.cpp @@ -1979,10 +1979,17 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id) const uint32 effectmod = 10; int effectmodcap = 0; - if (RuleB(Character, UseSpellFileSongCap)) + bool nocap = false; + if (RuleB(Character, UseSpellFileSongCap)) { effectmodcap = spells[spell_id].songcap / 10; - else + // this looks a bit weird, but easiest way I could think to keep both systems working + if (effectmodcap == 0) + nocap = true; + else + effectmodcap += 10; + } else { effectmodcap = RuleI(Character, BaseInstrumentSoftCap); + } // this should never use spell modifiers... // if a spell grants better modifers, they are copied into the item mods // because the spells are supposed to act just like having the intrument. @@ -2056,7 +2063,7 @@ uint32 Mob::GetInstrumentMod(uint16 spell_id) const effectmodcap += aabonuses.songModCap + spellbonuses.songModCap + itembonuses.songModCap; if (effectmod < 10) effectmod = 10; - if (effectmodcap && effectmod > effectmodcap) // if the cap is calculated to be 0 using new rules, no cap. + if (!nocap && effectmod > effectmodcap) // if the cap is calculated to be 0 using new rules, no cap. effectmod = effectmodcap; Log.Out(Logs::Detail, Logs::Spells, "%s::GetInstrumentMod() spell=%d mod=%d modcap=%d\n", GetName(), spell_id, effectmod, effectmodcap); From b11fea91a6dfb021bc6f7d30883d30c2ed7d2a8b Mon Sep 17 00:00:00 2001 From: ngdeao Date: Sun, 28 Jun 2015 00:35:55 -0600 Subject: [PATCH 47/90] Fixed some mob speed scaling. --- zone/waypoints.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/zone/waypoints.cpp b/zone/waypoints.cpp index 7570165a3..b0c74a9e8 100644 --- a/zone/waypoints.cpp +++ b/zone/waypoints.cpp @@ -621,9 +621,9 @@ bool Mob::MakeNewPositionAndSendUpdate(float x, float y, float z, int speed, boo if (numsteps>1) { tar_vector=1.0f ; - m_TargetV.x = 1.25f * m_TargetV.x/(float)numsteps; - m_TargetV.y = 1.25f * m_TargetV.y/(float)numsteps; - m_TargetV.z = 1.25f *m_TargetV.z/(float)numsteps; + m_TargetV.x = m_TargetV.x/(float)numsteps; + m_TargetV.y = m_TargetV.y/(float)numsteps; + m_TargetV.z = m_TargetV.z/(float)numsteps; float new_x = m_Position.x + m_TargetV.x; float new_y = m_Position.y + m_TargetV.y; @@ -636,7 +636,7 @@ bool Mob::MakeNewPositionAndSendUpdate(float x, float y, float z, int speed, boo m_Position.y = new_y; m_Position.z = new_z; m_Position.w = CalculateHeadingToTarget(x, y); - tar_ndx = 22 - numsteps; + tar_ndx = 20 - numsteps; Log.Out(Logs::Detail, Logs::AI, "Next position2 (%.3f, %.3f, %.3f) (%d steps)", m_Position.x, m_Position.y, m_Position.z, numsteps); } else From 74aec82d2a7a3a8eb8f01bf4f5983283f4fb063d Mon Sep 17 00:00:00 2001 From: ngdeao Date: Sun, 28 Jun 2015 00:58:03 -0600 Subject: [PATCH 48/90] Optional SQL for adjusting mob speeds. The base runspeeds for mobs were about 80% high. This scales them to values appropriate for new speed calculations. The RescaleRunspeeds regroups speeds into common seen speed bins. Higher speeds it lowers them by 20%. This should only be run once against a db. The Set specific speeds is tailored to specific mob run speeds, based on data taken from eqlive. --- ...015_06_28_RescaleRunspeeds_RunOnceOnly.sql | 7 +++ ...MobSpecificRunSpeeds_AfterAnyRescaling.sql | 61 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 utils/sql/git/optional/2015_06_28_RescaleRunspeeds_RunOnceOnly.sql create mode 100644 utils/sql/git/optional/2015_06_28_SetMobSpecificRunSpeeds_AfterAnyRescaling.sql diff --git a/utils/sql/git/optional/2015_06_28_RescaleRunspeeds_RunOnceOnly.sql b/utils/sql/git/optional/2015_06_28_RescaleRunspeeds_RunOnceOnly.sql new file mode 100644 index 000000000..2810d3291 --- /dev/null +++ b/utils/sql/git/optional/2015_06_28_RescaleRunspeeds_RunOnceOnly.sql @@ -0,0 +1,7 @@ +/* This rescales the old peq runspeeds which were about 80 percent too high to new values */ +/* This section should only ever be run once */ +UPDATE npc_types SET npc_types.runspeed = 1.050 WHERE (npc_types.runspeed > 0 and npc_types.runspeed < 1.2); +UPDATE npc_types SET npc_types.runspeed = 1.325 WHERE (npc_types.runspeed > 1.19 and npc_types.runspeed < 1.75 and race != 73 and race != 72); +UPDATE npc_types SET npc_types.runspeed = 1.575 WHERE (npc_types.runspeed > 1.69 and npc_types.runspeed < 2.2); +UPDATE npc_types SET npc_types.runspeed = 1.850 WHERE (npc_types.runspeed > 2.19 and npc_types.runspeed < 3); +UPDATE npc_types SET npc_types.runspeed = (npc_types.runspeed * 0.8) WHERE (npc_types.runspeed > 2.99 and npc_types.runspeed < 20); \ No newline at end of file diff --git a/utils/sql/git/optional/2015_06_28_SetMobSpecificRunSpeeds_AfterAnyRescaling.sql b/utils/sql/git/optional/2015_06_28_SetMobSpecificRunSpeeds_AfterAnyRescaling.sql new file mode 100644 index 000000000..064c39ce4 --- /dev/null +++ b/utils/sql/git/optional/2015_06_28_SetMobSpecificRunSpeeds_AfterAnyRescaling.sql @@ -0,0 +1,61 @@ +/* some specific by name */ +UPDATE npc_types SET npc_types.runspeed = 3.175 WHERE npc_types.name = 'a_shadowed_man'; +UPDATE npc_types SET npc_types.runspeed = 1.850 WHERE npc_types.name = 'aviak_egret'; +UPDATE npc_types SET npc_types.runspeed = 1.575 WHERE npc_types.name = 'froglok_hunter'; +UPDATE npc_types SET npc_types.runspeed = 1.575 WHERE npc_types.name = 'froglok_forager'; +/* rhinos */ +UPDATE npc_types SET npc_types.runspeed = 1.850 WHERE npc_types.race = 135; +/* centaurs */ +UPDATE npc_types SET npc_types.runspeed = 1.850 WHERE npc_types.race = 16; +/* griffins */ +UPDATE npc_types SET npc_types.runspeed = 1.850 WHERE npc_types.race = 47; +/* wolves - use size, to not change cubs*/ +UPDATE npc_types SET npc_types.runspeed = 1.575 WHERE (npc_types.race = 42 and npc_types.size > 5); +/* sarnaks */ +UPDATE npc_types SET npc_types.runspeed = 1.325 WHERE npc_types.race = 131; +/* sabertooth tigers - use size, to not change cubs*/ +UPDATE npc_types SET npc_types.runspeed = 1.575 WHERE (npc_types.race = 119 and npc_types.size > 6); +/* lions */ +UPDATE npc_types SET npc_types.runspeed = 1.575 WHERE (npc_types.race = 50 and npc_types.size > 7); +/* panthers/pumas */ +UPDATE npc_types SET npc_types.runspeed = 1.575 WHERE npc_types.race = 76; +/* beetles */ +UPDATE npc_types SET npc_types.runspeed = 1.05 WHERE npc_types.race = 22; +/*leeches*/ +UPDATE npc_types SET npc_types.runspeed = 1.05 WHERE npc_types.race = 104; +/*a_brontotherium*/ +UPDATE npc_types SET npc_types.runspeed = 1.575 WHERE npc_types.race = 169; +/* raptors */ +UPDATE npc_types SET npc_types.runspeed = 1.850 WHERE npc_types.race = 163; +/* vicious plants */ +UPDATE npc_types SET npc_types.runspeed = 1.575 WHERE npc_types.race = 162; +/* western wastes, drakes, cragwyrms and wyvern */ +UPDATE npc_types +JOIN spawnentry ON npc_types.id = spawnentry.npcID +JOIN spawn2 ON spawn2.spawngroupID = spawnentry.spawngroupID +SET npc_types.runspeed = 1.575 +WHERE ((npc_types.race = 89 OR npc_types.race = 157 OR npc_types.race = 158) AND spawn2.zone = 'westwastes'); +/* velium hounds/wolves */ +UPDATE npc_types +JOIN spawnentry ON npc_types.id = spawnentry.npcID +JOIN spawn2 ON spawn2.spawngroupID = spawnentry.spawngroupID +SET npc_types.runspeed = 1.850 +WHERE (npc_types.race = 42 AND spawn2.zone = 'westwastes'); +/* Overthere Specials, goons, etc. */ +UPDATE npc_types +JOIN spawnentry ON npc_types.id = spawnentry.npcID +JOIN spawn2 ON spawn2.spawngroupID = spawnentry.spawngroupID +SET npc_types.runspeed = 1.850 +WHERE ((npc_types.race = 77 or npc_types.race = 147) AND spawn2.zone = 'overthere'); +UPDATE npc_types SET npc_types.runspeed = 1.850 WHERE npc_types.name = 'Captain_Rottgrime'; +UPDATE npc_types SET npc_types.runspeed = 1.850 WHERE npc_types.name = 'an_undead_marine'; +/* Pet Speeds. */ +UPDATE npc_types +JOIN pets ON npc_types.id = pets.npcID +SET npc_types.runspeed = 1.575; +/* raptors in tim are slower than other raptors in kunark */ +UPDATE npc_types +JOIN spawnentry ON npc_types.id = spawnentry.npcID +JOIN spawn2 ON spawn2.spawngroupID = spawnentry.spawngroupID +SET npc_types.runspeed = 1.325 +WHERE ( npc_types.race = 163 AND spawn2.zone = 'timorous' ); From 850a90887425145f0d3cdc085a258267f029de21 Mon Sep 17 00:00:00 2001 From: ngdeao Date: Mon, 29 Jun 2015 22:57:37 -0600 Subject: [PATCH 49/90] Fixed #modifynpcstat runspeed , to work with new speed calculations. Updated #showstats and #npcstats for new speed calcs to display speeds again in familiar float format. Improved client movement while AI Controlled, such as feared and charmed. Movement will be much smoother from clients perspective. --- common/opcode_dispatch.h | 1 + zone/client.cpp | 1 + zone/client.h | 2 ++ zone/client_packet.cpp | 12 ++++++++++++ zone/client_process.cpp | 4 +--- zone/command.cpp | 2 +- zone/mob.cpp | 6 +++--- zone/mob.h | 2 +- zone/mob_ai.cpp | 28 ++++++++++++++++++---------- zone/npc.cpp | 10 +++++++++- zone/waypoints.cpp | 4 ++-- 11 files changed, 51 insertions(+), 21 deletions(-) diff --git a/common/opcode_dispatch.h b/common/opcode_dispatch.h index 657d9a525..a88391bce 100644 --- a/common/opcode_dispatch.h +++ b/common/opcode_dispatch.h @@ -146,6 +146,7 @@ INr(OP_GuildDelete); //? IN(OP_GuildPublicNote, GuildUpdate_PublicNote); INz(OP_GetGuildsList); //? IN(OP_SetGuildMOTD, GuildMOTD_Struct); +IN(OP_SetRunMode, SetRunMode_Struct); INz(OP_GuildPeace); //? INz(OP_GuildWar); //? IN(OP_GuildLeader, GuildMakeLeader); diff --git a/zone/client.cpp b/zone/client.cpp index e4d49e979..7c73db5cc 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -198,6 +198,7 @@ Client::Client(EQStreamInterface* ieqs) SetTarget(0); auto_attack = false; auto_fire = false; + runmode = false; linkdead_timer.Disable(); zonesummon_id = 0; zonesummon_ignorerestrictions = 0; diff --git a/zone/client.h b/zone/client.h index 4a166feed..4f31aee23 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1157,6 +1157,7 @@ public: void RemoveAutoXTargets(); void ShowXTargets(Client *c); bool GroupFollow(Client* inviter); + inline bool GetRunMode() const { return runmode; } void InitializeMercInfo(); bool CheckCanSpawnMerc(uint32 template_id); @@ -1385,6 +1386,7 @@ private: bool AFK; bool auto_attack; bool auto_fire; + bool runmode; uint8 gmspeed; bool medding; uint16 horseId; diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 2ae2babac..b33148d45 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -11836,6 +11836,18 @@ void Client::Handle_OP_SetGuildMOTD(const EQApplicationPacket *app) void Client::Handle_OP_SetRunMode(const EQApplicationPacket *app) { + if (app->size < sizeof(SetRunMode_Struct)) { + Log.Out(Logs::General, Logs::Error, "Received invalid sized " + "OP_SetRunMode: got %d, expected %d", app->size, + sizeof(SetRunMode_Struct)); + DumpPacket(app); + return; + } + SetRunMode_Struct* rms = (SetRunMode_Struct*)app->pBuffer; + if (rms->mode) + runmode = true; + else + runmode = false; return; } diff --git a/zone/client_process.cpp b/zone/client_process.cpp index 4a16e7698..27567f998 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -522,9 +522,7 @@ bool Client::Process() { if (position_timer.Check()) { if (IsAIControlled()) { - if(IsMoving()) - SendPosUpdate(2); - else + if(!IsMoving()) { animation = 0; m_Delta = glm::vec4(0.0f, 0.0f, 0.0f, m_Delta.w); diff --git a/zone/command.cpp b/zone/command.cpp index a286f92bd..2226a87f5 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -1484,7 +1484,7 @@ void command_npcstats(Client *c, const Seperator *sep) c->Message(0, "Current HP: %i Max HP: %i", c->GetTarget()->GetHP(), c->GetTarget()->GetMaxHP()); //c->Message(0, "Weapon Item Number: %s", c->GetTarget()->GetWeapNo()); c->Message(0, "Gender: %i Size: %f Bodytype: %d", c->GetTarget()->GetGender(), c->GetTarget()->GetSize(), c->GetTarget()->GetBodyType()); - c->Message(0, "Runspeed: %i Walkspeed: %i", c->GetTarget()->GetRunspeed(), c->GetTarget()->GetWalkspeed()); + c->Message(0, "Runspeed: %.3f Walkspeed: %.3f", static_cast(0.025f * c->GetTarget()->GetRunspeed()), static_cast(0.025f * c->GetTarget()->GetWalkspeed())); c->Message(0, "Spawn Group: %i Grid: %i", c->GetTarget()->CastToNPC()->GetSp2(), c->GetTarget()->CastToNPC()->GetGrid()); c->Message(0, "EmoteID: %i", c->GetTarget()->CastToNPC()->GetEmoteID()); c->GetTarget()->CastToNPC()->QueryLoot(c); diff --git a/zone/mob.cpp b/zone/mob.cpp index b107565bc..cab28ff7b 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -725,7 +725,7 @@ int Mob::_GetFearSpeed() const { movemod = -85; if (IsClient()) { - if (CastToClient()->IsRunning()) + if (CastToClient()->GetRunMode()) speed_mod = GetBaseRunspeed(); else speed_mod = GetBaseWalkspeed(); @@ -1085,7 +1085,7 @@ void Mob::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho) ns->spawn.max_hp = 100; //this field needs a better name ns->spawn.race = race; ns->spawn.runspeed = runspeed; - ns->spawn.walkspeed = runspeed * 0.5f; + ns->spawn.walkspeed = walkspeed; ns->spawn.class_ = class_; ns->spawn.gender = gender; ns->spawn.level = level; @@ -1475,7 +1475,7 @@ void Mob::ShowStats(Client* client) if(n->respawn2 != 0) spawngroupid = n->respawn2->SpawnGroupID(); client->Message(0, " NPCID: %u SpawnGroupID: %u Grid: %i LootTable: %u FactionID: %i SpellsID: %u ", GetNPCTypeID(),spawngroupid, n->GetGrid(), n->GetLoottableID(), n->GetNPCFactionID(), n->GetNPCSpellsID()); - client->Message(0, " Accuracy: %i MerchantID: %i EmoteID: %i Runspeed: %u Walkspeed: %u", n->GetAccuracyRating(), n->MerchantType, n->GetEmoteID(), n->GetRunspeed(), n->GetWalkspeed()); + client->Message(0, " Accuracy: %i MerchantID: %i EmoteID: %i Runspeed: %.3f Walkspeed: %.3f", n->GetAccuracyRating(), n->MerchantType, n->GetEmoteID(), static_cast(0.025f * n->GetRunspeed()), static_cast(0.025f * n->GetWalkspeed())); n->QueryLoot(client); } if (IsAIControlled()) { diff --git a/zone/mob.h b/zone/mob.h index ded9c04dc..9a51b5436 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -365,7 +365,7 @@ public: inline Mob* GetTarget() const { return target; } virtual void SetTarget(Mob* mob); virtual inline float GetHPRatio() const { return max_hp == 0 ? 0 : ((float)cur_hp/max_hp*100); } - virtual inline float GetIntHPRatio() const { return max_hp == 0 ? 0 : (cur_hp/max_hp*100); } + virtual inline int GetIntHPRatio() const { return max_hp == 0 ? 0 : static_cast(cur_hp * 100 / max_hp); } inline virtual int32 GetAC() const { return AC + itembonuses.AC + spellbonuses.AC; } inline virtual int32 GetATK() const { return ATK + itembonuses.ATK + spellbonuses.ATK; } inline virtual int32 GetATKBonus() const { return itembonuses.ATK + spellbonuses.ATK; } diff --git a/zone/mob_ai.cpp b/zone/mob_ai.cpp index 045c2cb75..85217905d 100644 --- a/zone/mob_ai.cpp +++ b/zone/mob_ai.cpp @@ -772,7 +772,10 @@ void Client::AI_Process() engaged = true; } else { if(AImovement_timer->Check()) { - //animation = GetFearSpeed() * 21; + int speed = GetFearSpeed(); + animation = speed; + speed *= 2; + SetCurrentSpeed(speed); // Check if we have reached the last fear point if ((std::abs(GetX() - m_FearWalkTarget.x) < 0.1) && (std::abs(GetY() - m_FearWalkTarget.y) < 0.1)) { @@ -780,18 +783,18 @@ void Client::AI_Process() CalculateNewFearpoint(); } if(!RuleB(Pathing, Fear) || !zone->pathing) - CalculateNewPosition2(m_FearWalkTarget.x, m_FearWalkTarget.y, m_FearWalkTarget.z, GetFearSpeed(), true); + CalculateNewPosition2(m_FearWalkTarget.x, m_FearWalkTarget.y, m_FearWalkTarget.z, speed, true); else { bool WaypointChanged, NodeReached; glm::vec3 Goal = UpdatePath(m_FearWalkTarget.x, m_FearWalkTarget.y, m_FearWalkTarget.z, - GetFearSpeed(), WaypointChanged, NodeReached); + speed, WaypointChanged, NodeReached); if(WaypointChanged) tar_ndx = 20; - CalculateNewPosition2(Goal.x, Goal.y, Goal.z, GetFearSpeed()); + CalculateNewPosition2(Goal.x, Goal.y, Goal.z, speed); } } return; @@ -934,8 +937,12 @@ void Client::AI_Process() { if(AImovement_timer->Check()) { + int newspeed = GetRunspeed(); + animation = newspeed; + newspeed *= 2; + SetCurrentSpeed(newspeed); if(!RuleB(Pathing, Aggro) || !zone->pathing) - CalculateNewPosition2(GetTarget()->GetX(), GetTarget()->GetY(), GetTarget()->GetZ(), GetRunspeed()); + CalculateNewPosition2(GetTarget()->GetX(), GetTarget()->GetY(), GetTarget()->GetZ(), newspeed); else { bool WaypointChanged, NodeReached; @@ -945,7 +952,7 @@ void Client::AI_Process() if(WaypointChanged) tar_ndx = 20; - CalculateNewPosition2(Goal.x, Goal.y, Goal.z, GetRunspeed()); + CalculateNewPosition2(Goal.x, Goal.y, Goal.z, newspeed); } } } @@ -989,11 +996,12 @@ void Client::AI_Process() { if(AImovement_timer->Check()) { - int speed = GetWalkspeed(); - if (dist >= 5625) - speed = GetRunspeed(); + int nspeed = (dist >= 5625 ? GetRunspeed() : GetWalkspeed()); + animation = nspeed; + nspeed *= 2; + SetCurrentSpeed(nspeed); - CalculateNewPosition2(owner->GetX(), owner->GetY(), owner->GetZ(), speed); + CalculateNewPosition2(owner->GetX(), owner->GetY(), owner->GetZ(), nspeed); } } else diff --git a/zone/npc.cpp b/zone/npc.cpp index d4a33b6d0..1efd2beb6 100644 --- a/zone/npc.cpp +++ b/zone/npc.cpp @@ -1929,7 +1929,15 @@ void NPC::ModifyNPCStat(const char *identifier, const char *newValue) else if(id == "pr") { PR = atoi(val.c_str()); return; } else if(id == "dr") { DR = atoi(val.c_str()); return; } else if(id == "PhR") { PhR = atoi(val.c_str()); return; } - else if(id == "runspeed") { runspeed = (float)atof(val.c_str()); CalcBonuses(); return; } + else if(id == "runspeed") { + runspeed = (float)atof(val.c_str()); + base_runspeed = (int)((float)runspeed * 40.0f); + base_walkspeed = base_runspeed * 100 / 265; + walkspeed = ((float)base_walkspeed) * 0.025f; + base_fearspeed = base_runspeed * 100 / 127; + fearspeed = ((float)base_fearspeed) * 0.025f; + CalcBonuses(); return; + } else if(id == "special_attacks") { NPCSpecialAttacks(val.c_str(), 0, 1); return; } else if(id == "special_abilities") { ProcessSpecialAbilities(val.c_str()); return; } else if(id == "attack_speed") { attack_speed = (float)atof(val.c_str()); CalcBonuses(); return; } diff --git a/zone/waypoints.cpp b/zone/waypoints.cpp index b0c74a9e8..75b894ca6 100644 --- a/zone/waypoints.cpp +++ b/zone/waypoints.cpp @@ -597,7 +597,7 @@ bool Mob::MakeNewPositionAndSendUpdate(float x, float y, float z, int speed, boo pRunAnimSpeed = speed; if(IsClient()) { - animation = speed; + animation = speed / 2; } //pRunAnimSpeed = (int8)(speed*NPC_RUNANIM_RATIO); //speed *= NPC_SPEED_MULTIPLIER; @@ -611,7 +611,7 @@ bool Mob::MakeNewPositionAndSendUpdate(float x, float y, float z, int speed, boo tar_vector = (float)speed / mag; // mob move fix - int numsteps = (int) ( mag * 16.0f / (float)speed); + int numsteps = (int) ( mag * 16.0f / (float)speed + 0.5f); // mob move fix From 56b57d2ca688907621c7fa27f7cb34f3c7b90677 Mon Sep 17 00:00:00 2001 From: JJ Date: Tue, 30 Jun 2015 20:05:35 -0400 Subject: [PATCH 50/90] Fix moving character to zone using character id and zone name. (bheam) --- common/database.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/database.cpp b/common/database.cpp index 31566d82f..b27722fe9 100644 --- a/common/database.cpp +++ b/common/database.cpp @@ -1384,7 +1384,7 @@ bool Database::MoveCharacterToZone(const char* charname, const char* zonename) { } bool Database::MoveCharacterToZone(uint32 iCharID, const char* iZonename) { - std::string query = StringFormat("UPDATE `character_data` SET `zone_id` = %i, `x` = -1, `y` = -1, `z` = -1 WHERE `id` = %i", iZonename, GetZoneID(iZonename), iCharID); + std::string query = StringFormat("UPDATE `character_data` SET `zone_id` = %i, `x` = -1, `y` = -1, `z` = -1 WHERE `id` = %i", GetZoneID(iZonename), iCharID); auto results = QueryDatabase(query); if (!results.Success()) { From ea18238a127d5fbd2d9d5712089df12fce74509c Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Tue, 30 Jun 2015 20:35:28 -0400 Subject: [PATCH 51/90] Some servers apparently relied on the HP update spam --- common/ruletypes.h | 1 + zone/attack.cpp | 4 ++-- zone/mob.cpp | 6 ++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/common/ruletypes.h b/common/ruletypes.h index 1919c7168..372224f2c 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -113,6 +113,7 @@ RULE_INT(Character, TradeskillUpMakePoison, 2) // Make Poison skillup rate adjus RULE_INT(Character, TradeskillUpPottery, 4) // Pottery skillup rate adjust. Lower is faster. RULE_INT(Character, TradeskillUpResearch, 1) // Research skillup rate adjust. Lower is faster. RULE_INT(Character, TradeskillUpTinkering, 2) // Tinkering skillup rate adjust. Lower is faster. +RULE_BOOL(Character, SpamHPUpdates, false) // if your server has stupid amounts of HP that causes client display issues, turn this on! RULE_CATEGORY_END() RULE_CATEGORY(Mercs) diff --git a/zone/attack.cpp b/zone/attack.cpp index ffdb0ec41..a810ccebb 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -3693,11 +3693,11 @@ void Mob::CommonDamage(Mob* attacker, int32 &damage, const uint16 spell_id, cons //send an HP update if we are hurt if(GetHP() < GetMaxHP()) - SendHPUpdate(!iBuffTic); // the OP_Damage actually updates the client in these cases, so we skill them + SendHPUpdate(!iBuffTic); // the OP_Damage actually updates the client in these cases, so we skip the HP update for them } //end `if damage was done` //send damage packet... - if(!iBuffTic) { //buff ticks do not send damage, instead they just call SendHPUpdate(), which is done below + if(!iBuffTic) { //buff ticks do not send damage, instead they just call SendHPUpdate(), which is done above EQApplicationPacket* outapp = new EQApplicationPacket(OP_Damage, sizeof(CombatDamage_Struct)); CombatDamage_Struct* a = (CombatDamage_Struct*)outapp->pBuffer; a->target = GetID(); diff --git a/zone/mob.cpp b/zone/mob.cpp index cab28ff7b..ac5e37a8e 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -1354,8 +1354,9 @@ void Mob::SendHPUpdate(bool skip_self) } } + bool dospam = RuleB(Character, SpamHPUpdates); // send to self - we need the actual hps here - if(IsClient() && !skip_self) { + if(IsClient() && (!skip_self || dospam)) { EQApplicationPacket* hp_app2 = new EQApplicationPacket(OP_HPUpdate,sizeof(SpawnHPUpdate_Struct)); SpawnHPUpdate_Struct* ds = (SpawnHPUpdate_Struct*)hp_app2->pBuffer; ds->cur_hp = CastToClient()->GetHP() - itembonuses.HP; @@ -1364,7 +1365,8 @@ void Mob::SendHPUpdate(bool skip_self) CastToClient()->QueuePacket(hp_app2); safe_delete(hp_app2); } - ResetHPUpdateTimer(); // delay the timer + if (!dospam) + ResetHPUpdateTimer(); // delay the timer } // this one just warps the mob to the current location From 895f27a6c1bc948e441f3dfde3458c8b83d207c0 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Tue, 30 Jun 2015 23:42:21 -0500 Subject: [PATCH 52/90] Fix an issue with Guild messages sent via gmsay that are too long --- zone/worldserver.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index 517106aca..d9af83d87 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -1907,10 +1907,10 @@ bool WorldServer::SendEmoteMessage(const char* to, uint32 to_guilddbid, uint32 t bool WorldServer::SendEmoteMessage(const char* to, uint32 to_guilddbid, int16 to_minstatus, uint32 type, const char* message, ...) { va_list argptr; - char buffer[256]; + char buffer[256] = { 0 }; va_start(argptr, message); - vsnprintf(buffer, 256, message, argptr); + vsnprintf(buffer, sizeof(buffer) - 1, message, argptr); va_end(argptr); if (!Connected() && to == 0) { From 88659b5f7e33a4b6a231b94857d93a1614875fe0 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Tue, 30 Jun 2015 23:57:13 -0500 Subject: [PATCH 53/90] Runspeed changes added to database update manifest --- common/version.h | 2 +- utils/sql/db_update_manifest.txt | 2 ++ utils/sql/git/required/2015_06_30_runspeed_adjustments.sql | 7 +++++++ 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 utils/sql/git/required/2015_06_30_runspeed_adjustments.sql diff --git a/common/version.h b/common/version.h index 1813f77c3..00f74e801 100644 --- a/common/version.h +++ b/common/version.h @@ -30,7 +30,7 @@ Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt */ -#define CURRENT_BINARY_DATABASE_VERSION 9083 +#define CURRENT_BINARY_DATABASE_VERSION 9084 #define COMPILE_DATE __DATE__ #define COMPILE_TIME __TIME__ #ifndef WIN32 diff --git a/utils/sql/db_update_manifest.txt b/utils/sql/db_update_manifest.txt index e7aa46221..c2f8242c3 100644 --- a/utils/sql/db_update_manifest.txt +++ b/utils/sql/db_update_manifest.txt @@ -337,6 +337,8 @@ 9081|2015_05_23_dbstr_us.sql|SHOW TABLES LIKE 'db_str'|empty| 9082|2015_05_25_npc_types_texture_fields.sql|SHOW COLUMNS FROM `npc_types` LIKE 'armtexture'|empty| 9083|2015_06_07_aa_update.sql|SHOW COLUMNS FROM `character_alternate_abilities` LIKE 'charges'|empty| +9084|2015_06_30_runspeed_adjustments.sql|SELECT `runspeed` FROM `npc_types` WHERE `runspeed` > 3|not_empty| + # Upgrade conditions: # This won't be needed after this system is implemented, but it is used database that are not diff --git a/utils/sql/git/required/2015_06_30_runspeed_adjustments.sql b/utils/sql/git/required/2015_06_30_runspeed_adjustments.sql new file mode 100644 index 000000000..f3feaec1a --- /dev/null +++ b/utils/sql/git/required/2015_06_30_runspeed_adjustments.sql @@ -0,0 +1,7 @@ +/* This rescales the old peq runspeeds which were about 80 percent too high to new values */ +/* This section should only ever be run once */ +UPDATE npc_types SET npc_types.runspeed = 1.050 WHERE (npc_types.runspeed > 0 and npc_types.runspeed < 1.2); +UPDATE npc_types SET npc_types.runspeed = 1.325 WHERE (npc_types.runspeed > 1.19 and npc_types.runspeed < 1.75 and race != 73 and race != 72); +UPDATE npc_types SET npc_types.runspeed = 1.575 WHERE (npc_types.runspeed > 1.69 and npc_types.runspeed < 2.2); +UPDATE npc_types SET npc_types.runspeed = 1.850 WHERE (npc_types.runspeed > 2.19 and npc_types.runspeed < 3); +UPDATE npc_types SET npc_types.runspeed = 3 WHERE npc_types.runspeed > 3; \ No newline at end of file From b71e856c8cd8e23fba27619d15fbd64f88b5508c Mon Sep 17 00:00:00 2001 From: Akkadius Date: Wed, 1 Jul 2015 00:19:44 -0500 Subject: [PATCH 54/90] Increase emote buffer to 4096 --- zone/worldserver.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zone/worldserver.cpp b/zone/worldserver.cpp index d9af83d87..d3e3ee289 100644 --- a/zone/worldserver.cpp +++ b/zone/worldserver.cpp @@ -1896,10 +1896,10 @@ bool WorldServer::SendChannelMessage(Client* from, const char* to, uint8 chan_nu bool WorldServer::SendEmoteMessage(const char* to, uint32 to_guilddbid, uint32 type, const char* message, ...) { va_list argptr; - char buffer[256]; + char buffer[4096] = { 0 }; va_start(argptr, message); - vsnprintf(buffer, 256, message, argptr); + vsnprintf(buffer, sizeof(buffer) - 1, message, argptr); va_end(argptr); return SendEmoteMessage(to, to_guilddbid, 0, type, buffer); @@ -1907,7 +1907,7 @@ bool WorldServer::SendEmoteMessage(const char* to, uint32 to_guilddbid, uint32 t bool WorldServer::SendEmoteMessage(const char* to, uint32 to_guilddbid, int16 to_minstatus, uint32 type, const char* message, ...) { va_list argptr; - char buffer[256] = { 0 }; + char buffer[4096] = { 0 }; va_start(argptr, message); vsnprintf(buffer, sizeof(buffer) - 1, message, argptr); From 2bf49be8555291d552ba25763e3e1d86a52d3cf0 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Wed, 1 Jul 2015 01:23:00 -0500 Subject: [PATCH 55/90] Fix an issue where emote messages would overflow the buffer of 256 by increasing the size and changing some of the initialization Added a custom Health Update message that will display in the middle of the players screen, to enable this server wide you must enable rule 'Character:MarqueeHPUpdates' (Haynar) Fixed some runspeed issues with Perl and LUA scripts (Haynar) Updated #showstats and #npcstats for new speed calcs to display speeds again in familiar float format. (Haynar) Improved client movement while AI Controlled, such as feared and charmed. Movement will be much smoother from clients perspective. --- changelog.txt | 7 +++++++ common/ruletypes.h | 1 + common/version.h | 2 +- utils/sql/db_update_manifest.txt | 1 + utils/sql/git/required/2015_7_1_Marquee_Rule.sql | 1 + zone/attack.cpp | 3 +++ zone/client.cpp | 13 +++++++++++++ zone/client.h | 3 +++ zone/mob.cpp | 3 +++ 9 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 utils/sql/git/required/2015_7_1_Marquee_Rule.sql diff --git a/changelog.txt b/changelog.txt index 6c42a23ca..887731565 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,12 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 7/1/2015 == +Akkadius: Fix an issue where emote messages would overflow the buffer of 256 by increasing the size and changing some of the initialization +Akkadius: Added a custom Health Update message that will display in the middle of the players screen, to enable this server wide you must enable rule 'Character:MarqueeHPUpdates' +Akkadius: (Haynar) Fixed some runspeed issues with Perl and LUA scripts +Akkadius: (Haynar) Updated #showstats and #npcstats for new speed calcs to display speeds again in familiar float format. +Akkadius: (Haynar) Improved client movement while AI Controlled, such as feared and charmed. Movement will be much smoother from clients perspective. + == 06/12/2015 == Uleat: Adjusted SessionStats to better reflect a sister implementation diff --git a/common/ruletypes.h b/common/ruletypes.h index 372224f2c..6aea84edf 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -114,6 +114,7 @@ RULE_INT(Character, TradeskillUpPottery, 4) // Pottery skillup rate adjust. Lowe RULE_INT(Character, TradeskillUpResearch, 1) // Research skillup rate adjust. Lower is faster. RULE_INT(Character, TradeskillUpTinkering, 2) // Tinkering skillup rate adjust. Lower is faster. RULE_BOOL(Character, SpamHPUpdates, false) // if your server has stupid amounts of HP that causes client display issues, turn this on! +RULE_BOOL(Character, MarqueeHPUpdates, false) // Will show Health % in center of screen < 100% RULE_CATEGORY_END() RULE_CATEGORY(Mercs) diff --git a/common/version.h b/common/version.h index 00f74e801..3631639d5 100644 --- a/common/version.h +++ b/common/version.h @@ -30,7 +30,7 @@ Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt */ -#define CURRENT_BINARY_DATABASE_VERSION 9084 +#define CURRENT_BINARY_DATABASE_VERSION 9085 #define COMPILE_DATE __DATE__ #define COMPILE_TIME __TIME__ #ifndef WIN32 diff --git a/utils/sql/db_update_manifest.txt b/utils/sql/db_update_manifest.txt index c2f8242c3..2e94567ad 100644 --- a/utils/sql/db_update_manifest.txt +++ b/utils/sql/db_update_manifest.txt @@ -338,6 +338,7 @@ 9082|2015_05_25_npc_types_texture_fields.sql|SHOW COLUMNS FROM `npc_types` LIKE 'armtexture'|empty| 9083|2015_06_07_aa_update.sql|SHOW COLUMNS FROM `character_alternate_abilities` LIKE 'charges'|empty| 9084|2015_06_30_runspeed_adjustments.sql|SELECT `runspeed` FROM `npc_types` WHERE `runspeed` > 3|not_empty| +9085|2015_7_1_Marquee_Rule.sql|SELECT * FROM `rule_values` WHERE `rule_name` LIKE '%Character:MarqueeHPUpdates%'|empty| # Upgrade conditions: diff --git a/utils/sql/git/required/2015_7_1_Marquee_Rule.sql b/utils/sql/git/required/2015_7_1_Marquee_Rule.sql new file mode 100644 index 000000000..039a34412 --- /dev/null +++ b/utils/sql/git/required/2015_7_1_Marquee_Rule.sql @@ -0,0 +1 @@ +INSERT INTO `rule_values` (`rule_name`, `rule_value`, `notes`) VALUES ('Character:MarqueeHPUpdates', 'false', 'Will show Health % in center of screen < 100%'); \ No newline at end of file diff --git a/zone/attack.cpp b/zone/attack.cpp index a810ccebb..921353dff 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -3582,6 +3582,9 @@ void Mob::CommonDamage(Mob* attacker, int32 &damage, const uint16 spell_id, cons //final damage has been determined. SetHP(GetHP() - damage); + + if (IsClient()) + this->CastToClient()->SendHPUpdateMarquee(); if(HasDied()) { bool IsSaved = false; diff --git a/zone/client.cpp b/zone/client.cpp index 7c73db5cc..ee9dfad22 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -8639,3 +8639,16 @@ void Client::QuestReward(Mob* target, uint32 copper, uint32 silver, uint32 gold, QueuePacket(outapp, false, Client::CLIENT_CONNECTED); safe_delete(outapp); } + +void Client::SendHPUpdateMarquee(){ + if (!RuleB(Character, MarqueeHPUpdates)) + return; + + /* Health Update Marquee Display: Custom*/ + uint32 health_percentage = (uint32)(this->cur_hp * 100 / this->max_hp); + if (health_percentage == 100) + return; + + std::string health_update_notification = StringFormat("Health: %u%%", health_percentage); + this->SendMarqueeMessage(15, 510, 0, 3000, 3000, health_update_notification); +} \ No newline at end of file diff --git a/zone/client.h b/zone/client.h index 4f31aee23..e70190ccc 100644 --- a/zone/client.h +++ b/zone/client.h @@ -1261,6 +1261,9 @@ public: void QuestReward(Mob* target, uint32 copper = 0, uint32 silver = 0, uint32 gold = 0, uint32 platinum = 0, uint32 itemid = 0, uint32 exp = 0, bool faction = false); void ResetHPUpdateTimer() { hpupdate_timer.Start(); } + + void SendHPUpdateMarquee(); + protected: friend class Mob; void CalcItemBonuses(StatBonuses* newbon); diff --git a/zone/mob.cpp b/zone/mob.cpp index ac5e37a8e..4c2966097 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -1357,6 +1357,9 @@ void Mob::SendHPUpdate(bool skip_self) bool dospam = RuleB(Character, SpamHPUpdates); // send to self - we need the actual hps here if(IsClient() && (!skip_self || dospam)) { + + this->CastToClient()->SendHPUpdateMarquee(); + EQApplicationPacket* hp_app2 = new EQApplicationPacket(OP_HPUpdate,sizeof(SpawnHPUpdate_Struct)); SpawnHPUpdate_Struct* ds = (SpawnHPUpdate_Struct*)hp_app2->pBuffer; ds->cur_hp = CastToClient()->GetHP() - itembonuses.HP; From da1167671b26efa0c1a26210636e38b2ce63a2a9 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Wed, 1 Jul 2015 01:25:56 -0500 Subject: [PATCH 56/90] changelog addition [skip ci] --- changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.txt b/changelog.txt index 887731565..eaaa6fb7a 100644 --- a/changelog.txt +++ b/changelog.txt @@ -3,6 +3,7 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) == 7/1/2015 == Akkadius: Fix an issue where emote messages would overflow the buffer of 256 by increasing the size and changing some of the initialization Akkadius: Added a custom Health Update message that will display in the middle of the players screen, to enable this server wide you must enable rule 'Character:MarqueeHPUpdates' + Example: https://www.youtube.com/watch?v=KUVdbPxLIn0 Akkadius: (Haynar) Fixed some runspeed issues with Perl and LUA scripts Akkadius: (Haynar) Updated #showstats and #npcstats for new speed calcs to display speeds again in familiar float format. Akkadius: (Haynar) Improved client movement while AI Controlled, such as feared and charmed. Movement will be much smoother from clients perspective. From 35991b68a0c021d21b665ff63ecfeecb2838358f Mon Sep 17 00:00:00 2001 From: KimLS Date: Thu, 2 Jul 2015 19:36:38 -0700 Subject: [PATCH 57/90] First sql, need to merge from master first before i finish. --- .../sql/git/required/2015_07_02_aa_rework.sql | 20659 ++++++++++++++++ 1 file changed, 20659 insertions(+) create mode 100644 utils/sql/git/required/2015_07_02_aa_rework.sql diff --git a/utils/sql/git/required/2015_07_02_aa_rework.sql b/utils/sql/git/required/2015_07_02_aa_rework.sql new file mode 100644 index 000000000..41a67f7c0 --- /dev/null +++ b/utils/sql/git/required/2015_07_02_aa_rework.sql @@ -0,0 +1,20659 @@ +DROP TABLE IF EXISTS `aa_ability`; +CREATE TABLE IF NOT EXISTS `aa_ability` ( + `id` int(10) unsigned NOT NULL, + `name` text NOT NULL, + `category` int(10) NOT NULL DEFAULT '-1', + `classes` int(10) NOT NULL DEFAULT '131070', + `races` int(10) NOT NULL DEFAULT '65535', + `drakkin_heritage` int(10) NOT NULL DEFAULT '127', + `deities` int(10) NOT NULL DEFAULT '131071', + `status` int(10) NOT NULL DEFAULT '0', + `type` int(10) NOT NULL DEFAULT '0', + `charges` int(11) NOT NULL DEFAULT '0', + `grant_only` tinyint(4) NOT NULL DEFAULT '0', + `first_rank_id` int(10) NOT NULL DEFAULT '-1', + `enabled` tinyint(3) unsigned NOT NULL DEFAULT '1', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +INSERT INTO `aa_ability` (`id`, `name`, `category`, `classes`, `races`, `drakkin_heritage`, `deities`, `status`, `type`, `charges`, `grant_only`, `first_rank_id`, `enabled`) VALUES + (0, 'Unknown AA -1', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 49999, 1), + (1, 'Innate Strength', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 2, 1), + (2, 'Innate Stamina', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 7, 1), + (3, 'Innate Agility', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 12, 1), + (4, 'Innate Dexterity', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 17, 1), + (5, 'Innate Intelligence', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 22, 1), + (6, 'Innate Wisdom', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 27, 1), + (7, 'Innate Charisma', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 32, 1), + (8, 'Innate Fire Protection', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 37, 1), + (9, 'Innate Cold Protection', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 42, 1), + (10, 'Innate Magic Protection', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 47, 1), + (11, 'Innate Poison Protection', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 52, 1), + (12, 'Innate Disease Protection', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 57, 1), + (13, 'Innate Run Speed', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 62, 1), + (15, 'Innate Metabolism', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 68, 1), + (16, 'Innate Lung Capacity', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 71, 1), + (17, 'First Aid', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 74, 1), + (18, 'Healing Adept', -1, 16942, 65535, 127, 131071, 0, 2, 0, 0, 77, 1), + (19, 'Healing Gift', -1, 16942, 65535, 127, 131071, 0, 2, 0, 0, 80, 1), + (20, 'Spell Casting Mastery', -1, 15906, 65535, 127, 131071, 0, 2, 0, 0, 83, 1), + (21, 'Spell Casting Reinforcement', -1, 25150, 65535, 127, 131071, 0, 2, 0, 0, 86, 1), + (23, 'Spell Casting Fury', -1, 32446, 65535, 127, 131071, 0, 2, 0, 0, 92, 1), + (25, 'Spell Casting Subtlety', -1, 15360, 65535, 127, 131071, 0, 2, 0, 0, 98, 1), + (26, 'Spell Casting Expertise', -1, 15504, 65535, 127, 131071, 0, 2, 0, 0, 101, 1), + (27, 'Spell Casting Deftness', -1, 7184, 65535, 127, 131071, 0, 2, 0, 0, 104, 1), + (28, 'Natural Durability', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 107, 1), + (29, 'Natural Healing', -1, 49629, 65535, 127, 131071, 0, 2, 0, 0, 110, 1), + (30, 'Combat Fury', -1, 16596, 65535, 127, 131071, 0, 2, 0, 0, 113, 1), + (31, 'Fear Resistance', -1, 49629, 65535, 127, 131071, 0, 2, 0, 0, 116, 1), + (32, 'Finishing Blow', -1, 49629, 65535, 127, 131071, 0, 2, 0, 0, 119, 1), + (33, 'Combat Stability', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 122, 1), + (34, 'Combat Agility', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 125, 1), + (35, 'Mass Group Buff', -1, 30254, 65535, 127, 131071, 0, 3, 0, 0, 128, 1), + (36, 'Divine Resurrection', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 129, 1), + (37, 'Innate Invis to Undead', -1, 1026, 65535, 127, 131071, 0, 3, 0, 0, 130, 1), + (38, 'Celestial Regeneration', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 131, 1), + (39, 'Bestow Divine Aura', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 132, 1), + (41, 'Purify Soul', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 136, 1), + (42, 'Quick Evacuation', -1, 2080, 65535, 127, 131071, 0, 3, 0, 0, 137, 1), + (43, 'Exodus', -1, 2080, 65535, 127, 131071, 0, 3, 0, 0, 140, 1), + (44, 'Quick Damage', -1, 6176, 65535, 127, 131071, 0, 3, 0, 0, 141, 1), + (45, 'Enhanced Root', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 144, 1), + (46, 'Dire Charm', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 145, 1), + (47, 'Cannibalization', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 146, 1), + (48, 'Quick Buff', -1, 25134, 65535, 127, 131071, 0, 2, 0, 0, 147, 1), + (49, 'Alchemy Mastery', 6, 512, 65535, 127, 131071, 0, 1, 0, 0, 150, 1), + (50, 'Rabid Bear', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 153, 1), + (52, 'Improved Familiar', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 155, 1), + (53, 'Nexus Gate', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 156, 1), + (55, 'Permanent Illusion', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 158, 1), + (56, 'Jewel Craft Mastery', 6, 8192, 65535, 127, 131071, 0, 1, 0, 0, 159, 1), + (57, 'Gather Mana', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 162, 1), + (58, 'Mend Companion', -1, 21504, 65535, 127, 131071, 0, 3, 0, 0, 163, 1), + (60, 'Frenzied Burnout', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 167, 1), + (61, 'Elemental Form: Fire', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 168, 1), + (62, 'Elemental Form: Water', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 171, 1), + (63, 'Elemental Form: Earth', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 174, 1), + (64, 'Elemental Form: Air', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 177, 1), + (67, 'Elemental Pact', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 182, 1), + (68, 'Life Burn', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 183, 1), + (69, 'Dead Mesmerization', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 184, 1), + (70, 'Fear Storm', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 185, 1), + (71, 'Flesh to Bone', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 186, 1), + (72, 'Call to Corpse', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 187, 1), + (73, 'Divine Stun', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 188, 1), + (75, 'Slay Undead', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 190, 1), + (76, 'Act of Valor', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 193, 1), + (77, 'Holy Steed', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 194, 1), + (78, 'Fearless', -1, 20, 65535, 127, 131071, 0, 3, 0, 0, 195, 1), + (79, '2 Hand Bash', -1, 20, 65535, 127, 131071, 0, 3, 0, 0, 196, 1), + (80, 'Innate Camouflage', -1, 40, 65535, 127, 131071, 0, 3, 0, 0, 197, 1), + (81, 'Ambidexterity', -1, 16841, 65535, 127, 131071, 0, 3, 0, 0, 198, 1), + (82, 'Archery Mastery', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 199, 1), + (84, 'Endless Quiver', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 205, 1), + (85, 'Unholy Steed', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 206, 1), + (87, 'Leech Touch', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 208, 1), + (89, 'Soul Abrasion', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 210, 1), + (90, 'Instrument Mastery', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 213, 1), + (94, 'Jam Fest', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 225, 1), + (97, 'Critical Mend', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 230, 1), + (98, 'Purify Body', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 233, 1), + (100, 'Rapid Feign', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 237, 1), + (101, 'Return Kick', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 240, 1), + (102, 'Escape', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 243, 1), + (103, 'Poison Mastery', 6, 256, 65535, 127, 131071, 0, 1, 0, 0, 244, 1), + (104, 'Double Riposte', -1, 49501, 65535, 127, 131071, 0, 2, 0, 0, 247, 1), + (107, 'Purge Poison', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 254, 1), + (108, 'Flurry', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 255, 1), + (109, 'Rampage', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 258, 1), + (110, 'Area Taunt', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 259, 1), + (111, 'War Cry', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 260, 1), + (112, 'Bandage Wound', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 263, 1), + (114, 'Spell Casting Fury Mastery', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 267, 1), + (116, 'Dragon Punch', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 273, 1), + (117, 'Strong Root', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 274, 1), + (118, 'Singing Mastery', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 275, 1), + (119, 'Body and Mind Rejuvenation', -1, 16540, 65535, 127, 131071, 0, 3, 0, 0, 278, 1), + (120, 'Physical Enhancement', -1, 49629, 65535, 127, 131071, 0, 3, 0, 0, 279, 1), + (121, 'Adv. Trap Negotiation', -1, 384, 65535, 127, 131071, 0, 3, 0, 0, 280, 1), + (122, 'Acrobatics', -1, 448, 65535, 127, 131071, 0, 3, 0, 0, 283, 1), + (123, 'Scribble Notes', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 286, 1), + (124, 'Chaotic Stab', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 287, 1), + (125, 'Pet Discipline', -1, 22032, 65535, 127, 131071, 0, 3, 0, 0, 288, 1), + (126, 'Hobble of Spirits', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 289, 1), + (127, 'Frenzy of Spirit', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 290, 1), + (128, 'Paragon of Spirit', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 291, 1), + (129, 'Chains of Purity', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 10348, 1), + (130, 'Resplendent Glory', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 8300, 1), + (131, 'Rage of Rallos Zek', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 8303, 1), + (132, 'Enhanced Area Taunt', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 8312, 1), + (133, 'Decapitation', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 14200, 1), + (134, 'Hastened Berserking Disciplines', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 14203, 1), + (135, 'Quiet Miracle', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 14206, 1), + (136, 'Repel the Wicked', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 14207, 1), + (137, 'Beacon of Life', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 14208, 1), + (138, 'Blessed Chains', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 14209, 1), + (139, 'Hastened Focused Celestial Regeneration', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 14213, 1), + (140, 'Quickened Spirit Calling', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 14225, 1), + (141, 'New Tanaan Crafting Mastery', 6, 65535, 65535, 127, 131071, 0, 1, 0, 0, 412, 1), + (142, 'Planar Power', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 418, 1), + (143, 'Planar Durability', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 423, 1), + (144, 'Innate Enlightenment', -1, 15360, 65535, 127, 131071, 0, 2, 0, 0, 426, 1), + (146, 'Unknown AA 8001', 9, 65535, 65535, 127, 131071, 0, 1, 0, 0, 8000, 0), + (147, 'Spiritual Rebuke', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 14231, 1), + (148, 'Pathosis', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 14232, 1), + (149, 'Preincarnation', -1, 544, 65535, 127, 131071, 0, 3, 0, 0, 14233, 1), + (150, 'Mastery of the Past', -1, 15504, 65535, 127, 131071, 0, 2, 0, 0, 446, 1), + (151, 'Spiritual Blessing', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 14234, 1), + (152, 'Communion of the Cheetah', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 14237, 1), + (153, 'Radiant Cure', -1, 546, 65535, 127, 131071, 0, 2, 0, 0, 459, 1), + (154, 'Hastened Divinity', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 462, 1), + (156, 'Hastened Purification of the Soul', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 468, 1), + (157, 'Hastened Gathering', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 471, 1), + (158, 'Hastened Rabidity', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 474, 1), + (159, 'Hastened Exodus', -1, 2080, 65535, 127, 131071, 0, 3, 0, 0, 477, 1), + (160, 'Hastened Root', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 480, 1), + (161, 'Hastened Mending', -1, 21504, 65535, 127, 131071, 0, 3, 0, 0, 483, 1), + (163, 'Hastened Instigation', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 489, 1), + (164, 'Hastened Rampage', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 492, 1), + (165, 'Hastened Purification of the Body', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 495, 1), + (166, 'Hasty Exit', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 498, 1), + (167, 'Hastened Purification', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 501, 1), + (168, 'Hastened Nature\'s Fury', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 14241, 1), + (169, 'Divine Arbitration', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 507, 1), + (170, 'Wrath of the Wild', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 510, 1), + (171, 'Virulent Paralysis', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 513, 1), + (172, 'Harvest of Druzzil', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 516, 1), + (173, 'Eldritch Rune', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 517, 1), + (174, 'Servant of Ro', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 520, 1), + (175, 'Wake the Dead', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 523, 1), + (176, 'Suspended Minion', -1, 30224, 65535, 127, 131071, 0, 2, 0, 0, 526, 1), + (177, 'Spirit Call', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 528, 1), + (178, 'Wrath of the Forest Walker', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 14244, 1), + (179, 'Gift of Sylvan Spirits', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 14249, 1), + (180, 'Hand of Piety', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 534, 1), + (181, 'Mithaniel\'s Binding', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 537, 1), + (182, 'Summon Personal Tribute Master', 5, 65535, 65535, 127, 131071, 0, 4, 0, 1, 5006, 1), + (183, 'Extended Vinelash Cascade', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 14254, 1), + (184, 'Guardian of the Forest', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 545, 1), + (185, 'Spirit of the Wood', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 548, 1), + (186, 'Bestial Frenzy', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 551, 1), + (187, 'Harmonious Attack', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 556, 1), + (188, 'Knight\'s Advantage', -1, 20, 65535, 127, 131071, 0, 3, 0, 0, 561, 1), + (189, 'Ferocity', -1, 33097, 65535, 127, 131071, 0, 2, 0, 0, 564, 1), + (190, 'Viscid Roots', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 567, 1), + (193, 'Feigned Minion', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 574, 1), + (194, 'Unfailing Divinity', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 577, 1), + (195, 'Animation Empathy', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 580, 1), + (196, 'Rush to Judgment', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 583, 1), + (197, 'Living Shield', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 586, 1), + (198, 'Consumption of the Soul', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 589, 1), + (199, 'Boastful Bellow', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 592, 1), + (200, 'Fervent Blessing', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 593, 1), + (201, 'Touch of the Wicked', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 596, 1), + (202, 'Punishing Blade', -1, 32841, 65535, 127, 131071, 0, 2, 0, 0, 599, 1), + (203, 'Speed of the Knight', -1, 20, 65535, 127, 131071, 0, 3, 0, 0, 602, 1), + (204, 'Shroud of Stealth', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 605, 1), + (205, 'Nimble Evasion', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 606, 1), + (206, 'Technique of Master Wu', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 611, 1), + (207, 'Host of the Elements', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 616, 1), + (208, 'Call of Xuzl', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 619, 1), + (209, 'Hastened Stealth', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 622, 1), + (210, 'Ingenuity', -1, 33089, 65535, 127, 131071, 0, 2, 0, 0, 625, 1), + (211, 'Fleet of Foot', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 628, 1), + (212, 'Fading Memories', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 630, 1), + (213, 'Tactical Mastery', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 631, 1), + (214, 'Theft of Life', -1, 1040, 65535, 127, 131071, 0, 3, 0, 0, 634, 1), + (215, 'Fury of Magic', -1, 13858, 65535, 127, 131071, 0, 2, 0, 0, 637, 1), + (216, 'Extended Spirit of the Bear', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 14259, 1), + (217, 'Project Illusion', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 643, 1), + (218, 'Headshot', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 644, 1), + (219, 'Entrap', -1, 40, 65535, 127, 131071, 0, 3, 0, 0, 645, 1), + (220, 'Sonic Displacement', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 13528, 1), + (221, 'Total Domination', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 649, 1), + (222, 'Stalwart Endurance', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 652, 1), + (223, 'Quick Summoning', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 655, 1), + (224, 'Mental Clarity', -1, 32446, 65535, 127, 131071, 0, 2, 0, 0, 658, 1), + (225, 'Innate Regeneration', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 661, 1), + (227, 'Extended Notes', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 665, 1), + (228, 'Hastened Warder\'s Gift', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 13463, 1), + (229, 'Improved Reclaim Energy', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 671, 1), + (230, 'Hastened Possum', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 13449, 1), + (231, 'Shauri\'s Sonorious Clouding', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 13527, 1), + (232, 'Veil of the Underbrush', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 14262, 1), + (233, 'Packrat', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 678, 1), + (234, 'Heightened Endurance ', -1, 33089, 65535, 127, 131071, 0, 2, 0, 0, 683, 1), + (235, 'Weapon Affinity', -1, 49629, 65535, 127, 131071, 0, 2, 0, 0, 686, 1), + (236, 'Secondary Forte', -1, 15906, 65535, 127, 131071, 0, 2, 0, 0, 691, 1), + (237, 'Persistent Casting', -1, 32446, 65535, 127, 131071, 0, 2, 0, 0, 692, 1), + (238, 'Tune of Pursuance', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 695, 1), + (239, 'Hastened Companion\'s Sacrifice', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 13474, 1), + (240, 'Cheetah\'s Pounce', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 13483, 1), + (241, 'Bloodlust', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 13484, 1), + (242, 'Primal Fury', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 13485, 1), + (244, 'Lure of the Siren\'s Song', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 13529, 1), + (245, 'Bestial Alignment', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 718, 1), + (246, 'Hidden Communion of the Cheetah', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 14265, 1), + (247, 'Feral Swipe', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 723, 1), + (248, 'Warder\'s Fury', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 724, 1), + (249, 'Warder\'s Alacrity', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 729, 1), + (250, 'Pet Affinity', -1, 30224, 65535, 127, 131071, 0, 2, 0, 0, 734, 1), + (251, 'Mastery of the Past', -1, 16942, 65535, 127, 131071, 0, 2, 0, 0, 735, 1), + (252, 'Spell Casting Subtlety', -1, 546, 65535, 127, 131071, 0, 2, 0, 0, 738, 1), + (254, 'Divine Avatar', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 746, 1), + (255, 'Exquisite Benediction', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 749, 1), + (256, 'Hastened Curing', -1, 546, 65535, 127, 131071, 0, 2, 0, 0, 754, 1), + (257, 'Nature\'s Boon', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 757, 1), + (258, 'Advanced Tracking', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 762, 1), + (259, 'Critical Affliction', -1, 18104, 65535, 127, 131071, 0, 2, 0, 0, 767, 1), + (260, 'Glacial Arrow', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 13549, 1), + (261, 'Doppelganger', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 773, 1), + (262, 'Enhanced Forgetfulness', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 776, 1), + (263, 'Mesmerization Mastery', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 781, 1), + (264, 'Quick Mass Group Buff', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 782, 1), + (265, 'Shared Health', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 785, 1), + (266, 'Elemental Fury', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 790, 1), + (267, 'Elemental Alacrity ', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 795, 1), + (268, 'Elemental Agility', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 800, 1), + (269, 'Elemental Durability', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 803, 1), + (270, 'Sinister Strikes', -1, 16841, 65535, 127, 131071, 0, 3, 0, 0, 806, 1), + (271, 'Strikethrough', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 807, 1), + (272, 'Stonewall', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 810, 1), + (273, 'Rapid Strikes ', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 815, 1), + (274, 'Kick Mastery', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 820, 1), + (275, 'Heightened Awareness', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 823, 1), + (276, 'Destructive Force ', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 828, 1), + (278, 'Death\'s Fury ', -1, 1040, 65535, 127, 131071, 0, 3, 0, 0, 834, 1), + (279, 'Quickening of Death ', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 839, 1), + (280, 'Group Perfected Invisibility to Undead', -1, 14336, 65535, 127, 131071, 0, 3, 0, 0, 14281, 1), + (281, 'Triple Backstab', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 846, 1), + (282, 'Hastened Piety', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 849, 1), + (283, 'Immobilizing Bash', -1, 20, 65535, 127, 131071, 0, 3, 0, 0, 852, 1), + (284, 'Vicious Smash', -1, 20, 65535, 127, 131071, 0, 3, 0, 0, 855, 1), + (285, 'Radiant Cure', -1, 4, 65535, 127, 131071, 0, 2, 0, 0, 860, 1), + (286, 'Purification ', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 863, 1), + (287, 'Precision of the Pathfinder', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 864, 1), + (288, 'Coat of Thistles', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 867, 1), + (289, 'Flaming Arrows', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 872, 1), + (290, 'Frost Arrows', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 875, 1), + (291, 'Perfected Invisibility to Undead', -1, 14336, 65535, 127, 131071, 0, 3, 0, 0, 14282, 1), + (292, 'Trap Circumvention ', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 881, 1), + (293, 'Quickened Stasis', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 14283, 1), + (294, 'Virulent Venom ', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 888, 1), + (295, 'Extended Dreary Deeds', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 14286, 1), + (296, 'Intense Hatred', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 895, 1), + (297, 'Quickened Frenzied Burnout', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 14289, 1), + (299, 'Sturdiness', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 907, 1), + (300, 'Warlord\'s Tenacity ', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 912, 1), + (301, 'Strengthened Strike', -1, 9, 65535, 127, 131071, 0, 3, 0, 0, 915, 1), + (302, 'Extended Shielding', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 918, 1), + (303, 'Ro\'s Flaming Familiar ', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 921, 1), + (304, 'E\'ci\'s Icy Familiar ', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 922, 1), + (305, 'Druzzil\'s Mystical Familiar ', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 923, 1), + (306, 'Unknown AA 15819', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 15819, 1), + (307, 'Ward of Destruction ', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 926, 1), + (308, 'Frenzied Devastation', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 931, 1), + (309, 'Combat Fury', -1, 32769, 65535, 127, 131071, 0, 2, 0, 0, 934, 1), + (310, 'Combat Fury', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 937, 1), + (311, 'Combat Fury', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 940, 1), + (312, 'Quickened Host of the Elements', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 14292, 1), + (313, 'Hastened Companion\'s Relocation', -1, 30224, 65535, 127, 131071, 0, 3, 0, 0, 14295, 1), + (314, 'Veteran\'s Wrath', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 1047, 1), + (315, 'Planar Durability', -1, 32788, 65535, 127, 131071, 0, 3, 0, 0, 952, 1), + (316, 'Innate Enlightenment', -1, 546, 65535, 127, 131071, 0, 2, 0, 0, 955, 1), + (317, 'Dire Charm', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 960, 1), + (318, 'Dire Charm', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 961, 1), + (319, 'Touch of the Divine', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 962, 1), + (320, 'Swarm of Decay', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 967, 1), + (321, 'Call of the Ancients', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 970, 1), + (322, 'Innate See Invis', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 1388, 1), + (323, 'Virulent Talon', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 14307, 1), + (324, 'Blacksmithing Mastery', 6, 65535, 65535, 127, 131071, 0, 1, 0, 0, 979, 1), + (325, 'Baking Mastery', 6, 65535, 65535, 127, 131071, 0, 1, 0, 0, 982, 1), + (326, 'Brewing Mastery', 6, 65535, 65535, 127, 131071, 0, 1, 0, 0, 985, 1), + (327, 'Fletching Mastery', 6, 65535, 65535, 127, 131071, 0, 1, 0, 0, 988, 1), + (328, 'Pottery Mastery', 6, 65535, 65535, 127, 131071, 0, 1, 0, 0, 991, 1), + (329, 'Tailoring Mastery', 6, 65535, 65535, 127, 131071, 0, 1, 0, 0, 994, 1), + (330, 'Salvage', 6, 65535, 65535, 127, 131071, 0, 1, 0, 0, 997, 1), + (331, 'Origin', 9, 65535, 65535, 127, 131071, 0, 1, 0, 0, 1000, 1), + (333, 'Discordant Defiance', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 1006, 1), + (334, 'Mystical Attuning', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 1021, 1), + (335, 'Delay Death', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 1026, 1), + (336, 'Earthen Brawn', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 8263, 1), + (337, 'Unknown AA 15798', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 15798, 1), + (338, 'Veteran\'s Wrath', -1, 16596, 65535, 127, 131071, 0, 2, 0, 0, 1041, 1), + (339, 'Veteran\'s Wrath', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 1044, 1), + (340, 'Unknown AA 15833', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 15833, 1), + (341, 'Veteran\'s Wrath', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 1050, 1), + (342, 'Staff Block', -1, 15360, 65535, 127, 131071, 0, 2, 0, 0, 14301, 1), + (343, 'Hastened Pestilent Paralysis', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 14308, 1), + (344, 'Hastened Mercurial Torment', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 14311, 1), + (345, 'Unknown AA 15768', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 15768, 1), + (346, 'Unknown AA 15771', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 15771, 1), + (347, 'Mnemonic Retention', -1, 32446, 65535, 127, 131071, 0, 2, 0, 0, 1071, 1), + (348, 'Expansive Mind', -1, 32446, 65535, 127, 131071, 0, 2, 0, 0, 1072, 1), + (350, 'Death\'s Malaise', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 14321, 1), + (351, 'Dying Grasp', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 14322, 1), + (352, 'Arcane Tongues', 6, 15360, 65535, 127, 131071, 0, 2, 0, 0, 1089, 1), + (353, 'Master of Disguise', -1, 384, 65535, 127, 131071, 0, 3, 0, 0, 1092, 1), + (354, 'Slippery Attacks', -1, 16841, 65535, 127, 131071, 0, 2, 0, 0, 1093, 1), + (355, 'Unknown AA 15836', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 15836, 1), + (357, 'Unknown AA 16176', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 16176, 1), + (358, 'Fury of Magic', -1, 16540, 65535, 127, 131071, 0, 2, 0, 0, 1107, 1), + (359, 'Dance of Blades', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 1110, 1), + (360, 'Bloodthirsty Blade', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 13616, 1), + (361, 'Shield of Notes', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 1116, 1), + (362, 'Roar of Thunder', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 1119, 1), + (363, 'Unknown AA 16179', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 16179, 1), + (364, 'Persistent Minion', -1, 30224, 65535, 127, 131071, 0, 2, 0, 0, 1122, 1), + (365, 'A Hole In Space', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 14323, 1), + (366, 'Advanced Pet Discipline', -1, 22032, 65535, 127, 131071, 0, 3, 0, 0, 1129, 1), + (367, 'Throwing Mastery', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 1131, 1), + (368, 'Blur of Axes', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 1134, 1), + (369, 'Hastened War Cry', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 1137, 1), + (370, 'Dead Aim', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 1140, 1), + (371, 'Frenzied Defense', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 1166, 1), + (372, 'Tireless Sprint', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 1146, 1), + (373, 'Desperation', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 1149, 1), + (374, 'Untamed Rage', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 1150, 1), + (375, 'Echoing Cries', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 1155, 1), + (376, 'Distant Strike', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 14372, 1), + (377, 'Earthen Stability', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 8268, 1), + (378, 'Earthen Alacrity', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 8273, 1), + (379, 'Earthen Artistry', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 8278, 1), + (380, 'Earthen Sagacity', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 8283, 1), + (381, 'Earthen Brilliance', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 8288, 1), + (382, 'Earthen Allure', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 8293, 1), + (383, 'Extended Spirit of the Wood', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 12646, 1), + (384, 'Spirit of the Bear', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 12651, 1), + (385, 'Twinheal', -1, 16942, 65535, 127, 131071, 0, 2, 0, 0, 12652, 1), + (386, 'Nature\'s Fury', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 12661, 1), + (387, 'Blood Pact', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 1178, 1), + (388, 'Shielding Resistance', -1, 16841, 65535, 127, 131071, 0, 2, 0, 0, 1181, 1), + (389, 'Healing Boon', -1, 518, 65535, 127, 131071, 0, 2, 0, 0, 1186, 1), + (390, 'Elemental Union', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 13695, 1), + (391, 'Celestial Hammer', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 1192, 1), + (392, 'Divine Retribution', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 1195, 1), + (393, 'Nature\'s Blessing', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 12655, 1), + (394, 'Extended Convergence of Spirit', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 12645, 1), + (395, 'Hastened Storm Strike', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 12664, 1), + (396, 'Sanctuary', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 1209, 1), + (397, 'Destructive Fury', -1, 2048, 65535, 127, 131071, 0, 2, 0, 0, 1210, 1), + (398, 'Destructive Fury', -1, 13858, 65535, 127, 131071, 0, 2, 0, 0, 1213, 1), + (399, 'Unknown AA 16180', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 16180, 1), + (400, 'Hastened Improved Twincast', -1, 14370, 65535, 127, 131071, 0, 3, 0, 0, 14331, 1), + (401, 'Extended Heel of Kanji', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 12688, 1), + (402, 'Extended Scaledfist', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 12691, 1), + (403, 'Paralytic Spores', -1, 544, 65535, 127, 131071, 0, 3, 0, 0, 14264, 1), + (404, 'Call of the Wild', -1, 544, 65535, 127, 131071, 0, 3, 0, 0, 1228, 1), + (405, 'Secondary Recall', -1, 2080, 65535, 127, 131071, 0, 3, 0, 0, 1229, 1), + (406, 'Nature\'s Bounty', -1, 40, 65535, 127, 131071, 0, 3, 0, 0, 1230, 1), + (407, 'Extended Speed Focus', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 7884, 1), + (408, 'Extended Crystalpalm', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 7885, 1), + (409, 'Stasis', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 1233, 1), + (410, 'Fists of Steel', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 12706, 1), + (411, 'Extended Deftdance', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 12709, 1), + (412, 'Color Shock', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 1239, 1), + (413, 'Mind Over Matter', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 1242, 1), + (414, 'Soothing Words', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 1245, 1), + (415, 'Hastened Deftdance', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 12710, 1), + (416, 'Hastened Lyre Leap', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 12713, 1), + (417, 'Hastened Quick Time', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 12716, 1), + (418, 'Replenish Companion', -1, 21504, 65535, 127, 131071, 0, 3, 0, 0, 1126, 1), + (419, 'Extended Quick Time', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 12719, 1), + (420, 'Imitate Death', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 1255, 1), + (424, 'Extended Fierce Eye', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 12720, 1), + (425, 'Hastened Fierce Eye', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 12721, 1), + (426, 'Unknown AA 15904', -1, 2080, 65535, 127, 131071, 0, 3, 0, 0, 15904, 1), + (427, 'Resounding Dirge', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 12737, 1), + (428, 'Death Peace', -1, 1040, 65535, 127, 131071, 0, 3, 0, 0, 1272, 1), + (429, 'Unknown AA 15908', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 15908, 1), + (430, 'Mercurial Torment', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 12766, 1), + (431, 'Pestilent Paralysis', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 12770, 1), + (432, 'Hastened Divine Companion Aura', -1, 30224, 65535, 127, 131071, 0, 3, 0, 0, 12773, 1), + (433, 'Embalmer\'s Carapace', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 12778, 1), + (434, 'Steadfast Will', -1, 20, 65535, 127, 131071, 0, 3, 0, 0, 1284, 1), + (435, 'Shield Block', -1, 21, 65535, 127, 131071, 0, 2, 0, 0, 1287, 1), + (436, 'Hastened Encroaching Darkness', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 12779, 1), + (437, 'Tracking Mastery', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 1296, 1), + (438, 'Expanding Darkness', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 12782, 1), + (439, 'Precision', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 1304, 1), + (440, 'Nerves of Steel', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 1307, 1), + (441, 'Aegis of Kildrukaun', -1, 5120, 65535, 127, 131071, 0, 3, 0, 0, 12785, 1), + (442, 'Touch of the Cursed', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 1313, 1), + (443, 'Bestial Bloodrage', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 12804, 1), + (444, 'Companion\'s Sacrifice', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 12807, 1), + (445, 'Shield Block', -1, 16384, 65535, 127, 131071, 0, 2, 0, 0, 12813, 1), + (446, 'Spiritual Channeling', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 1323, 1), + (447, 'Ancestral Aid', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 1327, 1), + (448, 'Extended Feralgia', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 12816, 1), + (450, 'Hastened Protective Spirit', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 12819, 1), + (451, 'Mind Crash', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 1334, 1), + (452, 'Prolonged Destruction', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 1337, 1), + (453, 'Summon Permutation Peddler', 5, 65535, 65535, 127, 131071, 0, 4, 0, 1, 9032, 1), + (454, 'Hastened Empathic Fury', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 12822, 1), + (455, 'Convergence of Spirits', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 13556, 1), + (456, 'Teleport Bind', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 1343, 1), + (457, 'Quickened Paragon of Spirit', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 12831, 1), + (458, 'Warder\'s Gift', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 12837, 1), + (459, 'Gelid Rending', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 12846, 1), + (460, 'Quickened Nature\'s Salve', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 12849, 1), + (462, 'Auspice of the Hunter', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 1345, 1), + (463, 'Divine Guardian', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 13385, 1), + (464, 'Divine Peace', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 13388, 1), + (465, 'Savage Spirit', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 1348, 1), + (466, 'Trials of Mata Muram', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1011, 1), + (467, 'Press the Attack', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 1351, 1), + (468, 'Crippling Strike', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 1352, 1), + (469, 'Stunning Kick', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 1355, 1), + (470, 'Eye Gouge', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 1358, 1), + (471, 'Gift of the Dark Reign', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1361, 1), + (472, 'Tenacity of the Dark Reign', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1362, 1), + (473, 'Embrace of the Dark Reign', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1363, 1), + (474, 'Power of the Dark Reign', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1364, 1), + (475, 'Fervor of the Dark Reign', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1365, 1), + (476, 'Gift of the Keepers', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1366, 1), + (477, 'Valor of the Keepers', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1367, 1), + (478, 'Embrace of the Keepers', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1368, 1), + (479, 'Power of the Keepers', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1369, 1), + (480, 'Sanctity of the Keepers', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1370, 1), + (481, 'Lesson of the Devoted', 5, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1371, 1), + (482, 'Infusion of the Faithful', 5, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1372, 1), + (483, 'Chaotic Jester', 5, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1373, 1), + (484, 'Expedient Recovery', 5, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1374, 1), + (485, 'Steadfast Servant', 5, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1375, 1), + (486, 'Staunch Recovery', 5, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1376, 1), + (487, 'Intensity of the Resolute', 5, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1377, 1), + (488, 'Curse of Blood', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1378, 1), + (489, 'Yaulp', -1, 6, 65535, 127, 131071, 0, 3, 0, 0, 13389, 1), + (490, 'Abscond', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 12864, 1), + (491, 'Atol\'s Unresistable Shackles', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 12865, 1), + (492, 'Dimensional Shield', -1, 14336, 65535, 127, 131071, 0, 3, 0, 0, 12866, 1), + (493, 'Improved Sustained Destruction', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 12867, 1), + (494, 'Silent Casting', -1, 546, 65535, 127, 131071, 0, 2, 0, 0, 1409, 1), + (495, 'Gift of Mana', -1, 15906, 65535, 127, 131071, 0, 2, 0, 0, 1435, 1), + (496, 'Field Dressing', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 1611, 1), + (497, 'Bandage Wounds', -1, 32766, 65535, 127, 131071, 0, 1, 0, 0, 1420, 1), + (498, 'Enhanced Aggression', -1, 49629, 65535, 127, 131071, 0, 2, 0, 0, 1592, 1), + (499, 'Cascading Rage', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 1425, 1), + (500, 'Silent Casting', -1, 15360, 65535, 127, 131071, 0, 2, 0, 0, 1404, 1), + (501, 'E\'ci\'s Icy Blessing', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 12886, 1), + (503, 'Hastened Thunder', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 1471, 1), + (504, 'Conservation', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 1453, 1), + (505, 'Cry of Battle', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 1458, 1), + (506, 'Ward of Purity', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 1459, 1), + (507, 'Ro\'s Fiery Blessing', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 12887, 1), + (508, 'Druzzil\'s Mystical Blessing', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 12888, 1), + (509, 'Kerafyrm\'s Favor', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 12889, 1), + (510, 'Kerafyrm\'s Prismatic Familiar', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 12892, 1), + (511, 'Throne of Heroes', 5, 65535, 65535, 127, 131071, 0, 4, 0, 1, 4665, 1), + (512, 'Translocational Anchor', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 1630, 1), + (513, 'Hastened Phantasmal Opponent', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 12894, 1), + (514, 'Pyromancy', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 1478, 1), + (515, 'Improved Twincast', -1, 14370, 65535, 127, 131071, 0, 3, 0, 0, 12893, 1), + (516, 'Abundant Healing', -1, 546, 65535, 127, 131071, 0, 2, 0, 0, 1486, 1), + (517, 'Hastened First Spire of Enchantment', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 12902, 1), + (518, 'Shared Camouflage', -1, 40, 65535, 127, 131071, 0, 3, 0, 0, 1494, 1), + (519, 'Convergence of Spirits', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 1495, 1), + (520, 'Nature\'s Guardian', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 1498, 1), + (521, 'Edict of Command', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 1501, 1), + (522, 'Extended Burnout', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 1504, 1), + (523, 'Hastened Second Spire of Enchantment', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 12907, 1), + (524, 'Blood Magic', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 1510, 1), + (525, 'Graverobbing', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 1511, 1), + (526, 'Affliction Mastery', -1, 1568, 65535, 127, 131071, 0, 3, 0, 0, 1514, 1), + (527, 'Hastened Third Spire of Enchantment', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 12912, 1), + (528, 'Ancestral Guard', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 1520, 1), + (529, 'Cloak of Light', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 1523, 1), + (530, 'Profound Visage', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 12920, 1), + (531, 'Cloak of Shadows', -1, 1040, 65535, 127, 131071, 0, 3, 0, 0, 1527, 1), + (532, 'Willful Death', -1, 1040, 65535, 127, 131071, 0, 3, 0, 0, 1528, 1), + (533, 'Unknown AA 16016', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 16016, 1), + (534, 'Calculated Insanity', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 12931, 1), + (535, 'Crippling Aurora', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 12937, 1), + (536, 'Appraisal', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 1542, 1), + (537, 'Precise Strikes', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 1543, 1), + (538, 'Hastened Death', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 1546, 1), + (539, 'Unflinching Resolve', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 1549, 1), + (540, 'Weightless Steps', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 1552, 1), + (541, 'Hastened Blades', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 1555, 1), + (542, 'Unknown AA 16071', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 16071, 1), + (543, 'Diminutive Companion', -1, 20480, 65535, 127, 131071, 0, 3, 0, 0, 12941, 1), + (544, 'Song of Stone', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 1569, 1), + (545, 'Deep Sleep', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 1572, 1), + (546, 'Companion\'s Gift', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 1577, 1), + (547, 'Unknown AA 16081', -1, 15360, 65535, 127, 131071, 0, 3, 0, 0, 16081, 1), + (548, 'Hastened Defiance', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 1583, 1), + (549, 'Dauntless Perseverance', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 1591, 1), + (550, 'Steadfast Resolve', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 14275, 1), + (551, 'Hastened Mind Crash', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 1414, 1), + (552, 'Call of Challenge', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 1597, 1), + (553, 'Cacophony', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 1598, 1), + (554, 'Hastened Nightmare Stasis', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 14341, 1), + (555, 'Anatomy', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 1604, 1), + (556, 'Scintillating Beam', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 14346, 1), + (557, 'Trick Shot', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 1608, 1), + (558, 'Turn Undead', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 1383, 1), + (559, 'Turn Summoned', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 1462, 1), + (560, 'Selo\'s Enduring Cadence', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 1627, 1), + (561, 'Hastened Harvest of Druzzil', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 12881, 1), + (562, 'Lightning Strikes', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 1616, 1), + (563, 'Concentration', -1, 33089, 65535, 127, 131071, 0, 2, 0, 0, 1588, 1), + (565, 'Mana Burn', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 1638, 1), + (567, 'Unknown AA 16146', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 16146, 1), + (568, 'Thief\'s Intuition', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 1641, 1), + (569, 'Thief\'s Intuition', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 1642, 1), + (570, 'Valiant Steed', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 1645, 1), + (571, 'Abyssal Steed', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 1646, 1), + (572, 'Holy Warhorse', -1, 4, 65535, 127, 131071, 0, 3, 0, 1, 1643, 1), + (573, 'Unholy Warhorse', -1, 16, 65535, 127, 131071, 0, 3, 0, 1, 1644, 1), + (574, 'Harmonic Dissonance', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 1647, 1), + (575, 'Tinkering Mastery', 6, 15639, 65535, 127, 131071, 0, 1, 0, 1, 4672, 1), + (576, 'Jewel Craft Mastery ', 6, 57343, 65535, 127, 131071, 0, 1, 0, 0, 4675, 1), + (577, 'Concussive Intuition', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 12885, 1), + (578, 'Glyph Spray', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 12939, 1), + (579, 'Combat Medic ', -1, 32766, 65535, 127, 131071, 0, 1, 0, 0, 4688, 1), + (580, 'Hastened Outrider\'s Accuracy', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 13565, 1), + (581, 'Quick Draw', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 4698, 1), + (582, 'Battle Ready', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 4699, 1), + (583, 'Hastened Outrider\'s Evasion', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 13568, 1), + (584, 'Grasp of Sylvan Spirits', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 13571, 1), + (585, 'Glyph of Dragon Scales', 7, 65535, 65535, 127, 131071, 0, 4, 1, 0, 4702, 1), + (586, 'Glyph of Indeterminable Reward', 7, 65535, 65535, 127, 131071, 0, 4, 1, 0, 13788, 1), + (587, 'Glyph of Arcane Secrets', 7, 32318, 65535, 127, 131071, 0, 4, 1, 0, 4704, 1), + (588, 'Glyph of Draconic Potential', 7, 65535, 65535, 127, 131071, 0, 4, 1, 0, 4705, 1), + (589, 'Glyph of Destruction', 7, 65535, 65535, 127, 131071, 0, 4, 1, 0, 4706, 1), + (590, 'Breath of Atathus', 8, 65535, 65535, 127, 131071, 0, 4, 0, 1, 5150, 1), + (591, 'Breath of Draton\'ra', 8, 65535, 65535, 127, 131071, 0, 4, 0, 1, 5165, 1), + (592, 'Breath of Osh\'vir', 8, 65535, 65535, 127, 131071, 0, 4, 0, 1, 5180, 1), + (593, 'Breath of Venesh', 8, 65535, 65535, 127, 131071, 0, 4, 0, 1, 5195, 1), + (594, 'Breath of Mysaphar', 8, 65535, 65535, 127, 131071, 0, 4, 0, 1, 5210, 1), + (595, 'Breath of Keikolin', 8, 65535, 65535, 127, 131071, 0, 4, 0, 1, 5225, 1), + (596, 'Small Modulation Shard', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 12963, 1), + (597, 'Medium Modulation Shard', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 12964, 1), + (598, 'Large Modulation Shard', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 12965, 1), + (599, 'Hastened Malosinete', -1, 4608, 65535, 127, 131071, 0, 3, 0, 0, 12968, 1), + (600, 'Blessing of the Devoted', 5, 65535, 65535, 127, 131071, 0, 4, 0, 1, 9033, 1), + (601, 'Grappling Strike', -1, 65, 65535, 127, 131071, 0, 3, 0, 0, 4836, 1), + (602, 'Mental Contortion', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 12938, 1), + (603, 'Shield of the Elements', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 12971, 1), + (604, 'Extended Malosinete', -1, 4608, 65535, 127, 131071, 0, 3, 0, 0, 12977, 1), + (605, 'Shield Specialist', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 4844, 1), + (606, 'Mark of the Mage Hunter', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 4849, 1), + (609, 'Uncanny Resilience', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 4854, 1), + (610, 'Blinding Fury', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 4857, 1), + (611, 'Battle Leap', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 4860, 1), + (612, 'Soul Seeker', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 4861, 1), + (613, 'Lingering Death', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 13096, 1), + (614, 'Spirit Guardian', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 5369, 1), + (615, 'Surreality', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 4887, 1), + (616, 'Mana Draw', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 4890, 1), + (617, 'Doppelganger\'s Beckon', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 5127, 1), + (618, 'Armor of Ancestral Spirits', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 12989, 1), + (619, 'Group Pact of the Wolf', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 12992, 1), + (620, 'Hastened Inconspicuous Totem', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 13001, 1), + (621, 'Fire Core', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 4903, 1), + (622, 'Vapor Core', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 4906, 1), + (623, 'Ice Core ', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 4909, 1), + (624, 'Stone Core ', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 4912, 1), + (625, 'Volatile Mana Blaze', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 4915, 1), + (626, 'Purified Spirits', -1, 546, 65535, 127, 131071, 0, 3, 0, 0, 13004, 1), + (627, 'Group Spirit Walk', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 13008, 1), + (628, 'Greater Blood Tithe', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 4924, 1), + (629, 'Gathering Dusk', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 4927, 1), + (630, 'Group Silent Presence', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 13009, 1), + (631, 'Double Attack', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 5366, 1), + (632, 'Sanguine Mind Crystal', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 4934, 1), + (633, 'Azure Mind Crystal', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 4935, 1), + (634, 'Hastened Cannibalization', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 13010, 1), + (635, 'Hastened Spirit Channeling', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 13013, 1), + (636, 'Arcane Whisper', -1, 14336, 65535, 127, 131071, 0, 3, 0, 0, 4938, 1), + (637, 'Vengeful Spirits', -1, 9776, 65535, 127, 131071, 0, 3, 0, 0, 13017, 1), + (638, 'Crippling Apparition', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 13020, 1), + (639, 'Dimensional Instability', -1, 14336, 65535, 127, 131071, 0, 3, 0, 0, 4943, 1), + (640, 'Cryomancy', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 4944, 1), + (641, 'Hastened Self Preservation', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 13055, 1), + (642, 'Binding Axe', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 13065, 1), + (643, 'Agony of Absolution', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 13066, 1), + (644, 'Hastened Absolution', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 13067, 1), + (645, 'Hastened Calculated Insanity', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 13753, 1), + (646, 'Hastened Mental Contortion', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 13758, 1), + (647, 'Hastened Crippling Aurora', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 13764, 1), + (649, 'Hastened Leech Touch', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 14046, 1), + (650, 'Bony Grasp of Death', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 14051, 1), + (651, 'Thought Leech', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 14052, 1), + (652, 'Hastened Leechcurse Discipline', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 14056, 1), + (653, 'Hastened Unholy Aura Discipline', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 14059, 1), + (654, 'Hastened Harmshield', -1, 1040, 65535, 127, 131071, 0, 3, 0, 0, 14062, 1), + (655, 'Hastened Projection of Doom', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 14065, 1), + (656, 'Hastened Projection of Piety', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 14068, 1), + (657, 'Shield of Brilliance', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 14071, 1), + (658, 'Hastened Sanctification Discipline', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 14076, 1), + (659, 'Speed of the Savior', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 14080, 1), + (660, 'Divine Call', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 14081, 1), + (661, 'Hunter\'s Fury', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 5248, 1), + (662, 'Union of Spirits', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 5251, 1), + (663, 'Quickened Stuns', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 14100, 1), + (664, 'Extended Outrider\'s Attack', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 14115, 1), + (665, 'Death\'s Wrath', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 5264, 1), + (666, 'Taste of Blood', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 5015, 1), + (667, 'Summoner\'s Beckon', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 5269, 1), + (668, 'Hymn of the Last Stand', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 5017, 1), + (669, 'Bladed Song', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 5020, 1), + (670, 'Twisted Shank', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 5021, 1), + (671, 'Dirty Fighting', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 5022, 1), + (672, 'Ligament Slice', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 5025, 1), + (673, 'Tumble', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 5028, 1), + (674, 'Unknown AA 16149', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 16149, 1), + (675, 'Shrink', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 14224, 1), + (676, 'Convergence', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 14358, 1), + (677, 'Gift of Deathly Resolve', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 14359, 1), + (678, 'Unknown AA 16082', -1, 2080, 65535, 127, 131071, 0, 3, 0, 0, 16082, 1), + (679, 'Unknown AA 16083', -1, 15906, 65535, 127, 131071, 0, 2, 0, 0, 16083, 1), + (680, 'Unknown AA 16084', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 16084, 1), + (681, 'Unknown AA 16087', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 16087, 1), + (682, 'Unknown AA 16096', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 16096, 1), + (683, 'Unknown AA 16097', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 16097, 1), + (684, 'Unknown AA 16104', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 16104, 1), + (685, 'Unknown AA 16105', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 16105, 1), + (686, 'Unknown AA 16106', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 16106, 1), + (687, 'Unknown AA 16107', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 16107, 1), + (688, 'Unknown AA 16108', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 16108, 1), + (689, 'Combat Medic ', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 5136, 1), + (690, 'Unknown AA 16109', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 16109, 1), + (691, 'Unknown AA 16113', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 16113, 1), + (692, 'Unknown AA 16114', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 16114, 1), + (693, 'Unknown AA 16117', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 16117, 1), + (694, 'Unknown AA 16120', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 16120, 1), + (695, 'Unknown AA 16152', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 16152, 1), + (696, 'Unknown AA 16156', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 16156, 1), + (697, 'Mortal Coil', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 5085, 1), + (698, 'Hastened Purified Spirits', -1, 546, 65535, 127, 131071, 0, 3, 0, 0, 13416, 1), + (699, 'Swarm of Fireflies', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 13419, 1), + (700, 'Unknown AA 16159', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 16159, 1), + (701, 'Armor of the Inquisitor', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 5095, 1), + (702, 'Hand of Disruption', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 5098, 1), + (703, 'Quickened Death Bloom', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 14318, 1), + (704, 'Hero\'s Barracks', 9, 65535, 65535, 127, 131071, 0, 4, 0, 1, 14367, 1), + (705, 'Spirit of the White Wolf', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 5105, 1), + (706, 'Unknown AA 16160', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 16160, 1), + (707, 'Pact of the Wolf', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 5109, 1), + (708, 'Enchant Alaran Metal', -1, 8192, 65535, 127, 131071, 0, 3, 0, 1, 13271, 1), + (709, 'Mass Enchant Alaran Metal', -1, 8192, 65535, 127, 131071, 0, 3, 0, 1, 13272, 1), + (710, 'Funeral Pyre', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 14360, 1), + (711, 'Unknown AA 16162', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 16162, 1), + (712, 'Hastened Sanctuary', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 5118, 1), + (713, 'Etherium Blades', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 14129, 1), + (714, 'Hastened Assassination Disciplines', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 14135, 1), + (715, 'Cunning Disguise: Shissar', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 14139, 1), + (716, 'Scout\'s Mastery of Piercing', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 14141, 1), + (717, 'Extended Envenomed Blades', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 14144, 1), + (718, 'Heel of Brithrax', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 14151, 1), + (719, 'Extended Zan Fi\'s Whistle', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 14163, 1), + (720, 'Hastened Marr\'s Salvation', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 14088, 1), + (721, 'Hastened Armor of the Inquisitor', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 14091, 1), + (722, 'Hastened Drape of Shadows', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 14304, 1), + (723, 'Unknown AA 16185', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 16185, 1), + (724, 'Hastened Eldritch Rune', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 14364, 1), + (725, 'Unknown AA 16124', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 16124, 1), + (726, 'Unknown AA 16128', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 16128, 1), + (727, 'Unknown AA 16131', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 16131, 1), + (728, 'Unknown AA 16137', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 16137, 1), + (729, 'Unknown AA 16140', -1, 6, 65535, 127, 131071, 0, 3, 0, 0, 16140, 1), + (730, 'Unknown AA 16186', -1, 9, 65535, 127, 131071, 0, 3, 0, 0, 16186, 1), + (731, 'Unknown AA 16188', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 16188, 1), + (732, 'Unknown AA 16195', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 16195, 1), + (733, 'Killing Spree', -1, 33089, 65535, 127, 131071, 0, 2, 0, 0, 4739, 1), + (734, 'Hold the Line', -1, 32833, 65535, 127, 131071, 0, 3, 0, 0, 4742, 1), + (735, 'Battle Frenzy', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 13134, 1), + (737, 'Quickened Silent Casting', -1, 15360, 65535, 127, 131071, 0, 2, 0, 0, 13143, 1), + (738, 'Quickened Silent Casting', -1, 546, 65535, 127, 131071, 0, 2, 0, 0, 13146, 1), + (739, 'Balefire Burst', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 13164, 1), + (740, 'Blood Tithe', -1, 1568, 65535, 127, 131071, 0, 3, 0, 0, 4761, 1), + (741, 'Leap of Faith', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 13202, 1), + (742, 'Unknown AA 16196', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 16196, 1), + (743, 'Hastened Explosion of Hatred', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 13166, 1), + (744, 'Howl of the Warlord', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 13169, 1), + (745, 'Hastened Tune In Your Head', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 13204, 1), + (746, 'Unknown AA 16197', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 16197, 1), + (747, 'Unknown AA 16200', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 16200, 1), + (748, 'Nightmare Stasis', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 4894, 1), + (749, 'Explosion of Spite', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 13165, 1), + (751, 'Scent of Terris', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 13225, 1), + (752, 'Bloodfury', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 13224, 1), + (753, 'Dreary Deeds', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 13252, 1), + (754, 'Enchant Feymetal', -1, 8192, 65535, 127, 131071, 0, 3, 0, 1, 13260, 1), + (755, 'Mass Enchant Feymetal', -1, 8192, 65535, 127, 131071, 0, 3, 0, 1, 13261, 1), + (756, 'Enlightened Focus of Arcanum', -1, 15904, 65535, 127, 131071, 0, 3, 0, 0, 13646, 1), + (757, 'Shifting Elements', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 5276, 1), + (758, 'Extended Silent Casting', -1, 15360, 65535, 127, 131071, 0, 3, 0, 0, 13667, 1), + (759, 'Fury of Kerafyrm', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 13670, 1), + (760, 'Unknown AA 16203', -1, 544, 65535, 127, 131071, 0, 3, 0, 0, 16203, 1), + (761, 'Unknown AA 16208', -1, 552, 65535, 127, 131071, 0, 3, 0, 0, 16208, 1), + (762, 'Shield Block', -1, 546, 65535, 127, 131071, 0, 2, 0, 0, 5283, 1), + (763, 'Mirrored Pestilence', -1, 1552, 65535, 127, 131071, 0, 3, 0, 0, 13684, 1), + (764, 'Embrace The Decay', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 13687, 1), + (765, 'Quickened Scent of Terris', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 13689, 1), + (766, 'Frenzy of the Dead', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 13693, 1), + (767, 'Unknown AA 16211', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 16211, 1), + (768, 'Unknown AA 16215', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 16215, 1), + (769, 'Marr\'s Salvation', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 13100, 1), + (770, 'Blessing of the Faithful', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 13101, 1), + (771, 'Unbridled Strike of Fear', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 13108, 1), + (772, 'Noteworthy Disguise: Drake', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 14192, 1), + (773, 'Death\'s Effigy', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 13133, 1), + (774, 'Empowered Focus of Arcanum', -1, 15904, 65535, 127, 131071, 0, 3, 0, 0, 14690, 1), + (775, 'Unknown AA 16342', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 16342, 1), + (776, 'Arcane Overkill', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 5295, 1), + (777, 'Funeral Dirge', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 5298, 1), + (778, 'Protection of the Spirit Wolf', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 5007, 1), + (779, 'Hastened Juggernaut Surge', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 13873, 1), + (780, 'Hastened Resilience', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 13878, 1), + (781, 'Hastened Blood Pact', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 13881, 1), + (782, 'Unknown AA 16317', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 16317, 1), + (783, 'Energetic Attunement', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 1056, 1), + (784, 'Heart of Flames', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 1251, 1), + (785, 'Heart of Vapor', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 1252, 1), + (786, 'Heart of Ice', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 1253, 1), + (787, 'Heart of Stone', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 1254, 1), + (789, 'Stealthy Getaway', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 1477, 1), + (790, 'Seized Opportunity', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 878, 1), + (791, 'Veil of Mindshadow', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 4931, 1), + (792, 'Army of the Dead', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 1274, 1), + (793, 'Mana Blast', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 1639, 1), + (794, 'Mana Blaze', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 1640, 1), + (795, 'Innate Corruption Protection', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 1662, 1), + (796, 'Hastened Five Point Palm', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 13889, 1), + (797, 'Moving Mountains', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 13130, 1), + (798, 'Veturika\'s Perseverance', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 14229, 1), + (799, 'Unknown AA 16644', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 16644, 1), + (800, 'Vehement Rage', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 6607, 1), + (801, 'Knee Strike', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 6610, 1), + (802, 'Hastened Fortitude Discipline', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 6611, 1), + (803, 'Hastened Furious Discipline', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 6614, 1), + (804, 'Warlord\'s Bravery', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 6617, 1), + (805, 'Hastened Speed Focus', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 14148, 1), + (806, 'Hastened Zan Fi\'s Whistle', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 14160, 1), + (807, 'Pressure Points', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 14157, 1), + (808, 'Hastened Thunder', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 14166, 1), + (809, 'Allegretto of Battle', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 14181, 1), + (810, 'Vivace of Conflict', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 14186, 1), + (811, 'Unknown AA 16218', -1, 544, 65535, 127, 131071, 0, 3, 0, 0, 16218, 1), + (812, 'Unknown AA 16221', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 16221, 1), + (813, 'Unknown AA 16222', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 16222, 1), + (814, 'Unknown AA 16225', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 16225, 1), + (815, 'Unknown AA 16230', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 16230, 1), + (816, 'Unknown AA 16235', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 16235, 1), + (817, 'Unknown AA 16238', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 16238, 1), + (818, 'Unknown AA 16257', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 16257, 1), + (819, 'Unknown AA 16666', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 16666, 1), + (820, 'Death\'s Revenge', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 6630, 1), + (821, 'Harmshield', -1, 1040, 65535, 127, 131071, 0, 3, 0, 0, 6635, 1), + (822, 'Explosion of Hatred', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 6640, 1), + (823, 'Cascading Theft of Defense', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 6641, 1), + (824, 'Hate Step', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 6644, 1), + (825, 'Vicious Bite of Chaos', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 6645, 1), + (826, 'Encroaching Darkness', -1, 1040, 65535, 127, 131071, 0, 3, 0, 0, 6646, 1), + (827, 'Unknown AA 16745', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 16745, 1), + (828, 'Unknown AA 16260', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 16260, 1), + (829, 'Unknown AA 16263', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 16263, 1), + (830, 'Unknown AA 16272', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 16272, 1), + (831, 'Unknown AA 16276', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 16276, 1), + (832, 'Unknown AA 16287', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 16287, 1), + (833, 'Unknown AA 17252', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 17252, 1), + (834, 'Unknown AA 16296', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 16296, 1), + (835, 'Unknown AA 16300', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 16300, 1), + (836, 'Unknown AA 16310', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 16310, 1), + (837, 'Unknown AA 16330', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 16330, 1), + (838, 'Unknown AA 16163', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 16163, 1), + (839, 'Unknown AA 16360', -1, 2080, 65535, 127, 131071, 0, 3, 0, 0, 16360, 1), + (840, 'Unknown AA 16363', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 16363, 1), + (841, 'Sleight of Hand', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6663, 1), + (842, 'Enduring Vision', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6666, 1), + (843, 'Expertise of Blades', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6668, 1), + (844, 'Cunning Disguise: Human', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6671, 1), + (845, 'Cunning Disguise: Half-Elf', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6672, 1), + (846, 'Cunning Disguise: Barbarian', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6673, 1), + (847, 'Cunning Disguise: Erudite', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6674, 1), + (848, 'Cunning Disguise: Troll', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6675, 1), + (849, 'Cunning Disguise: Goblin', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6676, 1), + (850, 'Unknown AA 16366', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 16366, 1), + (851, 'Unknown AA 16369', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 16369, 1), + (852, 'Unknown AA 16370', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 16370, 1), + (853, 'Unknown AA 16371', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 16371, 1), + (854, 'Unknown AA 17256', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 17256, 1), + (856, 'Tigir\'s Insect Swarm', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 6691, 1), + (857, 'Dampen Resistance', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 6692, 1), + (858, 'Hastened Dampen Resistance', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 6697, 1), + (859, 'Spirit Walk', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 6702, 1), + (860, 'Hastened Virulent Paralysis', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 6703, 1), + (861, 'Languid Bite', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 6706, 1), + (862, 'Quickened Blood of Nadox', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 6709, 1), + (863, 'Hastened Spirit Call', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 6712, 1), + (864, 'Hastened Thousand Blades', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 14169, 1), + (865, 'Unknown AA 17257', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 17257, 1), + (866, 'Extended Dance of Blades', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 14179, 1), + (867, 'Extended Thousand Blades', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 14180, 1), + (868, 'Unknown AA 16380', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 16380, 1), + (869, 'Unknown AA 16386', -1, 4608, 65535, 127, 131071, 0, 3, 0, 0, 16386, 1), + (870, 'Harmonious Arrow', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 6750, 1), + (871, 'Hastened Weapon Shield', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 6751, 1), + (872, 'Outrider\'s Attack', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 6754, 1), + (873, 'Group Guardian of the Forest', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 6755, 1), + (874, 'Pack Hunt', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 6758, 1), + (875, 'Keen Blade', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 6761, 1), + (876, 'Outrider\'s Evasion', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 6764, 1), + (877, 'Ranged Finesse', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 6765, 1), + (878, 'Bow Mastery', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 1196, 1), + (879, 'Unknown AA 17258', -1, 1040, 65535, 127, 131071, 0, 2, 0, 0, 17258, 1), + (880, 'Unknown AA 16392', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 16392, 1), + (881, 'Unknown AA 16395', -1, 10248, 65535, 127, 131071, 0, 3, 0, 0, 16395, 1), + (882, 'Unknown AA 16396', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 16396, 1), + (883, 'Unknown AA 16536', -1, 546, 65535, 127, 131071, 0, 2, 0, 0, 16536, 1), + (884, 'Unknown AA 17209', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 17209, 1), + (885, 'Unknown AA 17212', -1, 1, 65535, 127, 131071, 0, 2, 0, 0, 17212, 1), + (886, 'Unknown AA 17218', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 17218, 1), + (888, 'Unknown AA 17555', -1, 1024, 65535, 127, 131071, 0, 5, 0, 0, 17555, 1), + (889, 'Unknown AA 17229', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 17229, 1), + (890, 'Unknown AA 17235', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 17235, 1), + (891, 'Healing Light', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 6791, 1), + (892, 'Halt the Dead', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 6794, 1), + (894, 'Unknown AA 17242', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 17242, 1), + (895, 'Unknown AA 17245', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 17245, 1), + (896, 'Unknown AA 17249', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 17249, 1), + (897, 'Unknown AA 17199', 7, 65535, 65535, 127, 131071, 0, 4, 1, 0, 17199, 1), + (898, 'Unknown AA 17267', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 17267, 1), + (899, 'Unknown AA 17273', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 17273, 1), + (900, 'Rise of Bones', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 6815, 1), + (901, 'Whisperwind', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 6818, 1), + (902, 'Hastened Blood Magic', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 6819, 1), + (903, 'Overpower Undead', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 6822, 1), + (904, 'Hastened Swarm of Decay', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 6823, 1), + (905, 'Gift of the Grave', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 6828, 1), + (906, 'Hastened Gut Punch', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 10522, 1), + (907, 'Hastened First Spire of the Warlord', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 10527, 1), + (908, 'Hastened Second Spire of the Warlord', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 10532, 1), + (909, 'Hastened Third Spire of the Warlord', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 10537, 1), + (910, 'Unknown AA 17280', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 17280, 1), + (911, 'Warlord\'s Resurgence', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 10545, 1), + (912, 'Warlord\'s Fury', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 10546, 1), + (914, 'Improved Shield Specialist', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 10548, 1), + (915, 'Unknown AA 17281', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 17281, 1), + (917, 'Hastened Grappling Strike', -1, 65, 65535, 127, 131071, 0, 3, 0, 0, 10588, 1), + (918, 'Furious Refrain', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 10627, 1), + (919, 'Unknown AA 17554', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 17554, 1), + (920, 'Valorous Rage', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 10711, 1), + (921, 'Hastened Group Guardian of the Forest', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10714, 1), + (922, 'Hastened Outrider\'s Attack', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10719, 1), + (923, 'Hastened Protection of the Spirit Wolf', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10722, 1), + (924, 'Hastened Imbued Ferocity', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10727, 1), + (925, 'Hastened Harmonious Arrow', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10730, 1), + (926, 'Hastened Entrap', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10733, 1), + (927, 'Poison Arrows', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10736, 1), + (928, 'Merciless Blade', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 14026, 1), + (929, 'Combatant\'s Pact', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 14029, 1), + (930, 'Warlord\'s Resolve', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 14032, 1), + (931, 'Hastened Hate\'s Attraction', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 12582, 1), + (932, 'Unknown AA 17289', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 17289, 1), + (933, 'Improved Death Peace', -1, 1040, 65535, 127, 131071, 0, 3, 0, 0, 12635, 1), + (934, 'Unknown AA 17307', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 17307, 1), + (935, 'Blessing of Ro', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 10789, 1), + (936, 'Extended Wild Growth', -1, 544, 65535, 127, 131071, 0, 3, 0, 0, 10792, 1), + (937, 'Unknown AA 17317', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 17317, 1), + (938, 'Eyes Wide Open', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 12636, 1), + (939, 'Communion of the Cheetah', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 12638, 1), + (940, 'Hastened Song of Stone', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 6870, 1), + (941, 'Flurry', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 6873, 1), + (942, 'Destructive Cascade', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 6876, 1), + (943, 'Total Domination', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 6879, 1), + (944, 'Enhanced Forgetfulness', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 6882, 1), + (945, 'Infusion of Thunder', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 10346, 1), + (946, 'Hastened Warlord\'s Bravery', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 14037, 1), + (947, 'Hastened Warlord\'s Tenacity', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 14040, 1), + (948, 'Unknown AA 17328', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 17328, 1), + (949, 'Unknown AA 17329', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 17329, 1), + (950, 'Unknown AA 17336', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 17336, 1), + (951, 'Unknown AA 17339', -1, 544, 65535, 127, 131071, 0, 3, 0, 0, 17339, 1), + (952, 'Unknown AA 17342', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 17342, 1), + (953, 'Unknown AA 17344', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 17344, 1), + (954, 'Unknown AA 17347', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 17347, 1), + (955, 'Unknown AA 17357', -1, 514, 65535, 127, 131071, 0, 2, 0, 0, 17357, 1), + (956, 'Unknown AA 17361', -1, 2080, 65535, 127, 131071, 0, 3, 0, 0, 17361, 1), + (957, 'Unknown AA 17364', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 17364, 1), + (958, 'Unknown AA 17370', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 17370, 1), + (959, 'Unknown AA 17372', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 17372, 1), + (960, 'Stomping Leap', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 6930, 1), + (961, 'Juggernaut Surge', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 6931, 1), + (962, 'Distraction Attack', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 6932, 1), + (963, 'Hastened Savage Spirit', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 6935, 1), + (964, 'Dying Blow', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 6938, 1), + (965, 'Hastened Projection of Fury', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 10519, 1), + (966, 'Unknown AA 17373', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 17373, 1), + (967, 'Blade Guardian', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 13444, 1), + (968, 'Unknown AA 17375', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 17375, 1), + (969, 'Unknown AA 17378', -1, 15360, 65535, 127, 131071, 0, 2, 0, 0, 17378, 1), + (970, 'Unknown AA 17378', -1, 546, 65535, 127, 131071, 0, 2, 0, 0, 17379, 1), + (971, 'Unknown AA 17378', -1, 16384, 65535, 127, 131071, 0, 2, 0, 0, 17380, 1), + (972, 'Unknown AA 17384', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 17384, 1), + (974, 'Unknown AA 17409', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 17409, 1), + (975, 'Unknown AA 17414', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 17414, 1), + (976, 'Unknown AA 17418', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 17418, 1), + (977, 'Unknown AA 17558', -1, 1024, 65535, 127, 131071, 0, 5, 0, 0, 17558, 1), + (978, 'Unknown AA 17428', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 17428, 1), + (979, 'Unknown AA 17436', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 17436, 1), + (980, 'Natural Invisibility', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 6970, 1), + (981, 'Attack of the Warders', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 6971, 1), + (982, 'Hastened Feral Attacks', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 6974, 1), + (983, 'Hastened Focused Paragon', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 6977, 1), + (984, 'Hastened Paragon', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 6980, 1), + (985, 'Group Bestial Alignment', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 6983, 1), + (986, 'Bite of the Asp', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 6984, 1), + (987, 'Raven\'s Claw', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 6985, 1), + (988, 'Gorilla Smash', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 6986, 1), + (989, 'Stonefoot', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 10340, 1), + (990, 'Hastened Stunning Kick', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 10343, 1), + (991, 'Quickened Turn Undead', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 10470, 1), + (992, 'Tranquil Blessings', -1, 30254, 65535, 127, 131071, 0, 3, 0, 0, 3676, 1), + (993, 'Righteous Zeal', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 6082, 1), + (994, 'Hastened Divine Retribution', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 6088, 1), + (995, 'Intrinsic Efficiency', -1, 15386, 65535, 127, 131071, 0, 2, 0, 0, 6112, 1), + (996, 'Powerful Elixirs', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 6113, 1), + (997, 'Celestial Rapidity', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 6534, 1), + (998, 'Hastened Celestial Regeneration', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 2400, 1), + (999, 'Improved Burst of Life', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 7765, 1), + (1000, 'Unknown AA 17439', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 17439, 1), + (1001, 'Unknown AA 17445', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 17445, 1), + (1002, 'Unknown AA 17448', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 17448, 1), + (1003, 'Unknown AA 10478', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10478, 1), + (1004, 'Unknown AA 17492', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 17492, 1), + (1005, 'Unknown AA 17495', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 17495, 1), + (1006, 'Unknown AA 17515', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 17515, 1), + (1007, 'Unknown AA 17517', -1, 5120, 65535, 127, 131071, 0, 3, 0, 0, 17517, 1), + (1008, 'Unknown AA 17522', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 17522, 1), + (1009, 'Unknown AA 17533', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 17533, 1), + (1011, 'Neshika\'s Blink', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 7869, 1), + (1012, 'Five Point Palm', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 7875, 1), + (1013, 'War Cry of the Braxi', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 13872, 1), + (1014, 'Unknown AA 17538', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 17538, 1), + (1015, 'Unknown AA 17547', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 17547, 1), + (1016, 'Unknown AA 17549', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 17549, 1), + (1017, 'Unknown AA 17238', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 17238, 1), + (1018, 'Unknown AA 17553', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 17553, 1), + (1019, 'Unknown AA 17248', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 17248, 1), + (1020, 'Hastened Companion\'s Blessing', -1, 30224, 65535, 127, 131071, 0, 2, 0, 0, 12478, 1), + (1021, 'Unknown AA 17215', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 17215, 1), + (1022, 'Destructive Fury', -1, 16540, 65535, 127, 131071, 0, 2, 0, 0, 6636, 1), + (1023, 'Restoration of Life', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 14010, 1), + (1024, 'Hastened Leap of Faith', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 14085, 1), + (1025, 'Hastened Beacon of the Righteous', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 14011, 1), + (1026, 'Unknown AA 17561', -1, 1024, 65535, 127, 131071, 0, 5, 0, 0, 17561, 1), + (1027, 'Unknown AA 17564', -1, 1024, 65535, 127, 131071, 0, 5, 0, 0, 17564, 1), + (1028, 'Unknown AA 17567', -1, 1024, 65535, 127, 131071, 0, 5, 0, 0, 17567, 1), + (1029, 'Unknown AA 17570', -1, 1024, 65535, 127, 131071, 0, 5, 0, 0, 17570, 1), + (1030, 'Unknown AA 17573', -1, 1024, 65535, 127, 131071, 0, 5, 0, 0, 17573, 1), + (1031, 'Unknown AA 17576', -1, 2048, 65535, 127, 131071, 0, 5, 0, 0, 17576, 1), + (1032, 'Unknown AA 17579', -1, 2048, 65535, 127, 131071, 0, 5, 0, 0, 17579, 1), + (1033, 'Unknown AA 17582', -1, 2048, 65535, 127, 131071, 0, 5, 0, 0, 17582, 1), + (1034, 'Unknown AA 17585', -1, 2048, 65535, 127, 131071, 0, 5, 0, 0, 17585, 1), + (1035, 'Unknown AA 17588', -1, 2048, 65535, 127, 131071, 0, 5, 0, 0, 17588, 1), + (1036, 'Unknown AA 17591', -1, 2048, 65535, 127, 131071, 0, 5, 0, 0, 17591, 1), + (1037, 'Unknown AA 17594', -1, 2048, 65535, 127, 131071, 0, 5, 0, 0, 17594, 1), + (1038, 'Unknown AA 17597', -1, 4096, 65535, 127, 131071, 0, 5, 0, 0, 17597, 1), + (1039, 'Unknown AA 17600', -1, 4096, 65535, 127, 131071, 0, 5, 0, 0, 17600, 1), + (1040, 'Theft of Essence', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 7900, 1), + (1041, 'Malosinete', -1, 4608, 65535, 127, 131071, 0, 3, 0, 0, 7903, 1), + (1042, 'Unknown AA 17603', -1, 4096, 65535, 127, 131071, 0, 5, 0, 0, 17603, 1), + (1043, 'Unknown AA 17606', -1, 4096, 65535, 127, 131071, 0, 5, 0, 0, 17606, 1), + (1044, 'Unknown AA 17609', -1, 4096, 65535, 127, 131071, 0, 5, 0, 0, 17609, 1), + (1045, 'Unknown AA 17612', -1, 4096, 65535, 127, 131071, 0, 5, 0, 0, 17612, 1), + (1046, 'Unknown AA 17615', -1, 4096, 65535, 127, 131071, 0, 5, 0, 0, 17615, 1), + (1047, 'Unknown AA 17618', -1, 8192, 65535, 127, 131071, 0, 5, 0, 0, 17618, 1), + (1048, 'Unknown AA 17621', -1, 8192, 65535, 127, 131071, 0, 5, 0, 0, 17621, 1), + (1049, 'Unknown AA 17624', -1, 8192, 65535, 127, 131071, 0, 5, 0, 0, 17624, 1), + (1050, 'Unknown AA 17627', -1, 8192, 65535, 127, 131071, 0, 5, 0, 0, 17627, 1), + (1051, 'Unknown AA 17630', -1, 8192, 65535, 127, 131071, 0, 5, 0, 0, 17630, 1), + (1052, 'Unknown AA 17633', -1, 8192, 65535, 127, 131071, 0, 5, 0, 0, 17633, 1), + (1053, 'Unknown AA 10481', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 10481, 1), + (1054, 'Unknown AA 17639', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 17639, 1), + (1060, 'Hastened Turn Undead', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 7940, 1), + (1061, 'Cascading Divine Aura', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 7943, 1), + (1062, 'Group Purify Soul', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 7944, 1), + (1063, 'Hastened Renewal', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 7945, 1), + (1064, 'Sanctified Blessing', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 7948, 1), + (1065, 'Focused Celestial Regeneration', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 7951, 1), + (1090, 'Mastery of Nature', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 7980, 1), + (1091, 'Hastened Nature\'s Guardian', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 7983, 1), + (1092, 'Spirit of the Black Wolf', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 7986, 1), + (1093, 'Hastened Lycan Soul', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 7989, 1), + (1113, 'Hastened Mass Group Buff', -1, 30254, 65535, 127, 131071, 0, 3, 0, 0, 5010, 1), + (1115, 'Mystical Shield', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 5045, 1), + (1120, 'Self Stasis', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 8030, 1), + (1121, 'Hastened Veil of Mindshadow', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 8031, 1), + (1122, 'Phantasmal Opponent', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 8034, 1), + (1123, 'Hastened Edict of Command', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 8035, 1), + (1124, 'Fog of Memories', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 8038, 1), + (1125, 'Bite of Tashani', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 8039, 1), + (1150, 'Fury of Druzzil', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 8060, 1), + (1151, 'Fury of Eci', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 8063, 1), + (1152, 'Fury of Ro', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 8066, 1), + (1153, 'Fortified Entanglement', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 8069, 1), + (1154, 'Force of Will', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 8072, 1), + (1155, 'Atol\'s Shackles', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 8075, 1), + (1156, 'Hastened Manaburn', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 8076, 1), + (1157, 'Hastened Call of Xuzl', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 8082, 1), + (1158, 'Divine Steed', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 1667, 1), + (1159, 'Hastened Leap', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 11014, 1), + (1169, 'Unknown AA 16336', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 16336, 1), + (1170, 'Unknown AA 16339', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 16339, 1), + (1171, 'Hastened Counterattack Discipline', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 15502, 1), + (1173, 'Hastened Onslaught', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 15509, 1), + (1174, 'Mrylokar\'s Rigor', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 15512, 1), + (1175, 'Absorbing Agent', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 15515, 1), + (1176, 'Improved Requiem of Time', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 15516, 1), + (1177, 'Quickened Requiem of Time', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 15517, 1), + (1178, 'Silent Displacement', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 15521, 1), + (1200, 'Companion\'s Alacrity', -1, 30224, 65535, 127, 131071, 0, 2, 0, 0, 8190, 1), + (1201, 'Improved Intimidation', -1, 41408, 65535, 127, 131071, 0, 2, 0, 1, 8193, 1), + (1202, 'Perfected Levitation', -1, 31272, 65535, 127, 131071, 0, 2, 0, 0, 8194, 1), + (1203, 'Hastened Fortify Companion', -1, 30224, 65535, 127, 131071, 0, 2, 0, 0, 8195, 1), + (1204, 'Empowered Ingenuity', -1, 33089, 65535, 127, 131071, 0, 2, 0, 0, 8198, 1), + (1205, 'Companion\'s Fury', -1, 30224, 65535, 127, 131071, 0, 2, 0, 0, 8201, 1), + (1206, 'Quickened Radiant Cure', -1, 546, 65535, 127, 131071, 0, 2, 0, 0, 8204, 1), + (1207, 'Quickened Radiant Cure', -1, 4, 65535, 127, 131071, 0, 2, 0, 0, 8207, 1), + (1208, 'Mental Stamina', -1, 32446, 65535, 127, 131071, 0, 2, 0, 0, 8210, 1), + (1209, 'Hardy Endurance', -1, 33089, 65535, 127, 131071, 0, 2, 0, 0, 8215, 1), + (1210, 'Group Perfected Invisibility', -1, 14336, 65535, 127, 131071, 0, 3, 0, 0, 8220, 1), + (1211, 'Focus of Arcanum', -1, 15904, 65535, 127, 131071, 0, 3, 0, 0, 8221, 1), + (1212, 'Group Perfected Invisibility to Undead', -1, 1046, 65535, 127, 131071, 0, 2, 0, 0, 8222, 1), + (1214, 'Cascade of Life', -1, 546, 65535, 127, 131071, 0, 2, 0, 0, 8224, 1), + (1215, 'Summon Companion', -1, 30224, 65535, 127, 131071, 0, 2, 0, 0, 8227, 1), + (1216, 'Mental Fortitude', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 8228, 1), + (1217, 'Gate', -1, 15906, 65535, 127, 131071, 0, 2, 0, 0, 8231, 1), + (1218, 'Extended Ingenuity', -1, 128, 65535, 127, 131071, 0, 2, 0, 0, 8040, 1), + (1219, 'Armor of Wisdom', -1, 1, 65535, 127, 131071, 0, 2, 0, 0, 8235, 1), + (1220, 'Armor of Wisdom', -1, 20, 65535, 127, 131071, 0, 2, 0, 0, 8240, 1), + (1221, 'Armor of Wisdom', -1, 202, 65535, 127, 131071, 0, 2, 0, 0, 8245, 1), + (1222, 'Armor of Wisdom', -1, 49920, 65535, 127, 131071, 0, 2, 0, 0, 8250, 1), + (1223, 'Armor of Wisdom', -1, 15392, 65535, 127, 131071, 0, 2, 0, 0, 8255, 1), + (1232, 'Way of the Katori', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 15429, 1), + (1233, 'Harmony of Battle', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 15432, 1), + (1234, 'Hastened Ironfist', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 15438, 1), + (1235, 'Two-Finger Wasp Touch', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 15447, 1), + (1236, 'Thunderfoot', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 15444, 1), + (1237, 'Extended Bloodlust', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 15414, 1), + (1239, 'Consumption of Spirit', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 15423, 1), + (1240, 'Frenzied Swipes', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 15424, 1), + (1242, 'Hastened Synergy', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 15450, 1), + (1243, 'Hastened Crane Stance', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 15453, 1), + (1244, 'Hastened Eye Gouge', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 15456, 1), + (1245, 'Troubadour\'s Slashing Mastery', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 15540, 1), + (1246, 'Troubadour\'s Blunt Mastery', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 15543, 1), + (1247, 'Troubadour\'s Piercing Mastery', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 15546, 1), + (1248, 'Hastened Lure of the Siren\'s Song', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 15549, 1), + (1249, 'Frenzied Axe of Rallos', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 15555, 1), + (1250, 'Juggernaut\'s Mastery of Throwing', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 15564, 1), + (1251, 'Furious Rampage', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 15567, 1), + (1252, 'Battle Stomp', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 15569, 1), + (1253, 'Communion of Blood', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 15570, 1), + (1254, 'Hastened Dying Grasp', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 15571, 1), + (1255, 'Rest the Dead', -1, 1040, 65535, 127, 131071, 0, 3, 0, 0, 15574, 1), + (1256, 'Extended Encroaching Darkness', -1, 1040, 65535, 127, 131071, 0, 3, 0, 0, 15579, 1), + (1257, 'Hand of Death', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 15582, 1), + (1258, 'Quickened Levant', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 15591, 1), + (1259, 'Cascade of Decay', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 15594, 1), + (1261, 'Hastened Fury of the Gods', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 15598, 1), + (1262, 'Lower Element', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 15601, 1), + (1263, 'Destructive Adept', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 15602, 1), + (1264, 'Arcane Fusion', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 15609, 1), + (1265, 'Arcane Destruction', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 15611, 1), + (1266, 'Force of Flame', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 15612, 1), + (1267, 'Force of Ice', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 15615, 1), + (1269, 'Sha\'s Reprisal', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 15425, 1), + (1270, 'Crippling Spirit', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 15377, 1), + (1271, 'Quick Damage', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 15622, 1), + (1272, 'Assassin\'s Wrath', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 15625, 1), + (1273, 'Hastened Swiftblade', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 15634, 1), + (1274, 'Improved Explosion of Spite', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 15639, 1), + (1275, 'Improved Explosion of Hatred', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 15640, 1), + (1277, 'Soul Touch', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 15642, 1), + (1278, 'Soul Flay', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 15643, 1), + (1279, 'Ragged Bite of Agony', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 15646, 1), + (1281, 'Everburn', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 15648, 1), + (1282, 'Marr\'s Gift', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 15619, 1), + (1300, 'Fundament of Intellect', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 9100, 1), + (1301, 'Fundament of Intellect', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 9109, 1), + (1302, 'Fundament of Intellect', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 9118, 1), + (1303, 'Fundament of Intellect', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 9127, 1), + (1304, 'Fundament of Wisdom', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 9136, 1), + (1305, 'Fundament of Wisdom', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 9145, 1), + (1306, 'Fundament of Wisdom', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 9154, 1), + (1307, 'Fundament of Power', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 9163, 1), + (1308, 'Fundament of Power', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 9172, 1), + (1309, 'Fundament of Power', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 9181, 1), + (1310, 'Fundament of Power', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 9190, 1), + (1311, 'Fundament of Power', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 9199, 1), + (1312, 'Fundament of Combat', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 9208, 1), + (1313, 'Fundament of Combat', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 9217, 1), + (1314, 'Fundament of Combat', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 9226, 1), + (1315, 'Fundament of Combat', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 9235, 1), + (1350, 'Fundament: First Spire of Arcanum', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 9300, 1), + (1351, 'Fundament: Second Spire of Arcanum', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 9303, 1), + (1352, 'Fundament: Third Spire of Arcanum', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 9306, 1), + (1360, 'Fundament: First Spire of the Sensei', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 9309, 1), + (1361, 'Fundament: Second Spire of the Sensei', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 9312, 1), + (1362, 'Fundament: Third Spire of the Sensei', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 9315, 1), + (1370, 'Fundament: First Spire of the Elements', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 9318, 1), + (1371, 'Fundament: Second Spire of the Elements', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 9321, 1), + (1372, 'Fundament: Third Spire of the Elements', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 9324, 1), + (1380, 'Fundament: First Spire of Enchantment', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 9327, 1), + (1381, 'Fundament: Second Spire of Enchantment', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 9330, 1), + (1382, 'Fundament: Third Spire of Enchantment', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 9333, 1), + (1390, 'Fundament: First Spire of Necromancy', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 9336, 1), + (1391, 'Fundament: Second Spire of Necromancy', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 9339, 1), + (1392, 'Fundament: Third Spire of Necromancy', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 9342, 1), + (1400, 'Fundament: First Spire of the Warlord', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 9345, 1), + (1401, 'Fundament: Second Spire of the Warlord', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 9348, 1), + (1402, 'Fundament: Third Spire of the Warlord', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 9351, 1), + (1403, 'Sturdy Companion', -1, 30224, 65535, 127, 131071, 0, 3, 0, 0, 9503, 1), + (1404, 'Extended Swarm', -1, 32306, 65535, 127, 131071, 0, 3, 0, 0, 9506, 1), + (1405, 'Twincast', -1, 15906, 65535, 127, 131071, 0, 3, 0, 0, 9509, 1), + (1406, 'Staff Block', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 9512, 1), + (1410, 'Fundament: First Spire of the Rake', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 9354, 1), + (1411, 'Fundament: Second Spire of the Rake', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 9357, 1), + (1412, 'Fundament: Third Spire of the Rake', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 9360, 1), + (1420, 'Fundament: First Spire of the Minstrels', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 9363, 1), + (1421, 'Fundament: Second Spire of the Minstrels', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 9366, 1), + (1422, 'Fundament: Third Spire of the Minstrels', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 9369, 1), + (1430, 'Fundament: First Spire of the Savage Lord', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 9372, 1), + (1431, 'Fundament: Second Spire of the Savage Lord', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 9375, 1), + (1432, 'Fundament: Third Spire of the Savage Lord', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 9378, 1), + (1433, 'Extended Ingenuity', -1, 33089, 65535, 127, 131071, 0, 2, 0, 0, 8232, 1), + (1440, 'Fundament: First Spire of Holiness', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 9381, 1), + (1441, 'Fundament: Second Spire of Holiness', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 9384, 1), + (1442, 'Fundament: Third Spire of Holiness', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 9387, 1), + (1450, 'Fundament: First Spire of the Reavers', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 9390, 1), + (1451, 'Fundament: Second Spire of the Reavers', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 9393, 1), + (1452, 'Fundament: Third Spire of the Reavers', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 9396, 1), + (1460, 'Fundament: First Spire of the Pathfinders', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 9399, 1), + (1461, 'Fundament: Second Spire of the Pathfinders', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 9402, 1), + (1462, 'Fundament: Third Spire of the Pathfinders', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 9405, 1), + (1470, 'Fundament: First Spire of Divinity', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 9408, 1), + (1471, 'Fundament: Second Spire of Divinity', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 9411, 1), + (1472, 'Fundament: Third Spire of Divinity', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 9414, 1), + (1480, 'Fundament: First Spire of Nature', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 9417, 1), + (1481, 'Fundament: Second Spire of Nature', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 9420, 1), + (1482, 'Fundament: Third Spire of Nature', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 9423, 1), + (1490, 'Fundament: First Spire of Ancestors', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 9426, 1), + (1491, 'Fundament: Second Spire of Ancestors', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 9429, 1), + (1492, 'Fundament: Third Spire of Ancestors', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 9432, 1), + (1500, 'Fundament: First Spire of Savagery', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 9435, 1), + (1501, 'Fundament: Second Spire of Savagery', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 9438, 1), + (1502, 'Fundament: Third Spire of Savagery', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 9441, 1), + (1503, 'Hallowed Steed', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 13673, 1), + (1504, 'Wicked Steed', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 13674, 1), + (1505, 'Unknown AA 16103', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 16103, 1), + (1580, 'Divine Companion Aura', -1, 30224, 65535, 127, 131071, 0, 2, 0, 0, 5809, 1), + (1662, 'Spell Casting Mastery', -1, 16412, 65535, 127, 131071, 0, 2, 0, 0, 1216, 1), + (1663, 'Gift of Mana', -1, 16412, 65535, 127, 131071, 0, 2, 0, 0, 1219, 1), + (1664, 'Twinproc', -1, 50175, 65535, 127, 131071, 0, 3, 0, 0, 12416, 1), + (1665, 'Tactical Mastery', -1, 16596, 65535, 127, 131071, 0, 3, 0, 0, 12419, 1), + (1666, 'Group Perfected Levitation', -1, 31272, 65535, 127, 131071, 0, 2, 0, 0, 12422, 1), + (1667, 'Quickened Encroaching Darkness', -1, 1040, 65535, 127, 131071, 0, 2, 0, 0, 6026, 1), + (1668, 'Acute Focus of Arcanum', -1, 15904, 65535, 127, 131071, 0, 3, 0, 0, 8260, 1), + (1669, 'Flurry', -1, 20, 65535, 127, 131071, 0, 3, 0, 0, 5806, 1), + (1680, 'Hastened Flash of Anger', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 13905, 1), + (1681, 'Hastened Bazu Roar', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 13908, 1), + (1682, 'Hastened Scowl', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 13911, 1), + (1683, 'Hastened Mark of the Mage Hunter', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 13917, 1), + (1684, 'Knowledge of Alaran Culture', 2, 65535, 65535, 127, 131071, 0, 4, 0, 0, 14017, 1), + (1685, 'Knowledge of Alaran Culture - Advanced', 2, 65535, 65535, 127, 131071, 0, 4, 0, 0, 14018, 1), + (1686, 'Brace For Impact', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 14019, 1), + (1687, 'Summon Tome of the Hero\'s Journey', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 14371, 1), + (1800, 'Enchant Planar Alloy', -1, 8192, 65535, 127, 131071, 0, 3, 0, 1, 14373, 1), + (1801, 'Mass Enchant Planar Alloy', -1, 8192, 65535, 127, 131071, 0, 3, 0, 1, 14374, 1), + (2000, 'Armor of Experience', 5, 65535, 65535, 127, 131071, 0, 4, 0, 1, 4700, 1), + (2001, 'Sneering Grin', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 15096, 1), + (2002, 'Warlord\'s Grasp', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 15099, 1), + (2003, 'Hastened Press the Attack', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 15100, 1), + (2004, 'Hastened Rage of Rallos Zek', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 15105, 1), + (2005, 'Hastened Unbroken Attention', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 15108, 1), + (2006, 'Extended Resplendant Glory', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 15113, 1), + (2007, 'Wars Sheol\'s Heroic Blade', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 15119, 1), + (2008, 'Hastened Vehement Rage', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 15120, 1), + (2009, 'Hastened Barbed Tongue', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 15123, 1), + (2010, 'Hastened Shield Topple', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 15126, 1), + (2011, 'Imperator\'s Command', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 15129, 1), + (2012, 'Imperator\'s Charge', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 15130, 1), + (2013, 'Imperator\'s Precision', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 15131, 1), + (2014, 'Hastened Divine Call', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 15132, 1), + (2015, 'Extended Divine Call', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 15135, 1), + (2016, 'Heroic Leap', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 15136, 1), + (2018, 'Helix of the Undying', -1, 20, 65535, 127, 131071, 0, 3, 0, 0, 15146, 1), + (2019, 'Group Armor of the Inquisitor', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 15147, 1), + (2020, 'Quickened Demand For Honor', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 15150, 1), + (2021, 'Extended Sanctification', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 15153, 1), + (2022, 'Extended Speed of the Savior', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 15154, 1), + (2023, 'Extended Preservation of Marr', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 15155, 1), + (2024, 'Extended Shield of Brilliance', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 15158, 1), + (2025, 'Extended Blessing of the Faithful', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 15159, 1), + (2026, 'Hastened Speed of the Savior', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 15162, 1), + (2028, 'Hastened Shield of Brilliance', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 15168, 1), + (2031, 'Purity of Death', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 15177, 1), + (2032, 'Quickened Scourge Skin', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 15179, 1), + (2034, 'Gift of the Quick Spear', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 15193, 1), + (2035, 'Extended Provocation for Power', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 15194, 1), + (2036, 'Quickened Auspice of the Hunter', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 15253, 1), + (2037, 'Chameleon\'s Gift', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 15304, 1), + (2040, 'Hastened Enraging Kicks', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 15283, 1), + (2041, 'Close Combat Mastery', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 15288, 1), + (2042, 'Quickened Cover Tracks', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 15295, 1), + (2045, 'Shield of Reverence', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 15338, 1), + (2046, 'Extended Healing Frenzy', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 15342, 1), + (2047, 'Call of the Herald', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 15343, 1), + (2048, 'Covenant of Spirit', -1, 544, 65535, 127, 131071, 0, 3, 0, 0, 15356, 1), + (2049, 'Talisman of Celerity', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 15357, 1), + (2050, 'Extended Spiritual Blessing', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 15358, 1), + (2051, 'Rejuvenation of Spirit', -1, 544, 65535, 127, 131071, 0, 3, 0, 0, 15362, 1), + (2053, 'Hastened Turgur\'s Swarm', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 15371, 1), + (2054, 'Shielding of Spirits', -1, 16930, 65535, 127, 131071, 0, 2, 0, 0, 15374, 1), + (2055, 'Hastened Lunar Healing', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 15383, 1), + (2056, 'Quickened Blessing of Ro', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 15389, 1), + (2057, 'Hastened Wall of Wind', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 15403, 1), + (2059, 'Quickened Focused Paragon of Spirit', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 15406, 1), + (2060, 'Elemental Ward', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 15200, 1), + (2061, 'Cloak of Shadows', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 15203, 1), + (2062, 'Hastened Elemental Union', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 15204, 1), + (2063, 'Hastened Virulent Talon', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 15207, 1), + (2064, 'Wind of Malosinete', -1, 4608, 65535, 127, 131071, 0, 3, 0, 0, 15210, 1), + (2065, 'Mana Reserve', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 15213, 1), + (2066, 'Second Wind Ward', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 15214, 1), + (2076, 'Steel Vengeance', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 15217, 1), + (2077, 'Extended Vapor Core', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 15220, 1), + (2078, 'Extended Stone Core', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 15223, 1), + (2079, 'Extended Fire Core', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 15226, 1), + (2080, 'Extended Ice Core', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 15229, 1), + (2081, 'Flames of Power', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 15232, 1), + (2200, 'Rune of Banishment', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 15475, 1), + (2201, 'Hastened Glyph Spray', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 15478, 1), + (2202, 'Illusions of Grandeur', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 15481, 1), + (2203, 'Illusory Ally', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 15482, 1), + (2204, 'Gracious Gift of Mana', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 15485, 1), + (2205, 'Chromatic Haze', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 15486, 1), + (2206, 'Blanket of Forgetfulness', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 15489, 1), + (2207, 'Ethereal Manipulation', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 15490, 1), + (2208, 'Quick Mezz', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 15493, 1), + (2209, 'Reactive Rune', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 15496, 1), + (2234, 'Cover Tracks', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10368, 1), + (2235, 'Imbued Ferocity', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10387, 1), + (2709, 'Perfected Dead Man Floating', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 13692, 1), + (2899, 'Levant', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 10700, 1), + (3000, 'Auroria Mastery', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 6987, 1), + (3202, 'Pet Discipline', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 7733, 1), + (3203, 'Enchant Palladium Trio', 6, 8192, 65535, 127, 131071, 0, 3, 0, 1, 7736, 1), + (3204, 'Mass Enchant Palladium', 6, 8192, 65535, 127, 131071, 0, 3, 0, 1, 7737, 1), + (3205, 'Greater Mass Enchant Palladium', 6, 8192, 65535, 127, 131071, 0, 3, 0, 1, 7738, 1), + (3206, 'Enchant Dwerium', 6, 8192, 65535, 127, 131071, 0, 3, 0, 1, 7732, 1), + (3207, 'Mass Enchant Dwerium', 6, 8192, 65535, 127, 131071, 0, 3, 0, 1, 7734, 1), + (3208, 'Enchant Palladium', 6, 8192, 65535, 127, 131071, 0, 3, 0, 1, 7735, 1), + (3209, 'Enchant Temporite', 6, 8192, 65535, 127, 131071, 0, 3, 0, 1, 7739, 1), + (3210, 'Mass Enchant Temporite', 6, 8192, 65535, 127, 131071, 0, 3, 0, 1, 7740, 1), + (3211, 'Nature\'s Reprieve', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10388, 1), + (3212, 'Hastened Divine Intervention', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 10358, 1), + (3213, 'Projection of Fury', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 10351, 1), + (3214, 'Improved Atone', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 10364, 1), + (3215, 'Projection of Doom', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 10352, 1), + (3216, 'Projection of Piety', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 10353, 1), + (3217, 'Hastened Jolting Kicks', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 12500, 1), + (3218, 'Enchant Cosgrite', 6, 8192, 65535, 127, 131071, 0, 3, 0, 1, 7741, 1), + (3219, 'Mass Enchant Cosgrite', 6, 8192, 65535, 127, 131071, 0, 3, 0, 1, 7742, 1), + (3500, 'Blessing of Light', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 10355, 1), + (3506, 'Fierce Eye', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 5717, 1), + (3511, 'Punch Mastery', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 6020, 1), + (3512, 'Companion\'s Durability', -1, 30224, 65535, 127, 131071, 0, 2, 0, 0, 6051, 1), + (3513, 'Rake\'s Deadly Aim', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6322, 1), + (3514, 'Rogue\'s Fury', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6325, 1), + (3515, 'Envenomed Blades', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6328, 1), + (3516, 'Companion of Necessity', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 6333, 1), + (3517, 'Rake\'s Powerful Aim', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6334, 1), + (3518, 'Hastened Cacophony', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 6337, 1), + (3519, 'Hastened Funeral Dirge', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 6340, 1), + (3520, 'Master\'s Hastened Combination', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 6343, 1), + (3521, 'Hastened Silent Casting', -1, 546, 65535, 127, 131071, 0, 2, 0, 0, 6346, 1), + (3522, 'Hastened Silent Casting', -1, 15360, 65535, 127, 131071, 0, 2, 0, 0, 6349, 1), + (3525, 'Precise Blow', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 5776, 1), + (3550, 'Beguiler\'s Banishment', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 5849, 1), + (3551, 'Beguiler\'s Directed Banishment', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 5870, 1), + (3600, 'Rapid Defiance', 1, 1, 65535, 127, 131071, 0, 3, 0, 1, 6136, 1), + (3646, 'Blast of Anger', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 6135, 1), + (3676, 'Gift of Life', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 10354, 1), + (3701, 'Dirge of the Sleepwalker', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 6200, 1), + (3702, 'Quick Time', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 6201, 1), + (3703, 'Steady Hands ', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 6202, 1), + (3704, 'Selo\'s Sonata', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 6205, 1), + (3705, 'Companion\'s Blessing ', -1, 30224, 65535, 127, 131071, 0, 2, 0, 0, 6206, 1), + (3706, 'Hastened Bestial Alignment ', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 6209, 1), + (3707, 'Fortify Companion ', -1, 30224, 65535, 127, 131071, 0, 2, 0, 0, 6212, 1), + (3708, 'Burst of Power ', -1, 20, 65535, 127, 131071, 0, 2, 0, 0, 6215, 1), + (3709, 'Pact of the Wurine', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 6218, 1), + (3710, 'Reckless Abandon ', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 6219, 1), + (3711, 'Gift of Resurrection', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 6222, 1), + (3713, 'Hastened Call of the Wild ', -1, 544, 65535, 127, 131071, 0, 3, 0, 0, 6228, 1), + (3714, 'Protection of Direwood', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 6232, 1), + (3716, 'Clinging Root ', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 6236, 1), + (3718, 'Critical Affliction', -1, 8194, 65535, 127, 131071, 0, 2, 0, 0, 6240, 1), + (3720, 'Mana Overburn ', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 6249, 1), + (3724, 'Knight\'s Return Strike ', -1, 20, 65535, 127, 131071, 0, 3, 0, 0, 6266, 1), + (3725, 'Hunter\'s Return Kick ', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 6269, 1), + (3726, 'Hastened Ligament Slice ', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6272, 1), + (3727, 'Knave\'s Return Strike', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 6275, 1), + (3728, 'Storm Strike', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 6278, 1), + (3729, 'Turgur\'s Swarm', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 6281, 1), + (3730, 'Silent Presence', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 6282, 1), + (3731, 'Infused by Rage ', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 6283, 1), + (3732, 'Gut Punch', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 6286, 1), + (3733, 'Warlord\'s Return Kick', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 6287, 1), + (3734, 'Arcomancy ', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 6290, 1), + (3800, 'Blessing of Resurrection', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 6299, 1), + (3801, 'General Sturdiness', -1, 65535, 65535, 127, 131071, 0, 1, 0, 0, 6119, 1), + (3802, 'Shield Block', -1, 392, 65535, 127, 131071, 0, 2, 0, 0, 6124, 1), + (3803, 'Hastened Trueshot', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 6355, 1), + (3804, 'Outrider\'s Accuracy', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 6370, 1), + (3805, 'Hastened Mend', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 4801, 1), + (3812, 'Perfected Invisibility', -1, 14336, 65535, 127, 131071, 0, 3, 0, 0, 7069, 1), + (3813, 'Spell Casting Reinforcement', -1, 7168, 65535, 127, 131071, 0, 2, 0, 0, 6257, 1), + (3815, 'Destructive Cascade', -1, 9776, 65535, 127, 131071, 0, 3, 0, 0, 6375, 1), + (3816, 'Companion\'s Relocation', -1, 30224, 65535, 127, 131071, 0, 3, 0, 0, 6379, 1), + (3817, 'Focused Paragon of Spirits', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 6380, 1), + (3818, 'Companion\'s Agility', -1, 30224, 65535, 127, 131071, 0, 3, 0, 0, 6383, 1), + (3819, 'Maestro\'s Concentration', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 6386, 1), + (3820, 'Blessing of Life', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 6395, 1), + (3821, 'Quickened Harvest of Druzzil', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 6503, 1), + (3822, 'Chattering Bones', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 6508, 1), + (3823, 'Warlord\'s Deadly Aim', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 6511, 1), + (3824, 'Quickened Call of the Wild', -1, 544, 65535, 127, 131071, 0, 3, 0, 0, 6514, 1), + (3826, 'Force of Disruption', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 5984, 1), + (3830, 'Hastened Divine Avatar', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 7100, 1), + (3831, 'Hastened Purification', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 7103, 1), + (3832, 'Beastlords Feral Kick', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 7106, 1), + (3833, 'Burst of Power ', -1, 32841, 65535, 127, 131071, 0, 2, 0, 0, 6409, 1), + (3834, 'Burst of Power ', -1, 256, 65535, 127, 131071, 0, 2, 0, 0, 6419, 1), + (3835, 'Shield Block', -1, 15360, 65535, 127, 131071, 0, 2, 0, 0, 6428, 1), + (3836, 'Holy Root', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 6436, 1), + (3837, 'Burst of Power ', -1, 16512, 65535, 127, 131071, 0, 2, 0, 0, 6060, 1), + (3838, 'Quickened Suspend Minion', -1, 30224, 65535, 127, 131071, 0, 3, 0, 0, 6445, 1), + (3839, 'Quickened Summon Axes', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 6452, 1), + (3840, 'Recourse of Life', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 6601, 1), + (3841, 'Call Hither', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 6455, 1), + (3842, 'Fortified Survival', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 6458, 1), + (3843, 'Fortified Intervention', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 6461, 1), + (3865, 'Planar Durability', -1, 72, 65535, 127, 131071, 0, 3, 0, 0, 6422, 1), + (3890, 'Hastened Force of Will', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 7822, 1), + (3891, 'Hastened Burnout', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 7832, 1), + (3892, 'Hastened Rumbling Servant', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 7828, 1), + (3893, 'Extended Rumbling Servant', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 7827, 1), + (3899, 'Furious Leap', -1, 32769, 65535, 127, 131071, 0, 3, 0, 0, 6499, 1), + (4001, 'Undaunted Fury', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 7407, 1), + (4002, 'Frenzied Volley', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 7818, 1), + (4200, 'Hastened Forceful Rejuvenation', -1, 32318, 65535, 127, 131071, 0, 2, 0, 0, 12475, 1), + (4666, 'Shield Specialist', -1, 20, 65535, 127, 131071, 0, 3, 0, 0, 4666, 1), + (5000, 'Glyph of Courage', 7, 65535, 65535, 127, 131071, 0, 4, 1, 0, 7000, 1), + (5002, 'Glyph of Stored Life', 7, 65535, 65535, 127, 131071, 0, 4, 1, 0, 7002, 1), + (5003, 'Glyph of Frantic Infusion', 7, 30224, 65535, 127, 131071, 0, 4, 1, 0, 7003, 1), + (5004, 'Glyph of Angry Thoughts', 7, 65535, 65535, 127, 131071, 0, 4, 1, 0, 7004, 1), + (5005, 'Foraging', 8, 65535, 65535, 127, 131071, 0, 1, 0, 0, 7062, 1), + (6000, 'Harm Touch', 9, 16, 65535, 127, 131071, 0, 3, 0, 0, 7800, 1), + (6001, 'Lay on Hands', 9, 4, 65535, 127, 131071, 0, 3, 0, 0, 7850, 1), + (6002, 'Hunter\'s Attack Power', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 6546, 1), + (6106, 'Sustained Destruction', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 6106, 1), + (6302, 'Hastened Reckless Abandon', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 6302, 1), + (6362, 'Hastened Recklessness', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 6362, 1), + (6478, 'Hastened Blessing of Resurrection', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 6478, 1), + (6481, 'Hastened Divine Resurrection', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 6481, 1), + (6488, 'Flurry of Life', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 6488, 1), + (6489, 'Hastened Holyforge', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 6489, 1), + (6492, 'Inquisitor\'s Judgement', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 6492, 1), + (6988, 'Extended Group Bestial Alignment', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 6988, 1), + (7000, 'Voice of Thule', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 6639, 1), + (7001, 'Zan Fi\'s Whistle', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 7872, 1), + (7002, 'Summon Remains', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 9500, 1), + (7003, 'Forceful Rejuvenation', -1, 32318, 65535, 127, 131071, 0, 2, 0, 0, 9502, 1), + (7007, 'Summon Remains', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 9501, 1), + (7009, 'Teleport Bind', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 1419, 1), + (7016, 'Glyph of the Master', 7, 65535, 65535, 127, 131071, 0, 4, 1, 0, 7016, 1), + (7017, 'Glyph of Lost Secrets', 7, 32318, 65535, 127, 131071, 0, 4, 1, 0, 7017, 1), + (7018, 'Glyph of Genari Might', 7, 65535, 65535, 127, 131071, 0, 4, 1, 0, 7018, 1), + (7019, 'Glyph of the Cataclysm', 7, 65535, 65535, 127, 131071, 0, 4, 1, 0, 7019, 1), + (7025, 'Group Shrink', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 7669, 1), + (7033, 'Lasting Bravery', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 7033, 1), + (7036, 'Hastened Blast of Anger', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 7036, 1), + (7050, 'Call of the Hero', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 1017, 1), + (7060, 'Precision of Axes', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 4809, 1), + (7070, 'Hastened Distraction Attack', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 6941, 1), + (7105, 'Deathly Pact', -1, 1040, 65535, 127, 131071, 0, 3, 0, 0, 976, 1), + (7106, 'Planar Durability', -1, 16768, 65535, 127, 131071, 0, 3, 0, 0, 6467, 1), + (7107, 'Hastened Getaway', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 7005, 1), + (7108, 'Divine Aura', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 977, 1), + (7109, 'Hastened Wrath of the Wild', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 7664, 1), + (7689, 'Burst of Life', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 7689, 1), + (7690, 'Spirit Mastery', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 7690, 1), + (7695, 'Quickened Blood of Avoling', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 7695, 1), + (7698, 'Dead Man Floating', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 7698, 1), + (7699, 'Dread Incarnate', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 7699, 1), + (7700, 'Flurry', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 7700, 1), + (7703, 'Death Bloom', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 7703, 1), + (7712, 'Disruptive Persecution', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 7712, 1), + (7715, 'Hastened Whisperwind', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 7715, 1), + (7743, 'Hastened Guardian of the Forest', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 7743, 1), + (7746, 'Hastened Flusterbolt', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 7746, 1), + (7747, 'Volatile Arrow', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 7747, 1), + (7748, 'Pathfinder\'s Grace', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 7748, 1), + (7751, 'Hastened Cover Tracks', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 7751, 1), + (7754, 'Steed of Souls', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 7754, 1), + (7755, 'Scourge Skin', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 7755, 1), + (7756, 'Death\'s Effigy', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 7756, 1), + (7757, 'Hastened Visage of Death', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 7757, 1), + (7760, 'Hastened Hate Step', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 7760, 1), + (7801, 'Songwriting', 6, 128, 65535, 127, 131071, 0, 3, 0, 0, 9001, 1), + (7809, 'Hybrid Research', 6, 16412, 65535, 127, 131071, 0, 2, 0, 0, 9011, 1), + (7819, 'Written Prayer', 6, 546, 65535, 127, 131071, 0, 2, 0, 0, 9021, 1), + (7925, 'Sionachie\'s Crescendo', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 1018, 1), + (8081, 'Summon Resupply Agent', 5, 65535, 65535, 127, 131071, 0, 4, 0, 1, 9000, 1), + (8130, 'Summon Clockwork Banker', 5, 65535, 65535, 127, 131071, 0, 4, 0, 1, 9031, 1), + (8200, 'Hastened Dirge of the Sleepwalker', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 10329, 1), + (8201, 'Vainglorious Shout ', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 10330, 1), + (8202, 'Lyre Leap ', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 10331, 1), + (8203, 'Domination Mastery ', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 10332, 1), + (8204, 'Lyrical Prankster', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 10333, 1), + (8205, 'Selo\'s Kick ', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 10336, 1), + (8261, 'A Tune Stuck In Your Head', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 10339, 1), + (8262, 'The Show Must Go On', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 7010, 1), + (8300, 'Spell Casting Subtlety', -1, 16384, 65535, 127, 131071, 0, 2, 0, 0, 10370, 1), + (8301, 'Improved Natural Invisibility', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 10373, 1), + (8302, 'Protection of the Warder', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 10374, 1), + (8303, 'Nature\'s Salve', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 10377, 1), + (8304, 'Focus of Animus', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 10380, 1), + (8314, 'Fluid March', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 8314, 1), + (8317, 'Hastened Selo\'s Kick', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 8317, 1), + (8319, 'Hastened Bellow', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 8319, 1), + (8322, 'Belltone Mind', -1, 128, 65535, 127, 131071, 0, 3, 0, 0, 8322, 1), + (8325, 'Subtle Blows', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 8325, 1), + (8331, 'Enhanced Thief\'s Eyes', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 8331, 1), + (8332, 'Extended Languid Bite', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 8332, 1), + (8335, 'Quickened Malosinete', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 8335, 1), + (8341, 'Drape of Shadows', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 8341, 1), + (8342, 'Host in the Shell', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 8342, 1), + (8347, 'Hastened Mana Draw', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 8347, 1), + (8350, 'Hastened Mezmerization', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 8350, 1), + (8400, 'Self Preservation', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 10400, 1), + (8401, 'Hastened Frenzy', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 10401, 1), + (8402, 'Extended Havoc', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 10404, 1), + (8500, 'Healing Frenzy', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 10450, 1), + (8501, 'Overpowering Strikes', -1, 6, 65535, 127, 131071, 0, 3, 0, 0, 10453, 1), + (8502, 'Quickened Blessing of Ressurection', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 10456, 1), + (8503, 'Hastened Atonement', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 10459, 1), + (8504, 'Improved Sanctuary', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 10462, 1), + (8505, 'Blessing of Sanctuary', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 10463, 1), + (8506, 'Hastened Celestial Hammer', -1, 2, 65535, 127, 131071, 0, 3, 0, 0, 10464, 1), + (8600, 'Spirit of Eagle', -1, 40, 65535, 127, 131071, 0, 3, 0, 0, 10500, 1), + (8601, 'Flight of Eagles', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 10501, 1), + (8602, 'Egress', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 10502, 1), + (8603, 'Spirits of Nature', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 10503, 1), + (8604, 'Wall of Wind', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 10506, 1), + (8605, 'Hastened Spirit of the Wood', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 10511, 1), + (8606, 'Hastened Convergence of Spirits', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 10514, 1), + (8700, 'Beam of Slumber', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 10550, 1), + (8701, 'Phantasmic Reflex', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 10551, 1), + (8702, 'Friendly Stasis', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 10557, 1), + (8703, 'Hastened Self Stasis', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 10558, 1), + (8704, 'Forceful Banishment', -1, 8192, 65535, 127, 131071, 0, 3, 0, 0, 10561, 1), + (8708, 'Hastened Cascading Rage', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 6908, 1), + (8800, 'Force of Elements', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 10600, 1), + (8801, 'Aspect of Zomm', -1, 6144, 65535, 127, 131071, 0, 3, 0, 0, 10603, 1), + (8802, 'Extended Shared Health', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 10610, 1), + (8900, 'Agile Feet', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 10650, 1), + (8901, 'Hastened Defensive Poses', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 10653, 1), + (8902, 'Extended Impenetrable Discipline', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 10656, 1), + (8903, 'Hastened Destructive Force', -1, 64, 65535, 127, 131071, 0, 3, 0, 0, 10657, 1), + (9001, 'Reluctant Benevolence', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 10701, 1), + (9100, 'Bestow Divine Aura', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 10752, 1), + (9101, 'Blessing of Purification', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 10753, 1), + (9102, 'Sense the Dead', -1, 1030, 65535, 127, 131071, 0, 3, 0, 0, 10754, 1), + (9200, 'Hastened Auspice of the Hunter', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10800, 1), + (9201, 'Clenched Jaw', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10803, 1), + (9202, 'Scout\'s Mastery of Fire', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10806, 1), + (9203, 'Scout\'s Mastery of Ice', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10809, 1), + (9205, 'Scout\'s Mastery of Slashing', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10815, 1), + (9206, 'Scout\'s Mastery of Piercing', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10818, 1), + (9207, 'Scout\'s Mastery of Blunt Weapons', -1, 8, 65535, 127, 131071, 0, 3, 0, 0, 10821, 1), + (9300, 'Massive Strike', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 10850, 1), + (9301, 'Strikethrough', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 10853, 1), + (9400, 'Hate\'s Attraction', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 10900, 1), + (9401, 'Feigned Minion', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 10903, 1), + (9402, 'Hastened Summon Remains', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 10909, 1), + (9403, 'Visage of Death', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 10912, 1), + (9404, 'Cascading Theft of Life', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 10915, 1), + (9500, 'Extended Sloth', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 10950, 1), + (9501, 'Hastened Ancestral Aid', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 10951, 1), + (9502, 'Hastened Union of Spirits', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 10954, 1), + (9503, 'Group Shrink', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 10957, 1), + (9504, 'Inconspicuous Totem', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 10958, 1), + (9505, 'Extended Pestilence', -1, 512, 65535, 127, 131071, 0, 3, 0, 0, 10959, 1), + (9600, 'Hastened Taunt', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 11000, 1), + (9601, 'Extended Shield Reflect', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 11003, 1), + (9602, 'Extended Commanding Voice', -1, 1, 65535, 127, 131071, 0, 3, 0, 0, 11004, 1), + (9700, 'Hastened Destruction', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 11050, 1), + (9701, 'Netherstep', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 11055, 1), + (9702, 'Beam of Displacement', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 11056, 1), + (9703, 'Translocate', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 11057, 1), + (9704, 'Teleport', -1, 2048, 65535, 127, 131071, 0, 3, 0, 0, 11058, 1), + (10367, 'Ageless Enmity', -1, 1, 65535, 127, 131071, 0, 2, 0, 0, 10367, 1), + (10389, 'Extended Trickery', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 10389, 1), + (10392, 'Ageless Enmity', -1, 20, 65535, 127, 131071, 0, 2, 0, 0, 10392, 1), + (10393, 'Shackles of Tunare', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 10393, 1), + (10394, 'Beacon of the Righteous', -1, 4, 65535, 127, 131071, 0, 3, 0, 0, 10394, 1), + (10395, 'Bobbing Corpse', -1, 16, 65535, 127, 131071, 0, 3, 0, 0, 10395, 1), + (10396, 'Group Spirit of the White Wolf', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 10396, 1), + (10397, 'Group Spirit of the Black Wolf', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 10397, 1), + (10405, 'Hastened Deflection Discipline', -1, 20, 65535, 127, 131071, 0, 3, 0, 0, 10405, 1), + (10410, 'Rogue Triple Attack Skillup Test', -1, 256, 65535, 127, 131071, 0, 3, 0, 1, 10410, 1), + (10413, 'Hastened Host of the Elements', -1, 4096, 65535, 127, 131071, 0, 3, 0, 0, 10413, 1), + (10424, 'Hand of Ro', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 10424, 1), + (10425, 'Fixation of Ro', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 10425, 1), + (10426, 'Peaceful Spirit of the Wood', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 10426, 1), + (10427, 'Peaceful Convergence of Spirits', -1, 32, 65535, 127, 131071, 0, 3, 0, 0, 10427, 1), + (10434, 'Quickened Army of the Dead', -1, 1024, 65535, 127, 131071, 0, 3, 0, 0, 10434, 1), + (11073, 'Playing Possum', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 11073, 1), + (11074, 'Cat-like Reflexes', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 11074, 1), + (11077, 'Hastened Bite of the Asp', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 11077, 1), + (11078, 'Hastened Gorilla Smash', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 11078, 1), + (11079, 'Hastened Raven\'s Claw', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 11079, 1), + (11080, 'Chameleon Strike', -1, 16384, 65535, 127, 131071, 0, 3, 0, 0, 11080, 1), + (11085, 'Two Hands, No Mercy!', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 11085, 1), + (11088, 'Hastened Cry of Battle', -1, 32768, 65535, 127, 131071, 0, 3, 0, 0, 11088, 1), + (12600, 'Hastened Frenzied Stabbing', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 12600, 1), + (12603, 'Extended Frenzied Stabbing Discipline', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 12603, 1), + (12606, 'Speed of the Scoundrel', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 12606, 1), + (12607, 'Hastened Pinpoint', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 12607, 1), + (12615, 'Hastened Twisted Chance Discipline', -1, 256, 65535, 127, 131071, 0, 3, 0, 0, 12615, 1), + (15073, 'Banestrike', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 15073, 1), + (15074, 'Hastened Banestrike', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 15074, 1), + (30050, 'Unknown AA 30050', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 30050, 1), + (30100, 'Unknown AA 30100', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 30100, 1), + (30150, 'Unknown AA 30150', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 30150, 1), + (30175, 'Unknown AA 30175', 2, 65335, 65535, 127, 131071, 0, 4, 0, 1, 30175, 1), + (30180, 'Unknown AA 30180', 2, 128, 65535, 127, 131071, 0, 4, 0, 1, 30180, 1), + (30185, 'Unknown AA 30185', 2, 64, 65535, 127, 131071, 0, 4, 0, 1, 30185, 1), + (30190, 'Unknown AA 30190', 2, 8, 65535, 127, 131071, 0, 4, 0, 1, 30190, 1), + (30195, 'Unknown AA 30195', 2, 65535, 65535, 127, 131071, 0, 4, 0, 1, 30195, 1); + +DROP TABLE IF EXISTS `aa_ranks`; +CREATE TABLE IF NOT EXISTS `aa_ranks` ( + `id` int(10) unsigned NOT NULL, + `upper_hotkey_sid` int(10) NOT NULL DEFAULT '-1', + `lower_hotkey_sid` int(10) NOT NULL DEFAULT '-1', + `title_sid` int(10) NOT NULL DEFAULT '-1', + `desc_sid` int(10) NOT NULL DEFAULT '-1', + `cost` int(10) NOT NULL DEFAULT '1', + `level_req` int(10) NOT NULL DEFAULT '51', + `spell` int(10) NOT NULL DEFAULT '-1', + `spell_type` int(10) NOT NULL DEFAULT '0', + `recast_time` int(10) NOT NULL DEFAULT '0', + `expansion` int(10) NOT NULL DEFAULT '0', + `prev_id` int(10) NOT NULL DEFAULT '-1', + `next_id` int(10) NOT NULL DEFAULT '-1', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +INSERT INTO `aa_ranks` (`id`, `upper_hotkey_sid`, `lower_hotkey_sid`, `title_sid`, `desc_sid`, `cost`, `level_req`, `spell`, `spell_type`, `recast_time`, `expansion`, `prev_id`, `next_id`) VALUES + (2, -1, -1, 2, 2, 1, 51, -1, 0, 0, 3, -1, 3), + (3, -1, -1, 2, 2, 1, 51, -1, 0, 0, 3, 2, 4), + (4, -1, -1, 2, 2, 1, 51, -1, 0, 0, 3, 3, 5), + (5, -1, -1, 2, 2, 1, 51, -1, 0, 0, 3, 4, 6), + (6, -1, -1, 2, 2, 1, 51, -1, 0, 0, 3, 5, 292), + (7, -1, -1, 7, 7, 1, 51, -1, 0, 0, 3, -1, 8), + (8, -1, -1, 7, 7, 1, 51, -1, 0, 0, 3, 7, 9), + (9, -1, -1, 7, 7, 1, 51, -1, 0, 0, 3, 8, 10), + (10, -1, -1, 7, 7, 1, 51, -1, 0, 0, 3, 9, 11), + (11, -1, -1, 7, 7, 1, 51, -1, 0, 0, 3, 10, 302), + (12, -1, -1, 12, 12, 1, 51, -1, 0, 0, 3, -1, 13), + (13, -1, -1, 12, 12, 1, 51, -1, 0, 0, 3, 12, 14), + (14, -1, -1, 12, 12, 1, 51, -1, 0, 0, 3, 13, 15), + (15, -1, -1, 12, 12, 1, 51, -1, 0, 0, 3, 14, 16), + (16, -1, -1, 12, 12, 1, 51, -1, 0, 0, 3, 15, 312), + (17, -1, -1, 17, 17, 1, 51, -1, 0, 0, 3, -1, 18), + (18, -1, -1, 17, 17, 1, 51, -1, 0, 0, 3, 17, 19), + (19, -1, -1, 17, 17, 1, 51, -1, 0, 0, 3, 18, 20), + (20, -1, -1, 17, 17, 1, 51, -1, 0, 0, 3, 19, 21), + (21, -1, -1, 17, 17, 1, 51, -1, 0, 0, 3, 20, 322), + (22, -1, -1, 22, 22, 1, 51, -1, 0, 0, 3, -1, 23), + (23, -1, -1, 22, 22, 1, 51, -1, 0, 0, 3, 22, 24), + (24, -1, -1, 22, 22, 1, 51, -1, 0, 0, 3, 23, 25), + (25, -1, -1, 22, 22, 1, 51, -1, 0, 0, 3, 24, 26), + (26, -1, -1, 22, 22, 1, 51, -1, 0, 0, 3, 25, 332), + (27, -1, -1, 27, 27, 1, 51, -1, 0, 0, 3, -1, 28), + (28, -1, -1, 27, 27, 1, 51, -1, 0, 0, 3, 27, 29), + (29, -1, -1, 27, 27, 1, 51, -1, 0, 0, 3, 28, 30), + (30, -1, -1, 27, 27, 1, 51, -1, 0, 0, 3, 29, 31), + (31, -1, -1, 27, 27, 1, 51, -1, 0, 0, 3, 30, 342), + (32, -1, -1, 32, 32, 1, 51, -1, 0, 0, 3, -1, 33), + (33, -1, -1, 32, 32, 1, 51, -1, 0, 0, 3, 32, 34), + (34, -1, -1, 32, 32, 1, 51, -1, 0, 0, 3, 33, 35), + (35, -1, -1, 32, 32, 1, 51, -1, 0, 0, 3, 34, 36), + (36, -1, -1, 32, 32, 1, 51, -1, 0, 0, 3, 35, 352), + (37, -1, -1, 37, 37, 1, 51, -1, 0, 0, 3, -1, 38), + (38, -1, -1, 37, 37, 1, 51, -1, 0, 0, 3, 37, 39), + (39, -1, -1, 37, 37, 1, 51, -1, 0, 0, 3, 38, 40), + (40, -1, -1, 37, 37, 1, 51, -1, 0, 0, 3, 39, 41), + (41, -1, -1, 37, 37, 1, 51, -1, 0, 0, 3, 40, 362), + (42, -1, -1, 42, 42, 1, 51, -1, 0, 0, 3, -1, 43), + (43, -1, -1, 42, 42, 1, 51, -1, 0, 0, 3, 42, 44), + (44, -1, -1, 42, 42, 1, 51, -1, 0, 0, 3, 43, 45), + (45, -1, -1, 42, 42, 1, 51, -1, 0, 0, 3, 44, 46), + (46, -1, -1, 42, 42, 1, 51, -1, 0, 0, 3, 45, 372), + (47, -1, -1, 47, 47, 1, 51, -1, 0, 0, 3, -1, 48), + (48, -1, -1, 47, 47, 1, 51, -1, 0, 0, 3, 47, 49), + (49, -1, -1, 47, 47, 1, 51, -1, 0, 0, 3, 48, 50), + (50, -1, -1, 47, 47, 1, 51, -1, 0, 0, 3, 49, 51), + (51, -1, -1, 47, 47, 1, 51, -1, 0, 0, 3, 50, 382), + (52, -1, -1, 52, 52, 1, 51, -1, 0, 0, 3, -1, 53), + (53, -1, -1, 52, 52, 1, 51, -1, 0, 0, 3, 52, 54), + (54, -1, -1, 52, 52, 1, 51, -1, 0, 0, 3, 53, 55), + (55, -1, -1, 52, 52, 1, 51, -1, 0, 0, 3, 54, 56), + (56, -1, -1, 52, 52, 1, 51, -1, 0, 0, 3, 55, 392), + (57, -1, -1, 57, 57, 1, 51, -1, 0, 0, 3, -1, 58), + (58, -1, -1, 57, 57, 1, 51, -1, 0, 0, 3, 57, 59), + (59, -1, -1, 57, 57, 1, 51, -1, 0, 0, 3, 58, 60), + (60, -1, -1, 57, 57, 1, 51, -1, 0, 0, 3, 59, 61), + (61, -1, -1, 57, 57, 1, 51, -1, 0, 0, 3, 60, 402), + (62, -1, -1, 62, 62, 1, 51, -1, 0, 0, 3, -1, 63), + (63, -1, -1, 62, 62, 1, 51, -1, 0, 0, 3, 62, 64), + (64, -1, -1, 62, 62, 1, 51, -1, 0, 0, 3, 63, 672), + (68, -1, -1, 68, 68, 1, 51, -1, 0, 0, 3, -1, 69), + (69, -1, -1, 68, 68, 1, 51, -1, 0, 0, 3, 68, 70), + (70, -1, -1, 68, 68, 1, 51, -1, 0, 0, 3, 69, -1), + (71, -1, -1, 71, 71, 1, 51, -1, 0, 0, 3, -1, 72), + (72, -1, -1, 71, 71, 1, 51, -1, 0, 0, 3, 71, 73), + (73, -1, -1, 71, 71, 1, 51, -1, 0, 0, 3, 72, 676), + (74, -1, -1, 74, 74, 1, 51, -1, 0, 0, 3, -1, 75), + (75, -1, -1, 74, 74, 1, 51, -1, 0, 0, 3, 74, 76), + (76, -1, -1, 74, 74, 1, 51, -1, 0, 0, 3, 75, -1), + (77, -1, -1, 77, 77, 2, 55, -1, 0, 0, 3, -1, 78), + (78, -1, -1, 77, 77, 4, 55, -1, 0, 0, 3, 77, 79), + (79, -1, -1, 77, 77, 6, 55, -1, 0, 0, 3, 78, 434), + (80, -1, -1, 80, 80, 2, 55, -1, 0, 0, 3, -1, 81), + (81, -1, -1, 80, 80, 4, 55, -1, 0, 0, 3, 80, 82), + (82, -1, -1, 80, 80, 6, 55, -1, 0, 0, 3, 81, 437), + (83, -1, -1, 83, 83, 2, 55, -1, 0, 0, 3, -1, 84), + (84, -1, -1, 83, 83, 4, 55, -1, 0, 0, 3, 83, 85), + (85, -1, -1, 83, 83, 6, 55, -1, 0, 0, 3, 84, 13099), + (86, -1, -1, 86, 86, 2, 55, -1, 0, 0, 3, -1, 87), + (87, -1, -1, 86, 86, 4, 55, -1, 0, 0, 3, 86, 88), + (88, -1, -1, 86, 86, 6, 55, -1, 0, 0, 3, 87, 266), + (92, -1, -1, 92, 92, 2, 55, -1, 0, 0, 3, -1, 93), + (93, -1, -1, 92, 92, 4, 55, -1, 0, 0, 3, 92, 94), + (94, -1, -1, 92, 92, 6, 55, -1, 0, 0, 3, 93, -1), + (98, -1, -1, 98, 98, 2, 55, -1, 0, 0, 3, -1, 99), + (99, -1, -1, 98, 98, 4, 55, -1, 0, 0, 3, 98, 100), + (100, -1, -1, 98, 98, 6, 55, -1, 0, 0, 3, 99, 4767), + (101, -1, -1, 101, 101, 2, 55, -1, 0, 0, 3, -1, 102), + (102, -1, -1, 101, 101, 4, 55, -1, 0, 0, 3, 101, 103), + (103, -1, -1, 101, 101, 6, 55, -1, 0, 0, 3, 102, -1), + (104, -1, -1, 104, 104, 2, 55, -1, 0, 0, 3, -1, 105), + (105, -1, -1, 104, 104, 4, 55, -1, 0, 0, 3, 104, 106), + (106, -1, -1, 104, 104, 6, 55, -1, 0, 0, 3, 105, -1), + (107, -1, -1, 107, 107, 2, 55, -1, 0, 0, 3, -1, 108), + (108, -1, -1, 107, 107, 4, 55, -1, 0, 0, 3, 107, 109), + (109, -1, -1, 107, 107, 6, 55, -1, 0, 0, 3, 108, 7541), + (110, -1, -1, 110, 110, 2, 55, -1, 0, 0, 3, -1, 111), + (111, -1, -1, 110, 110, 4, 55, -1, 0, 0, 3, 110, 112), + (112, -1, -1, 110, 110, 6, 55, -1, 0, 0, 3, 111, -1), + (113, -1, -1, 113, 113, 2, 55, -1, 0, 0, 3, -1, 114), + (114, -1, -1, 113, 113, 4, 55, -1, 0, 0, 3, 113, 115), + (115, -1, -1, 113, 113, 6, 55, -1, 0, 0, 3, 114, 443), + (116, -1, -1, 116, 116, 2, 55, -1, 0, 0, 3, -1, 117), + (117, -1, -1, 116, 116, 4, 55, -1, 0, 0, 3, 116, 118), + (118, -1, -1, 116, 116, 6, 55, -1, 0, 0, 3, 117, -1), + (119, -1, -1, 119, 119, 2, 55, -1, 0, 0, 3, -1, 120), + (120, -1, -1, 119, 119, 4, 55, -1, 0, 0, 3, 119, 121), + (121, -1, -1, 119, 119, 6, 55, -1, 0, 0, 3, 120, 440), + (122, -1, -1, 122, 122, 2, 55, -1, 0, 0, 3, -1, 123), + (123, -1, -1, 122, 122, 4, 55, -1, 0, 0, 3, 122, 124), + (124, -1, -1, 122, 122, 6, 55, -1, 0, 0, 3, 123, 454), + (125, -1, -1, 125, 125, 2, 55, -1, 0, 0, 3, -1, 126), + (126, -1, -1, 125, 125, 4, 55, -1, 0, 0, 3, 125, 127), + (127, -1, -1, 125, 125, 6, 55, -1, 0, 0, 3, 126, 449), + (128, 128, 128, 128, 128, 9, 59, 5228, 1, 4320, 3, -1, -1), + (129, 129, 129, 129, 129, 5, 59, 2738, 2, 64800, 3, -1, -1), + (130, 130, 130, 130, 130, 3, 59, 2739, 3, 7, 3, -1, -1), + (131, 131, 131, 131, 131, 5, 59, 2740, 4, 900, 3, -1, 531), + (132, 132, 132, 132, 132, 6, 59, 2741, 5, 600, 3, -1, -1), + (136, 136, -1, 136, 136, 5, 59, 2742, 7, 1800, 3, -1, 15341), + (137, -1, -1, 137, 137, 3, 59, -1, 0, 0, 3, -1, 138), + (138, -1, -1, 137, 137, 6, 59, -1, 0, 0, 3, 137, 139), + (139, -1, -1, 137, 137, 9, 59, -1, 0, 0, 3, 138, -1), + (140, 140, -1, 140, 140, 6, 59, 2771, 3, 4320, 3, -1, -1), + (141, -1, -1, 141, 12863, 3, 59, -1, 0, 0, 3, -1, 142), + (142, -1, -1, 141, 12863, 6, 59, -1, 0, 0, 3, 141, 143), + (143, -1, -1, 141, 12863, 9, 59, -1, 0, 0, 3, 142, 12863), + (144, -1, -1, 144, 144, 5, 59, -1, 0, 0, 3, -1, -1), + (145, 145, 145, 145, 145, 9, 59, 2761, 2, 4320, 3, -1, -1), + (146, 146, 146, 146, 146, 5, 59, 2749, 2, 180, 3, -1, 5069), + (147, -1, -1, 147, 147, 3, 59, -1, 0, 0, 3, -1, 148), + (148, -1, -1, 147, 147, 6, 59, -1, 0, 0, 3, 147, 149), + (149, -1, -1, 147, 147, 9, 59, -1, 0, 0, 3, 148, -1), + (150, -1, -1, 150, 150, 3, 59, -1, 0, 0, 3, -1, 151), + (151, -1, -1, 150, 150, 6, 59, -1, 0, 0, 3, 150, 152), + (152, -1, -1, 150, 150, 9, 59, -1, 0, 0, 3, 151, -1), + (153, 153, 153, 153, 153, 5, 59, 2750, 3, 2160, 3, -1, 1519), + (155, 155, 155, 155, 155, 9, 59, 2758, 8, 60, 3, -1, 533), + (156, 156, 156, 156, 156, 6, 59, 2734, 2, 4320, 3, -1, -1), + (158, -1, -1, 158, 158, 3, 59, -1, 0, 0, 3, -1, -1), + (159, -1, -1, 159, 159, 2, 59, -1, 0, 0, 3, -1, 160), + (160, -1, -1, 159, 159, 4, 59, -1, 0, 0, 3, 159, 161), + (161, -1, -1, 159, 159, 6, 59, -1, 0, 0, 3, 160, -1), + (162, 162, 162, 162, 162, 5, 59, 2753, 3, 8640, 3, -1, -1), + (163, 163, 163, 163, 163, 5, 59, 2752, 2, 2160, 3, -1, -1), + (167, 167, 167, 167, 167, 6, 59, 2754, 14, 900, 3, -1, 5879), + (168, 168, 168, 168, 168, 3, 59, 2795, 4, 10, 3, -1, 169), + (169, 168, 168, 168, 168, 6, 59, 2796, 4, 10, 3, 168, 170), + (170, 168, 168, 168, 168, 9, 59, 2797, 4, 10, 3, 169, 15241), + (171, 171, 171, 171, 171, 3, 59, 2798, 4, 10, 3, -1, 172), + (172, 171, 171, 171, 171, 6, 59, 2799, 4, 10, 3, 171, 173), + (173, 171, 171, 171, 171, 9, 59, 2800, 4, 10, 3, 172, 15244), + (174, 174, 174, 174, 174, 3, 59, 2792, 4, 10, 3, -1, 175), + (175, 174, 174, 174, 174, 6, 59, 2793, 4, 10, 3, 174, 176), + (176, 174, 174, 174, 174, 9, 59, 2794, 4, 10, 3, 175, 15247), + (177, 177, 177, 177, 177, 3, 59, 2789, 4, 10, 3, -1, 178), + (178, 177, 177, 177, 177, 6, 59, 2790, 4, 10, 3, 177, 179), + (179, 177, 177, 177, 177, 9, 59, 2791, 4, 10, 3, 178, 15250), + (182, -1, -1, 182, 182, 5, 59, -1, 0, 0, 3, -1, -1), + (183, 183, 183, 183, 183, 9, 59, 2755, 4, 8640, 3, -1, -1), + (184, 184, 184, 184, 184, 3, 59, 2756, 5, 4320, 3, -1, 5953), + (185, 185, 185, 185, 185, 5, 59, 2757, 6, 4320, 3, -1, -1), + (186, 186, 186, 186, 186, 3, 59, 2772, 7, 7, 3, -1, -1), + (187, 187, 187, 187, 187, 6, 59, 2764, 8, 4320, 3, -1, -1), + (188, 188, 188, 188, 188, 9, 59, 2190, 2, 30, 3, -1, 1277), + (190, -1, -1, 190, 190, 3, 59, -1, 0, 0, 3, -1, 191), + (191, -1, -1, 190, 190, 6, 59, -1, 0, 0, 3, 190, 192), + (192, -1, -1, 190, 190, 9, 59, -1, 0, 0, 3, 191, 1524), + (193, 193, 193, 193, 193, 3, 59, 2775, 3, 4320, 3, -1, -1), + (194, 194, 194, 194, 194, 5, 59, 2874, 0, 1, 3, -1, -1), + (195, -1, -1, 195, 195, 6, 59, -1, 0, 0, 3, -1, -1), + (196, -1, -1, 196, 196, 6, 59, -1, 0, 0, 3, -1, -1), + (197, 197, 197, 197, 197, 5, 59, 2765, 2, 7, 3, -1, -1), + (198, -1, -1, 198, 198, 9, 59, -1, 0, 0, 3, -1, -1), + (199, -1, -1, 199, 199, 3, 59, -1, 0, 0, 3, -1, 200), + (200, -1, -1, 199, 199, 6, 59, -1, 0, 0, 3, 199, 201), + (201, -1, -1, 199, 199, 9, 59, -1, 0, 0, 3, 200, 12507), + (205, -1, -1, 205, 205, 9, 59, -1, 0, 0, 3, -1, -1), + (206, 206, 206, 206, 206, 5, 59, 2875, 0, 1, 3, -1, -1), + (208, 208, 208, 208, 208, 6, 59, 2766, 2, 4320, 3, -1, -1), + (210, -1, -1, 210, 210, 3, 59, -1, 0, 0, 3, -1, 211), + (211, -1, -1, 210, 210, 6, 59, -1, 0, 0, 3, 210, 212), + (212, -1, -1, 210, 210, 9, 59, -1, 0, 0, 3, 211, 1316), + (213, -1, -1, 213, 213, 3, 59, -1, 0, 0, 3, -1, 214), + (214, -1, -1, 213, 213, 6, 59, -1, 0, 0, 3, 213, 215), + (215, -1, -1, 213, 213, 9, 59, -1, 0, 0, 3, 214, 700), + (225, -1, -1, 225, 225, 3, 59, -1, 0, 0, 3, -1, 226), + (226, -1, -1, 225, 225, 6, 59, -1, 0, 0, 3, 225, 227), + (227, -1, -1, 225, 225, 9, 59, -1, 0, 0, 3, 226, -1), + (230, -1, -1, 230, 230, 3, 59, -1, 0, 0, 3, -1, 231), + (231, -1, -1, 230, 230, 6, 59, -1, 0, 0, 3, 230, 232), + (232, -1, -1, 230, 230, 9, 59, -1, 0, 0, 3, 231, 539), + (233, 233, 233, 233, 233, 9, 59, 5248, 1, 1800, 3, -1, -1), + (237, -1, -1, 237, 237, 3, 59, -1, 0, 0, 3, -1, 238), + (238, -1, -1, 237, 237, 6, 59, -1, 0, 0, 3, 237, 239), + (239, -1, -1, 237, 237, 9, 59, -1, 0, 0, 3, 238, -1), + (240, -1, -1, 240, 240, 3, 59, -1, 0, 0, 3, -1, 241), + (241, -1, -1, 240, 240, 6, 59, -1, 0, 0, 3, 240, 242), + (242, -1, -1, 240, 240, 9, 59, -1, 0, 0, 3, 241, -1), + (243, 243, -1, 243, 243, 9, 59, 5244, 1, 1440, 3, -1, -1), + (244, -1, -1, 244, 244, 3, 59, -1, 0, 0, 3, -1, 245), + (245, -1, -1, 244, 244, 6, 59, -1, 0, 0, 3, 244, 246), + (246, -1, -1, 244, 244, 9, 59, -1, 0, 0, 3, 245, 8328), + (247, -1, -1, 247, 247, 3, 59, -1, 0, 0, 3, -1, 248), + (248, -1, -1, 247, 247, 6, 59, -1, 0, 0, 3, 247, 249), + (249, -1, -1, 247, 247, 9, 59, -1, 0, 0, 3, 248, 504), + (254, 254, 254, 254, 254, 5, 59, 5232, 12, 4320, 3, -1, -1), + (255, -1, -1, 255, 255, 3, 59, -1, 0, 0, 3, -1, 256), + (256, -1, -1, 255, 255, 6, 59, -1, 0, 0, 3, 255, 257), + (257, -1, -1, 255, 255, 9, 59, -1, 0, 0, 3, 256, 542), + (258, 258, -1, 258, 258, 5, 59, 5233, 1, 600, 3, -1, 10578), + (259, 259, 259, 259, 259, 5, 59, 5234, 2, 900, 3, -1, -1), + (260, 260, -1, 260, 260, 3, 59, 5229, 3, 2160, 3, -1, 261), + (261, 260, -1, 260, 260, 6, 59, 5230, 3, 2160, 3, 260, 262), + (262, 260, -1, 260, 260, 9, 59, 5231, 3, 2160, 3, 261, 8309), + (263, -1, -1, 263, 263, 3, 59, -1, 0, 0, 3, -1, 264), + (264, -1, -1, 263, 263, 6, 59, -1, 0, 0, 3, 263, 265), + (265, -1, -1, 263, 263, 9, 59, -1, 0, 0, 3, 264, -1), + (266, -1, -1, 86, 86, 8, 59, -1, 0, 0, 3, 88, 10467), + (267, -1, -1, 267, 267, 3, 59, -1, 0, 0, 3, -1, 268), + (268, -1, -1, 267, 267, 6, 59, -1, 0, 0, 3, 267, 269), + (269, -1, -1, 267, 267, 9, 59, -1, 0, 0, 3, 268, 640), + (273, -1, -1, 273, 273, 5, 59, 2767, 0, 0, 3, -1, -1), + (274, 274, 274, 274, 274, 5, 59, 2748, 4, 4320, 3, -1, -1), + (275, -1, -1, 275, 275, 3, 59, -1, 0, 0, 3, -1, 276), + (276, -1, -1, 275, 275, 6, 59, -1, 0, 0, 3, 275, 277), + (277, -1, -1, 275, 275, 9, 59, -1, 0, 0, 3, 276, 701), + (278, -1, -1, 278, 278, 5, 59, -1, 0, 0, 3, -1, -1), + (279, -1, -1, 279, 279, 5, 59, -1, 0, 0, 3, -1, 18972), + (280, -1, -1, 280, 280, 3, 59, -1, 0, 0, 3, -1, 281), + (281, -1, -1, 280, 280, 6, 59, -1, 0, 0, 3, 280, 282), + (282, -1, -1, 280, 280, 9, 59, -1, 0, 0, 3, 281, -1), + (283, -1, -1, 283, 283, 3, 59, -1, 0, 0, 3, -1, 284), + (284, -1, -1, 283, 283, 6, 59, -1, 0, 0, 3, 283, 285), + (285, -1, -1, 283, 283, 9, 59, -1, 0, 0, 3, 284, -1), + (286, -1, -1, 286, 286, 3, 59, -1, 0, 0, 3, -1, -1), + (287, -1, -1, 287, 287, 6, 59, -1, 0, 0, 3, -1, -1), + (288, -1, -1, 288, 288, 6, 59, -1, 0, 0, 3, -1, -1), + (289, 289, 289, 289, 289, 5, 59, 3290, 3, 300, 3, -1, 1607), + (290, 290, 290, 290, 290, 4, 59, 3289, 4, 720, 3, -1, 13173), + (291, 291, 291, 291, 291, 6, 59, 3291, 5, 900, 3, -1, 1123), + (292, -1, -1, 2, 2, 1, 61, -1, 0, 0, 4, 6, 293), + (293, -1, -1, 2, 2, 1, 61, -1, 0, 0, 4, 292, 294), + (294, -1, -1, 2, 2, 1, 62, -1, 0, 0, 4, 293, 295), + (295, -1, -1, 2, 2, 1, 62, -1, 0, 0, 4, 294, 296), + (296, -1, -1, 2, 2, 1, 63, -1, 0, 0, 4, 295, 297), + (297, -1, -1, 2, 2, 1, 63, -1, 0, 0, 4, 296, 298), + (298, -1, -1, 2, 2, 1, 64, -1, 0, 0, 4, 297, 299), + (299, -1, -1, 2, 2, 1, 64, -1, 0, 0, 4, 298, 300), + (300, -1, -1, 2, 2, 1, 65, -1, 0, 0, 4, 299, 301), + (301, -1, -1, 2, 2, 1, 65, -1, 0, 0, 4, 300, -1), + (302, -1, -1, 7, 7, 1, 61, -1, 0, 0, 4, 11, 303), + (303, -1, -1, 7, 7, 1, 61, -1, 0, 0, 4, 302, 304), + (304, -1, -1, 7, 7, 1, 62, -1, 0, 0, 4, 303, 305), + (305, -1, -1, 7, 7, 1, 62, -1, 0, 0, 4, 304, 306), + (306, -1, -1, 7, 7, 1, 63, -1, 0, 0, 4, 305, 307), + (307, -1, -1, 7, 7, 1, 63, -1, 0, 0, 4, 306, 308), + (308, -1, -1, 7, 7, 1, 64, -1, 0, 0, 4, 307, 309), + (309, -1, -1, 7, 7, 1, 64, -1, 0, 0, 4, 308, 310), + (310, -1, -1, 7, 7, 1, 65, -1, 0, 0, 4, 309, 311), + (311, -1, -1, 7, 7, 1, 65, -1, 0, 0, 4, 310, -1), + (312, -1, -1, 12, 12, 1, 61, -1, 0, 0, 4, 16, 313), + (313, -1, -1, 12, 12, 1, 61, -1, 0, 0, 4, 312, 314), + (314, -1, -1, 12, 12, 1, 62, -1, 0, 0, 4, 313, 315), + (315, -1, -1, 12, 12, 1, 62, -1, 0, 0, 4, 314, 316), + (316, -1, -1, 12, 12, 1, 63, -1, 0, 0, 4, 315, 317), + (317, -1, -1, 12, 12, 1, 63, -1, 0, 0, 4, 316, 318), + (318, -1, -1, 12, 12, 1, 64, -1, 0, 0, 4, 317, 319), + (319, -1, -1, 12, 12, 1, 64, -1, 0, 0, 4, 318, 320), + (320, -1, -1, 12, 12, 1, 65, -1, 0, 0, 4, 319, 321), + (321, -1, -1, 12, 12, 1, 65, -1, 0, 0, 4, 320, -1), + (322, -1, -1, 17, 17, 1, 61, -1, 0, 0, 4, 21, 323), + (323, -1, -1, 17, 17, 1, 61, -1, 0, 0, 4, 322, 324), + (324, -1, -1, 17, 17, 1, 62, -1, 0, 0, 4, 323, 325), + (325, -1, -1, 17, 17, 1, 62, -1, 0, 0, 4, 324, 326), + (326, -1, -1, 17, 17, 1, 63, -1, 0, 0, 4, 325, 327), + (327, -1, -1, 17, 17, 1, 63, -1, 0, 0, 4, 326, 328), + (328, -1, -1, 17, 17, 1, 64, -1, 0, 0, 4, 327, 329), + (329, -1, -1, 17, 17, 1, 64, -1, 0, 0, 4, 328, 330), + (330, -1, -1, 17, 17, 1, 65, -1, 0, 0, 4, 329, 331), + (331, -1, -1, 17, 17, 1, 65, -1, 0, 0, 4, 330, -1), + (332, -1, -1, 22, 22, 1, 61, -1, 0, 0, 4, 26, 333), + (333, -1, -1, 22, 22, 1, 61, -1, 0, 0, 4, 332, 334), + (334, -1, -1, 22, 22, 1, 62, -1, 0, 0, 4, 333, 335), + (335, -1, -1, 22, 22, 1, 62, -1, 0, 0, 4, 334, 336), + (336, -1, -1, 22, 22, 1, 63, -1, 0, 0, 4, 335, 337), + (337, -1, -1, 22, 22, 1, 63, -1, 0, 0, 4, 336, 338), + (338, -1, -1, 22, 22, 1, 64, -1, 0, 0, 4, 337, 339), + (339, -1, -1, 22, 22, 1, 64, -1, 0, 0, 4, 338, 340), + (340, -1, -1, 22, 22, 1, 65, -1, 0, 0, 4, 339, 341), + (341, -1, -1, 22, 22, 1, 65, -1, 0, 0, 4, 340, -1), + (342, -1, -1, 27, 27, 1, 61, -1, 0, 0, 4, 31, 343), + (343, -1, -1, 27, 27, 1, 61, -1, 0, 0, 4, 342, 344), + (344, -1, -1, 27, 27, 1, 62, -1, 0, 0, 4, 343, 345), + (345, -1, -1, 27, 27, 1, 62, -1, 0, 0, 4, 344, 346), + (346, -1, -1, 27, 27, 1, 63, -1, 0, 0, 4, 345, 347), + (347, -1, -1, 27, 27, 1, 63, -1, 0, 0, 4, 346, 348), + (348, -1, -1, 27, 27, 1, 64, -1, 0, 0, 4, 347, 349), + (349, -1, -1, 27, 27, 1, 64, -1, 0, 0, 4, 348, 350), + (350, -1, -1, 27, 27, 1, 65, -1, 0, 0, 4, 349, 351), + (351, -1, -1, 27, 27, 1, 65, -1, 0, 0, 4, 350, -1), + (352, -1, -1, 32, 32, 1, 61, -1, 0, 0, 4, 36, 353), + (353, -1, -1, 32, 32, 1, 61, -1, 0, 0, 4, 352, 354), + (354, -1, -1, 32, 32, 1, 62, -1, 0, 0, 4, 353, 355), + (355, -1, -1, 32, 32, 1, 62, -1, 0, 0, 4, 354, 356), + (356, -1, -1, 32, 32, 1, 63, -1, 0, 0, 4, 355, 357), + (357, -1, -1, 32, 32, 1, 63, -1, 0, 0, 4, 356, 358), + (358, -1, -1, 32, 32, 1, 64, -1, 0, 0, 4, 357, 359), + (359, -1, -1, 32, 32, 1, 64, -1, 0, 0, 4, 358, 360), + (360, -1, -1, 32, 32, 1, 65, -1, 0, 0, 4, 359, 361), + (361, -1, -1, 32, 32, 1, 65, -1, 0, 0, 4, 360, -1), + (362, -1, -1, 37, 37, 1, 61, -1, 0, 0, 4, 41, 363), + (363, -1, -1, 37, 37, 1, 61, -1, 0, 0, 4, 362, 364), + (364, -1, -1, 37, 37, 1, 62, -1, 0, 0, 4, 363, 365), + (365, -1, -1, 37, 37, 1, 62, -1, 0, 0, 4, 364, 366), + (366, -1, -1, 37, 37, 1, 63, -1, 0, 0, 4, 365, 367), + (367, -1, -1, 37, 37, 1, 63, -1, 0, 0, 4, 366, 368), + (368, -1, -1, 37, 37, 1, 64, -1, 0, 0, 4, 367, 369), + (369, -1, -1, 37, 37, 1, 64, -1, 0, 0, 4, 368, 370), + (370, -1, -1, 37, 37, 1, 65, -1, 0, 0, 4, 369, 371), + (371, -1, -1, 37, 37, 1, 65, -1, 0, 0, 4, 370, -1), + (372, -1, -1, 42, 42, 1, 61, -1, 0, 0, 4, 46, 373), + (373, -1, -1, 42, 42, 1, 61, -1, 0, 0, 4, 372, 374), + (374, -1, -1, 42, 42, 1, 62, -1, 0, 0, 4, 373, 375), + (375, -1, -1, 42, 42, 1, 62, -1, 0, 0, 4, 374, 376), + (376, -1, -1, 42, 42, 1, 63, -1, 0, 0, 4, 375, 377), + (377, -1, -1, 42, 42, 1, 63, -1, 0, 0, 4, 376, 378), + (378, -1, -1, 42, 42, 1, 64, -1, 0, 0, 4, 377, 379), + (379, -1, -1, 42, 42, 1, 64, -1, 0, 0, 4, 378, 380), + (380, -1, -1, 42, 42, 1, 65, -1, 0, 0, 4, 379, 381), + (381, -1, -1, 42, 42, 1, 65, -1, 0, 0, 4, 380, -1), + (382, -1, -1, 47, 47, 1, 61, -1, 0, 0, 4, 51, 383), + (383, -1, -1, 47, 47, 1, 61, -1, 0, 0, 4, 382, 384), + (384, -1, -1, 47, 47, 1, 62, -1, 0, 0, 4, 383, 385), + (385, -1, -1, 47, 47, 1, 62, -1, 0, 0, 4, 384, 386), + (386, -1, -1, 47, 47, 1, 63, -1, 0, 0, 4, 385, 387), + (387, -1, -1, 47, 47, 1, 63, -1, 0, 0, 4, 386, 388), + (388, -1, -1, 47, 47, 1, 64, -1, 0, 0, 4, 387, 389), + (389, -1, -1, 47, 47, 1, 64, -1, 0, 0, 4, 388, 390), + (390, -1, -1, 47, 47, 1, 65, -1, 0, 0, 4, 389, 391), + (391, -1, -1, 47, 47, 1, 65, -1, 0, 0, 4, 390, -1), + (392, -1, -1, 52, 52, 1, 61, -1, 0, 0, 4, 56, 393), + (393, -1, -1, 52, 52, 1, 61, -1, 0, 0, 4, 392, 394), + (394, -1, -1, 52, 52, 1, 62, -1, 0, 0, 4, 393, 395), + (395, -1, -1, 52, 52, 1, 62, -1, 0, 0, 4, 394, 396), + (396, -1, -1, 52, 52, 1, 63, -1, 0, 0, 4, 395, 397), + (397, -1, -1, 52, 52, 1, 63, -1, 0, 0, 4, 396, 398), + (398, -1, -1, 52, 52, 1, 64, -1, 0, 0, 4, 397, 399), + (399, -1, -1, 52, 52, 1, 64, -1, 0, 0, 4, 398, 400), + (400, -1, -1, 52, 52, 1, 65, -1, 0, 0, 4, 399, 401), + (401, -1, -1, 52, 52, 1, 65, -1, 0, 0, 4, 400, -1), + (402, -1, -1, 57, 57, 1, 61, -1, 0, 0, 4, 61, 403), + (403, -1, -1, 57, 57, 1, 61, -1, 0, 0, 4, 402, 404), + (404, -1, -1, 57, 57, 1, 62, -1, 0, 0, 4, 403, 405), + (405, -1, -1, 57, 57, 1, 62, -1, 0, 0, 4, 404, 406), + (406, -1, -1, 57, 57, 1, 63, -1, 0, 0, 4, 405, 407), + (407, -1, -1, 57, 57, 1, 63, -1, 0, 0, 4, 406, 408), + (408, -1, -1, 57, 57, 1, 64, -1, 0, 0, 4, 407, 409), + (409, -1, -1, 57, 57, 1, 64, -1, 0, 0, 4, 408, 410), + (410, -1, -1, 57, 57, 1, 65, -1, 0, 0, 4, 409, 411), + (411, -1, -1, 57, 57, 1, 65, -1, 0, 0, 4, 410, -1), + (412, -1, -1, 412, 412, 3, 51, -1, 0, 0, 3, -1, 413), + (413, -1, -1, 412, 412, 3, 51, -1, 0, 0, 3, 412, 414), + (414, -1, -1, 412, 412, 3, 51, -1, 0, 0, 3, 413, 415), + (415, -1, -1, 412, 412, 3, 51, -1, 0, 0, 3, 414, 416), + (416, -1, -1, 412, 412, 3, 51, -1, 0, 0, 3, 415, 417), + (417, -1, -1, 412, 412, 3, 51, -1, 0, 0, 3, 416, -1), + (418, -1, -1, 418, 418, 2, 61, -1, 0, 0, 4, -1, 419), + (419, -1, -1, 418, 418, 2, 62, -1, 0, 0, 4, 418, 420), + (420, -1, -1, 418, 418, 2, 63, -1, 0, 0, 4, 419, 421), + (421, -1, -1, 418, 418, 2, 64, -1, 0, 0, 4, 420, 422), + (422, -1, -1, 418, 418, 2, 65, -1, 0, 0, 4, 421, 1001), + (423, -1, -1, 423, 423, 3, 61, -1, 0, 0, 4, -1, 424), + (424, -1, -1, 423, 423, 3, 63, -1, 0, 0, 4, 423, 425), + (425, -1, -1, 423, 423, 3, 65, -1, 0, 0, 4, 424, -1), + (426, -1, -1, 426, 426, 3, 61, -1, 0, 0, 4, -1, 427), + (427, -1, -1, 426, 426, 3, 62, -1, 0, 0, 4, 426, 428), + (428, -1, -1, 426, 426, 3, 63, -1, 0, 0, 4, 427, 429), + (429, -1, -1, 426, 426, 3, 64, -1, 0, 0, 4, 428, 430), + (430, -1, -1, 426, 426, 3, 65, -1, 0, 0, 4, 429, -1), + (434, -1, -1, 77, 77, 2, 62, -1, 0, 0, 4, 79, 435), + (435, -1, -1, 77, 77, 4, 63, -1, 0, 0, 4, 434, 436), + (436, -1, -1, 77, 77, 6, 64, -1, 0, 0, 4, 435, 1083), + (437, -1, -1, 80, 80, 2, 62, -1, 0, 0, 4, 82, 438), + (438, -1, -1, 80, 80, 3, 63, -1, 0, 0, 4, 437, 439), + (439, -1, -1, 80, 80, 4, 64, -1, 0, 0, 4, 438, 1086), + (440, -1, -1, 119, 119, 2, 62, -1, 0, 0, 4, 121, 441), + (441, -1, -1, 119, 119, 2, 63, -1, 0, 0, 4, 440, 442), + (442, -1, -1, 119, 119, 2, 64, -1, 0, 0, 4, 441, 1053), + (443, -1, -1, 113, 113, 3, 62, -1, 0, 0, 4, 115, 444), + (444, -1, -1, 113, 113, 3, 63, -1, 0, 0, 4, 443, 445), + (445, -1, -1, 113, 113, 3, 64, -1, 0, 0, 4, 444, -1), + (446, -1, -1, 446, 735, 3, 62, -1, 0, 0, 4, -1, 447), + (447, -1, -1, 446, 735, 3, 63, -1, 0, 0, 4, 446, 448), + (448, -1, -1, 446, 735, 3, 64, -1, 0, 0, 4, 447, 7050), + (449, -1, -1, 125, 125, 3, 61, -1, 0, 0, 4, 127, 450), + (450, -1, -1, 125, 125, 3, 62, -1, 0, 0, 4, 449, 451), + (451, -1, -1, 125, 125, 3, 63, -1, 0, 0, 4, 450, 452), + (452, -1, -1, 125, 125, 3, 64, -1, 0, 0, 4, 451, 453), + (453, -1, -1, 125, 125, 3, 65, -1, 0, 0, 4, 452, 1061), + (454, -1, -1, 122, 122, 3, 61, -1, 0, 0, 4, 124, 455), + (455, -1, -1, 122, 122, 3, 62, -1, 0, 0, 4, 454, 456), + (456, -1, -1, 122, 122, 3, 63, -1, 0, 0, 4, 455, 457), + (457, -1, -1, 122, 122, 3, 64, -1, 0, 0, 4, 456, 458), + (458, -1, -1, 122, 122, 3, 65, -1, 0, 0, 4, 457, 1066), + (459, 459, 459, 459, 459, 2, 61, 3297, 8, 180, 4, -1, 460), + (460, 459, 459, 459, 459, 4, 63, 3298, 8, 180, 4, 459, 461), + (461, 459, 459, 459, 459, 6, 65, 3299, 8, 180, 4, 460, 1189), + (462, -1, -1, 462, 462, 2, 63, -1, 0, 0, 4, -1, 463), + (463, -1, -1, 462, 462, 2, 64, -1, 0, 0, 4, 462, 464), + (464, -1, -1, 462, 462, 2, 65, -1, 0, 0, 4, 463, 7994), + (468, -1, -1, 468, 468, 2, 63, -1, 0, 0, 4, -1, 469), + (469, -1, -1, 468, 468, 2, 64, -1, 0, 0, 4, 468, 470), + (470, -1, -1, 468, 468, 2, 65, -1, 0, 0, 4, 469, 6439), + (471, -1, -1, 471, 471, 2, 63, -1, 0, 0, 4, -1, 472), + (472, -1, -1, 471, 471, 2, 64, -1, 0, 0, 4, 471, 473), + (473, -1, -1, 471, 471, 2, 65, -1, 0, 0, 4, 472, 12899), + (474, -1, -1, 474, 474, 2, 63, -1, 0, 0, 4, -1, 475), + (475, -1, -1, 474, 474, 2, 64, -1, 0, 0, 4, 474, 476), + (476, -1, -1, 474, 474, 2, 65, -1, 0, 0, 4, 475, 15359), + (477, -1, -1, 477, 477, 2, 63, -1, 0, 0, 4, -1, 478), + (478, -1, -1, 477, 477, 2, 64, -1, 0, 0, 4, 477, 479), + (479, -1, -1, 477, 477, 2, 65, -1, 0, 0, 4, 478, 6233), + (480, -1, -1, 480, 480, 2, 63, -1, 0, 0, 4, -1, 481), + (481, -1, -1, 480, 480, 2, 64, -1, 0, 0, 4, 480, 482), + (482, -1, -1, 480, 480, 2, 65, -1, 0, 0, 4, 481, 4921), + (483, -1, -1, 483, 483, 2, 63, -1, 0, 0, 4, -1, 484), + (484, -1, -1, 483, 483, 2, 64, -1, 0, 0, 4, 483, 485), + (485, -1, -1, 483, 483, 2, 65, -1, 0, 0, 4, 484, -1), + (489, -1, -1, 489, 489, 3, 63, -1, 0, 0, 4, -1, 490), + (490, -1, -1, 489, 489, 3, 64, -1, 0, 0, 4, 489, 491), + (491, -1, -1, 489, 489, 3, 65, -1, 0, 0, 4, 490, 7116), + (492, -1, -1, 492, 492, 2, 63, -1, 0, 0, 4, -1, 493), + (493, -1, -1, 492, 492, 2, 64, -1, 0, 0, 4, 492, 494), + (494, -1, -1, 492, 492, 2, 65, -1, 0, 0, 4, 493, 7128), + (495, -1, -1, 495, 495, 2, 63, -1, 0, 0, 4, -1, 496), + (496, -1, -1, 495, 495, 2, 64, -1, 0, 0, 4, 495, 497), + (497, -1, -1, 495, 495, 2, 65, -1, 0, 0, 4, 496, 6260), + (498, -1, -1, 498, 498, 2, 63, -1, 0, 0, 4, -1, 499), + (499, -1, -1, 498, 498, 2, 64, -1, 0, 0, 4, 498, 500), + (500, -1, -1, 498, 498, 2, 65, -1, 0, 0, 4, 499, 886), + (501, -1, -1, 501, 501, 2, 63, -1, 0, 0, 4, -1, 502), + (502, -1, -1, 501, 501, 2, 64, -1, 0, 0, 4, 501, 503), + (503, -1, -1, 501, 501, 2, 65, -1, 0, 0, 4, 502, 6319), + (504, -1, -1, 247, 247, 3, 62, -1, 0, 0, 4, 249, 505), + (505, -1, -1, 247, 247, 3, 63, -1, 0, 0, 4, 504, 506), + (506, -1, -1, 247, 247, 3, 64, -1, 0, 0, 4, 505, -1), + (507, 507, 507, 507, 507, 3, 61, 3252, 9, 180, 4, -1, 508), + (508, 507, 507, 507, 507, 3, 63, 3253, 9, 180, 4, 507, 509), + (509, 507, 507, 507, 507, 3, 65, 3254, 9, 180, 4, 508, -1), + (510, 510, 510, 510, 510, 3, 61, 3255, 37, 240, 4, -1, 511), + (511, 510, 510, 510, 510, 3, 63, 3256, 37, 240, 4, 510, 512), + (512, 510, 510, 510, 510, 3, 65, 3257, 37, 240, 4, 511, 7425), + (513, 513, 513, 513, 513, 3, 61, 3274, 4, 120, 4, -1, 514), + (514, 513, 513, 513, 513, 3, 63, 3275, 4, 120, 4, 513, 515), + (515, 513, 513, 513, 513, 3, 65, 3276, 4, 120, 4, 514, 6095), + (516, 516, 516, 516, 516, 2, 62, 3338, 5, 480, 4, -1, 6398), + (517, 517, 517, 517, 517, 3, 61, 3258, 12, 600, 4, -1, 518), + (518, 517, 517, 517, 517, 3, 63, 3259, 12, 600, 4, 517, 519), + (519, 517, 517, 517, 517, 3, 65, 3260, 12, 600, 4, 518, 1440), + (520, 520, 520, 520, 520, 3, 61, 3265, 6, 540, 4, -1, 521), + (521, 520, 520, 520, 520, 3, 63, 3266, 6, 540, 4, 520, 522), + (522, 520, 520, 520, 520, 3, 65, 3267, 6, 540, 4, 521, 1507), + (523, 523, 523, 523, 523, 5, 61, 3268, 9, 540, 4, -1, 524), + (524, 523, 523, 523, 523, 4, 63, 3269, 9, 540, 4, 523, 525), + (525, 523, 523, 523, 523, 3, 65, 3270, 9, 540, 4, 524, -1), + (526, 526, 526, 526, 526, 5, 62, 3248, 0, 1, 4, -1, 527), + (527, 526, 526, 526, 526, 3, 64, 3249, 0, 1, 4, 526, -1), + (528, 528, 528, 528, 528, 4, 61, 3283, 5, 720, 4, -1, 529), + (529, 528, 528, 528, 528, 3, 63, 3284, 5, 720, 4, 528, 530), + (530, 528, 528, 528, 528, 2, 65, 3285, 5, 720, 4, 529, 900), + (531, 131, 131, 131, 131, 3, 63, 3250, 4, 900, 4, 131, 532), + (532, 131, 131, 131, 131, 6, 64, 3251, 4, 900, 4, 531, 1203), + (533, 155, 155, 155, 155, 6, 64, 3264, 8, 60, 4, 155, 1344), + (534, 534, 534, 534, 534, 3, 61, 3261, 4, 2160, 4, -1, 535), + (535, 534, 534, 534, 534, 3, 63, 3262, 4, 2160, 4, 534, 536), + (536, 534, 534, 534, 534, 3, 65, 3263, 4, 2160, 4, 535, 715), + (537, -1, -1, 537, 537, 3, 63, -1, 0, 0, 4, -1, 538), + (538, -1, -1, 537, 537, 3, 64, -1, 0, 0, 4, 537, -1), + (539, -1, -1, 230, 230, 2, 63, -1, 0, 0, 4, 232, 540), + (540, -1, -1, 230, 230, 4, 64, -1, 0, 0, 4, 539, 541), + (541, -1, -1, 230, 230, 6, 65, -1, 0, 0, 4, 540, 12677), + (542, -1, -1, 255, 255, 2, 63, -1, 0, 0, 4, 257, 543), + (543, -1, -1, 255, 255, 4, 64, -1, 0, 0, 4, 542, 544), + (544, -1, -1, 255, 255, 6, 65, -1, 0, 0, 4, 543, 1163), + (545, 545, 545, 545, 545, 3, 61, 3271, 3, 900, 4, -1, 546), + (546, 545, 545, 545, 545, 3, 63, 3272, 3, 900, 4, 545, 547), + (547, 545, 545, 545, 545, 3, 65, 3273, 3, 900, 4, 546, 1293), + (548, 548, 548, 548, 548, 4, 61, 3277, 5, 900, 4, -1, 549), + (549, 548, 548, 548, 548, 3, 63, 3278, 5, 900, 4, 548, 550), + (550, 548, 548, 548, 548, 2, 65, 3279, 5, 900, 4, 549, 1225), + (551, -1, -1, 551, 551, 2, 61, -1, 0, 0, 4, -1, 552), + (552, -1, -1, 551, 551, 2, 62, -1, 0, 0, 4, 551, 553), + (553, -1, -1, 551, 551, 2, 63, -1, 0, 0, 4, 552, 554), + (554, -1, -1, 551, 551, 2, 64, -1, 0, 0, 4, 553, 555), + (555, -1, -1, 551, 551, 2, 65, -1, 0, 0, 4, 554, 1633), + (556, -1, -1, 556, 556, 2, 61, -1, 0, 0, 4, -1, 557), + (557, -1, -1, 556, 556, 2, 62, -1, 0, 0, 4, 556, 558), + (558, -1, -1, 556, 556, 2, 63, -1, 0, 0, 4, 557, 559), + (559, -1, -1, 556, 556, 2, 64, -1, 0, 0, 4, 558, 560), + (560, -1, -1, 556, 556, 2, 65, -1, 0, 0, 4, 559, 1563), + (561, -1, -1, 561, 561, 2, 61, -1, 0, 0, 4, -1, 562), + (562, -1, -1, 561, 561, 4, 63, -1, 0, 0, 4, 561, 563), + (563, -1, -1, 561, 561, 6, 65, -1, 0, 0, 4, 562, 1624), + (564, -1, -1, 564, 564, 3, 61, -1, 0, 0, 4, -1, 565), + (565, -1, -1, 564, 564, 3, 63, -1, 0, 0, 4, 564, 566), + (566, -1, -1, 564, 564, 3, 65, -1, 0, 0, 4, 565, 1621), + (567, -1, -1, 567, 567, 5, 63, -1, 0, 0, 4, -1, 5061), + (574, -1, -1, 574, 574, 3, 61, -1, 0, 0, 4, -1, 575), + (575, -1, -1, 574, 574, 3, 63, -1, 0, 0, 4, 574, 576), + (576, -1, -1, 574, 574, 3, 65, -1, 0, 0, 4, 575, 7718), + (577, -1, -1, 577, 577, 2, 61, -1, 0, 0, 4, -1, 578), + (578, -1, -1, 577, 577, 4, 63, -1, 0, 0, 4, 577, 579), + (579, -1, -1, 577, 577, 6, 65, -1, 0, 0, 4, 578, -1), + (580, -1, -1, 580, 580, 4, 61, -1, 0, 0, 4, -1, 581), + (581, -1, -1, 580, 580, 3, 63, -1, 0, 0, 4, 580, 582), + (582, -1, -1, 580, 580, 2, 65, -1, 0, 0, 4, 581, -1), + (583, -1, -1, 583, 583, 2, 63, -1, 0, 0, 4, -1, 584), + (584, -1, -1, 583, 583, 2, 64, -1, 0, 0, 4, 583, 585), + (585, -1, -1, 583, 583, 2, 65, -1, 0, 0, 4, 584, -1), + (586, -1, -1, 586, 586, 2, 61, -1, 0, 0, 4, -1, 587), + (587, -1, -1, 586, 586, 4, 63, -1, 0, 0, 4, 586, 588), + (588, -1, -1, 586, 586, 6, 65, -1, 0, 0, 4, 587, 6130), + (589, -1, -1, 589, 589, 3, 61, -1, 0, 0, 4, -1, 590), + (590, -1, -1, 589, 589, 3, 63, -1, 0, 0, 4, 589, 591), + (591, -1, -1, 589, 589, 3, 65, -1, 0, 0, 4, 590, 893), + (592, 592, 592, 592, 592, 6, 63, 3282, 2, 18, 4, -1, 702), + (593, -1, -1, 593, 593, 3, 61, -1, 0, 0, 4, -1, 594), + (594, -1, -1, 593, 593, 3, 63, -1, 0, 0, 4, 593, 595), + (595, -1, -1, 593, 593, 3, 65, -1, 0, 0, 4, 594, 5972), + (596, -1, -1, 596, 596, 2, 61, -1, 0, 0, 4, -1, 597), + (597, -1, -1, 596, 596, 4, 63, -1, 0, 0, 4, 596, 598), + (598, -1, -1, 596, 596, 6, 65, -1, 0, 0, 4, 597, 5973), + (599, -1, -1, 599, 599, 2, 61, -1, 0, 0, 4, -1, 600), + (600, -1, -1, 599, 599, 4, 63, -1, 0, 0, 4, 599, 601), + (601, -1, -1, 599, 599, 6, 65, -1, 0, 0, 4, 600, 1536), + (602, -1, -1, 602, 602, 3, 61, -1, 0, 0, 4, -1, 603), + (603, -1, -1, 602, 602, 3, 63, -1, 0, 0, 4, 602, 604), + (604, -1, -1, 602, 602, 3, 65, -1, 0, 0, 4, 603, 1533), + (605, -1, -1, 605, 605, 6, 63, -1, 0, 0, 4, -1, -1), + (606, -1, -1, 606, 606, 1, 61, -1, 0, 0, 4, -1, 607), + (607, -1, -1, 606, 606, 1, 62, -1, 0, 0, 4, 606, 608), + (608, -1, -1, 606, 606, 1, 63, -1, 0, 0, 4, 607, 609), + (609, -1, -1, 606, 606, 1, 64, -1, 0, 0, 4, 608, 610), + (610, -1, -1, 606, 606, 1, 65, -1, 0, 0, 4, 609, -1), + (611, -1, -1, 611, 611, 2, 61, -1, 0, 0, 4, -1, 612), + (612, -1, -1, 611, 611, 2, 62, -1, 0, 0, 4, 611, 613), + (613, -1, -1, 611, 611, 2, 63, -1, 0, 0, 4, 612, 614), + (614, -1, -1, 611, 611, 2, 64, -1, 0, 0, 4, 613, 615), + (615, -1, -1, 611, 611, 2, 65, -1, 0, 0, 4, 614, 7175), + (616, 616, 616, 616, 616, 5, 63, 3286, 7, 900, 4, -1, 617), + (617, 616, 616, 616, 616, 4, 64, 3287, 7, 900, 4, 616, 618), + (618, 616, 616, 616, 616, 3, 65, 3288, 7, 900, 4, 617, 1248), + (619, 619, 619, 619, 619, 3, 61, 3292, 6, 900, 4, -1, 620), + (620, 619, 619, 619, 619, 2, 63, 3293, 6, 900, 4, 619, 621), + (621, 619, 619, 619, 619, 1, 65, 3294, 6, 900, 4, 620, 721), + (622, -1, -1, 622, 622, 3, 61, -1, 0, 0, 4, -1, 623), + (623, -1, -1, 622, 622, 3, 62, -1, 0, 0, 4, 622, 624), + (624, -1, -1, 622, 622, 3, 63, -1, 0, 0, 4, 623, 8329), + (625, -1, -1, 625, 625, 1, 61, -1, 0, 0, 4, -1, 626), + (626, -1, -1, 625, 625, 2, 63, -1, 0, 0, 4, 625, 627), + (627, -1, -1, 625, 625, 3, 65, -1, 0, 0, 4, 626, 4733), + (628, -1, -1, 628, 628, 2, 62, -1, 0, 0, 4, -1, 629), + (629, -1, -1, 628, 628, 4, 64, -1, 0, 0, 4, 628, -1), + (630, 630, 630, 630, 630, 6, 63, 5243, 7, 1, 4, -1, -1), + (631, -1, -1, 631, 631, 2, 61, -1, 0, 0, 4, -1, 632), + (632, -1, -1, 631, 631, 3, 63, -1, 0, 0, 4, 631, 633), + (633, -1, -1, 631, 631, 4, 65, -1, 0, 0, 4, 632, 1172), + (634, -1, -1, 634, 634, 1, 61, -1, 0, 0, 4, -1, 635), + (635, -1, -1, 634, 634, 2, 63, -1, 0, 0, 4, 634, 636), + (636, -1, -1, 634, 634, 3, 65, -1, 0, 0, 4, 635, 844), + (637, -1, -1, 637, 637, 3, 61, -1, 0, 0, 4, -1, 638), + (638, -1, -1, 637, 637, 6, 63, -1, 0, 0, 4, 637, 639), + (639, -1, -1, 637, 637, 9, 65, -1, 0, 0, 4, 638, 770), + (640, -1, -1, 267, 267, 2, 61, -1, 0, 0, 4, 269, 641), + (641, -1, -1, 267, 267, 4, 63, -1, 0, 0, 4, 640, 642), + (642, -1, -1, 267, 267, 6, 65, -1, 0, 0, 4, 641, 924), + (643, 643, 643, 643, 643, 4, 62, 5227, 0, 1, 4, -1, -1), + (644, -1, -1, 644, 644, 4, 60, -1, 0, 0, 4, -1, 1601), + (645, 645, -1, 645, 645, 4, 64, 3614, 4, 5, 4, -1, 5999), + (649, -1, -1, 649, 649, 2, 61, -1, 0, 0, 4, -1, 650), + (650, -1, -1, 649, 649, 4, 63, -1, 0, 0, 4, 649, 651), + (651, -1, -1, 649, 649, 6, 65, -1, 0, 0, 4, 650, 5860), + (652, -1, -1, 652, 652, 2, 61, -1, 0, 0, 4, -1, 653), + (653, -1, -1, 652, 652, 4, 63, -1, 0, 0, 4, 652, 654), + (654, -1, -1, 652, 652, 6, 65, -1, 0, 0, 4, 653, -1), + (655, -1, -1, 655, 655, 3, 59, -1, 0, 0, 3, -1, 656), + (656, -1, -1, 655, 655, 6, 59, -1, 0, 0, 3, 655, 657), + (657, -1, -1, 655, 655, 9, 59, -1, 0, 0, 3, 656, -1), + (658, -1, -1, 658, 658, 2, 55, -1, 0, 0, 3, -1, 659), + (659, -1, -1, 658, 658, 4, 55, -1, 0, 0, 3, 658, 660), + (660, -1, -1, 658, 658, 6, 55, -1, 0, 0, 3, 659, 5306), + (661, -1, -1, 65, 661, 1, 51, -1, 0, 0, 3, -1, 662), + (662, -1, -1, 65, 661, 1, 51, -1, 0, 0, 3, 661, 663), + (663, -1, -1, 65, 661, 1, 51, -1, 0, 0, 3, 662, 674), + (665, -1, -1, 270, 665, 3, 59, -1, 0, 0, 3, -1, 666), + (666, -1, -1, 270, 665, 6, 59, -1, 0, 0, 3, 665, 667), + (667, -1, -1, 270, 665, 9, 59, -1, 0, 0, 3, 666, 668), + (668, -1, -1, 270, 665, 2, 63, -1, 0, 0, 4, 667, 669), + (669, -1, -1, 270, 665, 2, 64, -1, 0, 0, 4, 668, 670), + (670, -1, -1, 270, 665, 2, 65, -1, 0, 0, 4, 669, 7612), + (671, -1, -1, 671, 671, 3, 59, -1, 0, 0, 3, -1, -1), + (672, -1, -1, 62, 62, 5, 61, -1, 0, 0, 7, 64, 673), + (673, -1, -1, 62, 62, 5, 61, -1, 0, 0, 7, 672, -1), + (674, -1, -1, 65, 661, 3, 61, -1, 0, 0, 7, 663, 675), + (675, -1, -1, 65, 661, 3, 61, -1, 0, 0, 7, 674, 1031), + (676, -1, -1, 71, 71, 2, 61, -1, 0, 0, 7, 73, 677), + (677, -1, -1, 71, 71, 3, 61, -1, 0, 0, 7, 676, 978), + (678, -1, -1, 678, 678, 3, 61, -1, 0, 0, 7, -1, 679), + (679, -1, -1, 678, 678, 3, 61, -1, 0, 0, 7, 678, 680), + (680, -1, -1, 678, 678, 3, 61, -1, 0, 0, 7, 679, 681), + (681, -1, -1, 678, 678, 3, 61, -1, 0, 0, 7, 680, 682), + (682, -1, -1, 678, 678, 3, 61, -1, 0, 0, 7, 681, 6518), + (683, -1, -1, 683, 683, 3, 61, -1, 0, 0, 7, -1, 684), + (684, -1, -1, 683, 683, 6, 61, -1, 0, 0, 7, 683, 685), + (685, -1, -1, 683, 683, 9, 61, -1, 0, 0, 7, 684, 1036), + (686, -1, -1, 686, 686, 5, 55, -1, 0, 0, 7, -1, 687), + (687, -1, -1, 686, 686, 5, 55, -1, 0, 0, 7, 686, 688), + (688, -1, -1, 686, 686, 5, 55, -1, 0, 0, 7, 687, 689), + (689, -1, -1, 686, 686, 5, 55, -1, 0, 0, 7, 688, 690), + (690, -1, -1, 686, 686, 5, 55, -1, 0, 0, 7, 689, 7640), + (691, -1, -1, 691, 691, 9, 55, -1, 0, 0, 7, -1, -1), + (692, -1, -1, 692, 692, 3, 55, -1, 0, 0, 7, -1, 693), + (693, -1, -1, 692, 692, 6, 55, -1, 0, 0, 7, 692, 694), + (694, -1, -1, 692, 692, 9, 55, -1, 0, 0, 7, 693, 7647), + (695, -1, -1, 695, 695, 4, 65, -1, 0, 0, 7, -1, 696), + (696, -1, -1, 695, 695, 4, 65, -1, 0, 0, 7, 695, 697), + (697, -1, -1, 695, 695, 4, 65, -1, 0, 0, 7, 696, 698), + (698, -1, -1, 695, 695, 4, 65, -1, 0, 0, 7, 697, 699), + (699, -1, -1, 695, 695, 4, 65, -1, 0, 0, 7, 698, 15529), + (700, -1, -1, 213, 213, 9, 61, -1, 0, 0, 7, 215, -1), + (701, -1, -1, 275, 275, 9, 61, -1, 0, 0, 7, 277, -1), + (702, 592, 592, 592, 592, 3, 65, 4842, 2, 18, 7, 592, 703), + (703, 592, 592, 592, 592, 3, 65, 4843, 2, 18, 7, 702, 704), + (704, 592, 592, 592, 592, 3, 65, 4844, 2, 18, 7, 703, 705), + (705, 592, 592, 592, 592, 3, 65, 4845, 2, 18, 7, 704, 706), + (706, 592, 592, 592, 592, 3, 65, 4846, 2, 18, 7, 705, 1102), + (715, 534, 534, 534, 534, 3, 65, 5112, 4, 2160, 7, 536, 716), + (716, 534, 534, 534, 534, 6, 65, 5113, 4, 2160, 7, 715, 717), + (717, 534, 534, 534, 534, 9, 65, 5114, 4, 2160, 7, 716, 1278), + (718, 718, 718, 718, 718, 3, 65, 4521, 7, 4320, 7, -1, 719), + (719, 718, 718, 718, 718, 6, 65, 4522, 7, 4320, 7, 718, 720), + (720, 718, 718, 718, 718, 9, 65, 4523, 7, 4320, 7, 719, 1019), + (721, 619, 619, 619, 619, 5, 65, 5110, 6, 900, 7, 621, 722), + (722, 619, 619, 619, 619, 5, 65, 5111, 6, 900, 7, 721, 6296), + (723, 723, 723, 723, 723, 9, 65, 4788, 6, 30, 7, -1, 4963), + (724, -1, -1, 724, 724, 3, 65, -1, 0, 0, 7, -1, 725), + (725, -1, -1, 724, 724, 3, 65, -1, 0, 0, 7, 724, 726), + (726, -1, -1, 724, 724, 3, 65, -1, 0, 0, 7, 725, 727), + (727, -1, -1, 724, 724, 3, 65, -1, 0, 0, 7, 726, 728), + (728, -1, -1, 724, 724, 3, 65, -1, 0, 0, 7, 727, 5254), + (729, -1, -1, 729, 729, 5, 65, -1, 0, 0, 7, -1, 730), + (730, -1, -1, 729, 729, 5, 65, -1, 0, 0, 7, 729, 731), + (731, -1, -1, 729, 729, 5, 65, -1, 0, 0, 7, 730, 732), + (732, -1, -1, 729, 729, 5, 65, -1, 0, 0, 7, 731, 733), + (733, -1, -1, 729, 729, 5, 65, -1, 0, 0, 7, 732, 1467), + (734, -1, -1, 734, 734, 12, 65, -1, 0, 0, 7, -1, -1), + (735, -1, -1, 735, 735, 3, 62, -1, 0, 0, 7, -1, 736), + (736, -1, -1, 735, 735, 3, 62, -1, 0, 0, 7, 735, 737), + (737, -1, -1, 735, 735, 3, 62, -1, 0, 0, 7, 736, 7056), + (738, -1, -1, 98, 738, 3, 55, -1, 0, 0, 7, -1, 739), + (739, -1, -1, 98, 738, 6, 55, -1, 0, 0, 7, 738, 740), + (740, -1, -1, 98, 738, 9, 55, -1, 0, 0, 7, 739, 5317), + (746, 746, 746, 746, 746, 3, 65, 4549, 10, 2160, 7, -1, 747), + (747, 746, 746, 746, 746, 6, 65, 4550, 10, 2160, 7, 746, 748), + (748, 746, 746, 746, 746, 9, 65, 4551, 10, 2160, 7, 747, 1491), + (749, 749, 749, 749, 749, 5, 65, 4790, 11, 1800, 7, -1, 750), + (750, 749, 749, 749, 749, 5, 65, 4791, 11, 1800, 7, 749, 751), + (751, 749, 749, 749, 749, 5, 65, 4792, 11, 1800, 7, 750, 752), + (752, 749, 749, 749, 749, 5, 65, 4793, 11, 1800, 7, 751, 753), + (753, 749, 749, 749, 749, 5, 65, 4794, 11, 1800, 7, 752, 1206), + (754, -1, -1, 754, 754, 3, 65, -1, 0, 0, 7, -1, 755), + (755, -1, -1, 754, 754, 6, 65, -1, 0, 0, 7, 754, 756), + (756, -1, -1, 754, 754, 9, 65, -1, 0, 0, 7, 755, 7659), + (757, 757, -1, 757, 757, 5, 65, 4796, 6, 1800, 7, -1, 758), + (758, 757, -1, 757, 757, 5, 65, 4797, 6, 1800, 7, 757, 759), + (759, 757, -1, 757, 757, 5, 65, 4798, 6, 1800, 7, 758, 760), + (760, 757, -1, 757, 757, 5, 65, 4799, 6, 1800, 7, 759, 761), + (761, 757, -1, 757, 757, 5, 65, 4800, 6, 1800, 7, 760, 1222), + (762, -1, -1, 762, 762, 4, 65, -1, 0, 0, 7, -1, 763), + (763, -1, -1, 762, 762, 4, 65, -1, 0, 0, 7, 762, 764), + (764, -1, -1, 762, 762, 4, 65, -1, 0, 0, 7, 763, 765), + (765, -1, -1, 762, 762, 4, 65, -1, 0, 0, 7, 764, 766), + (766, -1, -1, 762, 762, 4, 65, -1, 0, 0, 7, 765, -1), + (767, -1, -1, 767, 767, 3, 65, -1, 0, 0, 7, -1, 768), + (768, -1, -1, 767, 767, 6, 65, -1, 0, 0, 7, 767, 769), + (769, -1, -1, 767, 767, 9, 65, -1, 0, 0, 7, 768, 1099), + (770, -1, -1, 637, 637, 3, 65, -1, 0, 0, 7, 639, 771), + (771, -1, -1, 637, 637, 6, 65, -1, 0, 0, 7, 770, 772), + (772, -1, -1, 637, 637, 9, 65, -1, 0, 0, 7, 771, 4749), + (773, 773, -1, 773, 773, 3, 65, 4552, 5, 1800, 7, -1, 774), + (774, 773, -1, 773, 773, 6, 65, 4553, 5, 1800, 7, 773, 775), + (775, 773, -1, 773, 773, 9, 65, 4554, 5, 1800, 7, 774, 5854), + (776, -1, -1, 776, 776, 3, 65, -1, 0, 0, 7, -1, 777), + (777, -1, -1, 776, 776, 3, 65, -1, 0, 0, 7, 776, 778), + (778, -1, -1, 776, 776, 3, 65, -1, 0, 0, 7, 777, 779), + (779, -1, -1, 776, 776, 3, 65, -1, 0, 0, 7, 778, 780), + (780, -1, -1, 776, 776, 3, 65, -1, 0, 0, 7, 779, -1), + (781, -1, -1, 781, 781, 12, 65, -1, 0, 0, 7, -1, 5850), + (782, -1, -1, 782, 782, 3, 65, -1, 0, 0, 7, -1, 783), + (783, -1, -1, 782, 782, 6, 65, -1, 0, 0, 7, 782, 784), + (784, -1, -1, 782, 782, 9, 65, -1, 0, 0, 7, 783, -1), + (785, 785, 785, 785, 785, 5, 65, 5235, 8, 900, 7, -1, 786), + (786, 785, 785, 785, 785, 5, 65, 5236, 8, 900, 7, 785, 787), + (787, 785, 785, 785, 785, 5, 65, 5237, 8, 900, 7, 786, 788), + (788, 785, 785, 785, 785, 5, 65, 5238, 8, 900, 7, 787, 789), + (789, 785, 785, 785, 785, 5, 65, 5239, 8, 900, 7, 788, 15235), + (790, -1, -1, 790, 790, 3, 65, -1, 0, 0, 7, -1, 791), + (791, -1, -1, 790, 790, 3, 65, -1, 0, 0, 7, 790, 792), + (792, -1, -1, 790, 790, 3, 65, -1, 0, 0, 7, 791, 793), + (793, -1, -1, 790, 790, 3, 65, -1, 0, 0, 7, 792, 794), + (794, -1, -1, 790, 790, 3, 65, -1, 0, 0, 7, 793, 5259), + (795, -1, -1, 795, 795, 5, 65, -1, 0, 0, 7, -1, 796), + (796, -1, -1, 795, 795, 5, 65, -1, 0, 0, 7, 795, 797), + (797, -1, -1, 795, 795, 5, 65, -1, 0, 0, 7, 796, 798), + (798, -1, -1, 795, 795, 5, 65, -1, 0, 0, 7, 797, 799), + (799, -1, -1, 795, 795, 5, 65, -1, 0, 0, 7, 798, 1430), + (800, -1, -1, 800, 800, 3, 65, -1, 0, 0, 7, -1, 801), + (801, -1, -1, 800, 800, 6, 65, -1, 0, 0, 7, 800, 802), + (802, -1, -1, 800, 800, 9, 65, -1, 0, 0, 7, 801, -1), + (803, -1, -1, 803, 803, 3, 65, -1, 0, 0, 7, -1, 804), + (804, -1, -1, 803, 803, 6, 65, -1, 0, 0, 7, 803, 805), + (805, -1, -1, 803, 803, 9, 65, -1, 0, 0, 7, 804, -1), + (806, -1, -1, 806, 806, 12, 65, -1, 0, 0, 7, -1, -1), + (807, -1, -1, 807, 807, 3, 65, -1, 0, 0, 7, -1, 808), + (808, -1, -1, 807, 807, 6, 65, -1, 0, 0, 7, 807, 809), + (809, -1, -1, 807, 807, 9, 65, -1, 0, 0, 7, 808, 1268), + (810, -1, -1, 810, 810, 5, 65, -1, 0, 0, 7, -1, 811), + (811, -1, -1, 810, 810, 5, 65, -1, 0, 0, 7, 810, 812), + (812, -1, -1, 810, 810, 5, 65, -1, 0, 0, 7, 811, 813), + (813, -1, -1, 810, 810, 5, 65, -1, 0, 0, 7, 812, 814), + (814, -1, -1, 810, 810, 5, 65, -1, 0, 0, 7, 813, 4824), + (815, -1, -1, 815, 815, 4, 65, -1, 0, 0, 7, -1, 816), + (816, -1, -1, 815, 815, 4, 65, -1, 0, 0, 7, 815, 817), + (817, -1, -1, 815, 815, 4, 65, -1, 0, 0, 7, 816, 818), + (818, -1, -1, 815, 815, 4, 65, -1, 0, 0, 7, 817, 819), + (819, -1, -1, 815, 815, 4, 65, -1, 0, 0, 7, 818, 5141), + (820, -1, -1, 820, 820, 3, 65, -1, 0, 0, 7, -1, 821), + (821, -1, -1, 820, 820, 6, 65, -1, 0, 0, 7, 820, 822), + (822, -1, -1, 820, 820, 9, 65, -1, 0, 0, 7, 821, 1265), + (823, -1, -1, 823, 823, 5, 65, -1, 0, 0, 7, -1, 824), + (824, -1, -1, 823, 823, 5, 65, -1, 0, 0, 7, 823, 825), + (825, -1, -1, 823, 823, 5, 65, -1, 0, 0, 7, 824, 826), + (826, -1, -1, 823, 823, 5, 65, -1, 0, 0, 7, 825, 827), + (827, -1, -1, 823, 823, 5, 65, -1, 0, 0, 7, 826, -1), + (828, 828, 828, 828, 828, 3, 65, 5240, 2, 3600, 7, -1, 829), + (829, 828, 828, 828, 828, 6, 65, 5241, 2, 3600, 7, 828, 830), + (830, 828, 828, 828, 828, 9, 65, 5242, 2, 3600, 7, 829, 16250), + (834, -1, -1, 834, 834, 3, 65, -1, 0, 0, 7, -1, 835), + (835, -1, -1, 834, 834, 3, 65, -1, 0, 0, 7, 834, 836), + (836, -1, -1, 834, 834, 3, 65, -1, 0, 0, 7, 835, 837), + (837, -1, -1, 834, 834, 3, 65, -1, 0, 0, 7, 836, 838), + (838, -1, -1, 834, 834, 3, 65, -1, 0, 0, 7, 837, -1), + (839, -1, -1, 839, 839, 5, 65, -1, 0, 0, 7, -1, 840), + (840, -1, -1, 839, 839, 5, 65, -1, 0, 0, 7, 839, 841), + (841, -1, -1, 839, 839, 5, 65, -1, 0, 0, 7, 840, 842), + (842, -1, -1, 839, 839, 5, 65, -1, 0, 0, 7, 841, 843), + (843, -1, -1, 839, 839, 5, 65, -1, 0, 0, 7, 842, 5325), + (844, -1, -1, 634, 634, 5, 65, -1, 0, 0, 7, 636, 845), + (845, -1, -1, 634, 634, 5, 65, -1, 0, 0, 7, 844, 1319), + (846, -1, -1, 846, 846, 3, 65, -1, 0, 0, 7, -1, 847), + (847, -1, -1, 846, 846, 6, 65, -1, 0, 0, 7, 846, 848), + (848, -1, -1, 846, 846, 9, 65, -1, 0, 0, 7, 847, 1301), + (849, -1, -1, 849, 849, 3, 65, -1, 0, 0, 7, -1, 850), + (850, -1, -1, 849, 849, 6, 65, -1, 0, 0, 7, 849, 851), + (851, -1, -1, 849, 849, 9, 65, -1, 0, 0, 7, 850, 10621), + (852, -1, -1, 852, 852, 5, 65, -1, 0, 0, 7, -1, 853), + (853, -1, -1, 852, 852, 5, 65, -1, 0, 0, 7, 852, 854), + (854, -1, -1, 852, 852, 5, 65, -1, 0, 0, 7, 853, 5500), + (855, -1, -1, 855, 855, 5, 65, -1, 0, 0, 7, -1, 856), + (856, -1, -1, 855, 855, 5, 65, -1, 0, 0, 7, 855, 857), + (857, -1, -1, 855, 855, 5, 65, -1, 0, 0, 7, 856, 858), + (858, -1, -1, 855, 855, 5, 65, -1, 0, 0, 7, 857, 859), + (859, -1, -1, 855, 855, 5, 65, -1, 0, 0, 7, 858, 7673), + (860, 860, 860, 860, 860, 3, 65, 3297, 5, 180, 7, -1, 861), + (861, 860, 860, 860, 860, 6, 65, 3298, 5, 180, 7, 860, 862), + (862, 860, 860, 860, 860, 9, 65, 3299, 5, 180, 7, 861, 5130), + (863, 863, -1, 863, 863, 12, 65, 5248, 6, 4320, 7, -1, -1), + (864, -1, -1, 864, 864, 3, 65, -1, 0, 0, 7, -1, 865), + (865, -1, -1, 864, 864, 6, 65, -1, 0, 0, 7, 864, 866), + (866, -1, -1, 864, 864, 9, 65, -1, 0, 0, 7, 865, 1290), + (867, -1, -1, 867, 867, 5, 65, -1, 0, 0, 7, -1, 868), + (868, -1, -1, 867, 867, 5, 65, -1, 0, 0, 7, 867, 869), + (869, -1, -1, 867, 867, 5, 65, -1, 0, 0, 7, 868, 870), + (870, -1, -1, 867, 867, 5, 65, -1, 0, 0, 7, 869, 871), + (871, -1, -1, 867, 867, 5, 65, -1, 0, 0, 7, 870, 7362), + (872, 872, 872, 872, 872, 3, 65, 4802, 5, 180, 7, -1, 873), + (873, 872, 872, 872, 872, 6, 65, 4803, 5, 180, 7, 872, 874), + (874, 872, 872, 872, 872, 9, 65, 4804, 5, 180, 7, 873, 7367), + (875, 875, 875, 875, 875, 3, 65, 4805, 5, 180, 7, -1, 876), + (876, 875, 875, 875, 875, 6, 65, 4806, 5, 180, 7, 875, 877), + (877, 875, 875, 875, 875, 9, 65, 4807, 5, 180, 7, 876, 7370), + (878, -1, -1, 878, 878, 3, 65, -1, 0, 0, 7, -1, 879), + (879, -1, -1, 878, 878, 6, 65, -1, 0, 0, 7, 878, 880), + (880, -1, -1, 878, 878, 9, 65, -1, 0, 0, 7, 879, 1539), + (881, -1, -1, 881, 881, 3, 65, -1, 0, 0, 7, -1, 882), + (882, -1, -1, 881, 881, 3, 65, -1, 0, 0, 7, 881, 883), + (883, -1, -1, 881, 881, 3, 65, -1, 0, 0, 7, 882, 884), + (884, -1, -1, 881, 881, 3, 65, -1, 0, 0, 7, 883, 885), + (885, -1, -1, 881, 881, 3, 65, -1, 0, 0, 7, 884, -1), + (886, -1, -1, 498, 498, 5, 65, -1, 0, 0, 7, 500, 887), + (887, -1, -1, 498, 498, 5, 65, -1, 0, 0, 7, 886, 975), + (888, -1, -1, 888, 888, 3, 65, -1, 0, 0, 7, -1, 889), + (889, -1, -1, 888, 888, 3, 65, -1, 0, 0, 7, 888, 890), + (890, -1, -1, 888, 888, 3, 65, -1, 0, 0, 7, 889, 891), + (891, -1, -1, 888, 888, 3, 65, -1, 0, 0, 7, 890, 892), + (892, -1, -1, 888, 888, 3, 65, -1, 0, 0, 7, 891, 16267), + (893, -1, -1, 589, 589, 5, 65, -1, 0, 0, 7, 591, 894), + (894, -1, -1, 589, 589, 5, 65, -1, 0, 0, 7, 893, 5270), + (895, -1, -1, 895, 895, 5, 65, -1, 0, 0, 7, -1, 896), + (896, -1, -1, 895, 895, 5, 65, -1, 0, 0, 7, 895, 897), + (897, -1, -1, 895, 895, 5, 65, -1, 0, 0, 7, 896, 898), + (898, -1, -1, 895, 895, 5, 65, -1, 0, 0, 7, 897, 899), + (899, -1, -1, 895, 895, 5, 65, -1, 0, 0, 7, 898, 6075), + (900, 528, 528, 528, 528, 5, 65, 4826, 5, 720, 7, 530, 901), + (901, 528, 528, 528, 528, 5, 65, 4827, 5, 720, 7, 900, 6103), + (907, -1, -1, 907, 907, 5, 65, -1, 0, 0, 7, -1, 908), + (908, -1, -1, 907, 907, 5, 65, -1, 0, 0, 7, 907, 909), + (909, -1, -1, 907, 907, 5, 65, -1, 0, 0, 7, 908, 910), + (910, -1, -1, 907, 907, 5, 65, -1, 0, 0, 7, 909, 911), + (911, -1, -1, 907, 907, 5, 65, -1, 0, 0, 7, 910, 5243), + (912, 912, 912, 912, 912, 3, 65, 4925, 4, 3600, 7, -1, 913), + (913, 912, 912, 912, 912, 6, 65, 4926, 4, 3600, 7, 912, 914), + (914, 912, 912, 912, 912, 9, 65, 4927, 4, 3600, 7, 913, 1330), + (915, -1, -1, 915, 915, 3, 65, -1, 0, 0, 7, -1, 916), + (916, -1, -1, 915, 915, 6, 65, -1, 0, 0, 7, 915, 917), + (917, -1, -1, 915, 915, 9, 65, -1, 0, 0, 7, 916, -1), + (918, -1, -1, 918, 918, 3, 65, -1, 0, 0, 7, -1, 919), + (919, -1, -1, 918, 918, 6, 65, -1, 0, 0, 7, 918, 920), + (920, -1, -1, 918, 918, 9, 65, -1, 0, 0, 7, 919, -1), + (921, 921, 921, 921, 921, 12, 65, 4833, 8, 60, 7, -1, 1340), + (922, 922, 922, 922, 922, 12, 65, 4834, 8, 60, 7, -1, 1341), + (923, 923, 923, 923, 923, 12, 65, 4835, 8, 60, 7, -1, 1342), + (924, -1, -1, 267, 267, 5, 65, -1, 0, 0, 7, 642, 925), + (925, -1, -1, 267, 267, 5, 65, -1, 0, 0, 7, 924, 5133), + (926, 926, 926, 926, 926, 3, 65, 4836, 12, 1800, 7, -1, 927), + (927, 926, 926, 926, 926, 3, 65, 4837, 12, 1800, 7, 926, 928), + (928, 926, 926, 926, 926, 3, 65, 4838, 12, 1800, 7, 927, 929), + (929, 926, 926, 926, 926, 3, 65, 4839, 12, 1800, 7, 928, 930), + (930, 926, 926, 926, 926, 3, 65, 4840, 12, 1800, 7, 929, 14991), + (931, 931, 931, 931, 931, 3, 65, 5245, 13, 4320, 7, -1, 932), + (932, 931, 931, 931, 931, 6, 65, 5246, 13, 4320, 7, 931, 933), + (933, 931, 931, 931, 931, 9, 65, 5247, 13, 4320, 7, 932, -1), + (934, -1, -1, 113, 934, 2, 55, -1, 0, 0, 3, -1, 935), + (935, -1, -1, 113, 934, 4, 55, -1, 0, 0, 3, 934, 936), + (936, -1, -1, 113, 934, 6, 55, -1, 0, 0, 3, 935, 943), + (937, -1, -1, 113, 937, 2, 55, -1, 0, 0, 3, -1, 938), + (938, -1, -1, 113, 937, 4, 55, -1, 0, 0, 3, 937, 939), + (939, -1, -1, 113, 937, 6, 55, -1, 0, 0, 3, 938, 946), + (940, -1, -1, 113, 940, 2, 55, -1, 0, 0, 3, -1, 941), + (941, -1, -1, 113, 940, 4, 55, -1, 0, 0, 3, 940, 942), + (942, -1, -1, 113, 940, 6, 55, -1, 0, 0, 3, 941, 949), + (943, -1, -1, 113, 934, 3, 62, -1, 0, 0, 4, 936, 944), + (944, -1, -1, 113, 934, 3, 63, -1, 0, 0, 4, 943, 945), + (945, -1, -1, 113, 934, 3, 64, -1, 0, 0, 4, 944, -1), + (946, -1, -1, 113, 937, 3, 62, -1, 0, 0, 4, 939, 947), + (947, -1, -1, 113, 937, 3, 63, -1, 0, 0, 4, 946, 948), + (948, -1, -1, 113, 937, 3, 64, -1, 0, 0, 4, 947, -1), + (949, -1, -1, 113, 940, 3, 62, -1, 0, 0, 4, 942, 950), + (950, -1, -1, 113, 940, 3, 63, -1, 0, 0, 4, 949, 951), + (951, -1, -1, 113, 940, 3, 64, -1, 0, 0, 4, 950, -1), + (952, -1, -1, 952, 952, 3, 61, -1, 0, 0, 4, -1, 953), + (953, -1, -1, 952, 952, 3, 63, -1, 0, 0, 4, 952, 954), + (954, -1, -1, 952, 952, 3, 65, -1, 0, 0, 4, 953, -1), + (955, -1, -1, 955, 955, 3, 61, -1, 0, 0, 4, -1, 956), + (956, -1, -1, 955, 955, 3, 62, -1, 0, 0, 4, 955, 957), + (957, -1, -1, 955, 955, 3, 63, -1, 0, 0, 4, 956, 958), + (958, -1, -1, 955, 955, 3, 64, -1, 0, 0, 4, 957, 959), + (959, -1, -1, 955, 955, 3, 65, -1, 0, 0, 4, 958, -1), + (960, 960, 960, 960, 960, 9, 59, 2760, 7, 4320, 3, -1, -1), + (961, 961, 961, 961, 961, 9, 59, 2759, 11, 4320, 3, -1, -1), + (962, -1, -1, 962, 962, 5, 65, -1, 0, 0, 7, -1, 963), + (963, -1, -1, 962, 962, 5, 65, -1, 0, 0, 7, 962, 964), + (964, -1, -1, 962, 962, 5, 65, -1, 0, 0, 7, 963, 965), + (965, -1, -1, 962, 962, 5, 65, -1, 0, 0, 7, 964, 966), + (966, -1, -1, 962, 962, 5, 65, -1, 0, 0, 7, 965, 6223), + (967, 967, 967, 967, 967, 3, 65, 4564, 10, 1800, 7, -1, 968), + (968, 967, 967, 967, 967, 6, 65, 4565, 10, 1800, 7, 967, 969), + (969, 967, 967, 967, 967, 9, 65, 4566, 10, 1800, 7, 968, 6464), + (970, 970, 970, 970, 970, 5, 65, 4828, 6, 1800, 7, -1, 971), + (971, 970, 970, 970, 970, 5, 65, 4829, 6, 1800, 7, 970, 972), + (972, 970, 970, 970, 970, 5, 65, 4830, 6, 1800, 7, 971, 973), + (973, 970, 970, 970, 970, 5, 65, 4831, 6, 1800, 7, 972, 974), + (974, 970, 970, 970, 970, 5, 65, 4832, 6, 1800, 7, 973, 1324), + (975, -1, -1, 498, 498, 5, 65, -1, 0, 0, 15, 887, 13262), + (976, -1, -1, 976, 976, 5, 59, -1, 0, 0, 15, -1, -1), + (977, 977, 977, 977, 977, 6, 64, 13835, 72, 600, 15, -1, -1), + (978, -1, -1, 71, 71, 5, 68, -1, 0, 0, 8, 677, -1), + (979, -1, -1, 979, 979, 3, 59, -1, 0, 0, 8, -1, 980), + (980, -1, -1, 979, 979, 6, 59, -1, 0, 0, 8, 979, 981), + (981, -1, -1, 979, 979, 9, 59, -1, 0, 0, 8, 980, -1), + (982, -1, -1, 982, 982, 3, 59, -1, 0, 0, 8, -1, 983), + (983, -1, -1, 982, 982, 6, 59, -1, 0, 0, 8, 982, 984), + (984, -1, -1, 982, 982, 9, 59, -1, 0, 0, 8, 983, -1), + (985, -1, -1, 985, 985, 3, 59, -1, 0, 0, 8, -1, 986), + (986, -1, -1, 985, 985, 6, 59, -1, 0, 0, 8, 985, 987), + (987, -1, -1, 985, 985, 9, 59, -1, 0, 0, 8, 986, -1), + (988, -1, -1, 988, 988, 3, 59, -1, 0, 0, 8, -1, 989), + (989, -1, -1, 988, 988, 6, 59, -1, 0, 0, 8, 988, 990), + (990, -1, -1, 988, 988, 9, 59, -1, 0, 0, 8, 989, -1), + (991, -1, -1, 991, 991, 3, 59, -1, 0, 0, 8, -1, 992), + (992, -1, -1, 991, 991, 6, 59, -1, 0, 0, 8, 991, 993), + (993, -1, -1, 991, 991, 9, 59, -1, 0, 0, 8, 992, -1), + (994, -1, -1, 994, 994, 3, 59, -1, 0, 0, 8, -1, 995), + (995, -1, -1, 994, 994, 6, 59, -1, 0, 0, 8, 994, 996), + (996, -1, -1, 994, 994, 9, 59, -1, 0, 0, 8, 995, -1), + (997, -1, -1, 997, 997, 5, 60, -1, 0, 0, 8, -1, 998), + (998, -1, -1, 997, 997, 5, 65, -1, 0, 0, 8, 997, 999), + (999, -1, -1, 997, 997, 5, 70, -1, 0, 0, 8, 998, 1113), + (1000, 1000, -1, 1000, 1000, 0, 5, 5824, 20, 1080, 0, -1, -1), + (1001, -1, -1, 418, 418, 5, 66, -1, 0, 0, 8, 422, 1002), + (1002, -1, -1, 418, 418, 5, 67, -1, 0, 0, 8, 1001, 1003), + (1003, -1, -1, 418, 418, 5, 68, -1, 0, 0, 8, 1002, 1004), + (1004, -1, -1, 418, 418, 5, 69, -1, 0, 0, 8, 1003, 1005), + (1005, -1, -1, 418, 418, 5, 70, -1, 0, 0, 8, 1004, 4678), + (1006, -1, -1, 1006, 1006, 5, 66, -1, 0, 0, 8, -1, 1007), + (1007, -1, -1, 1006, 1006, 5, 67, -1, 0, 0, 8, 1006, 1008), + (1008, -1, -1, 1006, 1006, 5, 68, -1, 0, 0, 8, 1007, 1009), + (1009, -1, -1, 1006, 1006, 5, 69, -1, 0, 0, 8, 1008, 1010), + (1010, -1, -1, 1006, 1006, 5, 70, -1, 0, 0, 8, 1009, 7516), + (1011, -1, -1, 1011, 1011, 0, 51, -1, 0, 0, 8, -1, 1012), + (1012, -1, -1, 1011, 1011, 0, 51, -1, 0, 0, 8, 1011, 1013), + (1013, -1, -1, 1011, 1011, 0, 51, -1, 0, 0, 8, 1012, 1014), + (1014, -1, -1, 1011, 1011, 0, 51, -1, 0, 0, 8, 1013, 1015), + (1016, -1, -1, 1011, 1011, 0, 51, -1, 0, 0, 8, 1015, -1), + (1017, 1017, 1017, 1017, 1017, 6, 59, 16531, 75, 15, 15, -1, 13726), + (1018, 1018, 1018, 1018, 1018, 2, 63, 16455, 69, 1, 15, -1, -1), + (1019, 718, 718, 718, 718, 12, 65, 21746, 7, 4320, 16, 720, 13454), + (1021, -1, -1, 1021, 1021, 5, 51, -1, 0, 0, 8, -1, 1022), + (1022, -1, -1, 1021, 1021, 5, 55, -1, 0, 0, 8, 1021, 1023), + (1023, -1, -1, 1021, 1021, 5, 60, -1, 0, 0, 8, 1022, 1024), + (1024, -1, -1, 1021, 1021, 5, 65, -1, 0, 0, 8, 1023, 1025), + (1025, -1, -1, 1021, 1021, 5, 70, -1, 0, 0, 8, 1024, 6521), + (1026, -1, -1, 1026, 1026, 3, 66, -1, 0, 0, 8, -1, 1027), + (1027, -1, -1, 1026, 1026, 3, 67, -1, 0, 0, 8, 1026, 1028), + (1028, -1, -1, 1026, 1026, 3, 68, -1, 0, 0, 8, 1027, 1029), + (1029, -1, -1, 1026, 1026, 3, 69, -1, 0, 0, 8, 1028, 1030), + (1030, -1, -1, 1026, 1026, 3, 70, -1, 0, 0, 8, 1029, 1389), + (1031, -1, -1, 65, 661, 3, 66, -1, 0, 0, 8, 675, 1032), + (1032, -1, -1, 65, 661, 3, 67, -1, 0, 0, 8, 1031, 1033), + (1033, -1, -1, 65, 661, 3, 68, -1, 0, 0, 8, 1032, 1034), + (1034, -1, -1, 65, 661, 3, 69, -1, 0, 0, 8, 1033, 1035), + (1035, -1, -1, 65, 661, 3, 70, -1, 0, 0, 8, 1034, 4693), + (1036, -1, -1, 683, 683, 5, 66, -1, 0, 0, 8, 685, 1037), + (1037, -1, -1, 683, 683, 5, 68, -1, 0, 0, 8, 1036, 1038), + (1038, -1, -1, 683, 683, 5, 70, -1, 0, 0, 8, 1037, 5301), + (1041, -1, -1, 1041, 1041, 3, 67, -1, 0, 0, 8, -1, 1042), + (1042, -1, -1, 1041, 1041, 6, 68, -1, 0, 0, 8, 1041, 1043), + (1043, -1, -1, 1041, 1041, 9, 69, -1, 0, 0, 8, 1042, 4707), + (1044, -1, -1, 1044, 1044, 3, 67, -1, 0, 0, 8, -1, 1045), + (1045, -1, -1, 1044, 1044, 6, 68, -1, 0, 0, 8, 1044, 1046), + (1046, -1, -1, 1044, 1044, 9, 69, -1, 0, 0, 8, 1045, 4710), + (1047, -1, -1, 1047, 1047, 3, 67, -1, 0, 0, 8, -1, 1048), + (1048, -1, -1, 1047, 1047, 6, 68, -1, 0, 0, 8, 1047, 1049), + (1049, -1, -1, 1047, 1047, 9, 69, -1, 0, 0, 8, 1048, 4713), + (1050, -1, -1, 1050, 1050, 3, 67, -1, 0, 0, 8, -1, 1051), + (1051, -1, -1, 1050, 1050, 6, 68, -1, 0, 0, 8, 1050, 1052), + (1052, -1, -1, 1050, 1050, 9, 69, -1, 0, 0, 8, 1051, 4716), + (1053, -1, -1, 119, 119, 3, 66, -1, 0, 0, 8, 442, 1054), + (1054, -1, -1, 119, 119, 3, 68, -1, 0, 0, 8, 1053, 1055), + (1055, -1, -1, 119, 119, 3, 70, -1, 0, 0, 8, 1054, 4722), + (1056, -1, -1, 1056, 1056, 5, 71, -1, 0, 0, 12, -1, 1057), + (1057, -1, -1, 1056, 1056, 5, 72, -1, 0, 0, 12, 1056, 1058), + (1058, -1, -1, 1056, 1056, 5, 73, -1, 0, 0, 12, 1057, 1059), + (1059, -1, -1, 1056, 1056, 5, 74, -1, 0, 0, 12, 1058, 1060), + (1060, -1, -1, 1056, 1056, 5, 75, -1, 0, 0, 12, 1059, 6431), + (1061, -1, -1, 125, 125, 5, 66, -1, 0, 0, 8, 453, 1062), + (1062, -1, -1, 125, 125, 5, 67, -1, 0, 0, 8, 1061, 1063), + (1063, -1, -1, 125, 125, 5, 68, -1, 0, 0, 8, 1062, 1064), + (1064, -1, -1, 125, 125, 5, 69, -1, 0, 0, 8, 1063, 1065), + (1065, -1, -1, 125, 125, 5, 70, -1, 0, 0, 8, 1064, 1394), + (1066, -1, -1, 122, 122, 5, 66, -1, 0, 0, 8, 458, 1067), + (1067, -1, -1, 122, 122, 5, 67, -1, 0, 0, 8, 1066, 1068), + (1068, -1, -1, 122, 122, 5, 68, -1, 0, 0, 8, 1067, 1069), + (1069, -1, -1, 122, 122, 5, 69, -1, 0, 0, 8, 1068, 1070), + (1070, -1, -1, 122, 122, 5, 70, -1, 0, 0, 8, 1069, 1399), + (1071, -1, -1, 1071, 1071, 3, 55, -1, 0, 0, 8, -1, 4764), + (1072, -1, -1, 1072, 1072, 5, 66, -1, 0, 0, 8, -1, 1073), + (1073, -1, -1, 1072, 1072, 5, 67, -1, 0, 0, 8, 1072, 1074), + (1074, -1, -1, 1072, 1072, 5, 68, -1, 0, 0, 8, 1073, 1075), + (1075, -1, -1, 1072, 1072, 5, 69, -1, 0, 0, 8, 1074, 1076), + (1076, -1, -1, 1072, 1072, 5, 70, -1, 0, 0, 8, 1075, 4744), + (1083, -1, -1, 77, 77, 3, 66, -1, 0, 0, 8, 436, 1084), + (1084, -1, -1, 77, 77, 6, 68, -1, 0, 0, 8, 1083, 1085), + (1085, -1, -1, 77, 77, 9, 70, -1, 0, 0, 8, 1084, 12449), + (1086, -1, -1, 80, 80, 3, 66, -1, 0, 0, 8, 439, 1087), + (1087, -1, -1, 80, 80, 6, 68, -1, 0, 0, 8, 1086, 1088), + (1088, -1, -1, 80, 80, 9, 70, -1, 0, 0, 8, 1087, 4779), + (1089, -1, -1, 1089, 1089, 3, 59, -1, 0, 0, 8, -1, 1090), + (1090, -1, -1, 1089, 1089, 6, 59, -1, 0, 0, 8, 1089, 1091), + (1091, -1, -1, 1089, 1089, 9, 59, -1, 0, 0, 8, 1090, -1), + (1092, -1, -1, 1092, 1092, 7, 67, -1, 0, 0, 8, -1, -1), + (1093, -1, -1, 1093, 1093, 3, 66, -1, 0, 0, 8, -1, 1094), + (1094, -1, -1, 1093, 1093, 3, 67, -1, 0, 0, 8, 1093, 1095), + (1095, -1, -1, 1093, 1093, 3, 68, -1, 0, 0, 8, 1094, 1096), + (1096, -1, -1, 1093, 1093, 3, 69, -1, 0, 0, 8, 1095, 1097), + (1097, -1, -1, 1093, 1093, 3, 70, -1, 0, 0, 8, 1096, -1), + (1099, -1, -1, 767, 767, 3, 67, -1, 0, 0, 8, 769, 1100), + (1100, -1, -1, 767, 767, 6, 68, -1, 0, 0, 8, 1099, 1101), + (1101, -1, -1, 767, 767, 9, 69, -1, 0, 0, 8, 1100, 12423), + (1102, 592, 592, 592, 592, 3, 66, 5825, 2, 18, 8, 706, 1103), + (1103, 592, 592, 592, 592, 3, 67, 5826, 2, 18, 8, 1102, 1104), + (1104, 592, 592, 592, 592, 3, 68, 5827, 2, 18, 8, 1103, 1105), + (1105, 592, 592, 592, 592, 3, 69, 5828, 2, 18, 8, 1104, 1106), + (1106, 592, 592, 592, 592, 3, 70, 5829, 2, 18, 8, 1105, 4975), + (1107, -1, -1, 1107, 1107, 3, 66, -1, 0, 0, 8, -1, 1108), + (1108, -1, -1, 1107, 1107, 6, 68, -1, 0, 0, 8, 1107, 1109), + (1109, -1, -1, 1107, 1107, 9, 70, -1, 0, 0, 8, 1108, 5286), + (1110, 1110, 1110, 1110, 1110, 3, 68, 5830, 3, 2160, 8, -1, 1111), + (1111, 1110, 1110, 1110, 1110, 6, 69, 5831, 3, 2160, 8, 1110, 1112), + (1112, 1110, 1110, 1110, 1110, 9, 70, 5832, 3, 2160, 8, 1111, 6400), + (1113, -1, -1, 997, 997, 5, 75, -1, 0, 0, 16, 999, 1114), + (1114, -1, -1, 997, 997, 5, 80, -1, 0, 0, 16, 1113, 1115), + (1115, -1, -1, 997, 997, 5, 85, -1, 0, 0, 16, 1114, -1), + (1116, 1116, 1116, 1116, 1116, 3, 68, 5837, 4, 2160, 8, -1, 1117), + (1117, 1116, 1116, 1116, 1116, 6, 69, 5838, 4, 2160, 8, 1116, 1118), + (1118, 1116, 1116, 1116, 1116, 9, 70, 5839, 4, 2160, 8, 1117, 4980), + (1119, 1119, 1119, 1119, 1119, 3, 68, 5841, 8, 900, 8, -1, 1120), + (1120, 1119, 1119, 1119, 1119, 6, 69, 5842, 8, 900, 8, 1119, 1121), + (1121, 1119, 1119, 1119, 1119, 9, 70, 5843, 8, 900, 8, 1120, 4964), + (1122, -1, -1, 1122, 1122, 7, 67, -1, 0, 0, 8, -1, -1), + (1123, 291, 291, 291, 291, 5, 66, 5854, 5, 900, 8, 291, 1124), + (1124, 291, 291, 291, 291, 5, 68, 5855, 5, 900, 8, 1123, 1125), + (1125, 291, 291, 291, 291, 5, 70, 5856, 5, 900, 8, 1124, 4969), + (1126, 1126, 1126, 1126, 1126, 3, 67, 5845, 2, 2160, 8, -1, 1127), + (1127, 1126, 1126, 1126, 1126, 6, 68, 5846, 2, 2160, 8, 1126, 1128), + (1128, 1126, 1126, 1126, 1126, 9, 69, 5847, 2, 2160, 8, 1127, 5513), + (1129, -1, -1, 1129, 1129, 5, 67, -1, 0, 0, 8, -1, 1130), + (1130, -1, -1, 1129, 1129, 3, 69, -1, 0, 0, 8, 1129, -1), + (1131, -1, -1, 1131, 1131, 3, 59, -1, 0, 0, 3, -1, 1132), + (1132, -1, -1, 1131, 1131, 6, 59, -1, 0, 0, 3, 1131, 1133), + (1133, -1, -1, 1131, 1131, 9, 59, -1, 0, 0, 3, 1132, 11082), + (1134, -1, -1, 1134, 1134, 3, 61, -1, 0, 0, 4, -1, 1135), + (1135, -1, -1, 1134, 1134, 4, 63, -1, 0, 0, 4, 1134, 1136), + (1136, -1, -1, 1134, 1134, 5, 65, -1, 0, 0, 4, 1135, 1158), + (1137, -1, -1, 1137, 1137, 3, 59, -1, 0, 0, 3, -1, 1138), + (1138, -1, -1, 1137, 1137, 6, 59, -1, 0, 0, 3, 1137, 1139), + (1139, -1, -1, 1137, 1137, 9, 59, -1, 0, 0, 3, 1138, -1), + (1140, -1, -1, 1140, 1140, 3, 61, -1, 0, 0, 4, -1, 1141), + (1141, -1, -1, 1140, 1140, 3, 63, -1, 0, 0, 4, 1140, 1142), + (1142, -1, -1, 1140, 1140, 3, 65, -1, 0, 0, 4, 1141, -1), + (1146, 1146, 1146, 1146, 1146, 3, 59, 6040, 3, 1500, 3, -1, 1147), + (1147, 1146, 1146, 1146, 1146, 6, 59, 6041, 3, 1200, 3, 1146, 1148), + (1148, 1146, 1146, 1146, 1146, 9, 59, 6042, 3, 900, 3, 1147, -1), + (1149, 1149, -1, 1149, 1149, 12, 65, 5853, 5, 1320, 7, -1, -1), + (1150, 1150, 1150, 1150, 1150, 3, 65, 5848, 2, 2160, 7, -1, 1151), + (1151, 1150, 1150, 1150, 1150, 6, 65, 5849, 2, 2160, 7, 1150, 1152), + (1152, 1150, 1150, 1150, 1150, 9, 65, 5850, 2, 2160, 7, 1151, -1), + (1155, -1, -1, 1155, 1155, 3, 65, -1, 0, 0, 7, -1, 1156), + (1156, -1, -1, 1155, 1155, 6, 65, -1, 0, 0, 7, 1155, 1157), + (1157, -1, -1, 1155, 1155, 9, 65, -1, 0, 0, 7, 1156, -1), + (1158, -1, -1, 1134, 1134, 4, 66, -1, 0, 0, 8, 1136, 1159), + (1159, -1, -1, 1134, 1134, 4, 67, -1, 0, 0, 8, 1158, 1160), + (1160, -1, -1, 1134, 1134, 4, 68, -1, 0, 0, 8, 1159, 1161), + (1161, -1, -1, 1134, 1134, 4, 69, -1, 0, 0, 8, 1160, 1162), + (1162, -1, -1, 1134, 1134, 4, 70, -1, 0, 0, 8, 1161, 4790), + (1163, -1, -1, 255, 255, 5, 67, -1, 0, 0, 8, 544, 1164), + (1164, -1, -1, 255, 255, 5, 68, -1, 0, 0, 8, 1163, 1165), + (1165, -1, -1, 255, 255, 5, 69, -1, 0, 0, 8, 1164, 4795), + (1166, -1, -1, 1143, 1143, 3, 65, -1, 0, 0, 15, -1, 1167), + (1167, -1, -1, 1143, 1143, 6, 65, -1, 0, 0, 15, 1166, 1168), + (1168, -1, -1, 1143, 1143, 9, 65, -1, 0, 0, 15, 1167, 6911), + (1172, -1, -1, 631, 631, 5, 67, -1, 0, 0, 8, 633, 1173), + (1173, -1, -1, 631, 631, 5, 68, -1, 0, 0, 8, 1172, 1174), + (1174, -1, -1, 631, 631, 5, 69, -1, 0, 0, 8, 1173, 4798), + (1178, 1178, 1178, 1178, 1178, 3, 68, 5857, 4, 900, 8, -1, 1179), + (1179, 1178, 1178, 1178, 1178, 6, 69, 5858, 4, 900, 8, 1178, 1180), + (1180, 1178, 1178, 1178, 1178, 9, 70, 5859, 4, 900, 8, 1179, 5779), + (1181, -1, -1, 1181, 1181, 3, 66, -1, 0, 0, 8, -1, 1182), + (1182, -1, -1, 1181, 1181, 3, 67, -1, 0, 0, 8, 1181, 1183), + (1183, -1, -1, 1181, 1181, 3, 68, -1, 0, 0, 8, 1182, 1184), + (1184, -1, -1, 1181, 1181, 3, 69, -1, 0, 0, 8, 1183, 1185), + (1185, -1, -1, 1181, 1181, 3, 70, -1, 0, 0, 8, 1184, -1), + (1186, -1, -1, 1186, 1186, 3, 66, -1, 0, 0, 8, -1, 1187), + (1187, -1, -1, 1186, 1186, 6, 68, -1, 0, 0, 8, 1186, 1188), + (1188, -1, -1, 1186, 1186, 9, 70, -1, 0, 0, 8, 1187, 4776), + (1189, 459, 459, 459, 459, 3, 66, 5860, 8, 180, 8, 461, 1190), + (1190, 459, 459, 459, 459, 6, 68, 5861, 8, 180, 8, 1189, 1191), + (1191, 459, 459, 459, 459, 9, 70, 5862, 8, 180, 8, 1190, 5062), + (1192, 1192, 1192, 1192, 1192, 5, 67, 5863, 12, 1320, 8, -1, 1193), + (1193, 1192, 1192, 1192, 1192, 5, 68, 5864, 12, 1320, 8, 1192, 1194), + (1194, 1192, 1192, 1192, 1192, 5, 69, 5865, 12, 1320, 8, 1193, 5076), + (1195, 1195, 1195, 1195, 1195, 12, 70, 5866, 13, 2160, 8, -1, 5079), + (1196, -1, -1, 1196, 1196, 2, 81, -1, 0, 0, 15, -1, 1197), + (1197, -1, -1, 1196, 1196, 2, 81, -1, 0, 0, 15, 1196, 1198), + (1198, -1, -1, 1196, 1196, 2, 81, -1, 0, 0, 15, 1197, 1199), + (1199, -1, -1, 1196, 1196, 2, 81, -1, 0, 0, 15, 1198, 1200), + (1200, -1, -1, 1196, 1196, 2, 81, -1, 0, 0, 15, 1199, 10743), + (1203, 131, 131, 131, 131, 5, 67, 5869, 4, 900, 8, 532, 1204), + (1204, 131, 131, 131, 131, 5, 68, 5870, 4, 900, 8, 1203, 1205), + (1205, 131, 131, 131, 131, 5, 69, 5988, 4, 900, 8, 1204, 5070), + (1206, 749, 749, 749, 749, 5, 66, 5871, 11, 1800, 8, 753, 1207), + (1207, 749, 749, 749, 749, 5, 68, 5872, 11, 1800, 8, 1206, 1208), + (1208, 749, 749, 749, 749, 5, 70, 5873, 11, 1800, 8, 1207, 17298), + (1209, 1209, -1, 1209, 1209, 12, 70, 5912, 14, 4320, 8, -1, -1), + (1210, -1, -1, 1210, 1210, 3, 66, -1, 0, 0, 8, -1, 1211), + (1211, -1, -1, 1210, 1210, 6, 68, -1, 0, 0, 8, 1210, 1212), + (1212, -1, -1, 1210, 1210, 9, 70, -1, 0, 0, 8, 1211, 1483), + (1213, -1, -1, 1210, 1213, 3, 66, -1, 0, 0, 8, -1, 1214), + (1214, -1, -1, 1210, 1213, 6, 68, -1, 0, 0, 8, 1213, 1215), + (1215, -1, -1, 1210, 1213, 9, 70, -1, 0, 0, 8, 1214, 4755), + (1216, -1, -1, 83, 83, 3, 81, -1, 0, 0, 16, -1, 1217), + (1217, -1, -1, 83, 83, 6, 81, -1, 0, 0, 16, 1216, 1218), + (1218, -1, -1, 83, 83, 9, 81, -1, 0, 0, 16, 1217, 15422), + (1219, -1, -1, 1435, 1435, 10, 71, -1, 0, 0, 16, -1, 1220), + (1220, -1, -1, 1435, 1435, 11, 71, -1, 0, 0, 16, 1219, 1221), + (1221, -1, -1, 1435, 1435, 12, 71, -1, 0, 0, 16, 1220, 1648), + (1222, 757, -1, 757, 1222, 5, 66, 5877, 6, 1800, 8, 761, 1223), + (1223, 757, -1, 757, 1222, 5, 68, 5878, 6, 1800, 8, 1222, 1224), + (1224, 757, -1, 757, 1222, 5, 70, 5879, 6, 1800, 8, 1223, 5051), + (1225, 548, 548, 548, 548, 5, 67, 5881, 5, 900, 8, 550, 1226), + (1226, 548, 548, 548, 548, 5, 68, 5882, 5, 900, 8, 1225, 1227), + (1227, 548, 548, 548, 548, 5, 69, 5883, 5, 900, 8, 1226, 5054), + (1228, 1228, 1228, 1228, 1228, 9, 70, 5880, 9, 600, 8, -1, -1), + (1229, 1229, 1229, 1229, 1229, 7, 66, 6094, 10, 600, 8, -1, -1), + (1230, -1, -1, 1230, 1230, 1, 51, -1, 0, 0, 8, -1, 1231), + (1231, -1, -1, 1230, 1230, 2, 53, -1, 0, 0, 8, 1230, 1232), + (1232, -1, -1, 1230, 1230, 3, 55, -1, 0, 0, 8, 1231, 5000), + (1233, 1233, -1, 1233, 1233, 3, 68, 5887, 7, 2160, 8, -1, 1234), + (1234, 1233, -1, 1233, 1233, 6, 69, 5888, 7, 2160, 8, 1233, 1235), + (1235, 1233, -1, 1233, 1233, 9, 70, 5889, 7, 2160, 8, 1234, -1), + (1239, 1239, 1239, 1239, 1239, 12, 70, 5903, 6, 600, 8, -1, 5868), + (1242, 1242, 1242, 1242, 1242, 3, 67, 5906, 9, 1320, 8, -1, 1243), + (1243, 1242, 1242, 1242, 1242, 6, 68, 5907, 9, 1320, 8, 1242, 1244), + (1244, 1242, 1242, 1242, 1242, 9, 69, 5908, 9, 1320, 8, 1243, 5857), + (1245, 1245, 1245, 1245, 1245, 3, 66, 5909, 8, 2160, 8, -1, 1246), + (1246, 1245, 1245, 1245, 1245, 6, 68, 5910, 8, 2160, 8, 1245, 1247), + (1247, 1245, 1245, 1245, 1245, 9, 70, 5911, 8, 2160, 8, 1246, 15459), + (1248, 616, 616, 616, 616, 3, 68, 6226, 7, 900, 8, 618, 1249), + (1249, 616, 616, 616, 616, 6, 69, 6227, 7, 900, 8, 1248, 1250), + (1250, 616, 616, 616, 616, 9, 70, 6228, 7, 900, 8, 1249, 6254), + (1251, 1251, 1251, 1251, 1251, 9, 70, 5915, 9, 1320, 8, -1, -1), + (1252, 1252, 1252, 1252, 1252, 9, 68, 5913, 9, 1320, 8, -1, -1), + (1253, 1253, 1253, 1253, 1253, 9, 67, 5916, 16, 1320, 8, -1, -1), + (1254, 1254, 1254, 1254, 1254, 9, 69, 5914, 16, 1320, 8, -1, -1), + (1255, 1255, 1255, 1255, 1255, 9, 70, 5918, 4, 1080, 8, -1, -1), + (1265, -1, -1, 820, 820, 5, 66, -1, 0, 0, 8, 822, 1266), + (1266, -1, -1, 820, 820, 5, 68, -1, 0, 0, 8, 1265, 1267), + (1267, -1, -1, 820, 820, 5, 70, -1, 0, 0, 8, 1266, 4813), + (1268, -1, -1, 807, 807, 5, 66, -1, 0, 0, 8, 809, 1269), + (1269, -1, -1, 807, 807, 5, 68, -1, 0, 0, 8, 1268, 1270), + (1270, -1, -1, 807, 807, 5, 70, -1, 0, 0, 8, 1269, 5922), + (1272, 209, 209, 209, 1272, 5, 66, 5919, 12, 5, 8, -1, 6378), + (1274, 1274, 1274, 1274, 1274, 3, 68, 5921, 9, 540, 8, -1, 1275), + (1275, 1274, 1274, 1274, 1274, 6, 69, 5922, 9, 540, 8, 1274, 1276), + (1276, 1274, 1274, 1274, 1274, 9, 70, 5923, 9, 540, 8, 1275, 4864), + (1277, 188, 188, 188, 188, 9, 68, 5924, 2, 30, 8, 188, 5044), + (1278, 534, 534, 534, 534, 5, 67, 5927, 4, 2160, 8, 717, 1279), + (1279, 534, 534, 534, 534, 5, 68, 5928, 4, 2160, 8, 1278, 1280), + (1280, 534, 534, 534, 534, 5, 69, 5929, 4, 2160, 8, 1279, 5041), + (1284, -1, -1, 1284, 1284, 3, 66, -1, 0, 0, 8, -1, 1285), + (1285, -1, -1, 1284, 1284, 6, 68, -1, 0, 0, 8, 1284, 1286), + (1286, -1, -1, 1284, 1284, 9, 70, -1, 0, 0, 8, 1285, 5035), + (1287, -1, -1, 1287, 1287, 3, 67, -1, 0, 0, 8, -1, 1288), + (1288, -1, -1, 1287, 1287, 6, 68, -1, 0, 0, 8, 1287, 1289), + (1289, -1, -1, 1287, 1287, 9, 69, -1, 0, 0, 8, 1288, 5516), + (1290, -1, -1, 864, 864, 3, 66, -1, 0, 0, 8, 866, 1291), + (1291, -1, -1, 864, 864, 6, 68, -1, 0, 0, 8, 1290, 1292), + (1292, -1, -1, 864, 864, 9, 70, -1, 0, 0, 8, 1291, 4983), + (1293, 545, 545, 545, 545, 3, 68, 6079, 3, 900, 8, 547, 1294), + (1294, 545, 545, 545, 545, 6, 69, 6080, 3, 900, 8, 1293, 1295), + (1295, 545, 545, 545, 545, 9, 70, 6081, 3, 900, 8, 1294, 4997), + (1296, -1, -1, 1296, 1296, 3, 66, -1, 0, 0, 8, -1, 1297), + (1297, -1, -1, 1296, 1296, 3, 67, -1, 0, 0, 8, 1296, 1298), + (1298, -1, -1, 1296, 1296, 3, 68, -1, 0, 0, 8, 1297, 1299), + (1299, -1, -1, 1296, 1296, 3, 69, -1, 0, 0, 8, 1298, 1300), + (1300, -1, -1, 1296, 1296, 3, 70, -1, 0, 0, 8, 1299, -1), + (1301, -1, -1, 846, 846, 3, 66, -1, 0, 0, 8, 848, 1302), + (1302, -1, -1, 846, 846, 6, 68, -1, 0, 0, 8, 1301, 1303), + (1303, -1, -1, 846, 846, 9, 70, -1, 0, 0, 8, 1302, 4948), + (1304, -1, -1, 1304, 1304, 3, 66, -1, 0, 0, 8, -1, 1305), + (1305, -1, -1, 1304, 1304, 6, 68, -1, 0, 0, 8, 1304, 1306), + (1306, -1, -1, 1304, 1304, 9, 70, -1, 0, 0, 8, 1305, 6029), + (1307, -1, -1, 1307, 1307, 5, 66, -1, 0, 0, 8, -1, 1308), + (1308, -1, -1, 1307, 1307, 5, 67, -1, 0, 0, 8, 1307, 1309), + (1309, -1, -1, 1307, 1307, 5, 68, -1, 0, 0, 8, 1308, 1310), + (1310, -1, -1, 1307, 1307, 5, 69, -1, 0, 0, 8, 1309, 1311), + (1311, -1, -1, 1307, 1307, 5, 70, -1, 0, 0, 8, 1310, 6660), + (1313, -1, -1, 1313, 1313, 3, 68, -1, 0, 0, 8, -1, 1314), + (1314, -1, -1, 1313, 1313, 6, 69, -1, 0, 0, 8, 1313, 1315), + (1315, -1, -1, 1313, 1313, 9, 70, -1, 0, 0, 8, 1314, 5029), + (1316, -1, -1, 210, 210, 5, 67, -1, 0, 0, 8, 212, 1317), + (1317, -1, -1, 210, 210, 5, 68, -1, 0, 0, 8, 1316, 1318), + (1318, -1, -1, 210, 210, 5, 69, -1, 0, 0, 8, 1317, 6072), + (1319, -1, -1, 634, 634, 5, 67, -1, 0, 0, 8, 845, 1320), + (1320, -1, -1, 634, 634, 5, 68, -1, 0, 0, 8, 1319, 1321), + (1321, -1, -1, 634, 634, 5, 69, -1, 0, 0, 8, 1320, 5032), + (1323, 1323, 1323, 1323, 1323, 12, 70, 5932, 7, 2160, 8, -1, -1), + (1324, 970, 970, 970, 970, 5, 66, 6030, 6, 1800, 8, 974, 1325), + (1325, 970, 970, 970, 970, 5, 68, 6031, 6, 1800, 8, 1324, 1326), + (1326, 970, 970, 970, 970, 5, 70, 6032, 6, 1800, 8, 1325, 17311), + (1327, 1327, 1327, 1327, 1327, 5, 67, 5933, 10, 900, 8, -1, 1328), + (1328, 1327, 1327, 1327, 1327, 5, 68, 5934, 10, 900, 8, 1327, 1329), + (1329, 1327, 1327, 1327, 1327, 5, 69, 5935, 10, 900, 8, 1328, 5314), + (1330, 912, 912, 912, 912, 3, 66, 5936, 4, 3600, 8, 914, 1331), + (1331, 912, 912, 912, 912, 6, 68, 5937, 4, 3600, 8, 1330, 1332), + (1332, 912, 912, 912, 912, 9, 70, 5938, 4, 3600, 8, 1331, 7119), + (1334, 1334, 1334, 1334, 1334, 3, 66, 5943, 11, 4320, 8, -1, 1335), + (1335, 1334, 1334, 1334, 1334, 6, 68, 5944, 11, 4320, 8, 1334, 1336), + (1336, 1334, 1334, 1334, 1334, 9, 70, 5945, 11, 4320, 8, 1335, 6152), + (1337, 1337, 1337, 1337, 1337, 5, 67, 5946, 13, 4320, 8, -1, 1338), + (1338, 1337, 1337, 1337, 1337, 5, 68, 5947, 13, 4320, 8, 1337, 1339), + (1339, 1337, 1337, 1337, 1337, 5, 69, 5948, 13, 4320, 8, 1338, 6158), + (1340, 921, 921, 921, 921, 12, 69, 5950, 8, 60, 8, 921, 5280), + (1341, 922, 922, 922, 922, 12, 68, 5951, 8, 60, 8, 922, 5281), + (1342, 923, 923, 923, 923, 12, 67, 5952, 8, 60, 8, 923, 5282), + (1343, 1343, 1343, 1343, 1343, 9, 69, 5953, 9, 300, 8, -1, -1), + (1344, 155, 155, 155, 155, 12, 70, 5949, 8, 60, 8, 533, 5279), + (1345, 1345, 1345, 1345, 1345, 5, 67, 6132, 6, 900, 8, -1, 1346), + (1346, 1345, 1345, 1345, 1345, 5, 68, 6133, 6, 900, 8, 1345, 1347), + (1347, 1345, 1345, 1345, 1345, 5, 69, 6134, 6, 900, 8, 1346, 5003), + (1348, 1348, 1348, 1348, 1348, 3, 68, 6090, 0, 3600, 8, -1, 1349), + (1349, 1348, 1348, 1348, 1348, 6, 69, 6091, 0, 3600, 8, 1348, 1350), + (1350, 1348, 1348, 1348, 1348, 9, 70, 6092, 0, 3600, 8, 1349, 5770), + (1351, 1351, 1351, 1351, 1351, 5, 67, 5939, 5, 30, 8, -1, 6133), + (1352, 1352, 1352, 1352, 1352, 3, 67, 6067, 3, 60, 8, -1, 1353), + (1353, 1352, 1352, 1352, 1352, 6, 68, 6068, 3, 60, 8, 1352, 1354), + (1354, 1352, 1352, 1352, 1352, 9, 69, 6069, 3, 60, 8, 1353, 6313), + (1355, 1355, 1355, 1355, 1355, 3, 68, 6070, 3, 60, 8, -1, 1356), + (1356, 1355, 1355, 1355, 1355, 6, 69, 6071, 3, 60, 8, 1355, 1357), + (1357, 1355, 1355, 1355, 1355, 9, 70, 6072, 3, 60, 8, 1356, 5240), + (1358, 1358, 1358, 1358, 1358, 3, 66, 6073, 3, 60, 8, -1, 1359), + (1359, 1358, 1358, 1358, 1358, 6, 67, 6074, 3, 60, 8, 1358, 1360), + (1360, 1358, 1358, 1358, 1358, 9, 68, 6075, 3, 60, 8, 1359, 6307), + (1361, -1, -1, 1361, 1361, 0, 65, -1, 0, 0, 3, -1, -1), + (1362, -1, -1, 1362, 1362, 0, 65, -1, 0, 0, 3, -1, -1), + (1363, -1, -1, 1363, 1363, 0, 68, -1, 0, 0, 3, -1, -1), + (1364, -1, -1, 1364, 1364, 0, 68, -1, 0, 0, 3, -1, -1), + (1365, -1, -1, 1365, 1365, 0, 68, -1, 0, 0, 3, -1, -1), + (1366, -1, -1, 1366, 1366, 0, 65, -1, 0, 0, 3, -1, -1), + (1367, -1, -1, 1367, 1367, 0, 65, -1, 0, 0, 3, -1, -1), + (1368, -1, -1, 1368, 1368, 0, 68, -1, 0, 0, 3, -1, -1), + (1369, -1, -1, 1369, 1369, 0, 68, -1, 0, 0, 3, -1, -1), + (1370, -1, -1, 1370, 1370, 0, 68, -1, 0, 0, 3, -1, -1), + (1371, 1371, 1371, 1371, 1371, 0, 1, 6880, 23, 72000, 0, -1, -1), + (1372, 1372, 1372, 1372, 1372, 0, 1, 6881, 24, 72000, 0, -1, -1), + (1373, 1373, 1373, 1373, 1373, 0, 1, 6882, 25, 72000, 0, -1, -1), + (1374, 1374, 1374, 1374, 1374, 0, 1, 6883, 26, 590400, 0, -1, -1), + (1375, 1375, 1375, 1375, 1375, 0, 1, 6884, 27, 72000, 0, -1, -1), + (1376, 1376, 1376, 1376, 1376, 0, 1, 6885, 28, 244800, 0, -1, -1), + (1377, 1377, 1377, 1377, 1377, 0, 1, 6886, 29, 14400, 0, -1, -1), + (1378, -1, -1, 1378, 1378, 0, 1, -1, 0, 0, 10, -1, 1379), + (1379, -1, -1, 1379, 1379, 0, 1, -1, 0, 0, 10, 1378, 1380), + (1380, -1, -1, 1380, 1380, 0, 1, -1, 0, 0, 10, 1379, 1381), + (1382, -1, -1, 1382, 1382, 0, 1, -1, 0, 0, 10, 1381, -1), + (1383, 1383, 1383, 1383, 1383, 3, 59, 8048, 6, 300, 3, -1, 1384), + (1384, 1383, 1383, 1383, 1383, 6, 59, 8049, 6, 300, 3, 1383, 1385), + (1385, 1383, 1383, 1383, 1383, 9, 59, 8050, 6, 300, 3, 1384, 1386), + (1386, 1383, 1383, 1383, 1383, 9, 65, 8052, 6, 300, 4, 1385, 1387), + (1387, 1383, 1383, 1383, 1383, 9, 70, 8053, 6, 300, 10, 1386, 5084), + (1388, -1, -1, 1388, 1388, 9, 70, -1, 0, 0, 10, -1, -1), + (1389, -1, -1, 1026, 1026, 5, 70, -1, 0, 0, 10, 1030, 1390), + (1390, -1, -1, 1026, 1026, 5, 70, -1, 0, 0, 10, 1389, 1391), + (1391, -1, -1, 1026, 1026, 5, 70, -1, 0, 0, 10, 1390, 1392), + (1392, -1, -1, 1026, 1026, 5, 70, -1, 0, 0, 10, 1391, 1393), + (1393, -1, -1, 1026, 1026, 5, 70, -1, 0, 0, 10, 1392, 4683), + (1394, -1, -1, 125, 125, 5, 70, -1, 0, 0, 10, 1065, 1395), + (1395, -1, -1, 125, 125, 5, 70, -1, 0, 0, 10, 1394, 1396), + (1396, -1, -1, 125, 125, 5, 70, -1, 0, 0, 10, 1395, 1397), + (1397, -1, -1, 125, 125, 5, 70, -1, 0, 0, 10, 1396, 1398), + (1398, -1, -1, 125, 125, 5, 70, -1, 0, 0, 10, 1397, 5519), + (1399, -1, -1, 122, 122, 5, 70, -1, 0, 0, 10, 1070, 1400), + (1400, -1, -1, 122, 122, 5, 70, -1, 0, 0, 10, 1399, 1401), + (1401, -1, -1, 122, 122, 5, 70, -1, 0, 0, 10, 1400, 1402), + (1402, -1, -1, 122, 122, 5, 70, -1, 0, 0, 10, 1401, 1403), + (1403, -1, -1, 122, 122, 5, 70, -1, 0, 0, 10, 1402, 5524), + (1404, 1404, 1404, 1404, 1404, 5, 66, 8054, 15, 2160, 10, -1, 1405), + (1405, 1404, 1404, 1404, 1404, 5, 67, 8055, 15, 2160, 10, 1404, 1406), + (1406, 1404, 1404, 1404, 1404, 5, 68, 8056, 15, 2160, 10, 1405, 1407), + (1407, 1404, 1404, 1404, 1404, 5, 69, 8057, 15, 2160, 10, 1406, 1408), + (1408, 1404, 1404, 1404, 1404, 5, 70, 8058, 15, 2160, 10, 1407, 12880), + (1409, 1409, 1409, 1409, 1409, 5, 66, 8054, 15, 2160, 10, -1, 1410), + (1410, 1409, 1409, 1409, 1409, 5, 67, 8055, 15, 2160, 10, 1409, 1411), + (1411, 1409, 1409, 1409, 1409, 5, 68, 8056, 15, 2160, 10, 1410, 1412), + (1412, 1409, 1409, 1409, 1409, 5, 69, 8057, 15, 2160, 10, 1411, 1413), + (1413, 1409, 1409, 1409, 1409, 5, 70, 8058, 15, 2160, 10, 1412, -1), + (1414, -1, -1, 1414, 1414, 5, 66, -1, 0, 0, 10, -1, 1415), + (1415, -1, -1, 1414, 1414, 5, 67, -1, 0, 0, 10, 1414, 1416), + (1416, -1, -1, 1414, 1414, 5, 68, -1, 0, 0, 10, 1415, 1417), + (1417, -1, -1, 1414, 1414, 5, 69, -1, 0, 0, 10, 1416, 1418), + (1418, -1, -1, 1414, 1414, 5, 70, -1, 0, 0, 10, 1417, 12874), + (1419, 1419, 1419, 1419, 1419, 9, 74, 16441, 52, 300, 15, -1, -1), + (1420, -1, -1, 1420, 1420, 3, 66, -1, 0, 0, 10, -1, 1421), + (1421, -1, -1, 1420, 1420, 3, 67, -1, 0, 0, 10, 1420, 1422), + (1422, -1, -1, 1420, 1420, 3, 68, -1, 0, 0, 10, 1421, 1423), + (1423, -1, -1, 1420, 1420, 3, 69, -1, 0, 0, 10, 1422, 1424), + (1424, -1, -1, 1420, 1420, 3, 70, -1, 0, 0, 10, 1423, -1), + (1425, 1425, 1425, 1425, 1425, 5, 70, 8060, 2, 2160, 10, -1, 1426), + (1426, 1425, 1425, 1425, 1425, 5, 70, 8061, 2, 2160, 10, 1425, 1427), + (1427, 1425, 1425, 1425, 1425, 5, 70, 8063, 2, 2160, 10, 1426, 1428), + (1428, 1425, 1425, 1425, 1425, 5, 70, 8066, 2, 2160, 10, 1427, 1429), + (1429, 1425, 1425, 1425, 1425, 5, 70, 8070, 2, 2160, 10, 1428, 5759), + (1430, -1, -1, 795, 795, 3, 70, -1, 0, 0, 10, 799, 1431), + (1431, -1, -1, 795, 795, 6, 70, -1, 0, 0, 10, 1430, 1432), + (1432, -1, -1, 795, 795, 9, 70, -1, 0, 0, 10, 1431, 4897), + (1435, -1, -1, 1435, 1435, 3, 66, -1, 0, 0, 10, -1, 1436), + (1436, -1, -1, 1435, 1435, 6, 68, -1, 0, 0, 10, 1435, 1437), + (1437, -1, -1, 1435, 1435, 9, 70, -1, 0, 0, 10, 1436, 4773), + (1440, 517, 517, 517, 517, 5, 66, 8109, 12, 600, 10, 519, 1441), + (1441, 517, 517, 517, 517, 5, 67, 8110, 12, 600, 10, 1440, 1442), + (1442, 517, 517, 517, 517, 5, 68, 8111, 12, 600, 10, 1441, 1443), + (1443, 517, 517, 517, 517, 5, 69, 8112, 12, 600, 10, 1442, 1444), + (1444, 517, 517, 517, 517, 5, 70, 8113, 12, 600, 10, 1443, 7296), + (1453, -1, -1, 1453, 1453, 5, 66, -1, 0, 0, 10, -1, 1454), + (1454, -1, -1, 1453, 1453, 5, 67, -1, 0, 0, 10, 1453, 1455), + (1455, -1, -1, 1453, 1453, 5, 68, -1, 0, 0, 10, 1454, 1456), + (1456, -1, -1, 1453, 1453, 5, 69, -1, 0, 0, 10, 1455, 1457), + (1457, -1, -1, 1453, 1453, 5, 70, -1, 0, 0, 10, 1456, -1), + (1458, 1458, 1458, 1458, 1458, 12, 70, 8124, 6, 4320, 10, -1, -1), + (1459, 1459, 1459, 1459, 1459, 7, 70, 8125, 11, 1800, 10, -1, 1460), + (1460, 1459, 1459, 1459, 1459, 7, 70, 8126, 11, 1800, 10, 1459, 1461), + (1461, 1459, 1459, 1459, 1459, 7, 70, 8127, 11, 1800, 10, 1460, 5080), + (1462, 1462, 1462, 1462, 1462, 3, 59, 8133, 5, 300, 3, -1, 1463), + (1463, 1462, 1462, 1462, 1462, 6, 59, 8134, 5, 300, 3, 1462, 1464), + (1464, 1462, 1462, 1462, 1462, 9, 59, 8135, 5, 300, 3, 1463, 1465), + (1465, 1462, 1462, 1462, 1462, 9, 65, 8137, 5, 300, 4, 1464, 1466), + (1466, 1462, 1462, 1462, 1462, 9, 70, 8138, 5, 300, 10, 1465, 4900), + (1467, -1, -1, 729, 729, 3, 70, -1, 0, 0, 10, 733, 1468), + (1468, -1, -1, 729, 729, 6, 70, -1, 0, 0, 10, 1467, 1469), + (1469, -1, -1, 729, 729, 9, 70, -1, 0, 0, 10, 1468, 4960), + (1471, -1, -1, 1471, 1471, 5, 70, -1, 0, 0, 10, -1, 1472), + (1472, -1, -1, 1471, 1471, 5, 70, -1, 0, 0, 10, 1471, 1473), + (1473, -1, -1, 1471, 1471, 5, 70, -1, 0, 0, 10, 1472, 1474), + (1474, -1, -1, 1471, 1471, 5, 70, -1, 0, 0, 10, 1473, 1475), + (1475, -1, -1, 1471, 1471, 5, 70, -1, 0, 0, 10, 1474, 6442), + (1477, 1477, 1477, 1477, 1477, 9, 70, 8149, 3, 4320, 10, -1, -1), + (1478, 1478, -1, 1478, 1478, 3, 66, 8406, 0, 1, 10, -1, 1479), + (1479, 1478, -1, 1478, 1478, 6, 68, 8407, 0, 1, 10, 1478, 1480), + (1480, 1478, -1, 1478, 1478, 9, 70, 8408, 0, 1, 10, 1479, 6161), + (1483, -1, -1, 1210, 1210, 7, 70, -1, 0, 0, 10, 1212, 1484), + (1484, -1, -1, 1210, 1210, 7, 70, -1, 0, 0, 10, 1483, 1485), + (1485, -1, -1, 1210, 1210, 7, 70, -1, 0, 0, 10, 1484, 4752), + (1486, -1, -1, 1486, 1486, 5, 66, -1, 0, 0, 10, -1, 1487), + (1487, -1, -1, 1486, 1486, 5, 67, -1, 0, 0, 10, 1486, 1488), + (1488, -1, -1, 1486, 1486, 5, 68, -1, 0, 0, 10, 1487, 1489), + (1489, -1, -1, 1486, 1486, 5, 69, -1, 0, 0, 10, 1488, 1490), + (1490, -1, -1, 1486, 1486, 5, 70, -1, 0, 0, 10, 1489, 5529), + (1491, 746, 746, 746, 746, 3, 70, 8156, 10, 2160, 10, 748, 1492), + (1492, 746, 746, 746, 746, 6, 70, 8157, 10, 2160, 10, 1491, 1493), + (1493, 746, 746, 746, 746, 9, 70, 8158, 10, 2160, 10, 1492, 5800), + (1494, 1494, 1494, 1494, 1494, 12, 70, 8170, 2, 7, 10, -1, -1), + (1495, 1495, 1495, 1495, 1495, 3, 70, 8190, 30, 900, 10, -1, 1496), + (1496, 1495, 1495, 1495, 1495, 6, 70, 8191, 30, 900, 10, 1495, 1497), + (1497, 1495, 1495, 1495, 1495, 9, 70, 8192, 30, 900, 10, 1496, 5311), + (1498, 1498, 1498, 1498, 1498, 3, 70, 8193, 12, 1320, 10, -1, 1499), + (1499, 1498, 1498, 1498, 1498, 6, 70, 8194, 12, 1320, 10, 1498, 1500), + (1500, 1498, 1498, 1498, 1498, 9, 70, 8195, 12, 1320, 10, 1499, 5058), + (1501, 1501, 1501, 1501, 1501, 3, 70, 8196, 10, 4320, 10, -1, 1502), + (1502, 1501, 1501, 1501, 1501, 6, 70, 8197, 10, 4320, 10, 1501, 1503), + (1503, 1501, 1501, 1501, 1501, 9, 70, 8198, 10, 4320, 10, 1502, 1558), + (1504, -1, -1, 1504, 1504, 5, 70, -1, 0, 0, 10, -1, 1505), + (1505, -1, -1, 1504, 1504, 5, 70, -1, 0, 0, 10, 1504, 1506), + (1506, -1, -1, 1504, 1504, 5, 70, -1, 0, 0, 10, 1505, 5880), + (1507, 520, 520, 520, 520, 3, 70, 8201, 6, 540, 10, 522, 1508), + (1508, 520, 520, 520, 520, 6, 70, 8202, 6, 540, 10, 1507, 1509), + (1509, 520, 520, 520, 520, 9, 70, 8203, 6, 540, 10, 1508, 5883), + (1510, 1510, -1, 1510, 1510, 12, 70, 8205, 13, 2160, 10, -1, 7202), + (1511, -1, -1, 1511, 1511, 5, 70, -1, 0, 0, 10, -1, 1512), + (1512, -1, -1, 1511, 1511, 5, 70, -1, 0, 0, 10, 1511, 1513), + (1513, -1, -1, 1511, 1511, 5, 70, -1, 0, 0, 10, 1512, 5950), + (1514, -1, -1, 1514, 1514, 7, 70, -1, 0, 0, 10, -1, 1515), + (1515, -1, -1, 1514, 1514, 7, 70, -1, 0, 0, 10, 1514, 1516), + (1516, -1, -1, 1514, 1514, 7, 70, -1, 0, 0, 10, 1515, 13404), + (1519, 153, 153, 153, 153, 9, 70, 8216, 3, 2160, 10, 153, 5068), + (1520, 1520, 1520, 1520, 1520, 3, 70, 8218, 11, 900, 10, -1, 1521), + (1521, 1520, 1520, 1520, 1520, 6, 70, 8219, 11, 900, 10, 1520, 1522), + (1522, 1520, 1520, 1520, 1520, 9, 70, 8220, 11, 900, 10, 1521, 6449), + (1523, 1523, 1523, 1523, 1523, 12, 70, 8221, 7, 7, 10, -1, -1), + (1524, -1, -1, 190, 190, 7, 70, -1, 0, 0, 10, 192, 1526), + (1525, -1, -1, 190, 190, 7, 70, -1, 0, 0, 10, 1526, 5038), + (1526, -1, -1, 190, 190, 7, 70, -1, 0, 0, 10, 1524, 1525), + (1527, 1527, 1527, 1527, 1527, 12, 70, 8223, 3, 7, 10, -1, -1), + (1528, -1, -1, 1528, 4819, 5, 66, -1, 0, 0, 10, -1, 1529), + (1529, -1, -1, 1528, 4819, 5, 67, -1, 0, 0, 10, 1528, 1530), + (1530, -1, -1, 1528, 4819, 5, 68, -1, 0, 0, 10, 1529, 1531), + (1531, -1, -1, 1528, 4819, 5, 69, -1, 0, 0, 10, 1530, 1532), + (1532, -1, -1, 1528, 4819, 5, 70, -1, 0, 0, 10, 1531, 4819), + (1533, -1, -1, 602, 602, 3, 70, -1, 0, 0, 10, 604, 1534), + (1534, -1, -1, 602, 602, 6, 70, -1, 0, 0, 10, 1533, 1535), + (1535, -1, -1, 602, 602, 9, 70, -1, 0, 0, 10, 1534, 4758), + (1536, -1, -1, 599, 599, 3, 70, -1, 0, 0, 10, 601, 1537), + (1537, -1, -1, 599, 599, 6, 70, -1, 0, 0, 10, 1536, 1538), + (1538, -1, -1, 599, 599, 9, 70, -1, 0, 0, 10, 1537, 5534), + (1539, -1, -1, 878, 878, 7, 70, -1, 0, 0, 10, 880, 1540), + (1540, -1, -1, 878, 878, 7, 70, -1, 0, 0, 10, 1539, 1541), + (1541, -1, -1, 878, 878, 7, 70, -1, 0, 0, 10, 1540, 4957), + (1542, 1542, -1, 1542, 1542, 3, 60, 8240, 0, 1, 10, -1, -1), + (1543, -1, -1, 1543, 1543, 5, 70, -1, 0, 0, 10, -1, 1544), + (1544, -1, -1, 1543, 1543, 5, 70, -1, 0, 0, 10, 1543, 1545), + (1545, -1, -1, 1543, 1543, 5, 70, -1, 0, 0, 10, 1544, 4951), + (1546, -1, -1, 1546, 1546, 5, 70, -1, 0, 0, 10, -1, 1547), + (1547, -1, -1, 1546, 1546, 5, 70, -1, 0, 0, 10, 1546, 1548), + (1548, -1, -1, 1546, 1546, 5, 70, -1, 0, 0, 10, 1547, 4829), + (1549, -1, -1, 1549, 1549, 3, 66, -1, 0, 0, 10, -1, 1550), + (1550, -1, -1, 1549, 1549, 6, 68, -1, 0, 0, 10, 1549, 1551), + (1551, -1, -1, 1549, 1549, 9, 70, -1, 0, 0, 10, 1550, -1), + (1552, -1, -1, 1552, 1552, 3, 66, -1, 0, 0, 10, -1, 1553), + (1553, -1, -1, 1552, 1552, 6, 68, -1, 0, 0, 10, 1552, 1554), + (1554, -1, -1, 1552, 1552, 9, 70, -1, 0, 0, 10, 1553, -1), + (1555, -1, -1, 1555, 1555, 5, 70, -1, 0, 0, 10, -1, 1556), + (1556, -1, -1, 1555, 1555, 5, 70, -1, 0, 0, 10, 1555, 1557), + (1557, -1, -1, 1555, 1555, 5, 70, -1, 0, 0, 10, 1556, 12727), + (1558, 1501, 1501, 1501, 1501, 6, 75, 16444, 10, 4320, 15, 1503, 1559), + (1559, 1501, 1501, 1501, 1501, 6, 80, 16445, 10, 4320, 15, 1558, 1560), + (1560, 1501, 1501, 1501, 1501, 6, 85, 16446, 10, 4320, 15, 1559, 13244), + (1563, -1, -1, 556, 556, 5, 66, -1, 0, 0, 10, 560, 1564), + (1564, -1, -1, 556, 556, 5, 67, -1, 0, 0, 10, 1563, 1565), + (1565, -1, -1, 556, 556, 5, 68, -1, 0, 0, 10, 1564, 1566), + (1566, -1, -1, 556, 556, 5, 69, -1, 0, 0, 10, 1565, 1567), + (1567, -1, -1, 556, 556, 5, 70, -1, 0, 0, 10, 1566, 17004), + (1569, 1569, 1569, 1569, 1569, 3, 70, 8256, 5, 1800, 10, -1, 1570), + (1570, 1569, 1569, 1569, 1569, 6, 70, 8257, 5, 1800, 10, 1569, 1571), + (1571, 1569, 1569, 1569, 1569, 9, 70, 8258, 5, 1800, 10, 1570, 5713), + (1572, -1, -1, 1572, 1572, 5, 66, -1, 0, 0, 10, -1, 1573), + (1573, -1, -1, 1572, 1572, 5, 67, -1, 0, 0, 10, 1572, 1574), + (1574, -1, -1, 1572, 1572, 5, 68, -1, 0, 0, 10, 1573, 1575), + (1575, -1, -1, 1572, 1572, 5, 69, -1, 0, 0, 10, 1574, 1576), + (1576, -1, -1, 1572, 1572, 5, 70, -1, 0, 0, 10, 1575, 10554), + (1577, -1, -1, 1577, 1577, 3, 66, -1, 0, 0, 10, -1, 1578), + (1578, -1, -1, 1577, 1577, 6, 68, -1, 0, 0, 10, 1577, 1579), + (1579, -1, -1, 1577, 1577, 9, 70, -1, 0, 0, 10, 1578, 5886), + (1583, -1, -1, 1583, 1583, 5, 70, -1, 0, 0, 10, -1, 1584), + (1584, -1, -1, 1583, 1583, 5, 70, -1, 0, 0, 10, 1583, 1585), + (1585, -1, -1, 1583, 1583, 5, 70, -1, 0, 0, 10, 1584, 1586), + (1586, -1, -1, 1583, 1583, 5, 70, -1, 0, 0, 10, 1585, 1587), + (1587, -1, -1, 1583, 1583, 5, 70, -1, 0, 0, 10, 1586, -1), + (1588, -1, -1, 1587, 1587, 3, 66, -1, 0, 0, 10, -1, 1589), + (1589, -1, -1, 1587, 1587, 6, 68, -1, 0, 0, 10, 1588, 1590), + (1590, -1, -1, 1587, 1587, 9, 70, -1, 0, 0, 10, 1589, -1), + (1591, -1, -1, 1586, 1586, 12, 70, -1, 0, 0, 10, -1, -1), + (1592, -1, -1, 1592, 1592, 5, 66, -1, 0, 0, 10, -1, 1593), + (1593, -1, -1, 1592, 1592, 5, 67, -1, 0, 0, 10, 1592, 1594), + (1594, -1, -1, 1592, 1592, 5, 68, -1, 0, 0, 10, 1593, 1595), + (1595, -1, -1, 1592, 1592, 5, 69, -1, 0, 0, 10, 1594, 1596), + (1596, -1, -1, 1592, 1592, 5, 70, -1, 0, 0, 10, 1595, 4725), + (1597, 1597, 1597, 1597, 1597, 9, 70, 8271, 6, 10, 10, -1, 6606), + (1598, 1598, -1, 1598, 1598, 3, 70, 8272, 6, 900, 10, -1, 1599), + (1599, 1598, -1, 1598, 1598, 6, 70, 8273, 6, 900, 10, 1598, 1600), + (1600, 1598, -1, 1598, 1598, 9, 70, 8274, 6, 900, 10, 1599, 4972), + (1601, -1, -1, 644, 644, 5, 61, -1, 0, 0, 10, 644, 1602), + (1602, -1, -1, 644, 644, 5, 63, -1, 0, 0, 10, 1601, 1603), + (1603, -1, -1, 644, 644, 5, 65, -1, 0, 0, 10, 1602, 4986), + (1604, -1, -1, 1604, 1604, 5, 60, -1, 0, 0, 10, -1, 1605), + (1605, -1, -1, 1604, 1604, 5, 61, -1, 0, 0, 10, 1604, 1606), + (1606, -1, -1, 1604, 1604, 5, 62, -1, 0, 0, 10, 1605, 5290), + (1607, 289, 289, 289, 289, 9, 70, 8278, 3, 300, 10, 289, 5742), + (1608, -1, -1, 1608, 1608, 3, 66, -1, 0, 0, 10, -1, 1609), + (1609, -1, -1, 1608, 1608, 6, 68, -1, 0, 0, 10, 1608, 1610), + (1610, -1, -1, 1608, 1608, 9, 70, -1, 0, 0, 10, 1609, 4989), + (1611, -1, -1, 1417, 1417, 3, 66, -1, 0, 0, 10, -1, 1612), + (1612, -1, -1, 1417, 1417, 3, 67, -1, 0, 0, 10, 1611, 1613), + (1613, -1, -1, 1417, 1417, 3, 68, -1, 0, 0, 10, 1612, 1614), + (1614, -1, -1, 1417, 1417, 3, 69, -1, 0, 0, 10, 1613, 1615), + (1615, -1, -1, 1417, 1417, 3, 70, -1, 0, 0, 10, 1614, -1), + (1616, -1, -1, 1616, 1616, 5, 66, -1, 0, 0, 10, -1, 1617), + (1617, -1, -1, 1616, 1616, 5, 67, -1, 0, 0, 10, 1616, 1618), + (1618, -1, -1, 1616, 1616, 5, 68, -1, 0, 0, 10, 1617, 1619), + (1619, -1, -1, 1616, 1616, 5, 69, -1, 0, 0, 10, 1618, 1620), + (1620, -1, -1, 1616, 1616, 5, 70, -1, 0, 0, 10, 1619, 4992), + (1621, -1, -1, 564, 564, 7, 70, -1, 0, 0, 10, 566, 1622), + (1622, -1, -1, 564, 564, 7, 70, -1, 0, 0, 10, 1621, 1623), + (1623, -1, -1, 564, 564, 7, 70, -1, 0, 0, 10, 1622, -1), + (1624, -1, -1, 561, 561, 7, 70, -1, 0, 0, 10, 563, 1625), + (1625, -1, -1, 561, 561, 7, 70, -1, 0, 0, 10, 1624, 1626), + (1626, -1, -1, 561, 561, 7, 70, -1, 0, 0, 10, 1625, -1), + (1627, -1, -1, 1627, 1627, 3, 66, -1, 0, 0, 10, -1, 1628), + (1628, -1, -1, 1627, 1627, 6, 68, -1, 0, 0, 10, 1627, 1629), + (1629, -1, -1, 1627, 1627, 9, 70, -1, 0, 0, 10, 1628, -1), + (1630, 1474, 1474, 1474, 1474, 3, 70, 8146, 14, 300, 10, -1, 1631), + (1631, 1474, 1474, 1474, 1474, 6, 70, 8147, 14, 300, 10, 1630, 1632), + (1632, 1474, 1474, 1474, 1474, 9, 70, 8148, 14, 300, 10, 1631, -1), + (1633, -1, -1, 551, 551, 5, 66, -1, 0, 0, 10, 555, 1634), + (1634, -1, -1, 551, 551, 5, 67, -1, 0, 0, 10, 1633, 1635), + (1635, -1, -1, 551, 551, 5, 68, -1, 0, 0, 10, 1634, 1636), + (1636, -1, -1, 551, 551, 5, 69, -1, 0, 0, 10, 1635, 1637), + (1637, -1, -1, 551, 551, 5, 70, -1, 0, 0, 10, 1636, 6905), + (1638, 1638, 1638, 1638, 1638, 5, 59, 8450, 7, 4320, 3, -1, -1), + (1639, 1639, 1639, 1639, 1639, 9, 65, 8451, 7, 4320, 4, -1, -1), + (1640, 1640, 1640, 1640, 1640, 12, 70, 8452, 7, 4320, 10, -1, -1), + (1641, -1, -1, 1641, 1641, 15, 70, -1, 0, 0, 3, -1, -1), + (1642, -1, -1, 1642, 1642, 15, 70, -1, 0, 0, 3, -1, -1), + (1643, 1643, 1643, 1643, 1643, 0, 59, 8975, 0, 1, 11, -1, -1), + (1644, 1644, 1644, 1644, 1644, 0, 59, 8900, 0, 1, 11, -1, -1), + (1645, 1645, 1645, 1645, 1645, 9, 70, 8977, 0, 1, 3, -1, -1), + (1646, 1646, 1646, 1646, 1646, 9, 70, 8978, 0, 1, 3, -1, -1), + (1647, 1647, 1647, 1647, 1647, 0, 68, 8771, 21, 900, 3, -1, -1), + (1648, -1, -1, 1435, 4773, 9, 71, -1, 0, 0, 16, 1221, 1649), + (1649, -1, -1, 1435, 4773, 9, 76, -1, 0, 0, 16, 1648, 1650), + (1650, -1, -1, 1435, 4773, 9, 81, -1, 0, 0, 16, 1649, 13091), + (1651, -1, -1, 8210, 8210, 5, 85, -1, 0, 0, 16, 8214, 1652), + (1652, -1, -1, 8210, 8210, 5, 85, -1, 0, 0, 16, 1651, 1653), + (1653, -1, -1, 8210, 8210, 5, 85, -1, 0, 0, 16, 1652, 1654), + (1654, -1, -1, 8210, 8210, 5, 85, -1, 0, 0, 16, 1653, 1655), + (1655, -1, -1, 8210, 8210, 5, 85, -1, 0, 0, 16, 1654, 13149), + (1656, -1, -1, 8204, 8204, 4, 85, -1, 0, 0, 16, 8206, 1657), + (1657, -1, -1, 8204, 8204, 4, 85, -1, 0, 0, 16, 1656, -1), + (1659, -1, -1, 8207, 8207, 4, 85, -1, 0, 0, 16, 8209, 1660), + (1660, -1, -1, 8207, 8207, 4, 85, -1, 0, 0, 16, 1659, -1), + (1662, -1, -1, 1662, 1662, 3, 65, -1, 0, 0, 17, -1, 1663), + (1663, -1, -1, 1662, 1662, 3, 66, -1, 0, 0, 17, 1662, 1664), + (1664, -1, -1, 1662, 1662, 3, 67, -1, 0, 0, 17, 1663, 1665), + (1665, -1, -1, 1662, 1662, 3, 68, -1, 0, 0, 17, 1664, 1666), + (1666, -1, -1, 1662, 1662, 3, 69, -1, 0, 0, 17, 1665, -1), + (1667, 1667, 1667, 1667, 1667, 9, 85, 23602, 0, 1, 16, -1, -1), + (2400, -1, -1, 2400, 2400, 9, 81, 0, 0, 0, 17, -1, 2401), + (2401, -1, -1, 2400, 2400, 12, 83, 0, 0, 0, 17, 2400, 2402), + (2402, -1, -1, 2400, 2400, 15, 85, 0, 0, 0, 17, 2401, 15344), + (3676, 3676, 3676, 3676, 3676, 9, 85, 23606, 67, 30, 16, -1, -1), + (4665, 4665, 4665, 4665, 4665, 0, 1, 9177, 19, 4320, 0, -1, -1), + (4666, -1, -1, 4844, 4844, 5, 81, -1, 0, 0, 16, -1, 4667), + (4667, -1, -1, 4844, 4844, 5, 82, -1, 0, 0, 16, 4666, 4668), + (4668, -1, -1, 4844, 4844, 5, 83, -1, 0, 0, 16, 4667, 4669), + (4669, -1, -1, 4844, 4844, 5, 84, -1, 0, 0, 16, 4668, 4670), + (4670, -1, -1, 4844, 4844, 5, 85, -1, 0, 0, 16, 4669, -1), + (4672, -1, -1, 4672, 4672, 3, 59, -1, 0, 0, 8, -1, 4673), + (4673, -1, -1, 4672, 4672, 6, 59, -1, 0, 0, 8, 4672, 4674), + (4674, -1, -1, 4672, 4672, 9, 59, -1, 0, 0, 8, 4673, -1), + (4675, -1, -1, 4675, 4675, 3, 59, -1, 0, 0, 3, -1, 4676), + (4676, -1, -1, 4675, 4675, 6, 59, -1, 0, 0, 3, 4675, 4677), + (4677, -1, -1, 4675, 4675, 9, 59, -1, 0, 0, 3, 4676, -1), + (4678, -1, -1, 418, 418, 5, 71, -1, 0, 0, 12, 1005, 4679), + (4679, -1, -1, 418, 418, 5, 72, -1, 0, 0, 12, 4678, 4680), + (4680, -1, -1, 418, 418, 5, 73, -1, 0, 0, 12, 4679, 4681), + (4681, -1, -1, 418, 418, 5, 74, -1, 0, 0, 12, 4680, 4682), + (4682, -1, -1, 418, 418, 5, 75, -1, 0, 0, 12, 4681, 7547), + (4683, -1, -1, 1026, 1026, 5, 71, -1, 0, 0, 12, 1393, 4684), + (4684, -1, -1, 1026, 1026, 5, 72, -1, 0, 0, 12, 4683, 4685), + (4685, -1, -1, 1026, 1026, 5, 73, -1, 0, 0, 12, 4684, 4686), + (4686, -1, -1, 1026, 1026, 5, 74, -1, 0, 0, 12, 4685, 4687), + (4687, -1, -1, 1026, 1026, 5, 75, -1, 0, 0, 12, 4686, 6523), + (4688, -1, -1, 4688, 4688, 3, 71, -1, 0, 0, 12, -1, 4689), + (4689, -1, -1, 4688, 4688, 3, 72, -1, 0, 0, 12, 4688, 4690), + (4690, -1, -1, 4688, 4688, 3, 73, -1, 0, 0, 12, 4689, 4691), + (4691, -1, -1, 4688, 4688, 3, 74, -1, 0, 0, 12, 4690, 4692), + (4692, -1, -1, 4688, 4688, 3, 75, -1, 0, 0, 12, 4691, -1), + (4693, -1, -1, 65, 661, 3, 71, -1, 0, 0, 12, 1035, 4694), + (4694, -1, -1, 65, 661, 3, 72, -1, 0, 0, 12, 4693, 4695), + (4695, -1, -1, 65, 661, 3, 73, -1, 0, 0, 12, 4694, 4696), + (4696, -1, -1, 65, 661, 3, 74, -1, 0, 0, 12, 4695, 4697), + (4697, -1, -1, 65, 661, 3, 75, -1, 0, 0, 12, 4696, 6390), + (4698, -1, -1, 4698, 4698, 5, 51, -1, 0, 0, 12, -1, 6545), + (4699, -1, -1, 4699, 4699, 5, 51, -1, 0, 0, 12, -1, 6540), + (4700, 1037, 1037, 1037, 1037, 0, 1, 7619, 33, 72000, 0, -1, -1), + (4702, 4702, 4702, 4702, 4702, 3, 71, 9475, 31, 600, 12, -1, -1), + (4704, 4704, 4704, 4704, 4704, 4, 71, 9477, 31, 600, 12, -1, -1), + (4705, 4705, 4705, 4705, 4705, 3, 71, 9478, 31, 600, 12, -1, -1), + (4706, 4706, 4706, 4706, 4706, 3, 71, 9479, 31, 600, 12, -1, -1), + (4707, -1, -1, 1041, 1041, 6, 71, -1, 0, 0, 12, 1043, 4708), + (4708, -1, -1, 1041, 1041, 6, 73, -1, 0, 0, 12, 4707, 4709), + (4709, -1, -1, 1041, 1041, 6, 75, -1, 0, 0, 12, 4708, 5542), + (4710, -1, -1, 1044, 1044, 6, 71, -1, 0, 0, 12, 1046, 4711), + (4711, -1, -1, 1044, 1044, 6, 73, -1, 0, 0, 12, 4710, 4712), + (4712, -1, -1, 1044, 1044, 6, 75, -1, 0, 0, 12, 4711, 5545), + (4713, -1, -1, 1047, 1047, 6, 71, -1, 0, 0, 12, 1049, 4714), + (4714, -1, -1, 1047, 1047, 6, 73, -1, 0, 0, 12, 4713, 4715), + (4715, -1, -1, 1047, 1047, 6, 75, -1, 0, 0, 12, 4714, 5548), + (4716, -1, -1, 1050, 1050, 6, 71, -1, 0, 0, 12, 1052, 4717), + (4717, -1, -1, 1050, 1050, 6, 73, -1, 0, 0, 12, 4716, 4718), + (4718, -1, -1, 1050, 1050, 6, 75, -1, 0, 0, 12, 4717, 5551), + (4722, -1, -1, 119, 119, 3, 71, -1, 0, 0, 12, 1055, 4723), + (4723, -1, -1, 119, 119, 3, 73, -1, 0, 0, 12, 4722, 4724), + (4724, -1, -1, 119, 119, 3, 75, -1, 0, 0, 12, 4723, 5554), + (4725, -1, -1, 1592, 1592, 5, 71, -1, 0, 0, 12, 1596, 4726), + (4726, -1, -1, 1592, 1592, 5, 72, -1, 0, 0, 12, 4725, 4727), + (4727, -1, -1, 1592, 1592, 5, 73, -1, 0, 0, 12, 4726, 4728), + (4728, -1, -1, 1592, 1592, 5, 74, -1, 0, 0, 12, 4727, 4729), + (4729, -1, -1, 1592, 1592, 5, 75, -1, 0, 0, 12, 4728, 5557), + (4733, -1, -1, 625, 625, 3, 71, -1, 0, 0, 12, 627, 4734), + (4734, -1, -1, 625, 625, 3, 73, -1, 0, 0, 12, 4733, 4735), + (4735, -1, -1, 625, 625, 3, 75, -1, 0, 0, 12, 4734, 7641), + (4739, -1, -1, 4739, 4739, 3, 71, -1, 0, 0, 12, -1, 4740), + (4740, -1, -1, 4739, 4739, 6, 73, -1, 0, 0, 12, 4739, 4741), + (4741, -1, -1, 4739, 4739, 9, 75, -1, 0, 0, 12, 4740, 5562), + (4742, 4742, 4742, 4742, 4742, 9, 71, 11024, 12, 600, 12, -1, 5565), + (4744, -1, -1, 1072, 1072, 5, 71, -1, 0, 0, 12, 1076, 4745), + (4745, -1, -1, 1072, 1072, 5, 72, -1, 0, 0, 12, 4744, 4746), + (4746, -1, -1, 1072, 1072, 5, 73, -1, 0, 0, 12, 4745, 4747), + (4747, -1, -1, 1072, 1072, 5, 74, -1, 0, 0, 12, 4746, 4748), + (4748, -1, -1, 1072, 1072, 5, 75, -1, 0, 0, 12, 4747, 5566), + (4749, -1, -1, 637, 637, 6, 71, -1, 0, 0, 12, 772, 4750), + (4750, -1, -1, 637, 637, 6, 73, -1, 0, 0, 12, 4749, 4751), + (4751, -1, -1, 637, 637, 6, 75, -1, 0, 0, 12, 4750, 5571), + (4752, -1, -1, 1210, 1210, 7, 71, -1, 0, 0, 12, 1485, 4753), + (4753, -1, -1, 1210, 1210, 7, 73, -1, 0, 0, 12, 4752, 4754), + (4754, -1, -1, 1210, 1210, 7, 75, -1, 0, 0, 12, 4753, 5574), + (4755, -1, -1, 1210, 1213, 6, 71, -1, 0, 0, 12, 1215, 4756), + (4756, -1, -1, 1210, 1213, 6, 73, -1, 0, 0, 12, 4755, 4757), + (4757, -1, -1, 1210, 1213, 6, 75, -1, 0, 0, 12, 4756, 5577), + (4758, -1, -1, 602, 602, 6, 71, -1, 0, 0, 12, 1535, 4759), + (4759, -1, -1, 602, 602, 6, 73, -1, 0, 0, 12, 4758, 4760), + (4760, -1, -1, 602, 602, 6, 75, -1, 0, 0, 12, 4759, 5580), + (4761, -1, -1, 4761, 4761, 7, 71, -1, 0, 0, 12, -1, 4762), + (4762, -1, -1, 4761, 4761, 7, 73, -1, 0, 0, 12, 4761, 4763), + (4763, -1, -1, 4761, 4761, 7, 75, -1, 0, 0, 12, 4762, 6500), + (4764, -1, -1, 1071, 1071, 6, 75, -1, 0, 0, 14, 1071, 7553), + (4767, -1, -1, 98, 98, 4, 71, -1, 0, 0, 12, 100, 4768), + (4768, -1, -1, 98, 98, 4, 73, -1, 0, 0, 12, 4767, 4769), + (4769, -1, -1, 98, 98, 4, 75, -1, 0, 0, 12, 4768, 5586), + (4773, -1, -1, 1435, 4773, 9, 71, -1, 0, 0, 12, 1437, 6517), + (4776, -1, -1, 1186, 1186, 6, 71, -1, 0, 0, 12, 1188, 4777), + (4777, -1, -1, 1186, 1186, 6, 73, -1, 0, 0, 12, 4776, 4778), + (4778, -1, -1, 1186, 1186, 6, 75, -1, 0, 0, 12, 4777, 5589), + (4779, -1, -1, 80, 80, 6, 71, -1, 0, 0, 12, 1088, 4780), + (4780, -1, -1, 80, 80, 6, 73, -1, 0, 0, 12, 4779, 4781), + (4781, -1, -1, 80, 80, 6, 75, -1, 0, 0, 12, 4780, 5592), + (4790, -1, -1, 1134, 1134, 5, 71, -1, 0, 0, 12, 1162, 4791), + (4791, -1, -1, 1134, 1134, 5, 72, -1, 0, 0, 12, 4790, 4792), + (4792, -1, -1, 1134, 1134, 5, 73, -1, 0, 0, 12, 4791, 4793), + (4793, -1, -1, 1134, 1134, 5, 74, -1, 0, 0, 12, 4792, 4794), + (4794, -1, -1, 1134, 1134, 5, 75, -1, 0, 0, 12, 4793, 4804), + (4795, -1, -1, 255, 255, 5, 71, -1, 0, 0, 12, 1165, 4796), + (4796, -1, -1, 255, 255, 5, 73, -1, 0, 0, 12, 4795, 4797), + (4797, -1, -1, 255, 255, 5, 75, -1, 0, 0, 12, 4796, 5595), + (4798, -1, -1, 631, 631, 5, 71, -1, 0, 0, 12, 1174, 4799), + (4799, -1, -1, 631, 631, 5, 73, -1, 0, 0, 12, 4798, 4800), + (4800, -1, -1, 631, 631, 5, 75, -1, 0, 0, 12, 4799, -1), + (4801, -1, -1, 4801, 4801, 6, 74, -1, 0, 0, 14, -1, 4802), + (4802, -1, -1, 4801, 4801, 6, 76, -1, 0, 0, 14, 4801, 4803), + (4803, -1, -1, 4801, 4801, 6, 78, -1, 0, 0, 14, 4802, 7160), + (4804, -1, -1, 1134, 1134, 5, 76, -1, 0, 0, 15, 4794, 4805), + (4805, -1, -1, 1134, 1134, 5, 77, -1, 0, 0, 15, 4804, 4806), + (4806, -1, -1, 1134, 1134, 5, 78, -1, 0, 0, 15, 4805, 4807), + (4807, -1, -1, 1134, 1134, 5, 79, -1, 0, 0, 15, 4806, 4808), + (4808, -1, -1, 1134, 1134, 5, 80, -1, 0, 0, 15, 4807, 10311), + (4809, -1, -1, 4809, 4809, 5, 81, -1, 0, 0, 15, -1, 4810), + (4810, -1, -1, 4809, 4809, 5, 83, -1, 0, 0, 15, 4809, 4811), + (4811, -1, -1, 4809, 4809, 5, 85, -1, 0, 0, 15, 4810, 10316), + (4813, -1, -1, 820, 820, 5, 71, -1, 0, 0, 12, 1267, 4814), + (4814, -1, -1, 820, 820, 5, 73, -1, 0, 0, 12, 4813, 4815), + (4815, -1, -1, 820, 820, 5, 75, -1, 0, 0, 12, 4814, 5917), + (4819, -1, -1, 1528, 4819, 5, 71, -1, 0, 0, 12, 1532, 4820), + (4820, -1, -1, 1528, 4819, 5, 72, -1, 0, 0, 12, 4819, 4821), + (4821, -1, -1, 1528, 4819, 5, 73, -1, 0, 0, 12, 4820, 4822), + (4822, -1, -1, 1528, 4819, 5, 74, -1, 0, 0, 12, 4821, 4823), + (4823, -1, -1, 1528, 4819, 5, 75, -1, 0, 0, 12, 4822, 15188), + (4824, -1, -1, 810, 810, 5, 71, -1, 0, 0, 12, 814, 4825), + (4825, -1, -1, 810, 810, 5, 72, -1, 0, 0, 12, 4824, 4826), + (4826, -1, -1, 810, 810, 5, 73, -1, 0, 0, 12, 4825, 4827), + (4827, -1, -1, 810, 810, 5, 74, -1, 0, 0, 12, 4826, 4828), + (4828, -1, -1, 810, 810, 5, 75, -1, 0, 0, 12, 4827, 15426), + (4829, -1, -1, 1546, 1546, 5, 71, -1, 0, 0, 12, 1548, 4830), + (4830, -1, -1, 1546, 1546, 5, 72, -1, 0, 0, 12, 4829, 4831), + (4831, -1, -1, 1546, 1546, 5, 73, -1, 0, 0, 12, 4830, 6441), + (4836, 4836, 4836, 4836, 4836, 5, 71, 11033, 5, 30, 12, -1, -1), + (4844, -1, -1, 4844, 4844, 5, 71, -1, 0, 0, 12, -1, 4845), + (4845, -1, -1, 4844, 4844, 5, 72, -1, 0, 0, 12, 4844, 4846), + (4846, -1, -1, 4844, 4844, 5, 73, -1, 0, 0, 12, 4845, 4847), + (4847, -1, -1, 4844, 4844, 5, 74, -1, 0, 0, 12, 4846, 4848), + (4848, -1, -1, 4844, 4844, 5, 75, -1, 0, 0, 12, 4847, 7122), + (4849, 4849, 4849, 4849, 4849, 9, 71, 11041, 7, 1800, 12, -1, 6134), + (4854, 4854, 4854, 4854, 4854, 3, 71, 11046, 8, 600, 12, -1, 4855), + (4855, 4854, 4854, 4854, 4854, 6, 73, 11047, 8, 600, 12, 4854, 4856), + (4856, 4854, 4854, 4854, 4854, 9, 75, 11048, 8, 600, 12, 4855, 5764), + (4857, 4857, 4857, 4857, 4857, 3, 71, 11049, 7, 600, 12, -1, 4858), + (4858, 4857, 4857, 4857, 4857, 6, 73, 11050, 7, 600, 12, 4857, 4859), + (4859, 4857, 4857, 4857, 4857, 9, 75, 11051, 7, 600, 12, 4858, 5767), + (4860, 4860, 4860, 4860, 4860, 9, 75, 11052, 13, 60, 12, -1, 5606), + (4861, -1, -1, 4861, 4861, 6, 71, -1, 0, 0, 12, -1, 4862), + (4862, -1, -1, 4861, 4861, 6, 73, -1, 0, 0, 12, 4861, 4863), + (4863, -1, -1, 4861, 4861, 6, 75, -1, 0, 0, 12, 4862, 5954), + (4864, 1274, 1274, 1274, 1274, 6, 73, 11053, 9, 540, 12, 1276, 4865), + (4865, 1274, 1274, 1274, 1274, 6, 74, 11054, 9, 540, 12, 4864, 4866), + (4866, 1274, 1274, 1274, 1274, 6, 75, 11055, 9, 540, 12, 4865, 5947), + (4887, -1, -1, 4887, 4887, 6, 71, -1, 0, 0, 12, -1, 4888), + (4888, -1, -1, 4887, 4887, 6, 73, -1, 0, 0, 12, 4887, 4889), + (4889, -1, -1, 4887, 4887, 6, 75, -1, 0, 0, 12, 4888, -1), + (4890, 4890, -1, 4890, 4890, 9, 75, 11056, 3, 8640, 12, -1, 5869), + (4894, 4894, 4894, 4894, 4894, 6, 73, 11057, 7, 2160, 12, -1, 4895), + (4895, 4894, 4894, 4894, 4894, 6, 74, 11058, 7, 2160, 12, 4894, 4896), + (4896, 4894, 4894, 4894, 4894, 6, 75, 11059, 7, 2160, 12, 4895, 6352), + (4897, -1, -1, 795, 795, 6, 71, -1, 0, 0, 12, 1432, 4898), + (4898, -1, -1, 795, 795, 6, 73, -1, 0, 0, 12, 4897, 4899), + (4899, -1, -1, 795, 795, 6, 75, -1, 0, 0, 12, 4898, 5889), + (4900, 1462, 1462, 1462, 1462, 6, 71, 11061, 5, 300, 12, 1466, 4901), + (4901, 1462, 1462, 1462, 1462, 6, 73, 11062, 5, 300, 12, 4900, 4902), + (4902, 1462, 1462, 1462, 1462, 6, 75, 11063, 5, 300, 12, 4901, 14739), + (4903, 4903, 4903, 4903, 4903, 9, 71, 11064, 9, 1320, 12, -1, 5892), + (4906, 4906, 4906, 4906, 4906, 9, 71, 11065, 9, 1320, 12, -1, 5893), + (4909, 4909, 4909, 4909, 4909, 9, 71, 11066, 16, 1320, 12, -1, 5894), + (4912, 4912, 4912, 4912, 4912, 9, 71, 11067, 16, 1320, 12, -1, 5895), + (4915, 4915, 4915, 4915, 4915, 9, 71, 11068, 7, 4320, 12, -1, 4916), + (4916, 4915, 4915, 4915, 4915, 9, 73, 11069, 7, 4320, 12, 4915, 4917), + (4917, 4915, 4915, 4915, 4915, 9, 75, 11070, 7, 4320, 12, 4916, 5607), + (4921, -1, -1, 480, 480, 2, 71, -1, 0, 0, 12, 482, 4922), + (4922, -1, -1, 480, 480, 2, 73, -1, 0, 0, 12, 4921, 4923), + (4923, -1, -1, 480, 480, 2, 75, -1, 0, 0, 12, 4922, -1), + (4924, -1, -1, 4924, 4924, 5, 75, -1, 0, 0, 12, -1, 4925), + (4925, -1, -1, 4924, 4924, 5, 75, -1, 0, 0, 12, 4924, 4926), + (4926, -1, -1, 4924, 4924, 5, 75, -1, 0, 0, 12, 4925, 5944), + (4927, 4927, 4927, 4927, 4927, 9, 71, 11076, 14, 600, 12, -1, 7209), + (4931, 4931, 4931, 4931, 4931, 6, 71, 11083, 4, 600, 12, -1, 4932), + (4932, 4931, 4931, 4931, 4931, 6, 73, 11084, 4, 600, 12, 4931, 4933), + (4933, 4931, 4931, 4931, 4931, 6, 75, 11085, 4, 600, 12, 4932, 6054), + (4934, 4934, 4934, 4934, 4934, 7, 71, 11086, 13, 300, 12, -1, 7295), + (4935, 4935, 4935, 4935, 4935, 7, 71, 11087, 14, 300, 12, -1, 7294), + (4938, 4938, 4938, 4938, 4938, 9, 75, 11092, 35, 1800, 12, -1, 5610), + (4943, 4943, 4943, 4943, 4943, 7, 75, 11098, 17, 1800, 12, -1, -1), + (4944, 4944, -1, 4944, 4944, 3, 71, 11103, 0, 1, 12, -1, 4945), + (4945, 4944, -1, 4944, 4944, 6, 73, 11104, 0, 1, 12, 4944, 4946), + (4946, 4944, -1, 4944, 4944, 9, 75, 11105, 0, 1, 12, 4945, 6155), + (4948, -1, -1, 846, 846, 3, 71, -1, 0, 0, 12, 1303, 4949), + (4949, -1, -1, 846, 846, 6, 73, -1, 0, 0, 12, 4948, 4950), + (4950, -1, -1, 846, 846, 9, 75, -1, 0, 0, 12, 4949, 6035), + (4951, -1, -1, 1543, 1543, 5, 71, -1, 0, 0, 12, 1545, 4952), + (4952, -1, -1, 1543, 1543, 5, 73, -1, 0, 0, 12, 4951, 4953), + (4953, -1, -1, 1543, 1543, 5, 75, -1, 0, 0, 12, 4952, 6042), + (4957, -1, -1, 878, 878, 7, 71, -1, 0, 0, 12, 1541, 4958), + (4958, -1, -1, 878, 878, 7, 73, -1, 0, 0, 12, 4957, 4959), + (4959, -1, -1, 878, 878, 7, 75, -1, 0, 0, 12, 4958, 6331), + (4960, -1, -1, 729, 729, 6, 71, -1, 0, 0, 12, 1469, 4961), + (4961, -1, -1, 729, 729, 6, 73, -1, 0, 0, 12, 4960, 4962), + (4962, -1, -1, 729, 729, 6, 75, -1, 0, 0, 12, 4961, 5738), + (4963, 723, 723, 723, 723, 9, 71, 11205, 6, 30, 12, 723, 5737), + (4964, 1119, 1119, 1119, 1119, 6, 73, 11206, 8, 900, 12, 1121, 4965), + (4965, 1119, 1119, 1119, 1119, 6, 74, 11207, 8, 900, 12, 4964, 4966), + (4966, 1119, 1119, 1119, 1119, 6, 75, 11208, 8, 900, 12, 4965, 5734), + (4969, 291, 291, 291, 291, 5, 71, 11212, 5, 900, 12, 1125, 4970), + (4970, 291, 291, 291, 291, 5, 73, 11213, 5, 900, 12, 4969, 4971), + (4971, 291, 291, 291, 291, 5, 75, 11214, 5, 900, 12, 4970, 5743), + (4972, 1598, -1, 1598, 1598, 6, 71, 11215, 6, 900, 12, 1600, 4973), + (4973, 1598, -1, 1598, 1598, 6, 73, 11216, 6, 900, 12, 4972, 4974), + (4974, 1598, -1, 1598, 1598, 6, 75, 11217, 6, 900, 12, 4973, 5710), + (4975, 592, 592, 592, 592, 3, 71, 11218, 2, 18, 12, 1106, 4976), + (4976, 592, 592, 592, 592, 3, 72, 11219, 2, 18, 12, 4975, 4977), + (4977, 592, 592, 592, 592, 3, 73, 11220, 2, 18, 12, 4976, 4978), + (4978, 592, 592, 592, 592, 3, 74, 11221, 2, 18, 12, 4977, 4979), + (4979, 592, 592, 592, 592, 3, 75, 11222, 2, 18, 12, 4978, 5702), + (4980, 1116, 1116, 1116, 1116, 6, 73, 11223, 4, 2160, 12, 1118, 4981), + (4981, 1116, 1116, 1116, 1116, 6, 74, 11224, 4, 2160, 12, 4980, 4982), + (4982, 1116, 1116, 1116, 1116, 6, 75, 11225, 4, 2160, 12, 4981, 5699), + (4983, -1, -1, 864, 864, 6, 71, -1, 0, 0, 12, 1292, 4984), + (4984, -1, -1, 864, 864, 6, 73, -1, 0, 0, 12, 4983, 4985), + (4985, -1, -1, 864, 864, 6, 75, -1, 0, 0, 12, 4984, 6011), + (4986, -1, -1, 644, 644, 5, 67, -1, 0, 0, 12, 1603, 4987), + (4987, -1, -1, 644, 644, 5, 69, -1, 0, 0, 12, 4986, 4988), + (4988, -1, -1, 644, 644, 5, 71, -1, 0, 0, 12, 4987, 6017), + (4989, -1, -1, 1608, 1608, 6, 71, -1, 0, 0, 12, 1610, 4990), + (4990, -1, -1, 1608, 1608, 6, 73, -1, 0, 0, 12, 4989, 4991), + (4991, -1, -1, 1608, 1608, 6, 75, -1, 0, 0, 12, 4990, 7378), + (4992, -1, -1, 1616, 1616, 5, 71, -1, 0, 0, 12, 1620, 4993), + (4993, -1, -1, 1616, 1616, 5, 72, -1, 0, 0, 12, 4992, 4994), + (4994, -1, -1, 1616, 1616, 5, 73, -1, 0, 0, 12, 4993, 4995), + (4995, -1, -1, 1616, 1616, 5, 74, -1, 0, 0, 12, 4994, 4996), + (4996, -1, -1, 1616, 1616, 5, 75, -1, 0, 0, 12, 4995, 6003), + (4997, 545, 545, 545, 545, 6, 73, 11226, 3, 900, 12, 1295, 4998), + (4998, 545, 545, 545, 545, 6, 74, 11227, 3, 900, 12, 4997, 4999), + (4999, 545, 545, 545, 545, 6, 75, 11228, 3, 900, 12, 4998, 6000), + (5000, -1, -1, 1230, 1230, 2, 71, -1, 0, 0, 12, 1232, 5001), + (5001, -1, -1, 1230, 1230, 2, 73, -1, 0, 0, 12, 5000, 5002), + (5002, -1, -1, 1230, 1230, 2, 75, -1, 0, 0, 12, 5001, -1), + (5003, 1345, 1345, 1345, 1345, 5, 73, 11229, 6, 900, 12, 1347, 5004), + (5004, 1345, 1345, 1345, 1345, 5, 74, 11230, 6, 900, 12, 5003, 5005), + (5005, 1345, 1345, 1345, 1345, 5, 75, 11231, 6, 900, 12, 5004, 6008), + (5006, 5006, 5006, 5006, 5006, 0, 0, 27673, 96, 72000, 0, -1, -1), + (5007, 5007, 5007, 5007, 5007, 3, 71, 11233, 8, 2160, 12, -1, 5008), + (5008, 5007, 5007, 5007, 5007, 6, 73, 11234, 8, 2160, 12, 5007, 5009), + (5009, 5007, 5007, 5007, 5007, 9, 75, 11235, 8, 2160, 12, 5008, 6425), + (5010, -1, -1, 1007, 1007, 8, 81, -1, 0, 0, 16, -1, 5011), + (5011, -1, -1, 1007, 1007, 10, 83, -1, 0, 0, 16, 5010, 5012), + (5012, -1, -1, 1007, 1007, 12, 85, -1, 0, 0, 16, 5011, 15317), + (5013, -1, -1, 1284, 1284, 6, 83, -1, 0, 0, 16, 5037, 5014), + (5014, -1, -1, 1284, 1284, 6, 85, -1, 0, 0, 16, 5013, -1), + (5015, 5015, 5015, 5015, 5015, 5, 75, 11241, 9, 900, 12, -1, 5741), + (5017, 5017, 5017, 5017, 5017, 3, 71, 11243, 8, 600, 12, -1, 5018), + (5018, 5017, 5017, 5017, 5017, 6, 73, 11244, 8, 600, 12, 5017, 5019), + (5019, 5017, 5017, 5017, 5017, 9, 75, 11245, 8, 600, 12, 5018, 7454), + (5020, 5020, 5020, 5020, 5020, 9, 75, 11246, 9, 300, 12, -1, 5716), + (5021, 5021, 5021, 5021, 5021, 9, 71, 11341, 7, 60, 12, -1, 10868), + (5022, 5022, 5022, 5022, 5022, 3, 71, 11247, 5, 600, 12, -1, 5023), + (5023, 5022, 5022, 5022, 5022, 6, 73, 23986, 5, 600, 12, 5022, 5024), + (5024, 5022, 5022, 5022, 5022, 9, 75, 23987, 5, 600, 12, 5023, 6038), + (5025, 5025, 5025, 5025, 5025, 3, 71, 11251, 6, 180, 12, -1, 5026), + (5026, 5025, 5025, 5025, 5025, 6, 73, 11252, 6, 180, 12, 5025, 5027), + (5027, 5025, 5025, 5025, 5025, 9, 75, 11253, 6, 180, 12, 5026, -1), + (5028, 5028, -1, 5028, 5028, 9, 75, 11254, 4, 900, 12, -1, 6041), + (5029, -1, -1, 1313, 1313, 6, 71, -1, 0, 0, 8, 1315, 5030), + (5030, -1, -1, 1313, 1313, 6, 73, -1, 0, 0, 8, 5029, 5031), + (5031, -1, -1, 1313, 1313, 6, 75, -1, 0, 0, 8, 5030, 6066), + (5032, -1, -1, 634, 634, 5, 72, -1, 0, 0, 12, 1321, 5033), + (5033, -1, -1, 634, 634, 5, 73, -1, 0, 0, 12, 5032, 5034), + (5034, -1, -1, 634, 634, 5, 74, -1, 0, 0, 12, 5033, 5611), + (5035, -1, -1, 1284, 1284, 6, 71, -1, 0, 0, 12, 1286, 5036), + (5036, -1, -1, 1284, 1284, 6, 73, -1, 0, 0, 12, 5035, 5037), + (5037, -1, -1, 1284, 1284, 6, 75, -1, 0, 0, 12, 5036, 5013), + (5038, -1, -1, 190, 190, 7, 71, -1, 0, 0, 12, 1525, 5039), + (5039, -1, -1, 190, 190, 7, 73, -1, 0, 0, 12, 5038, 5040), + (5040, -1, -1, 190, 190, 7, 75, -1, 0, 0, 12, 5039, 15141), + (5041, 534, 534, 534, 534, 5, 72, 11255, 4, 2160, 12, 1280, 5042), + (5042, 534, 534, 534, 534, 5, 73, 11256, 4, 2160, 12, 5041, 5043), + (5043, 534, 534, 534, 534, 5, 74, 11257, 4, 2160, 12, 5042, 5969), + (5044, 188, 188, 188, 188, 9, 73, 11258, 2, 30, 12, 1277, 7339), + (5045, -1, -1, 1057, 1057, 9, 85, -1, 0, 0, 16, -1, -1), + (5051, 757, -1, 757, 757, 5, 71, 11262, 6, 1800, 12, 1224, 5052), + (5052, 757, -1, 757, 757, 5, 73, 11263, 6, 1800, 12, 5051, 5053), + (5053, 757, -1, 757, 757, 5, 75, 11264, 6, 1800, 12, 5052, 5822), + (5054, 548, 548, 548, 548, 5, 72, 11265, 5, 900, 12, 1227, 5055), + (5055, 548, 548, 548, 548, 5, 73, 11266, 5, 900, 12, 5054, 5056), + (5056, 548, 548, 548, 548, 5, 74, 11267, 5, 900, 12, 5055, 5829), + (5058, 1498, 1498, 1498, 1498, 6, 71, 11269, 12, 1320, 12, 1500, 5059), + (5059, 1498, 1498, 1498, 1498, 6, 73, 11270, 12, 1320, 12, 5058, 5060), + (5060, 1498, 1498, 1498, 1498, 6, 75, 11271, 12, 1320, 12, 5059, 5819), + (5061, -1, -1, 567, 567, 5, 72, -1, 0, 0, 12, 567, 5825), + (5062, 459, 459, 459, 459, 6, 71, 11272, 8, 180, 12, 1191, 5063), + (5063, 459, 459, 459, 459, 6, 73, 11273, 8, 180, 12, 5062, 5064), + (5064, 459, 459, 459, 459, 6, 75, 11274, 8, 180, 12, 5063, -1), + (5068, 153, 153, 153, 153, 9, 75, 11279, 3, 2160, 12, 1519, 6101), + (5069, 146, 146, 146, 146, 5, 72, 11281, 2, 180, 12, 146, 6102), + (5070, 131, 131, 131, 131, 5, 72, 11282, 4, 900, 12, 1205, 5071), + (5071, 131, 131, 131, 131, 5, 73, 11283, 4, 900, 12, 5070, 5072), + (5072, 131, 131, 131, 131, 5, 74, 11284, 4, 900, 12, 5071, 5791), + (5076, 1192, 1192, 1192, 1192, 5, 72, 11288, 12, 1320, 12, 1194, 5077), + (5077, 1192, 1192, 1192, 1192, 5, 73, 11289, 12, 1320, 12, 5076, 5078), + (5078, 1192, 1192, 1192, 1192, 5, 74, 11290, 12, 1320, 12, 5077, 5794), + (5079, 1195, 1195, 1195, 1195, 9, 75, 11291, 13, 2160, 12, 1195, 5790), + (5080, 1459, 1459, 1459, 1459, 5, 71, 11293, 11, 1800, 12, 1461, 5081), + (5081, 1459, 1459, 1459, 1459, 5, 73, 11294, 11, 1800, 12, 5080, 5082), + (5082, 1459, 1459, 1459, 1459, 5, 75, 11295, 11, 1800, 12, 5081, 5803), + (5084, 1383, 1383, 1383, 1383, 12, 75, 11296, 6, 300, 12, 1387, 5789), + (5085, -1, -1, 5085, 5085, 3, 71, -1, 0, 0, 12, -1, 5086), + (5086, -1, -1, 5085, 5085, 6, 73, -1, 0, 0, 12, 5085, 5087), + (5087, -1, -1, 5085, 5085, 9, 75, -1, 0, 0, 12, 5086, 6406), + (5095, 5095, 5095, 5095, 5095, 3, 71, 11307, 10, 900, 12, -1, 5096), + (5096, 5095, 5095, 5095, 5095, 6, 73, 11308, 10, 900, 12, 5095, 5097), + (5097, 5095, 5095, 5095, 5095, 9, 75, 11309, 10, 900, 12, 5096, 5975), + (5098, 5098, 5098, 5098, 5098, 9, 75, 11310, 2, 30, 12, -1, -1), + (5105, 5105, 5105, 5105, 5105, 9, 75, 11317, 11, 600, 12, -1, 5832), + (5109, 5109, 5109, 5109, 5109, 9, 75, 11321, 0, 1, 12, -1, 6448), + (5118, -1, -1, 5083, 5083, 3, 71, -1, 0, 0, 12, -1, 5119), + (5119, -1, -1, 5083, 5083, 3, 73, -1, 0, 0, 12, 5118, 5120), + (5120, -1, -1, 5083, 5083, 3, 75, -1, 0, 0, 12, 5119, 5797), + (5127, -1, -1, 5127, 5127, 3, 71, -1, 0, 0, 12, -1, 5128), + (5128, -1, -1, 5127, 5127, 3, 73, -1, 0, 0, 12, 5127, 5129), + (5129, -1, -1, 5127, 5127, 3, 75, -1, 0, 0, 12, 5128, -1), + (5130, 860, 860, 860, 860, 6, 71, 5860, 5, 180, 12, 862, 5131), + (5131, 860, 860, 860, 860, 6, 73, 5861, 5, 180, 12, 5130, 5132), + (5132, 860, 860, 860, 860, 6, 75, 5862, 5, 180, 12, 5131, -1), + (5133, -1, -1, 267, 267, 6, 71, -1, 0, 0, 12, 925, 5134), + (5134, -1, -1, 267, 267, 6, 73, -1, 0, 0, 12, 5133, 5135), + (5135, -1, -1, 267, 267, 6, 75, -1, 0, 0, 12, 5134, 5617), + (5136, -1, -1, 4688, 4688, 3, 71, -1, 0, 0, 12, -1, 5137), + (5137, -1, -1, 4688, 4688, 3, 72, -1, 0, 0, 12, 5136, 5138), + (5138, -1, -1, 4688, 4688, 3, 73, -1, 0, 0, 12, 5137, 5139), + (5139, -1, -1, 4688, 4688, 3, 74, -1, 0, 0, 12, 5138, 5140), + (5140, -1, -1, 4688, 4688, 3, 75, -1, 0, 0, 12, 5139, -1), + (5141, -1, -1, 815, 815, 5, 71, -1, 0, 0, 12, 819, 5142), + (5142, -1, -1, 815, 815, 5, 72, -1, 0, 0, 12, 5141, 5143), + (5143, -1, -1, 815, 815, 5, 73, -1, 0, 0, 12, 5142, 5144), + (5144, -1, -1, 815, 815, 5, 74, -1, 0, 0, 12, 5143, 5145), + (5145, -1, -1, 815, 815, 5, 75, -1, 0, 0, 12, 5144, 5909), + (5150, 5150, 5150, 5150, 5150, 0, 1, 11112, 22, 300, 3, -1, 5151), + (5165, 5165, 5165, 5165, 5165, 0, 1, 11127, 22, 300, 3, -1, 5166), + (5180, 5180, 5180, 5180, 5180, 0, 1, 11142, 22, 300, 3, -1, 5181), + (5195, 5195, 5195, 5195, 5195, 0, 1, 11157, 22, 300, 3, -1, 5196), + (5210, 5210, 5210, 5210, 5210, 0, 1, 11172, 22, 300, 3, -1, 5211), + (5225, 5225, 5225, 5225, 5225, 0, 1, 11187, 22, 300, 3, -1, 5226), + (5240, 1355, 1355, 1355, 1355, 6, 71, 11611, 3, 60, 12, 1357, 5241), + (5241, 1355, 1355, 1355, 1355, 6, 73, 11612, 3, 60, 12, 5240, 5242), + (5242, 1355, 1355, 1355, 1355, 6, 75, 11613, 3, 60, 12, 5241, 5914), + (5243, -1, -1, 907, 907, 7, 71, -1, 0, 0, 12, 911, 5244), + (5244, -1, -1, 907, 907, 7, 72, -1, 0, 0, 12, 5243, 5245), + (5245, -1, -1, 907, 907, 7, 73, -1, 0, 0, 12, 5244, 5246), + (5246, -1, -1, 907, 907, 7, 74, -1, 0, 0, 12, 5245, 5247), + (5247, -1, -1, 907, 907, 7, 75, -1, 0, 0, 12, 5246, -1), + (5248, -1, -1, 5248, 5248, 3, 71, -1, 0, 0, 12, -1, 5249), + (5249, -1, -1, 5248, 5248, 6, 73, -1, 0, 0, 12, 5248, 5250), + (5250, -1, -1, 5248, 5248, 9, 75, -1, 0, 0, 12, 5249, 6014), + (5251, 5251, 5251, 5251, 5251, 5, 71, 11615, 13, 900, 12, -1, 5252), + (5252, 5251, 5251, 5251, 5251, 5, 73, 11616, 13, 900, 12, 5251, 5253), + (5253, 5251, 5251, 5251, 5251, 5, 75, 11617, 13, 900, 12, 5252, 6092), + (5254, -1, -1, 724, 724, 3, 71, -1, 0, 0, 12, 728, 5255), + (5255, -1, -1, 724, 724, 3, 72, -1, 0, 0, 12, 5254, 5256), + (5256, -1, -1, 724, 724, 3, 73, -1, 0, 0, 12, 5255, 5257), + (5257, -1, -1, 724, 724, 3, 74, -1, 0, 0, 12, 5256, 5258), + (5258, -1, -1, 724, 724, 3, 75, -1, 0, 0, 12, 5257, 5729), + (5259, -1, -1, 790, 790, 3, 71, -1, 0, 0, 12, 794, 5260), + (5260, -1, -1, 790, 790, 3, 72, -1, 0, 0, 12, 5259, 5261), + (5261, -1, -1, 790, 790, 3, 73, -1, 0, 0, 12, 5260, 5262), + (5262, -1, -1, 790, 790, 3, 74, -1, 0, 0, 12, 5261, 5263), + (5263, -1, -1, 790, 790, 3, 75, -1, 0, 0, 12, 5262, 5320), + (5264, -1, -1, 5264, 5264, 3, 71, -1, 0, 0, 12, -1, 5265), + (5265, -1, -1, 5264, 5264, 3, 72, -1, 0, 0, 12, 5264, 5266), + (5266, -1, -1, 5264, 5264, 3, 73, -1, 0, 0, 12, 5265, 5267), + (5267, -1, -1, 5264, 5264, 3, 74, -1, 0, 0, 12, 5266, 5268), + (5268, -1, -1, 5264, 5264, 3, 75, -1, 0, 0, 12, 5267, 5939), + (5269, -1, -1, 5269, 5269, 3, 71, -1, 0, 0, 12, -1, -1), + (5270, -1, -1, 589, 589, 7, 71, -1, 0, 0, 12, 894, 5271), + (5271, -1, -1, 589, 589, 7, 73, -1, 0, 0, 12, 5270, 5272), + (5272, -1, -1, 589, 589, 7, 75, -1, 0, 0, 12, 5271, 6063), + (5276, -1, -1, 5276, 5276, 3, 71, -1, 0, 0, 12, -1, 5277), + (5277, -1, -1, 5276, 5276, 6, 73, -1, 0, 0, 12, 5276, 5278), + (5278, -1, -1, 5276, 5276, 9, 75, -1, 0, 0, 12, 5277, 15238), + (5279, 155, 155, 155, 155, 12, 75, 11624, 8, 60, 12, 1344, 5289), + (5280, 921, 921, 921, 921, 9, 74, 11625, 8, 60, 12, 1340, 6149), + (5281, 922, 922, 922, 922, 9, 73, 11626, 8, 60, 12, 1341, 6150), + (5282, 923, 923, 923, 923, 9, 72, 11627, 8, 60, 12, 1342, 6151), + (5283, -1, -1, 5263, 5263, 3, 71, -1, 0, 0, 12, -1, 5284), + (5284, -1, -1, 5263, 5263, 6, 73, -1, 0, 0, 12, 5283, 5285), + (5285, -1, -1, 5263, 5263, 9, 75, -1, 0, 0, 12, 5284, 5620), + (5286, -1, -1, 1107, 1107, 6, 71, -1, 0, 0, 12, 1109, 5287), + (5287, -1, -1, 1107, 1107, 6, 73, -1, 0, 0, 12, 5286, 5288), + (5288, -1, -1, 1107, 1107, 6, 75, -1, 0, 0, 12, 5287, 6403), + (5289, 155, 155, 155, 155, 12, 77, 13227, 8, 60, 14, 5279, 7238), + (5290, -1, -1, 1604, 1604, 5, 63, -1, 0, 0, 12, 1606, 5291), + (5291, -1, -1, 1604, 1604, 5, 64, -1, 0, 0, 12, 5290, 5292), + (5292, -1, -1, 1604, 1604, 5, 65, -1, 0, 0, 12, 5291, 5293), + (5293, -1, -1, 1604, 1604, 5, 66, -1, 0, 0, 12, 5292, 5294), + (5294, -1, -1, 1604, 1604, 5, 67, -1, 0, 0, 12, 5293, 6032), + (5295, -1, -1, 5295, 5295, 3, 71, -1, 0, 0, 12, -1, 5296), + (5296, -1, -1, 5295, 5295, 6, 73, -1, 0, 0, 12, 5295, 5297), + (5297, -1, -1, 5295, 5295, 9, 75, -1, 0, 0, 12, 5296, 6531), + (5298, 5298, 5298, 5298, 5298, 3, 71, 11630, 32, 1800, 12, -1, 5299), + (5299, 5298, 5298, 5298, 5298, 6, 73, 11631, 32, 1800, 12, 5298, 5300), + (5300, 5298, 5298, 5298, 5298, 9, 75, 11632, 32, 1800, 12, 5299, 5707), + (5301, -1, -1, 683, 683, 5, 71, -1, 0, 0, 12, 1038, 5302), + (5302, -1, -1, 683, 683, 5, 72, -1, 0, 0, 12, 5301, 5303), + (5303, -1, -1, 683, 683, 5, 73, -1, 0, 0, 12, 5302, 5304), + (5304, -1, -1, 683, 683, 5, 74, -1, 0, 0, 12, 5303, 5305), + (5305, -1, -1, 683, 683, 5, 75, -1, 0, 0, 12, 5304, 6080), + (5306, -1, -1, 658, 658, 5, 71, -1, 0, 0, 12, 660, 5307), + (5307, -1, -1, 658, 658, 5, 72, -1, 0, 0, 12, 5306, 5308), + (5308, -1, -1, 658, 658, 5, 73, -1, 0, 0, 12, 5307, 5309), + (5309, -1, -1, 658, 658, 5, 74, -1, 0, 0, 12, 5308, 5310), + (5310, -1, -1, 658, 658, 5, 75, -1, 0, 0, 12, 5309, 5623), + (5311, 1495, 1495, 1495, 1495, 5, 71, 11639, 30, 900, 12, 1497, 5312), + (5312, 1495, 1495, 1495, 1495, 5, 73, 11640, 30, 900, 12, 5311, 5313), + (5313, 1495, 1495, 1495, 1495, 5, 75, 11641, 30, 900, 12, 5312, 5826), + (5314, 1327, 1327, 1327, 1327, 5, 71, 11642, 10, 900, 12, 1329, 5315), + (5315, 1327, 1327, 1327, 1327, 5, 73, 11643, 10, 900, 12, 5314, 5316), + (5316, 1327, 1327, 1327, 1327, 5, 75, 11644, 10, 900, 12, 5315, 6098), + (5317, -1, -1, 98, 738, 4, 71, -1, 0, 0, 12, 740, 5318), + (5318, -1, -1, 98, 738, 4, 73, -1, 0, 0, 12, 5317, 5319), + (5319, -1, -1, 98, 738, 4, 75, -1, 0, 0, 12, 5318, 5628), + (5320, -1, -1, 790, 790, 6, 76, -1, 0, 0, 14, 5263, 5321), + (5321, -1, -1, 790, 790, 6, 77, -1, 0, 0, 14, 5320, 5322), + (5322, -1, -1, 790, 790, 6, 78, -1, 0, 0, 14, 5321, 5323), + (5323, -1, -1, 790, 790, 6, 79, -1, 0, 0, 14, 5322, 5324), + (5324, -1, -1, 790, 790, 6, 80, -1, 0, 0, 14, 5323, 7270), + (5325, -1, -1, 839, 839, 6, 70, -1, 0, 0, 14, 843, 5326), + (5326, -1, -1, 839, 839, 6, 70, -1, 0, 0, 14, 5325, 5327), + (5327, -1, -1, 839, 839, 6, 70, -1, 0, 0, 14, 5326, 5328), + (5328, -1, -1, 839, 839, 6, 70, -1, 0, 0, 14, 5327, 5329), + (5329, -1, -1, 839, 839, 6, 70, -1, 0, 0, 14, 5328, 7210), + (5330, 1327, 1327, 1327, 1327, 12, 91, 30870, 10, 900, 18, 10189, 5331), + (5333, 1520, 1520, 1520, 1520, 9, 91, 30873, 11, 900, 18, 12999, 5334), + (5336, 12989, 12989, 12989, 12989, 11, 91, 30876, 73, 1800, 18, 12991, 5337), + (5339, -1, -1, 6383, 6383, 11, 91, -1, 0, 0, 18, 12803, 5340), + (5342, 6692, 6692, 6692, 6692, 9, 91, 30879, 42, 600, 18, 6696, 5343), + (5347, -1, -1, 6375, 6375, 12, 91, -1, 0, 0, 18, 10086, 5348), + (5348, -1, -1, 6375, 6375, 15, 93, -1, 0, 0, 18, 5347, 5349), + (5350, 12992, 12992, 12992, 12992, 12, 91, 30884, 0, 1, 18, 12994, 5351), + (5353, 6706, 6706, 6706, 6706, 9, 91, 30887, 44, 600, 18, 10181, 5354), + (5356, 5109, 5109, 5109, 5109, 12, 92, 30890, 0, 1, 18, 13016, 17323), + (5357, 528, 528, 528, 528, 12, 91, 30891, 5, 720, 18, 13163, 5358), + (5360, -1, -1, 9503, 9503, 11, 91, -1, 0, 0, 18, 12794, 5361), + (5363, 5251, 5251, 5251, 5251, 15, 91, 30894, 13, 900, 18, 10199, 5364), + (5366, -1, -1, 5002, 5002, 12, 91, -1, 34, 0, 18, -1, 5367), + (5369, 5001, 5001, 5001, 5001, 12, 91, 30900, 32, 600, 18, -1, 5370), + (5500, -1, -1, 852, 852, 9, 78, -1, 0, 0, 14, 854, 5501), + (5501, -1, -1, 852, 852, 10, 79, -1, 0, 0, 14, 5500, 5502), + (5502, -1, -1, 852, 852, 12, 80, -1, 0, 0, 14, 5501, 7678), + (5513, 1126, 1126, 1126, 1126, 8, 77, 12668, 2, 2160, 14, 1128, 5514), + (5514, 1126, 1126, 1126, 1126, 9, 78, 12669, 2, 2160, 14, 5513, 5515), + (5515, 1126, 1126, 1126, 1126, 10, 79, 12670, 2, 2160, 14, 5514, 13253), + (5516, -1, -1, 1287, 1287, 8, 77, -1, 0, 0, 14, 1289, 5517), + (5517, -1, -1, 1287, 1287, 9, 78, -1, 0, 0, 14, 5516, 5518), + (5518, -1, -1, 1287, 1287, 10, 79, -1, 0, 0, 14, 5517, 12469), + (5519, -1, -1, 125, 125, 6, 76, -1, 0, 0, 14, 1398, 5520), + (5520, -1, -1, 125, 125, 7, 77, -1, 0, 0, 14, 5519, 5521), + (5521, -1, -1, 125, 125, 8, 78, -1, 0, 0, 14, 5520, 5522), + (5522, -1, -1, 125, 125, 9, 79, -1, 0, 0, 14, 5521, 5523), + (5523, -1, -1, 125, 125, 10, 80, -1, 0, 0, 14, 5522, 7501), + (5524, -1, -1, 122, 122, 6, 76, -1, 0, 0, 14, 1403, 5525), + (5525, -1, -1, 122, 122, 7, 77, -1, 0, 0, 14, 5524, 5526), + (5526, -1, -1, 122, 122, 8, 78, -1, 0, 0, 14, 5525, 5527), + (5527, -1, -1, 122, 122, 9, 79, -1, 0, 0, 14, 5526, 5528), + (5528, -1, -1, 122, 122, 10, 80, -1, 0, 0, 14, 5527, 7506), + (5529, -1, -1, 1486, 1486, 7, 76, -1, 0, 0, 14, 1490, 5530), + (5530, -1, -1, 1486, 1486, 8, 77, -1, 0, 0, 14, 5529, 5531), + (5531, -1, -1, 1486, 1486, 9, 78, -1, 0, 0, 14, 5530, 5532), + (5532, -1, -1, 1486, 1486, 10, 79, -1, 0, 0, 14, 5531, 5533), + (5533, -1, -1, 1486, 1486, 12, 80, -1, 0, 0, 14, 5532, 7554), + (5534, -1, -1, 599, 599, 9, 78, -1, 0, 0, 14, 1538, 5535), + (5535, -1, -1, 599, 599, 10, 79, -1, 0, 0, 14, 5534, 5536), + (5536, -1, -1, 599, 599, 12, 80, -1, 0, 0, 14, 5535, 7559), + (5542, -1, -1, 1041, 1041, 7, 76, -1, 0, 0, 14, 4709, 5543), + (5543, -1, -1, 1041, 1041, 9, 78, -1, 0, 0, 14, 5542, 5544), + (5544, -1, -1, 1041, 1041, 12, 80, -1, 0, 0, 14, 5543, 7562), + (5545, -1, -1, 1044, 1044, 7, 76, -1, 0, 0, 14, 4712, 5546), + (5546, -1, -1, 1044, 1044, 9, 78, -1, 0, 0, 14, 5545, 5547), + (5547, -1, -1, 1044, 1044, 12, 80, -1, 0, 0, 14, 5546, 7650), + (5548, -1, -1, 1047, 1047, 7, 76, -1, 0, 0, 14, 4715, 5549), + (5549, -1, -1, 1047, 1047, 9, 78, -1, 0, 0, 14, 5548, 5550), + (5550, -1, -1, 1047, 1047, 12, 80, -1, 0, 0, 14, 5549, 7653), + (5551, -1, -1, 1050, 1050, 7, 76, -1, 0, 0, 14, 4718, 5552), + (5552, -1, -1, 1050, 1050, 9, 78, -1, 0, 0, 14, 5551, 5553), + (5553, -1, -1, 1050, 1050, 12, 80, -1, 0, 0, 14, 5552, 7656), + (5554, -1, -1, 119, 119, 7, 76, -1, 0, 0, 14, 4724, 5555), + (5555, -1, -1, 119, 119, 9, 78, -1, 0, 0, 14, 5554, 5556), + (5556, -1, -1, 119, 119, 12, 80, -1, 0, 0, 14, 5555, 7565), + (5557, -1, -1, 1592, 1592, 7, 76, -1, 0, 0, 14, 4729, 5558), + (5558, -1, -1, 1592, 1592, 8, 77, -1, 0, 0, 14, 5557, 5559), + (5559, -1, -1, 1592, 1592, 9, 78, -1, 0, 0, 14, 5558, 5560), + (5560, -1, -1, 1592, 1592, 10, 79, -1, 0, 0, 14, 5559, 5561), + (5561, -1, -1, 1592, 1592, 12, 80, -1, 0, 0, 14, 5560, 7568), + (5562, -1, -1, 4739, 4739, 7, 76, -1, 0, 0, 14, 4741, 5563), + (5563, -1, -1, 4739, 4739, 9, 78, -1, 0, 0, 14, 5562, 5564), + (5564, -1, -1, 4739, 4739, 12, 80, -1, 0, 0, 14, 5563, 7573), + (5565, 4742, 4742, 4742, 4742, 7, 76, 12671, 12, 600, 14, 4742, -1), + (5566, -1, -1, 1072, 1072, 7, 76, -1, 0, 0, 14, 4748, 5567), + (5567, -1, -1, 1072, 1072, 8, 77, -1, 0, 0, 14, 5566, 5568), + (5568, -1, -1, 1072, 1072, 9, 78, -1, 0, 0, 14, 5567, 5569), + (5569, -1, -1, 1072, 1072, 10, 79, -1, 0, 0, 14, 5568, 5570), + (5570, -1, -1, 1072, 1072, 12, 80, -1, 0, 0, 14, 5569, 7576), + (5571, -1, -1, 637, 637, 7, 76, -1, 0, 0, 14, 4751, 5572), + (5572, -1, -1, 637, 637, 9, 78, -1, 0, 0, 14, 5571, 5573), + (5573, -1, -1, 637, 637, 12, 80, -1, 0, 0, 14, 5572, 12435), + (5574, -1, -1, 1210, 1210, 7, 76, -1, 0, 0, 14, 4754, 5575), + (5575, -1, -1, 1210, 1210, 9, 78, -1, 0, 0, 14, 5574, 5576), + (5576, -1, -1, 1210, 1210, 12, 80, -1, 0, 0, 14, 5575, 7232), + (5577, -1, -1, 1210, 1213, 7, 76, -1, 0, 0, 14, 4757, 5578), + (5578, -1, -1, 1210, 1213, 9, 78, -1, 0, 0, 14, 5577, 5579), + (5579, -1, -1, 1210, 1213, 12, 80, -1, 0, 0, 14, 5578, 7581), + (5580, -1, -1, 602, 602, 7, 76, -1, 0, 0, 14, 4760, 5581), + (5581, -1, -1, 602, 602, 9, 78, -1, 0, 0, 14, 5580, 5582), + (5582, -1, -1, 602, 602, 12, 80, -1, 0, 0, 14, 5581, 10685), + (5586, -1, -1, 98, 98, 7, 76, -1, 0, 0, 14, 4769, 5587), + (5587, -1, -1, 98, 98, 9, 78, -1, 0, 0, 14, 5586, 5588), + (5588, -1, -1, 98, 98, 12, 80, -1, 0, 0, 14, 5587, 7584), + (5589, -1, -1, 1186, 1186, 7, 76, -1, 0, 0, 14, 4778, 5590), + (5590, -1, -1, 1186, 1186, 9, 78, -1, 0, 0, 14, 5589, 5591), + (5591, -1, -1, 1186, 1186, 12, 80, -1, 0, 0, 14, 5590, 7587), + (5592, -1, -1, 80, 80, 7, 76, -1, 0, 0, 14, 4781, 5593), + (5593, -1, -1, 80, 80, 9, 78, -1, 0, 0, 14, 5592, 5594), + (5594, -1, -1, 80, 80, 12, 80, -1, 0, 0, 14, 5593, 7590), + (5595, -1, -1, 255, 255, 7, 76, -1, 0, 0, 14, 4797, 5596), + (5596, -1, -1, 255, 255, 9, 78, -1, 0, 0, 14, 5595, 5597), + (5597, -1, -1, 255, 255, 12, 80, -1, 0, 0, 14, 5596, 7631), + (5606, 4860, 4860, 4860, 4860, 12, 80, 11688, 13, 60, 14, 4860, 7127), + (5607, 4915, 4915, 4915, 4915, 7, 76, 12673, 7, 4320, 14, 4917, 5608), + (5608, 4915, 4915, 4915, 4915, 9, 78, 12674, 7, 4320, 14, 5607, 5609), + (5609, 4915, 4915, 4915, 4915, 12, 80, 12675, 7, 4320, 14, 5608, 7246), + (5610, 4938, 4938, 4938, 4938, 12, 80, 12676, 35, 1800, 14, 4938, 5614), + (5611, -1, -1, 634, 634, 7, 76, -1, 0, 0, 14, 5034, 5612), + (5612, -1, -1, 634, 634, 9, 78, -1, 0, 0, 14, 5611, 5613), + (5613, -1, -1, 634, 634, 12, 80, -1, 0, 0, 14, 5612, 7713), + (5614, 4938, 4938, 4938, 4938, 9, 85, 16852, 35, 1800, 16, 5610, 12875), + (5617, -1, -1, 267, 267, 7, 76, -1, 0, 0, 14, 5135, 5618), + (5618, -1, -1, 267, 267, 9, 78, -1, 0, 0, 14, 5617, 5619), + (5619, -1, -1, 267, 267, 12, 80, -1, 0, 0, 14, 5618, 12860), + (5620, -1, -1, 5263, 5263, 7, 76, -1, 0, 0, 14, 5285, 5621), + (5621, -1, -1, 5263, 5263, 9, 78, -1, 0, 0, 14, 5620, 5622), + (5622, -1, -1, 5263, 5263, 12, 80, -1, 0, 0, 14, 5621, 12466), + (5623, -1, -1, 658, 658, 5, 76, -1, 0, 0, 14, 5310, 5624), + (5624, -1, -1, 658, 658, 5, 77, -1, 0, 0, 14, 5623, 5625), + (5625, -1, -1, 658, 658, 5, 78, -1, 0, 0, 14, 5624, 5626), + (5626, -1, -1, 658, 658, 5, 79, -1, 0, 0, 14, 5625, 5627), + (5627, -1, -1, 658, 658, 5, 80, -1, 0, 0, 14, 5626, 7593), + (5628, -1, -1, 98, 738, 7, 76, -1, 0, 0, 14, 5319, 5629), + (5629, -1, -1, 98, 738, 9, 78, -1, 0, 0, 14, 5628, 5630), + (5630, -1, -1, 98, 738, 12, 80, -1, 0, 0, 14, 5629, 7598), + (5699, 1116, 1116, 1116, 1116, 7, 76, 12500, 4, 2160, 14, 4982, 5700), + (5700, 1116, 1116, 1116, 1116, 9, 78, 12501, 4, 2160, 14, 5699, 5701), + (5701, 1116, 1116, 1116, 1116, 12, 80, 12502, 4, 2160, 14, 5700, 7430), + (5702, 592, 592, 592, 592, 4, 76, 12503, 2, 18, 14, 4979, 5703), + (5703, 592, 592, 592, 592, 4, 77, 12504, 2, 18, 14, 5702, 5704), + (5704, 592, 592, 592, 592, 4, 78, 12505, 2, 18, 14, 5703, 5705), + (5705, 592, 592, 592, 592, 4, 79, 12506, 2, 18, 14, 5704, 5706), + (5706, 592, 592, 592, 592, 4, 80, 12507, 2, 18, 14, 5705, 7433), + (5707, 5298, 5298, 5298, 5298, 9, 78, 12508, 32, 1800, 14, 5300, 5708), + (5708, 5298, 5298, 5298, 5298, 10, 79, 12509, 32, 1800, 14, 5707, 5709), + (5709, 5298, 5298, 5298, 5298, 12, 80, 12510, 32, 1800, 14, 5708, 7438), + (5710, 1598, -1, 1598, 1598, 7, 76, 12511, 6, 900, 14, 4974, 5711), + (5711, 1598, -1, 1598, 1598, 9, 78, 12512, 6, 900, 14, 5710, 5712), + (5712, 1598, -1, 1598, 1598, 12, 80, 12513, 6, 900, 14, 5711, 7441), + (5713, 1569, 1569, 1569, 1569, 7, 76, 12514, 5, 1800, 14, 1571, 5714), + (5714, 1569, 1569, 1569, 1569, 9, 78, 12515, 5, 1800, 14, 5713, 5715), + (5715, 1569, 1569, 1569, 1569, 12, 80, 12516, 5, 1800, 14, 5714, 7457), + (5716, 5020, 5020, 5020, 5020, 9, 77, 12517, 9, 300, 14, 5020, 7444), + (5717, 5717, 5717, 5717, 5717, 10, 76, 12519, 17, 600, 14, -1, -1), + (5729, -1, -1, 724, 724, 7, 76, -1, 0, 0, 14, 5258, 5730), + (5730, -1, -1, 724, 724, 8, 77, -1, 0, 0, 14, 5729, 5731), + (5731, -1, -1, 724, 724, 9, 78, -1, 0, 0, 14, 5730, 5732), + (5732, -1, -1, 724, 724, 10, 79, -1, 0, 0, 14, 5731, 5733), + (5733, -1, -1, 724, 724, 12, 80, -1, 0, 0, 14, 5732, 7489), + (5734, 1119, 1119, 1119, 1119, 7, 78, 12520, 8, 900, 14, 4966, 5735), + (5735, 1119, 1119, 1119, 1119, 8, 79, 12521, 8, 900, 14, 5734, 5736), + (5736, 1119, 1119, 1119, 1119, 9, 80, 12522, 8, 900, 14, 5735, 7479), + (5737, 723, 723, 723, 723, 7, 76, 12523, 6, 30, 14, 4963, 7482), + (5738, -1, -1, 729, 729, 7, 76, -1, 0, 0, 14, 4962, 5739), + (5739, -1, -1, 729, 729, 8, 77, -1, 0, 0, 14, 5738, 5740), + (5740, -1, -1, 729, 729, 9, 78, -1, 0, 0, 14, 5739, 7494), + (5741, 5015, 5015, 5015, 5015, 12, 80, 12524, 9, 900, 14, 5015, 7483), + (5742, 289, 289, 289, 289, 12, 80, 12525, 3, 300, 14, 1607, 7484), + (5743, 291, 291, 291, 291, 9, 78, 12526, 5, 900, 14, 4971, 5744), + (5744, 291, 291, 291, 291, 10, 79, 12527, 5, 900, 14, 5743, 5745), + (5745, 291, 291, 291, 291, 12, 80, 12528, 5, 900, 14, 5744, 7485), + (5759, 1425, 1425, 1425, 1425, 7, 78, 13565, 2, 2160, 14, 1429, 5760), + (5760, 1425, 1425, 1425, 1425, 8, 78, 13570, 2, 2160, 14, 5759, 5761), + (5761, 1425, 1425, 1425, 1425, 9, 79, 13575, 2, 2160, 14, 5760, 5762), + (5762, 1425, 1425, 1425, 1425, 10, 79, 13580, 2, 2160, 14, 5761, 5763), + (5763, 1425, 1425, 1425, 1425, 11, 80, 13585, 2, 2160, 14, 5762, -1), + (5764, 4854, 4854, 4854, 4854, 7, 76, 12534, 8, 600, 14, 4856, 5765), + (5765, 4854, 4854, 4854, 4854, 9, 78, 12535, 8, 600, 14, 5764, 5766), + (5766, 4854, 4854, 4854, 4854, 12, 80, 12536, 8, 600, 14, 5765, 7178), + (5767, 4857, 4857, 4857, 4857, 7, 76, 12537, 7, 600, 14, 4859, 5768), + (5768, 4857, 4857, 4857, 4857, 9, 78, 12538, 7, 600, 14, 5767, 5769), + (5769, 4857, 4857, 4857, 4857, 12, 80, 12539, 7, 600, 14, 5768, 17030), + (5770, 1348, 1348, 1348, 1348, 9, 78, 12540, 0, 3600, 14, 1350, 5771), + (5771, 1348, 1348, 1348, 1348, 10, 79, 12541, 0, 3600, 14, 5770, 5772), + (5772, 1348, 1348, 1348, 1348, 12, 80, 12542, 0, 3600, 14, 5771, 7184), + (5776, -1, -1, 5776, 5776, 7, 76, -1, 0, 0, 14, -1, 5777), + (5777, -1, -1, 5776, 5776, 9, 78, -1, 0, 0, 14, 5776, 5778), + (5778, -1, -1, 5776, 5776, 12, 80, -1, 0, 0, 14, 5777, 7196), + (5779, 1178, 1178, 1178, 1178, 7, 76, 12546, 4, 900, 14, 1180, 5780), + (5780, 1178, 1178, 1178, 1178, 8, 77, 12547, 4, 900, 14, 5779, 5781), + (5781, 1178, 1178, 1178, 1178, 9, 78, 12548, 4, 900, 14, 5780, 7187), + (5789, 1383, 1383, 1383, 1383, 12, 80, 12549, 6, 300, 14, 5084, 7299), + (5790, 1195, 1195, 1195, 1195, 9, 80, 12550, 13, 2160, 14, 5079, 7300), + (5791, 131, 131, 131, 131, 8, 77, 12551, 4, 900, 14, 5072, 5792), + (5792, 131, 131, 131, 131, 9, 78, 12552, 4, 900, 14, 5791, 5793), + (5793, 131, 131, 131, 131, 10, 79, 12553, 4, 900, 14, 5792, 7301), + (5794, 1192, 1192, 1192, 1192, 8, 77, 12554, 12, 1320, 14, 5078, 5795), + (5795, 1192, 1192, 1192, 1192, 9, 78, 12555, 12, 1320, 14, 5794, 5796), + (5796, 1192, 1192, 1192, 1192, 10, 79, 12556, 12, 1320, 14, 5795, 7304), + (5797, -1, -1, 5083, 5083, 7, 76, -1, 0, 0, 14, 5120, 5798), + (5798, -1, -1, 5083, 5083, 9, 78, -1, 0, 0, 14, 5797, 5799), + (5799, -1, -1, 5083, 5083, 12, 80, -1, 0, 0, 14, 5798, -1), + (5800, 746, 746, 746, 746, 9, 78, 12557, 10, 2160, 14, 1493, 5801), + (5801, 746, 746, 746, 746, 10, 79, 12558, 10, 2160, 14, 5800, 5802), + (5802, 746, 746, 746, 746, 12, 80, 12559, 10, 2160, 14, 5801, 7307), + (5803, 1459, 1459, 1459, 1459, 7, 76, 12560, 11, 1800, 14, 5082, 5804), + (5804, 1459, 1459, 1459, 1459, 9, 78, 12561, 11, 1800, 14, 5803, 5805), + (5805, 1459, 1459, 1459, 1459, 12, 80, 12562, 11, 1800, 14, 5804, 7310), + (5806, -1, -1, 255, 255, 7, 59, -1, 0, 0, 16, -1, 5807), + (5807, -1, -1, 255, 255, 9, 59, -1, 0, 0, 16, 5806, 5808), + (5808, -1, -1, 255, 255, 12, 59, -1, 0, 0, 16, 5807, 10623), + (5809, 5833, 5833, 5833, 5833, 9, 85, 20184, 72, 900, 16, -1, -1), + (5819, 1498, 1498, 1498, 1498, 7, 76, 12563, 12, 1320, 14, 5060, 5820), + (5820, 1498, 1498, 1498, 1498, 9, 78, 12564, 12, 1320, 14, 5819, 5821), + (5821, 1498, 1498, 1498, 1498, 12, 80, 12565, 12, 1320, 14, 5820, 7408), + (5822, 757, -1, 757, 757, 7, 76, 12566, 6, 1800, 14, 5053, 5823), + (5823, 757, -1, 757, 757, 9, 78, 12567, 6, 1800, 14, 5822, 5824), + (5824, 757, -1, 757, 757, 12, 80, 12568, 6, 1800, 14, 5823, 7411), + (5825, -1, -1, 567, 567, 7, 76, -1, 0, 0, 14, 5061, -1), + (5826, 1495, 1495, 1495, 1495, 7, 76, 12569, 30, 900, 14, 5313, 5827), + (5827, 1495, 1495, 1495, 1495, 9, 78, 12570, 30, 900, 14, 5826, 5828), + (5828, 1495, 1495, 1495, 1495, 12, 80, 12571, 30, 900, 14, 5827, 7414), + (5829, 548, 548, 548, 548, 8, 77, 12572, 5, 900, 14, 5056, 5830), + (5830, 548, 548, 548, 548, 9, 78, 12573, 5, 900, 14, 5829, 5831), + (5831, 548, 548, 548, 548, 10, 79, 12574, 5, 900, 14, 5830, 7417), + (5832, 5105, 5105, 5105, 5105, 12, 80, 12575, 11, 600, 14, 5105, 7420), + (5849, 54009, 54009, 54009, 54009, 7, 73, 12576, 22, 12, 14, -1, 12923), + (5850, -1, -1, 781, 781, 8, 77, -1, 0, 0, 14, 781, 7284), + (5854, 773, -1, 773, 773, 7, 76, 12580, 5, 1800, 14, 775, 5855), + (5855, 773, -1, 773, 773, 9, 78, 12581, 5, 1800, 14, 5854, 5856), + (5856, 773, -1, 773, 773, 12, 80, 12582, 5, 1800, 14, 5855, 7276), + (5857, 1242, 1242, 1242, 1242, 7, 76, 12577, 9, 1320, 14, 1244, 5858), + (5858, 1242, 1242, 1242, 1242, 9, 78, 12578, 9, 1320, 14, 5857, 5859), + (5859, 1242, 1242, 1242, 1242, 12, 80, 12579, 9, 1320, 14, 5858, 7285), + (5860, -1, -1, 649, 649, 7, 76, -1, 0, 0, 14, 651, 5861), + (5861, -1, -1, 649, 649, 9, 78, -1, 0, 0, 14, 5860, 5862), + (5862, -1, -1, 649, 649, 12, 80, -1, 0, 0, 14, 5861, -1), + (5868, 1239, 1239, 1239, 1239, 12, 80, 13224, 6, 600, 14, 1239, 7275), + (5869, 4890, -1, 4890, 4890, 9, 77, 12587, 3, 8640, 14, 4890, 5871), + (5870, 54010, 54010, 54010, 54010, 7, 73, 12828, 22, 6, 14, -1, -1), + (5871, 4890, -1, 4890, 4890, 9, 79, 16440, 3, 8640, 15, 5869, 5872), + (5872, 4890, -1, 4890, 4890, 9, 81, 21745, 3, 8640, 16, 5871, 14280), + (5879, 167, 167, 167, 167, 10, 79, 12588, 14, 900, 14, 167, 7249), + (5880, -1, -1, 1504, 1504, 5, 76, -1, 0, 0, 14, 1506, 5881), + (5881, -1, -1, 1504, 1504, 5, 78, -1, 0, 0, 14, 5880, 5882), + (5882, -1, -1, 1504, 1504, 5, 80, -1, 0, 0, 14, 5881, 7260), + (5883, 520, 520, 520, 520, 12, 76, 12589, 6, 540, 14, 1509, 5884), + (5884, 520, 520, 520, 520, 12, 78, 12590, 6, 540, 14, 5883, 5885), + (5885, 520, 520, 520, 520, 12, 80, 12591, 6, 540, 14, 5884, 7250), + (5886, -1, -1, 1577, 1577, 7, 76, -1, 0, 0, 14, 1579, 5887), + (5887, -1, -1, 1577, 1577, 9, 78, -1, 0, 0, 14, 5886, 5888), + (5888, -1, -1, 1577, 1577, 12, 80, -1, 0, 0, 14, 5887, 7263), + (5889, -1, -1, 795, 795, 7, 76, -1, 0, 0, 14, 4899, 5890), + (5890, -1, -1, 795, 795, 9, 78, -1, 0, 0, 14, 5889, 5891), + (5891, -1, -1, 795, 795, 12, 80, -1, 0, 0, 14, 5890, 7267), + (5892, 4903, 4903, 4903, 4903, 9, 76, 12592, 9, 1320, 14, 4903, 7253), + (5893, 4906, 4906, 4906, 4906, 9, 76, 12593, 9, 1320, 14, 4906, 7254), + (5894, 4909, 4909, 4909, 4909, 9, 76, 12594, 16, 1320, 14, 4909, 7255), + (5895, 4912, 4912, 4912, 4912, 9, 76, 12595, 16, 1320, 14, 4912, 7256), + (5909, -1, -1, 815, 815, 7, 76, -1, 0, 0, 14, 5145, 5910), + (5910, -1, -1, 815, 815, 8, 77, -1, 0, 0, 14, 5909, 5911), + (5911, -1, -1, 815, 815, 9, 78, -1, 0, 0, 14, 5910, 5912), + (5912, -1, -1, 815, 815, 10, 79, -1, 0, 0, 14, 5911, 5913), + (5913, -1, -1, 815, 815, 12, 80, -1, 0, 0, 14, 5912, 7634), + (5914, 1355, 1355, 1355, 1355, 6, 76, 12596, 3, 60, 14, 5242, 5915), + (5915, 1355, 1355, 1355, 1355, 6, 78, 12597, 3, 60, 14, 5914, 5916), + (5916, 1355, 1355, 1355, 1355, 6, 80, 12598, 3, 60, 14, 5915, 7172), + (5917, -1, -1, 820, 820, 5, 76, -1, 0, 0, 14, 4815, 5918), + (5918, -1, -1, 820, 820, 5, 78, -1, 0, 0, 14, 5917, 5919), + (5919, -1, -1, 820, 820, 5, 80, -1, 0, 0, 14, 5918, 7163), + (5922, -1, -1, 807, 807, 5, 76, -1, 0, 0, 14, 1270, 5923), + (5923, -1, -1, 807, 807, 5, 78, -1, 0, 0, 14, 5922, 5924), + (5924, -1, -1, 807, 807, 5, 80, -1, 0, 0, 14, 5923, 7628), + (5939, -1, -1, 5264, 5264, 7, 76, -1, 0, 0, 14, 5268, 5940), + (5940, -1, -1, 5264, 5264, 8, 77, -1, 0, 0, 14, 5939, 5941), + (5941, -1, -1, 5264, 5264, 9, 78, -1, 0, 0, 14, 5940, 5942), + (5942, -1, -1, 5264, 5264, 10, 79, -1, 0, 0, 14, 5941, 5943), + (5943, -1, -1, 5264, 5264, 12, 80, -1, 0, 0, 14, 5942, 7204), + (5944, -1, -1, 4924, 4924, 9, 78, -1, 0, 0, 14, 4926, 5945), + (5945, -1, -1, 4924, 4924, 10, 79, -1, 0, 0, 14, 5944, 5946), + (5946, -1, -1, 4924, 4924, 12, 80, -1, 0, 0, 14, 5945, -1), + (5947, 1274, 1274, 1274, 1274, 9, 78, 12599, 9, 540, 14, 4866, 5948), + (5948, 1274, 1274, 1274, 1274, 10, 79, 12600, 9, 540, 14, 5947, 5949), + (5949, 1274, 1274, 1274, 1274, 12, 80, 12601, 9, 540, 14, 5948, 7199), + (5950, -1, -1, 1511, 1511, 12, 80, -1, 0, 0, 14, 1513, 5951), + (5951, -1, -1, 1511, 1511, 12, 80, -1, 0, 0, 14, 5950, 5952), + (5952, -1, -1, 1511, 1511, 12, 80, -1, 0, 0, 14, 5951, -1), + (5953, 184, 184, 184, 184, 10, 79, 12602, 5, 4320, 14, 184, 7203), + (5954, -1, -1, 4861, 4861, 7, 76, -1, 0, 0, 14, 4863, 5955), + (5955, -1, -1, 4861, 4861, 9, 78, -1, 0, 0, 14, 5954, 5956), + (5956, -1, -1, 4861, 4861, 12, 80, -1, 0, 0, 14, 5955, 7215), + (5969, 534, 534, 534, 534, 7, 76, 12603, 4, 2160, 14, 5043, 5970), + (5970, 534, 534, 534, 534, 9, 78, 12604, 4, 2160, 14, 5969, 5971), + (5971, 534, 534, 534, 534, 12, 80, 12605, 4, 2160, 14, 5970, 7329), + (5972, -1, -1, 593, 593, 7, 76, -1, 0, 0, 14, 595, -1), + (5973, -1, -1, 596, 596, 7, 76, -1, 0, 0, 14, 598, -1), + (5975, 5095, 5095, 5095, 5095, 7, 76, 12606, 10, 900, 14, 5097, 5976), + (5976, 5095, 5095, 5095, 5095, 9, 78, 12607, 10, 900, 14, 5975, 5977), + (5977, 5095, 5095, 5095, 5095, 12, 80, 12608, 10, 900, 14, 5976, 7332), + (5984, 5984, 5984, 5984, 5984, 12, 80, 12609, 2, 30, 14, -1, 7335), + (5999, 645, -1, 645, 645, 10, 79, 12610, 4, 5, 14, 645, 10739), + (6000, 545, 545, 545, 545, 7, 76, 12611, 3, 900, 14, 4999, 6001), + (6001, 545, 545, 545, 545, 9, 78, 12612, 3, 900, 14, 6000, 6002), + (6002, 545, 545, 545, 545, 12, 80, 12613, 3, 900, 14, 6001, 7344), + (6003, -1, -1, 1616, 1616, 7, 76, -1, 0, 0, 14, 4996, 6004), + (6004, -1, -1, 1616, 1616, 8, 77, -1, 0, 0, 14, 6003, 6005), + (6005, -1, -1, 1616, 1616, 9, 78, -1, 0, 0, 14, 6004, 6006), + (6006, -1, -1, 1616, 1616, 10, 79, -1, 0, 0, 14, 6005, 6007), + (6007, -1, -1, 1616, 1616, 12, 80, -1, 0, 0, 14, 6006, 7637), + (6008, 1345, 1345, 1345, 1345, 8, 77, 12614, 6, 900, 14, 5005, 6009), + (6009, 1345, 1345, 1345, 1345, 9, 78, 12615, 6, 900, 14, 6008, 6010), + (6010, 1345, 1345, 1345, 1345, 10, 79, 12616, 6, 900, 14, 6009, 7347), + (6011, -1, -1, 864, 864, 12, 80, -1, 0, 0, 14, 4985, 6012), + (6012, -1, -1, 864, 864, 12, 80, -1, 0, 0, 14, 6011, 6013), + (6013, -1, -1, 864, 864, 12, 80, -1, 0, 0, 14, 6012, 7353), + (6014, -1, -1, 5248, 5248, 7, 76, -1, 0, 0, 14, 5250, 6015), + (6015, -1, -1, 5248, 5248, 9, 78, -1, 0, 0, 14, 6014, 6016), + (6016, -1, -1, 5248, 5248, 12, 80, -1, 0, 0, 14, 6015, 7356), + (6017, -1, -1, 644, 644, 7, 73, -1, 0, 0, 14, 4988, 6018), + (6018, -1, -1, 644, 644, 9, 75, -1, 0, 0, 14, 6017, 6019), + (6019, -1, -1, 644, 644, 12, 77, -1, 0, 0, 14, 6018, 7359), + (6020, -1, -1, 6020, 6020, 2, 65, -1, 0, 0, 14, -1, 6021), + (6021, -1, -1, 6020, 6020, 2, 65, -1, 0, 0, 14, 6020, 6022), + (6022, -1, -1, 6020, 6020, 2, 65, -1, 0, 0, 14, 6021, 6045), + (6023, -1, -1, 119, 119, 12, 85, -1, 0, 0, 16, 7567, 6024), + (6024, -1, -1, 119, 119, 12, 85, -1, 0, 0, 16, 6023, 6025), + (6025, -1, -1, 119, 119, 12, 85, -1, 0, 0, 16, 6024, 12548), + (6026, -1, -1, 1004, 1004, 7, 81, -1, 0, 0, 16, -1, 6027), + (6027, -1, -1, 1004, 1004, 9, 81, -1, 0, 0, 16, 6026, 6028), + (6028, -1, -1, 1004, 1004, 12, 81, -1, 0, 0, 16, 6027, -1), + (6029, -1, -1, 1304, 1304, 7, 76, -1, 0, 0, 14, 1306, 6030), + (6030, -1, -1, 1304, 1304, 9, 78, -1, 0, 0, 14, 6029, 6031), + (6031, -1, -1, 1304, 1304, 12, 80, -1, 0, 0, 14, 6030, 7148), + (6032, -1, -1, 1604, 1604, 7, 69, -1, 0, 0, 14, 5294, 6033), + (6033, -1, -1, 1604, 1604, 9, 71, -1, 0, 0, 14, 6032, 6034), + (6034, -1, -1, 1604, 1604, 12, 73, -1, 0, 0, 14, 6033, 7131), + (6035, -1, -1, 846, 846, 7, 76, -1, 0, 0, 14, 4950, 6036), + (6036, -1, -1, 846, 846, 9, 78, -1, 0, 0, 14, 6035, 6037), + (6037, -1, -1, 846, 846, 12, 80, -1, 0, 0, 14, 6036, 7151), + (6038, 5022, 5022, 5022, 5022, 7, 76, 23988, 5, 600, 14, 5024, 6039), + (6039, 5022, 5022, 5022, 5022, 9, 78, 23989, 5, 600, 14, 6038, 6040), + (6040, 5022, 5022, 5022, 5022, 12, 80, 23990, 5, 600, 14, 6039, 15628), + (6041, 5028, -1, 5028, 5028, 9, 78, 12621, 4, 900, 14, 5028, -1), + (6042, -1, -1, 1543, 1543, 7, 76, -1, 0, 0, 14, 4953, 6043), + (6043, -1, -1, 1543, 1543, 9, 78, -1, 0, 0, 14, 6042, 6044), + (6044, -1, -1, 1543, 1543, 12, 80, -1, 0, 0, 14, 6043, 7134), + (6045, -1, -1, 6020, 6020, 2, 66, -1, 0, 0, 14, 6022, 6046), + (6046, -1, -1, 6020, 6020, 2, 68, -1, 0, 0, 14, 6045, 6047), + (6047, -1, -1, 6020, 6020, 2, 70, -1, 0, 0, 14, 6046, 6048), + (6048, -1, -1, 6020, 6020, 2, 71, -1, 0, 0, 14, 6047, 6049), + (6049, -1, -1, 6020, 6020, 2, 73, -1, 0, 0, 14, 6048, 6050), + (6050, -1, -1, 6020, 6020, 2, 75, -1, 0, 0, 14, 6049, 6057), + (6051, -1, -1, 6051, 6051, 3, 76, -1, 0, 0, 14, -1, 6052), + (6052, -1, -1, 6051, 6051, 3, 78, -1, 0, 0, 14, 6051, 6053), + (6053, -1, -1, 6051, 6051, 3, 80, -1, 0, 0, 14, 6052, 7601), + (6054, 4931, 4931, 4931, 4931, 7, 76, 12756, 4, 600, 14, 4933, 6055), + (6055, 4931, 4931, 4931, 4931, 7, 78, 12757, 4, 600, 14, 6054, 6056), + (6056, 4931, 4931, 4931, 4931, 7, 80, 12758, 4, 600, 14, 6055, 7291), + (6057, -1, -1, 6020, 6020, 2, 76, -1, 0, 0, 14, 6050, 6058), + (6058, -1, -1, 6020, 6020, 2, 78, -1, 0, 0, 14, 6057, 6059), + (6059, -1, -1, 6020, 6020, 2, 80, -1, 0, 0, 14, 6058, 7169), + (6060, -1, -1, 6540, 6540, 8, 76, -1, 0, 0, 14, -1, 6061), + (6061, -1, -1, 6540, 6540, 8, 76, -1, 0, 0, 14, 6060, 6470), + (6063, -1, -1, 589, 589, 7, 76, -1, 0, 0, 14, 5272, 6064), + (6064, -1, -1, 589, 589, 9, 78, -1, 0, 0, 14, 6063, 6065), + (6065, -1, -1, 589, 589, 12, 80, -1, 0, 0, 14, 6064, 7390), + (6066, -1, -1, 1313, 1313, 7, 76, -1, 0, 0, 14, 5031, 6067), + (6067, -1, -1, 1313, 1313, 7, 76, -1, 0, 0, 14, 6066, 6068), + (6068, -1, -1, 1313, 1313, 8, 77, -1, 0, 0, 14, 6067, 6069), + (6069, -1, -1, 1313, 1313, 9, 78, -1, 0, 0, 14, 6068, 6070), + (6070, -1, -1, 1313, 1313, 10, 79, -1, 0, 0, 14, 6069, 6071), + (6071, -1, -1, 1313, 1313, 12, 80, -1, 0, 0, 14, 6070, 7393), + (6072, -1, -1, 210, 210, 8, 77, -1, 0, 0, 14, 1318, 6073), + (6073, -1, -1, 210, 210, 9, 78, -1, 0, 0, 14, 6072, 6074), + (6074, -1, -1, 210, 210, 10, 79, -1, 0, 0, 14, 6073, 7399), + (6075, -1, -1, 895, 895, 7, 76, -1, 0, 0, 14, 899, 6076), + (6076, -1, -1, 895, 895, 8, 77, -1, 0, 0, 14, 6075, 6077), + (6077, -1, -1, 895, 895, 9, 78, -1, 0, 0, 14, 6076, 6078), + (6078, -1, -1, 895, 895, 10, 79, -1, 0, 0, 14, 6077, 6079), + (6079, -1, -1, 895, 895, 12, 80, -1, 0, 0, 14, 6078, 7402), + (6080, -1, -1, 683, 683, 5, 75, -1, 0, 0, 14, 5305, 6081), + (6081, -1, -1, 683, 683, 5, 75, -1, 0, 0, 14, 6080, 7604), + (6082, -1, -1, 6084, 6084, 5, 85, 0, 0, 0, 17, -1, 6083), + (6083, -1, -1, 6084, 6084, 5, 87, 0, 0, 0, 17, 6082, 6084), + (6084, -1, -1, 6084, 6084, 5, 89, 0, 0, 0, 17, 6083, 13366), + (6085, -1, -1, 6761, 6761, 10, 81, -1, 0, 0, 16, 6763, 6086), + (6086, -1, -1, 6761, 6761, 11, 83, -1, 0, 0, 16, 6085, 6087), + (6087, -1, -1, 6761, 6761, 12, 85, -1, 0, 0, 16, 6086, 10763), + (6088, -1, -1, 6088, 6088, 9, 85, 0, 0, 0, 17, -1, 6089), + (6089, -1, -1, 6088, 6088, 12, 87, 0, 0, 0, 17, 6088, 6090), + (6090, -1, -1, 6088, 6088, 15, 89, 0, 0, 0, 17, 6089, -1), + (6092, 5251, 5251, 5251, 5251, 7, 76, 12635, 13, 900, 14, 5253, 6093), + (6093, 5251, 5251, 5251, 5251, 9, 78, 12636, 13, 900, 14, 6092, 6094), + (6094, 5251, 5251, 5251, 5251, 12, 80, 12637, 13, 900, 14, 6093, 7472), + (6095, 513, 513, 513, 513, 7, 76, 12638, 4, 120, 14, 515, 6096), + (6096, 513, 513, 513, 513, 9, 78, 12639, 4, 120, 14, 6095, 6097), + (6097, 513, 513, 513, 513, 12, 80, 12640, 4, 120, 14, 6096, 7475), + (6098, 1327, 1327, 1327, 1327, 7, 76, 12641, 10, 900, 14, 5316, 6099), + (6099, 1327, 1327, 1327, 1327, 9, 78, 12642, 10, 900, 14, 6098, 6100), + (6100, 1327, 1327, 1327, 1327, 12, 80, 12643, 10, 900, 14, 6099, 7460), + (6101, 153, 153, 153, 153, 12, 80, 12644, 3, 2160, 14, 5068, 7468), + (6102, 146, 146, 146, 146, 8, 77, 12645, 2, 180, 14, 5069, 7466), + (6103, 528, 528, 528, 528, 7, 76, 12646, 5, 720, 14, 901, 6104), + (6104, 528, 528, 528, 528, 9, 78, 12647, 5, 720, 14, 6103, 6105), + (6105, 528, 528, 528, 528, 12, 80, 12648, 5, 720, 14, 6104, 7469), + (6106, 6106, 6106, 6106, 6106, 4, 67, 21965, 13, 4320, 16, -1, 6107), + (6107, 6106, 6106, 6106, 6106, 5, 68, 21966, 13, 4320, 16, 6106, 6108), + (6108, 6106, 6106, 6106, 6106, 6, 69, 21967, 13, 4320, 16, 6107, 6109), + (6109, 6106, 6106, 6106, 6106, 7, 77, 21968, 13, 4320, 16, 6108, 6110), + (6110, 6106, 6106, 6106, 6106, 8, 78, 21969, 13, 4320, 16, 6109, 6111), + (6111, 6106, 6106, 6106, 6106, 9, 79, 21970, 13, 4320, 16, 6110, -1), + (6112, -1, -1, 6112, 6112, 5, 85, -1, 0, 0, 17, -1, 12966), + (6113, -1, -1, 6113, 6113, 9, 85, 0, 0, 0, 17, -1, 6114), + (6114, -1, -1, 6113, 6113, 12, 87, 0, 0, 0, 17, 6113, 6115), + (6115, -1, -1, 6113, 6113, 15, 89, 0, 0, 0, 17, 6114, -1), + (6119, -1, -1, 6119, 6119, 6, 76, -1, 0, 0, 14, -1, 6120), + (6120, -1, -1, 6119, 6119, 6, 77, -1, 0, 0, 14, 6119, 6121), + (6121, -1, -1, 6119, 6119, 6, 78, -1, 0, 0, 14, 6120, 6122), + (6122, -1, -1, 6119, 6119, 6, 79, -1, 0, 0, 14, 6121, 6123), + (6123, -1, -1, 6119, 6119, 6, 80, -1, 0, 0, 14, 6122, 7526), + (6124, -1, -1, 5263, 5263, 3, 71, -1, 0, 0, 12, -1, 6125), + (6125, -1, -1, 5263, 5263, 6, 73, -1, 0, 0, 12, 6124, 6126), + (6126, -1, -1, 5263, 5263, 9, 75, -1, 0, 0, 12, 6125, 6127), + (6127, -1, -1, 5263, 5263, 10, 76, -1, 0, 0, 14, 6126, 6128), + (6128, -1, -1, 5263, 5263, 11, 78, -1, 0, 0, 14, 6127, 6129), + (6129, -1, -1, 5263, 5263, 12, 80, -1, 0, 0, 14, 6128, 12463), + (6130, -1, -1, 586, 586, 7, 76, -1, 0, 0, 14, 588, 6131), + (6131, -1, -1, 586, 586, 7, 76, -1, 0, 0, 14, 6130, 6132), + (6132, -1, -1, 586, 586, 7, 76, -1, 0, 0, 14, 6131, -1), + (6133, 1351, 1351, 1351, 1351, 8, 77, 12649, 5, 30, 14, 1351, 7109), + (6134, 4849, 4849, 4849, 4849, 7, 76, 12650, 7, 1800, 14, 4849, 7110), + (6135, 54006, 54006, 54006, 54006, 7, 76, 12651, 18, 180, 14, -1, 7111), + (6136, -1, -1, 6136, 6136, 7, 76, -1, 0, 0, 10, -1, 6137), + (6149, 921, 921, 921, 921, 9, 79, 12652, 8, 60, 14, 5280, 7245), + (6150, 922, 922, 922, 922, 9, 78, 12653, 8, 60, 14, 5281, 7236), + (6151, 923, 923, 923, 923, 9, 77, 12654, 8, 60, 14, 5282, 7235), + (6152, 1334, 1334, 1334, 1334, 9, 78, 12655, 11, 4320, 14, 1336, 6153), + (6153, 1334, 1334, 1334, 1334, 10, 79, 12656, 11, 4320, 14, 6152, 6154), + (6154, 1334, 1334, 1334, 1334, 12, 80, 12657, 11, 4320, 14, 6153, 7239), + (6155, 4944, -1, 4944, 4944, 7, 76, 12658, 0, 1, 14, 4946, 6156), + (6156, 4944, -1, 4944, 4944, 9, 78, 12659, 0, 1, 14, 6155, 6157), + (6157, 4944, -1, 4944, 4944, 12, 80, 12660, 0, 1, 14, 6156, 7229), + (6158, 1337, 1337, 1337, 1337, 8, 77, 12661, 13, 4320, 14, 1339, 6159), + (6159, 1337, 1337, 1337, 1337, 9, 78, 12662, 13, 4320, 14, 6158, 6160), + (6160, 1337, 1337, 1337, 1337, 10, 79, 12663, 13, 4320, 14, 6159, 14338), + (6161, 1478, -1, 1478, 1478, 9, 78, 12664, 0, 1, 14, 1480, 6162), + (6162, 1478, -1, 1478, 1478, 10, 79, 12665, 0, 1, 14, 6161, 6163), + (6163, 1478, -1, 1478, 1478, 12, 80, 12666, 0, 1, 14, 6162, 7242), + (6200, 6533, 6533, 6533, 6533, 10, 79, 12768, 15, 600, 14, -1, 7428), + (6201, 6534, 6534, 6534, 6534, 9, 78, 12769, 16, 900, 14, -1, 7429), + (6202, -1, -1, 6535, 6535, 5, 70, -1, 0, 0, 14, -1, 6203), + (6203, -1, -1, 6535, 6535, 5, 70, -1, 0, 0, 14, 6202, 6204), + (6204, -1, -1, 6535, 6535, 5, 70, -1, 0, 0, 14, 6203, -1), + (6205, 6536, 6536, 6536, 6536, 7, 76, 12712, 39, 5, 14, -1, -1), + (6206, 6537, 6537, 6537, 6537, 7, 76, 12770, 30, 900, 14, -1, 6207), + (6207, 6537, 6537, 6537, 6537, 8, 77, 12771, 30, 900, 14, 6206, 6208), + (6208, 6537, 6537, 6537, 6537, 9, 78, 12772, 30, 900, 14, 6207, 7606), + (6209, -1, -1, 6538, 6538, 7, 76, -1, 0, 0, 14, -1, 6210), + (6210, -1, -1, 6538, 6538, 9, 78, -1, 0, 0, 14, 6209, 6211), + (6211, -1, -1, 6538, 6538, 12, 80, -1, 0, 0, 14, 6210, 7478), + (6212, 6539, 6539, 6539, 6539, 6, 71, 12776, 18, 1800, 14, -1, 6213), + (6213, 6539, 6539, 6539, 6539, 6, 74, 12777, 18, 1800, 14, 6212, 6214), + (6214, 6539, 6539, 6539, 6539, 6, 77, 12778, 18, 1800, 14, 6213, 7609), + (6215, -1, -1, 6540, 6540, 8, 71, -1, 0, 0, 14, -1, 6216), + (6216, -1, -1, 6540, 6540, 8, 72, -1, 0, 0, 14, 6215, 6217), + (6217, -1, -1, 6540, 6540, 8, 73, -1, 0, 0, 14, 6216, 6300), + (6218, 6218, 6218, 6218, 6218, 7, 76, 12782, 0, 1, 14, -1, 7488), + (6219, 6542, 6542, 6542, 6542, 7, 76, 12783, 18, 1800, 14, -1, 6220), + (6220, 6542, 6542, 6542, 6542, 9, 78, 12784, 18, 1800, 14, 6219, 6221), + (6221, 6542, 6542, 6542, 6542, 12, 80, 12785, 18, 1800, 14, 6220, -1), + (6222, 6543, 6543, 6543, 6543, 9, 72, 13143, 18, 25, 14, -1, -1), + (6223, -1, -1, 962, 962, 5, 76, -1, 0, 0, 14, 966, 6224), + (6224, -1, -1, 962, 962, 5, 77, -1, 0, 0, 14, 6223, 6225), + (6225, -1, -1, 962, 962, 5, 78, -1, 0, 0, 14, 6224, 6226), + (6226, -1, -1, 962, 962, 5, 79, -1, 0, 0, 14, 6225, 6227), + (6227, -1, -1, 962, 962, 5, 80, -1, 0, 0, 14, 6226, 10361), + (6228, -1, -1, 6545, 6545, 2, 70, -1, 0, 0, 14, -1, 6229), + (6229, -1, -1, 6545, 6545, 2, 70, -1, 0, 0, 14, 6228, 6230), + (6230, -1, -1, 6545, 6545, 2, 70, -1, 0, 0, 14, 6229, 6231), + (6231, -1, -1, 6545, 6545, 2, 70, -1, 0, 0, 14, 6230, -1), + (6232, 6232, 6232, 6232, 6232, 12, 80, 14413, 18, 900, 14, -1, 7421), + (6233, -1, -1, 477, 477, 2, 70, -1, 0, 0, 14, 479, 6234), + (6234, -1, -1, 477, 477, 2, 71, -1, 0, 0, 14, 6233, 6235), + (6235, -1, -1, 477, 477, 2, 72, -1, 0, 0, 14, 6234, 16094), + (6236, -1, -1, 6548, 6548, 6, 73, -1, 0, 0, 14, -1, 6237), + (6237, -1, -1, 6548, 6548, 6, 75, -1, 0, 0, 14, 6236, 6238), + (6238, -1, -1, 6548, 6548, 8, 77, -1, 0, 0, 14, 6237, 12929), + (6240, -1, -1, 767, 767, 3, 65, -1, 0, 0, 14, -1, 6241), + (6241, -1, -1, 767, 767, 6, 65, -1, 0, 0, 14, 6240, 6242), + (6242, -1, -1, 767, 767, 9, 65, -1, 0, 0, 14, 6241, 6243), + (6243, -1, -1, 767, 767, 3, 67, -1, 0, 0, 14, 6242, 6244), + (6244, -1, -1, 767, 767, 6, 68, -1, 0, 0, 14, 6243, 6245), + (6245, -1, -1, 767, 767, 9, 69, -1, 0, 0, 14, 6244, 12426), + (6249, 6552, 6552, 6552, 6552, 5, 70, -1, 0, 0, 14, -1, 6250), + (6250, 6552, 6552, 6552, 6552, 6, 72, -1, 0, 0, 14, 6249, 6251), + (6251, 6552, 6552, 6552, 6552, 6, 74, -1, 0, 0, 14, 6250, 6252), + (6252, 6552, 6552, 6552, 6552, 7, 76, -1, 0, 0, 14, 6251, 6253), + (6253, 6552, 6552, 6552, 6552, 9, 78, -1, 0, 0, 14, 6252, 7279), + (6254, 616, 616, 616, 616, 6, 73, 12765, 7, 900, 14, 1250, 6255), + (6255, 616, 616, 616, 616, 7, 76, 12766, 7, 900, 14, 6254, 6256), + (6256, 616, 616, 616, 616, 10, 79, 12767, 7, 900, 14, 6255, 7257), + (6257, -1, -1, 86, 86, 2, 55, -1, 0, 0, 14, -1, 6258), + (6258, -1, -1, 86, 86, 4, 55, -1, 0, 0, 14, 6257, 6259), + (6259, -1, -1, 86, 86, 6, 55, -1, 0, 0, 14, 6258, 8223), + (6260, -1, -1, 495, 495, 6, 73, -1, 0, 0, 14, 497, 6261), + (6261, -1, -1, 495, 495, 7, 76, -1, 0, 0, 14, 6260, 6262), + (6262, -1, -1, 495, 495, 10, 79, -1, 0, 0, 14, 6261, 10666), + (6266, -1, -1, 6557, 6557, 6, 73, -1, 0, 0, 14, -1, 6267), + (6267, -1, -1, 6557, 6557, 7, 76, -1, 0, 0, 14, 6266, 6268), + (6268, -1, -1, 6557, 6557, 10, 79, -1, 0, 0, 14, 6267, -1), + (6269, -1, -1, 6558, 6558, 6, 73, -1, 0, 0, 14, -1, 6270), + (6270, -1, -1, 6558, 6558, 7, 76, -1, 0, 0, 14, 6269, 6271), + (6271, -1, -1, 6558, 6558, 10, 79, -1, 0, 0, 14, 6270, -1), + (6272, -1, -1, 6559, 6559, 6, 73, -1, 0, 0, 14, -1, 6273), + (6273, -1, -1, 6559, 6559, 7, 75, -1, 0, 0, 14, 6272, 6274), + (6274, -1, -1, 6559, 6559, 10, 77, -1, 0, 0, 14, 6273, 7137), + (6275, -1, -1, 6560, 6560, 6, 73, -1, 0, 0, 14, -1, 6276), + (6276, -1, -1, 6560, 6560, 7, 76, -1, 0, 0, 14, 6275, 6277), + (6277, -1, -1, 6560, 6560, 10, 79, -1, 0, 0, 14, 6276, 16266), + (6278, 6561, 6561, 6561, 6561, 7, 76, 12795, 32, 30, 14, -1, 6279), + (6279, 6561, 6561, 6561, 6561, 7, 76, 12796, 32, 30, 14, 6278, 6280), + (6280, 6561, 6561, 6561, 6561, 7, 76, 12797, 32, 30, 14, 6279, 7422), + (6281, 6563, 6563, 6563, 6563, 9, 78, 13144, 36, 8, 14, -1, 12995), + (6282, 6562, 6562, 6562, 6562, 6, 72, 12798, 39, 1, 14, -1, -1), + (6283, -1, -1, 6564, 6564, 6, 73, -1, 0, 0, 14, -1, 6284), + (6284, -1, -1, 6564, 6564, 7, 76, -1, 0, 0, 14, 6283, 6285), + (6285, -1, -1, 6564, 6564, 10, 79, -1, 0, 0, 14, 6284, 7112), + (6286, 6565, 6565, 6565, 6565, 7, 76, 12802, 17, 45, 14, -1, 7115), + (6287, -1, -1, 6566, 6566, 6, 73, -1, 0, 0, 14, -1, 6288), + (6288, -1, -1, 6566, 6566, 7, 76, -1, 0, 0, 14, 6287, 6289), + (6289, -1, -1, 6566, 6566, 10, 79, -1, 0, 0, 14, 6288, -1), + (6290, 6290, 6290, 6290, 6290, 6, 71, 12803, 0, 1, 14, -1, 6291), + (6291, 6290, 6290, 6290, 6290, 6, 73, 12804, 0, 1, 14, 6290, 6292), + (6292, 6290, 6290, 6290, 6290, 6, 75, 12805, 0, 1, 14, 6291, 6293), + (6293, 6290, 6290, 6290, 6290, 7, 76, 12806, 0, 1, 14, 6292, 6294), + (6294, 6290, 6290, 6290, 6290, 9, 78, 12807, 0, 1, 14, 6293, 6295), + (6295, 6290, 6290, 6290, 6290, 12, 80, 12808, 0, 1, 14, 6294, 7223), + (6296, 619, 619, 619, 619, 6, 73, 12759, 6, 900, 14, 722, 6297), + (6297, 619, 619, 619, 619, 6, 73, 12760, 6, 900, 14, 6296, 6298), + (6298, 619, 619, 619, 619, 6, 73, 12761, 6, 900, 14, 6297, 7226), + (6299, 6299, 6299, 6299, 6299, 9, 65, 12786, 18, 12, 14, -1, -1), + (6300, -1, -1, 6540, 6540, 8, 74, -1, 0, 0, 14, 6217, 6301), + (6301, -1, -1, 6540, 6540, 8, 75, -1, 0, 0, 14, 6300, 6472), + (6302, -1, -1, 6302, 6302, 5, 81, 0, 0, 0, 16, -1, 6303), + (6303, -1, -1, 6302, 6302, 5, 83, 0, 0, 0, 16, 6302, 6304), + (6304, -1, -1, 6302, 6302, 5, 85, 0, 0, 0, 16, 6303, 11011), + (6307, 1358, 1358, 1358, 1358, 6, 71, 13168, 3, 60, 14, 1360, 6308), + (6308, 1358, 1358, 1358, 1358, 6, 73, 13169, 3, 60, 14, 6307, 6309), + (6309, 1358, 1358, 1358, 1358, 6, 75, 13170, 3, 60, 14, 6308, 6310), + (6310, 1358, 1358, 1358, 1358, 6, 76, 13171, 3, 60, 14, 6309, 6311), + (6311, 1358, 1358, 1358, 1358, 6, 78, 13172, 3, 60, 14, 6310, 6312), + (6312, 1358, 1358, 1358, 1358, 6, 80, 13173, 3, 60, 14, 6311, 7157), + (6313, 1352, 1352, 1352, 1352, 6, 71, 13174, 3, 60, 14, 1354, 6314), + (6314, 1352, 1352, 1352, 1352, 6, 73, 13175, 3, 60, 14, 6313, 6315), + (6315, 1352, 1352, 1352, 1352, 6, 75, 13177, 3, 60, 14, 6314, 6316), + (6316, 1352, 1352, 1352, 1352, 6, 76, 13178, 3, 60, 14, 6315, 6317), + (6317, 1352, 1352, 1352, 1352, 6, 78, 13179, 3, 60, 14, 6316, 6318), + (6318, 1352, 1352, 1352, 1352, 6, 80, 13180, 3, 60, 14, 6317, 7154), + (6319, -1, -1, 501, 501, 6, 73, -1, 0, 0, 14, 503, 6320), + (6320, -1, -1, 501, 501, 6, 75, -1, 0, 0, 14, 6319, 6321), + (6321, -1, -1, 501, 501, 6, 77, -1, 0, 0, 14, 6320, 6528), + (6322, -1, -1, 6322, 6322, 6, 73, -1, 0, 0, 14, -1, 6323), + (6323, -1, -1, 6322, 6322, 6, 75, -1, 0, 0, 14, 6322, 6324), + (6324, -1, -1, 6322, 6322, 6, 77, -1, 0, 0, 14, 6323, -1), + (6325, 6325, 6325, 6325, 6325, 7, 73, 13213, 18, 600, 14, -1, 6326), + (6326, 6325, 6325, 6325, 6325, 7, 75, 13214, 18, 600, 14, 6325, 6327), + (6327, 6325, 6325, 6325, 6325, 7, 77, 13215, 18, 600, 14, 6326, 6361), + (6328, 6328, 6328, 6328, 6328, 7, 74, 13204, 10, 600, 14, -1, 6329), + (6329, 6328, 6328, 6328, 6328, 7, 76, 13205, 10, 600, 14, 6328, 6330), + (6330, 6328, 6328, 6328, 6328, 7, 78, 13212, 10, 600, 14, 6329, 7143), + (6331, -1, -1, 878, 878, 7, 76, -1, 0, 0, 14, 4959, 6332), + (6332, -1, -1, 878, 878, 7, 78, -1, 0, 0, 14, 6331, 7146), + (6333, 6333, 6333, 6333, 6333, 9, 59, 13167, 3, 600, 14, -1, 7266), + (6334, -1, -1, 6334, 6334, 6, 73, -1, 0, 0, 14, -1, 6335), + (6335, -1, -1, 6334, 6334, 6, 75, -1, 0, 0, 14, 6334, 6336), + (6336, -1, -1, 6334, 6334, 6, 77, -1, 0, 0, 14, 6335, -1), + (6337, -1, -1, 6337, 6337, 6, 74, -1, 0, 0, 14, -1, 6338), + (6338, -1, -1, 6337, 6337, 6, 76, -1, 0, 0, 14, 6337, 6339), + (6339, -1, -1, 6337, 6337, 6, 78, -1, 0, 0, 14, 6338, 7448), + (6340, -1, -1, 6340, 6340, 6, 74, -1, 0, 0, 14, -1, 6341), + (6341, -1, -1, 6340, 6340, 6, 76, -1, 0, 0, 14, 6340, 6342), + (6342, -1, -1, 6340, 6340, 6, 78, -1, 0, 0, 14, 6341, 7451), + (6343, -1, -1, 6343, 6343, 6, 74, -1, 0, 0, 14, -1, 6344), + (6344, -1, -1, 6343, 6343, 6, 76, -1, 0, 0, 14, 6343, 6345), + (6345, -1, -1, 6343, 6343, 6, 78, -1, 0, 0, 14, 6344, 7166), + (6346, -1, -1, 6346, 6346, 6, 74, -1, 0, 0, 14, -1, 6347), + (6347, -1, -1, 6346, 6346, 6, 76, -1, 0, 0, 14, 6346, 6348), + (6348, -1, -1, 6346, 6346, 6, 78, -1, 0, 0, 14, 6347, 7615), + (6349, -1, -1, 6349, 6349, 6, 74, -1, 0, 0, 14, -1, 6350), + (6350, -1, -1, 6349, 6349, 6, 76, -1, 0, 0, 14, 6349, 6351), + (6351, -1, -1, 6349, 6349, 6, 78, -1, 0, 0, 14, 6350, 7618), + (6352, 4894, 4894, 4894, 4894, 6, 76, 13181, 7, 2160, 14, 4896, 6353), + (6353, 4894, 4894, 4894, 4894, 6, 77, 13182, 7, 2160, 14, 6352, 6354), + (6354, 4894, 4894, 4894, 4894, 6, 78, 13183, 7, 2160, 14, 6353, 7288), + (6355, -1, -1, 6355, 6355, 6, 73, -1, 0, 0, 14, -1, 6356), + (6356, -1, -1, 6355, 6355, 6, 74, -1, 0, 0, 14, 6355, 6357), + (6357, -1, -1, 6355, 6355, 6, 75, -1, 0, 0, 14, 6356, 6358), + (6358, -1, -1, 6355, 6355, 6, 76, -1, 0, 0, 14, 6357, 6359), + (6359, -1, -1, 6355, 6355, 6, 77, -1, 0, 0, 14, 6358, 6360), + (6360, -1, -1, 6355, 6355, 6, 80, -1, 0, 0, 16, 6359, 14101), + (6361, 6325, 6325, 6325, 6325, 7, 81, 16861, 18, 600, 16, 6327, 12633), + (6362, -1, -1, 6362, 6362, 5, 77, 0, 0, 0, 16, -1, 6363), + (6363, -1, -1, 6362, 6362, 5, 79, 0, 0, 0, 16, 6362, 6364), + (6364, -1, -1, 6362, 6362, 5, 81, 0, 0, 0, 16, 6363, 6365), + (6365, -1, -1, 6362, 6362, 5, 83, 0, 0, 0, 16, 6364, 6366), + (6366, -1, -1, 6362, 6362, 5, 85, 0, 0, 0, 16, 6365, 16327), + (6370, 6370, 6370, 6370, 6370, 6, 76, 13188, 7, 600, 14, -1, 6371), + (6371, 6370, 6370, 6370, 6370, 6, 77, 13189, 7, 600, 14, 6370, 6372), + (6372, 6370, 6370, 6370, 6370, 6, 78, 13190, 7, 600, 14, 6371, 7350), + (6375, -1, -1, 6375, 6375, 6, 76, -1, 0, 0, 14, -1, 6376), + (6376, -1, -1, 6375, 6375, 6, 77, -1, 0, 0, 14, 6375, 6377), + (6377, -1, -1, 6375, 6375, 6, 78, -1, 0, 0, 14, 6376, 7644), + (6378, 209, 209, 209, 1272, 6, 76, 13501, 12, 5, 14, 1272, -1), + (6379, 6379, 6379, 6379, 6379, 6, 60, 13500, 37, 5, 14, -1, -1), + (6380, 6380, 6380, 6380, 6380, 6, 78, 13209, 39, 120, 14, -1, 6381), + (6381, 6380, 6380, 6380, 6380, 6, 79, 13210, 39, 120, 14, 6380, 6382), + (6382, 6380, 6380, 6380, 6380, 6, 80, 13211, 39, 120, 14, 6381, 7497), + (6383, -1, -1, 6383, 6383, 3, 70, -1, 0, 0, 14, -1, 6384), + (6384, -1, -1, 6383, 6383, 6, 70, -1, 0, 0, 14, 6383, 6385), + (6385, -1, -1, 6383, 6383, 9, 70, -1, 0, 0, 14, 6384, 10607), + (6386, -1, -1, 6386, 6386, 7, 72, -1, 0, 0, 14, -1, 6387), + (6387, -1, -1, 6386, 6386, 7, 74, -1, 0, 0, 14, 6386, 6388), + (6388, -1, -1, 6386, 6386, 7, 76, -1, 0, 0, 14, 6387, 6389), + (6389, -1, -1, 6386, 6386, 7, 78, -1, 0, 0, 14, 6388, 13521), + (6390, -1, -1, 65, 661, 3, 76, -1, 0, 0, 14, 4697, 6391), + (6391, -1, -1, 65, 661, 3, 77, -1, 0, 0, 14, 6390, 6392), + (6392, -1, -1, 65, 661, 3, 78, -1, 0, 0, 14, 6391, 6393), + (6393, -1, -1, 65, 661, 3, 79, -1, 0, 0, 14, 6392, 6394), + (6394, -1, -1, 65, 661, 3, 80, -1, 0, 0, 14, 6393, 7534), + (6395, -1, -1, 6395, 6395, 7, 76, -1, 0, 0, 14, -1, 6396), + (6396, -1, -1, 6395, 6395, 7, 77, -1, 0, 0, 14, 6395, 6397), + (6397, -1, -1, 6395, 6395, 7, 78, -1, 0, 0, 14, 6396, 7336), + (6398, 516, 516, 516, 516, 6, 72, 13198, 5, 480, 14, 516, 7237), + (6400, 1110, 1110, 1110, 1110, 6, 73, 13192, 3, 2160, 14, 1112, 6401), + (6401, 1110, 1110, 1110, 1110, 6, 75, 13193, 3, 2160, 14, 6400, 6402), + (6402, 1110, 1110, 1110, 1110, 6, 76, 13194, 3, 2160, 14, 6401, 7445), + (6403, -1, -1, 1107, 1107, 7, 76, -1, 0, 0, 14, 5288, 6404), + (6404, -1, -1, 1107, 1107, 9, 78, -1, 0, 0, 14, 6403, 6405), + (6405, -1, -1, 1107, 1107, 12, 80, -1, 0, 0, 14, 6404, 12432), + (6406, -1, -1, 5085, 5085, 6, 76, -1, 0, 0, 14, 5087, 6407), + (6407, -1, -1, 5085, 5085, 6, 78, -1, 0, 0, 14, 6406, 6408), + (6408, -1, -1, 5085, 5085, 6, 80, -1, 0, 0, 14, 6407, 7384), + (6409, -1, -1, 6540, 6540, 8, 71, -1, 0, 0, 14, -1, 6410), + (6410, -1, -1, 6540, 6540, 8, 72, -1, 0, 0, 14, 6409, 6411), + (6411, -1, -1, 6540, 6540, 8, 73, -1, 0, 0, 14, 6410, 6412), + (6412, -1, -1, 6540, 6540, 8, 74, -1, 0, 0, 14, 6411, 6413), + (6413, -1, -1, 6540, 6540, 8, 75, -1, 0, 0, 14, 6412, 6414), + (6414, -1, -1, 6540, 6540, 8, 76, -1, 0, 0, 14, 6413, 6415), + (6415, -1, -1, 6540, 6540, 8, 77, -1, 0, 0, 14, 6414, 6416), + (6416, -1, -1, 6540, 6540, 8, 78, -1, 0, 0, 14, 6415, 6417), + (6417, -1, -1, 6540, 6540, 8, 79, -1, 0, 0, 14, 6416, 6418), + (6418, -1, -1, 6540, 6540, 8, 80, -1, 0, 0, 14, 6417, 6474), + (6419, -1, -1, 6540, 6540, 8, 71, -1, 0, 0, 14, -1, 6420), + (6420, -1, -1, 6540, 6540, 8, 72, -1, 0, 0, 14, 6419, 6421), + (6421, -1, -1, 6540, 6540, 8, 73, -1, 0, 0, 14, 6420, 6476), + (6422, -1, -1, 6422, 6422, 3, 61, -1, 0, 0, 14, -1, 6423), + (6423, -1, -1, 6422, 6422, 3, 63, -1, 0, 0, 14, 6422, 6424), + (6424, -1, -1, 6422, 6422, 3, 65, -1, 0, 0, 14, 6423, -1), + (6425, 5007, 5007, 5007, 5007, 9, 76, 13509, 8, 2160, 14, 5009, 6426), + (6426, 5007, 5007, 5007, 5007, 9, 78, 13510, 8, 2160, 14, 6425, 6427), + (6427, 5007, 5007, 5007, 5007, 9, 80, 13511, 8, 2160, 14, 6426, 7341), + (6428, -1, -1, 1287, 1287, 3, 67, -1, 0, 0, 14, -1, 6429), + (6429, -1, -1, 1287, 1287, 6, 68, -1, 0, 0, 14, 6428, 6430), + (6430, -1, -1, 1287, 1287, 9, 69, -1, 0, 0, 14, 6429, 12472), + (6431, -1, -1, 1056, 1056, 5, 76, -1, 0, 0, 14, 1060, 6432), + (6432, -1, -1, 1056, 1056, 5, 77, -1, 0, 0, 14, 6431, 6433), + (6433, -1, -1, 1056, 1056, 5, 78, -1, 0, 0, 14, 6432, 6434), + (6434, -1, -1, 1056, 1056, 5, 79, -1, 0, 0, 14, 6433, 6435), + (6435, -1, -1, 1056, 1056, 5, 80, -1, 0, 0, 14, 6434, 7521), + (6436, -1, -1, 6436, 6436, 6, 73, -1, 0, 0, 14, -1, 6437), + (6437, -1, -1, 6436, 6436, 6, 75, -1, 0, 0, 14, 6436, 6438), + (6438, -1, -1, 6436, 6436, 8, 77, -1, 0, 0, 14, 6437, 7313), + (6439, -1, -1, 468, 468, 2, 67, -1, 0, 0, 14, 470, 6440), + (6440, -1, -1, 468, 468, 2, 69, -1, 0, 0, 14, 6439, 7316), + (6441, -1, -1, 1546, 1546, 5, 76, -1, 0, 0, 14, 4831, 12673), + (6442, -1, -1, 1471, 1471, 6, 76, -1, 0, 0, 14, 1475, 6443), + (6443, -1, -1, 1471, 1471, 6, 77, -1, 0, 0, 14, 6442, -1), + (6445, -1, -1, 6445, 6445, 2, 62, -1, 0, 0, 14, -1, 6446), + (6446, -1, -1, 6445, 6445, 2, 64, -1, 0, 0, 14, 6445, 6447), + (6447, -1, -1, 6445, 6445, 2, 66, -1, 0, 0, 14, 6446, -1), + (6448, 5109, 5109, 5109, 5109, 9, 77, 13515, 0, 1, 14, 5109, 7467), + (6449, 1520, 1520, 1520, 1520, 9, 70, 13516, 11, 900, 14, 1522, 6450), + (6450, 1520, 1520, 1520, 1520, 9, 70, 13517, 11, 900, 14, 6449, 6451), + (6451, 1520, 1520, 1520, 1520, 9, 70, 13518, 11, 900, 14, 6450, 7463), + (6452, -1, -1, 6452, 6452, 2, 71, -1, 0, 0, 14, -1, 6453), + (6453, -1, -1, 6452, 6452, 2, 72, -1, 0, 0, 14, 6452, 6454), + (6454, -1, -1, 6452, 6452, 2, 73, -1, 0, 0, 14, 6453, -1), + (6455, 6455, 6455, 6455, 6455, 2, 72, 14750, 36, 30, 14, -1, 6456), + (6456, 6455, 6455, 6455, 6455, 2, 74, 14751, 36, 30, 14, 6455, 6457), + (6457, 6455, 6455, 6455, 6455, 2, 76, 14752, 36, 30, 14, 6456, -1), + (6458, -1, -1, 6458, 6458, 3, 78, -1, 0, 0, 14, -1, 6459), + (6459, -1, -1, 6458, 6458, 3, 78, -1, 0, 0, 14, 6458, 6460), + (6460, -1, -1, 6458, 6458, 3, 78, -1, 0, 0, 14, 6459, -1), + (6461, -1, -1, 6461, 6461, 3, 78, -1, 0, 0, 14, -1, 6462), + (6462, -1, -1, 6461, 6461, 3, 78, -1, 0, 0, 14, 6461, 6463), + (6463, -1, -1, 6461, 6461, 3, 78, -1, 0, 0, 14, 6462, -1), + (6464, 967, 967, 967, 967, 6, 76, 13897, 10, 1800, 14, 969, 6465), + (6465, 967, 967, 967, 967, 6, 77, 13898, 10, 1800, 14, 6464, 6466), + (6466, 967, 967, 967, 967, 6, 78, 13899, 10, 1800, 14, 6465, 7217), + (6467, -1, -1, 6467, 6467, 3, 61, -1, 0, 0, 15, -1, 6468), + (6468, -1, -1, 6467, 6467, 3, 63, -1, 0, 0, 15, 6467, 6469), + (6469, -1, -1, 6467, 6467, 3, 65, -1, 0, 0, 15, 6468, -1), + (6470, -1, -1, 6540, 6540, 8, 76, -1, 0, 0, 15, 6061, 6471), + (6471, -1, -1, 6540, 6540, 8, 81, -1, 0, 0, 15, 6470, 12487), + (6472, -1, -1, 6540, 6540, 8, 81, -1, 0, 0, 15, 6301, 6473), + (6473, -1, -1, 6540, 6540, 8, 83, -1, 0, 0, 15, 6472, 12481), + (6474, -1, -1, 6540, 6540, 8, 81, -1, 0, 0, 15, 6418, 6475), + (6475, -1, -1, 6540, 6540, 8, 83, -1, 0, 0, 15, 6474, 12483), + (6476, -1, -1, 6540, 6540, 8, 81, -1, 0, 0, 15, 6421, 6477), + (6477, -1, -1, 6540, 6540, 8, 83, -1, 0, 0, 15, 6476, 12485), + (6478, 0, 0, 6478, 6478, 3, 81, -1, 0, 0, 16, -1, 6479), + (6479, 0, 0, 6478, 6478, 5, 83, -1, 0, 0, 16, 6478, 6480), + (6480, 0, 0, 6478, 6478, 7, 85, -1, 0, 0, 16, 6479, -1), + (6481, 0, 0, 6481, 6481, 5, 85, -1, 0, 0, 16, -1, 6482), + (6482, 0, 0, 6481, 6481, 7, 85, -1, 0, 0, 16, 6481, 6483), + (6483, 0, 0, 6481, 6481, 9, 85, -1, 0, 0, 16, 6482, 15314), + (6484, -1, -1, 7940, 7940, 5, 85, -1, 0, 0, 16, 10032, 6485), + (6485, -1, -1, 7940, 7940, 7, 85, -1, 0, 0, 16, 6484, 6486), + (6486, -1, -1, 7940, 7940, 9, 85, -1, 0, 0, 16, 6485, 15320), + (6487, 1383, 1383, 1383, 1383, 12, 85, 21812, 6, 300, 16, 10014, 14221), + (6488, 6488, 6488, 6488, 6488, 12, 85, 21806, 32, 900, 16, -1, 13383), + (6489, -1, -1, 6489, 6489, 5, 81, -1, 0, 0, 16, -1, 6490), + (6490, -1, -1, 6489, 6489, 7, 83, -1, 0, 0, 16, 6489, 6491), + (6491, -1, -1, 6489, 6489, 9, 85, -1, 0, 0, 16, 6490, 17239), + (6492, 6492, 6492, 6492, 6492, 7, 75, 21692, 52, 720, 16, -1, 6493), + (6493, 6492, 6492, 6492, 6492, 7, 77, 21693, 52, 720, 16, 6492, 6494), + (6494, 6492, 6492, 6492, 6492, 7, 79, 21694, 52, 720, 16, 6493, 6495), + (6495, 6492, 6492, 6492, 6492, 7, 81, 21695, 52, 720, 16, 6494, 6496), + (6496, 6492, 6492, 6492, 6492, 7, 83, 21696, 52, 720, 16, 6495, 6497), + (6497, 6492, 6492, 6492, 6492, 7, 85, 21697, 52, 720, 16, 6496, 10679), + (6499, 6499, 6499, 6499, 6499, 3, 75, 13512, 13, 60, 14, -1, -1), + (6500, -1, -1, 4761, 4761, 7, 76, -1, 0, 0, 14, 4763, 6501), + (6501, -1, -1, 4761, 4761, 7, 78, -1, 0, 0, 14, 6500, 6502), + (6502, -1, -1, 4761, 4761, 7, 80, -1, 0, 0, 14, 6501, -1), + (6503, -1, -1, 6503, 6503, 6, 72, -1, 0, 0, 14, -1, 6504), + (6504, -1, -1, 6503, 6503, 6, 72, -1, 0, 0, 14, 6503, 6505), + (6505, -1, -1, 6503, 6503, 6, 72, -1, 0, 0, 14, 6504, 6506), + (6506, -1, -1, 6503, 6503, 6, 72, -1, 0, 0, 14, 6505, -1), + (6508, 6508, 6508, 6508, 6508, 7, 74, 13195, 38, 600, 14, -1, 6509), + (6509, 6508, 6508, 6508, 6508, 7, 76, 13196, 38, 600, 14, 6508, 6510), + (6510, 6508, 6508, 6508, 6508, 7, 78, 13197, 38, 600, 14, 6509, 7387), + (6511, -1, -1, 6511, 6511, 6, 73, -1, 0, 0, 14, -1, 6512), + (6512, -1, -1, 6511, 6511, 6, 75, -1, 0, 0, 14, 6511, 6513), + (6513, -1, -1, 6511, 6511, 6, 77, -1, 0, 0, 14, 6512, -1), + (6514, -1, -1, 6514, 6514, 2, 72, -1, 0, 0, 14, -1, 6515), + (6515, -1, -1, 6514, 6514, 2, 72, -1, 0, 0, 14, 6514, 6516), + (6516, -1, -1, 6514, 6514, 2, 72, -1, 0, 0, 14, 6515, -1), + (6517, -1, -1, 1435, 4773, 9, 76, -1, 0, 0, 14, 4773, 7621), + (6518, -1, -1, 678, 678, 3, 65, -1, 0, 0, 14, 682, 6519), + (6519, -1, -1, 678, 678, 3, 65, -1, 0, 0, 14, 6518, 6520), + (6520, -1, -1, 678, 678, 3, 65, -1, 0, 0, 14, 6519, 7544), + (6521, -1, -1, 1021, 1021, 5, 75, -1, 0, 0, 14, 1025, 6522), + (6522, -1, -1, 1021, 1021, 5, 80, -1, 0, 0, 14, 6521, 7539), + (6523, -1, -1, 1026, 1026, 5, 76, -1, 0, 0, 14, 4687, 6524), + (6524, -1, -1, 1026, 1026, 5, 77, -1, 0, 0, 14, 6523, 6525), + (6525, -1, -1, 1026, 1026, 5, 78, -1, 0, 0, 14, 6524, 6526), + (6526, -1, -1, 1026, 1026, 5, 79, -1, 0, 0, 14, 6525, 6527), + (6527, -1, -1, 1026, 1026, 5, 80, -1, 0, 0, 14, 6526, 7511), + (6528, -1, -1, 501, 501, 5, 96, -1, 0, 0, 19, 6321, 6529), + (6531, -1, -1, 5295, 5295, 6, 76, -1, 0, 0, 14, 5297, 6532), + (6532, -1, -1, 5295, 5295, 6, 78, -1, 0, 0, 14, 6531, 6533), + (6533, -1, -1, 5295, 5295, 6, 80, -1, 0, 0, 14, 6532, 7220), + (6534, 8000, 8000, 8000, 8000, 12, 90, 23607, 73, 600, 17, -1, 14216), + (6540, -1, -1, 4699, 4699, 5, 56, -1, 0, 0, 14, 4699, 7500), + (6545, -1, -1, 4698, 4698, 5, 56, -1, 0, 0, 14, 4698, -1), + (6546, -1, -1, 6546, 6546, 0, 55, -1, 0, 0, 3, -1, 6547), + (6547, -1, -1, 6546, 6546, 0, 56, -1, 0, 0, 3, 6546, 6548), + (6548, -1, -1, 6546, 6546, 0, 57, -1, 0, 0, 3, 6547, 6549), + (6549, -1, -1, 6546, 6546, 0, 58, -1, 0, 0, 3, 6548, 6550), + (6550, -1, -1, 6546, 6546, 0, 59, -1, 0, 0, 3, 6549, 6551), + (6551, -1, -1, 6546, 6546, 0, 60, -1, 0, 0, 3, 6550, 6552), + (6552, -1, -1, 6546, 6546, 0, 61, -1, 0, 0, 3, 6551, 6553), + (6553, -1, -1, 6546, 6546, 0, 62, -1, 0, 0, 3, 6552, 6554), + (6554, -1, -1, 6546, 6546, 0, 63, -1, 0, 0, 3, 6553, 6555), + (6555, -1, -1, 6546, 6546, 0, 64, -1, 0, 0, 3, 6554, 6556), + (6556, -1, -1, 6546, 6546, 0, 65, -1, 0, 0, 3, 6555, 6557), + (6557, -1, -1, 6546, 6546, 0, 66, -1, 0, 0, 3, 6556, 6558), + (6558, -1, -1, 6546, 6546, 0, 67, -1, 0, 0, 3, 6557, 6559), + (6559, -1, -1, 6546, 6546, 0, 68, -1, 0, 0, 3, 6558, 6560), + (6560, -1, -1, 6546, 6546, 0, 69, -1, 0, 0, 3, 6559, 6561), + (6561, -1, -1, 6546, 6546, 0, 70, -1, 0, 0, 3, 6560, 6562), + (6562, -1, -1, 6546, 6546, 0, 71, -1, 0, 0, 3, 6561, 6563), + (6563, -1, -1, 6546, 6546, 0, 72, -1, 0, 0, 3, 6562, 6564), + (6564, -1, -1, 6546, 6546, 0, 73, -1, 0, 0, 3, 6563, 6565), + (6565, -1, -1, 6546, 6546, 0, 74, -1, 0, 0, 3, 6564, 6566), + (6566, -1, -1, 6546, 6546, 0, 75, -1, 0, 0, 3, 6565, 6567), + (6567, -1, -1, 6546, 6546, 0, 76, -1, 0, 0, 3, 6566, 6568), + (6568, -1, -1, 6546, 6546, 0, 77, -1, 0, 0, 3, 6567, 6569), + (6569, -1, -1, 6546, 6546, 0, 78, -1, 0, 0, 3, 6568, 6570), + (6570, -1, -1, 6546, 6546, 0, 79, -1, 0, 0, 3, 6569, 6571), + (6571, -1, -1, 6546, 6546, 0, 80, -1, 0, 0, 3, 6570, 7373), + (6601, -1, -1, 6601, 6601, 6, 72, -1, 0, 0, 14, -1, 6602), + (6602, -1, -1, 6601, 6601, 6, 73, -1, 0, 0, 14, 6601, 6603), + (6603, -1, -1, 6601, 6601, 6, 74, -1, 0, 0, 14, 6602, 6604), + (6604, -1, -1, 6601, 6601, 6, 75, -1, 0, 0, 14, 6603, 6605), + (6605, -1, -1, 6601, 6601, 6, 76, -1, 0, 0, 14, 6604, 7318), + (6606, 1597, 1597, 1597, 1597, 9, 75, 16095, 6, 10, 15, 1597, 10571), + (6607, 6607, 6607, 6607, 6607, 9, 75, 16092, 61, 600, 15, -1, 6608), + (6608, 6607, 6607, 6607, 6607, 9, 80, 16093, 61, 600, 15, 6607, 6609), + (6609, 6607, 6607, 6607, 6607, 9, 85, 16094, 61, 600, 15, 6608, 16324), + (6610, 6610, 6610, 6610, 6610, 2, 55, 16096, 41, 30, 15, -1, 10003), + (6611, -1, -1, 6611, 6611, 2, 60, -1, 0, 0, 15, -1, 6612), + (6612, -1, -1, 6611, 6611, 4, 63, -1, 0, 0, 15, 6611, 6613), + (6613, -1, -1, 6611, 6611, 6, 66, -1, 0, 0, 15, 6612, 6618), + (6614, -1, -1, 6614, 6614, 2, 60, -1, 0, 0, 15, -1, 6615), + (6615, -1, -1, 6614, 6614, 4, 63, -1, 0, 0, 15, 6614, 6616), + (6616, -1, -1, 6614, 6614, 6, 66, -1, 0, 0, 15, 6615, 10004), + (6617, 6617, 6617, 6617, 6617, 6, 83, 16097, 42, 3600, 15, -1, 10572), + (6618, -1, -1, 6611, 6611, 6, 69, -1, 0, 0, 15, 6613, 6619), + (6619, -1, -1, 6611, 6611, 6, 72, -1, 0, 0, 15, 6618, 10574), + (6630, -1, -1, 6630, 6630, 6, 70, -1, 0, 0, 15, -1, 6631), + (6631, -1, -1, 6630, 6630, 6, 70, -1, 0, 0, 15, 6630, 6632), + (6632, -1, -1, 6630, 6630, 6, 70, -1, 0, 0, 15, 6631, 6633), + (6633, -1, -1, 6630, 6630, 6, 70, -1, 0, 0, 15, 6632, 6634), + (6634, -1, -1, 6630, 6630, 6, 70, -1, 0, 0, 15, 6633, 10070), + (6635, 6635, 6635, 6635, 6635, 7, 70, 16098, 41, 600, 15, -1, -1), + (6636, -1, -1, 6636, 6636, 3, 70, -1, 0, 0, 15, -1, 6637), + (6637, -1, -1, 6636, 6636, 6, 70, -1, 0, 0, 15, 6636, 6638), + (6638, -1, -1, 6636, 6636, 9, 70, -1, 0, 0, 15, 6637, 10041), + (6639, 6639, 6639, 6639, 6639, 7, 70, 16099, 42, 300, 15, -1, 15173), + (6640, 6640, 6640, 6640, 6640, 7, 81, 16100, 43, 60, 15, -1, 12585), + (6641, -1, -1, 6641, 6641, 7, 81, -1, 0, 0, 15, -1, 6642), + (6642, -1, -1, 6641, 6641, 8, 83, -1, 0, 0, 15, 6641, 6643), + (6643, -1, -1, 6641, 6641, 9, 85, -1, 0, 0, 15, 6642, 10075), + (6644, 6644, 6644, 6644, 6644, 2, 70, 16104, 44, 20, 15, -1, 12586), + (6645, 6645, 6645, 6645, 6645, 6, 80, 16105, 45, 60, 15, -1, 13107), + (6646, 6646, 6646, 6646, 6646, 6, 70, 16106, 46, 6, 15, -1, -1), + (6660, -1, -1, 1307, 1307, 5, 73, -1, 0, 0, 15, 1311, 6661), + (6661, -1, -1, 1307, 1307, 5, 74, -1, 0, 0, 15, 6660, 6662), + (6662, -1, -1, 1307, 1307, 5, 75, -1, 0, 0, 15, 6661, 13210), + (6663, 6663, 6663, 6663, 6663, 7, 73, 16107, 59, 600, 15, -1, 6664), + (6664, 6663, 6663, 6663, 6663, 7, 75, 16108, 59, 600, 15, 6663, 6665), + (6665, 6663, 6663, 6663, 6663, 7, 77, 16109, 59, 600, 15, 6664, 10162), + (6666, -1, -1, 6666, 6666, 8, 81, -1, 0, 0, 15, -1, 6667), + (6667, -1, -1, 6666, 6666, 8, 83, -1, 0, 0, 15, 6666, -1), + (6668, -1, -1, 6668, 6668, 3, 76, -1, 0, 0, 15, -1, 6669), + (6669, -1, -1, 6668, 6668, 3, 77, -1, 0, 0, 15, 6668, 6670), + (6670, -1, -1, 6668, 6668, 3, 78, -1, 0, 0, 15, 6669, -1), + (6671, 6671, 6671, 6671, 6671, 4, 65, 16148, 60, 60, 15, -1, -1), + (6672, 6672, 6672, 6672, 6672, 4, 67, 16149, 60, 60, 15, -1, -1), + (6673, 6673, 6673, 6673, 6673, 4, 69, 16150, 60, 60, 15, -1, -1), + (6674, 6674, 6674, 6674, 6674, 4, 71, 16151, 60, 60, 15, -1, -1), + (6675, 6675, 6675, 6675, 6675, 4, 73, 16152, 60, 60, 15, -1, -1), + (6676, 6676, 6676, 6676, 6676, 4, 75, 16153, 60, 60, 15, -1, -1), + (6691, 6691, 6691, 6691, 6691, 9, 81, 16114, 41, 30, 15, -1, -1), + (6692, 6692, 6692, 6692, 6692, 7, 65, 16115, 42, 600, 15, -1, 6693), + (6693, 6692, 6692, 6692, 6692, 7, 70, 16116, 42, 600, 15, 6692, 6694), + (6694, 6692, 6692, 6692, 6692, 7, 75, 16117, 42, 600, 15, 6693, 6695), + (6695, 6692, 6692, 6692, 6692, 7, 80, 16118, 42, 600, 15, 6694, 6696), + (6696, 6692, 6692, 6692, 6692, 7, 85, 16119, 42, 600, 15, 6695, 5342), + (6697, -1, -1, 6697, 6697, 7, 65, -1, 0, 0, 15, -1, 6698), + (6698, -1, -1, 6697, 6697, 7, 70, -1, 0, 0, 15, 6697, 6699), + (6699, -1, -1, 6697, 6697, 7, 75, -1, 0, 0, 15, 6698, 6700), + (6700, -1, -1, 6697, 6697, 7, 80, -1, 0, 0, 15, 6699, 6701), + (6701, -1, -1, 6697, 6697, 7, 85, -1, 0, 0, 15, 6700, -1), + (6702, 6702, 6702, 6702, 6702, 9, 75, 16120, 43, 120, 15, -1, -1), + (6703, -1, -1, 6703, 6703, 3, 65, -1, 0, 0, 15, -1, 6704), + (6704, -1, -1, 6703, 6703, 3, 65, -1, 0, 0, 15, 6703, 6705), + (6705, -1, -1, 6703, 6703, 3, 65, -1, 0, 0, 15, 6704, 10176), + (6706, 6706, 6706, 6706, 6706, 7, 75, 16121, 44, 600, 15, -1, 6707), + (6707, 6706, 6706, 6706, 6706, 7, 80, 16122, 44, 600, 15, 6706, 6708), + (6708, 6706, 6706, 6706, 6706, 7, 85, 16123, 44, 600, 15, 6707, 10179), + (6709, -1, -1, 6709, 6709, 3, 60, -1, 0, 0, 15, -1, 6710), + (6710, -1, -1, 6709, 6709, 3, 61, -1, 0, 0, 15, 6709, 6711), + (6711, -1, -1, 6709, 6709, 3, 62, -1, 0, 0, 15, 6710, -1), + (6712, -1, -1, 6712, 6712, 7, 65, -1, 0, 0, 15, -1, 6713), + (6713, -1, -1, 6712, 6712, 7, 70, -1, 0, 0, 15, 6712, 6714), + (6714, -1, -1, 6712, 6712, 7, 75, -1, 0, 0, 15, 6713, 6715), + (6715, -1, -1, 6712, 6712, 7, 80, -1, 0, 0, 15, 6714, 6716), + (6716, -1, -1, 6712, 6712, 7, 85, -1, 0, 0, 15, 6715, 10182), + (6750, 6750, 6750, 6750, 6750, 9, 85, 16127, 60, 120, 15, -1, 13899), + (6751, -1, -1, 6751, 6751, 6, 75, -1, 0, 0, 15, -1, 6752), + (6752, -1, -1, 6751, 6751, 6, 75, -1, 0, 0, 15, 6751, 6753), + (6753, -1, -1, 6751, 6751, 6, 75, -1, 0, 0, 15, 6752, 6768), + (6754, 6754, 6754, 6754, 6754, 7, 70, 16130, 41, 1200, 15, -1, 10053), + (6755, 6755, 6755, 6755, 6755, 7, 81, 16131, 42, 900, 15, -1, 6756), + (6756, 6755, 6755, 6755, 6755, 9, 83, 16132, 42, 900, 15, 6755, 6757), + (6757, 6755, 6755, 6755, 6755, 12, 85, 16133, 42, 900, 15, 6756, 13542), + (6758, 6758, 6758, 6758, 6758, 3, 81, 16134, 43, 900, 15, -1, 6759), + (6759, 6758, 6758, 6758, 6758, 6, 83, 16135, 43, 900, 15, 6758, 6760), + (6760, 6758, 6758, 6758, 6758, 9, 85, 16136, 43, 900, 15, 6759, 10054), + (6761, -1, -1, 6761, 6761, 3, 65, -1, 0, 0, 15, -1, 6762), + (6762, -1, -1, 6761, 6761, 6, 65, -1, 0, 0, 15, 6761, 6763), + (6763, -1, -1, 6761, 6761, 9, 65, -1, 0, 0, 15, 6762, 6085), + (6764, 6764, 6764, 6764, 6764, 7, 75, 16137, 52, 600, 15, -1, 10057), + (6765, -1, -1, 6765, 6765, 3, 70, -1, 0, 0, 15, -1, 6766), + (6766, -1, -1, 6765, 6765, 6, 75, -1, 0, 0, 15, 6765, 6767), + (6767, -1, -1, 6765, 6765, 9, 80, -1, 0, 0, 15, 6766, 10058), + (6768, -1, -1, 6751, 6751, 6, 75, -1, 0, 0, 15, 6753, 6769), + (6769, -1, -1, 6751, 6751, 6, 75, -1, 0, 0, 15, 6768, 10769), + (6791, -1, -1, 6791, 6791, 6, 75, -1, 0, 0, 15, -1, 6792), + (6792, -1, -1, 6791, 6791, 6, 80, -1, 0, 0, 15, 6791, 6793), + (6793, -1, -1, 6791, 6791, 6, 85, -1, 0, 0, 15, 6792, 10044), + (6794, 6794, 6794, 6794, 6794, 6, 75, 16142, 41, 60, 15, -1, -1), + (6815, 6815, 6815, 6815, 6815, 8, 75, 16144, 60, 600, 15, -1, 6816), + (6816, 6815, 6815, 6815, 6815, 8, 80, 16145, 60, 600, 15, 6815, 6817), + (6817, 6815, 6815, 6815, 6815, 8, 85, 16146, 60, 600, 15, 6816, 10200), + (6818, 6818, 6818, 6818, 6818, 6, 70, 16147, 44, 20, 15, -1, -1), + (6819, -1, -1, 6819, 6819, 6, 72, -1, 0, 0, 15, -1, 6820), + (6820, -1, -1, 6819, 6819, 6, 74, -1, 0, 0, 15, 6819, 6821), + (6821, -1, -1, 6819, 6819, 6, 76, -1, 0, 0, 15, 6820, 10203), + (6822, 6822, 6822, 6822, 6822, 12, 80, 16154, 42, 120, 15, -1, 13683), + (6823, -1, -1, 6823, 6823, 4, 65, -1, 0, 0, 15, -1, 6824), + (6824, -1, -1, 6823, 6823, 4, 67, -1, 0, 0, 15, 6823, 6825), + (6825, -1, -1, 6823, 6823, 4, 69, -1, 0, 0, 15, 6824, 6826), + (6826, -1, -1, 6823, 6823, 4, 71, -1, 0, 0, 15, 6825, 6827), + (6827, -1, -1, 6823, 6823, 4, 73, -1, 0, 0, 15, 6826, 10206), + (6828, 6828, 6828, 6828, 6828, 12, 80, 16155, 43, 60, 15, -1, 10208), + (6870, -1, -1, 6870, 6870, 6, 75, -1, 0, 0, 15, -1, 6871), + (6871, -1, -1, 6870, 6870, 6, 75, -1, 0, 0, 15, 6870, 6872), + (6872, -1, -1, 6870, 6870, 6, 75, -1, 0, 0, 15, 6871, 10130), + (6873, -1, -1, 255, 255, 3, 76, -1, 0, 0, 15, -1, 6874), + (6874, -1, -1, 255, 255, 6, 76, -1, 0, 0, 15, 6873, 6875), + (6875, -1, -1, 255, 255, 9, 76, -1, 0, 0, 15, 6874, 10133), + (6876, -1, -1, 6375, 6375, 6, 76, -1, 0, 0, 15, -1, 6877), + (6877, -1, -1, 6375, 6375, 6, 77, -1, 0, 0, 15, 6876, 6878), + (6878, -1, -1, 6375, 6375, 6, 78, -1, 0, 0, 15, 6877, 10136), + (6879, -1, -1, 649, 649, 2, 66, -1, 0, 0, 15, -1, 6880), + (6880, -1, -1, 649, 649, 4, 68, -1, 0, 0, 15, 6879, 6881), + (6881, -1, -1, 649, 649, 6, 70, -1, 0, 0, 15, 6880, -1), + (6882, -1, -1, 776, 776, 3, 70, -1, 0, 0, 15, -1, 6883), + (6883, -1, -1, 776, 776, 3, 70, -1, 0, 0, 15, 6882, 6884), + (6884, -1, -1, 776, 776, 3, 70, -1, 0, 0, 15, 6883, -1), + (6900, -1, -1, 6935, 6935, 6, 81, -1, 0, 0, 16, 6937, 6901), + (6901, -1, -1, 6935, 6935, 6, 82, -1, 0, 0, 16, 6900, 6902), + (6902, -1, -1, 6935, 6935, 6, 83, -1, 0, 0, 16, 6901, 6903), + (6903, -1, -1, 6935, 6935, 6, 84, -1, 0, 0, 16, 6902, 6904), + (6904, -1, -1, 6935, 6935, 6, 85, -1, 0, 0, 16, 6903, 14196), + (6905, -1, -1, 551, 551, 5, 81, -1, 0, 0, 16, 1637, 6906), + (6906, -1, -1, 551, 551, 5, 83, -1, 0, 0, 16, 6905, 6907), + (6907, -1, -1, 551, 551, 5, 85, -1, 0, 0, 16, 6906, 12843), + (6908, -1, -1, 6908, 6908, 6, 81, -1, 0, 0, 16, -1, 6909), + (6909, -1, -1, 6908, 6908, 6, 83, -1, 0, 0, 16, 6908, 6910), + (6910, -1, -1, 6908, 6908, 6, 85, -1, 0, 0, 16, 6909, 14199), + (6911, -1, -1, 1143, 1143, 5, 65, -1, 0, 0, 16, 1168, 6912), + (6912, -1, -1, 1143, 1143, 7, 65, -1, 0, 0, 16, 6911, 6913), + (6913, -1, -1, 1143, 1143, 9, 65, -1, 0, 0, 16, 6912, -1), + (6930, 6930, 6930, 6930, 6930, 12, 80, 16156, 13, 60, 15, -1, -1), + (6931, 6931, 6931, 6931, 6931, 12, 85, 16157, 41, 600, 15, -1, 10319), + (6932, 6932, 6932, 6932, 6932, 7, 81, 16158, 42, 1200, 15, -1, 6933), + (6933, 6932, 6932, 6932, 6932, 7, 83, 16159, 42, 1200, 15, 6932, 6934), + (6934, 6932, 6932, 6932, 6932, 7, 85, 16160, 42, 1200, 15, 6933, 10320), + (6935, -1, -1, 6935, 6935, 6, 75, -1, 0, 0, 15, -1, 6936), + (6936, -1, -1, 6935, 6935, 6, 77, -1, 0, 0, 15, 6935, 6937), + (6937, -1, -1, 6935, 6935, 6, 79, -1, 0, 0, 15, 6936, 6900), + (6938, -1, -1, 6938, 6938, 7, 81, -1, 0, 0, 15, -1, 6939), + (6939, -1, -1, 6938, 6938, 7, 83, -1, 0, 0, 15, 6938, 6940), + (6940, -1, -1, 6938, 6938, 7, 85, -1, 0, 0, 15, 6939, -1), + (6941, -1, -1, 6941, 6941, 6, 81, -1, 0, 0, 15, -1, 6942), + (6942, -1, -1, 6941, 6941, 6, 81, -1, 0, 0, 15, 6941, 6943), + (6943, -1, -1, 6941, 6941, 6, 81, -1, 0, 0, 15, 6942, 6944), + (6944, -1, -1, 6941, 6941, 6, 81, -1, 0, 0, 15, 6943, 6945), + (6945, -1, -1, 6941, 6941, 6, 81, -1, 0, 0, 15, 6944, -1), + (6970, 6970, 6970, 6970, 6970, 6, 70, 16167, 61, 6, 15, -1, -1), + (6971, 6971, 6971, 6971, 6971, 7, 78, 16168, 41, 600, 15, -1, 6972), + (6972, 6971, 6971, 6971, 6971, 7, 80, 16169, 41, 600, 15, 6971, 6973), + (6973, 6971, 6971, 6971, 6971, 7, 82, 16170, 41, 600, 15, 6972, 10288), + (6974, -1, -1, 6974, 6974, 5, 81, -1, 0, 0, 15, -1, 6975), + (6975, -1, -1, 6974, 6974, 5, 83, -1, 0, 0, 15, 6974, 6976), + (6976, -1, -1, 6974, 6974, 5, 85, -1, 0, 0, 15, 6975, 10291), + (6977, -1, -1, 6977, 6977, 5, 81, -1, 0, 0, 15, -1, 6978), + (6978, -1, -1, 6977, 6977, 5, 83, -1, 0, 0, 15, 6977, 6979), + (6979, -1, -1, 6977, 6977, 5, 85, -1, 0, 0, 15, 6978, 12840), + (6980, -1, -1, 6980, 6980, 5, 81, -1, 0, 0, 15, -1, 6981), + (6981, -1, -1, 6980, 6980, 5, 83, -1, 0, 0, 15, 6980, 6982), + (6982, -1, -1, 6980, 6980, 5, 85, -1, 0, 0, 15, 6981, 12834), + (6983, 6983, 6983, 6983, 6983, 7, 83, 16439, 66, 720, 15, -1, 16246), + (6984, 6984, 6984, 6984, 6984, 6, 73, 16172, 60, 60, 15, -1, 10294), + (6985, 6985, 6985, 6985, 6985, 6, 73, 16173, 60, 60, 15, -1, 10295), + (6986, 6986, 6986, 6986, 6986, 6, 73, 16174, 60, 60, 15, -1, 10296), + (6987, -1, -1, 6987, 6987, 12, 81, -1, 0, 0, 15, -1, -1), + (6988, -1, -1, 6988, 6988, 5, 83, 0, 0, 0, 16, -1, 6989), + (6989, -1, -1, 6988, 6988, 5, 84, 0, 0, 0, 16, 6988, 6990), + (6990, -1, -1, 6988, 6988, 5, 83, 0, 0, 0, 16, 6989, 14278), + (7000, 7000, 7000, 7000, 7000, 4, 65, 12748, 31, 600, 3, -1, -1), + (7002, 7002, 7002, 7002, 7002, 4, 65, 12750, 31, 600, 3, -1, -1), + (7003, 7003, 7003, 7003, 7003, 4, 65, 12751, 31, 600, 3, -1, -1), + (7004, 7004, 7004, 7004, 7004, 4, 65, 12752, 31, 300, 3, -1, -1), + (7005, -1, -1, 7005, 7005, 2, 73, -1, 0, 0, 15, -1, 7006), + (7006, -1, -1, 7005, 7005, 2, 74, -1, 0, 0, 15, 7005, 7007), + (7007, -1, -1, 7005, 7005, 2, 75, -1, 0, 0, 15, 7006, 15632), + (7008, -1, -1, 1604, 1604, 9, 81, -1, 0, 0, 16, 7133, 7009), + (7009, -1, -1, 1604, 1604, 12, 83, -1, 0, 0, 16, 7008, 12612), + (7010, -1, -1, 7010, 7010, 6, 81, -1, 0, 0, 16, -1, 7011), + (7011, -1, -1, 7010, 7010, 6, 83, -1, 0, 0, 16, 7010, 7012), + (7012, -1, -1, 7010, 7010, 6, 85, -1, 0, 0, 16, 7011, 7013), + (7013, -1, -1, 7010, 7010, 6, 85, -1, 0, 0, 16, 7012, 7014), + (7014, -1, -1, 7010, 7010, 6, 85, -1, 0, 0, 16, 7013, 7015), + (7015, -1, -1, 7010, 7010, 6, 85, -1, 0, 0, 16, 7014, 13533), + (7016, 7016, 7016, 7016, 7016, 5, 85, 21658, 31, 600, 3, -1, -1), + (7017, 7017, 7017, 7017, 7017, 5, 85, 21659, 31, 600, 3, -1, -1), + (7018, 7018, 7018, 7018, 7018, 5, 85, 21660, 31, 600, 3, -1, -1), + (7019, 7019, 7019, 7019, 7019, 5, 85, 21661, 31, 600, 3, -1, -1), + (7020, 7020, 7020, 7020, 7020, 0, 85, 21658, 31, 600, 3, -1, -1), + (7021, 7021, 7021, 7021, 7021, 0, 85, 21659, 31, 600, 3, -1, -1), + (7022, 7022, 7022, 7022, 7022, 0, 85, 21660, 31, 600, 3, -1, -1), + (7023, 7023, 7023, 7023, 7023, 0, 85, 21661, 31, 600, 3, -1, -1), + (7024, 7024, 7024, 7024, 7024, 0, 0, 9475, 31, 600, 12, -1, -1), + (7025, 7025, 7025, 7025, 7025, 0, 0, 9477, 31, 600, 12, -1, -1), + (7026, 7026, 7026, 7026, 7026, 0, 0, 9478, 31, 600, 12, -1, -1), + (7027, 7027, 7027, 7027, 7027, 0, 0, 9479, 31, 600, 12, -1, -1), + (7028, 7028, 7028, 7028, 7028, 0, 0, 12748, 31, 600, 3, -1, -1), + (7030, 7030, 7030, 7030, 7030, 0, 0, 12750, 31, 600, 3, -1, -1), + (7031, 7031, 7031, 7031, 7031, 0, 0, 12751, 31, 600, 3, -1, -1), + (7032, 7032, 7032, 7032, 7032, 0, 0, 12752, 31, 300, 3, -1, -1), + (7033, -1, -1, 7033, 7033, 6, 85, 0, 0, 0, 16, -1, 7034), + (7034, -1, -1, 7033, 7033, 9, 85, 0, 0, 0, 16, 7033, 7035), + (7035, -1, -1, 7033, 7033, 12, 85, 0, 0, 0, 16, 7034, 15746), + (7036, -1, -1, 7036, 7036, 7, 81, -1, 0, 0, 16, -1, 7037), + (7037, -1, -1, 7036, 7036, 9, 81, -1, 0, 0, 16, 7036, 7038), + (7038, -1, -1, 7036, 7036, 12, 81, -1, 0, 0, 16, 7037, 10579), + (7050, -1, -1, 446, 735, 5, 67, -1, 0, 0, 8, 448, 7051), + (7051, -1, -1, 446, 735, 5, 68, -1, 0, 0, 8, 7050, 7052), + (7052, -1, -1, 446, 735, 5, 69, -1, 0, 0, 8, 7051, 7053), + (7053, -1, -1, 446, 735, 7, 72, -1, 0, 0, 12, 7052, 7054), + (7054, -1, -1, 446, 735, 7, 73, -1, 0, 0, 12, 7053, 7055), + (7055, -1, -1, 446, 735, 7, 74, -1, 0, 0, 12, 7054, 7063), + (7056, -1, -1, 735, 735, 5, 67, -1, 0, 0, 8, 737, 7057), + (7057, -1, -1, 735, 735, 5, 68, -1, 0, 0, 8, 7056, 7058), + (7058, -1, -1, 735, 735, 5, 69, -1, 0, 0, 8, 7057, 7059), + (7059, -1, -1, 735, 735, 7, 72, -1, 0, 0, 12, 7058, 7060), + (7060, -1, -1, 735, 735, 7, 73, -1, 0, 0, 12, 7059, 7061), + (7061, -1, -1, 735, 735, 7, 74, -1, 0, 0, 12, 7060, 7066), + (7062, -1, -1, 7062, 7062, 3, 51, -1, 0, 0, 0, -1, -1), + (7063, -1, -1, 446, 735, 8, 76, -1, 0, 0, 14, 7055, 7064), + (7064, -1, -1, 446, 735, 8, 77, -1, 0, 0, 14, 7063, 7065), + (7065, -1, -1, 446, 735, 8, 78, -1, 0, 0, 14, 7064, 7622), + (7066, -1, -1, 735, 735, 8, 76, -1, 0, 0, 14, 7061, 7067), + (7067, -1, -1, 735, 735, 8, 77, -1, 0, 0, 14, 7066, 7068), + (7068, -1, -1, 735, 735, 8, 78, -1, 0, 0, 14, 7067, 7625), + (7069, 7069, 7069, 7069, 7069, 3, 71, 13219, 39, 7, 14, -1, -1), + (7100, -1, -1, 7100, 7100, 6, 76, -1, 0, 0, 14, -1, 7101), + (7101, -1, -1, 7100, 7100, 6, 77, -1, 0, 0, 14, 7100, 7102), + (7102, -1, -1, 7100, 7100, 6, 78, -1, 0, 0, 14, 7101, 7323), + (7103, -1, -1, 7103, 7103, 2, 65, -1, 0, 0, 14, -1, 7104), + (7104, -1, -1, 7103, 7103, 2, 65, -1, 0, 0, 14, 7103, 7105), + (7105, -1, -1, 7103, 7103, 2, 65, -1, 0, 0, 14, 7104, 7326), + (7106, -1, -1, 7106, 7106, 6, 73, -1, 0, 0, 14, -1, 7107), + (7107, -1, -1, 7106, 7106, 7, 76, -1, 0, 0, 14, 7106, 7108), + (7108, -1, -1, 7106, 7106, 10, 79, -1, 0, 0, 14, 7107, -1), + (7109, 1351, 1351, 1351, 1351, 8, 82, 13499, 5, 30, 15, 6133, 13109), + (7110, 4849, 4849, 4849, 4849, 7, 81, 13593, 7, 1800, 15, 6134, 13914), + (7111, 54006, 54006, 54006, 54006, 7, 81, 13594, 18, 180, 15, 6135, 10006), + (7112, -1, -1, 6564, 6564, 6, 78, -1, 0, 0, 15, 6285, 7113), + (7113, -1, -1, 6564, 6564, 7, 81, -1, 0, 0, 15, 7112, 7114), + (7114, -1, -1, 6564, 6564, 10, 84, -1, 0, 0, 15, 7113, 10007), + (7115, 6565, 6565, 6565, 6565, 7, 81, 13595, 17, 45, 15, 6286, 10010), + (7116, -1, -1, 489, 489, 3, 68, -1, 0, 0, 15, 491, 7117), + (7117, -1, -1, 489, 489, 3, 69, -1, 0, 0, 15, 7116, 7118), + (7118, -1, -1, 489, 489, 3, 70, -1, 0, 0, 15, 7117, -1), + (7119, 912, 912, 912, 912, 3, 71, 13496, 4, 3600, 15, 1332, 7120), + (7120, 912, 912, 912, 912, 6, 73, 13497, 4, 3600, 15, 7119, 7121), + (7121, 912, 912, 912, 912, 9, 75, 13498, 4, 3600, 15, 7120, 10011), + (7122, -1, -1, 4844, 4844, 5, 76, -1, 0, 0, 15, 4848, 7123), + (7123, -1, -1, 4844, 4844, 5, 77, -1, 0, 0, 15, 7122, 7124), + (7124, -1, -1, 4844, 4844, 5, 78, -1, 0, 0, 15, 7123, 7125), + (7125, -1, -1, 4844, 4844, 5, 79, -1, 0, 0, 15, 7124, 7126), + (7126, -1, -1, 4844, 4844, 5, 80, -1, 0, 0, 15, 7125, 7686), + (7127, 4860, 4860, 4860, 4860, 12, 85, 13599, 13, 60, 15, 5606, -1), + (7128, -1, -1, 492, 492, 2, 68, -1, 0, 0, 15, 494, 7129), + (7129, -1, -1, 492, 492, 2, 69, -1, 0, 0, 15, 7128, 7130), + (7130, -1, -1, 492, 492, 2, 70, -1, 0, 0, 15, 7129, 10576), + (7131, -1, -1, 1604, 1604, 7, 75, -1, 0, 0, 15, 6034, 7132), + (7132, -1, -1, 1604, 1604, 9, 77, -1, 0, 0, 15, 7131, 7133), + (7133, -1, -1, 1604, 1604, 12, 79, -1, 0, 0, 15, 7132, 7008), + (7134, -1, -1, 1543, 1543, 7, 81, -1, 0, 0, 15, 6044, 7135), + (7135, -1, -1, 1543, 1543, 9, 83, -1, 0, 0, 15, 7134, 7136), + (7136, -1, -1, 1543, 1543, 12, 85, -1, 0, 0, 15, 7135, 10165), + (7137, -1, -1, 6559, 6559, 6, 79, -1, 0, 0, 15, 6274, 7138), + (7138, -1, -1, 6559, 6559, 7, 81, -1, 0, 0, 15, 7137, 7139), + (7139, -1, -1, 6559, 6559, 10, 83, -1, 0, 0, 15, 7138, -1), + (7143, 6328, 6328, 6328, 6328, 7, 79, 13601, 10, 600, 15, 6330, 7144), + (7144, 6328, 6328, 6328, 6328, 7, 81, 13602, 10, 600, 15, 7143, 7145), + (7145, 6328, 6328, 6328, 6328, 7, 83, 13603, 10, 600, 15, 7144, 10168), + (7146, -1, -1, 878, 878, 7, 81, -1, 0, 0, 15, 6332, 7147), + (7147, -1, -1, 878, 878, 7, 83, -1, 0, 0, 15, 7146, 10171), + (7148, -1, -1, 1304, 1304, 7, 81, -1, 0, 0, 15, 6031, 7149), + (7149, -1, -1, 1304, 1304, 9, 83, -1, 0, 0, 15, 7148, 7150), + (7150, -1, -1, 1304, 1304, 12, 85, -1, 0, 0, 15, 7149, 10865), + (7151, -1, -1, 846, 846, 7, 81, -1, 0, 0, 15, 6037, 7152), + (7152, -1, -1, 846, 846, 9, 83, -1, 0, 0, 15, 7151, 7153), + (7153, -1, -1, 846, 846, 12, 85, -1, 0, 0, 15, 7152, 10173), + (7154, 1352, 1352, 1352, 1352, 6, 81, 13613, 3, 60, 15, 6318, 7155), + (7155, 1352, 1352, 1352, 1352, 6, 83, 13614, 3, 60, 15, 7154, 7156), + (7156, 1352, 1352, 1352, 1352, 6, 85, 13615, 3, 60, 15, 7155, 10113), + (7157, 1358, 1358, 1358, 1358, 6, 81, 13610, 3, 60, 15, 6312, 7158), + (7158, 1358, 1358, 1358, 1358, 6, 83, 13611, 3, 60, 15, 7157, 7159), + (7159, 1358, 1358, 1358, 1358, 6, 85, 13612, 3, 60, 15, 7158, 10116), + (7160, -1, -1, 4801, 4801, 6, 79, -1, 0, 0, 15, 4803, 7161), + (7161, -1, -1, 4801, 4801, 6, 81, -1, 0, 0, 15, 7160, 7162), + (7162, -1, -1, 4801, 4801, 6, 83, -1, 0, 0, 15, 7161, 10122), + (7163, -1, -1, 820, 820, 5, 81, -1, 0, 0, 15, 5919, 7164), + (7164, -1, -1, 820, 820, 5, 83, -1, 0, 0, 15, 7163, 7165), + (7165, -1, -1, 820, 820, 5, 85, -1, 0, 0, 15, 7164, 10660), + (7166, -1, -1, 6343, 6343, 6, 79, -1, 0, 0, 15, 6345, 7167), + (7167, -1, -1, 6343, 6343, 6, 81, -1, 0, 0, 15, 7166, 7168), + (7168, -1, -1, 6343, 6343, 6, 83, -1, 0, 0, 15, 7167, -1), + (7169, -1, -1, 6020, 6020, 2, 81, -1, 0, 0, 15, 6059, 7170), + (7170, -1, -1, 6020, 6020, 2, 83, -1, 0, 0, 15, 7169, 7171), + (7171, -1, -1, 6020, 6020, 2, 85, -1, 0, 0, 15, 7170, 10663), + (7172, 1355, 1355, 1355, 1355, 6, 81, 13607, 3, 60, 15, 5916, 7173), + (7173, 1355, 1355, 1355, 1355, 6, 83, 13608, 3, 60, 15, 7172, 7174), + (7174, 1355, 1355, 1355, 1355, 6, 85, 13609, 3, 60, 15, 7173, 10119), + (7175, -1, -1, 611, 611, 2, 68, -1, 0, 0, 15, 615, 7176), + (7176, -1, -1, 611, 611, 2, 69, -1, 0, 0, 15, 7175, 7177), + (7177, -1, -1, 611, 611, 2, 70, -1, 0, 0, 15, 7176, 10124), + (7178, 4854, 4854, 4854, 4854, 7, 81, 13616, 8, 600, 15, 5766, 7179), + (7179, 4854, 4854, 4854, 4854, 9, 83, 13617, 8, 600, 15, 7178, 7180), + (7180, 4854, 4854, 4854, 4854, 12, 85, 13618, 8, 600, 15, 7179, 10323), + (7184, 1348, 1348, 1348, 1348, 12, 91, 13622, 0, 3600, 18, 5772, 7185), + (7187, 1178, 1178, 1178, 1178, 7, 81, 13625, 4, 900, 15, 5781, 7188), + (7188, 1178, 1178, 1178, 1178, 8, 82, 13626, 4, 900, 15, 7187, 7189), + (7189, 1178, 1178, 1178, 1178, 9, 83, 13627, 4, 900, 15, 7188, 10326), + (7196, -1, -1, 5776, 5776, 7, 81, -1, 0, 0, 16, 5778, 7197), + (7197, -1, -1, 5776, 5776, 9, 83, -1, 0, 0, 16, 7196, 7198), + (7198, -1, -1, 5776, 5776, 12, 85, -1, 0, 0, 16, 7197, 13043), + (7199, 1274, 1274, 1274, 1274, 9, 83, 13657, 9, 540, 15, 5949, 7200), + (7200, 1274, 1274, 1274, 1274, 10, 84, 13658, 9, 540, 15, 7199, 7201), + (7201, 1274, 1274, 1274, 1274, 12, 85, 13659, 9, 540, 15, 7200, 10209), + (7202, 1510, -1, 1510, 1510, 12, 75, 13664, 13, 2160, 15, 1510, 10212), + (7203, 184, 184, 184, 184, 10, 84, 13660, 5, 4320, 15, 5953, -1), + (7204, -1, -1, 5264, 5264, 7, 81, -1, 0, 0, 15, 5943, 7205), + (7205, -1, -1, 5264, 5264, 8, 82, -1, 0, 0, 15, 7204, 7206), + (7206, -1, -1, 5264, 5264, 9, 83, -1, 0, 0, 15, 7205, 7207), + (7207, -1, -1, 5264, 5264, 10, 84, -1, 0, 0, 15, 7206, 7208), + (7208, -1, -1, 5264, 5264, 12, 85, -1, 0, 0, 15, 7207, 10213), + (7209, 4927, 4927, 4927, 4927, 9, 76, 13656, 14, 600, 15, 4927, 10218), + (7210, -1, -1, 839, 839, 6, 75, -1, 0, 0, 15, 5329, 7211), + (7211, -1, -1, 839, 839, 6, 75, -1, 0, 0, 15, 7210, 7212), + (7212, -1, -1, 839, 839, 6, 75, -1, 0, 0, 15, 7211, 7213), + (7213, -1, -1, 839, 839, 6, 75, -1, 0, 0, 15, 7212, 7214), + (7214, -1, -1, 839, 839, 6, 75, -1, 0, 0, 15, 7213, 10219), + (7215, -1, -1, 4861, 4861, 9, 83, -1, 0, 0, 15, 5956, 7216), + (7216, -1, -1, 4861, 4861, 12, 85, -1, 0, 0, 15, 7215, 7682), + (7217, 967, 967, 967, 967, 6, 81, 13661, 10, 1800, 15, 6466, 7218), + (7218, 967, 967, 967, 967, 6, 82, 13662, 10, 1800, 15, 7217, 7219), + (7219, 967, 967, 967, 967, 6, 83, 13663, 10, 1800, 15, 7218, 10224), + (7220, -1, -1, 5295, 5295, 6, 81, -1, 0, 0, 15, 6533, 7221), + (7221, -1, -1, 5295, 5295, 6, 83, -1, 0, 0, 15, 7220, 7222), + (7222, -1, -1, 5295, 5295, 6, 85, -1, 0, 0, 15, 7221, 10227), + (7223, 6290, 6290, 6290, 6290, 7, 81, 13689, 0, 1, 15, 6295, 7224), + (7224, 6290, 6290, 6290, 6290, 9, 83, 13690, 0, 1, 15, 7223, 7225), + (7225, 6290, 6290, 6290, 6290, 12, 85, 13691, 0, 1, 15, 7224, 11064), + (7226, 619, 619, 619, 619, 6, 78, 13686, 6, 900, 15, 6298, 7227), + (7227, 619, 619, 619, 619, 6, 78, 13687, 6, 900, 15, 7226, 7228), + (7228, 619, 619, 619, 619, 6, 78, 13688, 6, 900, 15, 7227, 10230), + (7229, 4944, -1, 4944, 4944, 7, 81, 13677, 0, 1, 15, 6157, 7230), + (7230, 4944, -1, 4944, 4944, 9, 83, 13678, 0, 1, 15, 7229, 7231), + (7231, 4944, -1, 4944, 4944, 12, 85, 13679, 0, 1, 15, 7230, 11067), + (7232, -1, -1, 1210, 1210, 7, 81, -1, 0, 0, 15, 5576, 7233), + (7233, -1, -1, 1210, 1210, 9, 83, -1, 0, 0, 15, 7232, 7234), + (7234, -1, -1, 1210, 1210, 12, 85, -1, 0, 0, 15, 7233, 12523), + (7235, 923, 923, 923, 923, 9, 82, 13673, 8, 60, 15, 6151, -1), + (7236, 922, 922, 922, 922, 9, 83, 13672, 8, 60, 15, 6150, -1), + (7237, 516, 516, 516, 516, 6, 77, 13692, 5, 480, 15, 6398, 10233), + (7238, 155, 155, 155, 155, 12, 82, 13693, 8, 60, 15, 5289, 14324), + (7239, 1334, 1334, 1334, 1334, 9, 83, 13674, 11, 4320, 15, 6154, 7240), + (7240, 1334, 1334, 1334, 1334, 10, 84, 13675, 11, 4320, 15, 7239, 7241), + (7241, 1334, 1334, 1334, 1334, 12, 85, 13676, 11, 4320, 15, 7240, 10234), + (7242, 1478, -1, 1478, 1478, 9, 83, 13680, 0, 1, 15, 6163, 7243), + (7243, 1478, -1, 1478, 1478, 10, 84, 13681, 0, 1, 15, 7242, 7244), + (7244, 1478, -1, 1478, 1478, 12, 85, 13682, 0, 1, 15, 7243, 11070), + (7245, 921, 921, 921, 921, 9, 84, 13671, 8, 60, 15, 6149, -1), + (7246, 4915, 4915, 4915, 4915, 7, 81, 13683, 7, 4320, 15, 5609, 7247), + (7247, 4915, 4915, 4915, 4915, 9, 83, 13684, 7, 4320, 15, 7246, 7248), + (7248, 4915, 4915, 4915, 4915, 12, 85, 13685, 7, 4320, 15, 7247, -1), + (7249, 167, 167, 167, 167, 10, 84, 13703, 14, 900, 15, 5879, 8343), + (7250, 520, 520, 520, 520, 12, 81, 13704, 6, 540, 15, 5885, 7251), + (7251, 520, 520, 520, 520, 12, 83, 13705, 6, 540, 15, 7250, 7252), + (7252, 520, 520, 520, 520, 12, 85, 13706, 6, 540, 15, 7251, 10252), + (7253, 4903, 4903, 4903, 4903, 9, 81, 13707, 9, 1320, 15, 5892, 10255), + (7254, 4906, 4906, 4906, 4906, 9, 81, 13708, 9, 1320, 15, 5893, 10256), + (7255, 4909, 4909, 4909, 4909, 9, 81, 13709, 16, 1320, 15, 5894, 10257), + (7256, 4912, 4912, 4912, 4912, 9, 81, 13710, 16, 1320, 15, 5895, 10258), + (7257, 616, 616, 616, 616, 6, 78, 13711, 7, 900, 15, 6256, 7258), + (7258, 616, 616, 616, 616, 7, 81, 13712, 7, 900, 15, 7257, 7259), + (7259, 616, 616, 616, 616, 10, 84, 13713, 7, 900, 15, 7258, 10259), + (7260, -1, -1, 1504, 1504, 5, 81, -1, 0, 0, 15, 5882, 7261), + (7261, -1, -1, 1504, 1504, 5, 83, -1, 0, 0, 15, 7260, 7262), + (7262, -1, -1, 1504, 1504, 5, 85, -1, 0, 0, 15, 7261, -1), + (7263, -1, -1, 1577, 1577, 7, 81, -1, 0, 0, 15, 5888, 7264), + (7264, -1, -1, 1577, 1577, 9, 83, -1, 0, 0, 15, 7263, 7265), + (7265, -1, -1, 1577, 1577, 12, 85, -1, 0, 0, 15, 7264, 10262), + (7266, 6333, 6333, 6333, 6333, 6, 64, 13714, 3, 600, 15, 6333, 13920), + (7267, -1, -1, 795, 795, 7, 81, -1, 0, 0, 15, 5891, 7268), + (7268, -1, -1, 795, 795, 9, 83, -1, 0, 0, 15, 7267, 7269), + (7269, -1, -1, 795, 795, 12, 85, -1, 0, 0, 15, 7268, 10265), + (7270, -1, -1, 790, 790, 6, 81, -1, 0, 0, 15, 5324, 7271), + (7271, -1, -1, 790, 790, 6, 82, -1, 0, 0, 15, 7270, 7272), + (7272, -1, -1, 790, 790, 6, 83, -1, 0, 0, 15, 7271, 7273), + (7273, -1, -1, 790, 790, 6, 84, -1, 0, 0, 15, 7272, 7274), + (7274, -1, -1, 790, 790, 6, 85, -1, 0, 0, 15, 7273, 12950), + (7275, 1239, 1239, 1239, 1239, 12, 85, 13735, 6, 600, 15, 5868, 13251), + (7276, 773, -1, 773, 773, 7, 81, 13726, 5, 1800, 15, 5856, 7277), + (7277, 773, -1, 773, 773, 9, 83, 13727, 5, 1800, 15, 7276, 7278), + (7278, 773, -1, 773, 773, 12, 85, 13728, 5, 1800, 15, 7277, 10564), + (7279, 6552, 6552, 6552, 6552, 5, 75, -1, 0, 0, 15, 6253, 7280), + (7280, 6552, 6552, 6552, 6552, 6, 77, -1, 0, 0, 15, 7279, 7281), + (7281, 6552, 6552, 6552, 6552, 6, 79, -1, 0, 0, 15, 7280, 7282), + (7282, 6552, 6552, 6552, 6552, 7, 81, -1, 0, 0, 15, 7281, 7283), + (7283, 6552, 6552, 6552, 6552, 9, 83, -1, 0, 0, 15, 7282, -1), + (7284, -1, -1, 781, 781, 8, 82, -1, 0, 0, 15, 5850, 13763), + (7285, 1242, 1242, 1242, 1242, 7, 81, 13723, 9, 1320, 15, 5859, 7286), + (7286, 1242, 1242, 1242, 1242, 9, 83, 13724, 9, 1320, 15, 7285, 7287), + (7287, 1242, 1242, 1242, 1242, 12, 85, 13725, 9, 1320, 15, 7286, 10271), + (7288, 4894, 4894, 4894, 4894, 6, 81, 13732, 7, 2160, 15, 6354, 7289), + (7289, 4894, 4894, 4894, 4894, 6, 82, 13733, 7, 2160, 15, 7288, 7290), + (7290, 4894, 4894, 4894, 4894, 6, 83, 13734, 7, 2160, 15, 7289, 13247), + (7291, 4931, 4931, 4931, 4931, 7, 81, 13729, 4, 600, 15, 6056, 7292), + (7292, 4931, 4931, 4931, 4931, 7, 83, 13730, 4, 600, 15, 7291, 7293), + (7293, 4931, 4931, 4931, 4931, 7, 85, 13731, 4, 600, 15, 7292, 10274), + (7294, 4935, 4935, 4935, 4935, 7, 76, 13722, 14, 300, 15, 4935, 10277), + (7295, 4934, 4934, 4934, 4934, 7, 76, 13721, 13, 300, 15, 4934, 10278), + (7296, 517, 517, 517, 517, 5, 73, 13718, 12, 600, 15, 1444, 7297), + (7297, 517, 517, 517, 517, 5, 74, 13719, 12, 600, 15, 7296, 7298), + (7298, 517, 517, 517, 517, 5, 75, 13720, 12, 600, 15, 7297, 10279), + (7299, 1383, 1383, 1383, 1383, 12, 85, 16000, 6, 300, 15, 5789, 10014), + (7300, 1195, 1195, 1195, 1195, 9, 85, 16001, 13, 2160, 15, 5790, 10015), + (7301, 131, 131, 131, 131, 8, 82, 16002, 4, 900, 15, 5793, 7302), + (7302, 131, 131, 131, 131, 9, 83, 16003, 4, 900, 15, 7301, 7303), + (7303, 131, 131, 131, 131, 10, 84, 16004, 4, 900, 15, 7302, 10016), + (7304, 1192, 1192, 1192, 1192, 8, 82, 16005, 12, 1320, 15, 5796, 7305), + (7305, 1192, 1192, 1192, 1192, 9, 83, 16006, 12, 1320, 15, 7304, 7306), + (7306, 1192, 1192, 1192, 1192, 10, 84, 16007, 12, 1320, 15, 7305, 10019), + (7307, 746, 746, 746, 746, 9, 83, 16008, 10, 2160, 15, 5802, 7308), + (7308, 746, 746, 746, 746, 10, 84, 16009, 10, 2160, 15, 7307, 7309), + (7309, 746, 746, 746, 746, 12, 85, 16010, 10, 2160, 15, 7308, 10022), + (7310, 1459, 1459, 1459, 1459, 7, 81, 16011, 11, 1800, 15, 5805, 7311), + (7311, 1459, 1459, 1459, 1459, 9, 83, 16012, 11, 1800, 15, 7310, 7312), + (7312, 1459, 1459, 1459, 1459, 12, 85, 16013, 11, 1800, 15, 7311, -1), + (7313, -1, -1, 6436, 6436, 6, 78, -1, 0, 0, 15, 6438, 7314), + (7314, -1, -1, 6436, 6436, 6, 80, -1, 0, 0, 15, 7313, 7315), + (7315, -1, -1, 6436, 6436, 8, 82, -1, 0, 0, 15, 7314, -1), + (7316, -1, -1, 468, 468, 2, 72, -1, 0, 0, 15, 6440, 7317), + (7317, -1, -1, 468, 468, 2, 74, -1, 0, 0, 15, 7316, 17288), + (7318, -1, -1, 6601, 6601, 6, 77, -1, 0, 0, 15, 6605, 7319), + (7319, -1, -1, 6601, 6601, 6, 78, -1, 0, 0, 15, 7318, 7320), + (7320, -1, -1, 6601, 6601, 6, 79, -1, 0, 0, 15, 7319, 7321), + (7321, -1, -1, 6601, 6601, 6, 80, -1, 0, 0, 15, 7320, 7322), + (7322, -1, -1, 6601, 6601, 6, 81, -1, 0, 0, 15, 7321, 10025), + (7323, -1, -1, 7100, 7100, 6, 81, -1, 0, 0, 15, 7102, 7324), + (7324, -1, -1, 7100, 7100, 6, 82, -1, 0, 0, 15, 7323, 7325), + (7325, -1, -1, 7100, 7100, 6, 83, -1, 0, 0, 15, 7324, 8427), + (7326, -1, -1, 7103, 7103, 2, 70, -1, 0, 0, 15, 7105, 7327), + (7327, -1, -1, 7103, 7103, 2, 70, -1, 0, 0, 15, 7326, 7328), + (7328, -1, -1, 7103, 7103, 2, 70, -1, 0, 0, 15, 7327, 10750), + (7329, 534, 534, 534, 534, 7, 81, 16021, 4, 2160, 15, 5971, 7330), + (7330, 534, 534, 534, 534, 9, 83, 16022, 4, 2160, 15, 7329, 7331), + (7331, 534, 534, 534, 534, 12, 85, 16023, 4, 2160, 15, 7330, 10047), + (7332, 5095, 5095, 5095, 5095, 7, 81, 16024, 10, 900, 15, 5977, 7333), + (7333, 5095, 5095, 5095, 5095, 9, 83, 16025, 10, 900, 15, 7332, 7334), + (7334, 5095, 5095, 5095, 5095, 12, 85, 16026, 10, 900, 15, 7333, 10640), + (7335, 5984, 5984, 5984, 5984, 12, 85, 16027, 2, 30, 15, 5984, 7710), + (7336, -1, -1, 6395, 6395, 7, 81, -1, 0, 0, 15, 6397, 7337), + (7337, -1, -1, 6395, 6395, 7, 82, -1, 0, 0, 15, 7336, 7338), + (7338, -1, -1, 6395, 6395, 7, 83, -1, 0, 0, 15, 7337, 10050), + (7339, 188, 188, 188, 188, 9, 78, 16020, 2, 30, 14, 5044, 7662), + (7340, 7850, 7850, 7850, 7850, 8, 81, 16028, 39, 4320, 0, 7865, 10618), + (7341, 5007, 5007, 5007, 5007, 9, 81, 16047, 8, 2160, 15, 6427, 7342), + (7342, 5007, 5007, 5007, 5007, 9, 83, 16048, 8, 2160, 15, 7341, 7343), + (7343, 5007, 5007, 5007, 5007, 9, 85, 16049, 8, 2160, 15, 7342, 10061), + (7344, 545, 545, 545, 545, 7, 81, 16038, 3, 900, 15, 6002, 7345), + (7345, 545, 545, 545, 545, 9, 83, 16039, 3, 900, 15, 7344, 7346), + (7346, 545, 545, 545, 545, 12, 85, 16040, 3, 900, 15, 7345, 10758), + (7347, 1345, 1345, 1345, 1345, 8, 82, 16041, 6, 900, 15, 6010, 7348), + (7348, 1345, 1345, 1345, 1345, 9, 83, 16042, 6, 900, 15, 7347, 7349), + (7349, 1345, 1345, 1345, 1345, 10, 84, 16043, 6, 900, 15, 7348, 10740), + (7350, 6370, 6370, 6370, 6370, 6, 81, 16044, 7, 600, 15, 6372, 7351), + (7351, 6370, 6370, 6370, 6370, 6, 82, 16045, 7, 600, 15, 7350, 7352), + (7352, 6370, 6370, 6370, 6370, 6, 83, 16046, 7, 600, 15, 7351, 14112), + (7353, -1, -1, 864, 864, 6, 85, -1, 0, 0, 15, 6013, 7354), + (7354, -1, -1, 864, 864, 6, 85, -1, 0, 0, 15, 7353, 7355), + (7355, -1, -1, 864, 864, 6, 85, -1, 0, 0, 15, 7354, -1), + (7356, -1, -1, 5248, 5248, 7, 81, -1, 0, 0, 15, 6016, 7357), + (7357, -1, -1, 5248, 5248, 9, 83, -1, 0, 0, 15, 7356, 7358), + (7358, -1, -1, 5248, 5248, 12, 85, -1, 0, 0, 15, 7357, 16170), + (7359, -1, -1, 644, 644, 7, 79, -1, 0, 0, 15, 6019, 7360), + (7360, -1, -1, 644, 644, 9, 81, -1, 0, 0, 15, 7359, 7361), + (7361, -1, -1, 644, 644, 12, 83, -1, 0, 0, 15, 7360, 13092), + (7362, -1, -1, 867, 867, 5, 70, -1, 0, 0, 15, 871, 7363), + (7363, -1, -1, 867, 867, 5, 70, -1, 0, 0, 15, 7362, 7364), + (7364, -1, -1, 867, 867, 5, 70, -1, 0, 0, 15, 7363, 7365), + (7365, -1, -1, 867, 867, 5, 70, -1, 0, 0, 15, 7364, 7366), + (7366, -1, -1, 867, 867, 5, 70, -1, 0, 0, 15, 7365, 10748), + (7367, 872, 872, 872, 872, 3, 70, 16032, 5, 180, 15, 874, 7368), + (7368, 872, 872, 872, 872, 6, 70, 16033, 5, 180, 15, 7367, 7369), + (7369, 872, 872, 872, 872, 9, 70, 16034, 5, 180, 15, 7368, 10772), + (7370, 875, 875, 875, 875, 3, 70, 16035, 5, 180, 15, 877, 7371), + (7371, 875, 875, 875, 875, 6, 73, 16036, 5, 180, 15, 7370, 7372), + (7372, 875, 875, 875, 875, 9, 75, 16037, 5, 180, 15, 7371, 10775), + (7373, -1, -1, 6546, 6546, 0, 81, -1, 0, 0, 15, 6571, 7374), + (7374, -1, -1, 6546, 6546, 0, 82, -1, 0, 0, 15, 7373, 7375), + (7375, -1, -1, 6546, 6546, 0, 83, -1, 0, 0, 15, 7374, 7376), + (7376, -1, -1, 6546, 6546, 0, 84, -1, 0, 0, 15, 7375, 7377), + (7377, -1, -1, 6546, 6546, 0, 85, -1, 0, 0, 15, 7376, 13122), + (7378, -1, -1, 1608, 1608, 3, 71, -1, 0, 0, 15, 4991, 7379), + (7379, -1, -1, 1608, 1608, 6, 73, -1, 0, 0, 15, 7378, 7380), + (7380, -1, -1, 1608, 1608, 9, 75, -1, 0, 0, 15, 7379, 7381), + (7381, -1, -1, 1608, 1608, 6, 76, -1, 0, 0, 15, 7380, 7382), + (7382, -1, -1, 1608, 1608, 6, 78, -1, 0, 0, 15, 7381, 7383), + (7383, -1, -1, 1608, 1608, 6, 80, -1, 0, 0, 15, 7382, 10064), + (7384, -1, -1, 5085, 5085, 6, 81, -1, 0, 0, 15, 6408, 7385), + (7385, -1, -1, 5085, 5085, 6, 83, -1, 0, 0, 15, 7384, 7386), + (7386, -1, -1, 5085, 5085, 6, 85, -1, 0, 0, 15, 7385, 10383), + (7387, 6508, 6508, 6508, 6508, 7, 79, 16059, 38, 600, 15, 6510, 7388), + (7388, 6508, 6508, 6508, 6508, 7, 81, 16060, 38, 600, 15, 7387, 7389), + (7389, 6508, 6508, 6508, 6508, 7, 83, 16061, 38, 600, 15, 7388, 10078), + (7390, -1, -1, 589, 589, 7, 81, -1, 0, 0, 15, 6065, 7391), + (7391, -1, -1, 589, 589, 7, 83, -1, 0, 0, 15, 7390, 7392), + (7392, -1, -1, 589, 589, 7, 85, -1, 0, 0, 15, 7391, 7707), + (7393, -1, -1, 1313, 1313, 7, 81, -1, 0, 0, 15, 6071, 7394), + (7394, -1, -1, 1313, 1313, 7, 81, -1, 0, 0, 15, 7393, 7395), + (7395, -1, -1, 1313, 1313, 8, 82, -1, 0, 0, 15, 7394, 7396), + (7396, -1, -1, 1313, 1313, 9, 83, -1, 0, 0, 15, 7395, 7397), + (7397, -1, -1, 1313, 1313, 10, 84, -1, 0, 0, 15, 7396, 7398), + (7398, -1, -1, 1313, 1313, 12, 85, -1, 0, 0, 15, 7397, 10081), + (7399, -1, -1, 210, 210, 8, 82, -1, 0, 0, 15, 6074, 7400), + (7400, -1, -1, 210, 210, 9, 83, -1, 0, 0, 15, 7399, 7401), + (7401, -1, -1, 210, 210, 10, 84, -1, 0, 0, 15, 7400, 15172), + (7402, -1, -1, 895, 895, 7, 81, -1, 0, 0, 15, 6079, 7403), + (7403, -1, -1, 895, 895, 8, 82, -1, 0, 0, 15, 7402, 7404), + (7404, -1, -1, 895, 895, 9, 83, -1, 0, 0, 15, 7403, 7405), + (7405, -1, -1, 895, 895, 10, 84, -1, 0, 0, 15, 7404, 7406), + (7406, -1, -1, 895, 895, 12, 85, -1, 0, 0, 15, 7405, 10906), + (7407, -1, -1, 7407, 7407, 12, 85, 0, 0, 0, 16, -1, -1), + (7408, 1498, 1498, 1498, 1498, 7, 81, 16075, 12, 1320, 15, 5821, 7409), + (7409, 1498, 1498, 1498, 1498, 9, 83, 16076, 12, 1320, 15, 7408, 7410), + (7410, 1498, 1498, 1498, 1498, 12, 85, 16077, 12, 1320, 15, 7409, 10090), + (7411, 757, -1, 757, 757, 7, 81, 16078, 6, 1800, 15, 5824, 7412), + (7412, 757, -1, 757, 757, 9, 83, 16079, 6, 1800, 15, 7411, 7413), + (7413, 757, -1, 757, 757, 12, 85, 16080, 6, 1800, 15, 7412, 12658), + (7414, 1495, 1495, 1495, 1495, 7, 81, 16081, 30, 900, 15, 5828, 7415), + (7415, 1495, 1495, 1495, 1495, 9, 83, 16082, 30, 900, 15, 7414, 7416), + (7416, 1495, 1495, 1495, 1495, 12, 85, 16083, 30, 900, 15, 7415, 10093), + (7417, 548, 548, 548, 548, 8, 82, 16084, 5, 900, 15, 5831, 7418), + (7418, 548, 548, 548, 548, 9, 83, 16085, 5, 900, 15, 7417, 7419), + (7419, 548, 548, 548, 548, 10, 84, 16086, 5, 900, 15, 7418, 10096), + (7420, 5105, 5105, 5105, 5105, 12, 85, 16087, 11, 600, 15, 5832, 10509), + (7421, 6232, 6232, 6232, 6232, 12, 85, 16091, 18, 900, 15, 6232, -1), + (7422, 6561, 6561, 6561, 6561, 7, 81, 16088, 32, 30, 15, 6280, 7423), + (7423, 6561, 6561, 6561, 6561, 7, 81, 16089, 32, 30, 15, 7422, 7424), + (7424, 6561, 6561, 6561, 6561, 7, 81, 16090, 32, 30, 15, 7423, 10099), + (7425, 510, 510, 510, 510, 3, 66, 16072, 37, 240, 15, 512, 7426), + (7426, 510, 510, 510, 510, 3, 68, 16073, 37, 240, 15, 7425, 7427), + (7427, 510, 510, 510, 510, 3, 70, 16074, 37, 240, 15, 7426, 10102), + (7428, 6533, 6533, 6533, 6533, 10, 84, 13785, 15, 600, 15, 6200, 10139), + (7429, 6534, 6534, 6534, 6534, 9, 83, 13777, 16, 900, 15, 6201, 13524), + (7430, 1116, 1116, 1116, 1116, 7, 81, 13762, 4, 2160, 15, 5701, 7431), + (7431, 1116, 1116, 1116, 1116, 9, 83, 13763, 4, 2160, 15, 7430, 7432), + (7432, 1116, 1116, 1116, 1116, 12, 85, 13764, 4, 2160, 15, 7431, 10140), + (7433, 592, 592, 592, 592, 5, 81, 13765, 2, 18, 15, 5706, 7434), + (7434, 592, 592, 592, 592, 5, 82, 13766, 2, 18, 15, 7433, 7435), + (7435, 592, 592, 592, 592, 5, 83, 13767, 2, 18, 15, 7434, 7436), + (7436, 592, 592, 592, 592, 5, 84, 13768, 2, 18, 15, 7435, 7437), + (7437, 592, 592, 592, 592, 5, 85, 13769, 2, 18, 15, 7436, 12749), + (7438, 5298, 5298, 5298, 5298, 9, 83, 13770, 32, 1800, 15, 5709, 7439), + (7439, 5298, 5298, 5298, 5298, 10, 84, 13771, 32, 1800, 15, 7438, 7440), + (7440, 5298, 5298, 5298, 5298, 12, 85, 13772, 32, 1800, 15, 7439, 10143), + (7441, 1598, -1, 1598, 1598, 7, 81, 13773, 6, 900, 15, 5712, 7442), + (7442, 1598, -1, 1598, 1598, 9, 83, 13774, 6, 900, 15, 7441, 7443), + (7443, 1598, -1, 1598, 1598, 12, 85, 13775, 6, 900, 15, 7442, 10146), + (7444, 5020, 5020, 5020, 5020, 9, 82, 13776, 9, 300, 15, 5716, 10149), + (7445, 1110, 1110, 1110, 1110, 6, 78, 13778, 3, 2160, 15, 6402, 7446), + (7446, 1110, 1110, 1110, 1110, 6, 80, 13779, 3, 2160, 15, 7445, 7447), + (7447, 1110, 1110, 1110, 1110, 6, 81, 13780, 3, 2160, 15, 7446, 10150), + (7448, -1, -1, 6337, 6337, 6, 79, -1, 0, 0, 15, 6339, 7449), + (7449, -1, -1, 6337, 6337, 6, 81, -1, 0, 0, 15, 7448, 7450), + (7450, -1, -1, 6337, 6337, 6, 83, -1, 0, 0, 15, 7449, 10153), + (7451, -1, -1, 6340, 6340, 6, 79, -1, 0, 0, 15, 6342, 7452), + (7452, -1, -1, 6340, 6340, 6, 81, -1, 0, 0, 15, 7451, 7453), + (7453, -1, -1, 6340, 6340, 6, 83, -1, 0, 0, 15, 7452, 16306), + (7454, 5017, 5017, 5017, 5017, 3, 76, 13759, 8, 600, 15, 5019, 7455), + (7455, 5017, 5017, 5017, 5017, 6, 78, 13760, 8, 600, 15, 7454, 7456), + (7456, 5017, 5017, 5017, 5017, 9, 80, 13761, 8, 600, 15, 7455, 10156), + (7457, 1569, 1569, 1569, 1569, 7, 82, 13756, 5, 1800, 15, 5715, 7458), + (7458, 1569, 1569, 1569, 1569, 7, 83, 13757, 5, 1800, 15, 7457, 7459), + (7459, 1569, 1569, 1569, 1569, 7, 85, 13758, 5, 1800, 15, 7458, 10159), + (7460, 1327, 1327, 1327, 1327, 7, 81, 13792, 10, 900, 15, 6100, 7461), + (7461, 1327, 1327, 1327, 1327, 9, 83, 13793, 10, 900, 15, 7460, 7462), + (7462, 1327, 1327, 1327, 1327, 12, 85, 13794, 10, 900, 15, 7461, 10187), + (7463, 1520, 1520, 1520, 1520, 9, 75, 13801, 11, 900, 15, 6451, 7464), + (7464, 1520, 1520, 1520, 1520, 9, 75, 13802, 11, 900, 15, 7463, 7465), + (7465, 1520, 1520, 1520, 1520, 9, 75, 13803, 11, 900, 15, 7464, 10190), + (7466, 146, 146, 146, 146, 8, 82, 13796, 2, 180, 15, 6102, 7691), + (7467, 5109, 5109, 5109, 5109, 9, 82, 13800, 0, 1, 15, 6448, 13016), + (7468, 153, 153, 153, 153, 12, 85, 13795, 3, 2160, 15, 6101, 10193), + (7469, 528, 528, 528, 528, 7, 81, 13797, 5, 720, 15, 6105, 7470), + (7470, 528, 528, 528, 528, 9, 83, 13798, 5, 720, 15, 7469, 7471), + (7471, 528, 528, 528, 528, 12, 85, 13799, 5, 720, 15, 7470, 10194), + (7472, 5251, 5251, 5251, 5251, 7, 81, 13786, 13, 900, 15, 6094, 7473), + (7473, 5251, 5251, 5251, 5251, 9, 83, 13787, 13, 900, 15, 7472, 7474), + (7474, 5251, 5251, 5251, 5251, 12, 85, 13788, 13, 900, 15, 7473, 10197), + (7475, 513, 513, 513, 513, 7, 81, 13789, 4, 120, 15, 6097, 7476), + (7476, 513, 513, 513, 513, 9, 83, 13790, 4, 120, 15, 7475, 7477), + (7477, 513, 513, 513, 513, 12, 85, 13791, 4, 120, 15, 7476, -1), + (7478, -1, -1, 6538, 6538, 12, 85, -1, 0, 0, 15, 6211, 15421), + (7479, 1119, 1119, 1119, 1119, 7, 83, 13805, 8, 900, 15, 5736, 7480), + (7480, 1119, 1119, 1119, 1119, 8, 84, 13806, 8, 900, 15, 7479, 7481), + (7481, 1119, 1119, 1119, 1119, 9, 85, 13807, 8, 900, 15, 7480, 10297), + (7482, 723, 723, 723, 723, 7, 81, 13808, 6, 30, 15, 5737, 10300), + (7483, 5015, 5015, 5015, 5015, 12, 85, 13809, 9, 900, 15, 5741, 10301), + (7484, 289, 289, 289, 289, 12, 85, 13810, 3, 300, 15, 5742, -1), + (7485, 291, 291, 291, 291, 9, 83, 13811, 5, 900, 15, 5745, 7486), + (7486, 291, 291, 291, 291, 10, 84, 13812, 5, 900, 15, 7485, 7487), + (7487, 291, 291, 291, 291, 12, 85, 13813, 5, 900, 15, 7486, 10302), + (7488, 6218, 6218, 6218, 6218, 7, 81, 13814, 0, 1, 15, 6218, 14272), + (7489, -1, -1, 724, 724, 7, 81, -1, 0, 0, 15, 5733, 7490), + (7490, -1, -1, 724, 724, 8, 82, -1, 0, 0, 15, 7489, 7491), + (7491, -1, -1, 724, 724, 9, 83, -1, 0, 0, 15, 7490, 7492), + (7492, -1, -1, 724, 724, 10, 84, -1, 0, 0, 15, 7491, 7493), + (7493, -1, -1, 724, 724, 12, 85, -1, 0, 0, 15, 7492, 16890), + (7494, -1, -1, 729, 729, 7, 81, -1, 0, 0, 15, 5740, 7495), + (7495, -1, -1, 729, 729, 8, 82, -1, 0, 0, 15, 7494, 7496), + (7496, -1, -1, 729, 729, 9, 83, -1, 0, 0, 15, 7495, 10305), + (7497, 6380, 6380, 6380, 6380, 6, 83, 13815, 39, 120, 15, 6382, 7498), + (7498, 6380, 6380, 6380, 6380, 6, 84, 13816, 39, 120, 15, 7497, 7499), + (7499, 6380, 6380, 6380, 6380, 6, 85, 13817, 39, 120, 15, 7498, 10308), + (7500, -1, -1, 4699, 4699, 5, 61, -1, 0, 0, 15, 6540, 10788), + (7501, -1, -1, 125, 125, 6, 81, -1, 0, 0, 15, 5523, 7502), + (7502, -1, -1, 125, 125, 7, 82, -1, 0, 0, 15, 7501, 7503), + (7503, -1, -1, 125, 125, 8, 83, -1, 0, 0, 15, 7502, 7504), + (7504, -1, -1, 125, 125, 9, 84, -1, 0, 0, 15, 7503, 7505), + (7505, -1, -1, 125, 125, 10, 85, -1, 0, 0, 15, 7504, 12396), + (7506, -1, -1, 122, 122, 6, 81, -1, 0, 0, 15, 5528, 7507), + (7507, -1, -1, 122, 122, 7, 82, -1, 0, 0, 15, 7506, 7508), + (7508, -1, -1, 122, 122, 8, 83, -1, 0, 0, 15, 7507, 7509), + (7509, -1, -1, 122, 122, 9, 84, -1, 0, 0, 15, 7508, 7510), + (7510, -1, -1, 122, 122, 10, 85, -1, 0, 0, 15, 7509, 12401), + (7511, -1, -1, 1026, 1026, 5, 81, -1, 0, 0, 15, 6527, 7512), + (7512, -1, -1, 1026, 1026, 5, 82, -1, 0, 0, 15, 7511, 7513), + (7513, -1, -1, 1026, 1026, 5, 83, -1, 0, 0, 15, 7512, 7514), + (7514, -1, -1, 1026, 1026, 5, 84, -1, 0, 0, 15, 7513, 7515), + (7515, -1, -1, 1026, 1026, 5, 85, -1, 0, 0, 15, 7514, 7886), + (7516, -1, -1, 1006, 1006, 5, 71, -1, 0, 0, 15, 1010, 7517), + (7517, -1, -1, 1006, 1006, 5, 72, -1, 0, 0, 15, 7516, 7518), + (7518, -1, -1, 1006, 1006, 5, 73, -1, 0, 0, 15, 7517, 7519), + (7519, -1, -1, 1006, 1006, 5, 74, -1, 0, 0, 15, 7518, 7520), + (7520, -1, -1, 1006, 1006, 5, 75, -1, 0, 0, 15, 7519, 7837), + (7521, -1, -1, 1056, 1056, 5, 81, -1, 0, 0, 15, 6435, 7522), + (7522, -1, -1, 1056, 1056, 5, 82, -1, 0, 0, 15, 7521, 7523), + (7523, -1, -1, 1056, 1056, 5, 83, -1, 0, 0, 15, 7522, 7524), + (7524, -1, -1, 1056, 1056, 5, 84, -1, 0, 0, 15, 7523, 7525), + (7525, -1, -1, 1056, 1056, 5, 85, -1, 0, 0, 15, 7524, 16414), + (7526, -1, -1, 6119, 6119, 6, 81, -1, 0, 0, 15, 6123, 7527), + (7527, -1, -1, 6119, 6119, 6, 82, -1, 0, 0, 15, 7526, 7528), + (7528, -1, -1, 6119, 6119, 6, 83, -1, 0, 0, 15, 7527, 7529), + (7529, -1, -1, 6119, 6119, 6, 84, -1, 0, 0, 15, 7528, 7530), + (7530, -1, -1, 6119, 6119, 6, 85, -1, 0, 0, 15, 7529, 12406), + (7534, -1, -1, 65, 661, 3, 81, -1, 0, 0, 15, 6394, 7535), + (7535, -1, -1, 65, 661, 3, 82, -1, 0, 0, 15, 7534, 7536), + (7536, -1, -1, 65, 661, 3, 83, -1, 0, 0, 15, 7535, 7537), + (7537, -1, -1, 65, 661, 3, 84, -1, 0, 0, 15, 7536, 7538), + (7538, -1, -1, 65, 661, 3, 85, -1, 0, 0, 15, 7537, 7904), + (7539, -1, -1, 1021, 1021, 5, 80, -1, 0, 0, 16, 6522, 7540), + (7540, -1, -1, 1021, 1021, 5, 85, -1, 0, 0, 16, 7539, 7683), + (7541, -1, -1, 107, 107, 2, 60, -1, 0, 0, 15, 109, 7542), + (7542, -1, -1, 107, 107, 4, 60, -1, 0, 0, 15, 7541, 7543), + (7543, -1, -1, 107, 107, 6, 60, -1, 0, 0, 15, 7542, -1), + (7544, -1, -1, 678, 678, 3, 70, -1, 0, 0, 15, 6520, 7545), + (7545, -1, -1, 678, 678, 3, 70, -1, 0, 0, 15, 7544, 7546), + (7546, -1, -1, 678, 678, 3, 70, -1, 0, 0, 15, 7545, -1), + (7547, -1, -1, 418, 418, 5, 76, -1, 0, 0, 15, 4682, 7548), + (7548, -1, -1, 418, 418, 5, 77, -1, 0, 0, 15, 7547, 7549), + (7549, -1, -1, 418, 418, 5, 78, -1, 0, 0, 15, 7548, 7550), + (7550, -1, -1, 418, 418, 5, 79, -1, 0, 0, 15, 7549, 7551), + (7551, -1, -1, 418, 418, 5, 80, -1, 0, 0, 15, 7550, -1), + (7553, -1, -1, 1071, 1071, 6, 80, -1, 0, 0, 16, 4764, 7681), + (7554, -1, -1, 1486, 1486, 7, 81, -1, 0, 0, 15, 5533, 7555), + (7555, -1, -1, 1486, 1486, 8, 82, -1, 0, 0, 15, 7554, 7556), + (7556, -1, -1, 1486, 1486, 9, 83, -1, 0, 0, 15, 7555, 7557), + (7557, -1, -1, 1486, 1486, 10, 84, -1, 0, 0, 15, 7556, 7558), + (7558, -1, -1, 1486, 1486, 12, 85, -1, 0, 0, 15, 7557, 7722), + (7559, -1, -1, 599, 599, 9, 83, -1, 0, 0, 15, 5536, 7560), + (7560, -1, -1, 599, 599, 10, 84, -1, 0, 0, 15, 7559, 7561), + (7561, -1, -1, 599, 599, 12, 85, -1, 0, 0, 15, 7560, 13026), + (7562, -1, -1, 1041, 1041, 7, 81, -1, 0, 0, 15, 5544, 7563), + (7563, -1, -1, 1041, 1041, 9, 83, -1, 0, 0, 15, 7562, 7564), + (7564, -1, -1, 1041, 1041, 12, 85, -1, 0, 0, 15, 7563, 12697), + (7565, -1, -1, 119, 119, 7, 81, -1, 0, 0, 15, 5556, 7566), + (7566, -1, -1, 119, 119, 9, 83, -1, 0, 0, 15, 7565, 7567), + (7567, -1, -1, 119, 119, 12, 85, -1, 0, 0, 15, 7566, 6023), + (7568, -1, -1, 1592, 1592, 7, 81, -1, 0, 0, 15, 5561, 7569), + (7569, -1, -1, 1592, 1592, 8, 82, -1, 0, 0, 15, 7568, 7570), + (7570, -1, -1, 1592, 1592, 9, 83, -1, 0, 0, 15, 7569, 7571), + (7571, -1, -1, 1592, 1592, 10, 84, -1, 0, 0, 15, 7570, 7572), + (7572, -1, -1, 1592, 1592, 12, 85, -1, 0, 0, 15, 7571, 12439), + (7573, -1, -1, 4739, 4739, 7, 81, -1, 0, 0, 15, 5564, 7574), + (7574, -1, -1, 4739, 4739, 9, 83, -1, 0, 0, 15, 7573, 7575), + (7575, -1, -1, 4739, 4739, 12, 85, -1, 0, 0, 15, 7574, -1), + (7576, -1, -1, 1072, 1072, 7, 81, -1, 0, 0, 15, 5570, 7577), + (7577, -1, -1, 1072, 1072, 8, 82, -1, 0, 0, 15, 7576, 7578), + (7578, -1, -1, 1072, 1072, 9, 83, -1, 0, 0, 15, 7577, 7579), + (7579, -1, -1, 1072, 1072, 10, 84, -1, 0, 0, 15, 7578, 7580), + (7580, -1, -1, 1072, 1072, 12, 85, -1, 0, 0, 15, 7579, 12444), + (7581, -1, -1, 1210, 1213, 7, 81, -1, 0, 0, 15, 5579, 7582), + (7582, -1, -1, 1210, 1213, 9, 83, -1, 0, 0, 15, 7581, 7583), + (7583, -1, -1, 1210, 1213, 12, 85, -1, 0, 0, 15, 7582, 8344), + (7584, -1, -1, 98, 98, 7, 81, -1, 0, 0, 15, 5588, 7585), + (7585, -1, -1, 98, 98, 9, 83, -1, 0, 0, 15, 7584, 7586), + (7586, -1, -1, 98, 98, 12, 85, -1, 0, 0, 15, 7585, 11061), + (7587, -1, -1, 1186, 1186, 7, 81, -1, 0, 0, 15, 5591, 7588), + (7588, -1, -1, 1186, 1186, 9, 83, -1, 0, 0, 15, 7587, 7589), + (7589, -1, -1, 1186, 1186, 12, 85, -1, 0, 0, 15, 7588, 7692), + (7590, -1, -1, 80, 80, 7, 81, -1, 0, 0, 15, 5594, 7591), + (7591, -1, -1, 80, 80, 9, 83, -1, 0, 0, 15, 7590, 7592), + (7592, -1, -1, 80, 80, 12, 85, -1, 0, 0, 15, 7591, 12452), + (7593, -1, -1, 658, 658, 5, 81, -1, 0, 0, 15, 5627, 7594), + (7594, -1, -1, 658, 658, 5, 82, -1, 0, 0, 15, 7593, 7595), + (7595, -1, -1, 658, 658, 5, 83, -1, 0, 0, 15, 7594, 7596), + (7596, -1, -1, 658, 658, 5, 84, -1, 0, 0, 15, 7595, 7597), + (7597, -1, -1, 658, 658, 5, 85, -1, 0, 0, 15, 7596, 12455), + (7598, -1, -1, 98, 738, 7, 81, -1, 0, 0, 15, 5630, 7599), + (7599, -1, -1, 98, 738, 9, 83, -1, 0, 0, 15, 7598, 7600), + (7600, -1, -1, 98, 738, 12, 85, -1, 0, 0, 15, 7599, 13924), + (7601, -1, -1, 6051, 6051, 3, 81, -1, 0, 0, 15, 6053, 7602), + (7602, -1, -1, 6051, 6051, 3, 83, -1, 0, 0, 15, 7601, 7603), + (7603, -1, -1, 6051, 6051, 3, 85, -1, 0, 0, 15, 7602, 10604), + (7604, -1, -1, 683, 683, 5, 80, -1, 0, 0, 15, 6081, 7605), + (7605, -1, -1, 683, 683, 5, 80, -1, 0, 0, 15, 7604, 12694), + (7606, 6537, 6537, 6537, 6537, 7, 81, 13821, 30, 900, 15, 6208, 7607), + (7607, 6537, 6537, 6537, 6537, 8, 82, 13822, 30, 900, 15, 7606, 7608), + (7608, 6537, 6537, 6537, 6537, 9, 83, 13823, 30, 900, 15, 7607, 12460), + (7609, 6539, 6539, 6539, 6539, 6, 76, 13824, 18, 1800, 15, 6214, 7610), + (7610, 6539, 6539, 6539, 6539, 6, 79, 13825, 18, 1800, 15, 7609, 7611), + (7611, 6539, 6539, 6539, 6539, 6, 82, 13826, 18, 1800, 15, 7610, 12942), + (7612, -1, -1, 270, 665, 2, 66, -1, 0, 0, 15, 670, 7613), + (7613, -1, -1, 270, 665, 2, 67, -1, 0, 0, 15, 7612, 7614), + (7614, -1, -1, 270, 665, 2, 68, -1, 0, 0, 15, 7613, -1), + (7615, -1, -1, 6346, 6346, 6, 79, -1, 0, 0, 15, 6348, 7616), + (7616, -1, -1, 6346, 6346, 6, 81, -1, 0, 0, 15, 7615, 7617), + (7617, -1, -1, 6346, 6346, 6, 83, -1, 0, 0, 15, 7616, 15397), + (7618, -1, -1, 6349, 6349, 6, 79, -1, 0, 0, 15, 6351, 7619), + (7619, -1, -1, 6349, 6349, 6, 81, -1, 0, 0, 15, 7618, 7620), + (7620, -1, -1, 6349, 6349, 6, 83, -1, 0, 0, 15, 7619, 11053), + (7621, -1, -1, 1435, 4773, 9, 81, -1, 0, 0, 15, 6517, 13090), + (7622, -1, -1, 446, 735, 8, 81, -1, 0, 0, 15, 7065, 7623), + (7623, -1, -1, 446, 735, 8, 82, -1, 0, 0, 15, 7622, 7624), + (7624, -1, -1, 446, 735, 8, 83, -1, 0, 0, 15, 7623, 10473), + (7625, -1, -1, 735, 735, 8, 81, -1, 0, 0, 15, 7068, 7626), + (7626, -1, -1, 735, 735, 8, 82, -1, 0, 0, 15, 7625, 7627), + (7627, -1, -1, 735, 735, 8, 83, -1, 0, 0, 15, 7626, 10632), + (7628, -1, -1, 807, 807, 5, 81, -1, 0, 0, 15, 5924, 7629), + (7629, -1, -1, 807, 807, 5, 83, -1, 0, 0, 15, 7628, 7630), + (7630, -1, -1, 807, 807, 5, 85, -1, 0, 0, 15, 7629, 12685), + (7631, -1, -1, 255, 255, 7, 81, -1, 0, 0, 15, 5597, 7632), + (7632, -1, -1, 255, 255, 9, 83, -1, 0, 0, 15, 7631, 7633), + (7633, -1, -1, 255, 255, 12, 85, -1, 0, 0, 15, 7632, 17441), + (7634, -1, -1, 815, 815, 9, 83, -1, 0, 0, 15, 5913, 7635), + (7635, -1, -1, 815, 815, 10, 84, -1, 0, 0, 15, 7634, 7636), + (7636, -1, -1, 815, 815, 12, 85, -1, 0, 0, 15, 7635, 15441), + (7637, -1, -1, 1616, 1616, 5, 83, -1, 0, 0, 15, 6007, 7638), + (7638, -1, -1, 1616, 1616, 5, 84, -1, 0, 0, 15, 7637, 7639), + (7639, -1, -1, 1616, 1616, 5, 85, -1, 0, 0, 15, 7638, -1), + (7640, -1, -1, 686, 686, 5, 60, -1, 0, 0, 15, 690, 12438), + (7641, -1, -1, 625, 625, 3, 76, -1, 0, 0, 15, 4735, 7642), + (7642, -1, -1, 625, 625, 3, 78, -1, 0, 0, 15, 7641, 7643), + (7643, -1, -1, 625, 625, 3, 80, -1, 0, 0, 15, 7642, -1), + (7644, -1, -1, 6375, 6375, 6, 81, -1, 0, 0, 15, 6377, 7645), + (7645, -1, -1, 6375, 6375, 6, 82, -1, 0, 0, 15, 7644, 7646), + (7646, -1, -1, 6375, 6375, 6, 83, -1, 0, 0, 15, 7645, 7663), + (7647, -1, -1, 692, 692, 6, 60, -1, 0, 0, 15, 694, 7648), + (7648, -1, -1, 692, 692, 6, 60, -1, 0, 0, 15, 7647, 7649), + (7649, -1, -1, 692, 692, 6, 60, -1, 0, 0, 15, 7648, 7670), + (7650, -1, -1, 1044, 1044, 7, 81, -1, 0, 0, 15, 5547, 7651), + (7651, -1, -1, 1044, 1044, 9, 83, -1, 0, 0, 15, 7650, 7652), + (7652, -1, -1, 1044, 1044, 12, 85, -1, 0, 0, 15, 7651, 13074), + (7653, -1, -1, 1047, 1047, 7, 81, -1, 0, 0, 15, 5550, 7654), + (7654, -1, -1, 1047, 1047, 9, 83, -1, 0, 0, 15, 7653, 7655), + (7655, -1, -1, 1047, 1047, 12, 85, -1, 0, 0, 15, 7654, 13077), + (7656, -1, -1, 1050, 1050, 7, 81, -1, 0, 0, 15, 5553, 7657), + (7657, -1, -1, 1050, 1050, 9, 83, -1, 0, 0, 15, 7656, 7658), + (7658, -1, -1, 1050, 1050, 12, 85, -1, 0, 0, 15, 7657, 13023), + (7659, -1, -1, 754, 754, 3, 70, -1, 0, 0, 15, 756, 7660), + (7660, -1, -1, 754, 754, 6, 70, -1, 0, 0, 15, 7659, 7661), + (7661, -1, -1, 754, 754, 9, 70, -1, 0, 0, 15, 7660, -1), + (7662, 188, 188, 188, 188, 9, 83, 16431, 2, 30, 15, 7339, 10647), + (7663, -1, -1, 6375, 6375, 6, 83, -1, 0, 0, 15, 7646, 10084), + (7664, -1, -1, 7664, 7664, 2, 73, -1, 0, 0, 15, -1, 7665), + (7665, -1, -1, 7664, 7664, 2, 74, -1, 0, 0, 15, 7664, 7666), + (7666, -1, -1, 7664, 7664, 2, 75, -1, 0, 0, 15, 7665, 7667), + (7667, -1, -1, 7664, 7664, 2, 76, -1, 0, 0, 15, 7666, 7668), + (7668, -1, -1, 7664, 7664, 2, 77, -1, 0, 0, 15, 7667, 10105), + (7669, 7669, 7669, 7669, 7669, 3, 81, 13838, 35, 5, 15, -1, -1), + (7670, -1, -1, 692, 692, 7, 75, -1, 0, 0, 16, 7649, 7671), + (7671, -1, -1, 692, 692, 9, 80, -1, 0, 0, 16, 7670, 7672), + (7672, -1, -1, 692, 692, 12, 85, -1, 0, 0, 16, 7671, 12767), + (7673, -1, -1, 855, 855, 5, 75, -1, 0, 0, 16, 859, 7674), + (7674, -1, -1, 855, 855, 5, 75, -1, 0, 0, 16, 7673, 7675), + (7675, -1, -1, 855, 855, 5, 75, -1, 0, 0, 16, 7674, 7676), + (7676, -1, -1, 855, 855, 5, 75, -1, 0, 0, 16, 7675, 7677), + (7677, -1, -1, 855, 855, 5, 75, -1, 0, 0, 16, 7676, 10688), + (7678, -1, -1, 852, 852, 9, 81, -1, 0, 0, 16, 5502, 7679), + (7679, -1, -1, 852, 852, 10, 83, -1, 0, 0, 16, 7678, 7680), + (7680, -1, -1, 852, 852, 12, 85, -1, 0, 0, 16, 7679, 12576), + (7681, -1, -1, 1071, 1071, 6, 80, -1, 0, 0, 16, 7553, -1), + (7682, -1, -1, 4861, 4861, 12, 85, -1, 0, 0, 16, 7216, 12757), + (7683, -1, -1, 1021, 1021, 5, 85, -1, 0, 0, 16, 7540, 7684), + (7684, -1, -1, 1021, 1021, 5, 85, -1, 0, 0, 16, 7683, 7685), + (7685, -1, -1, 1021, 1021, 5, 85, -1, 0, 0, 16, 7684, 13894), + (7686, -1, -1, 4844, 4844, 5, 81, -1, 0, 0, 16, 7126, 7687), + (7687, -1, -1, 4844, 4844, 5, 83, -1, 0, 0, 16, 7686, 7688), + (7688, -1, -1, 4844, 4844, 5, 85, -1, 0, 0, 16, 7687, -1), + (7689, 7689, 7689, 7689, 7689, 12, 85, 21820, 94, 180, 16, -1, -1), + (7690, -1, -1, 7690, 7690, 12, 85, -1, 0, 0, 16, -1, -1), + (7691, 146, 146, 146, 146, 8, 85, 16862, 2, 180, 16, 7466, 13256), + (7692, -1, -1, 1186, 1186, 12, 85, -1, 0, 0, 16, 7589, 7693), + (7693, -1, -1, 1186, 1186, 12, 85, -1, 0, 0, 16, 7692, 7694), + (7694, -1, -1, 1186, 1186, 12, 85, -1, 0, 0, 16, 7693, 12564), + (7695, -1, -1, 7695, 7695, 6, 85, -1, 0, 0, 16, -1, 7696), + (7696, -1, -1, 7695, 7695, 6, 85, -1, 0, 0, 16, 7695, 7697), + (7697, -1, -1, 7695, 7695, 6, 85, -1, 0, 0, 16, 7696, -1), + (7698, 7698, 7698, 7698, 7698, 6, 85, 21763, 17, 6, 16, -1, -1), + (7699, -1, -1, 7699, 7699, 12, 85, 0, 0, 0, 16, -1, -1), + (7700, -1, -1, 255, 255, 7, 81, -1, 0, 0, 16, -1, 7701), + (7701, -1, -1, 255, 255, 9, 83, -1, 0, 0, 16, 7700, 7702), + (7702, -1, -1, 255, 255, 12, 85, -1, 0, 0, 16, 7701, 12610), + (7703, 7703, 7703, 7703, 7703, 12, 85, 21754, 16, 600, 16, -1, -1), + (7704, -1, -1, 8195, 8195, 5, 81, -1, 0, 0, 16, 8197, 7705), + (7705, -1, -1, 8195, 8195, 5, 83, -1, 0, 0, 16, 7704, 7706), + (7706, -1, -1, 8195, 8195, 5, 85, -1, 0, 0, 16, 7705, -1), + (7707, -1, -1, 589, 589, 7, 85, -1, 0, 0, 16, 7392, 7708), + (7708, -1, -1, 589, 589, 7, 85, -1, 0, 0, 16, 7707, 7709), + (7709, -1, -1, 589, 589, 7, 85, -1, 0, 0, 16, 7708, 13104), + (7710, 5984, 5984, 5984, 5984, 12, 85, 21679, 2, 30, 16, 7335, 7711), + (7711, 5984, 5984, 5984, 5984, 12, 85, 21680, 2, 30, 16, 7710, 10626), + (7712, 7712, 7712, 7712, 7712, 12, 85, 21682, 2, 30, 16, -1, 10646), + (7713, -1, -1, 634, 634, 12, 81, -1, 0, 0, 16, 5613, 7714), + (7714, -1, -1, 634, 634, 12, 83, -1, 0, 0, 16, 7713, 10778), + (7715, -1, -1, 7715, 7715, 5, 77, 0, 0, 0, 16, -1, 7716), + (7716, -1, -1, 7715, 7715, 5, 79, 0, 0, 0, 16, 7715, 7717), + (7717, -1, -1, 7715, 7715, 5, 81, 0, 0, 0, 16, 7716, 14314), + (7718, -1, -1, 574, 574, 3, 81, -1, 0, 0, 16, 576, -1), + (7722, -1, -1, 1486, 1486, 7, 86, -1, 0, 0, 17, 7558, 7723), + (7723, -1, -1, 1486, 1486, 8, 87, -1, 0, 0, 17, 7722, 7724), + (7724, -1, -1, 1486, 1486, 9, 88, -1, 0, 0, 17, 7723, 7725), + (7725, -1, -1, 1486, 1486, 10, 89, -1, 0, 0, 17, 7724, 7726), + (7726, -1, -1, 1486, 1486, 12, 90, -1, 0, 0, 17, 7725, 7842), + (7732, 7732, 7732, 7732, 7732, 0, 60, 7732, 34, 3600, 14, -1, -1), + (7733, -1, -1, 288, 288, 6, 65, -1, 0, 0, 14, -1, -1), + (7734, 7734, 7734, 7734, 7734, 0, 61, 7734, 34, 28800, 14, -1, -1), + (7735, 7735, 7735, 7735, 7735, 0, 51, 7731, 32, 3600, 9, -1, -1), + (7736, 7736, 7736, 7736, 7736, 0, 52, 7865, 32, 10800, 9, -1, -1), + (7737, 7737, 7737, 7737, 7737, 0, 53, 7733, 32, 10800, 9, -1, -1), + (7738, 7738, 7738, 7738, 7738, 0, 54, 7990, 32, 21600, 9, -1, -1), + (7739, 7739, 7739, 7739, 7739, 0, 65, 13064, 36, 3600, 0, -1, -1), + (7740, 7740, 7740, 7740, 7740, 0, 66, 13065, 36, 28800, 0, -1, -1), + (7741, 7741, 7741, 7741, 7741, 0, 70, 21854, 50, 3600, 0, -1, -1), + (7742, 7742, 7742, 7742, 7742, 0, 71, 21855, 50, 28800, 0, -1, -1), + (7743, -1, -1, 7743, 7743, 5, 61, -1, 0, 0, 16, -1, 7744), + (7744, -1, -1, 7743, 7743, 7, 61, -1, 0, 0, 16, 7743, 7745), + (7745, -1, -1, 7743, 7743, 9, 61, -1, 0, 0, 16, 7744, 10717), + (7746, -1, -1, 7746, 7746, 5, 85, -1, 0, 0, 16, -1, 7763), + (7747, 7747, 7747, 7747, 7747, 9, 85, 21790, 32, 180, 16, -1, -1), + (7748, -1, -1, 7748, 7748, 3, 81, -1, 0, 0, 16, -1, 7749), + (7749, -1, -1, 7748, 7748, 6, 83, -1, 0, 0, 16, 7748, 7750), + (7750, -1, -1, 7748, 7748, 9, 85, -1, 0, 0, 16, 7749, -1), + (7751, -1, -1, 7751, 7751, 5, 85, -1, 0, 0, 16, -1, 7752), + (7752, -1, -1, 7751, 7751, 5, 85, -1, 0, 0, 16, 7751, 7753), + (7753, -1, -1, 7751, 7751, 5, 85, -1, 0, 0, 16, 7752, 14132), + (7754, 7754, 7754, 7754, 7754, 9, 85, 21803, 0, 1, 16, -1, -1), + (7755, 7755, 7755, 7755, 7755, 9, 81, 21804, 53, 900, 16, -1, 15782), + (7756, 7756, 7756, 7756, 7756, 12, 85, 21805, 54, 120, 16, -1, -1), + (7757, -1, -1, 7757, 7757, 5, 85, -1, 0, 0, 16, -1, 7758), + (7758, -1, -1, 7757, 7757, 7, 85, -1, 0, 0, 16, 7757, 7759), + (7759, -1, -1, 7757, 7757, 9, 85, -1, 0, 0, 16, 7758, 12587), + (7760, -1, -1, 7760, 7760, 5, 85, -1, 0, 0, 16, -1, 7761), + (7761, -1, -1, 7760, 7760, 7, 85, -1, 0, 0, 16, 7760, 7762), + (7762, -1, -1, 7760, 7760, 9, 85, -1, 0, 0, 16, 7761, -1), + (7763, -1, -1, 7746, 7746, 5, 85, -1, 0, 0, 16, 7746, 7764), + (7764, -1, -1, 7746, 7746, 5, 85, -1, 0, 0, 16, 7763, -1), + (7765, -1, -1, 7765, 7765, 5, 86, 0, 0, 0, 17, -1, 7766), + (7766, -1, -1, 7765, 7765, 7, 87, 0, 0, 0, 17, 7765, 7767), + (7767, -1, -1, 7765, 7765, 9, 88, 0, 0, 0, 17, 7766, 7768), + (7768, -1, -1, 7765, 7765, 12, 89, 0, 0, 0, 17, 7767, 7769), + (7770, 131, 131, 131, 131, 9, 86, 27655, 4, 900, 17, 10018, 7771), + (7771, 131, 131, 131, 131, 12, 88, 27656, 4, 900, 17, 7770, 7772), + (7772, 131, 131, 131, 131, 15, 90, 27657, 4, 900, 17, 7771, 13374), + (7773, 7951, 7951, 7951, 7951, 9, 86, 27658, 61, 900, 17, 10040, 7774), + (7774, 7951, 7951, 7951, 7951, 9, 88, 27659, 61, 900, 17, 7773, 7775), + (7775, 7951, 7951, 7951, 7951, 9, 90, 27660, 61, 900, 17, 7774, 13377), + (7800, 7800, 7800, 7800, 7800, 0, 1, 13531, 39, 4320, 0, -1, 7801), + (7801, 7800, 7800, 7800, 7800, 0, 6, 13532, 39, 4320, 0, 7800, 7802), + (7802, 7800, 7800, 7800, 7800, 0, 11, 13533, 39, 4320, 0, 7801, 7803), + (7803, 7800, 7800, 7800, 7800, 0, 16, 13534, 39, 4320, 0, 7802, 7804), + (7804, 7800, 7800, 7800, 7800, 0, 21, 13535, 39, 4320, 0, 7803, 7805), + (7805, 7800, 7800, 7800, 7800, 0, 26, 13536, 39, 4320, 0, 7804, 7806), + (7806, 7800, 7800, 7800, 7800, 0, 31, 13537, 39, 4320, 0, 7805, 7807), + (7807, 7800, 7800, 7800, 7800, 0, 36, 13538, 39, 4320, 0, 7806, 7808), + (7808, 7800, 7800, 7800, 7800, 0, 41, 13539, 39, 4320, 0, 7807, 7809), + (7809, 7800, 7800, 7800, 7800, 0, 46, 13540, 39, 4320, 0, 7808, 7810), + (7810, 7800, 7800, 7800, 7800, 3, 51, 13541, 39, 4320, 0, 7809, 7811), + (7811, 7800, 7800, 7800, 7800, 4, 56, 13542, 39, 4320, 0, 7810, 7812), + (7812, 7800, 7800, 7800, 7800, 5, 61, 13543, 39, 4320, 0, 7811, 7813), + (7813, 7800, 7800, 7800, 7800, 6, 66, 13544, 39, 4320, 0, 7812, 7814), + (7814, 7800, 7800, 7800, 7800, 7, 71, 13545, 39, 4320, 0, 7813, 7815), + (7815, 7800, 7800, 7800, 7800, 8, 76, 13562, 39, 4320, 0, 7814, 7816), + (7816, 7800, 7800, 7800, 7800, 8, 81, 16062, 39, 4320, 0, 7815, 7817), + (7817, 7800, 7800, 7800, 7800, 9, 83, 16855, 39, 4320, 0, 7816, 10786), + (7818, -1, -1, 7818, 7818, 12, 85, 21750, 0, 0, 16, -1, 13029), + (7819, -1, -1, 9512, 9512, 7, 85, -1, 0, 0, 16, 9514, 7820), + (7820, -1, -1, 9512, 9512, 7, 85, -1, 0, 0, 16, 7819, 7821), + (7821, -1, -1, 9512, 9512, 7, 85, -1, 0, 0, 16, 7820, 7881), + (7822, -1, -1, 7822, 7822, 5, 77, 0, 0, 0, 16, -1, 7823), + (7823, -1, -1, 7822, 7822, 5, 79, 0, 0, 0, 16, 7822, 7824), + (7824, -1, -1, 7822, 7822, 5, 81, 0, 0, 0, 16, 7823, 7825), + (7825, -1, -1, 7822, 7822, 5, 83, 0, 0, 0, 16, 7824, 7826), + (7826, -1, -1, 7822, 7822, 5, 85, 0, 0, 0, 16, 7825, 14328), + (7827, -1, -1, 7827, 7827, 5, 81, 0, 0, 0, 16, -1, -1), + (7828, -1, -1, 7828, 7828, 5, 79, 0, 0, 0, 16, -1, 7829), + (7829, -1, -1, 7828, 7828, 5, 81, 0, 0, 0, 16, 7828, 7830), + (7830, -1, -1, 7828, 7828, 5, 83, 0, 0, 0, 16, 7829, -1), + (7832, -1, -1, 7832, 7832, 5, 85, 0, 0, 0, 16, -1, 7833), + (7833, -1, -1, 7832, 7832, 5, 85, 0, 0, 0, 16, 7832, 7834), + (7834, -1, -1, 7832, 7832, 5, 85, 0, 0, 0, 16, 7833, 7835), + (7835, -1, -1, 7832, 7832, 5, 85, 0, 0, 0, 16, 7834, 7836), + (7836, -1, -1, 7832, 7832, 5, 85, 0, 0, 0, 16, 7835, -1), + (7837, -1, -1, 1006, 1006, 5, 76, -1, 0, 0, 17, 7520, 7838), + (7838, -1, -1, 1006, 1006, 5, 77, -1, 0, 0, 17, 7837, 7839), + (7839, -1, -1, 1006, 1006, 5, 78, -1, 0, 0, 17, 7838, 7840), + (7840, -1, -1, 1006, 1006, 5, 79, -1, 0, 0, 17, 7839, 7841), + (7841, -1, -1, 1006, 1006, 5, 80, -1, 0, 0, 17, 7840, 8470), + (7842, -1, -1, 1486, 1486, 12, 91, -1, 0, 0, 18, 7726, 7843), + (7843, -1, -1, 1486, 1486, 12, 92, -1, 0, 0, 18, 7842, 7844), + (7844, -1, -1, 1486, 1486, 12, 93, -1, 0, 0, 18, 7843, 7845), + (7850, 7850, 7850, 7850, 7850, 0, 1, 13546, 39, 4320, 0, -1, 7851), + (7851, 7850, 7850, 7850, 7850, 0, 6, 13547, 39, 4320, 0, 7850, 7852), + (7852, 7850, 7850, 7850, 7850, 0, 11, 13548, 39, 4320, 0, 7851, 7853), + (7853, 7850, 7850, 7850, 7850, 0, 16, 13549, 39, 4320, 0, 7852, 7854), + (7854, 7850, 7850, 7850, 7850, 0, 21, 13550, 39, 4320, 0, 7853, 7855), + (7855, 7850, 7850, 7850, 7850, 0, 26, 13551, 39, 4320, 0, 7854, 7856), + (7856, 7850, 7850, 7850, 7850, 0, 31, 13552, 39, 4320, 0, 7855, 7857), + (7857, 7850, 7850, 7850, 7850, 0, 36, 13553, 39, 4320, 0, 7856, 7858), + (7858, 7850, 7850, 7850, 7850, 0, 41, 13554, 39, 4320, 0, 7857, 7859), + (7859, 7850, 7850, 7850, 7850, 0, 46, 13555, 39, 4320, 0, 7858, 7860), + (7860, 7850, 7850, 7850, 7850, 3, 51, 13556, 39, 4320, 0, 7859, 7861), + (7861, 7850, 7850, 7850, 7850, 4, 56, 13557, 39, 4320, 0, 7860, 7862), + (7862, 7850, 7850, 7850, 7850, 5, 61, 13558, 39, 4320, 0, 7861, 7863), + (7863, 7850, 7850, 7850, 7850, 6, 66, 13559, 39, 4320, 0, 7862, 7864), + (7864, 7850, 7850, 7850, 7850, 7, 71, 13560, 39, 4320, 0, 7863, 7865), + (7865, 7850, 7850, 7850, 7850, 8, 76, 13561, 39, 4320, 0, 7864, 7340), + (7869, 7869, 7869, 7869, 7869, 6, 73, 16175, 60, 30, 15, -1, 7870), + (7870, 7869, 7869, 7869, 7869, 6, 77, 16176, 60, 30, 15, 7869, 7871), + (7871, 7869, 7869, 7869, 7869, 6, 81, 16177, 60, 30, 15, 7870, -1), + (7872, 7872, 7872, 7872, 7872, 6, 76, 16178, 41, 600, 15, -1, 7873), + (7873, 7872, 7872, 7872, 7872, 6, 81, 16179, 41, 600, 15, 7872, 7874), + (7874, 7872, 7872, 7872, 7872, 6, 85, 16180, 41, 600, 15, 7873, 10127), + (7875, 7875, 7875, 7875, 7875, 6, 76, 16181, 42, 600, 15, -1, 7876), + (7876, 7875, 7875, 7875, 7875, 6, 81, 16182, 42, 600, 15, 7875, 7877), + (7877, 7875, 7875, 7875, 7875, 6, 85, 16183, 42, 600, 15, 7876, 7878), + (7878, 7875, 7875, 7875, 7875, 6, 85, 16859, 42, 600, 16, 7877, 7879), + (7879, 7875, 7875, 7875, 7875, 6, 85, 21823, 42, 600, 16, 7878, 7880), + (7880, 7875, 7875, 7875, 7875, 6, 85, 21824, 42, 600, 16, 7879, 13816), + (7881, -1, -1, 9512, 9512, 7, 85, -1, 0, 0, 16, 7821, 7882), + (7882, -1, -1, 9512, 9512, 7, 85, -1, 0, 0, 16, 7881, 7883), + (7883, -1, -1, 9512, 9512, 7, 85, -1, 0, 0, 16, 7882, 13187), + (7884, -1, -1, 7884, 7884, 9, 85, -1, 0, 0, 16, -1, 12689), + (7885, -1, -1, 7885, 7885, 9, 85, -1, 0, 0, 16, -1, 12690), + (7886, -1, -1, 1026, 1026, 5, 85, -1, 0, 0, 17, 7515, 7887), + (7887, -1, -1, 1026, 1026, 5, 86, -1, 0, 0, 17, 7886, 7888), + (7888, -1, -1, 1026, 1026, 5, 87, -1, 0, 0, 17, 7887, 7889), + (7889, -1, -1, 1026, 1026, 5, 88, -1, 0, 0, 17, 7888, 7890), + (7890, -1, -1, 1026, 1026, 5, 89, -1, 0, 0, 17, 7889, 8430), + (7900, -1, -1, 7900, 7900, 4, 60, -1, 0, 0, 15, -1, 7901), + (7901, -1, -1, 7900, 7900, 4, 65, -1, 0, 0, 15, 7900, 7902), + (7902, -1, -1, 7900, 7900, 4, 70, -1, 0, 0, 15, 7901, 10268), + (7903, 7903, 7903, 7903, 7903, 6, 75, 16188, 60, 30, 15, -1, 12976), + (7904, -1, -1, 65, 661, 3, 85, -1, 0, 0, 17, 7538, 7905), + (7905, -1, -1, 65, 661, 3, 86, -1, 0, 0, 17, 7904, 7906), + (7906, -1, -1, 65, 661, 3, 87, -1, 0, 0, 17, 7905, 7907), + (7907, -1, -1, 65, 661, 3, 88, -1, 0, 0, 17, 7906, 7908), + (7908, -1, -1, 65, 661, 3, 89, -1, 0, 0, 17, 7907, 8435), + (7940, -1, -1, 7940, 7940, 6, 60, -1, 0, 0, 15, -1, 7941), + (7941, -1, -1, 7940, 7940, 6, 65, -1, 0, 0, 15, 7940, 7942), + (7942, -1, -1, 7940, 7940, 6, 70, -1, 0, 0, 15, 7941, 10030), + (7943, 7943, 7943, 7943, 7943, 6, 79, 16192, 60, 8640, 15, -1, 7993), + (7944, 7944, 7944, 7944, 7944, 7, 79, 16193, 34, 1800, 15, -1, -1), + (7945, -1, -1, 7945, 7945, 6, 81, -1, 0, 0, 15, -1, 7946), + (7946, -1, -1, 7945, 7945, 6, 82, -1, 0, 0, 15, 7945, 7947), + (7947, -1, -1, 7945, 7945, 6, 83, -1, 0, 0, 15, 7946, 10033), + (7948, -1, -1, 7948, 7948, 6, 75, -1, 0, 0, 15, -1, 7949), + (7949, -1, -1, 7948, 7948, 6, 80, -1, 0, 0, 15, 7948, 7950), + (7950, -1, -1, 7948, 7948, 6, 85, -1, 0, 0, 15, 7949, 10035), + (7951, 7951, 7951, 7951, 7951, 6, 82, 16200, 61, 900, 15, -1, 7952), + (7952, 7951, 7951, 7951, 7951, 6, 83, 16201, 61, 900, 15, 7951, 7953), + (7953, 7951, 7951, 7951, 7951, 6, 84, 16202, 61, 900, 15, 7952, 10038), + (7980, -1, -1, 7980, 7980, 6, 70, -1, 0, 0, 15, -1, 7981), + (7981, -1, -1, 7980, 7980, 6, 73, -1, 0, 0, 15, 7980, 7982), + (7982, -1, -1, 7980, 7980, 6, 76, -1, 0, 0, 15, 7981, -1), + (7983, -1, -1, 7983, 7983, 6, 70, -1, 0, 0, 15, -1, 7984), + (7984, -1, -1, 7983, 7983, 6, 73, -1, 0, 0, 15, 7983, 7985), + (7985, -1, -1, 7983, 7983, 6, 76, -1, 0, 0, 15, 7984, 10110), + (7986, 7986, 7986, 7986, 7986, 9, 75, 16203, 11, 600, 15, -1, 7987), + (7987, 7986, 7986, 7986, 7986, 12, 80, 16204, 11, 600, 15, 7986, 7988), + (7988, 7986, 7986, 7986, 7986, 12, 85, 16205, 11, 600, 15, 7987, 10510), + (7989, -1, -1, 7989, 7989, 6, 75, -1, 0, 0, 15, -1, 7990), + (7990, -1, -1, 7989, 7989, 6, 80, -1, 0, 0, 15, 7989, 7991), + (7991, -1, -1, 7989, 7989, 6, 85, -1, 0, 0, 15, 7990, 7992), + (7992, -1, -1, 7989, 7989, 6, 85, -1, 0, 0, 15, 7991, 13415), + (7993, 7943, 7943, 7943, 7943, 6, 85, 23601, 60, 8640, 17, 7943, -1), + (7994, -1, -1, 462, 462, 2, 81, -1, 0, 0, 17, 464, 7995), + (7995, -1, -1, 462, 462, 2, 85, -1, 0, 0, 17, 7994, -1), + (8000, -1, -1, 8001, 8001, 0, 50, -1, 0, 0, 8, -1, -1), + (8030, 8030, 8030, 8030, 8030, 6, 70, 16206, 60, 900, 15, -1, -1), + (8031, -1, -1, 8031, 8031, 6, 75, -1, 0, 0, 15, -1, 8032), + (8032, -1, -1, 8031, 8031, 6, 77, -1, 0, 0, 15, 8031, 8033), + (8033, -1, -1, 8031, 8031, 6, 79, -1, 0, 0, 15, 8032, 10282), + (8034, 8034, 8034, 8034, 8034, 6, 81, 16207, 59, 600, 15, -1, -1), + (8035, -1, -1, 8035, 8035, 6, 73, -1, 0, 0, 15, -1, 8036), + (8036, -1, -1, 8035, 8035, 6, 75, -1, 0, 0, 15, 8035, 8037), + (8037, -1, -1, 8035, 8035, 6, 77, -1, 0, 0, 15, 8036, 10285), + (8038, 8038, 8038, 8038, 8038, 6, 81, 16210, 56, 12, 15, -1, 17541), + (8039, 8039, 8039, 8039, 8039, 6, 83, 16211, 58, 7, 15, -1, 15462), + (8040, -1, -1, 8040, 8040, 4, 65, -1, 0, 0, 15, -1, 8041), + (8041, -1, -1, 8040, 8040, 4, 70, -1, 0, 0, 15, 8040, 8042), + (8042, -1, -1, 8040, 8040, 4, 75, -1, 0, 0, 15, 8041, 8043), + (8043, -1, -1, 8040, 8040, 4, 78, -1, 0, 0, 15, 8042, 8313), + (8059, -1, -1, 8232, 8232, 4, 78, -1, 0, 0, 15, 8234, 8261), + (8060, 8060, 8060, 8060, 8060, 7, 75, 16238, 41, 1800, 15, -1, 8061), + (8061, 8060, 8060, 8060, 8060, 7, 78, 16239, 41, 1800, 15, 8060, 8062), + (8062, 8060, 8060, 8060, 8060, 7, 81, 16240, 41, 1800, 15, 8061, 10237), + (8063, 8063, 8063, 8063, 8063, 7, 75, 16241, 41, 1800, 15, -1, 8064), + (8064, 8063, 8063, 8063, 8063, 7, 78, 16242, 41, 1800, 15, 8063, 8065), + (8065, 8063, 8063, 8063, 8063, 7, 81, 16243, 41, 1800, 15, 8064, 10240), + (8066, 8066, 8066, 8066, 8066, 7, 75, 16244, 41, 1800, 15, -1, 8067), + (8067, 8066, 8066, 8066, 8066, 7, 78, 16245, 41, 1800, 15, 8066, 8068), + (8068, 8066, 8066, 8066, 8066, 7, 81, 16246, 41, 1800, 15, 8067, 10243), + (8069, -1, -1, 8069, 8069, 5, 71, -1, 0, 0, 15, -1, 8070), + (8070, -1, -1, 8069, 8069, 5, 72, -1, 0, 0, 15, 8069, 8071), + (8071, -1, -1, 8069, 8069, 5, 73, -1, 0, 0, 15, 8070, 15606), + (8072, 8072, 8072, 8072, 8072, 7, 75, 16221, 37, 20, 15, -1, 8073), + (8073, 8072, 8072, 8072, 8072, 7, 75, 16222, 37, 20, 15, 8072, 8074), + (8074, 8072, 8072, 8072, 8072, 7, 75, 16223, 37, 20, 15, 8073, 10246), + (8075, 8075, 8075, 8075, 8075, 7, 81, 16224, 42, 6, 15, -1, -1), + (8076, -1, -1, 8076, 8076, 5, 77, -1, 0, 0, 15, -1, 8077), + (8077, -1, -1, 8076, 8076, 5, 78, -1, 0, 0, 15, 8076, 8078), + (8078, -1, -1, 8076, 8076, 5, 79, -1, 0, 0, 15, 8077, 8079), + (8079, -1, -1, 8076, 8076, 5, 80, -1, 0, 0, 15, 8078, 8080), + (8080, -1, -1, 8076, 8076, 5, 81, -1, 0, 0, 15, 8079, 8081), + (8081, -1, -1, 8076, 8076, 5, 82, -1, 0, 0, 15, 8080, -1), + (8082, -1, -1, 8082, 8082, 3, 65, -1, 0, 0, 15, -1, 8083), + (8083, -1, -1, 8082, 8082, 3, 67, -1, 0, 0, 15, 8082, 8084), + (8084, -1, -1, 8082, 8082, 3, 69, -1, 0, 0, 15, 8083, 10249), + (8190, -1, -1, 8190, 8190, 7, 75, -1, 0, 0, 15, -1, 8191), + (8191, -1, -1, 8190, 8190, 7, 75, -1, 0, 0, 15, 8190, 8192), + (8192, -1, -1, 8190, 8190, 7, 75, -1, 0, 0, 15, 8191, -1), + (8193, -1, -1, 8193, 8193, 7, 75, -1, 0, 0, 15, -1, -1), + (8194, 8194, 8194, 8194, 8194, 7, 75, 16226, 47, 12, 15, -1, -1), + (8195, -1, -1, 8195, 8195, 4, 75, -1, 0, 0, 15, -1, 8196), + (8196, -1, -1, 8195, 8195, 4, 75, -1, 0, 0, 15, 8195, 8197), + (8197, -1, -1, 8195, 8195, 4, 75, -1, 0, 0, 15, 8196, 7704), + (8198, -1, -1, 8198, 8198, 4, 65, -1, 0, 0, 15, -1, 8199), + (8199, -1, -1, 8198, 8198, 4, 65, -1, 0, 0, 15, 8198, 8200), + (8200, -1, -1, 8198, 8198, 4, 65, -1, 0, 0, 15, 8199, -1), + (8201, -1, -1, 8201, 8201, 7, 81, -1, 0, 0, 15, -1, 8202), + (8202, -1, -1, 8201, 8201, 7, 81, -1, 0, 0, 15, 8201, 8203), + (8203, -1, -1, 8201, 8201, 7, 81, -1, 0, 0, 15, 8202, 16475), + (8204, -1, -1, 8204, 8204, 4, 75, -1, 0, 0, 15, -1, 8205), + (8205, -1, -1, 8204, 8204, 4, 75, -1, 0, 0, 15, 8204, 8206), + (8206, -1, -1, 8204, 8204, 4, 75, -1, 0, 0, 15, 8205, 1656), + (8207, -1, -1, 8207, 8207, 4, 75, -1, 0, 0, 15, -1, 8208), + (8208, -1, -1, 8207, 8207, 4, 75, -1, 0, 0, 15, 8207, 8209), + (8209, -1, -1, 8207, 8207, 4, 75, -1, 0, 0, 15, 8208, 1659), + (8210, -1, -1, 8210, 8210, 5, 65, -1, 0, 0, 15, -1, 8211), + (8211, -1, -1, 8210, 8210, 5, 70, -1, 0, 0, 15, 8210, 8212), + (8212, -1, -1, 8210, 8210, 5, 75, -1, 0, 0, 15, 8211, 8213), + (8213, -1, -1, 8210, 8210, 5, 80, -1, 0, 0, 15, 8212, 8214), + (8214, -1, -1, 8210, 8210, 5, 85, -1, 0, 0, 15, 8213, 1651), + (8215, -1, -1, 8215, 8215, 5, 65, -1, 0, 0, 15, -1, 8216), + (8216, -1, -1, 8215, 8215, 5, 70, -1, 0, 0, 15, 8215, 8217), + (8217, -1, -1, 8215, 8215, 5, 75, -1, 0, 0, 15, 8216, 8218), + (8218, -1, -1, 8215, 8215, 5, 80, -1, 0, 0, 15, 8217, 8219), + (8219, -1, -1, 8215, 8215, 5, 85, -1, 0, 0, 15, 8218, 12559), + (8220, 8220, 8220, 8220, 8220, 5, 76, 16227, 39, 15, 15, -1, -1), + (8221, 8221, 8221, 8221, 8221, 9, 81, 16228, 45, 600, 15, -1, -1), + (8222, 8222, 8222, 8222, 8222, 7, 75, 16229, 70, 10, 15, -1, -1), + (8223, -1, -1, 86, 86, 8, 59, -1, 0, 0, 15, 6259, 8262), + (8224, -1, -1, 8224, 8224, 5, 75, -1, 0, 0, 15, -1, 8225), + (8225, -1, -1, 8224, 8224, 5, 80, -1, 0, 0, 15, 8224, 8226), + (8226, -1, -1, 8224, 8224, 5, 85, -1, 0, 0, 15, 8225, 8421), + (8227, 8227, 8227, 8227, 8227, 3, 55, 16233, 71, 10, 15, -1, 12810), + (8228, -1, -1, 8228, 8228, 5, 75, -1, 0, 0, 15, -1, 8229), + (8229, -1, -1, 8228, 8228, 5, 80, -1, 0, 0, 15, 8228, 8230), + (8230, -1, -1, 8228, 8228, 5, 85, -1, 0, 0, 15, 8229, -1), + (8231, 8231, -1, 8231, 8231, 3, 55, 16234, 38, 60, 15, -1, -1), + (8232, -1, -1, 8232, 8232, 4, 65, -1, 0, 0, 15, -1, 8233), + (8233, -1, -1, 8232, 8232, 4, 70, -1, 0, 0, 15, 8232, 8234), + (8234, -1, -1, 8232, 8232, 4, 75, -1, 0, 0, 15, 8233, 8059), + (8235, -1, -1, 8235, 8235, 6, 81, -1, 0, 0, 15, -1, 8236), + (8236, -1, -1, 8235, 8235, 6, 81, -1, 0, 0, 15, 8235, 8237), + (8237, -1, -1, 8235, 8235, 6, 81, -1, 0, 0, 15, 8236, 8238), + (8238, -1, -1, 8235, 8235, 6, 81, -1, 0, 0, 15, 8237, 8239), + (8239, -1, -1, 8235, 8235, 6, 81, -1, 0, 0, 15, 8238, 8304), + (8240, -1, -1, 8240, 8240, 6, 81, -1, 0, 0, 15, -1, 8241), + (8241, -1, -1, 8240, 8240, 6, 81, -1, 0, 0, 15, 8240, 8242), + (8242, -1, -1, 8240, 8240, 6, 81, -1, 0, 0, 15, 8241, 8243), + (8243, -1, -1, 8240, 8240, 6, 81, -1, 0, 0, 15, 8242, 8244), + (8244, -1, -1, 8240, 8240, 6, 81, -1, 0, 0, 15, 8243, 10781), + (8245, -1, -1, 8245, 8245, 6, 81, -1, 0, 0, 15, -1, 8246), + (8246, -1, -1, 8245, 8245, 6, 81, -1, 0, 0, 15, 8245, 8247), + (8247, -1, -1, 8245, 8245, 6, 81, -1, 0, 0, 15, 8246, 8248), + (8248, -1, -1, 8245, 8245, 6, 81, -1, 0, 0, 15, 8247, 8249), + (8249, -1, -1, 8245, 8245, 6, 81, -1, 0, 0, 15, 8248, 8422), + (8250, -1, -1, 8250, 8250, 6, 81, -1, 0, 0, 15, -1, 8251), + (8251, -1, -1, 8250, 8250, 6, 81, -1, 0, 0, 15, 8250, 8252), + (8252, -1, -1, 8250, 8250, 6, 81, -1, 0, 0, 15, 8251, 8253), + (8253, -1, -1, 8250, 8250, 6, 81, -1, 0, 0, 15, 8252, 8254), + (8254, -1, -1, 8250, 8250, 6, 81, -1, 0, 0, 15, 8253, 13046), + (8255, -1, -1, 8255, 8255, 6, 81, -1, 0, 0, 15, -1, 8256), + (8256, -1, -1, 8255, 8255, 6, 81, -1, 0, 0, 15, 8255, 8257), + (8257, -1, -1, 8255, 8255, 6, 81, -1, 0, 0, 15, 8256, 8258), + (8258, -1, -1, 8255, 8255, 6, 81, -1, 0, 0, 15, 8257, 8259), + (8259, -1, -1, 8255, 8255, 6, 81, -1, 0, 0, 15, 8258, 12411), + (8260, 8005, 8005, 8005, 8005, 9, 85, 20185, 45, 600, 16, -1, -1), + (8261, -1, -1, 8232, 8232, 4, 80, -1, 0, 0, 16, 8059, 15772), + (8262, -1, -1, 86, 86, 8, 65, -1, 0, 0, 16, 8223, -1), + (8263, -1, -1, 8263, 8263, 5, 81, -1, 0, 0, 16, -1, 8264), + (8264, -1, -1, 8263, 8263, 5, 82, -1, 0, 0, 16, 8263, 8265), + (8265, -1, -1, 8263, 8263, 5, 83, -1, 0, 0, 16, 8264, 8266), + (8266, -1, -1, 8263, 8263, 5, 84, -1, 0, 0, 16, 8265, 8267), + (8267, -1, -1, 8263, 8263, 5, 85, -1, 0, 0, 16, 8266, 8351), + (8268, -1, -1, 8268, 8268, 5, 81, -1, 0, 0, 16, -1, 8269), + (8269, -1, -1, 8268, 8268, 5, 82, -1, 0, 0, 16, 8268, 8270), + (8270, -1, -1, 8268, 8268, 5, 83, -1, 0, 0, 16, 8269, 8271), + (8271, -1, -1, 8268, 8268, 5, 84, -1, 0, 0, 16, 8270, 8272), + (8272, -1, -1, 8268, 8268, 5, 85, -1, 0, 0, 16, 8271, 8361), + (8273, -1, -1, 8273, 8273, 5, 81, -1, 0, 0, 16, -1, 8274), + (8274, -1, -1, 8273, 8273, 5, 82, -1, 0, 0, 16, 8273, 8275), + (8275, -1, -1, 8273, 8273, 5, 83, -1, 0, 0, 16, 8274, 8276), + (8276, -1, -1, 8273, 8273, 5, 84, -1, 0, 0, 16, 8275, 8277), + (8277, -1, -1, 8273, 8273, 5, 85, -1, 0, 0, 16, 8276, 8371), + (8278, -1, -1, 8278, 8278, 5, 81, -1, 0, 0, 16, -1, 8279), + (8279, -1, -1, 8278, 8278, 5, 82, -1, 0, 0, 16, 8278, 8280), + (8280, -1, -1, 8278, 8278, 5, 83, -1, 0, 0, 16, 8279, 8281), + (8281, -1, -1, 8278, 8278, 5, 84, -1, 0, 0, 16, 8280, 8282), + (8282, -1, -1, 8278, 8278, 5, 85, -1, 0, 0, 16, 8281, 8381), + (8283, -1, -1, 8283, 8283, 5, 81, -1, 0, 0, 16, -1, 8284), + (8284, -1, -1, 8283, 8283, 5, 82, -1, 0, 0, 16, 8283, 8285), + (8285, -1, -1, 8283, 8283, 5, 83, -1, 0, 0, 16, 8284, 8286), + (8286, -1, -1, 8283, 8283, 5, 84, -1, 0, 0, 16, 8285, 8287), + (8287, -1, -1, 8283, 8283, 5, 85, -1, 0, 0, 16, 8286, 8391), + (8288, -1, -1, 8288, 8288, 5, 81, -1, 0, 0, 16, -1, 8289), + (8289, -1, -1, 8288, 8288, 5, 82, -1, 0, 0, 16, 8288, 8290), + (8290, -1, -1, 8288, 8288, 5, 83, -1, 0, 0, 16, 8289, 8291), + (8291, -1, -1, 8288, 8288, 5, 84, -1, 0, 0, 16, 8290, 8292), + (8292, -1, -1, 8288, 8288, 5, 85, -1, 0, 0, 16, 8291, 8401), + (8293, -1, -1, 8293, 8293, 5, 81, -1, 0, 0, 16, -1, 8294), + (8294, -1, -1, 8293, 8293, 5, 82, -1, 0, 0, 16, 8293, 8295), + (8295, -1, -1, 8293, 8293, 5, 83, -1, 0, 0, 16, 8294, 8296), + (8296, -1, -1, 8293, 8293, 5, 84, -1, 0, 0, 16, 8295, 8297), + (8297, -1, -1, 8293, 8293, 5, 85, -1, 0, 0, 16, 8296, 8411), + (8300, 8300, 8300, 8300, 8300, 5, 81, 21778, 8, 900, 16, -1, 8301), + (8301, 8300, 8300, 8300, 8300, 7, 83, 21779, 8, 900, 16, 8300, 8302), + (8302, 8300, 8300, 8300, 8300, 9, 85, 21780, 8, 900, 16, 8301, 15111), + (8303, 8303, 8303, 8303, 8303, 12, 85, 21773, 9, 1800, 16, -1, -1), + (8304, -1, -1, 8235, 8235, 6, 85, -1, 0, 0, 16, 8239, 8305), + (8305, -1, -1, 8235, 8235, 6, 85, -1, 0, 0, 16, 8304, 8306), + (8306, -1, -1, 8235, 8235, 6, 85, -1, 0, 0, 16, 8305, 8307), + (8307, -1, -1, 8235, 8235, 6, 85, -1, 0, 0, 16, 8306, 8308), + (8308, -1, -1, 8235, 8235, 6, 85, -1, 0, 0, 16, 8307, 13353), + (8309, 260, -1, 260, 260, 5, 81, 21687, 3, 2160, 16, 262, 8310), + (8310, 260, -1, 260, 260, 7, 83, 21688, 3, 2160, 16, 8309, 8311), + (8311, 260, -1, 260, 260, 9, 85, 21689, 3, 2160, 16, 8310, -1), + (8312, 8312, 8312, 8312, 8312, 12, 85, 21690, 2, 900, 16, -1, -1), + (8313, -1, -1, 8040, 8040, 4, 80, -1, 0, 0, 16, 8043, 15773), + (8314, -1, -1, 8314, 8314, 7, 85, -1, 0, 0, 16, -1, 8315), + (8315, -1, -1, 8314, 8314, 9, 85, -1, 0, 0, 16, 8314, 8316), + (8316, -1, -1, 8314, 8314, 12, 85, -1, 0, 0, 16, 8315, 13508), + (8317, -1, -1, 8317, 8317, 5, 85, -1, 0, 0, 16, -1, 8318), + (8318, -1, -1, 8317, 8317, 5, 85, -1, 0, 0, 16, 8317, -1), + (8319, -1, -1, 8319, 8319, 5, 85, -1, 0, 0, 16, -1, 8320), + (8320, -1, -1, 8319, 8319, 5, 85, -1, 0, 0, 16, 8319, 8321), + (8321, -1, -1, 8319, 8319, 5, 85, -1, 0, 0, 16, 8320, -1), + (8322, -1, -1, 8322, 8322, 5, 81, 0, 0, 0, 16, -1, 8323), + (8323, -1, -1, 8322, 8322, 7, 83, 0, 0, 0, 16, 8322, 8324), + (8324, -1, -1, 8322, 8322, 9, 85, 0, 0, 0, 16, 8323, 13199), + (8325, -1, -1, 8325, 8325, 7, 81, 0, 0, 0, 16, -1, 8326), + (8326, -1, -1, 8325, 8325, 9, 81, 0, 0, 0, 16, 8325, 8327), + (8327, -1, -1, 8325, 8325, 11, 81, 0, 0, 0, 16, 8326, 13219), + (8328, -1, -1, 244, 244, 12, 59, -1, 0, 0, 3, 246, -1), + (8329, -1, -1, 622, 622, 3, 71, -1, 0, 0, 16, 624, -1), + (8331, -1, -1, 8331, 8331, 9, 85, 0, 0, 0, 16, -1, -1), + (8332, -1, -1, 8332, 8332, 7, 85, 0, 0, 0, 16, -1, 8333), + (8333, -1, -1, 8332, 8332, 7, 85, 0, 0, 0, 16, 8332, 8334), + (8334, -1, -1, 8332, 8332, 7, 85, 0, 0, 0, 16, 8333, -1), + (8335, -1, -1, 8335, 8335, 5, 81, 0, 0, 0, 16, -1, 8336), + (8336, -1, -1, 8335, 8335, 5, 82, 0, 0, 0, 16, 8335, 8337), + (8337, -1, -1, 8335, 8335, 5, 83, 0, 0, 0, 16, 8336, 8338), + (8338, -1, -1, 8335, 8335, 5, 84, 0, 0, 0, 16, 8337, 8339), + (8339, -1, -1, 8335, 8335, 5, 85, 0, 0, 0, 16, 8338, -1), + (8341, 8341, 8341, 8341, 8341, 12, 85, 21829, 53, 450, 16, -1, -1), + (8342, 8342, 8342, 8342, 8342, 12, 85, 21843, 54, 240, 16, -1, 14729), + (8343, 167, 167, 167, 167, 10, 85, 21837, 14, 900, 16, 7249, 12955), + (8344, -1, -1, 1210, 1213, 12, 85, -1, 0, 0, 16, 7583, 8345), + (8345, -1, -1, 1210, 1213, 12, 85, -1, 0, 0, 16, 8344, 8346), + (8346, -1, -1, 1210, 1213, 12, 85, -1, 0, 0, 16, 8345, 12526), + (8347, -1, -1, 8347, 8347, 7, 81, 0, 0, 0, 16, -1, 8348), + (8348, -1, -1, 8347, 8347, 9, 83, 0, 0, 0, 16, 8347, 8349), + (8349, -1, -1, 8347, 8347, 11, 85, 0, 0, 0, 16, 8348, -1), + (8350, -1, -1, 8350, 8350, 12, 85, 0, 0, 0, 16, -1, -1), + (8351, -1, -1, 8263, 8263, 3, 85, -1, 0, 0, 17, 8267, 8352), + (8352, -1, -1, 8263, 8263, 3, 85, -1, 0, 0, 17, 8351, 8353), + (8353, -1, -1, 8263, 8263, 3, 85, -1, 0, 0, 17, 8352, 8354), + (8354, -1, -1, 8263, 8263, 3, 85, -1, 0, 0, 17, 8353, 8355), + (8355, -1, -1, 8263, 8263, 3, 85, -1, 0, 0, 17, 8354, 8356), + (8356, -1, -1, 8263, 8263, 3, 85, -1, 0, 0, 17, 8355, 8357), + (8357, -1, -1, 8263, 8263, 3, 85, -1, 0, 0, 17, 8356, 8358), + (8358, -1, -1, 8263, 8263, 3, 85, -1, 0, 0, 17, 8357, 8359), + (8359, -1, -1, 8263, 8263, 3, 85, -1, 0, 0, 17, 8358, 8360), + (8360, -1, -1, 8263, 8263, 3, 85, -1, 0, 0, 17, 8359, 13933), + (8361, -1, -1, 8268, 8268, 3, 85, -1, 0, 0, 17, 8272, 8362), + (8362, -1, -1, 8268, 8268, 3, 85, -1, 0, 0, 17, 8361, 8363), + (8363, -1, -1, 8268, 8268, 3, 85, -1, 0, 0, 17, 8362, 8364), + (8364, -1, -1, 8268, 8268, 3, 85, -1, 0, 0, 17, 8363, 8365), + (8365, -1, -1, 8268, 8268, 3, 85, -1, 0, 0, 17, 8364, 8366), + (8366, -1, -1, 8268, 8268, 3, 85, -1, 0, 0, 17, 8365, 8367), + (8367, -1, -1, 8268, 8268, 3, 85, -1, 0, 0, 17, 8366, 8368), + (8368, -1, -1, 8268, 8268, 3, 85, -1, 0, 0, 17, 8367, 8369), + (8369, -1, -1, 8268, 8268, 3, 85, -1, 0, 0, 17, 8368, 8370), + (8370, -1, -1, 8268, 8268, 3, 85, -1, 0, 0, 17, 8369, 13943), + (8371, -1, -1, 8273, 8273, 3, 85, -1, 0, 0, 17, 8277, 8372), + (8372, -1, -1, 8273, 8273, 3, 85, -1, 0, 0, 17, 8371, 8373), + (8373, -1, -1, 8273, 8273, 3, 85, -1, 0, 0, 17, 8372, 8374), + (8374, -1, -1, 8273, 8273, 3, 85, -1, 0, 0, 17, 8373, 8375), + (8375, -1, -1, 8273, 8273, 3, 85, -1, 0, 0, 17, 8374, 8376), + (8376, -1, -1, 8273, 8273, 3, 85, -1, 0, 0, 17, 8375, 8377), + (8377, -1, -1, 8273, 8273, 3, 85, -1, 0, 0, 17, 8376, 8378), + (8378, -1, -1, 8273, 8273, 3, 85, -1, 0, 0, 17, 8377, 8379), + (8379, -1, -1, 8273, 8273, 3, 85, -1, 0, 0, 17, 8378, 8380), + (8380, -1, -1, 8273, 8273, 3, 85, -1, 0, 0, 17, 8379, 13953), + (8381, -1, -1, 8278, 8278, 3, 85, -1, 0, 0, 17, 8282, 8382), + (8382, -1, -1, 8278, 8278, 3, 85, -1, 0, 0, 17, 8381, 8383), + (8383, -1, -1, 8278, 8278, 3, 85, -1, 0, 0, 17, 8382, 8384), + (8384, -1, -1, 8278, 8278, 3, 85, -1, 0, 0, 17, 8383, 8385), + (8385, -1, -1, 8278, 8278, 3, 85, -1, 0, 0, 17, 8384, 8386), + (8386, -1, -1, 8278, 8278, 3, 85, -1, 0, 0, 17, 8385, 8387), + (8387, -1, -1, 8278, 8278, 3, 85, -1, 0, 0, 17, 8386, 8388), + (8388, -1, -1, 8278, 8278, 3, 85, -1, 0, 0, 17, 8387, 8389), + (8389, -1, -1, 8278, 8278, 3, 85, -1, 0, 0, 17, 8388, 8390), + (8390, -1, -1, 8278, 8278, 3, 85, -1, 0, 0, 17, 8389, 13963), + (8391, -1, -1, 8283, 8283, 3, 85, -1, 0, 0, 17, 8287, 8392), + (8392, -1, -1, 8283, 8283, 3, 85, -1, 0, 0, 17, 8391, 8393), + (8393, -1, -1, 8283, 8283, 3, 85, -1, 0, 0, 17, 8392, 8394), + (8394, -1, -1, 8283, 8283, 3, 85, -1, 0, 0, 17, 8393, 8395), + (8395, -1, -1, 8283, 8283, 3, 85, -1, 0, 0, 17, 8394, 8396), + (8396, -1, -1, 8283, 8283, 3, 85, -1, 0, 0, 17, 8395, 8397), + (8397, -1, -1, 8283, 8283, 3, 85, -1, 0, 0, 17, 8396, 8398), + (8398, -1, -1, 8283, 8283, 3, 85, -1, 0, 0, 17, 8397, 8399), + (8399, -1, -1, 8283, 8283, 3, 85, -1, 0, 0, 17, 8398, 8400), + (8400, -1, -1, 8283, 8283, 3, 85, -1, 0, 0, 17, 8399, 13973), + (8401, -1, -1, 8288, 8288, 3, 85, -1, 0, 0, 17, 8292, 8402), + (8402, -1, -1, 8288, 8288, 3, 85, -1, 0, 0, 17, 8401, 8403), + (8403, -1, -1, 8288, 8288, 3, 85, -1, 0, 0, 17, 8402, 8404), + (8404, -1, -1, 8288, 8288, 3, 85, -1, 0, 0, 17, 8403, 8405), + (8405, -1, -1, 8288, 8288, 3, 85, -1, 0, 0, 17, 8404, 8406), + (8406, -1, -1, 8288, 8288, 3, 85, -1, 0, 0, 17, 8405, 8407), + (8407, -1, -1, 8288, 8288, 3, 85, -1, 0, 0, 17, 8406, 8408), + (8408, -1, -1, 8288, 8288, 3, 85, -1, 0, 0, 17, 8407, 8409), + (8409, -1, -1, 8288, 8288, 3, 85, -1, 0, 0, 17, 8408, 8410), + (8410, -1, -1, 8288, 8288, 3, 85, -1, 0, 0, 17, 8409, 13983), + (8411, -1, -1, 8293, 8293, 3, 85, -1, 0, 0, 17, 8297, 8412), + (8412, -1, -1, 8293, 8293, 3, 85, -1, 0, 0, 17, 8411, 8413), + (8413, -1, -1, 8293, 8293, 3, 85, -1, 0, 0, 17, 8412, 8414), + (8414, -1, -1, 8293, 8293, 3, 85, -1, 0, 0, 17, 8413, 8415), + (8415, -1, -1, 8293, 8293, 3, 85, -1, 0, 0, 17, 8414, 8416), + (8416, -1, -1, 8293, 8293, 3, 85, -1, 0, 0, 17, 8415, 8417), + (8417, -1, -1, 8293, 8293, 3, 85, -1, 0, 0, 17, 8416, 8418), + (8418, -1, -1, 8293, 8293, 3, 85, -1, 0, 0, 17, 8417, 8419), + (8419, -1, -1, 8293, 8293, 3, 85, -1, 0, 0, 17, 8418, 8420), + (8420, -1, -1, 8293, 8293, 3, 85, -1, 0, 0, 17, 8419, 13993), + (8421, -1, -1, 8224, 8224, 5, 90, -1, 0, 0, 17, 8226, -1), + (8422, -1, -1, 8245, 8245, 6, 86, -1, 0, 0, 17, 8249, 8423), + (8423, -1, -1, 8245, 8245, 6, 87, -1, 0, 0, 17, 8422, 8424), + (8424, -1, -1, 8245, 8245, 6, 88, -1, 0, 0, 17, 8423, 8425), + (8425, -1, -1, 8245, 8245, 6, 89, -1, 0, 0, 17, 8424, 8426), + (8426, -1, -1, 8245, 8245, 6, 90, -1, 0, 0, 17, 8425, 13338), + (8427, -1, -1, 7100, 7100, 6, 85, -1, 0, 0, 17, 7325, 8428), + (8428, -1, -1, 7100, 7100, 6, 87, -1, 0, 0, 17, 8427, 8429), + (8429, -1, -1, 7100, 7100, 6, 89, -1, 0, 0, 17, 8428, -1), + (8430, -1, -1, 1026, 1026, 10, 91, -1, 0, 0, 18, 7890, 8431), + (8435, -1, -1, 65, 661, 8, 91, -1, 0, 0, 18, 7908, 8436), + (8440, -1, -1, 122, 122, 13, 91, -1, 0, 0, 18, 13089, 8441), + (8445, -1, -1, 12636, 12636, 0, 1, -1, 0, 0, 16, 12637, 8446), + (8446, -1, -1, 12636, 12636, 0, 1, -1, 0, 0, 16, 8445, 8447), + (8447, -1, -1, 12636, 12636, 0, 1, -1, 0, 0, 16, 8446, 16419), + (8448, -1, -1, 6119, 6119, 8, 91, -1, 0, 0, 18, 12496, 8449), + (8463, -1, -1, 125, 125, 10, 91, -1, 0, 0, 18, 13084, 8464), + (8464, -1, -1, 125, 125, 11, 91, -1, 0, 0, 18, 8463, 8465), + (8470, -1, -1, 1006, 1006, 10, 91, -1, 0, 0, 18, 7841, 8471), + (9000, 9000, 9000, 9000, 9000, 0, 1, 16995, 49, 72000, 0, -1, -1), + (9001, -1, -1, 9101, 9101, 2, 51, -1, 0, 0, 15, -1, 9002), + (9002, -1, -1, 9101, 9101, 2, 51, -1, 0, 0, 15, 9001, 9003), + (9003, -1, -1, 9101, 9101, 2, 51, -1, 0, 0, 15, 9002, 9004), + (9004, -1, -1, 9101, 9101, 2, 51, -1, 0, 0, 15, 9003, 9005), + (9005, -1, -1, 9101, 9101, 2, 51, -1, 0, 0, 15, 9004, 9006), + (9006, -1, -1, 9101, 9101, 2, 51, -1, 0, 0, 15, 9005, 9007), + (9007, -1, -1, 9101, 9101, 2, 51, -1, 0, 0, 15, 9006, 9008), + (9008, -1, -1, 9101, 9101, 2, 51, -1, 0, 0, 15, 9007, 9009), + (9009, -1, -1, 9101, 9101, 2, 51, -1, 0, 0, 15, 9008, 9010), + (9010, -1, -1, 9101, 9101, 2, 51, -1, 0, 0, 15, 9009, -1), + (9011, -1, -1, 9111, 9111, 4, 51, -1, 0, 0, 15, -1, 9012), + (9012, -1, -1, 9111, 9111, 4, 51, -1, 0, 0, 15, 9011, 9013), + (9013, -1, -1, 9111, 9111, 4, 51, -1, 0, 0, 15, 9012, 9014), + (9014, -1, -1, 9111, 9111, 4, 51, -1, 0, 0, 15, 9013, 9015), + (9015, -1, -1, 9111, 9111, 4, 51, -1, 0, 0, 15, 9014, 9016), + (9016, -1, -1, 9111, 9111, 4, 51, -1, 0, 0, 15, 9015, 9017), + (9017, -1, -1, 9111, 9111, 4, 51, -1, 0, 0, 15, 9016, 9018), + (9018, -1, -1, 9111, 9111, 4, 51, -1, 0, 0, 15, 9017, 9019), + (9019, -1, -1, 9111, 9111, 4, 51, -1, 0, 0, 15, 9018, 9020), + (9020, -1, -1, 9111, 9111, 4, 51, -1, 0, 0, 15, 9019, -1), + (9021, -1, -1, 9121, 9121, 3, 51, -1, 0, 0, 15, -1, 9022), + (9022, -1, -1, 9121, 9121, 3, 51, -1, 0, 0, 15, 9021, 9023), + (9023, -1, -1, 9121, 9121, 3, 51, -1, 0, 0, 15, 9022, 9024), + (9024, -1, -1, 9121, 9121, 3, 51, -1, 0, 0, 15, 9023, 9025), + (9025, -1, -1, 9121, 9121, 3, 51, -1, 0, 0, 15, 9024, 9026), + (9026, -1, -1, 9121, 9121, 3, 51, -1, 0, 0, 15, 9025, 9027), + (9027, -1, -1, 9121, 9121, 3, 51, -1, 0, 0, 15, 9026, 9028), + (9028, -1, -1, 9121, 9121, 3, 51, -1, 0, 0, 15, 9027, 9029), + (9029, -1, -1, 9121, 9121, 3, 51, -1, 0, 0, 15, 9028, 9030), + (9030, -1, -1, 9121, 9121, 3, 51, -1, 0, 0, 15, 9029, -1), + (9031, 9031, 9031, 9031, 9031, 0, 1, 16601, 65, 72000, 0, -1, -1), + (9032, 9032, 9032, 9032, 9032, 0, 0, 21815, 51, 72000, 0, -1, -1), + (9033, -1, -1, 9033, 9033, 0, 1, -1, 0, 0, 0, -1, -1), + (9100, -1, -1, 9100, 9100, 1, 85, -1, 0, 0, 15, -1, 9101), + (9101, -1, -1, 9100, 9100, 1, 85, -1, 0, 0, 15, 9100, 9102), + (9102, -1, -1, 9100, 9100, 1, 85, -1, 0, 0, 15, 9101, 9103), + (9103, -1, -1, 9100, 9100, 1, 85, -1, 0, 0, 15, 9102, 9104), + (9104, -1, -1, 9100, 9100, 1, 85, -1, 0, 0, 15, 9103, 9105), + (9105, -1, -1, 9100, 9100, 1, 85, -1, 0, 0, 15, 9104, 9106), + (9106, -1, -1, 9100, 9100, 1, 85, -1, 0, 0, 15, 9105, 9107), + (9107, -1, -1, 9100, 9100, 1, 85, -1, 0, 0, 15, 9106, 9108), + (9108, -1, -1, 9100, 9100, 1, 85, -1, 0, 0, 15, 9107, -1), + (9109, -1, -1, 9109, 9109, 1, 85, -1, 0, 0, 15, -1, 9110), + (9110, -1, -1, 9109, 9109, 1, 85, -1, 0, 0, 15, 9109, 9111), + (9111, -1, -1, 9109, 9109, 1, 85, -1, 0, 0, 15, 9110, 9112), + (9112, -1, -1, 9109, 9109, 1, 85, -1, 0, 0, 15, 9111, 9113), + (9113, -1, -1, 9109, 9109, 1, 85, -1, 0, 0, 15, 9112, 9114), + (9114, -1, -1, 9109, 9109, 1, 85, -1, 0, 0, 15, 9113, 9115), + (9115, -1, -1, 9109, 9109, 1, 85, -1, 0, 0, 15, 9114, 9116), + (9116, -1, -1, 9109, 9109, 1, 85, -1, 0, 0, 15, 9115, 9117), + (9117, -1, -1, 9109, 9109, 1, 85, -1, 0, 0, 15, 9116, -1), + (9118, -1, -1, 9118, 9118, 1, 85, -1, 0, 0, 15, -1, 9119), + (9119, -1, -1, 9118, 9118, 1, 85, -1, 0, 0, 15, 9118, 9120), + (9120, -1, -1, 9118, 9118, 1, 85, -1, 0, 0, 15, 9119, 9121), + (9121, -1, -1, 9118, 9118, 1, 85, -1, 0, 0, 15, 9120, 9122), + (9122, -1, -1, 9118, 9118, 1, 85, -1, 0, 0, 15, 9121, 9123), + (9123, -1, -1, 9118, 9118, 1, 85, -1, 0, 0, 15, 9122, 9124), + (9124, -1, -1, 9118, 9118, 1, 85, -1, 0, 0, 15, 9123, 9125), + (9125, -1, -1, 9118, 9118, 1, 85, -1, 0, 0, 15, 9124, 9126), + (9126, -1, -1, 9118, 9118, 1, 85, -1, 0, 0, 15, 9125, -1), + (9127, -1, -1, 9127, 9127, 1, 85, -1, 0, 0, 15, -1, 9128), + (9128, -1, -1, 9127, 9127, 1, 85, -1, 0, 0, 15, 9127, 9129), + (9129, -1, -1, 9127, 9127, 1, 85, -1, 0, 0, 15, 9128, 9130), + (9130, -1, -1, 9127, 9127, 1, 85, -1, 0, 0, 15, 9129, 9131), + (9131, -1, -1, 9127, 9127, 1, 85, -1, 0, 0, 15, 9130, 9132), + (9132, -1, -1, 9127, 9127, 1, 85, -1, 0, 0, 15, 9131, 9133), + (9133, -1, -1, 9127, 9127, 1, 85, -1, 0, 0, 15, 9132, 9134), + (9134, -1, -1, 9127, 9127, 1, 85, -1, 0, 0, 15, 9133, 9135), + (9135, -1, -1, 9127, 9127, 1, 85, -1, 0, 0, 15, 9134, -1), + (9136, -1, -1, 9136, 9136, 1, 85, -1, 0, 0, 15, -1, 9137), + (9137, -1, -1, 9136, 9136, 1, 85, -1, 0, 0, 15, 9136, 9138), + (9138, -1, -1, 9136, 9136, 1, 85, -1, 0, 0, 15, 9137, 9139), + (9139, -1, -1, 9136, 9136, 1, 85, -1, 0, 0, 15, 9138, 9140), + (9140, -1, -1, 9136, 9136, 1, 85, -1, 0, 0, 15, 9139, 9141), + (9141, -1, -1, 9136, 9136, 1, 85, -1, 0, 0, 15, 9140, 9142), + (9142, -1, -1, 9136, 9136, 1, 85, -1, 0, 0, 15, 9141, 9143), + (9143, -1, -1, 9136, 9136, 1, 85, -1, 0, 0, 15, 9142, 9144), + (9144, -1, -1, 9136, 9136, 1, 85, -1, 0, 0, 15, 9143, -1), + (9145, -1, -1, 9145, 9145, 1, 85, -1, 0, 0, 15, -1, 9146), + (9146, -1, -1, 9145, 9145, 1, 85, -1, 0, 0, 15, 9145, 9147), + (9147, -1, -1, 9145, 9145, 1, 85, -1, 0, 0, 15, 9146, 9148), + (9148, -1, -1, 9145, 9145, 1, 85, -1, 0, 0, 15, 9147, 9149), + (9149, -1, -1, 9145, 9145, 1, 85, -1, 0, 0, 15, 9148, 9150), + (9150, -1, -1, 9145, 9145, 1, 85, -1, 0, 0, 15, 9149, 9151), + (9151, -1, -1, 9145, 9145, 1, 85, -1, 0, 0, 15, 9150, 9152), + (9152, -1, -1, 9145, 9145, 1, 85, -1, 0, 0, 15, 9151, 9153), + (9153, -1, -1, 9145, 9145, 1, 85, -1, 0, 0, 15, 9152, -1), + (9154, -1, -1, 9154, 9154, 1, 85, -1, 0, 0, 15, -1, 9155), + (9155, -1, -1, 9154, 9154, 1, 85, -1, 0, 0, 15, 9154, 9156), + (9156, -1, -1, 9154, 9154, 1, 85, -1, 0, 0, 15, 9155, 9157), + (9157, -1, -1, 9154, 9154, 1, 85, -1, 0, 0, 15, 9156, 9158), + (9158, -1, -1, 9154, 9154, 1, 85, -1, 0, 0, 15, 9157, 9159), + (9159, -1, -1, 9154, 9154, 1, 85, -1, 0, 0, 15, 9158, 9160), + (9160, -1, -1, 9154, 9154, 1, 85, -1, 0, 0, 15, 9159, 9161), + (9161, -1, -1, 9154, 9154, 1, 85, -1, 0, 0, 15, 9160, 9162), + (9162, -1, -1, 9154, 9154, 1, 85, -1, 0, 0, 15, 9161, -1), + (9163, -1, -1, 9163, 9163, 1, 85, -1, 0, 0, 15, -1, 9164), + (9164, -1, -1, 9163, 9163, 1, 85, -1, 0, 0, 15, 9163, 9165), + (9165, -1, -1, 9163, 9163, 1, 85, -1, 0, 0, 15, 9164, 9166), + (9166, -1, -1, 9163, 9163, 1, 85, -1, 0, 0, 15, 9165, 9167), + (9167, -1, -1, 9163, 9163, 1, 85, -1, 0, 0, 15, 9166, 9168), + (9168, -1, -1, 9163, 9163, 1, 85, -1, 0, 0, 15, 9167, 9169), + (9169, -1, -1, 9163, 9163, 1, 85, -1, 0, 0, 15, 9168, 9170), + (9170, -1, -1, 9163, 9163, 1, 85, -1, 0, 0, 15, 9169, 9171), + (9171, -1, -1, 9163, 9163, 1, 85, -1, 0, 0, 15, 9170, -1), + (9172, -1, -1, 9172, 9172, 1, 85, -1, 0, 0, 15, -1, 9173), + (9173, -1, -1, 9172, 9172, 1, 85, -1, 0, 0, 15, 9172, 9174), + (9174, -1, -1, 9172, 9172, 1, 85, -1, 0, 0, 15, 9173, 9175), + (9175, -1, -1, 9172, 9172, 1, 85, -1, 0, 0, 15, 9174, 9176), + (9176, -1, -1, 9172, 9172, 1, 85, -1, 0, 0, 15, 9175, 9177), + (9177, -1, -1, 9172, 9172, 1, 85, -1, 0, 0, 15, 9176, 9178), + (9178, -1, -1, 9172, 9172, 1, 85, -1, 0, 0, 15, 9177, 9179), + (9179, -1, -1, 9172, 9172, 1, 85, -1, 0, 0, 15, 9178, 9180), + (9180, -1, -1, 9172, 9172, 1, 85, -1, 0, 0, 15, 9179, -1), + (9181, -1, -1, 9181, 9181, 1, 85, -1, 0, 0, 15, -1, 9182), + (9182, -1, -1, 9181, 9181, 1, 85, -1, 0, 0, 15, 9181, 9183), + (9183, -1, -1, 9181, 9181, 1, 85, -1, 0, 0, 15, 9182, 9184), + (9184, -1, -1, 9181, 9181, 1, 85, -1, 0, 0, 15, 9183, 9185), + (9185, -1, -1, 9181, 9181, 1, 85, -1, 0, 0, 15, 9184, 9186), + (9186, -1, -1, 9181, 9181, 1, 85, -1, 0, 0, 15, 9185, 9187), + (9187, -1, -1, 9181, 9181, 1, 85, -1, 0, 0, 15, 9186, 9188), + (9188, -1, -1, 9181, 9181, 1, 85, -1, 0, 0, 15, 9187, 9189), + (9189, -1, -1, 9181, 9181, 1, 85, -1, 0, 0, 15, 9188, -1), + (9190, -1, -1, 9190, 9190, 1, 85, -1, 0, 0, 15, -1, 9191), + (9191, -1, -1, 9190, 9190, 1, 85, -1, 0, 0, 15, 9190, 9192), + (9192, -1, -1, 9190, 9190, 1, 85, -1, 0, 0, 15, 9191, 9193), + (9193, -1, -1, 9190, 9190, 1, 85, -1, 0, 0, 15, 9192, 9194), + (9194, -1, -1, 9190, 9190, 1, 85, -1, 0, 0, 15, 9193, 9195), + (9195, -1, -1, 9190, 9190, 1, 85, -1, 0, 0, 15, 9194, 9196), + (9196, -1, -1, 9190, 9190, 1, 85, -1, 0, 0, 15, 9195, 9197), + (9197, -1, -1, 9190, 9190, 1, 85, -1, 0, 0, 15, 9196, 9198), + (9198, -1, -1, 9190, 9190, 1, 85, -1, 0, 0, 15, 9197, -1), + (9199, -1, -1, 9199, 9199, 1, 85, -1, 0, 0, 15, -1, 9200), + (9200, -1, -1, 9199, 9199, 1, 85, -1, 0, 0, 15, 9199, 9201), + (9201, -1, -1, 9199, 9199, 1, 85, -1, 0, 0, 15, 9200, 9202), + (9202, -1, -1, 9199, 9199, 1, 85, -1, 0, 0, 15, 9201, 9203), + (9203, -1, -1, 9199, 9199, 1, 85, -1, 0, 0, 15, 9202, 9204), + (9204, -1, -1, 9199, 9199, 1, 85, -1, 0, 0, 15, 9203, 9205), + (9205, -1, -1, 9199, 9199, 1, 85, -1, 0, 0, 15, 9204, 9206), + (9206, -1, -1, 9199, 9199, 1, 85, -1, 0, 0, 15, 9205, 9207), + (9207, -1, -1, 9199, 9199, 1, 85, -1, 0, 0, 15, 9206, -1), + (9208, -1, -1, 9208, 9208, 1, 85, -1, 0, 0, 15, -1, 9209), + (9209, -1, -1, 9208, 9208, 1, 85, -1, 0, 0, 15, 9208, 9210), + (9210, -1, -1, 9208, 9208, 1, 85, -1, 0, 0, 15, 9209, 9211), + (9211, -1, -1, 9208, 9208, 1, 85, -1, 0, 0, 15, 9210, 9212), + (9212, -1, -1, 9208, 9208, 1, 85, -1, 0, 0, 15, 9211, 9213), + (9213, -1, -1, 9208, 9208, 1, 85, -1, 0, 0, 15, 9212, 9214), + (9214, -1, -1, 9208, 9208, 1, 85, -1, 0, 0, 15, 9213, 9215), + (9215, -1, -1, 9208, 9208, 1, 85, -1, 0, 0, 15, 9214, 9216), + (9216, -1, -1, 9208, 9208, 1, 85, -1, 0, 0, 15, 9215, -1), + (9217, -1, -1, 9217, 9217, 1, 85, -1, 0, 0, 15, -1, 9218), + (9218, -1, -1, 9217, 9217, 1, 85, -1, 0, 0, 15, 9217, 9219), + (9219, -1, -1, 9217, 9217, 1, 85, -1, 0, 0, 15, 9218, 9220), + (9220, -1, -1, 9217, 9217, 1, 85, -1, 0, 0, 15, 9219, 9221), + (9221, -1, -1, 9217, 9217, 1, 85, -1, 0, 0, 15, 9220, 9222), + (9222, -1, -1, 9217, 9217, 1, 85, -1, 0, 0, 15, 9221, 9223), + (9223, -1, -1, 9217, 9217, 1, 85, -1, 0, 0, 15, 9222, 9224), + (9224, -1, -1, 9217, 9217, 1, 85, -1, 0, 0, 15, 9223, 9225), + (9225, -1, -1, 9217, 9217, 1, 85, -1, 0, 0, 15, 9224, -1), + (9226, -1, -1, 9226, 9226, 1, 85, -1, 0, 0, 15, -1, 9227), + (9227, -1, -1, 9226, 9226, 1, 85, -1, 0, 0, 15, 9226, 9228), + (9228, -1, -1, 9226, 9226, 1, 85, -1, 0, 0, 15, 9227, 9229), + (9229, -1, -1, 9226, 9226, 1, 85, -1, 0, 0, 15, 9228, 9230), + (9230, -1, -1, 9226, 9226, 1, 85, -1, 0, 0, 15, 9229, 9231), + (9231, -1, -1, 9226, 9226, 1, 85, -1, 0, 0, 15, 9230, 9232), + (9232, -1, -1, 9226, 9226, 1, 85, -1, 0, 0, 15, 9231, 9233), + (9233, -1, -1, 9226, 9226, 1, 85, -1, 0, 0, 15, 9232, 9234), + (9234, -1, -1, 9226, 9226, 1, 85, -1, 0, 0, 15, 9233, -1), + (9235, -1, -1, 9235, 9235, 1, 85, -1, 0, 0, 15, -1, 9236), + (9236, -1, -1, 9235, 9235, 1, 85, -1, 0, 0, 15, 9235, 9237), + (9237, -1, -1, 9235, 9235, 1, 85, -1, 0, 0, 15, 9236, 9238), + (9238, -1, -1, 9235, 9235, 1, 85, -1, 0, 0, 15, 9237, 9239), + (9239, -1, -1, 9235, 9235, 1, 85, -1, 0, 0, 15, 9238, 9240), + (9240, -1, -1, 9235, 9235, 1, 85, -1, 0, 0, 15, 9239, 9241), + (9241, -1, -1, 9235, 9235, 1, 85, -1, 0, 0, 15, 9240, 9242), + (9242, -1, -1, 9235, 9235, 1, 85, -1, 0, 0, 15, 9241, 9243), + (9243, -1, -1, 9235, 9235, 1, 85, -1, 0, 0, 15, 9242, -1), + (9300, 9300, 9300, 9300, 9300, 5, 85, 16212, 40, 600, 15, -1, 9301), + (9301, 9300, 9300, 9300, 9300, 5, 85, 16213, 40, 600, 15, 9300, 9302), + (9302, 9300, 9300, 9300, 9300, 5, 85, 16214, 40, 600, 15, 9301, -1), + (9303, 9303, 9303, 9303, 9303, 5, 85, 16215, 40, 600, 15, -1, 9304), + (9304, 9303, 9303, 9303, 9303, 5, 85, 16216, 40, 600, 15, 9303, 9305), + (9305, 9303, 9303, 9303, 9303, 5, 85, 16217, 40, 600, 15, 9304, -1), + (9306, 9306, 9306, 9306, 9306, 5, 85, 16218, 40, 600, 15, -1, 9307), + (9307, 9306, 9306, 9306, 9306, 5, 85, 16219, 40, 600, 15, 9306, 9308), + (9308, 9306, 9306, 9306, 9306, 5, 85, 16220, 40, 600, 15, 9307, -1), + (9309, 9309, 9309, 9309, 9309, 5, 85, 16249, 40, 600, 15, -1, 9310), + (9310, 9309, 9309, 9309, 9309, 5, 85, 16250, 40, 600, 15, 9309, 9311), + (9311, 9309, 9309, 9309, 9309, 5, 85, 16251, 40, 600, 15, 9310, -1), + (9312, 9312, 9312, 9312, 9312, 5, 85, 16252, 40, 600, 15, -1, 9313), + (9313, 9312, 9312, 9312, 9312, 5, 85, 16253, 40, 600, 15, 9312, 9314), + (9314, 9312, 9312, 9312, 9312, 5, 85, 16254, 40, 600, 15, 9313, -1), + (9315, 9315, 9315, 9315, 9315, 5, 85, 16255, 40, 600, 15, -1, 9316), + (9316, 9315, 9315, 9315, 9315, 5, 85, 16256, 40, 600, 15, 9315, 9317), + (9317, 9315, 9315, 9315, 9315, 5, 85, 16257, 40, 600, 15, 9316, -1), + (9318, 9318, 9318, 9318, 9318, 5, 85, 16261, 40, 600, 15, -1, 9319), + (9319, 9318, 9318, 9318, 9318, 5, 85, 16262, 40, 600, 15, 9318, 9320), + (9320, 9318, 9318, 9318, 9318, 5, 85, 16263, 40, 600, 15, 9319, -1), + (9321, 9321, 9321, 9321, 9321, 5, 85, 16264, 40, 600, 15, -1, 9322), + (9322, 9321, 9321, 9321, 9321, 5, 85, 16265, 40, 600, 15, 9321, 9323), + (9323, 9321, 9321, 9321, 9321, 5, 85, 16266, 40, 600, 15, 9322, -1), + (9324, 9324, 9324, 9324, 9324, 5, 85, 16267, 40, 600, 15, -1, 9325), + (9325, 9324, 9324, 9324, 9324, 5, 85, 16268, 40, 600, 15, 9324, 9326), + (9326, 9324, 9324, 9324, 9324, 5, 85, 16269, 40, 600, 15, 9325, -1), + (9327, 9327, 9327, 9327, 9327, 5, 85, 16270, 40, 600, 15, -1, 9328), + (9328, 9327, 9327, 9327, 9327, 5, 85, 16271, 40, 600, 15, 9327, 9329), + (9329, 9327, 9327, 9327, 9327, 5, 85, 16272, 40, 600, 15, 9328, -1), + (9330, 9330, 9330, 9330, 9330, 5, 85, 16273, 40, 600, 15, -1, 9331), + (9331, 9330, 9330, 9330, 9330, 5, 85, 16274, 40, 600, 15, 9330, 9332), + (9332, 9330, 9330, 9330, 9330, 5, 85, 16275, 40, 600, 15, 9331, -1), + (9333, 9333, 9333, 9333, 9333, 5, 85, 16276, 40, 600, 15, -1, 9334), + (9334, 9333, 9333, 9333, 9333, 5, 85, 16277, 40, 600, 15, 9333, 9335), + (9335, 9333, 9333, 9333, 9333, 5, 85, 16278, 40, 600, 15, 9334, -1), + (9336, 9336, 9336, 9336, 9336, 5, 85, 16284, 40, 600, 15, -1, 9337), + (9337, 9336, 9336, 9336, 9336, 5, 85, 16285, 40, 600, 15, 9336, 9338), + (9338, 9336, 9336, 9336, 9336, 5, 85, 16286, 40, 600, 15, 9337, -1), + (9339, 9339, 9339, 9339, 9339, 5, 85, 16287, 40, 600, 15, -1, 9340), + (9340, 9339, 9339, 9339, 9339, 5, 85, 16288, 40, 600, 15, 9339, 9341), + (9341, 9339, 9339, 9339, 9339, 5, 85, 16289, 40, 600, 15, 9340, -1), + (9342, 9342, 9342, 9342, 9342, 5, 85, 16290, 40, 600, 15, -1, 9343), + (9343, 9342, 9342, 9342, 9342, 5, 85, 16291, 40, 600, 15, 9342, 9344), + (9344, 9342, 9342, 9342, 9342, 5, 85, 16292, 40, 600, 15, 9343, -1), + (9345, 9345, 9345, 9345, 9345, 5, 85, 16293, 40, 600, 15, -1, 9346), + (9346, 9345, 9345, 9345, 9345, 5, 85, 16294, 40, 600, 15, 9345, 9347), + (9347, 9345, 9345, 9345, 9345, 5, 85, 16295, 40, 600, 15, 9346, -1), + (9348, 9348, 9348, 9348, 9348, 5, 85, 16296, 40, 600, 15, -1, 9349), + (9349, 9348, 9348, 9348, 9348, 5, 85, 16297, 40, 600, 15, 9348, 9350), + (9350, 9348, 9348, 9348, 9348, 5, 85, 16298, 40, 600, 15, 9349, -1), + (9351, 9351, 9351, 9351, 9351, 5, 85, 16299, 40, 600, 15, -1, 9352), + (9352, 9351, 9351, 9351, 9351, 5, 85, 16300, 40, 600, 15, 9351, 9353), + (9353, 9351, 9351, 9351, 9351, 5, 85, 16301, 40, 600, 15, 9352, -1), + (9354, 9354, 9354, 9354, 9354, 5, 85, 16305, 40, 600, 15, -1, 9355), + (9355, 9354, 9354, 9354, 9354, 5, 85, 16306, 40, 600, 15, 9354, 9356), + (9356, 9354, 9354, 9354, 9354, 5, 85, 16307, 40, 600, 15, 9355, 12626), + (9357, 9357, 9357, 9357, 9357, 5, 85, 16308, 40, 600, 15, -1, 9358), + (9358, 9357, 9357, 9357, 9357, 5, 85, 16309, 40, 600, 15, 9357, 9359), + (9359, 9357, 9357, 9357, 9357, 5, 85, 16310, 40, 600, 15, 9358, 12629), + (9360, 9360, 9360, 9360, 9360, 5, 85, 16311, 40, 600, 15, -1, 9361), + (9361, 9360, 9360, 9360, 9360, 5, 85, 16312, 40, 600, 15, 9360, 9362), + (9362, 9360, 9360, 9360, 9360, 5, 85, 16313, 40, 600, 15, 9361, 12632), + (9363, 9363, 9363, 9363, 9363, 5, 85, 16317, 40, 600, 15, -1, 9364), + (9364, 9363, 9363, 9363, 9363, 5, 85, 16318, 40, 600, 15, 9363, 9365), + (9365, 9363, 9363, 9363, 9363, 5, 85, 16319, 40, 600, 15, 9364, -1), + (9366, 9366, 9366, 9366, 9366, 5, 85, 16320, 40, 600, 15, -1, 9367), + (9367, 9366, 9366, 9366, 9366, 5, 85, 16321, 40, 600, 15, 9366, 9368), + (9368, 9366, 9366, 9366, 9366, 5, 85, 16322, 40, 600, 15, 9367, -1), + (9369, 9369, 9369, 9369, 9369, 5, 85, 16323, 40, 600, 15, -1, 9370), + (9370, 9369, 9369, 9369, 9369, 5, 85, 16324, 40, 600, 15, 9369, 9371), + (9371, 9369, 9369, 9369, 9369, 5, 85, 16325, 40, 600, 15, 9370, -1), + (9372, 9372, 9372, 9372, 9372, 5, 85, 16326, 40, 600, 15, -1, 9373), + (9373, 9372, 9372, 9372, 9372, 5, 85, 16327, 40, 600, 15, 9372, 9374), + (9374, 9372, 9372, 9372, 9372, 5, 85, 16328, 40, 600, 15, 9373, -1), + (9375, 9375, 9375, 9375, 9375, 5, 85, 16329, 40, 600, 15, -1, 9376), + (9376, 9375, 9375, 9375, 9375, 5, 85, 16330, 40, 600, 15, 9375, 9377), + (9377, 9375, 9375, 9375, 9375, 5, 85, 16331, 40, 600, 15, 9376, -1), + (9378, 9378, 9378, 9378, 9378, 5, 85, 16332, 40, 600, 15, -1, 9379), + (9379, 9378, 9378, 9378, 9378, 5, 85, 16333, 40, 600, 15, 9378, 9380), + (9380, 9378, 9378, 9378, 9378, 5, 85, 16334, 40, 600, 15, 9379, -1), + (9381, 9381, 9381, 9381, 9381, 5, 85, 16335, 40, 600, 15, -1, 9382), + (9382, 9381, 9381, 9381, 9381, 5, 85, 16336, 40, 600, 15, 9381, 9383), + (9383, 9381, 9381, 9381, 9381, 5, 85, 16337, 40, 600, 15, 9382, -1), + (9384, 9384, 9384, 9384, 9384, 5, 85, 16338, 40, 600, 15, -1, 9385), + (9385, 9384, 9384, 9384, 9384, 5, 85, 16339, 40, 600, 15, 9384, 9386), + (9386, 9384, 9384, 9384, 9384, 5, 85, 16340, 40, 600, 15, 9385, -1), + (9387, 9387, 9387, 9387, 9387, 5, 85, 16341, 40, 600, 15, -1, 9388), + (9388, 9387, 9387, 9387, 9387, 5, 85, 16342, 40, 600, 15, 9387, 9389), + (9389, 9387, 9387, 9387, 9387, 5, 85, 16343, 40, 600, 15, 9388, -1), + (9390, 9390, 9390, 9390, 9390, 5, 85, 16344, 40, 600, 15, -1, 9391), + (9391, 9390, 9390, 9390, 9390, 5, 85, 16345, 40, 600, 15, 9390, 9392), + (9392, 9390, 9390, 9390, 9390, 5, 85, 16346, 40, 600, 15, 9391, -1), + (9393, 9393, 9393, 9393, 9393, 5, 85, 16347, 40, 600, 15, -1, 9394), + (9394, 9393, 9393, 9393, 9393, 5, 85, 16348, 40, 600, 15, 9393, 9395), + (9395, 9393, 9393, 9393, 9393, 5, 85, 16349, 40, 600, 15, 9394, -1), + (9396, 9396, 9396, 9396, 9396, 5, 85, 16350, 40, 600, 15, -1, 9397), + (9397, 9396, 9396, 9396, 9396, 5, 85, 16351, 40, 600, 15, 9396, 9398), + (9398, 9396, 9396, 9396, 9396, 5, 85, 16352, 40, 600, 15, 9397, -1), + (9399, 9399, 9399, 9399, 9399, 5, 85, 16359, 40, 600, 15, -1, 9400), + (9400, 9399, 9399, 9399, 9399, 5, 85, 16360, 40, 600, 15, 9399, 9401), + (9401, 9399, 9399, 9399, 9399, 5, 85, 16361, 40, 600, 15, 9400, -1), + (9402, 9402, 9402, 9402, 9402, 5, 85, 16362, 40, 600, 15, -1, 9403), + (9403, 9402, 9402, 9402, 9402, 5, 85, 16363, 40, 600, 15, 9402, 9404), + (9404, 9402, 9402, 9402, 9402, 5, 85, 16364, 40, 600, 15, 9403, -1), + (9405, 9405, 9405, 9405, 9405, 5, 85, 16365, 40, 600, 15, -1, 9406), + (9406, 9405, 9405, 9405, 9405, 5, 85, 16366, 40, 600, 15, 9405, 9407), + (9407, 9405, 9405, 9405, 9405, 5, 85, 16367, 40, 600, 15, 9406, -1), + (9408, 9408, 9408, 9408, 9408, 5, 85, 16368, 40, 600, 15, -1, 9409), + (9409, 9408, 9408, 9408, 9408, 5, 85, 16369, 40, 600, 15, 9408, 9410), + (9410, 9408, 9408, 9408, 9408, 5, 85, 16370, 40, 600, 15, 9409, -1), + (9411, 9411, 9411, 9411, 9411, 5, 85, 16371, 40, 600, 15, -1, 9412), + (9412, 9411, 9411, 9411, 9411, 5, 85, 16372, 40, 600, 15, 9411, 9413), + (9413, 9411, 9411, 9411, 9411, 5, 85, 16373, 40, 600, 15, 9412, -1), + (9414, 9414, 9414, 9414, 9414, 5, 85, 16374, 40, 600, 15, -1, 9415), + (9415, 9414, 9414, 9414, 9414, 5, 85, 16375, 40, 600, 15, 9414, 9416), + (9416, 9414, 9414, 9414, 9414, 5, 85, 16376, 40, 600, 15, 9415, -1), + (9417, 9417, 9417, 9417, 9417, 5, 85, 16377, 40, 600, 15, -1, 9418), + (9418, 9417, 9417, 9417, 9417, 5, 85, 16378, 40, 600, 15, 9417, 9419), + (9419, 9417, 9417, 9417, 9417, 5, 85, 16379, 40, 600, 15, 9418, -1), + (9420, 9420, 9420, 9420, 9420, 5, 85, 16380, 40, 600, 15, -1, 9421), + (9421, 9420, 9420, 9420, 9420, 5, 85, 16381, 40, 600, 15, 9420, 9422), + (9422, 9420, 9420, 9420, 9420, 5, 85, 16382, 40, 600, 15, 9421, -1), + (9423, 9423, 9423, 9423, 9423, 5, 85, 16386, 40, 600, 15, -1, 9424), + (9424, 9423, 9423, 9423, 9423, 5, 85, 16387, 40, 600, 15, 9423, 9425), + (9425, 9423, 9423, 9423, 9423, 5, 85, 16388, 40, 600, 15, 9424, -1), + (9426, 9426, 9426, 9426, 9426, 5, 85, 16389, 40, 600, 15, -1, 9427), + (9427, 9426, 9426, 9426, 9426, 5, 85, 16390, 40, 600, 15, 9426, 9428), + (9428, 9426, 9426, 9426, 9426, 5, 85, 16391, 40, 600, 15, 9427, -1), + (9429, 9429, 9429, 9429, 9429, 5, 85, 16392, 40, 600, 15, -1, 9430), + (9430, 9429, 9429, 9429, 9429, 5, 85, 16393, 40, 600, 15, 9429, 9431), + (9431, 9429, 9429, 9429, 9429, 5, 85, 16394, 40, 600, 15, 9430, -1), + (9432, 9432, 9432, 9432, 9432, 5, 85, 16395, 40, 600, 15, -1, 9433), + (9433, 9432, 9432, 9432, 9432, 5, 85, 16396, 40, 600, 15, 9432, 9434), + (9434, 9432, 9432, 9432, 9432, 5, 85, 16397, 40, 600, 15, 9433, -1), + (9435, 9435, 9435, 9435, 9435, 5, 85, 16398, 40, 600, 15, -1, 9436), + (9436, 9435, 9435, 9435, 9435, 5, 85, 16399, 40, 600, 15, 9435, 9437), + (9437, 9435, 9435, 9435, 9435, 5, 85, 16400, 40, 600, 15, 9436, -1), + (9438, 9438, 9438, 9438, 9438, 5, 85, 16401, 40, 600, 15, -1, 9439), + (9439, 9438, 9438, 9438, 9438, 5, 85, 16402, 40, 600, 15, 9438, 9440), + (9440, 9438, 9438, 9438, 9438, 5, 85, 16403, 40, 600, 15, 9439, -1), + (9441, 9441, 9441, 9441, 9441, 5, 85, 16404, 40, 600, 15, -1, 9442), + (9442, 9441, 9441, 9441, 9441, 5, 85, 16405, 40, 600, 15, 9441, 9443), + (9443, 9441, 9441, 9441, 9441, 5, 85, 16406, 40, 600, 15, 9442, -1), + (9500, 9500, 9500, 9500, 9500, 3, 76, 16247, 47, 60, 15, -1, -1), + (9501, 9501, 9501, 9501, 9501, 9, 85, 16247, 47, 600, 15, -1, -1), + (9502, 9502, 9502, 9502, 9502, 7, 81, 16248, 48, 3600, 15, -1, -1), + (9503, -1, -1, 9503, 9503, 7, 83, -1, 0, 0, 15, -1, 9504), + (9504, -1, -1, 9503, 9503, 7, 84, -1, 0, 0, 15, 9503, 9505), + (9505, -1, -1, 9503, 9503, 7, 85, -1, 0, 0, 15, 9504, 10087), + (9506, -1, -1, 9506, 9506, 7, 81, -1, 0, 0, 15, -1, 9507), + (9507, -1, -1, 9506, 9506, 7, 83, -1, 0, 0, 15, 9506, 9508), + (9508, -1, -1, 9506, 9506, 7, 85, -1, 0, 0, 15, 9507, 13630), + (9509, -1, -1, 9509, 9509, 7, 81, -1, 0, 0, 15, -1, 9510), + (9510, -1, -1, 9509, 9509, 7, 82, -1, 0, 0, 15, 9509, 9511), + (9511, -1, -1, 9509, 9509, 7, 83, -1, 0, 0, 15, 9510, 9515), + (9512, -1, -1, 9512, 9512, 7, 81, -1, 0, 0, 15, -1, 9513), + (9513, -1, -1, 9512, 9512, 7, 82, -1, 0, 0, 15, 9512, 9514), + (9514, -1, -1, 9512, 9512, 7, 83, -1, 0, 0, 15, 9513, 7819), + (9515, -1, -1, 9509, 9509, 7, 86, -1, 0, 0, 17, 9511, 16361), + (10003, 6610, 6610, 6610, 6610, 5, 60, 16494, 41, 30, 16, 6610, 10573), + (10004, -1, -1, 6614, 6614, 6, 70, -1, 0, 0, 16, 6616, 10005), + (10005, -1, -1, 6614, 6614, 9, 70, -1, 0, 0, 16, 10004, 10575), + (10006, 54006, 54006, 54006, 54006, 7, 85, 16495, 18, 180, 16, 7111, 13425), + (10007, -1, -1, 6564, 6564, 10, 85, -1, 0, 0, 16, 7114, 10008), + (10008, -1, -1, 6564, 6564, 10, 85, -1, 0, 0, 16, 10007, 10009), + (10009, -1, -1, 6564, 6564, 10, 85, -1, 0, 0, 16, 10008, 10568), + (10010, 6565, 6565, 6565, 6565, 7, 85, 16496, 17, 45, 16, 7115, 10517), + (10011, 912, 912, 912, 912, 9, 80, 16497, 4, 3600, 16, 7121, 10012), + (10012, 912, 912, 912, 912, 9, 80, 16498, 4, 3600, 16, 10011, 10013), + (10013, 912, 912, 912, 912, 9, 80, 16499, 4, 3600, 16, 10012, 10585), + (10014, 1383, 1383, 1383, 1383, 12, 85, 21766, 6, 300, 16, 7299, 6487), + (10015, 1195, 1195, 1195, 1195, 9, 85, 16504, 13, 2160, 16, 7300, 13259), + (10016, 131, 131, 131, 131, 10, 85, 16505, 4, 900, 16, 7303, 10017), + (10017, 131, 131, 131, 131, 10, 85, 16506, 4, 900, 16, 10016, 10018), + (10018, 131, 131, 131, 131, 10, 85, 16507, 4, 900, 16, 10017, 7770), + (10019, 1192, 1192, 1192, 1192, 10, 85, 20177, 12, 1320, 16, 7306, 10020), + (10020, 1192, 1192, 1192, 1192, 10, 85, 21652, 12, 1320, 16, 10019, 10021), + (10021, 1192, 1192, 1192, 1192, 10, 85, 21704, 12, 1320, 16, 10020, 13363), + (10022, 746, 746, 746, 746, 12, 85, 16511, 10, 2160, 16, 7309, 10023), + (10023, 746, 746, 746, 746, 12, 85, 16512, 10, 2160, 16, 10022, 10024), + (10024, 746, 746, 746, 746, 12, 85, 16513, 10, 2160, 16, 10023, 15321), + (10025, -1, -1, 6601, 6601, 6, 85, -1, 0, 0, 16, 7322, 10026), + (10026, -1, -1, 6601, 6601, 6, 85, -1, 0, 0, 16, 10025, 10027), + (10027, -1, -1, 6601, 6601, 6, 85, -1, 0, 0, 16, 10026, 10028), + (10028, -1, -1, 6601, 6601, 6, 85, -1, 0, 0, 16, 10027, 10029), + (10029, -1, -1, 6601, 6601, 6, 85, -1, 0, 0, 16, 10028, 10437), + (10030, -1, -1, 7940, 7940, 5, 75, -1, 0, 0, 16, 7942, 10031), + (10031, -1, -1, 7940, 7940, 7, 75, -1, 0, 0, 16, 10030, 10032), + (10032, -1, -1, 7940, 7940, 9, 75, -1, 0, 0, 16, 10031, 6484), + (10033, -1, -1, 7945, 7945, 6, 85, -1, 0, 0, 16, 7947, 10034), + (10034, -1, -1, 7945, 7945, 6, 85, -1, 0, 0, 16, 10033, 10347), + (10035, -1, -1, 7948, 7948, 6, 85, -1, 0, 0, 16, 7950, 10036), + (10036, -1, -1, 7948, 7948, 6, 85, -1, 0, 0, 16, 10035, 10037), + (10037, -1, -1, 7948, 7948, 6, 85, -1, 0, 0, 16, 10036, 15328), + (10038, 7951, 7951, 7951, 7951, 6, 85, 16514, 61, 900, 16, 7953, 10039), + (10039, 7951, 7951, 7951, 7951, 6, 85, 16515, 61, 900, 16, 10038, 10040), + (10040, 7951, 7951, 7951, 7951, 6, 85, 16516, 61, 900, 16, 10039, 7773), + (10041, -1, -1, 6636, 6636, 9, 75, -1, 0, 0, 16, 6638, 10042), + (10042, -1, -1, 6636, 6636, 10, 75, -1, 0, 0, 16, 10041, 10043), + (10043, -1, -1, 6636, 6636, 11, 75, -1, 0, 0, 16, 10042, 12529), + (10044, -1, -1, 6791, 6791, 6, 85, -1, 0, 0, 16, 6793, 10045), + (10045, -1, -1, 6791, 6791, 6, 85, -1, 0, 0, 16, 10044, 10046), + (10046, -1, -1, 6791, 6791, 6, 85, -1, 0, 0, 16, 10045, 10676), + (10047, 534, 534, 534, 534, 12, 85, 16561, 4, 2160, 16, 7331, 10048), + (10048, 534, 534, 534, 534, 12, 85, 16562, 4, 2160, 16, 10047, 10049), + (10049, 534, 534, 534, 534, 12, 85, 16563, 4, 2160, 16, 10048, 10708), + (10050, -1, -1, 6395, 6395, 7, 85, -1, 0, 0, 16, 7338, 10051), + (10051, -1, -1, 6395, 6395, 7, 85, -1, 0, 0, 16, 10050, 10052), + (10052, -1, -1, 6395, 6395, 7, 85, -1, 0, 0, 16, 10051, 10705), + (10053, 6754, 6754, 6754, 6754, 9, 75, 16570, 41, 1200, 16, 6754, 14111), + (10054, 6758, 6758, 6758, 6758, 10, 85, 16571, 43, 900, 16, 6760, 10055), + (10055, 6758, 6758, 6758, 6758, 11, 85, 16572, 43, 900, 16, 10054, 10056), + (10056, 6758, 6758, 6758, 6758, 12, 85, 16573, 43, 900, 16, 10055, 13546), + (10057, 6764, 6764, 6764, 6764, 9, 80, 16574, 52, 600, 16, 6764, 16716), + (10058, -1, -1, 6765, 6765, 9, 85, -1, 0, 0, 16, 6767, 10059), + (10059, -1, -1, 6765, 6765, 9, 85, -1, 0, 0, 16, 10058, 10060), + (10060, -1, -1, 6765, 6765, 9, 85, -1, 0, 0, 16, 10059, 10766), + (10061, 5007, 5007, 5007, 5007, 9, 85, 16575, 8, 2160, 16, 7343, 10062), + (10062, 5007, 5007, 5007, 5007, 9, 85, 16576, 8, 2160, 16, 10061, 10063), + (10063, 5007, 5007, 5007, 5007, 9, 85, 16577, 8, 2160, 16, 10062, 13119), + (10064, -1, -1, 1608, 1608, 6, 85, -1, 0, 0, 16, 7383, 10065), + (10065, -1, -1, 1608, 1608, 7, 85, -1, 0, 0, 16, 10064, 10066), + (10066, -1, -1, 1608, 1608, 8, 85, -1, 0, 0, 16, 10065, 10067), + (10067, -1, -1, 1608, 1608, 9, 85, -1, 0, 0, 16, 10066, 10068), + (10068, -1, -1, 1608, 1608, 10, 85, -1, 0, 0, 16, 10067, 10069), + (10069, -1, -1, 1608, 1608, 11, 85, -1, 0, 0, 16, 10068, 16730), + (10070, -1, -1, 6630, 6630, 6, 75, -1, 0, 0, 16, 6634, 10071), + (10071, -1, -1, 6630, 6630, 6, 75, -1, 0, 0, 16, 10070, 10072), + (10072, -1, -1, 6630, 6630, 6, 75, -1, 0, 0, 16, 10071, 10073), + (10073, -1, -1, 6630, 6630, 6, 75, -1, 0, 0, 16, 10072, 10074), + (10074, -1, -1, 6630, 6630, 6, 75, -1, 0, 0, 16, 10073, 13621), + (10075, -1, -1, 6641, 6641, 9, 85, -1, 0, 0, 16, 6643, 10076), + (10076, -1, -1, 6641, 6641, 9, 85, -1, 0, 0, 16, 10075, 10077), + (10077, -1, -1, 6641, 6641, 9, 85, -1, 0, 0, 16, 10076, 16192), + (10078, 6508, 6508, 6508, 6508, 7, 85, 16578, 38, 600, 16, 7389, 10079), + (10079, 6508, 6508, 6508, 6508, 7, 85, 16579, 38, 600, 16, 10078, 10080), + (10080, 6508, 6508, 6508, 6508, 7, 85, 16580, 38, 600, 16, 10079, 15775), + (10081, -1, -1, 1313, 1313, 12, 85, -1, 0, 0, 16, 7398, 10082), + (10082, -1, -1, 1313, 1313, 12, 85, -1, 0, 0, 16, 10081, 10083), + (10083, -1, -1, 1313, 1313, 12, 85, -1, 0, 0, 16, 10082, 12579), + (10084, -1, -1, 6375, 6375, 6, 85, -1, 0, 0, 16, 7663, 10085), + (10085, -1, -1, 6375, 6375, 6, 85, -1, 0, 0, 16, 10084, 10086), + (10086, -1, -1, 6375, 6375, 6, 85, -1, 0, 0, 16, 10085, 5347), + (10087, -1, -1, 9503, 9503, 7, 85, -1, 0, 0, 16, 9505, 10088), + (10088, -1, -1, 9503, 9503, 7, 85, -1, 0, 0, 16, 10087, 10089), + (10089, -1, -1, 9503, 9503, 7, 85, -1, 0, 0, 16, 10088, 12792), + (10090, 1498, 1498, 1498, 1498, 12, 85, 16590, 12, 1320, 16, 7410, 10091), + (10091, 1498, 1498, 1498, 1498, 12, 85, 16591, 12, 1320, 16, 10090, 10092), + (10092, 1498, 1498, 1498, 1498, 12, 85, 16602, 12, 1320, 16, 10091, 13401), + (10093, 1495, 1495, 1495, 1495, 9, 86, 16603, 30, 900, 17, 7416, 10094), + (10096, 548, 548, 548, 548, 10, 85, 16606, 5, 900, 16, 7419, 10097), + (10097, 548, 548, 548, 548, 10, 85, 16607, 5, 900, 16, 10096, 10098), + (10098, 548, 548, 548, 548, 10, 85, 16608, 5, 900, 16, 10097, 13158), + (10099, 6561, 6561, 6561, 6561, 7, 85, 16609, 32, 30, 16, 7424, 10100), + (10100, 6561, 6561, 6561, 6561, 7, 85, 16610, 32, 30, 16, 10099, 10101), + (10101, 6561, 6561, 6561, 6561, 7, 85, 16611, 32, 30, 16, 10100, 10418), + (10102, 510, 510, 510, 510, 3, 75, 16587, 37, 240, 16, 7427, 10103), + (10103, 510, 510, 510, 510, 3, 75, 16588, 37, 240, 16, 10102, 10104), + (10104, 510, 510, 510, 510, 3, 75, 16589, 37, 240, 16, 10103, 10824), + (10105, -1, -1, 7664, 7664, 2, 82, -1, 0, 0, 16, 7668, 10106), + (10106, -1, -1, 7664, 7664, 2, 82, -1, 0, 0, 16, 10105, 10107), + (10107, -1, -1, 7664, 7664, 2, 82, -1, 0, 0, 16, 10106, 10108), + (10108, -1, -1, 7664, 7664, 2, 82, -1, 0, 0, 16, 10107, 10109), + (10109, -1, -1, 7664, 7664, 2, 82, -1, 0, 0, 16, 10108, 17350), + (10110, -1, -1, 7983, 7983, 6, 81, -1, 0, 0, 16, 7985, 10111), + (10111, -1, -1, 7983, 7983, 6, 81, -1, 0, 0, 16, 10110, 10112), + (10112, -1, -1, 7983, 7983, 6, 81, -1, 0, 0, 16, 10111, -1), + (10113, 1352, 1352, 1352, 1352, 6, 85, 16618, 3, 60, 16, 7156, 10114), + (10114, 1352, 1352, 1352, 1352, 6, 85, 16619, 3, 60, 16, 10113, 10115), + (10115, 1352, 1352, 1352, 1352, 6, 85, 16620, 3, 60, 16, 10114, 13807), + (10116, 1358, 1358, 1358, 1358, 6, 85, 16615, 3, 60, 16, 7159, 10117), + (10117, 1358, 1358, 1358, 1358, 6, 85, 16616, 3, 60, 16, 10116, 10118), + (10118, 1358, 1358, 1358, 1358, 6, 85, 16617, 3, 60, 16, 10117, 13810), + (10119, 1355, 1355, 1355, 1355, 6, 85, 16612, 3, 60, 16, 7174, 10120), + (10120, 1355, 1355, 1355, 1355, 6, 85, 16613, 3, 60, 16, 10119, 10121), + (10121, 1355, 1355, 1355, 1355, 6, 85, 16614, 3, 60, 16, 10120, 12700), + (10122, -1, -1, 4801, 4801, 6, 85, -1, 0, 0, 16, 7162, 10123), + (10123, -1, -1, 4801, 4801, 6, 85, -1, 0, 0, 16, 10122, 12674), + (10124, -1, -1, 611, 611, 2, 75, -1, 0, 0, 16, 7177, 10125), + (10125, -1, -1, 611, 611, 2, 75, -1, 0, 0, 16, 10124, 10126), + (10126, -1, -1, 611, 611, 2, 75, -1, 0, 0, 16, 10125, 12703), + (10127, 7872, 7872, 7872, 7872, 6, 85, 16621, 41, 600, 16, 7874, 10128), + (10128, 7872, 7872, 7872, 7872, 6, 85, 16622, 41, 600, 16, 10127, 10129), + (10129, 7872, 7872, 7872, 7872, 6, 85, 16623, 41, 600, 16, 10128, 12682), + (10130, -1, -1, 6870, 6870, 6, 80, -1, 0, 0, 16, 6872, 10131), + (10131, -1, -1, 6870, 6870, 6, 80, -1, 0, 0, 16, 10130, 10132), + (10132, -1, -1, 6870, 6870, 6, 80, -1, 0, 0, 16, 10131, -1), + (10133, -1, -1, 255, 255, 9, 80, -1, 0, 0, 16, 6875, 10134), + (10134, -1, -1, 255, 255, 9, 80, -1, 0, 0, 16, 10133, 10135), + (10135, -1, -1, 255, 255, 9, 80, -1, 0, 0, 16, 10134, 13196), + (10136, -1, -1, 6375, 6375, 6, 83, -1, 0, 0, 16, 6878, 10137), + (10137, -1, -1, 6375, 6375, 6, 83, -1, 0, 0, 16, 10136, 10138), + (10138, -1, -1, 6375, 6375, 6, 83, -1, 0, 0, 16, 10137, 12734), + (10139, 6533, 6533, 6533, 6533, 10, 85, 16631, 15, 600, 16, 7428, 12740), + (10140, 1116, 1116, 1116, 1116, 12, 85, 16647, 4, 2160, 16, 7432, 10141), + (10141, 1116, 1116, 1116, 1116, 12, 85, 16648, 4, 2160, 16, 10140, 10142), + (10142, 1116, 1116, 1116, 1116, 12, 85, 16649, 4, 2160, 16, 10141, 12743), + (10143, 5298, 5298, 5298, 5298, 12, 85, 16632, 32, 1800, 16, 7440, 10144), + (10144, 5298, 5298, 5298, 5298, 12, 85, 16633, 32, 1800, 16, 10143, 10145), + (10145, 5298, 5298, 5298, 5298, 12, 85, 16634, 32, 1800, 16, 10144, 12746), + (10146, 1598, -1, 1598, 1598, 12, 85, 16638, 6, 900, 16, 7443, 10147), + (10147, 1598, -1, 1598, 1598, 12, 85, 16639, 6, 900, 16, 10146, 10148), + (10148, 1598, -1, 1598, 1598, 12, 85, 16640, 6, 900, 16, 10147, 13193), + (10149, 5020, 5020, 5020, 5020, 9, 85, 16630, 9, 300, 16, 7444, 13490), + (10150, 1110, 1110, 1110, 1110, 6, 85, 16641, 3, 2160, 16, 7447, 10151), + (10151, 1110, 1110, 1110, 1110, 6, 85, 16642, 3, 2160, 16, 10150, 10152), + (10152, 1110, 1110, 1110, 1110, 6, 85, 16643, 3, 2160, 16, 10151, 13190), + (10153, -1, -1, 6337, 6337, 6, 85, -1, 0, 0, 16, 7450, 10154), + (10154, -1, -1, 6337, 6337, 6, 85, -1, 0, 0, 16, 10153, 10155), + (10155, -1, -1, 6337, 6337, 6, 85, -1, 0, 0, 16, 10154, 16297), + (10156, 5017, 5017, 5017, 5017, 9, 85, 16627, 8, 600, 16, 7456, 10157), + (10157, 5017, 5017, 5017, 5017, 9, 85, 16628, 8, 600, 16, 10156, 10158), + (10158, 5017, 5017, 5017, 5017, 9, 85, 16629, 8, 600, 16, 10157, 14189), + (10159, 1569, 1569, 1569, 1569, 7, 85, 16624, 5, 1800, 16, 7459, 10160), + (10160, 1569, 1569, 1569, 1569, 7, 85, 16625, 5, 1800, 16, 10159, 10161), + (10161, 1569, 1569, 1569, 1569, 7, 85, 16626, 5, 1800, 16, 10160, 17276), + (10162, 6663, 6663, 6663, 6663, 7, 82, 16653, 59, 600, 16, 6665, 10163), + (10163, 6663, 6663, 6663, 6663, 7, 82, 16654, 59, 600, 16, 10162, 10164), + (10164, 6663, 6663, 6663, 6663, 7, 82, 16655, 59, 600, 16, 10163, -1), + (10165, -1, -1, 1543, 1543, 12, 85, -1, 0, 0, 16, 7136, 10166), + (10166, -1, -1, 1543, 1543, 12, 85, -1, 0, 0, 16, 10165, 10167), + (10167, -1, -1, 1543, 1543, 12, 85, -1, 0, 0, 16, 10166, 13213), + (10168, 6328, 6328, 6328, 6328, 7, 85, 16650, 10, 600, 16, 7145, 10169), + (10169, 6328, 6328, 6328, 6328, 7, 85, 16651, 10, 600, 16, 10168, 10170), + (10170, 6328, 6328, 6328, 6328, 7, 85, 16652, 10, 600, 16, 10169, 13770), + (10171, -1, -1, 878, 878, 7, 85, -1, 0, 0, 16, 7147, 10172), + (10172, -1, -1, 878, 878, 7, 85, -1, 0, 0, 16, 10171, -1), + (10173, -1, -1, 846, 846, 12, 85, -1, 0, 0, 16, 7153, 10174), + (10174, -1, -1, 846, 846, 12, 85, -1, 0, 0, 16, 10173, 10175), + (10175, -1, -1, 846, 846, 12, 85, -1, 0, 0, 16, 10174, 13795), + (10176, -1, -1, 6703, 6703, 3, 70, -1, 0, 0, 16, 6705, 10177), + (10177, -1, -1, 6703, 6703, 3, 70, -1, 0, 0, 16, 10176, 10178), + (10178, -1, -1, 6703, 6703, 3, 70, -1, 0, 0, 16, 10177, 13005), + (10179, 6706, 6706, 6706, 6706, 7, 85, 16675, 44, 600, 16, 6708, 10180), + (10180, 6706, 6706, 6706, 6706, 7, 85, 16676, 44, 600, 16, 10179, 10181), + (10181, 6706, 6706, 6706, 6706, 7, 85, 16677, 44, 600, 16, 10180, 5353), + (10182, -1, -1, 6712, 6712, 7, 85, -1, 0, 0, 16, 6716, 10183), + (10183, -1, -1, 6712, 6712, 7, 85, -1, 0, 0, 16, 10182, 10184), + (10184, -1, -1, 6712, 6712, 7, 85, -1, 0, 0, 16, 10183, 10185), + (10185, -1, -1, 6712, 6712, 7, 85, -1, 0, 0, 16, 10184, 10186), + (10186, -1, -1, 6712, 6712, 7, 85, -1, 0, 0, 16, 10185, -1), + (10187, 1327, 1327, 1327, 1327, 12, 85, 16665, 10, 900, 16, 7462, 10188), + (10188, 1327, 1327, 1327, 1327, 12, 85, 16666, 10, 900, 16, 10187, 10189), + (10189, 1327, 1327, 1327, 1327, 12, 85, 16667, 10, 900, 16, 10188, 5330), + (10190, 1520, 1520, 1520, 1520, 9, 80, 16672, 11, 900, 16, 7465, 10191), + (10191, 1520, 1520, 1520, 1520, 9, 80, 16673, 11, 900, 16, 10190, 10192), + (10192, 1520, 1520, 1520, 1520, 9, 80, 16674, 11, 900, 16, 10191, 12997), + (10193, 153, 153, 153, 153, 12, 85, 16668, 3, 2160, 16, 7468, 11081), + (10194, 528, 528, 528, 528, 12, 85, 16669, 5, 720, 16, 7471, 10195), + (10195, 528, 528, 528, 528, 12, 85, 16670, 5, 720, 16, 10194, 10196), + (10196, 528, 528, 528, 528, 12, 85, 16671, 5, 720, 16, 10195, 13161), + (10197, 5251, 5251, 5251, 5251, 12, 85, 16662, 13, 900, 16, 7474, 10198), + (10198, 5251, 5251, 5251, 5251, 12, 85, 16663, 13, 900, 16, 10197, 10199), + (10199, 5251, 5251, 5251, 5251, 12, 85, 16664, 13, 900, 16, 10198, 5363), + (10200, 6815, 6815, 6815, 6815, 8, 85, 16691, 60, 600, 16, 6817, 10201), + (10201, 6815, 6815, 6815, 6815, 8, 85, 16692, 60, 600, 16, 10200, 10202), + (10202, 6815, 6815, 6815, 6815, 8, 85, 16693, 60, 600, 16, 10201, 12786), + (10203, -1, -1, 6819, 6819, 6, 77, -1, 0, 0, 16, 6821, 10204), + (10204, -1, -1, 6819, 6819, 6, 77, -1, 0, 0, 16, 10203, 10205), + (10205, -1, -1, 6819, 6819, 6, 77, -1, 0, 0, 16, 10204, -1), + (10206, -1, -1, 6823, 6823, 4, 75, -1, 0, 0, 16, 6827, 10207), + (10207, -1, -1, 6823, 6823, 4, 77, -1, 0, 0, 16, 10206, -1), + (10208, 6828, 6828, 6828, 6828, 12, 85, 16686, 43, 60, 16, 6828, 17534), + (10209, 1274, 1274, 1274, 1274, 12, 85, 16683, 9, 540, 16, 7201, 10210), + (10210, 1274, 1274, 1274, 1274, 12, 85, 16684, 9, 540, 16, 10209, 10211), + (10211, 1274, 1274, 1274, 1274, 12, 85, 16685, 9, 540, 16, 10210, 12760), + (10212, 1510, -1, 1510, 1510, 12, 80, 16690, 13, 2160, 16, 7202, -1), + (10213, -1, -1, 5264, 5264, 12, 85, -1, 0, 0, 16, 7208, 10214), + (10214, -1, -1, 5264, 5264, 12, 85, -1, 0, 0, 16, 10213, 10215), + (10215, -1, -1, 5264, 5264, 12, 85, -1, 0, 0, 16, 10214, 10216), + (10216, -1, -1, 5264, 5264, 12, 85, -1, 0, 0, 16, 10215, 10217), + (10217, -1, -1, 5264, 5264, 12, 85, -1, 0, 0, 16, 10216, 12798), + (10218, 4927, 4927, 4927, 4927, 9, 85, 16682, 14, 600, 16, 7209, -1), + (10219, -1, -1, 839, 839, 6, 80, -1, 0, 0, 16, 7214, 10220), + (10220, -1, -1, 839, 839, 6, 80, -1, 0, 0, 16, 10219, 10221), + (10221, -1, -1, 839, 839, 6, 80, -1, 0, 0, 16, 10220, 10222), + (10222, -1, -1, 839, 839, 6, 80, -1, 0, 0, 16, 10221, 10223), + (10223, -1, -1, 839, 839, 6, 80, -1, 0, 0, 16, 10222, -1), + (10224, 967, 967, 967, 967, 6, 85, 16687, 10, 1800, 16, 7219, 10225), + (10225, 967, 967, 967, 967, 6, 85, 16688, 10, 1800, 16, 10224, 10226), + (10226, 967, 967, 967, 967, 6, 85, 16689, 10, 1800, 16, 10225, 12789), + (10227, -1, -1, 5295, 5295, 6, 85, -1, 0, 0, 16, 7222, 10228), + (10228, -1, -1, 5295, 5295, 6, 85, -1, 0, 0, 16, 10227, 10229), + (10229, -1, -1, 5295, 5295, 6, 85, -1, 0, 0, 16, 10228, 13226), + (10230, 619, 619, 619, 619, 6, 83, 16704, 6, 900, 16, 7228, 10231), + (10231, 619, 619, 619, 619, 6, 83, 16705, 6, 900, 16, 10230, 10232), + (10232, 619, 619, 619, 619, 6, 83, 16706, 6, 900, 16, 10231, -1), + (10233, 516, 516, 516, 516, 6, 82, 16707, 5, 480, 16, 7237, 12879), + (10234, 1334, 1334, 1334, 1334, 12, 85, 16701, 11, 4320, 16, 7241, 10235), + (10235, 1334, 1334, 1334, 1334, 12, 85, 16702, 11, 4320, 16, 10234, 10236), + (10236, 1334, 1334, 1334, 1334, 12, 85, 16703, 11, 4320, 16, 10235, 12868), + (10237, 8060, 8060, 8060, 8060, 7, 85, 16711, 41, 1800, 16, 8062, 10238), + (10238, 8060, 8060, 8060, 8060, 7, 85, 16712, 41, 1800, 16, 10237, 10239), + (10239, 8060, 8060, 8060, 8060, 7, 85, 16713, 41, 1800, 16, 10238, 13650), + (10240, 8063, 8063, 8063, 8063, 7, 85, 16714, 41, 1800, 16, 8065, 10241), + (10241, 8063, 8063, 8063, 8063, 7, 85, 16715, 41, 1800, 16, 10240, 10242), + (10242, 8063, 8063, 8063, 8063, 7, 85, 16716, 41, 1800, 16, 10241, 13653), + (10243, 8066, 8066, 8066, 8066, 7, 85, 16717, 41, 1800, 16, 8068, 10244), + (10244, 8066, 8066, 8066, 8066, 7, 85, 16718, 41, 1800, 16, 10243, 10245), + (10245, 8066, 8066, 8066, 8066, 7, 85, 16719, 41, 1800, 16, 10244, 13656), + (10246, 8072, 8072, 8072, 8072, 7, 80, 16708, 37, 20, 16, 8074, 10247), + (10247, 8072, 8072, 8072, 8072, 7, 80, 16709, 37, 20, 16, 10246, 10248), + (10248, 8072, 8072, 8072, 8072, 7, 80, 16710, 37, 20, 16, 10247, 12857), + (10249, -1, -1, 8082, 8082, 3, 74, -1, 0, 0, 16, 8084, 10250), + (10250, -1, -1, 8082, 8082, 3, 74, -1, 0, 0, 16, 10249, 10251), + (10251, -1, -1, 8082, 8082, 3, 74, -1, 0, 0, 16, 10250, -1), + (10252, 520, 520, 520, 520, 12, 85, 16723, 6, 540, 16, 7252, 10253), + (10253, 520, 520, 520, 520, 12, 85, 16724, 6, 540, 16, 10252, 10254), + (10254, 520, 520, 520, 520, 12, 85, 16725, 6, 540, 16, 10253, 12985), + (10255, 4903, 4903, 4903, 4903, 9, 81, 16726, 9, 1320, 16, 7253, 12956), + (10256, 4906, 4906, 4906, 4906, 9, 81, 16727, 9, 1320, 16, 7254, 12959), + (10257, 4909, 4909, 4909, 4909, 9, 81, 16728, 16, 1320, 16, 7255, 12957), + (10258, 4912, 4912, 4912, 4912, 9, 81, 16729, 16, 1320, 16, 7256, 12958), + (10259, 616, 616, 616, 616, 10, 85, 16733, 7, 900, 16, 7259, 10260), + (10260, 616, 616, 616, 616, 10, 85, 16734, 7, 900, 16, 10259, 10261), + (10261, 616, 616, 616, 616, 10, 85, 16735, 7, 900, 16, 10260, 14730), + (10262, -1, -1, 1577, 1577, 12, 85, -1, 0, 0, 16, 7265, 10263), + (10263, -1, -1, 1577, 1577, 12, 85, -1, 0, 0, 16, 10262, 10264), + (10264, -1, -1, 1577, 1577, 12, 85, -1, 0, 0, 16, 10263, 13707), + (10265, -1, -1, 795, 795, 12, 85, -1, 0, 0, 16, 7269, 10266), + (10266, -1, -1, 795, 795, 12, 85, -1, 0, 0, 16, 10265, 10267), + (10267, -1, -1, 795, 795, 12, 85, -1, 0, 0, 16, 10266, 12945), + (10268, -1, -1, 7900, 7900, 4, 70, -1, 0, 0, 16, 7902, 10269), + (10269, -1, -1, 7900, 7900, 4, 70, -1, 0, 0, 16, 10268, 10270), + (10270, -1, -1, 7900, 7900, 4, 70, -1, 0, 0, 16, 10269, -1), + (10271, 1242, 1242, 1242, 1242, 12, 85, 16744, 9, 1320, 16, 7287, 10272), + (10272, 1242, 1242, 1242, 1242, 12, 85, 16745, 9, 1320, 16, 10271, 10273), + (10273, 1242, 1242, 1242, 1242, 12, 85, 16746, 9, 1320, 16, 10272, 12934), + (10274, 4931, 4931, 4931, 4931, 7, 85, 16747, 4, 600, 16, 7293, 10275), + (10275, 4931, 4931, 4931, 4931, 7, 85, 16748, 4, 600, 16, 10274, 10276), + (10276, 4931, 4931, 4931, 4931, 7, 85, 16749, 4, 600, 16, 10275, 10428), + (10277, 4935, 4935, 4935, 4935, 7, 81, 16743, 14, 300, 16, 7294, 17540), + (10278, 4934, 4934, 4934, 4934, 7, 81, 16742, 13, 300, 16, 7295, 17539), + (10279, 517, 517, 517, 517, 5, 80, 16739, 12, 600, 16, 7298, 10280), + (10280, 517, 517, 517, 517, 5, 80, 16740, 12, 600, 16, 10279, 10281), + (10281, 517, 517, 517, 517, 5, 80, 16741, 12, 600, 16, 10280, 12917), + (10282, -1, -1, 8031, 8031, 6, 84, -1, 0, 0, 16, 8033, 10283), + (10283, -1, -1, 8031, 8031, 6, 84, -1, 0, 0, 16, 10282, 10284), + (10284, -1, -1, 8031, 8031, 6, 84, -1, 0, 0, 16, 10283, 10431), + (10285, -1, -1, 8035, 8035, 6, 82, -1, 0, 0, 16, 8037, 10286), + (10286, -1, -1, 8035, 8035, 6, 82, -1, 0, 0, 16, 10285, 10287), + (10287, -1, -1, 8035, 8035, 6, 82, -1, 0, 0, 16, 10286, 15472), + (10288, 6971, 6971, 6971, 6971, 7, 85, 16761, 41, 600, 16, 6973, 10289), + (10289, 6971, 6971, 6971, 6971, 7, 85, 16762, 41, 600, 16, 10288, 10290), + (10290, 6971, 6971, 6971, 6971, 7, 85, 16763, 41, 600, 16, 10289, 14274), + (10291, -1, -1, 6974, 6974, 5, 85, -1, 0, 0, 16, 6976, 10292), + (10292, -1, -1, 6974, 6974, 5, 85, -1, 0, 0, 16, 10291, 10293), + (10293, -1, -1, 6974, 6974, 5, 85, -1, 0, 0, 16, 10292, -1), + (10294, 6984, 6984, 6984, 6984, 6, 78, 16765, 60, 60, 16, 6984, 13177), + (10295, 6985, 6985, 6985, 6985, 6, 78, 16766, 60, 60, 16, 6985, 13179), + (10296, 6986, 6986, 6986, 6986, 6, 78, 16767, 60, 60, 16, 6986, 13178), + (10297, 1119, 1119, 1119, 1119, 9, 85, 16750, 8, 900, 16, 7481, 10298), + (10298, 1119, 1119, 1119, 1119, 9, 85, 16751, 8, 900, 16, 10297, 10299), + (10299, 1119, 1119, 1119, 1119, 9, 85, 16752, 8, 900, 16, 10298, 16883), + (10300, 723, 723, 723, 723, 7, 85, 16753, 6, 30, 16, 7482, 14273), + (10301, 5015, 5015, 5015, 5015, 12, 85, 16754, 9, 900, 16, 7483, 17382), + (10302, 291, 291, 291, 291, 12, 85, 16755, 5, 900, 16, 7487, 10303), + (10303, 291, 291, 291, 291, 12, 85, 16756, 5, 900, 16, 10302, 10304), + (10304, 291, 291, 291, 291, 12, 85, 16757, 5, 900, 16, 10303, 12828), + (10305, -1, -1, 729, 729, 9, 85, -1, 0, 0, 16, 7496, 10306), + (10306, -1, -1, 729, 729, 9, 85, -1, 0, 0, 16, 10305, 10307), + (10307, -1, -1, 729, 729, 9, 85, -1, 0, 0, 16, 10306, 16887), + (10308, 6380, 6380, 6380, 6380, 6, 85, 16758, 39, 120, 16, 7499, 10309), + (10309, 6380, 6380, 6380, 6380, 6, 85, 16759, 39, 120, 16, 10308, 10310), + (10310, 6380, 6380, 6380, 6380, 6, 85, 16760, 39, 120, 16, 10309, 13170), + (10311, -1, -1, 1134, 1134, 3, 85, -1, 0, 0, 16, 4808, 10312), + (10312, -1, -1, 1134, 1134, 3, 85, -1, 0, 0, 16, 10311, 10313), + (10313, -1, -1, 1134, 1134, 3, 85, -1, 0, 0, 16, 10312, 10314), + (10314, -1, -1, 1134, 1134, 3, 85, -1, 0, 0, 16, 10313, 10315), + (10315, -1, -1, 1134, 1134, 3, 85, -1, 0, 0, 16, 10314, 13035), + (10316, -1, -1, 4809, 4809, 5, 85, -1, 0, 0, 16, 4811, 10317), + (10317, -1, -1, 4809, 4809, 5, 85, -1, 0, 0, 16, 10316, 10318), + (10318, -1, -1, 4809, 4809, 5, 85, -1, 0, 0, 16, 10317, 13040), + (10319, 6931, 6931, 6931, 6931, 12, 85, 16774, 41, 600, 16, 6931, 13058), + (10320, 6932, 6932, 6932, 6932, 7, 85, 16775, 42, 1200, 16, 6934, 10321), + (10321, 6932, 6932, 6932, 6932, 7, 85, 16776, 42, 1200, 16, 10320, 10322), + (10322, 6932, 6932, 6932, 6932, 7, 85, 16777, 42, 1200, 16, 10321, 13062), + (10323, 4854, 4854, 4854, 4854, 12, 85, 16768, 8, 600, 16, 7180, 10324), + (10324, 4854, 4854, 4854, 4854, 12, 85, 16769, 8, 600, 16, 10323, 10325), + (10325, 4854, 4854, 4854, 4854, 12, 85, 16770, 8, 600, 16, 10324, 13059), + (10326, 1178, 1178, 1178, 1178, 9, 85, 16771, 4, 900, 16, 7189, 10327), + (10327, 1178, 1178, 1178, 1178, 9, 85, 16772, 4, 900, 16, 10326, 10328), + (10328, 1178, 1178, 1178, 1178, 9, 85, 16773, 4, 900, 16, 10327, 13845), + (10329, -1, -1, 10329, 10329, 5, 85, 0, 0, 0, 16, -1, 10398), + (10330, 10330, 10330, 10330, 10330, 7, 85, 16785, 35, 30, 16, -1, 13203), + (10331, 10331, 10331, 10331, 10331, 6, 85, 16787, 44, 20, 16, -1, -1), + (10332, -1, -1, 10332, 10332, 3, 85, -1, 0, 0, 16, -1, 12733), + (10333, 10333, 10333, 10333, 10333, 5, 85, 16788, 55, 120, 16, -1, 10334), + (10334, 10333, 10333, 10333, 10333, 7, 85, 16789, 55, 120, 16, 10333, 10335), + (10335, 10333, 10333, 10333, 10333, 9, 85, 16790, 55, 120, 16, 10334, 12724), + (10336, 10336, 10336, 10336, 10336, 5, 85, 16791, 58, 8, 16, -1, 10337), + (10337, 10336, 10336, 10336, 10336, 7, 85, 16792, 58, 8, 16, 10336, 10338), + (10338, 10336, 10336, 10336, 10336, 9, 85, 16793, 58, 8, 16, 10337, 12730), + (10339, 10339, 10339, 10339, 10339, 12, 85, 16786, 48, 1800, 16, -1, -1), + (10340, -1, -1, 10340, 10340, 3, 80, -1, 0, 0, 16, -1, 10341), + (10341, -1, -1, 10340, 10340, 6, 83, -1, 0, 0, 16, 10340, 10342), + (10342, -1, -1, 10340, 10340, 9, 85, -1, 0, 0, 16, 10341, 13184), + (10343, -1, -1, 10343, 10343, 5, 85, 0, 0, 0, 16, -1, 10344), + (10344, -1, -1, 10343, 10343, 7, 85, 0, 0, 0, 16, 10343, 10345), + (10345, -1, -1, 10343, 10343, 9, 85, 0, 0, 0, 16, 10344, 13841), + (10346, 10346, 10346, 10346, 10346, 9, 85, 21783, 46, 600, 16, -1, 13183), + (10347, -1, -1, 7945, 7945, 6, 85, -1, 0, 0, 16, 10034, 17310), + (10348, 0, 0, 10348, 10348, 5, 80, -1, 0, 0, 16, -1, 10349), + (10349, 0, 0, 10348, 10348, 7, 83, -1, 0, 0, 16, 10348, 10350), + (10350, 0, 0, 10348, 10348, 9, 85, -1, 0, 0, 16, 10349, 13578), + (10351, 10351, 10351, 10351, 10351, 12, 85, 21785, 34, 600, 16, -1, 10682), + (10352, 10352, 10352, 10352, 10352, 12, 85, 21786, 34, 600, 16, -1, 10683), + (10353, 10353, 10353, 10353, 10353, 12, 85, 21787, 34, 600, 16, -1, 10684), + (10354, 10354, 10354, 10354, 10354, 8, 85, 21653, 39, 4320, 16, -1, 14016), + (10355, -1, -1, 10355, 10355, 6, 83, -1, 0, 0, 16, -1, 10356), + (10356, -1, -1, 10355, 10355, 8, 84, -1, 0, 0, 16, 10355, 10357), + (10357, -1, -1, 10355, 10355, 10, 85, -1, 0, 0, 16, 10356, 10643), + (10358, -1, -1, 10358, 10358, 7, 80, -1, 0, 0, 16, -1, 10359), + (10359, -1, -1, 10358, 10358, 9, 83, -1, 0, 0, 16, 10358, 10360), + (10360, -1, -1, 10358, 10358, 12, 85, -1, 0, 0, 16, 10359, 14210), + (10361, -1, -1, 962, 962, 5, 83, -1, 0, 0, 16, 6227, 10362), + (10362, -1, -1, 962, 962, 5, 84, -1, 0, 0, 16, 10361, 10363), + (10363, -1, -1, 962, 962, 5, 85, -1, 0, 0, 16, 10362, 14218), + (10364, -1, -1, 10364, 10364, 5, 85, -1, 0, 0, 16, -1, 10365), + (10365, -1, -1, 10364, 10364, 7, 85, -1, 0, 0, 16, 10364, 10366), + (10366, -1, -1, 10364, 10364, 9, 85, -1, 0, 0, 16, 10365, 10442), + (10367, 10367, 10367, 10367, 10367, 12, 85, 21751, 30, 360, 16, -1, 10630), + (10368, 10368, 10368, 10368, 10368, 6, 85, 21654, 46, 900, 16, -1, 10369), + (10369, 10368, 10368, 10368, 10368, 9, 85, 21655, 46, 900, 16, 10368, 10386), + (10370, -1, -1, 10370, 10370, 3, 60, -1, 0, 0, 16, -1, 10371), + (10371, -1, -1, 10370, 10370, 3, 60, -1, 0, 0, 16, 10370, 10372), + (10372, -1, -1, 10370, 10370, 3, 60, -1, 0, 0, 16, 10371, 13927), + (10373, 10373, 10373, 10373, 10373, 6, 75, 16806, 62, 6, 16, -1, -1), + (10374, 10374, 10374, 10374, 10374, 6, 85, 16800, 63, 900, 16, -1, 10375), + (10375, 10374, 10374, 10374, 10374, 6, 85, 16801, 63, 900, 16, 10374, 10376), + (10376, 10374, 10374, 10374, 10374, 6, 85, 16802, 63, 900, 16, 10375, 13174), + (10377, 10377, 10377, 10377, 10377, 6, 85, 16794, 64, 60, 16, -1, 10378), + (10378, 10377, 10377, 10377, 10377, 6, 85, 16795, 64, 60, 16, 10377, 10379), + (10379, 10377, 10377, 10377, 10377, 6, 85, 16796, 64, 60, 16, 10378, 13180), + (10380, -1, -1, 10380, 10380, 6, 85, -1, 0, 0, 16, -1, 10381), + (10381, -1, -1, 10380, 10380, 6, 85, -1, 0, 0, 16, 10380, 10382), + (10382, -1, -1, 10380, 10380, 6, 85, -1, 0, 0, 16, 10381, 13477), + (10383, -1, -1, 5085, 5085, 6, 85, -1, 0, 0, 16, 7386, 10384), + (10384, -1, -1, 5085, 5085, 6, 85, -1, 0, 0, 16, 10383, 10385), + (10385, -1, -1, 5085, 5085, 6, 85, -1, 0, 0, 16, 10384, -1), + (10386, 10368, 10368, 10368, 10368, 12, 85, 21656, 46, 900, 16, 10369, -1), + (10387, 10387, 10387, 10387, 10387, 9, 85, 21835, 45, 1200, 16, -1, -1), + (10388, -1, -1, 10388, 10388, 12, 85, -1, 0, 0, 16, -1, 13545), + (10389, -1, -1, 10389, 10389, 9, 83, 0, 0, 0, 16, -1, 10390), + (10390, -1, -1, 10389, 10389, 11, 84, 0, 0, 0, 16, 10389, 10391), + (10391, -1, -1, 10389, 10389, 12, 85, 0, 0, 0, 16, 10390, -1), + (10392, 10392, 10392, 10392, 10392, 12, 85, 21751, 11, 480, 16, -1, 10631), + (10393, 10393, 10393, 10393, 10393, 9, 81, 3246, 42, 2, 16, -1, -1), + (10394, 10394, 10394, 10394, 10394, 12, 85, 21821, 30, 600, 16, -1, 10704), + (10395, 10395, 10395, 10395, 10395, 3, 80, 21748, 62, 5, 16, -1, 12590), + (10396, 10396, 10396, 10396, 10396, 12, 85, 16857, 14, 600, 16, -1, 10790), + (10397, 10397, 10397, 10397, 10397, 12, 85, 16858, 14, 600, 16, -1, 10791), + (10398, -1, -1, 10329, 10329, 7, 85, 0, 0, 0, 16, 10329, 10399), + (10399, -1, -1, 10329, 10329, 9, 85, 0, 0, 0, 16, 10398, -1), + (10400, 10400, 10400, 10400, 10400, 6, 85, 16807, 62, 900, 16, -1, 15558), + (10401, -1, -1, 10401, 10401, 6, 85, -1, 0, 0, 16, -1, 10402), + (10402, -1, -1, 10401, 10401, 6, 85, -1, 0, 0, 16, 10401, 10403), + (10403, -1, -1, 10401, 10401, 6, 85, -1, 0, 0, 16, 10402, 13052), + (10404, -1, -1, 10404, 10404, 6, 85, -1, 0, 0, 16, -1, 13051), + (10405, -1, -1, 10405, 10405, 7, 81, 0, 0, 0, 16, -1, 10406), + (10406, -1, -1, 10405, 10405, 7, 82, 0, 0, 0, 16, 10405, 10407), + (10407, -1, -1, 10405, 10405, 7, 83, 0, 0, 0, 16, 10406, 10408), + (10408, -1, -1, 10405, 10405, 7, 84, 0, 0, 0, 16, 10407, 10409), + (10409, -1, -1, 10405, 10405, 7, 85, 0, 0, 0, 16, 10408, 10671), + (10410, -1, -1, 10410, 10410, 8, 85, -1, 0, 0, 16, -1, 10411), + (10413, -1, -1, 10413, 10413, 5, 81, 0, 0, 0, 16, -1, 10414), + (10414, -1, -1, 10413, 10413, 5, 81, 0, 0, 0, 16, 10413, 10415), + (10415, -1, -1, 10413, 10413, 5, 81, 0, 0, 0, 16, 10414, 10416), + (10416, -1, -1, 10413, 10413, 5, 81, 0, 0, 0, 16, 10415, 10417), + (10417, -1, -1, 10413, 10413, 5, 81, 0, 0, 0, 16, 10416, -1), + (10418, 6561, 6561, 6561, 6561, 7, 85, 21808, 32, 30, 16, 10101, 10419), + (10419, 6561, 6561, 6561, 6561, 7, 85, 21810, 32, 30, 16, 10418, 10420), + (10420, 6561, 6561, 6561, 6561, 7, 85, 21811, 32, 30, 16, 10419, 14256), + (10421, 10506, 10506, 10506, 10506, 9, 85, 23521, 66, 120, 16, 10508, -1), + (10424, 10424, 10424, 10424, 10424, 7, 81, 21813, 41, 6, 16, -1, -1), + (10425, 10425, 10425, 10425, 10425, 7, 81, 21814, 39, 6, 16, -1, -1), + (10426, 10426, 10426, 10426, 10426, 10, 85, 21816, 5, 900, 16, -1, -1), + (10427, 10427, 10427, 10427, 10427, 12, 85, 21818, 30, 900, 16, -1, -1), + (10428, 4931, 4931, 4931, 4931, 7, 85, 21838, 4, 600, 16, 10276, 10429), + (10429, 4931, 4931, 4931, 4931, 7, 85, 21839, 4, 600, 16, 10428, 10430), + (10430, 4931, 4931, 4931, 4931, 7, 85, 21844, 4, 600, 16, 10429, 13241), + (10431, -1, -1, 8031, 8031, 6, 85, -1, 0, 0, 16, 10284, 10432), + (10432, -1, -1, 8031, 8031, 6, 85, -1, 0, 0, 16, 10431, 10433), + (10433, -1, -1, 8031, 8031, 6, 85, -1, 0, 0, 16, 10432, -1), + (10434, -1, -1, 10434, 10434, 7, 85, 0, 0, 0, 16, -1, 10435), + (10435, -1, -1, 10434, 10434, 9, 85, 0, 0, 0, 16, 10434, 10436), + (10436, -1, -1, 10434, 10434, 12, 85, 0, 0, 0, 16, 10435, -1), + (10437, -1, -1, 6601, 6601, 6, 86, -1, 0, 0, 17, 10029, 10438), + (10438, -1, -1, 6601, 6601, 6, 87, -1, 0, 0, 17, 10437, 10439), + (10439, -1, -1, 6601, 6601, 6, 88, -1, 0, 0, 17, 10438, 10440), + (10440, -1, -1, 6601, 6601, 6, 89, -1, 0, 0, 17, 10439, 10441), + (10442, -1, -1, 10364, 10364, 9, 86, -1, 0, 0, 17, 10366, 10443), + (10443, -1, -1, 10364, 10364, 9, 88, -1, 0, 0, 17, 10442, -1), + (10450, 10450, 10450, 10450, 10450, 7, 85, 16808, 63, 900, 16, -1, 10451), + (10451, 10450, 10450, 10450, 10450, 7, 85, 16809, 63, 900, 16, 10450, 10452), + (10452, 10450, 10450, 10450, 10450, 7, 85, 16810, 63, 900, 16, 10451, 10468), + (10453, -1, -1, 10453, 10453, 5, 85, -1, 0, 0, 16, -1, 10454), + (10454, -1, -1, 10453, 10453, 7, 85, -1, 0, 0, 16, 10453, 10455), + (10455, -1, -1, 10453, 10453, 9, 85, -1, 0, 0, 16, 10454, 13607), + (10456, -1, -1, 10456, 10456, 5, 85, -1, 0, 0, 16, -1, 10457), + (10457, -1, -1, 10456, 10456, 7, 85, -1, 0, 0, 16, 10456, 10458), + (10458, -1, -1, 10456, 10456, 9, 85, -1, 0, 0, 16, 10457, -1), + (10459, -1, -1, 10459, 10459, 5, 65, -1, 0, 0, 16, -1, 10460), + (10460, -1, -1, 10459, 10459, 7, 65, -1, 0, 0, 16, 10459, 10461), + (10461, -1, -1, 10459, 10459, 9, 65, -1, 0, 0, 16, 10460, -1), + (10462, 10462, 10462, 10462, 10462, 12, 85, 16811, 14, 4320, 16, -1, -1), + (10463, 10463, 10463, 10463, 10463, 12, 85, 16812, 16, 4320, 16, -1, -1), + (10464, -1, -1, 10464, 10464, 5, 80, -1, 0, 0, 16, -1, 10465), + (10465, -1, -1, 10464, 10464, 7, 80, -1, 0, 0, 16, 10464, 10466), + (10466, -1, -1, 10464, 10464, 9, 80, -1, 0, 0, 16, 10465, 13140), + (10467, -1, -1, 86, 86, 8, 85, -1, 0, 0, 17, 266, -1), + (10468, 10450, 10450, 10450, 10450, 7, 85, 23603, 63, 900, 17, 10452, 10469), + (10469, 10450, 10450, 10450, 10450, 7, 85, 23604, 63, 900, 17, 10468, 10670), + (10470, -1, -1, 10470, 10470, 9, 86, -1, 0, 0, 17, -1, 10471), + (10471, -1, -1, 10470, 10470, 12, 88, -1, 0, 0, 17, 10470, 10472), + (10472, -1, -1, 10470, 10470, 15, 90, -1, 0, 0, 17, 10471, 15828), + (10473, -1, -1, 446, 735, 10, 86, -1, 0, 0, 17, 7624, 10474), + (10474, -1, -1, 446, 735, 10, 87, -1, 0, 0, 17, 10473, 10475), + (10475, -1, -1, 446, 735, 10, 88, -1, 0, 0, 17, 10474, 10476), + (10476, -1, -1, 446, 735, 10, 89, -1, 0, 0, 17, 10475, 10477), + (10477, -1, -1, 446, 735, 10, 90, -1, 0, 0, 17, 10476, 13308), + (10478, -1, -1, 10478, 10478, 15, 101, -1, 0, 0, 21, -1, 10479), + (10481, 10481, 10481, 10481, 10481, 21, 105, 46249, 90, 600, 21, -1, -1), + (10500, 10500, 10500, 10500, 10500, 7, 85, 16813, 62, 12, 16, -1, -1), + (10501, 10501, 10501, 10501, 10501, 7, 85, 16814, 63, 1, 16, -1, -1), + (10502, 10502, -1, 10502, 10502, 7, 85, 1566, 64, 120, 16, -1, 12647), + (10503, 10503, 10503, 10503, 10503, 9, 85, 16816, 13, 600, 16, -1, 10504), + (10504, 10503, 10503, 10503, 10503, 9, 85, 16817, 13, 600, 16, 10503, 10505), + (10505, 10503, 10503, 10503, 10503, 9, 85, 16818, 13, 600, 16, 10504, 12648), + (10506, 10506, 10506, 10506, 10506, 9, 85, 16819, 66, 120, 16, -1, 10507), + (10507, 10506, 10506, 10506, 10506, 9, 85, 16820, 66, 120, 16, 10506, 10508), + (10508, 10506, 10506, 10506, 10506, 9, 85, 16821, 66, 120, 16, 10507, 10421), + (10509, 5105, 5105, 5105, 5105, 12, 85, 16822, 11, 600, 16, 7420, 13154), + (10510, 7986, 7986, 7986, 7986, 12, 85, 16823, 11, 600, 16, 7988, 13155), + (10511, -1, -1, 10511, 10511, 6, 85, -1, 0, 0, 16, -1, 10512), + (10512, -1, -1, 10511, 10511, 6, 85, -1, 0, 0, 16, 10511, 10513), + (10513, -1, -1, 10511, 10511, 6, 85, -1, 0, 0, 16, 10512, 12642), + (10514, -1, -1, 10514, 10514, 6, 85, -1, 0, 0, 16, -1, 10516), + (10515, -1, -1, 10514, 10514, 6, 85, -1, 0, 0, 16, 10516, 12639), + (10516, -1, -1, 10514, 10514, 6, 85, -1, 0, 0, 16, 10514, 10515), + (10517, 6565, 6565, 6565, 6565, 9, 88, 23608, 17, 45, 17, 10010, 10518), + (10519, -1, -1, 10519, 10519, 9, 86, 0, 0, 0, 17, -1, 10520), + (10522, -1, -1, 10522, 10522, 7, 86, 0, 0, 0, 17, -1, 10523), + (10527, -1, -1, 10527, 10527, 5, 86, 0, 0, 0, 17, -1, 10528), + (10532, -1, -1, 10532, 10532, 5, 86, 0, 0, 0, 17, -1, 10533), + (10537, -1, -1, 10537, 10537, 5, 86, 0, 0, 0, 17, -1, 10538), + (10545, 10545, 10545, 10545, 10545, 12, 85, 23531, 73, 600, 17, -1, -1), + (10546, 10546, 10546, 10546, 10546, 12, 85, 23528, 74, 600, 17, -1, -1), + (10548, -1, -1, 10548, 10548, 9, 86, -1, 0, 0, 17, -1, 10549), + (10550, 10550, 10550, 10550, 10550, 7, 85, 16824, 61, 120, 16, -1, 13250), + (10551, -1, -1, 10551, 10551, 6, 85, -1, 0, 0, 16, -1, 10552), + (10552, -1, -1, 10551, 10551, 6, 85, -1, 0, 0, 16, 10551, 10553), + (10553, -1, -1, 10551, 10551, 6, 85, -1, 0, 0, 16, 10552, 14764), + (10554, -1, -1, 1572, 1572, 5, 80, -1, 0, 0, 16, 1576, 10555), + (10555, -1, -1, 1572, 1572, 5, 80, -1, 0, 0, 16, 10554, 10556), + (10556, -1, -1, 1572, 1572, 5, 80, -1, 0, 0, 16, 10555, 16062), + (10557, 12395, 12395, 12395, 12395, 9, 75, 16828, 11, 900, 16, -1, -1), + (10558, -1, -1, 10558, 10558, 6, 80, -1, 0, 0, 16, -1, 10559), + (10559, -1, -1, 10558, 10558, 6, 83, -1, 0, 0, 16, 10558, 10560), + (10560, -1, -1, 10558, 10558, 6, 85, -1, 0, 0, 16, 10559, 15469), + (10561, -1, -1, 10561, 10561, 6, 85, -1, 0, 0, 16, -1, 10562), + (10562, -1, -1, 10561, 10561, 6, 85, -1, 0, 0, 16, 10561, 10563), + (10563, -1, -1, 10561, 10561, 6, 85, -1, 0, 0, 16, 10562, 15466), + (10564, 773, -1, 773, 773, 12, 85, 16829, 5, 1800, 16, 7278, 10565), + (10565, 773, -1, 773, 773, 12, 85, 16830, 5, 1800, 16, 10564, 10566), + (10566, 773, -1, 773, 773, 12, 85, 16831, 5, 1800, 16, 10565, 13734), + (10568, -1, -1, 6564, 6564, 10, 86, -1, 0, 0, 17, 10009, 10569), + (10571, 1597, 1597, 1597, 1597, 9, 85, 23611, 6, 10, 17, 6606, -1), + (10572, 6617, 6617, 6617, 6617, 12, 86, 23612, 42, 3600, 17, 6617, 14036), + (10573, 6610, 6610, 6610, 6610, 9, 86, 23613, 41, 30, 17, 10003, 13422), + (10574, -1, -1, 6611, 6611, 6, 85, -1, 0, 0, 17, 6619, 16121), + (10575, -1, -1, 6614, 6614, 9, 85, -1, 0, 0, 17, 10005, -1), + (10576, -1, -1, 492, 492, 2, 87, -1, 0, 0, 17, 7130, -1), + (10578, 258, -1, 258, 258, 9, 86, 27520, 1, 600, 17, 258, 16003), + (10579, -1, -1, 7036, 10579, 9, 85, 0, 0, 0, 17, 7038, 10580), + (10580, -1, -1, 7036, 10579, 12, 87, 0, 0, 0, 17, 10579, 10581), + (10585, 912, 912, 912, 912, 9, 86, 23617, 4, 3600, 17, 10013, 10586), + (10588, -1, -1, 10588, 10588, 5, 86, 0, 0, 0, 17, -1, 10589), + (10589, -1, -1, 10588, 10588, 5, 87, 0, 0, 0, 17, 10588, 10590), + (10590, -1, -1, 10588, 10588, 5, 88, 0, 0, 0, 17, 10589, 10591), + (10591, -1, -1, 10588, 10588, 5, 89, 0, 0, 0, 17, 10590, 10592), + (10592, -1, -1, 10588, 10588, 5, 90, 0, 0, 0, 17, 10591, 17206), + (10600, 10600, 10600, 10600, 10600, 7, 85, 16832, 73, 20, 16, -1, 10601), + (10601, 10600, 10600, 10600, 10600, 7, 85, 16833, 73, 20, 16, 10600, 10602), + (10602, 10600, 10600, 10600, 10600, 7, 85, 16834, 73, 20, 16, 10601, 12982), + (10603, 10601, 10601, 10601, 10601, 3, 85, 16835, 62, 6, 16, -1, -1), + (10604, -1, -1, 6051, 6051, 3, 85, -1, 0, 0, 16, 7603, 10605), + (10605, -1, -1, 6051, 6051, 3, 85, -1, 0, 0, 16, 10604, 10606), + (10606, -1, -1, 6051, 6051, 3, 85, -1, 0, 0, 16, 10605, 12795), + (10607, -1, -1, 6383, 6383, 9, 80, -1, 0, 0, 16, 6385, 10608), + (10608, -1, -1, 6383, 6383, 9, 80, -1, 0, 0, 16, 10607, 10609), + (10609, -1, -1, 6383, 6383, 9, 80, -1, 0, 0, 16, 10608, 12801), + (10610, -1, -1, 10610, 10610, 3, 70, -1, 0, 0, 16, -1, 10611), + (10611, -1, -1, 10610, 10610, 3, 70, -1, 0, 0, 16, 10610, 10612), + (10612, -1, -1, 10610, 10610, 3, 70, -1, 0, 0, 16, 10611, -1), + (10618, 7850, 7850, 7850, 7850, 9, 86, 23532, 39, 4320, 17, 7340, 10619), + (10619, 7850, 7850, 7850, 7850, 12, 88, 23533, 39, 4320, 17, 10618, 10620), + (10620, 7850, 7850, 7850, 7850, 15, 90, 23534, 39, 4320, 17, 10619, 13604), + (10621, -1, -1, 849, 849, 9, 85, -1, 0, 0, 17, 851, 10622), + (10622, -1, -1, 849, 849, 9, 87, -1, 0, 0, 17, 10621, 16604), + (10623, -1, -1, 255, 255, 9, 85, -1, 0, 0, 17, 5808, 10624), + (10624, -1, -1, 255, 255, 12, 87, -1, 0, 0, 17, 10623, 10625), + (10625, -1, -1, 255, 255, 15, 89, -1, 0, 0, 17, 10624, 13589), + (10626, 5984, 5984, 5984, 5984, 12, 90, 23535, 2, 30, 17, 7711, 13592), + (10627, -1, -1, 10627, 10627, 3, 59, 0, 0, 0, 3, -1, 10628), + (10628, -1, -1, 10627, 10627, 3, 59, 0, 0, 0, 3, 10627, 10629), + (10629, -1, -1, 10627, 10627, 3, 59, 0, 0, 0, 3, 10628, -1), + (10630, 10367, 10367, 10367, 10367, 12, 90, 27642, 30, 360, 17, 10367, 13434), + (10631, 10392, 10392, 10392, 10392, 12, 90, 27642, 11, 480, 17, 10392, -1), + (10632, -1, -1, 735, 735, 10, 86, -1, 0, 0, 17, 7627, 10633), + (10633, -1, -1, 735, 735, 10, 87, -1, 0, 0, 17, 10632, 10634), + (10634, -1, -1, 735, 735, 10, 88, -1, 0, 0, 17, 10633, 10635), + (10635, -1, -1, 735, 735, 10, 89, -1, 0, 0, 17, 10634, 10636), + (10636, -1, -1, 735, 735, 10, 90, -1, 0, 0, 17, 10635, 13884), + (10637, -1, -1, 1287, 1287, 9, 86, -1, 0, 0, 17, 12471, 10638), + (10638, -1, -1, 1287, 1287, 12, 88, -1, 0, 0, 17, 10637, 10639), + (10639, -1, -1, 1287, 1287, 15, 90, -1, 0, 0, 17, 10638, 13323), + (10640, 5095, 5095, 5095, 5095, 9, 85, 23620, 10, 900, 17, 7334, 10641), + (10641, 5095, 5095, 5095, 5095, 12, 87, 23621, 10, 900, 17, 10640, 10642), + (10642, 5095, 5095, 5095, 5095, 15, 89, 23622, 10, 900, 17, 10641, 13575), + (10643, -1, -1, 10355, 10355, 10, 86, -1, 0, 0, 17, 10357, 10644), + (10644, -1, -1, 10355, 10355, 10, 88, -1, 0, 0, 17, 10643, 10645), + (10645, -1, -1, 10355, 10355, 10, 90, -1, 0, 0, 17, 10644, 14094), + (10646, 7712, 7712, 7712, 7712, 15, 90, 23536, 2, 30, 17, 7712, 13585), + (10647, 188, 188, 188, 188, 9, 88, 23537, 2, 30, 17, 7662, 13586), + (10650, -1, -1, 10650, 10650, 7, 85, -1, 0, 0, 16, -1, 10651), + (10651, -1, -1, 10650, 10650, 9, 85, -1, 0, 0, 16, 10650, 10652), + (10652, -1, -1, 10650, 10650, 12, 85, -1, 0, 0, 16, 10651, 13804), + (10653, -1, -1, 10653, 10653, 7, 85, -1, 0, 0, 16, -1, 10654), + (10654, -1, -1, 10653, 10653, 7, 85, -1, 0, 0, 16, 10653, 10655), + (10655, -1, -1, 10653, 10653, 7, 85, -1, 0, 0, 16, 10654, 17406), + (10656, -1, -1, 10656, 10656, 7, 85, -1, 0, 0, 16, -1, 12678), + (10657, -1, -1, 10657, 10657, 7, 85, -1, 0, 0, 16, -1, 10658), + (10658, -1, -1, 10657, 10657, 7, 85, -1, 0, 0, 16, 10657, 10659), + (10659, -1, -1, 10657, 10657, 7, 85, -1, 0, 0, 16, 10658, 12679), + (10660, -1, -1, 820, 820, 5, 85, -1, 0, 0, 16, 7165, 10661), + (10661, -1, -1, 820, 820, 5, 85, -1, 0, 0, 16, 10660, 10662), + (10662, -1, -1, 820, 820, 5, 85, -1, 0, 0, 16, 10661, 12667), + (10663, -1, -1, 6020, 6020, 2, 85, -1, 0, 0, 16, 7171, 10664), + (10664, -1, -1, 6020, 6020, 2, 85, -1, 0, 0, 16, 10663, 10665), + (10665, -1, -1, 6020, 6020, 2, 85, -1, 0, 0, 16, 10664, 12670), + (10666, -1, -1, 495, 495, 6, 85, -1, 0, 0, 16, 6262, 10667), + (10667, -1, -1, 495, 495, 5, 85, -1, 0, 0, 16, 10666, 10668), + (10668, -1, -1, 495, 495, 7, 85, -1, 0, 0, 16, 10667, 17391), + (10670, 10450, 10450, 10450, 10450, 7, 85, 23605, 63, 900, 17, 10469, 15839), + (10671, -1, -1, 10405, 10405, 9, 86, 0, 0, 0, 17, 10409, 10672), + (10672, -1, -1, 10405, 10405, 9, 87, 0, 0, 0, 17, 10671, 10673), + (10673, -1, -1, 10405, 10405, 9, 88, 0, 0, 0, 17, 10672, 10674), + (10674, -1, -1, 10405, 10405, 9, 89, 0, 0, 0, 17, 10673, 10675), + (10675, -1, -1, 10405, 10405, 9, 90, 0, 0, 0, 17, 10674, -1), + (10676, -1, -1, 6791, 6791, 6, 86, -1, 0, 0, 17, 10046, 10677), + (10677, -1, -1, 6791, 6791, 6, 88, -1, 0, 0, 17, 10676, 10678), + (10678, -1, -1, 6791, 6791, 6, 90, -1, 0, 0, 17, 10677, 13598), + (10679, 6492, 6492, 6492, 6492, 9, 85, 23626, 52, 720, 17, 6497, 10680), + (10680, 6492, 6492, 6492, 6492, 9, 87, 23627, 52, 720, 17, 10679, 10681), + (10681, 6492, 6492, 6492, 6492, 9, 89, 23628, 52, 720, 17, 10680, 14003), + (10682, 10351, 10351, 10351, 10351, 15, 90, 23538, 34, 600, 17, 10351, -1), + (10683, 10352, 10352, 10352, 10352, 15, 90, 23539, 34, 600, 17, 10352, -1), + (10684, 10353, 10353, 10353, 10353, 15, 90, 23540, 34, 600, 17, 10353, -1), + (10685, -1, -1, 602, 602, 9, 86, -1, 0, 0, 17, 5582, 10686), + (10686, -1, -1, 602, 602, 12, 88, -1, 0, 0, 17, 10685, 10687), + (10687, -1, -1, 602, 602, 15, 90, -1, 0, 0, 17, 10686, 13610), + (10688, -1, -1, 855, 855, 7, 86, -1, 0, 0, 17, 7677, 10689), + (10689, -1, -1, 855, 855, 7, 87, -1, 0, 0, 17, 10688, 10690), + (10690, -1, -1, 855, 855, 7, 88, -1, 0, 0, 17, 10689, 10691), + (10691, -1, -1, 855, 855, 7, 89, -1, 0, 0, 17, 10690, 10692), + (10692, -1, -1, 855, 855, 7, 90, -1, 0, 0, 17, 10691, 13613), + (10700, 10700, 10700, 10700, 10700, 7, 85, 16839, 61, 10, 16, -1, -1), + (10701, 10701, 10701, 10701, 10701, 7, 85, 21662, 32, 360, 16, -1, 10702), + (10702, 10701, 10701, 10701, 10701, 9, 85, 21663, 32, 360, 16, 10701, 10703), + (10703, 10701, 10701, 10701, 10701, 12, 85, 21664, 32, 360, 16, 10702, 12754), + (10704, 10394, 10394, 10394, 10394, 12, 85, 23541, 30, 300, 17, 10394, 13584), + (10705, -1, -1, 6395, 6395, 9, 86, -1, 0, 0, 17, 10052, 10706), + (10706, -1, -1, 6395, 6395, 9, 88, -1, 0, 0, 17, 10705, 10707), + (10707, -1, -1, 6395, 6395, 9, 90, -1, 0, 0, 17, 10706, 14097), + (10708, 534, 534, 534, 534, 12, 86, 23545, 4, 2160, 17, 10049, 10709), + (10709, 534, 534, 534, 534, 12, 88, 23546, 4, 2160, 17, 10708, 10710), + (10710, 534, 534, 534, 534, 12, 90, 23547, 4, 2160, 17, 10709, 13595), + (10711, 10711, 10711, 10711, 10711, 9, 86, 23548, 75, 1200, 17, -1, 10712), + (10712, 10711, 10711, 10711, 10711, 12, 88, 23549, 75, 1200, 17, 10711, 10713), + (10713, 10711, 10711, 10711, 10711, 15, 90, 23550, 75, 1200, 17, 10712, 14006), + (10714, -1, -1, 10714, 10714, 9, 86, 0, 0, 0, 17, -1, 10715), + (10715, -1, -1, 10714, 10714, 12, 88, 0, 0, 0, 17, 10714, 10716), + (10717, -1, -1, 7743, 7743, 9, 61, -1, 0, 0, 17, 7745, 10718), + (10718, -1, -1, 7743, 7743, 9, 61, -1, 0, 0, 17, 10717, 15258), + (10719, -1, -1, 10719, 10719, 9, 75, 0, 0, 0, 17, -1, 10720), + (10720, -1, -1, 10719, 10719, 12, 75, 0, 0, 0, 17, 10719, 10721), + (10721, -1, -1, 10719, 10719, 15, 75, 0, 0, 0, 17, 10720, 13562), + (10722, -1, -1, 10722, 10722, 5, 81, 0, 0, 0, 17, -1, 10723), + (10723, -1, -1, 10722, 10722, 5, 82, 0, 0, 0, 17, 10722, 10724), + (10724, -1, -1, 10722, 10722, 7, 83, 0, 0, 0, 17, 10723, 10725), + (10725, -1, -1, 10722, 10722, 9, 84, 0, 0, 0, 17, 10724, 10726), + (10726, -1, -1, 10722, 10722, 12, 85, 0, 0, 0, 17, 10725, 15280), + (10727, -1, -1, 10727, 10727, 7, 86, 0, 0, 0, 17, -1, 10728), + (10728, -1, -1, 10727, 10727, 9, 88, 0, 0, 0, 17, 10727, 10729), + (10730, -1, -1, 10730, 10730, 7, 86, 0, 0, 0, 17, -1, 10731), + (10731, -1, -1, 10730, 10730, 9, 88, 0, 0, 0, 17, 10730, 10732), + (10733, -1, -1, 10733, 10733, 7, 81, 0, 0, 0, 17, -1, 10734), + (10734, -1, -1, 10733, 10733, 9, 83, 0, 0, 0, 17, 10733, 10735), + (10735, -1, -1, 10733, 10733, 12, 85, 0, 0, 0, 17, 10734, -1), + (10736, 10736, 10736, 10736, 10736, 7, 86, 23632, 5, 180, 17, -1, 10737), + (10737, 10736, 10736, 10736, 10736, 9, 88, 23633, 5, 180, 17, 10736, 10738), + (10739, 645, -1, 645, 645, 12, 86, 23551, 4, 5, 17, 5999, 13410), + (10740, 1345, 1345, 1345, 1345, 9, 86, 23552, 6, 900, 17, 7349, 10741), + (10741, 1345, 1345, 1345, 1345, 12, 88, 23553, 6, 900, 17, 10740, 10742), + (10743, -1, -1, 1196, 1196, 5, 86, -1, 0, 0, 17, 1200, 10744), + (10744, -1, -1, 1196, 1196, 5, 87, -1, 0, 0, 17, 10743, 10745), + (10745, -1, -1, 1196, 1196, 5, 88, -1, 0, 0, 17, 10744, 10746), + (10748, -1, -1, 867, 867, 7, 86, -1, 0, 0, 17, 7366, 10749), + (10749, -1, -1, 867, 867, 7, 87, -1, 0, 0, 17, 10748, 10755), + (10750, -1, -1, 7103, 7103, 2, 70, -1, 0, 0, 16, 7328, 10751), + (10751, -1, -1, 7103, 7103, 2, 70, -1, 0, 0, 16, 10750, -1), + (10752, 10752, 10752, 10752, 10752, 6, 85, 16843, 72, 600, 16, -1, -1), + (10753, 10753, 10753, 10753, 10753, 12, 80, 16844, 6, 4320, 16, -1, -1), + (10754, 10754, 10754, 10754, 10754, 2, 70, 16845, 62, 5, 16, -1, -1), + (10755, -1, -1, 867, 867, 7, 88, -1, 0, 0, 17, 10749, 10756), + (10758, 545, 545, 545, 545, 12, 86, 23638, 3, 900, 17, 7346, 10759), + (10759, 545, 545, 545, 545, 12, 87, 23639, 3, 900, 17, 10758, 10760), + (10760, 545, 545, 545, 545, 12, 88, 23640, 3, 900, 17, 10759, 10761), + (10763, -1, -1, 6761, 6761, 12, 86, -1, 0, 0, 17, 6087, 10764), + (10764, -1, -1, 6761, 6761, 12, 88, -1, 0, 0, 17, 10763, 10765), + (10766, -1, -1, 6765, 6765, 9, 85, -1, 0, 0, 17, 10060, 10767), + (10767, -1, -1, 6765, 6765, 9, 87, -1, 0, 0, 17, 10766, 10768), + (10768, -1, -1, 6765, 6765, 9, 89, -1, 0, 0, 17, 10767, 13553), + (10769, -1, -1, 6751, 6751, 9, 86, -1, 0, 0, 17, 6769, 10770), + (10770, -1, -1, 6751, 6751, 9, 88, -1, 0, 0, 17, 10769, 10771), + (10772, 872, 872, 872, 872, 9, 85, 23555, 5, 180, 17, 7369, 10773), + (10773, 872, 872, 872, 872, 9, 87, 23556, 5, 180, 17, 10772, 10774), + (10774, 872, 872, 872, 872, 9, 89, 23557, 5, 180, 17, 10773, -1), + (10775, 875, 875, 875, 875, 9, 85, 23561, 5, 180, 17, 7372, 10776), + (10776, 875, 875, 875, 875, 9, 87, 23562, 5, 180, 17, 10775, 10777), + (10777, 875, 875, 875, 875, 9, 89, 23563, 5, 180, 17, 10776, 13536), + (10778, -1, -1, 634, 634, 12, 85, -1, 0, 0, 17, 7714, 10779), + (10779, -1, -1, 634, 634, 12, 87, -1, 0, 0, 17, 10778, 10780), + (10780, -1, -1, 634, 634, 12, 89, -1, 0, 0, 17, 10779, 15585), + (10781, -1, -1, 8240, 8240, 9, 85, -1, 0, 0, 17, 8244, 10782), + (10782, -1, -1, 8240, 8240, 9, 86, -1, 0, 0, 17, 10781, 10783), + (10783, -1, -1, 8240, 8240, 9, 87, -1, 0, 0, 17, 10782, 10784), + (10784, -1, -1, 8240, 8240, 9, 88, -1, 0, 0, 17, 10783, 10785), + (10785, -1, -1, 8240, 8240, 9, 89, -1, 0, 0, 17, 10784, 13343), + (10786, 7800, 7800, 7800, 7800, 12, 85, 23567, 39, 4320, 17, 7817, 10787), + (10787, 7800, 7800, 7800, 7800, 12, 87, 23568, 39, 4320, 17, 10786, 13619), + (10788, -1, -1, 4699, 4699, 7, 65, -1, 0, 0, 17, 7500, -1), + (10789, 10789, 10789, 10789, 10789, 15, 90, 23575, 41, 6, 17, -1, 14261), + (10790, 10396, 10396, 10396, 10396, 15, 90, 23576, 14, 600, 17, 10396, 14024), + (10791, 10397, 10397, 10397, 10397, 15, 90, 23577, 14, 600, 17, 10397, 14025), + (10792, -1, -1, 10792, 10792, 5, 86, 0, 0, 0, 17, -1, 10793), + (10793, -1, -1, 10792, 10792, 7, 87, 0, 0, 0, 17, 10792, 10794), + (10794, -1, -1, 10792, 10792, 9, 88, 0, 0, 0, 17, 10793, 10795), + (10795, -1, -1, 10792, 10792, 11, 89, 0, 0, 0, 17, 10794, 10796), + (10796, -1, -1, 10792, 10792, 13, 90, 0, 0, 0, 17, 10795, 17365), + (10800, -1, -1, 10800, 10800, 6, 70, -1, 0, 0, 16, -1, 10801), + (10801, -1, -1, 10800, 10800, 9, 70, -1, 0, 0, 16, 10800, 10802), + (10802, -1, -1, 10800, 10800, 12, 70, -1, 0, 0, 16, 10801, 17476), + (10803, -1, -1, 10803, 10803, 6, 76, -1, 0, 0, 16, -1, 10804), + (10804, -1, -1, 10803, 10803, 6, 78, -1, 0, 0, 16, 10803, 10805), + (10805, -1, -1, 10803, 10803, 6, 80, -1, 0, 0, 16, 10804, -1), + (10806, 10806, 10806, 10806, 10806, 10, 80, 16846, 71, 540, 16, -1, 10807), + (10807, 10806, 10806, 10806, 10806, 11, 80, 16847, 71, 540, 16, 10806, 10808), + (10808, 10806, 10806, 10806, 10806, 12, 80, 16848, 71, 540, 16, 10807, 15298), + (10809, 10809, 10809, 10809, 10809, 10, 80, 16849, 71, 540, 16, -1, 10810), + (10810, 10809, 10809, 10809, 10809, 11, 80, 16850, 71, 540, 16, 10809, 10811), + (10811, 10809, 10809, 10809, 10809, 12, 80, 16851, 71, 540, 16, 10810, 15301), + (10815, 10815, 10815, 10815, 10815, 6, 80, -1, 0, 0, 16, -1, 10816), + (10816, 10815, 10815, 10815, 10815, 9, 80, -1, 0, 0, 16, 10815, 10817), + (10817, 10815, 10815, 10815, 10815, 12, 80, -1, 0, 0, 16, 10816, 13110), + (10818, 10818, 10818, 10818, 10818, 6, 80, -1, 0, 0, 16, -1, 10819), + (10819, 10818, 10818, 10818, 10818, 9, 80, -1, 0, 0, 16, 10818, 10820), + (10820, 10818, 10818, 10818, 10818, 12, 80, -1, 0, 0, 16, 10819, 13113), + (10821, 10821, 10821, 10821, 10821, 6, 80, -1, 0, 0, 16, -1, 10822), + (10822, 10821, 10821, 10821, 10821, 9, 80, -1, 0, 0, 16, 10821, 10823), + (10823, 10821, 10821, 10821, 10821, 12, 80, -1, 0, 0, 16, 10822, 13116), + (10824, 510, 510, 510, 510, 6, 86, 23578, 37, 240, 17, 10104, 10825), + (10850, -1, -1, 10850, 10850, 6, 85, 16864, 0, 0, 16, -1, 10851), + (10851, -1, -1, 10850, 10850, 6, 85, 16865, 0, 0, 16, 10850, 10852), + (10852, -1, -1, 10850, 10850, 6, 85, 16866, 0, 0, 16, 10851, 13207), + (10853, -1, -1, 10853, 10853, 3, 65, -1, 0, 0, 16, -1, 10854), + (10854, -1, -1, 10853, 10853, 6, 65, -1, 0, 0, 16, 10853, 10855), + (10855, -1, -1, 10853, 10853, 9, 65, -1, 0, 0, 16, 10854, 10856), + (10856, -1, -1, 10853, 10853, 5, 66, -1, 0, 0, 16, 10855, 10857), + (10857, -1, -1, 10853, 10853, 5, 68, -1, 0, 0, 16, 10856, 10858), + (10858, -1, -1, 10853, 10853, 5, 70, -1, 0, 0, 16, 10857, 10859), + (10859, -1, -1, 10853, 10853, 5, 76, -1, 0, 0, 16, 10858, 10860), + (10860, -1, -1, 10853, 10853, 5, 78, -1, 0, 0, 16, 10859, 10861), + (10861, -1, -1, 10853, 10853, 5, 80, -1, 0, 0, 16, 10860, 10862), + (10862, -1, -1, 10853, 10853, 5, 81, -1, 0, 0, 16, 10861, 10863), + (10863, -1, -1, 10853, 10853, 5, 83, -1, 0, 0, 16, 10862, 10864), + (10864, -1, -1, 10853, 10853, 5, 85, -1, 0, 0, 16, 10863, 15954), + (10865, -1, -1, 1304, 1304, 12, 85, -1, 0, 0, 16, 7150, 10866), + (10866, -1, -1, 1304, 1304, 12, 85, -1, 0, 0, 16, 10865, 10867), + (10867, -1, -1, 1304, 1304, 12, 85, -1, 0, 0, 16, 10866, 13218), + (10868, 5021, 5021, 5021, 5021, 9, 76, 16867, 7, 60, 16, 5021, 10869), + (10869, 5021, 5021, 5021, 5021, 9, 81, 16868, 7, 60, 16, 10868, 10870), + (10870, 5021, 5021, 5021, 5021, 9, 85, 16869, 7, 60, 16, 10869, 12618), + (10900, 10900, 10900, 10900, 10900, 9, 85, 16870, 55, 120, 16, -1, 10901), + (10901, 10900, 10900, 10900, 10900, 9, 85, 16871, 55, 120, 16, 10900, 10902), + (10902, 10900, 10900, 10900, 10900, 9, 85, 16872, 55, 120, 16, 10901, 13624), + (10903, -1, -1, 10903, 10903, 6, 81, -1, 0, 0, 16, -1, 10904), + (10904, -1, -1, 10903, 10903, 6, 83, -1, 0, 0, 16, 10903, 10905), + (10905, -1, -1, 10903, 10903, 6, 85, -1, 0, 0, 16, 10904, -1), + (10906, -1, -1, 895, 895, 12, 85, -1, 0, 0, 16, 7406, 10907), + (10907, -1, -1, 895, 895, 12, 85, -1, 0, 0, 16, 10906, 10908), + (10908, -1, -1, 895, 895, 12, 85, -1, 0, 0, 16, 10907, 13627), + (10909, -1, -1, 10909, 10909, 6, 85, -1, 0, 0, 16, -1, 10910), + (10910, -1, -1, 10909, 10909, 6, 85, -1, 0, 0, 16, 10909, 10911), + (10911, -1, -1, 10909, 10909, 6, 85, -1, 0, 0, 16, 10910, -1), + (10912, 10912, 10912, 10912, 10912, 6, 85, 16873, 69, 1800, 16, -1, 10913), + (10913, 10912, 10912, 10912, 10912, 6, 85, 16874, 69, 1800, 16, 10912, 10914), + (10914, 10912, 10912, 10912, 10912, 6, 85, 16875, 69, 1800, 16, 10913, 14053), + (10915, -1, -1, 10915, 10915, 9, 85, -1, 0, 0, 16, -1, 10916), + (10916, -1, -1, 10915, 10915, 9, 85, -1, 0, 0, 16, 10915, 10917), + (10917, -1, -1, 10915, 10915, 9, 85, -1, 0, 0, 16, 10916, 16189), + (10950, -1, -1, 10950, 10950, 6, 85, -1, 0, 0, 16, -1, -1), + (10951, -1, -1, 10951, 10951, 12, 85, -1, 0, 0, 16, -1, 10952), + (10952, -1, -1, 10951, 10951, 12, 85, -1, 0, 0, 16, 10951, 10953), + (10953, -1, -1, 10951, 10951, 12, 85, -1, 0, 0, 16, 10952, 15363), + (10954, -1, -1, 10954, 10954, 12, 85, -1, 0, 0, 16, -1, 10955), + (10955, -1, -1, 10954, 10954, 12, 85, -1, 0, 0, 16, 10954, 10956), + (10956, -1, -1, 10954, 10954, 12, 85, -1, 0, 0, 16, 10955, -1), + (10957, 10957, 10957, 10957, 10957, 6, 85, 16879, 61, 5, 16, -1, -1), + (10958, 10958, 10958, 10958, 10958, 12, 85, 16880, 62, 900, 16, -1, 13000), + (10959, 10959, 10959, 10959, 10959, 12, 85, 16881, 63, 600, 16, -1, 10961), + (10961, 10959, 10959, 10959, 10959, 12, 85, 21717, 63, 600, 16, 10959, 10962), + (10962, 10959, 10959, 10959, 10959, 12, 85, 21718, 63, 600, 16, 10961, 12988), + (11000, -1, -1, 11000, 11000, 6, 85, -1, 0, 0, 16, -1, 11001), + (11001, -1, -1, 11000, 11000, 9, 85, -1, 0, 0, 16, 11000, 11002), + (11002, -1, -1, 11000, 11000, 12, 85, -1, 0, 0, 16, 11001, -1), + (11003, -1, -1, 11003, 11003, 6, 85, -1, 0, 0, 16, -1, -1), + (11004, -1, -1, 11004, 11004, 6, 85, -1, 0, 0, 16, -1, 11005), + (11005, -1, -1, 11004, 11004, 6, 85, -1, 0, 0, 16, 11004, 11006), + (11006, -1, -1, 11004, 11004, 6, 85, -1, 0, 0, 16, 11005, -1), + (11011, -1, -1, 6302, 6302, 5, 85, 0, 0, 0, 16, 6304, 11012), + (11012, -1, -1, 6302, 6302, 5, 85, 0, 0, 0, 16, 11011, 11013), + (11013, -1, -1, 6302, 6302, 5, 85, 0, 0, 0, 16, 11012, 15552), + (11014, -1, -1, 11007, 11007, 5, 80, -1, 0, 0, 16, -1, 11015), + (11015, -1, -1, 11007, 11007, 7, 82, -1, 0, 0, 16, 11014, 11016), + (11016, -1, -1, 11007, 11007, 9, 85, -1, 0, 0, 16, 11015, 11020), + (11020, -1, -1, 11007, 11007, 12, 86, -1, 0, 0, 17, 11016, -1), + (11050, -1, -1, 11050, 11050, 6, 85, -1, 0, 0, 16, -1, 11051), + (11051, -1, -1, 11050, 11050, 6, 85, -1, 0, 0, 16, 11050, 11052), + (11052, -1, -1, 11050, 11050, 6, 85, -1, 0, 0, 16, 11051, 11059), + (11053, -1, -1, 6349, 6349, 6, 83, -1, 0, 0, 16, 7620, 11054), + (11054, -1, -1, 6349, 6349, 6, 83, -1, 0, 0, 16, 11053, -1), + (11055, 11055, 11055, 11055, 11055, 3, 85, 16884, 63, 20, 16, -1, -1), + (11056, 11056, 11056, 11056, 11056, 6, 85, 16885, 64, 180, 16, -1, -1), + (11057, 11057, 11057, 11057, 11057, 2, 85, 1422, 65, 10, 16, -1, -1), + (11058, 11058, 11058, 11058, 11058, 2, 85, 3243, 66, 10, 16, -1, -1), + (11059, -1, -1, 11050, 11050, 6, 85, -1, 0, 0, 16, 11052, 11060), + (11060, -1, -1, 11050, 11050, 6, 85, -1, 0, 0, 16, 11059, 12871), + (11061, -1, -1, 98, 98, 12, 85, -1, 0, 0, 16, 7586, 11062), + (11062, -1, -1, 98, 98, 12, 85, -1, 0, 0, 16, 11061, 11063), + (11063, -1, -1, 98, 98, 12, 85, -1, 0, 0, 16, 11062, 13921), + (11064, 6290, 6290, 6290, 6290, 7, 85, 23500, 0, 1, 16, 7225, 11065), + (11065, 6290, 6290, 6290, 6290, 9, 85, 23501, 0, 1, 16, 11064, 11066), + (11066, 6290, 6290, 6290, 6290, 12, 85, 23502, 0, 1, 16, 11065, 13229), + (11067, 4944, -1, 4944, 4944, 7, 85, 23506, 0, 1, 16, 7231, 11068), + (11068, 4944, -1, 4944, 4944, 9, 85, 23507, 0, 1, 16, 11067, 11069), + (11069, 4944, -1, 4944, 4944, 12, 85, 23508, 0, 1, 16, 11068, 13232), + (11070, 1478, -1, 1478, 1478, 9, 85, 23512, 0, 1, 16, 7244, 11071), + (11071, 1478, -1, 1478, 1478, 10, 85, 23513, 0, 1, 16, 11070, 11072), + (11072, 1478, -1, 1478, 1478, 12, 85, 23514, 0, 1, 16, 11071, 13235), + (11073, 11073, 11073, 11073, 11073, 12, 85, 23518, 53, 30, 16, -1, 13447), + (11074, -1, -1, 11074, 11074, 5, 81, 0, 0, 0, 16, -1, 11075), + (11075, -1, -1, 11074, 11074, 7, 83, 0, 0, 0, 16, 11074, 11076), + (11076, -1, -1, 11074, 11074, 9, 85, 0, 0, 0, 16, 11075, -1), + (11077, -1, -1, 11077, 11077, 5, 81, 0, 0, 0, 16, -1, 15895), + (11078, -1, -1, 11078, 11078, 5, 81, 0, 0, 0, 16, -1, 15891), + (11079, -1, -1, 11079, 11079, 5, 81, 0, 0, 0, 16, -1, 15893), + (11080, 11080, 11080, 11080, 11080, 7, 85, 23519, 10, 20, 16, -1, 13472), + (11081, 153, 153, 153, 153, 12, 85, 23599, 3, 2160, 16, 10193, 12996), + (11082, -1, -1, 1131, 1131, 6, 81, -1, 0, 0, 16, 1133, 11083), + (11083, -1, -1, 1131, 1131, 9, 83, -1, 0, 0, 16, 11082, 11084), + (11084, -1, -1, 1131, 1131, 12, 85, -1, 0, 0, 16, 11083, 13032), + (11085, -1, -1, 11085, 11085, 7, 85, 0, 0, 0, 16, -1, 11086), + (11086, -1, -1, 11085, 11085, 9, 85, 0, 0, 0, 16, 11085, 11087), + (11087, -1, -1, 11085, 11085, 12, 85, 0, 0, 0, 16, 11086, 13021), + (11088, -1, -1, 11088, 11088, 6, 75, 0, 0, 0, 16, -1, 11089), + (11089, -1, -1, 11088, 11088, 6, 75, 0, 0, 0, 16, 11088, 11090), + (11090, -1, -1, 11088, 11088, 6, 75, 0, 0, 0, 16, 11089, 11091), + (11091, -1, -1, 11088, 11088, 6, 75, 0, 0, 0, 16, 11090, -1), + (12396, -1, -1, 125, 125, 8, 85, -1, 0, 0, 16, 7505, 12397), + (12397, -1, -1, 125, 125, 9, 85, -1, 0, 0, 16, 12396, 12398), + (12398, -1, -1, 125, 125, 10, 85, -1, 0, 0, 16, 12397, 12399), + (12399, -1, -1, 125, 125, 11, 85, -1, 0, 0, 16, 12398, 12400), + (12400, -1, -1, 125, 125, 12, 85, -1, 0, 0, 16, 12399, 13080), + (12401, -1, -1, 122, 122, 8, 85, -1, 0, 0, 16, 7510, 12402), + (12402, -1, -1, 122, 122, 9, 85, -1, 0, 0, 16, 12401, 12403), + (12403, -1, -1, 122, 122, 10, 85, -1, 0, 0, 16, 12402, 12404), + (12404, -1, -1, 122, 122, 11, 85, -1, 0, 0, 16, 12403, 12405), + (12405, -1, -1, 122, 122, 12, 85, -1, 0, 0, 16, 12404, 13085), + (12406, -1, -1, 6119, 6119, 6, 85, -1, 0, 0, 16, 7530, 12407), + (12407, -1, -1, 6119, 6119, 6, 85, -1, 0, 0, 16, 12406, 12408), + (12408, -1, -1, 6119, 6119, 6, 85, -1, 0, 0, 16, 12407, 12409), + (12409, -1, -1, 6119, 6119, 6, 85, -1, 0, 0, 16, 12408, 12410), + (12410, -1, -1, 6119, 6119, 6, 85, -1, 0, 0, 16, 12409, 12492), + (12411, -1, -1, 8255, 8255, 6, 85, -1, 0, 0, 16, 8259, 12412), + (12412, -1, -1, 8255, 8255, 6, 85, -1, 0, 0, 16, 12411, 12413), + (12413, -1, -1, 8255, 8255, 6, 85, -1, 0, 0, 16, 12412, 12414), + (12414, -1, -1, 8255, 8255, 6, 85, -1, 0, 0, 16, 12413, 12415), + (12415, -1, -1, 8255, 8255, 6, 85, -1, 0, 0, 16, 12414, 13358), + (12416, -1, -1, 12416, 12416, 7, 83, -1, 0, 0, 16, -1, 12417), + (12417, -1, -1, 12416, 12416, 9, 84, -1, 0, 0, 16, 12416, 12418), + (12418, -1, -1, 12416, 12416, 12, 85, -1, 0, 0, 16, 12417, 13413), + (12419, -1, -1, 12419, 12419, 5, 83, -1, 0, 0, 16, -1, 12420), + (12420, -1, -1, 12419, 12419, 5, 84, -1, 0, 0, 16, 12419, 12421), + (12421, -1, -1, 12419, 12419, 5, 85, -1, 0, 0, 16, 12420, 12575), + (12422, 12422, 12422, 12422, 12422, 12, 85, 13994, 47, 12, 16, -1, -1), + (12423, -1, -1, 767, 767, 9, 81, -1, 0, 0, 16, 1101, 12424), + (12424, -1, -1, 767, 767, 10, 83, -1, 0, 0, 16, 12423, 12425), + (12425, -1, -1, 767, 767, 12, 85, -1, 0, 0, 16, 12424, -1), + (12426, -1, -1, 767, 767, 3, 81, -1, 0, 0, 16, 6245, 12427), + (12427, -1, -1, 767, 767, 6, 83, -1, 0, 0, 16, 12426, 12428), + (12428, -1, -1, 767, 767, 9, 85, -1, 0, 0, 16, 12427, -1), + (12432, -1, -1, 1107, 1107, 10, 81, -1, 0, 0, 16, 6405, 12433), + (12433, -1, -1, 1107, 1107, 11, 83, -1, 0, 0, 16, 12432, 12434), + (12434, -1, -1, 1107, 1107, 12, 85, -1, 0, 0, 16, 12433, 12556), + (12435, -1, -1, 637, 637, 8, 81, -1, 0, 0, 16, 5573, 12436), + (12436, -1, -1, 637, 637, 10, 83, -1, 0, 0, 16, 12435, 12437), + (12437, -1, -1, 637, 637, 12, 85, -1, 0, 0, 16, 12436, 12553), + (12438, -1, -1, 686, 686, 5, 85, -1, 0, 0, 16, 7640, -1), + (12439, -1, -1, 1592, 1592, 9, 85, -1, 0, 0, 16, 7572, 12440), + (12440, -1, -1, 1592, 1592, 10, 85, -1, 0, 0, 16, 12439, 12441), + (12441, -1, -1, 1592, 1592, 11, 85, -1, 0, 0, 16, 12440, 12442), + (12442, -1, -1, 1592, 1592, 12, 85, -1, 0, 0, 16, 12441, 12443), + (12443, -1, -1, 1592, 1592, 12, 85, -1, 0, 0, 16, 12442, 12532), + (12444, -1, -1, 1072, 1072, 8, 85, -1, 0, 0, 16, 7580, 12445), + (12445, -1, -1, 1072, 1072, 9, 85, -1, 0, 0, 16, 12444, 12446), + (12446, -1, -1, 1072, 1072, 10, 85, -1, 0, 0, 16, 12445, 12447), + (12447, -1, -1, 1072, 1072, 11, 85, -1, 0, 0, 16, 12446, 12448), + (12448, -1, -1, 1072, 1072, 12, 85, -1, 0, 0, 16, 12447, 12537), + (12449, -1, -1, 77, 77, 10, 81, -1, 0, 0, 16, 1085, 12450), + (12450, -1, -1, 77, 77, 11, 83, -1, 0, 0, 16, 12449, 12451), + (12451, -1, -1, 77, 77, 12, 85, -1, 0, 0, 16, 12450, 12497), + (12452, -1, -1, 80, 80, 12, 85, -1, 0, 0, 16, 7592, 12453), + (12453, -1, -1, 80, 80, 12, 85, -1, 0, 0, 16, 12452, 12454), + (12454, -1, -1, 80, 80, 12, 85, -1, 0, 0, 16, 12453, 12567), + (12455, -1, -1, 658, 658, 5, 85, -1, 0, 0, 16, 7597, 12456), + (12456, -1, -1, 658, 658, 5, 85, -1, 0, 0, 16, 12455, 12457), + (12457, -1, -1, 658, 658, 5, 85, -1, 0, 0, 16, 12456, 12458), + (12458, -1, -1, 658, 658, 5, 85, -1, 0, 0, 16, 12457, 12459), + (12459, -1, -1, 658, 658, 5, 85, -1, 0, 0, 16, 12458, 12570), + (12460, 6537, 6537, 6537, 6537, 7, 83, 20172, 30, 900, 16, 7608, 12461), + (12461, 6537, 6537, 6537, 6537, 8, 83, 20173, 30, 900, 16, 12460, 12462), + (12462, 6537, 6537, 6537, 6537, 9, 83, 20174, 30, 900, 16, 12461, 12520), + (12463, -1, -1, 5263, 5263, 7, 81, -1, 0, 0, 16, 6129, 12464), + (12464, -1, -1, 5263, 5263, 8, 81, -1, 0, 0, 16, 12463, 12465), + (12465, -1, -1, 5263, 5263, 9, 81, -1, 0, 0, 16, 12464, 16173), + (12466, -1, -1, 5263, 5263, 7, 81, -1, 0, 0, 16, 5622, 12467), + (12467, -1, -1, 5263, 5263, 9, 81, -1, 0, 0, 16, 12466, 12468), + (12468, -1, -1, 5263, 5263, 12, 81, -1, 0, 0, 16, 12467, 15714), + (12469, -1, -1, 1287, 1287, 7, 81, -1, 0, 0, 16, 5518, 12470), + (12470, -1, -1, 1287, 1287, 9, 81, -1, 0, 0, 16, 12469, 12471), + (12471, -1, -1, 1287, 1287, 12, 81, -1, 0, 0, 16, 12470, 10637), + (12472, -1, -1, 1287, 1287, 8, 81, -1, 0, 0, 16, 6430, 12473), + (12473, -1, -1, 1287, 1287, 9, 81, -1, 0, 0, 16, 12472, 12474), + (12474, -1, -1, 1287, 1287, 10, 81, -1, 0, 0, 16, 12473, 13238), + (12475, -1, -1, 12430, 12430, 5, 85, 0, 0, 0, 16, -1, 12476), + (12476, -1, -1, 12430, 12430, 7, 85, 0, 0, 0, 16, 12475, 12477), + (12477, -1, -1, 12430, 12430, 9, 85, 0, 0, 0, 16, 12476, 12876), + (12478, -1, -1, 12478, 12478, 5, 85, 0, 0, 0, 16, -1, 12479), + (12479, -1, -1, 12478, 12478, 7, 85, 0, 0, 0, 16, 12478, 12480), + (12480, -1, -1, 12478, 12478, 9, 85, 0, 0, 0, 16, 12479, -1), + (12481, -1, -1, 6540, 6540, 8, 85, -1, 0, 0, 16, 6473, 12482), + (12482, -1, -1, 6540, 6540, 8, 85, -1, 0, 0, 16, 12481, 12508), + (12483, -1, -1, 6540, 6540, 8, 85, -1, 0, 0, 16, 6475, 12484), + (12484, -1, -1, 6540, 6540, 8, 85, -1, 0, 0, 16, 12483, 12511), + (12485, -1, -1, 6540, 6540, 8, 85, -1, 0, 0, 16, 6477, 12486), + (12486, -1, -1, 6540, 6540, 8, 85, -1, 0, 0, 16, 12485, 12514), + (12487, -1, -1, 6540, 6540, 8, 83, -1, 0, 0, 16, 6471, 12488), + (12488, -1, -1, 6540, 6540, 8, 85, -1, 0, 0, 16, 12487, 12517), + (12492, -1, -1, 6119, 6119, 6, 85, -1, 0, 0, 17, 12410, 12493), + (12493, -1, -1, 6119, 6119, 6, 86, -1, 0, 0, 17, 12492, 12494), + (12494, -1, -1, 6119, 6119, 6, 87, -1, 0, 0, 17, 12493, 12495), + (12495, -1, -1, 6119, 6119, 6, 88, -1, 0, 0, 17, 12494, 12496), + (12496, -1, -1, 6119, 6119, 6, 89, -1, 0, 0, 17, 12495, 8448), + (12497, -1, -1, 77, 77, 12, 86, -1, 0, 0, 17, 12451, 12498), + (12498, -1, -1, 77, 77, 12, 88, -1, 0, 0, 17, 12497, 12499), + (12499, -1, -1, 77, 77, 12, 90, -1, 0, 0, 17, 12498, 13296), + (12500, -1, -1, 12500, 12500, 5, 81, -1, 0, 0, 16, -1, 12501), + (12501, -1, -1, 12500, 12500, 7, 81, -1, 0, 0, 16, 12500, 12502), + (12502, -1, -1, 12500, 12500, 9, 81, -1, 0, 0, 16, 12501, 12505), + (12505, -1, -1, 12500, 12500, 11, 83, -1, 0, 0, 16, 12502, 12506), + (12506, -1, -1, 12500, 12500, 12, 85, -1, 0, 0, 16, 12505, -1), + (12507, -1, -1, 199, 199, 12, 81, -1, 0, 0, 16, 201, -1), + (12508, -1, -1, 6540, 6540, 8, 86, -1, 0, 0, 17, 12482, 12509), + (12509, -1, -1, 6540, 6540, 8, 88, -1, 0, 0, 17, 12508, 12510), + (12510, -1, -1, 6540, 6540, 8, 90, -1, 0, 0, 17, 12509, 16440), + (12511, -1, -1, 6540, 6540, 8, 86, -1, 0, 0, 17, 12484, 12512), + (12512, -1, -1, 6540, 6540, 8, 88, -1, 0, 0, 17, 12511, 12513), + (12513, -1, -1, 6540, 6540, 8, 90, -1, 0, 0, 17, 12512, 12591), + (12514, -1, -1, 6540, 6540, 8, 86, -1, 0, 0, 17, 12486, 12515), + (12515, -1, -1, 6540, 6540, 8, 88, -1, 0, 0, 17, 12514, 12516), + (12516, -1, -1, 6540, 6540, 8, 90, -1, 0, 0, 17, 12515, 12594), + (12517, -1, -1, 6540, 6540, 8, 86, -1, 0, 0, 17, 12488, 12518), + (12518, -1, -1, 6540, 6540, 8, 88, -1, 0, 0, 17, 12517, 12519), + (12519, -1, -1, 6540, 6540, 8, 90, -1, 0, 0, 17, 12518, 12597), + (12520, 6537, 6537, 6537, 6537, 7, 86, 23974, 30, 900, 17, 12462, 12521), + (12521, 6537, 6537, 6537, 6537, 8, 88, 23975, 30, 900, 17, 12520, 12522), + (12522, 6537, 6537, 6537, 6537, 9, 90, 23976, 30, 900, 17, 12521, 13275), + (12523, -1, -1, 1210, 1210, 7, 86, -1, 0, 0, 17, 7234, 12524), + (12526, -1, -1, 1210, 1213, 12, 86, -1, 0, 0, 17, 8346, 12527), + (12527, -1, -1, 1210, 1213, 12, 88, -1, 0, 0, 17, 12526, 12528), + (12528, -1, -1, 1210, 1213, 12, 90, -1, 0, 0, 17, 12527, 14349), + (12529, -1, -1, 6636, 6636, 9, 86, -1, 0, 0, 17, 10043, 12530), + (12530, -1, -1, 6636, 6636, 10, 88, -1, 0, 0, 17, 12529, 12531), + (12531, -1, -1, 6636, 6636, 11, 90, -1, 0, 0, 17, 12530, 16164), + (12532, -1, -1, 1592, 1592, 9, 86, -1, 0, 0, 17, 12443, 12533), + (12533, -1, -1, 1592, 1592, 10, 87, -1, 0, 0, 17, 12532, 12534), + (12534, -1, -1, 1592, 1592, 11, 88, -1, 0, 0, 17, 12533, 12535), + (12535, -1, -1, 1592, 1592, 12, 89, -1, 0, 0, 17, 12534, 12536), + (12536, -1, -1, 1592, 1592, 12, 90, -1, 0, 0, 17, 12535, 13930), + (12537, -1, -1, 1072, 1072, 8, 86, -1, 0, 0, 17, 12448, 12538), + (12538, -1, -1, 1072, 1072, 9, 87, -1, 0, 0, 17, 12537, 12539), + (12539, -1, -1, 1072, 1072, 10, 88, -1, 0, 0, 17, 12538, 12540), + (12540, -1, -1, 1072, 1072, 11, 89, -1, 0, 0, 17, 12539, 12541), + (12541, -1, -1, 1072, 1072, 12, 90, -1, 0, 0, 17, 12540, 13281), + (12548, -1, -1, 119, 119, 12, 86, -1, 0, 0, 17, 6025, 12549), + (12549, -1, -1, 119, 119, 12, 87, -1, 0, 0, 17, 12548, 12550), + (12550, -1, -1, 119, 119, 12, 88, -1, 0, 0, 17, 12549, 12551), + (12551, -1, -1, 119, 119, 12, 89, -1, 0, 0, 17, 12550, 12552), + (12552, -1, -1, 119, 119, 12, 90, -1, 0, 0, 17, 12551, 13286), + (12553, -1, -1, 637, 637, 8, 86, -1, 0, 0, 17, 12437, 12554), + (12554, -1, -1, 637, 637, 10, 88, -1, 0, 0, 17, 12553, 12555), + (12555, -1, -1, 637, 637, 12, 90, -1, 0, 0, 17, 12554, 14361), + (12556, -1, -1, 1107, 1107, 10, 86, -1, 0, 0, 17, 12434, 12557), + (12557, -1, -1, 1107, 1107, 11, 88, -1, 0, 0, 17, 12556, 12558), + (12558, -1, -1, 1107, 1107, 12, 90, -1, 0, 0, 17, 12557, 16489), + (12559, -1, -1, 8215, 8215, 5, 86, -1, 0, 0, 17, 8219, 12560), + (12560, -1, -1, 8215, 8215, 5, 87, -1, 0, 0, 17, 12559, 12561), + (12561, -1, -1, 8215, 8215, 5, 88, -1, 0, 0, 17, 12560, 12562), + (12562, -1, -1, 8215, 8215, 5, 89, -1, 0, 0, 17, 12561, 12563), + (12563, -1, -1, 8215, 8215, 5, 90, -1, 0, 0, 17, 12562, 15694), + (12564, -1, -1, 1186, 1186, 12, 86, -1, 0, 0, 17, 7694, 12565), + (12565, -1, -1, 1186, 1186, 12, 88, -1, 0, 0, 17, 12564, 12566), + (12566, -1, -1, 1186, 1186, 12, 90, -1, 0, 0, 17, 12565, 13299), + (12567, -1, -1, 80, 80, 12, 86, -1, 0, 0, 17, 12454, 12568), + (12568, -1, -1, 80, 80, 12, 88, -1, 0, 0, 17, 12567, 12569), + (12569, -1, -1, 80, 80, 12, 90, -1, 0, 0, 17, 12568, 13302), + (12570, -1, -1, 658, 658, 5, 86, -1, 0, 0, 17, 12459, 12571), + (12571, -1, -1, 658, 658, 5, 87, -1, 0, 0, 17, 12570, 12572), + (12572, -1, -1, 658, 658, 5, 88, -1, 0, 0, 17, 12571, 12573), + (12573, -1, -1, 658, 658, 5, 89, -1, 0, 0, 17, 12572, 12574), + (12574, -1, -1, 658, 658, 5, 90, -1, 0, 0, 17, 12573, 13313), + (12575, -1, -1, 12419, 12419, 9, 90, -1, 0, 0, 17, 12421, 13520), + (12576, -1, -1, 852, 852, 12, 86, -1, 0, 0, 17, 7680, 12577), + (12577, -1, -1, 852, 852, 12, 88, -1, 0, 0, 17, 12576, 12578), + (12578, -1, -1, 852, 852, 12, 90, -1, 0, 0, 17, 12577, 13601), + (12579, -1, -1, 1313, 1313, 12, 86, -1, 0, 0, 17, 10083, 12580), + (12580, -1, -1, 1313, 1313, 12, 88, -1, 0, 0, 17, 12579, 12581), + (12581, -1, -1, 1313, 1313, 12, 90, -1, 0, 0, 17, 12580, 14043), + (12582, -1, -1, 12582, 12582, 7, 85, 0, 0, 0, 17, -1, 12583), + (12583, -1, -1, 12582, 12582, 9, 87, 0, 0, 0, 17, 12582, 12584), + (12584, -1, -1, 12582, 12582, 12, 89, 0, 0, 0, 17, 12583, 15174), + (12585, 6640, 6640, 6640, 6640, 9, 86, 23572, 43, 60, 17, 6640, -1), + (12586, 6644, 6644, 6644, 6644, 2, 86, 23573, 44, 20, 17, 6644, -1), + (12587, -1, -1, 7757, 7757, 9, 86, -1, 0, 0, 17, 7759, 12588), + (12588, -1, -1, 7757, 7757, 9, 88, -1, 0, 0, 17, 12587, 12589), + (12589, -1, -1, 7757, 7757, 9, 90, -1, 0, 0, 17, 12588, 15182), + (12590, 10395, 10395, 10395, 10395, 5, 85, 23574, 62, 5, 17, 10395, -1), + (12591, -1, -1, 6540, 6540, 15, 91, -1, 0, 0, 18, 12513, 12592), + (12594, -1, -1, 6540, 6540, 11, 91, -1, 0, 0, 18, 12516, 12595), + (12597, -1, -1, 6540, 6540, 9, 91, -1, 0, 0, 18, 12519, 12598), + (12598, -1, -1, 6540, 6540, 11, 93, -1, 0, 0, 18, 12597, 12599), + (12600, -1, -1, 12600, 12600, 7, 85, 0, 0, 0, 17, -1, 13072), + (12603, -1, -1, 12603, 12603, 10, 70, 0, 0, 0, 17, -1, -1), + (12606, -1, -1, 12606, 12606, 6, 85, 0, 0, 0, 17, -1, -1), + (12607, -1, -1, 12607, 12607, 6, 74, 0, 0, 0, 17, -1, 14140), + (12610, -1, -1, 255, 255, 9, 87, -1, 0, 0, 17, 7702, 13773), + (12612, -1, -1, 1604, 1604, 10, 85, -1, 0, 0, 17, 7009, 12613), + (12613, -1, -1, 1604, 1604, 12, 87, -1, 0, 0, 17, 12612, 13095), + (12615, -1, -1, 12615, 12615, 10, 85, 0, 0, 0, 17, -1, 12616), + (12616, -1, -1, 12615, 12615, 12, 87, 0, 0, 0, 17, 12615, 12617), + (12617, -1, -1, 12615, 12615, 14, 89, 0, 0, 0, 17, 12616, 14138), + (12618, 5021, 5021, 5021, 5021, 9, 86, 24009, 7, 60, 17, 10870, 12619), + (12619, 5021, 5021, 5021, 5021, 9, 87, 24010, 7, 60, 17, 12618, 12620), + (12620, 5021, 5021, 5021, 5021, 9, 88, 24011, 7, 60, 17, 12619, 12621), + (12621, 5021, 5021, 5021, 5021, 9, 89, 24012, 7, 60, 17, 12620, 13785), + (12626, 9354, 9354, 9354, 9354, 5, 86, 23996, 40, 600, 17, 9356, -1), + (12629, 9357, 9357, 9357, 9357, 5, 86, 24002, 40, 600, 17, 9359, -1), + (12632, 9360, 9360, 9360, 9360, 5, 86, 24005, 40, 600, 17, 9362, -1), + (12633, 6325, 6325, 6325, 6325, 7, 85, 24008, 18, 600, 17, 6361, 13792), + (12635, 12635, 12635, 12635, 12635, 12, 90, 23643, 12, 5, 17, -1, -1), + (12636, -1, -1, 12636, 12636, 0, 1, -1, 0, 0, 16, -1, 12637), + (12637, -1, -1, 12636, 12636, 0, 1, -1, 0, 0, 16, 12636, 8445), + (12638, 12638, 12638, 12638, 12638, 9, 85, 23581, 68, 10, 17, -1, -1), + (12639, -1, -1, 10514, 10514, 6, 86, -1, 0, 0, 17, 10515, 12640), + (12642, -1, -1, 10511, 10511, 6, 86, -1, 0, 0, 17, 10513, 12643), + (12645, -1, -1, 12645, 12645, 9, 90, 0, 0, 0, 17, -1, 15386), + (12646, -1, -1, 12646, 12646, 9, 90, 0, 0, 0, 17, -1, 15388), + (12647, 10502, -1, 10502, 10502, 7, 90, 16815, 64, 120, 17, 10502, -1), + (12648, 10503, 10503, 10503, 10503, 9, 86, 23582, 13, 600, 17, 10505, 12649), + (12651, 12651, 12651, 12651, 12651, 15, 90, 23585, 69, 600, 17, -1, 17352), + (12652, -1, -1, 12652, 12652, 9, 86, 0, 0, 0, 17, -1, 12653), + (12653, -1, -1, 12652, 12652, 12, 88, 0, 0, 0, 17, 12652, 12654), + (12654, -1, -1, 12652, 12652, 15, 90, 0, 0, 0, 17, 12653, 13411), + (12655, 12655, 12655, 12655, 12655, 9, 86, 23586, 70, 1800, 17, -1, 12656), + (12658, 757, -1, 757, 757, 12, 86, 23589, 6, 1800, 17, 7413, 12659), + (12661, 12661, 12661, 12661, 12661, 9, 86, 23592, 73, 2700, 17, -1, 12662), + (12664, -1, -1, 12664, 12664, 7, 86, 0, 0, 0, 17, -1, 12665), + (12667, -1, -1, 820, 820, 5, 86, -1, 0, 0, 17, 10662, 12668), + (12668, -1, -1, 820, 820, 5, 88, -1, 0, 0, 17, 12667, 12669), + (12669, -1, -1, 820, 820, 5, 90, -1, 0, 0, 17, 12668, 13820), + (12670, -1, -1, 6020, 6020, 2, 86, -1, 0, 0, 17, 10665, 12671), + (12671, -1, -1, 6020, 6020, 2, 87, -1, 0, 0, 17, 12670, 12672), + (12672, -1, -1, 6020, 6020, 2, 88, -1, 0, 0, 17, 12671, 12692), + (12673, -1, -1, 1546, 1546, 5, 80, -1, 0, 0, 17, 6441, -1), + (12674, -1, -1, 4801, 4801, 6, 86, -1, 0, 0, 17, 10123, 12675), + (12675, -1, -1, 4801, 4801, 6, 88, -1, 0, 0, 17, 12674, 12676), + (12676, -1, -1, 4801, 4801, 6, 90, -1, 0, 0, 17, 12675, -1), + (12677, -1, -1, 230, 230, 6, 90, -1, 0, 0, 17, 541, 16249), + (12678, -1, -1, 10656, 10656, 12, 90, 0, 0, 0, 17, 10656, -1), + (12679, -1, -1, 10657, 10657, 7, 86, 0, 0, 0, 17, 10659, 12680), + (12680, -1, -1, 10657, 10657, 9, 88, 0, 0, 0, 17, 12679, 12681), + (12681, -1, -1, 10657, 10657, 12, 90, 0, 0, 0, 17, 12680, 14154), + (12682, 7872, 7872, 7872, 7872, 6, 86, 23595, 41, 600, 17, 10129, 12683), + (12683, 7872, 7872, 7872, 7872, 6, 88, 23596, 41, 600, 17, 12682, 12684), + (12684, 7872, 7872, 7872, 7872, 6, 90, 23597, 41, 600, 17, 12683, 13838), + (12685, -1, -1, 807, 807, 5, 86, -1, 0, 0, 17, 7630, 12686), + (12686, -1, -1, 807, 807, 5, 88, -1, 0, 0, 17, 12685, 12687), + (12687, -1, -1, 807, 807, 5, 90, -1, 0, 0, 17, 12686, -1), + (12688, -1, -1, 12688, 12688, 12, 90, 0, 0, 0, 17, -1, -1), + (12689, -1, -1, 7884, 7884, 12, 87, -1, 0, 0, 17, 7884, -1), + (12690, -1, -1, 7885, 7885, 12, 86, -1, 0, 0, 17, 7885, -1), + (12691, -1, -1, 12691, 12691, 12, 88, 0, 0, 0, 17, -1, -1), + (12692, -1, -1, 6020, 6020, 2, 89, -1, 0, 0, 17, 12672, 12693), + (12693, -1, -1, 6020, 6020, 2, 90, -1, 0, 0, 17, 12692, 13823), + (12694, -1, -1, 683, 683, 5, 86, -1, 0, 0, 17, 7605, 12695), + (12695, -1, -1, 683, 683, 5, 88, -1, 0, 0, 17, 12694, 12696), + (12696, -1, -1, 683, 683, 5, 90, -1, 0, 0, 17, 12695, 13305), + (12697, -1, -1, 1041, 1041, 12, 86, -1, 0, 0, 17, 7564, 12698), + (12698, -1, -1, 1041, 1041, 12, 88, -1, 0, 0, 17, 12697, 12699), + (12699, -1, -1, 1041, 1041, 12, 90, -1, 0, 0, 17, 12698, 13332), + (12700, 1355, 1355, 1355, 1355, 9, 86, 23644, 3, 60, 17, 10121, 12701), + (12701, 1355, 1355, 1355, 1355, 9, 88, 23645, 3, 60, 17, 12700, 12702), + (12702, 1355, 1355, 1355, 1355, 9, 90, 23646, 3, 60, 17, 12701, 13832), + (12703, -1, -1, 611, 611, 4, 86, -1, 0, 0, 17, 10126, 12704), + (12704, -1, -1, 611, 611, 4, 88, -1, 0, 0, 17, 12703, 12705), + (12705, -1, -1, 611, 611, 4, 90, -1, 0, 0, 17, 12704, 13835), + (12706, -1, -1, 12706, 12706, 7, 86, 0, 0, 0, 17, -1, 12707), + (12707, -1, -1, 12706, 12706, 9, 88, 0, 0, 0, 17, 12706, 12708), + (12708, -1, -1, 12706, 12706, 12, 90, 0, 0, 0, 17, 12707, 13813), + (12709, -1, -1, 12709, 12709, 9, 86, -1, 0, 0, 17, -1, -1), + (12710, -1, -1, 12710, 12710, 9, 86, 0, 0, 0, 17, -1, 12711), + (12711, -1, -1, 12710, 12710, 12, 88, 0, 0, 0, 17, 12710, 12712), + (12712, -1, -1, 12710, 12710, 15, 90, 0, 0, 0, 17, 12711, 14173), + (12713, -1, -1, 12713, 12713, 7, 86, 0, 0, 0, 17, -1, 12714), + (12714, -1, -1, 12713, 12713, 7, 88, 0, 0, 0, 17, 12713, 12715), + (12715, -1, -1, 12713, 12713, 7, 90, 0, 0, 0, 17, 12714, -1), + (12716, -1, -1, 12716, 12716, 7, 86, 0, 0, 0, 17, -1, 12717), + (12717, -1, -1, 12716, 12716, 7, 88, 0, 0, 0, 17, 12716, 12718), + (12718, -1, -1, 12716, 12716, 7, 90, 0, 0, 0, 17, 12717, 15526), + (12719, -1, -1, 12719, 12719, 9, 90, 0, 0, 0, 17, -1, -1), + (12720, -1, -1, 12720, 12720, 9, 86, 0, 0, 0, 17, -1, -1), + (12721, -1, -1, 12721, 12721, 7, 86, 0, 0, 0, 17, -1, 12722), + (12722, -1, -1, 12721, 12721, 9, 88, 0, 0, 0, 17, 12721, 12723), + (12723, -1, -1, 12721, 12721, 12, 90, 0, 0, 0, 17, 12722, 16303), + (12724, 10333, 10333, 10333, 10333, 9, 86, 23647, 55, 120, 17, 10335, 12725), + (12725, 10333, 10333, 10333, 10333, 9, 86, 23648, 55, 120, 17, 12724, 12726), + (12726, 10333, 10333, 10333, 10333, 9, 86, 23649, 55, 120, 17, 12725, 15988), + (12727, -1, -1, 1555, 1555, 7, 86, 0, 0, 0, 17, 1557, 12728), + (12728, -1, -1, 1555, 1555, 7, 88, 0, 0, 0, 17, 12727, 12729), + (12729, -1, -1, 1555, 1555, 7, 90, 0, 0, 0, 17, 12728, -1), + (12730, 10336, 10336, 10336, 10336, 9, 86, 23650, 58, 8, 17, 10338, 12731), + (12731, 10336, 10336, 10336, 10336, 12, 88, 23651, 58, 8, 17, 12730, 12732), + (12732, 10336, 10336, 10336, 10336, 15, 90, 23652, 58, 8, 17, 12731, 13517), + (12733, -1, -1, 10332, 10332, 7, 90, -1, 0, 0, 17, 10332, -1), + (12734, -1, -1, 6375, 6375, 9, 86, -1, 0, 0, 17, 10138, 12735), + (12735, -1, -1, 6375, 6375, 9, 88, -1, 0, 0, 17, 12734, 12736), + (12736, -1, -1, 6375, 6375, 9, 90, -1, 0, 0, 17, 12735, 13502), + (12737, -1, -1, 12737, 12737, 9, 86, 0, 0, 0, 17, -1, 12738), + (12738, -1, -1, 12737, 12737, 9, 88, 0, 0, 0, 17, 12737, 12739), + (12739, -1, -1, 12737, 12737, 9, 90, 0, 0, 0, 17, 12738, 15961), + (12740, 6533, 6533, 6533, 6533, 10, 86, 23653, 15, 600, 17, 10139, 12741), + (12741, 6533, 6533, 6533, 6533, 10, 88, 23654, 15, 600, 17, 12740, 12742), + (12742, 6533, 6533, 6533, 6533, 10, 90, 23655, 15, 600, 17, 12741, 13505), + (12743, 1116, 1116, 1116, 1116, 12, 86, 23656, 4, 2160, 17, 10142, 12744), + (12744, 1116, 1116, 1116, 1116, 12, 88, 23657, 4, 2160, 17, 12743, 12745), + (12745, 1116, 1116, 1116, 1116, 12, 90, 23658, 4, 2160, 17, 12744, 13530), + (12746, 5298, 5298, 5298, 5298, 12, 86, 23659, 32, 1800, 17, 10145, 12747), + (12747, 5298, 5298, 5298, 5298, 12, 88, 23660, 32, 1800, 17, 12746, 12748), + (12748, 5298, 5298, 5298, 5298, 12, 90, 23661, 32, 1800, 17, 12747, 13514), + (12749, 592, 592, 592, 592, 5, 86, 23665, 2, 18, 17, 7437, 12750), + (12750, 592, 592, 592, 592, 5, 88, 23666, 2, 18, 17, 12749, 12751), + (12751, 592, 592, 592, 592, 5, 90, 23667, 2, 18, 17, 12750, 13499), + (12754, 10701, 10701, 10701, 10701, 12, 86, 23668, 32, 360, 17, 10703, 12755), + (12755, 10701, 10701, 10701, 10701, 12, 88, 23669, 32, 360, 17, 12754, 12756), + (12756, 10701, 10701, 10701, 10701, 12, 90, 23670, 32, 360, 17, 12755, 15588), + (12757, -1, -1, 4861, 4861, 12, 86, -1, 0, 0, 17, 7682, 12758), + (12758, -1, -1, 4861, 4861, 12, 88, -1, 0, 0, 17, 12757, 12759), + (12759, -1, -1, 4861, 4861, 12, 90, -1, 0, 0, 17, 12758, -1), + (12760, 1274, 1274, 1274, 1274, 12, 86, 23674, 9, 540, 17, 10211, 12761), + (12761, 1274, 1274, 1274, 1274, 12, 88, 23675, 9, 540, 17, 12760, 12762), + (12762, 1274, 1274, 1274, 1274, 12, 90, 23676, 9, 540, 17, 12761, 14352), + (12766, 12766, 12766, 12766, 12766, 15, 90, 23677, 69, 3600, 17, -1, 13682), + (12767, -1, -1, 692, 692, 12, 86, -1, 0, 0, 17, 7672, 12768), + (12768, -1, -1, 692, 692, 12, 88, -1, 0, 0, 17, 12767, 12769), + (12769, -1, -1, 692, 692, 12, 90, -1, 0, 0, 17, 12768, 17295), + (12770, 12770, 12770, 12770, 12770, 9, 85, 23678, 52, 120, 17, -1, 12771), + (12771, 12770, 12770, 12770, 12770, 12, 87, 23679, 52, 120, 17, 12770, 12772), + (12772, 12770, 12770, 12770, 12770, 15, 89, 23680, 52, 120, 17, 12771, -1), + (12773, -1, -1, 12773, 12773, 7, 86, 0, 0, 0, 17, -1, 12774), + (12774, -1, -1, 12773, 12773, 7, 87, 0, 0, 0, 17, 12773, 12775), + (12775, -1, -1, 12773, 12773, 7, 88, 0, 0, 0, 17, 12774, 12776), + (12776, -1, -1, 12773, 12773, 7, 89, 0, 0, 0, 17, 12775, 12777), + (12777, -1, -1, 12773, 12773, 7, 90, 0, 0, 0, 17, 12776, -1), + (12778, 12778, 12778, 12778, 12778, 12, 90, 23681, 74, 1200, 17, -1, 13678), + (12779, -1, -1, 12779, 12779, 7, 85, 0, 0, 0, 17, -1, 12780), + (12780, -1, -1, 12779, 12779, 9, 87, 0, 0, 0, 17, 12779, 12781), + (12781, -1, -1, 12779, 12779, 12, 89, 0, 0, 0, 17, 12780, -1), + (12782, -1, -1, 12782, 12782, 7, 86, 0, 0, 0, 17, -1, 12783), + (12783, -1, -1, 12782, 12782, 9, 88, 0, 0, 0, 17, 12782, 12784), + (12784, -1, -1, 12782, 12782, 12, 90, 0, 0, 0, 17, 12783, -1), + (12785, 12785, 12785, 12785, 12785, 12, 90, 23683, 80, 30, 17, -1, 17131), + (12786, 6815, 6815, 6815, 6815, 8, 86, 23684, 60, 600, 17, 10202, 12787), + (12787, 6815, 6815, 6815, 6815, 8, 88, 23685, 60, 600, 17, 12786, 12788), + (12788, 6815, 6815, 6815, 6815, 8, 90, 23686, 60, 600, 17, 12787, 14355), + (12789, 967, 967, 967, 967, 7, 85, 23687, 10, 1800, 17, 10226, 12790), + (12790, 967, 967, 967, 967, 7, 87, 23688, 10, 1800, 17, 12789, 12791), + (12791, 967, 967, 967, 967, 7, 89, 23689, 10, 1800, 17, 12790, 17535), + (12792, -1, -1, 9503, 9503, 7, 86, -1, 0, 0, 17, 10089, 12793), + (12793, -1, -1, 9503, 9503, 7, 88, -1, 0, 0, 17, 12792, 12794), + (12794, -1, -1, 9503, 9503, 7, 90, -1, 0, 0, 17, 12793, 5360), + (12795, -1, -1, 6051, 6051, 5, 85, -1, 0, 0, 17, 10606, 12796), + (12796, -1, -1, 6051, 6051, 5, 87, -1, 0, 0, 17, 12795, 12797), + (12797, -1, -1, 6051, 6051, 5, 89, -1, 0, 0, 17, 12796, 13278), + (12798, -1, -1, 5264, 5264, 12, 86, -1, 0, 0, 17, 10217, 12799), + (12799, -1, -1, 5264, 5264, 12, 88, -1, 0, 0, 17, 12798, 12800), + (12800, -1, -1, 5264, 5264, 12, 90, -1, 0, 0, 17, 12799, 13675), + (12801, -1, -1, 6383, 6383, 9, 85, -1, 0, 0, 17, 10609, 12802), + (12802, -1, -1, 6383, 6383, 9, 87, -1, 0, 0, 17, 12801, 12803), + (12803, -1, -1, 6383, 6383, 9, 89, -1, 0, 0, 17, 12802, 5339), + (12804, 12804, 12804, 12804, 12804, 7, 86, 23693, 75, 900, 17, -1, 12805), + (12807, 12807, 12807, 12807, 12807, 7, 86, 23699, 73, 1200, 17, -1, 12808), + (12810, 8227, 8227, 8227, 12810, 5, 85, 27402, 71, 10, 17, 8227, 12811), + (12811, 8227, 8227, 8227, 12810, 7, 87, 27403, 71, 10, 17, 12810, 12812), + (12812, 8227, 8227, 8227, 12810, 9, 89, 27404, 71, 10, 17, 12811, -1), + (12813, -1, -1, 1287, 1287, 5, 75, -1, 0, 0, 17, -1, 12814), + (12814, -1, -1, 1287, 1287, 5, 77, -1, 0, 0, 17, 12813, 12815), + (12815, -1, -1, 1287, 1287, 5, 79, -1, 0, 0, 17, 12814, 14279), + (12816, -1, -1, 12816, 12816, 7, 86, 0, 0, 0, 17, -1, 12817), + (12819, -1, -1, 12819, 12819, 9, 85, 0, 0, 0, 17, -1, 12820), + (12820, -1, -1, 12819, 12819, 12, 87, 0, 0, 0, 17, 12819, 12821), + (12822, -1, -1, 12822, 12822, 9, 86, 0, 0, 0, 17, -1, 12823), + (12828, 291, 291, 291, 12828, 12, 86, 27409, 5, 900, 17, 10304, 12829), + (12831, -1, -1, 12831, 12831, 7, 86, 0, 0, 0, 17, -1, 12832), + (12834, -1, -1, 6980, 6980, 5, 85, -1, 0, 0, 17, 6982, 12835), + (12835, -1, -1, 6980, 6980, 5, 87, -1, 0, 0, 17, 12834, 12836), + (12837, 12837, 12837, 12837, 12837, 7, 86, 27412, 74, 420, 17, -1, 12838), + (12840, -1, -1, 6977, 6977, 5, 85, -1, 0, 0, 17, 6979, 12841), + (12841, -1, -1, 6977, 6977, 5, 87, -1, 0, 0, 17, 12840, 12842), + (12843, -1, -1, 551, 551, 5, 86, -1, 0, 0, 17, 6907, 12844), + (12846, -1, -1, 12846, 12846, 7, 86, 6499, 0, 0, 17, -1, 12847), + (12849, -1, -1, 12849, 12849, 7, 86, 0, 0, 0, 17, -1, 12850), + (12857, 8072, 8072, 8072, 8072, 7, 86, 27419, 37, 20, 17, 10248, 12858), + (12860, -1, -1, 267, 267, 12, 86, -1, 0, 0, 17, 5619, 12861), + (12863, -1, -1, 141, 12863, 12, 59, -1, 0, 0, 17, 143, 15396), + (12864, 12864, -1, 12864, 12864, 5, 59, 27422, 73, 10, 17, -1, 17486), + (12865, 12865, 12865, 12865, 12865, 12, 90, 27423, 42, 6, 17, -1, -1), + (12866, 12866, 12866, 12866, 12866, 12, 86, 27424, 74, 1800, 17, -1, 15605), + (12867, 12867, 12867, 12867, 12867, 12, 86, 27426, 13, 4320, 17, -1, -1), + (12868, 1334, 1334, 1334, 1334, 12, 86, 27427, 11, 4320, 17, 10236, 12869), + (12871, -1, -1, 11050, 11050, 9, 85, -1, 0, 0, 17, 11060, 12872), + (12872, -1, -1, 11050, 11050, 12, 87, -1, 0, 0, 17, 12871, 12873), + (12874, -1, -1, 1414, 1414, 5, 86, -1, 0, 0, 17, 1418, 17490), + (12875, 4938, 4938, 4938, 4938, 12, 90, 27430, 35, 1800, 17, 5614, 13727), + (12876, -1, -1, 12430, 12430, 7, 86, 0, 0, 0, 17, 12477, 12877), + (12877, -1, -1, 12430, 12430, 9, 88, 0, 0, 0, 17, 12876, 12878), + (12878, -1, -1, 12430, 12430, 12, 90, 0, 0, 0, 17, 12877, 15270), + (12879, 516, 516, 516, 516, 6, 86, 27431, 5, 480, 17, 10233, 13659), + (12880, 1404, 1404, 1404, 1404, 7, 85, 27432, 15, 2160, 17, 1408, -1), + (12881, -1, -1, 12881, 12881, 9, 86, 0, 0, 0, 17, -1, 12882), + (12885, 12885, 12885, 12885, 12885, 12, 86, 27435, 75, 90, 17, -1, 17491), + (12886, -1, -1, 12886, 12886, 2, 85, -1, 0, 0, 17, -1, -1), + (12887, -1, -1, 12887, 12887, 2, 87, -1, 0, 0, 17, -1, -1), + (12888, -1, -1, 12888, 12888, 2, 89, -1, 0, 0, 17, -1, -1), + (12889, -1, -1, 12889, 12889, 2, 85, -1, 0, 0, 17, -1, 12890), + (12890, -1, -1, 12889, 12889, 2, 87, -1, 0, 0, 17, 12889, 12891), + (12892, 12892, 12892, 12892, 12892, 3, 90, 27434, 8, 60, 17, -1, 13666), + (12893, 12893, 12893, 12893, 12893, 12, 90, 27436, 76, 1800, 17, -1, 13663), + (12894, -1, -1, 12894, 12894, 5, 86, 0, 0, 0, 17, -1, 12895), + (12899, -1, -1, 471, 471, 2, 85, -1, 0, 0, 17, 473, 12900), + (12900, -1, -1, 471, 471, 2, 87, -1, 0, 0, 17, 12899, 12901), + (12902, -1, -1, 12902, 12902, 5, 85, 0, 0, 0, 17, -1, 12903), + (12903, -1, -1, 12902, 12902, 5, 86, 0, 0, 0, 17, 12902, 12904), + (12907, -1, -1, 12907, 12907, 5, 85, 0, 0, 0, 17, -1, 12908), + (12908, -1, -1, 12907, 12907, 5, 86, 0, 0, 0, 17, 12907, 12909), + (12912, -1, -1, 12912, 12912, 5, 85, 0, 0, 0, 17, -1, 12913), + (12913, -1, -1, 12912, 12912, 5, 86, 0, 0, 0, 17, 12912, 12914), + (12917, 517, 517, 517, 517, 5, 85, 27437, 12, 600, 17, 10281, 12918), + (12918, 517, 517, 517, 517, 5, 87, 27438, 12, 600, 17, 12917, 12919), + (12920, -1, -1, 12920, 12920, 5, 86, 0, 0, 0, 17, -1, 12921), + (12923, 54009, 54009, 54009, 12923, 3, 85, 27440, 22, 12, 17, 5849, 12924), + (12924, 54009, 54009, 54009, 12923, 3, 87, 27441, 22, 12, 17, 12923, 12925), + (12929, -1, -1, 6548, 6548, 8, 85, -1, 0, 0, 17, 6238, 12930), + (12930, -1, -1, 6548, 6548, 8, 90, -1, 0, 0, 17, 12929, 15463), + (12931, 12931, 12931, 12931, 12931, 7, 86, 27443, 73, 3600, 17, -1, 12932), + (12934, 1242, 1242, 1242, 1242, 12, 86, 27446, 9, 1320, 17, 10273, 12935), + (12937, 12937, 12937, 12937, 12937, 12, 86, 27449, 16, 420, 17, -1, 13733), + (12938, 12938, 12938, 12938, 12938, 15, 88, 27450, 75, 2700, 17, -1, 13743), + (12939, 12939, 12939, 12939, 12939, 12, 90, 27451, 77, 1800, 17, -1, 14756), + (12941, 12941, 12941, 12941, 12941, 5, 85, 27453, 77, 1, 17, -1, -1), + (12942, 6539, 6539, 6539, 6539, 6, 86, 27454, 18, 1800, 17, 7611, 12943), + (12943, 6539, 6539, 6539, 6539, 6, 88, 27455, 18, 1800, 17, 12942, 12944), + (12944, 6539, 6539, 6539, 6539, 6, 90, 27456, 18, 1800, 17, 12943, 13291), + (12945, -1, -1, 795, 795, 12, 85, -1, 0, 0, 17, 10267, 12946), + (12946, -1, -1, 795, 795, 12, 86, -1, 0, 0, 17, 12945, 12947), + (12947, -1, -1, 795, 795, 12, 87, -1, 0, 0, 17, 12946, 12948), + (12948, -1, -1, 795, 795, 12, 88, -1, 0, 0, 17, 12947, 12949), + (12949, -1, -1, 795, 795, 12, 89, -1, 0, 0, 17, 12948, 13710), + (12950, -1, -1, 790, 790, 6, 86, -1, 0, 0, 17, 7274, 12951), + (12951, -1, -1, 790, 790, 6, 87, -1, 0, 0, 17, 12950, 12952), + (12952, -1, -1, 790, 790, 6, 88, -1, 0, 0, 17, 12951, 12953), + (12953, -1, -1, 790, 790, 6, 89, -1, 0, 0, 17, 12952, 12954), + (12954, -1, -1, 790, 790, 6, 90, -1, 0, 0, 17, 12953, 13713), + (12955, 167, 167, 167, 167, 10, 86, 27457, 14, 900, 17, 8343, 13718), + (12956, 4903, 4903, 4903, 4903, 9, 85, 27460, 9, 1320, 17, 10255, 13698), + (12957, 4909, 4909, 4909, 4909, 9, 85, 27461, 16, 1320, 17, 10257, 14733), + (12958, 4912, 4912, 4912, 4912, 9, 85, 27459, 16, 1320, 17, 10258, 13704), + (12959, 4906, 4906, 4906, 4906, 9, 85, 27458, 9, 1320, 17, 10256, 13701), + (12963, 12963, 12963, 12963, 12963, 7, 86, 27465, 81, 5, 17, -1, -1), + (12964, 12964, 12964, 12964, 12964, 7, 88, 27466, 81, 5, 17, -1, -1), + (12965, 12965, 12965, 12965, 12965, 7, 90, 27467, 81, 5, 17, -1, -1), + (12966, -1, -1, 6112, 6112, 5, 87, -1, 0, 0, 17, 6112, 12967), + (12967, -1, -1, 6112, 6112, 5, 89, -1, 0, 0, 17, 12966, 16402), + (12968, -1, -1, 12968, 12968, 7, 85, 0, 0, 0, 17, -1, 12969), + (12969, -1, -1, 12968, 12968, 7, 87, 0, 0, 0, 17, 12968, 12970), + (12970, -1, -1, 12968, 12968, 7, 89, 0, 0, 0, 17, 12969, 14238), + (12971, 12971, 12971, 12971, 12971, 5, 86, 27471, 79, 2160, 17, -1, 12972), + (12972, 12971, 12971, 12971, 12971, 7, 87, 27472, 79, 2160, 17, 12971, 12973), + (12973, 12971, 12971, 12971, 12971, 9, 88, 27473, 79, 2160, 17, 12972, 12974), + (12974, 12971, 12971, 12971, 12971, 12, 89, 27474, 79, 2160, 17, 12973, 12975), + (12975, 12971, 12971, 12971, 12971, 15, 90, 27475, 79, 2160, 17, 12974, -1), + (12976, 7903, 7903, 7903, 7903, 6, 85, 27476, 60, 30, 17, 7903, 14734), + (12977, -1, -1, 12977, 12977, 5, 85, 0, 0, 0, 17, -1, 12978), + (12978, -1, -1, 12977, 12977, 5, 86, 0, 0, 0, 17, 12977, 12979), + (12979, -1, -1, 12977, 12977, 5, 87, 0, 0, 0, 17, 12978, 12980), + (12980, -1, -1, 12977, 12977, 5, 88, 0, 0, 0, 17, 12979, 12981), + (12981, -1, -1, 12977, 12977, 5, 89, 0, 0, 0, 17, 12980, 17334), + (12982, 10600, 10600, 10600, 10600, 7, 86, 27477, 73, 20, 17, 10602, 12983), + (12983, 10600, 10600, 10600, 10600, 7, 88, 27478, 73, 20, 17, 12982, 12984), + (12984, 10600, 10600, 10600, 10600, 7, 90, 27479, 73, 20, 17, 12983, 13720), + (12985, 520, 520, 520, 520, 12, 86, 27480, 6, 540, 17, 10254, 12986), + (12986, 520, 520, 520, 520, 12, 88, 27481, 6, 540, 17, 12985, 12987), + (12987, 520, 520, 520, 520, 12, 90, 27482, 6, 540, 17, 12986, -1), + (12988, -1, -1, 10959, 12988, 12, 90, -1, 0, 0, 17, 10962, -1), + (12989, 12989, 12989, 12989, 12989, 7, 86, 27486, 73, 1800, 17, -1, 12990), + (12990, 12989, 12989, 12989, 12989, 9, 88, 27487, 73, 1800, 17, 12989, 12991), + (12991, 12989, 12989, 12989, 12989, 12, 90, 27488, 73, 1800, 17, 12990, 5336), + (12992, 12992, 12992, 12992, 12992, 9, 86, 27489, 0, 1, 17, -1, 12993), + (12993, 12992, 12992, 12992, 12992, 12, 88, 27490, 0, 1, 17, 12992, 12994), + (12994, 12992, 12992, 12992, 12992, 15, 90, 27491, 0, 1, 17, 12993, 5350), + (12995, 6563, 6563, 6563, 6563, 12, 86, 27492, 36, 8, 17, 6281, -1), + (12996, 153, 153, 153, 153, 12, 90, 27493, 3, 2160, 17, 11081, 17333), + (12997, 1520, 1520, 1520, 1520, 9, 85, 27494, 11, 900, 17, 10192, 12998), + (12998, 1520, 1520, 1520, 1520, 9, 87, 27495, 11, 900, 17, 12997, 12999), + (12999, 1520, 1520, 1520, 1520, 9, 89, 27496, 11, 900, 17, 12998, 5333), + (13000, 10958, 10958, 10958, 10958, 15, 90, 27497, 62, 900, 17, 10958, 16214), + (13001, -1, -1, 13001, 13001, 7, 86, -1, 0, 0, 17, -1, 13002), + (13002, -1, -1, 13001, 13001, 7, 88, -1, 0, 0, 17, 13001, 13003), + (13003, -1, -1, 13001, 13001, 7, 90, -1, 0, 0, 17, 13002, 15348), + (13004, 13004, 13004, 13004, 13004, 9, 86, 27499, 78, 300, 17, -1, 15855), + (13005, -1, -1, 6703, 6703, 3, 86, -1, 0, 0, 17, 10178, 13006), + (13006, -1, -1, 6703, 6703, 3, 88, -1, 0, 0, 17, 13005, 13007), + (13007, -1, -1, 6703, 6703, 3, 90, -1, 0, 0, 17, 13006, -1), + (13008, 13008, 13008, 13008, 13008, 9, 90, 27500, 86, 300, 17, -1, -1), + (13009, 13009, 13009, 13009, 13009, 6, 86, 27501, 39, 1, 17, -1, -1), + (13010, -1, -1, 13010, 13010, 6, 85, 0, 0, 0, 17, -1, 13011), + (13011, -1, -1, 13010, 13010, 6, 87, 0, 0, 0, 17, 13010, 13012), + (13012, -1, -1, 13010, 13010, 6, 89, 0, 0, 0, 17, 13011, 14223), + (13013, -1, -1, 13013, 13013, 6, 86, 0, 0, 0, 17, -1, 13014), + (13014, -1, -1, 13013, 13013, 6, 88, 0, 0, 0, 17, 13013, 13015), + (13015, -1, -1, 13013, 13013, 6, 90, 0, 0, 0, 17, 13014, -1), + (13016, 5109, 5109, 5109, 5109, 9, 86, 27502, 0, 1, 17, 7467, 5356), + (13017, -1, -1, 13017, 13017, 9, 86, -1, 0, 0, 17, -1, 13018), + (13018, -1, -1, 13017, 13017, 12, 88, -1, 0, 0, 17, 13017, 13019), + (13019, -1, -1, 13017, 13017, 15, 90, -1, 0, 0, 17, 13018, 13396), + (13020, 13020, 13020, 13020, 13020, 12, 86, 27503, 76, 420, 17, -1, -1), + (13021, -1, -1, 11085, 11085, 12, 86, 0, 0, 0, 17, 11087, 13022), + (13023, -1, -1, 1050, 1050, 12, 86, -1, 0, 0, 17, 7658, 13024), + (13026, -1, -1, 599, 599, 12, 86, -1, 0, 0, 17, 7561, 13027), + (13027, -1, -1, 599, 599, 12, 88, -1, 0, 0, 17, 13026, 13028), + (13028, -1, -1, 599, 599, 12, 90, -1, 0, 0, 17, 13027, 13438), + (13029, -1, -1, 7818, 7818, 9, 86, 31681, 0, 0, 17, 7818, 13030), + (13032, -1, -1, 1131, 1131, 9, 85, -1, 0, 0, 17, 11084, 13033), + (13033, -1, -1, 1131, 1131, 12, 87, -1, 0, 0, 17, 13032, 13034), + (13035, -1, -1, 1134, 1134, 3, 86, -1, 0, 0, 17, 10315, 13036), + (13040, -1, -1, 4809, 4809, 5, 86, -1, 0, 0, 17, 10318, 13041), + (13043, -1, -1, 5776, 5776, 9, 86, -1, 0, 0, 17, 7198, 13044), + (13046, -1, -1, 8250, 8250, 6, 85, -1, 0, 0, 17, 8254, 13047), + (13047, -1, -1, 8250, 8250, 6, 86, -1, 0, 0, 17, 13046, 13048), + (13048, -1, -1, 8250, 8250, 6, 87, -1, 0, 0, 17, 13047, 13049), + (13049, -1, -1, 8250, 8250, 6, 88, -1, 0, 0, 17, 13048, 13050), + (13050, -1, -1, 8250, 8250, 6, 89, -1, 0, 0, 17, 13049, 13348), + (13051, -1, -1, 10404, 10404, 6, 90, -1, 0, 0, 17, 10404, -1), + (13052, -1, -1, 10401, 10401, 6, 86, -1, 0, 0, 17, 10403, 13053), + (13055, -1, -1, 13055, 13055, 6, 86, 0, 0, 0, 17, -1, 13056), + (13058, 6931, 6931, 6931, 6931, 12, 90, 27504, 41, 600, 17, 10319, 13857), + (13059, 4854, 4854, 4854, 4854, 9, 86, 27505, 8, 600, 17, 10325, 13060), + (13062, 6932, 6932, 6932, 6932, 7, 86, 27508, 42, 1200, 17, 10322, 13063), + (13065, 13065, 13065, 13065, 13065, 12, 86, 27514, 70, 90, 17, -1, -1), + (13066, 13066, 13066, 13066, 13066, 9, 85, 27516, 71, 1800, 17, -1, -1), + (13067, -1, -1, 13067, 13067, 6, 86, 0, 0, 0, 17, -1, 13068), + (13072, -1, -1, 12600, 12600, 7, 87, 0, 0, 0, 17, 12600, 13073), + (13073, -1, -1, 12600, 12600, 7, 89, 0, 0, 0, 17, 13072, 13222), + (13074, -1, -1, 1044, 1044, 9, 86, -1, 0, 0, 17, 7652, 13075), + (13075, -1, -1, 1044, 1044, 12, 88, -1, 0, 0, 17, 13074, 13076), + (13076, -1, -1, 1044, 1044, 15, 90, -1, 0, 0, 17, 13075, 13326), + (13077, -1, -1, 1047, 1047, 9, 86, -1, 0, 0, 17, 7655, 13078), + (13078, -1, -1, 1047, 1047, 12, 88, -1, 0, 0, 17, 13077, 13079), + (13080, -1, -1, 125, 125, 9, 86, -1, 0, 0, 17, 12400, 13081), + (13081, -1, -1, 125, 125, 10, 87, -1, 0, 0, 17, 13080, 13082), + (13082, -1, -1, 125, 125, 11, 88, -1, 0, 0, 17, 13081, 13083), + (13083, -1, -1, 125, 125, 12, 89, -1, 0, 0, 17, 13082, 13084), + (13084, -1, -1, 125, 125, 13, 90, -1, 0, 0, 17, 13083, 8463), + (13085, -1, -1, 122, 122, 9, 86, -1, 0, 0, 17, 12405, 13086), + (13086, -1, -1, 122, 122, 10, 87, -1, 0, 0, 17, 13085, 13087), + (13087, -1, -1, 122, 122, 11, 88, -1, 0, 0, 17, 13086, 13088), + (13088, -1, -1, 122, 122, 12, 89, -1, 0, 0, 17, 13087, 13089), + (13089, -1, -1, 122, 122, 13, 90, -1, 0, 0, 17, 13088, 8440), + (13090, -1, -1, 1435, 4773, 9, 86, -1, 0, 0, 17, 7621, 13295), + (13091, -1, -1, 1435, 4773, 9, 86, -1, 0, 0, 17, 1650, 13294), + (13092, -1, -1, 644, 644, 9, 85, -1, 0, 0, 17, 7361, 13093), + (13093, -1, -1, 644, 644, 12, 87, -1, 0, 0, 17, 13092, 13094), + (13094, -1, -1, 644, 644, 15, 89, -1, 0, 0, 17, 13093, 13265), + (13095, -1, -1, 1604, 1604, 15, 89, -1, 0, 0, 17, 12613, 13767), + (13096, -1, -1, 13096, 13096, 12, 86, -1, 0, 0, 17, -1, 13097), + (13097, -1, -1, 13096, 13096, 12, 88, -1, 0, 0, 17, 13096, 13098), + (13098, -1, -1, 13096, 13096, 12, 90, -1, 0, 0, 17, 13097, 13127), + (13099, -1, -1, 83, 83, 9, 55, -1, 0, 0, 17, 85, -1), + (13100, 13100, 13100, 13100, 13100, 9, 86, 27534, 86, 300, 17, -1, 15140), + (13101, -1, -1, 13101, 13101, 7, 86, 0, 0, 0, 17, -1, 13102), + (13102, -1, -1, 13101, 13101, 9, 88, 0, 0, 0, 17, 13101, 13103), + (13103, -1, -1, 13101, 13101, 12, 90, 0, 0, 0, 17, 13102, 14082), + (13104, -1, -1, 589, 589, 9, 86, -1, 0, 0, 17, 7709, 13105), + (13105, -1, -1, 589, 589, 9, 88, -1, 0, 0, 17, 13104, 13106), + (13106, -1, -1, 589, 589, 9, 90, -1, 0, 0, 17, 13105, 15778), + (13107, 6645, 6645, 6645, 6645, 9, 90, 27541, 45, 60, 17, 6645, 13633), + (13108, 13108, 13108, 13108, 13108, 5, 90, 27542, 89, 30, 17, -1, -1), + (13109, 1351, 1351, 1351, 1351, 8, 90, 27543, 5, 30, 17, 7109, -1), + (13110, 10815, 10815, 10815, 10815, 9, 86, -1, 0, 0, 17, 10817, 13111), + (13111, 10815, 10815, 10815, 10815, 11, 88, -1, 0, 0, 17, 13110, 13112), + (13113, 10818, 10818, 10818, 10818, 9, 86, -1, 0, 0, 17, 10820, 13114), + (13114, 10818, 10818, 10818, 10818, 11, 88, -1, 0, 0, 17, 13113, 13115), + (13116, 10821, 10821, 10821, 10821, 9, 86, -1, 0, 0, 17, 10823, 13117), + (13117, 10821, 10821, 10821, 10821, 11, 88, -1, 0, 0, 17, 13116, 13118), + (13119, 5007, 5007, 5007, 5007, 9, 86, 27544, 8, 2160, 17, 10063, 13120), + (13120, 5007, 5007, 5007, 5007, 9, 88, 27545, 8, 2160, 17, 13119, 13121), + (13122, -1, -1, 6546, 6546, 0, 86, -1, 0, 0, 17, 7377, 13123), + (13123, -1, -1, 6546, 6546, 0, 87, -1, 0, 0, 17, 13122, 13124), + (13124, -1, -1, 6546, 6546, 0, 88, -1, 0, 0, 17, 13123, 13125), + (13127, -1, -1, 13096, 13096, 12, 91, -1, 0, 0, 18, 13098, 13128), + (13130, 13130, 13130, 13130, 13130, 15, 95, 32440, 48, 30, 18, -1, -1), + (13133, 7756, 7756, 7756, 7756, 12, 85, 21805, 85, 120, 17, -1, -1), + (13134, 13134, 13134, 13134, 13134, 7, 86, 27547, 74, 900, 17, -1, 13135), + (13135, 13134, 13134, 13134, 13134, 7, 88, 27548, 74, 900, 17, 13134, 13136), + (13136, 13134, 13134, 13134, 13134, 7, 90, 27549, 74, 900, 17, 13135, 13380), + (13140, -1, -1, 10464, 10464, 7, 86, -1, 0, 0, 17, 10466, 13141), + (13141, -1, -1, 10464, 10464, 9, 88, -1, 0, 0, 17, 13140, 13142), + (13142, -1, -1, 10464, 10464, 11, 90, -1, 0, 0, 17, 13141, -1), + (13143, -1, -1, 13143, 13143, 5, 86, 0, 0, 0, 17, -1, 13144), + (13144, -1, -1, 13143, 13143, 5, 88, 0, 0, 0, 17, 13143, 13145), + (13145, -1, -1, 13143, 13143, 5, 90, 0, 0, 0, 17, 13144, -1), + (13146, -1, -1, 13146, 13146, 5, 86, 0, 0, 0, 17, -1, 13147), + (13147, -1, -1, 13146, 13146, 5, 88, 0, 0, 0, 17, 13146, 13148), + (13148, -1, -1, 13146, 13146, 5, 90, 0, 0, 0, 17, 13147, -1), + (13149, -1, -1, 8210, 8210, 5, 86, -1, 0, 0, 17, 1655, 13150), + (13150, -1, -1, 8210, 8210, 5, 87, -1, 0, 0, 17, 13149, 13151), + (13151, -1, -1, 8210, 8210, 5, 88, -1, 0, 0, 17, 13150, 13152), + (13152, -1, -1, 8210, 8210, 5, 89, -1, 0, 0, 17, 13151, 13153), + (13153, -1, -1, 8210, 8210, 5, 90, -1, 0, 0, 17, 13152, 13318), + (13154, 5105, 5105, 5105, 5105, 12, 90, 27550, 11, 600, 17, 10509, 14023), + (13155, 7986, 7986, 7986, 7986, 12, 90, 27551, 11, 600, 17, 10510, 14022), + (13158, 548, 548, 548, 548, 10, 86, 27552, 5, 900, 17, 10098, 13159), + (13161, 528, 528, 528, 528, 12, 86, 27555, 5, 720, 17, 10196, 13162), + (13162, 528, 528, 528, 528, 12, 88, 27556, 5, 720, 17, 13161, 13163), + (13163, 528, 528, 528, 528, 12, 90, 27557, 5, 720, 17, 13162, 5357), + (13164, 13164, 13164, 13164, 13164, 9, 86, 27540, 99, 180, 17, -1, -1), + (13165, 13165, 13165, 13165, 13165, 9, 86, 27559, 56, 60, 17, -1, -1), + (13166, -1, -1, 13166, 13166, 7, 86, 0, 0, 0, 17, -1, 13167), + (13167, -1, -1, 13166, 13166, 7, 88, 0, 0, 0, 17, 13166, 13168), + (13168, -1, -1, 13166, 13166, 7, 90, 0, 0, 0, 17, 13167, -1), + (13169, 13169, 13169, 13169, 13169, 9, 90, 27560, 99, 180, 17, -1, 17221), + (13170, 6380, 6380, 6380, 6380, 6, 86, 27561, 39, 120, 17, 10310, 13171), + (13173, 290, 290, 290, 290, 8, 86, 27564, 4, 720, 17, 290, 13448), + (13174, 10374, 10374, 10374, 10374, 6, 85, 27565, 63, 900, 17, 10376, 13175), + (13175, 10374, 10374, 10374, 10374, 8, 87, 27566, 63, 900, 17, 13174, 13176), + (13177, 6984, 6984, 6984, 6984, 6, 83, 27568, 60, 60, 17, 10294, 13466), + (13178, 6986, 6986, 6986, 6986, 6, 83, 27570, 60, 60, 17, 10296, 13468), + (13179, 6985, 6985, 6985, 6985, 6, 83, 27569, 60, 60, 17, 10295, 13467), + (13180, 10377, 10377, 10377, 10377, 6, 86, 16796, 64, 60, 17, 10379, 13181), + (13183, 10346, 10346, 10346, 10346, 9, 90, 27574, 46, 600, 17, 10346, 13819), + (13184, -1, -1, 10340, 10340, 9, 86, -1, 0, 0, 17, 10342, 13185), + (13185, -1, -1, 10340, 10340, 9, 88, -1, 0, 0, 17, 13184, 13186), + (13186, -1, -1, 10340, 10340, 9, 90, -1, 0, 0, 17, 13185, 13829), + (13187, -1, -1, 9512, 9512, 7, 86, -1, 0, 0, 17, 7883, 13188), + (13188, -1, -1, 9512, 9512, 7, 88, -1, 0, 0, 17, 13187, 13189), + (13189, -1, -1, 9512, 9512, 7, 90, -1, 0, 0, 17, 13188, 13826), + (13190, 1110, 1110, 1110, 1110, 6, 86, 27576, 3, 2160, 17, 10152, 13191), + (13191, 1110, 1110, 1110, 1110, 6, 88, 27577, 3, 2160, 17, 13190, 13192), + (13192, 1110, 1110, 1110, 1110, 6, 90, 27578, 3, 2160, 17, 13191, 13496), + (13193, 1598, -1, 1598, 1598, 9, 86, 27582, 6, 900, 17, 10148, 13194), + (13194, 1598, -1, 1598, 1598, 11, 88, 27583, 6, 900, 17, 13193, 13195), + (13195, 1598, -1, 1598, 1598, 13, 90, 27584, 6, 900, 17, 13194, 13493), + (13196, -1, -1, 255, 255, 9, 86, -1, 0, 0, 17, 10135, 13197), + (13197, -1, -1, 255, 255, 9, 88, -1, 0, 0, 17, 13196, 13198), + (13198, -1, -1, 255, 255, 9, 90, -1, 0, 0, 17, 13197, 13511), + (13199, -1, -1, 8322, 8322, 9, 86, 0, 0, 0, 17, 8324, 13200), + (13200, -1, -1, 8322, 8322, 9, 88, 0, 0, 0, 17, 13199, 13201), + (13201, -1, -1, 8322, 8322, 9, 90, 0, 0, 0, 17, 13200, -1), + (13202, 13202, 13202, 13202, 13202, 2, 81, 27585, 98, 20, 17, -1, 14009), + (13203, 10330, 10330, 10330, 10330, 7, 90, 27586, 35, 30, 17, 10330, 13492), + (13204, -1, -1, 13204, 13204, 7, 86, -1, 0, 0, 17, -1, 13205), + (13205, -1, -1, 13204, 13204, 7, 88, -1, 0, 0, 17, 13204, 13206), + (13206, -1, -1, 13204, 13204, 7, 90, -1, 0, 0, 17, 13205, 14176), + (13207, -1, -1, 10850, 10850, 9, 86, 27587, 0, 0, 17, 10852, 13208), + (13208, -1, -1, 10850, 10850, 9, 88, 27588, 0, 0, 17, 13207, 13209), + (13209, -1, -1, 10850, 10850, 9, 90, 27589, 0, 0, 17, 13208, 13779), + (13210, -1, -1, 1307, 1307, 5, 81, -1, 0, 0, 17, 6662, 13211), + (13211, -1, -1, 1307, 1307, 5, 83, -1, 0, 0, 17, 13210, 13212), + (13212, -1, -1, 1307, 1307, 5, 85, -1, 0, 0, 17, 13211, -1), + (13213, -1, -1, 1543, 1543, 7, 86, -1, 0, 0, 17, 10167, 13214), + (13214, -1, -1, 1543, 1543, 7, 87, -1, 0, 0, 17, 13213, 13215), + (13215, -1, -1, 1543, 1543, 7, 88, -1, 0, 0, 17, 13214, 13216), + (13216, -1, -1, 1543, 1543, 7, 89, -1, 0, 0, 17, 13215, 13217), + (13217, -1, -1, 1543, 1543, 7, 90, -1, 0, 0, 17, 13216, 13782), + (13218, -1, -1, 1304, 1304, 12, 90, -1, 0, 0, 17, 10867, 13789), + (13219, -1, -1, 8325, 8325, 7, 85, 0, 0, 0, 17, 8327, 13220), + (13220, -1, -1, 8325, 8325, 9, 87, 0, 0, 0, 17, 13219, 13221), + (13221, -1, -1, 8325, 8325, 11, 89, 0, 0, 0, 17, 13220, 13798), + (13222, -1, -1, 12600, 12600, 7, 89, 0, 0, 0, 17, 13073, 13223), + (13223, -1, -1, 12600, 12600, 7, 89, 0, 0, 0, 17, 13222, -1), + (13224, 13224, -1, 13224, 13224, 3, 86, 27590, 98, 1, 17, -1, 15559), + (13225, 13225, 13225, 13225, 13225, 6, 86, 27592, 0, 4, 17, -1, 13688), + (13226, -1, -1, 5295, 5295, 6, 86, -1, 0, 0, 17, 10229, 13227), + (13229, 6290, 6290, 6290, 6290, 9, 86, 27596, 0, 1, 17, 11066, 13230), + (13232, 4944, -1, 4944, 4944, 9, 86, 27602, 0, 1, 17, 11069, 13233), + (13235, 1478, -1, 1478, 1478, 9, 86, 27608, 0, 1, 17, 11072, 13236), + (13238, -1, -1, 1287, 1287, 9, 86, -1, 0, 0, 17, 12474, 13239), + (13239, -1, -1, 1287, 1287, 10, 88, -1, 0, 0, 17, 13238, 13240), + (13240, -1, -1, 1287, 1287, 11, 90, -1, 0, 0, 17, 13239, 15719), + (13241, 4931, 4931, 4931, 4931, 7, 86, 27614, 4, 600, 17, 10430, 13242), + (13244, 1501, 1501, 1501, 1501, 6, 86, 27617, 10, 4320, 17, 1560, 13245), + (13247, 4894, 4894, 4894, 4894, 6, 86, 27620, 7, 2160, 17, 7290, 13248), + (13250, 10550, 10550, 10550, 10550, 7, 90, 27626, 61, 120, 17, 10550, 13728), + (13251, 1239, 1239, 1239, 1239, 9, 90, 27627, 6, 600, 17, 7275, 13732), + (13252, 13252, 13252, 13252, 13252, 9, 86, 27629, 95, 4, 17, -1, 16065), + (13253, 1126, 1126, 1126, 1126, 7, 85, 27630, 2, 2160, 17, 5515, 13254), + (13254, 1126, 1126, 1126, 1126, 7, 87, 27631, 2, 2160, 17, 13253, 13255), + (13255, 1126, 1126, 1126, 1126, 7, 89, 27632, 2, 2160, 17, 13254, 13723), + (13256, 146, 146, 146, 146, 8, 86, 27633, 2, 180, 17, 7691, 13257), + (13257, 146, 146, 146, 146, 8, 88, 27634, 2, 180, 17, 13256, 13258), + (13258, 146, 146, 146, 146, 8, 90, 27635, 2, 180, 17, 13257, 14222), + (13259, 1195, 1195, 1195, 1195, 9, 90, 27661, 13, 2160, 17, 10015, 15334), + (13260, 13260, 13260, 13260, 13260, 0, 80, 27664, 98, 3600, 17, -1, -1), + (13261, 13261, 13261, 13261, 13261, 0, 81, 27665, 98, 28800, 17, -1, -1), + (13262, -1, -1, 498, 498, 5, 70, -1, 0, 0, 16, 975, 13263), + (13263, -1, -1, 498, 498, 5, 75, -1, 0, 0, 16, 13262, 13264), + (13264, -1, -1, 498, 498, 5, 80, -1, 0, 0, 16, 13263, -1), + (13271, 13271, 13271, 13271, 13271, 0, 80, 27691, 97, 3600, 18, -1, -1), + (13272, 13272, 13272, 13272, 13272, 0, 81, 27692, 97, 28800, 18, -1, -1), + (13275, 6537, 6537, 6537, 6537, 10, 91, 30638, 30, 900, 18, 12522, 13276), + (13278, -1, -1, 6051, 6051, 10, 91, -1, 0, 0, 18, 12797, 13279), + (13281, -1, -1, 1072, 1072, 12, 91, -1, 0, 0, 18, 12541, 13282), + (13286, -1, -1, 119, 119, 12, 91, -1, 0, 0, 18, 12552, 13287), + (13291, 6539, 6539, 6539, 6539, 9, 91, 30641, 18, 1800, 18, 12944, 13292), + (13294, -1, -1, 1435, 4773, 12, 91, -1, 0, 0, 18, 13091, 14490), + (13295, -1, -1, 1435, 4773, 12, 91, -1, 0, 0, 18, 13090, 14491), + (13296, -1, -1, 77, 77, 12, 91, -1, 0, 0, 18, 12499, 13297), + (13297, -1, -1, 77, 77, 12, 93, -1, 0, 0, 18, 13296, 13298), + (13299, -1, -1, 1186, 1186, 12, 91, -1, 0, 0, 18, 12566, 13300), + (13302, -1, -1, 80, 80, 12, 91, -1, 0, 0, 18, 12569, 13303), + (13305, -1, -1, 683, 683, 10, 91, -1, 0, 0, 18, 12696, 13306), + (13308, -1, -1, 446, 735, 10, 91, -1, 0, 0, 18, 10477, 13309), + (13313, -1, -1, 658, 658, 8, 91, -1, 0, 0, 18, 12574, 13314), + (13318, -1, -1, 8210, 8210, 10, 91, -1, 0, 0, 18, 13153, 13319), + (13323, -1, -1, 1287, 1287, 12, 91, -1, 0, 0, 18, 10639, 13324), + (13326, -1, -1, 1044, 1044, 10, 91, -1, 0, 0, 18, 13076, 13327), + (13332, -1, -1, 1041, 1041, 11, 91, -1, 0, 0, 18, 12699, 13333), + (13338, -1, -1, 8245, 8245, 11, 91, -1, 0, 0, 18, 8426, 13339), + (13343, -1, -1, 8240, 8240, 11, 91, -1, 0, 0, 18, 10785, 13344), + (13348, -1, -1, 8250, 8250, 11, 91, -1, 0, 0, 18, 13050, 13349), + (13353, -1, -1, 8235, 8235, 11, 91, -1, 0, 0, 18, 8308, 13354), + (13358, -1, -1, 8255, 8255, 11, 91, -1, 0, 0, 18, 12415, 13359), + (13363, 1192, 1192, 1192, 1192, 9, 91, 30645, 12, 1320, 18, 10021, 13364), + (13383, 6488, 6488, 6488, 6488, 15, 91, 30657, 32, 900, 18, 6488, 13384), + (13385, 13385, 13385, 13385, 13385, 12, 91, 30659, 75, 600, 18, -1, 13386), + (13388, 13388, 13388, 13388, 13388, 12, 91, 30665, 79, 180, 18, -1, -1), + (13389, 13389, -1, 13389, 13389, 5, 91, 30666, 77, 12, 18, -1, 15832), + (13396, -1, -1, 13017, 13017, 15, 91, -1, 0, 0, 18, 13019, 13397), + (13401, 1498, 1498, 1498, 1498, 15, 91, 30679, 12, 1320, 18, 10092, 13402), + (13404, -1, -1, 1514, 1514, 11, 91, -1, 0, 0, 18, 1516, 13405), + (13410, 645, -1, 645, 645, 15, 95, 30682, 4, 5, 18, 10739, -1), + (13411, -1, -1, 12652, 12652, 15, 92, 0, 0, 0, 18, 12654, 13412), + (13413, -1, -1, 12416, 12416, 15, 91, -1, 0, 0, 18, 12418, 13414), + (13415, -1, -1, 7989, 7989, 9, 95, -1, 0, 0, 18, 7992, -1), + (13416, -1, -1, 13416, 13416, 9, 91, 0, 0, 0, 18, -1, 13417), + (13419, 13419, 13419, 13419, 13419, 12, 91, 30683, 99, 600, 18, -1, 13420), + (13425, 54006, 54006, 54006, 54006, 9, 91, 30692, 18, 180, 18, 10006, 13426), + (13438, -1, -1, 599, 599, 13, 91, -1, 0, 0, 18, 13028, 13439), + (13444, 13444, 13444, 13444, 13444, 9, 91, 30699, 75, 600, 18, -1, 13445), + (13447, 11073, 11073, 11073, 11073, 12, 95, 30705, 53, 30, 18, 11073, 15412), + (13449, -1, -1, 13449, 13449, 5, 91, -1, 0, 0, 18, -1, 13450), + (13454, 718, 718, 718, 718, 12, 91, 30711, 7, 4320, 18, 1019, 14855), + (13463, -1, -1, 13463, 13463, 7, 91, -1, 0, 0, 18, -1, 13464), + (13466, 6984, 6984, 6984, 6984, 9, 91, 30721, 60, 60, 18, 13177, 13469), + (13467, 6985, 6985, 6985, 6985, 9, 91, 30723, 60, 60, 18, 13179, 13470), + (13468, 6986, 6986, 6986, 6986, 12, 92, 30725, 60, 60, 18, 13178, 13471), + (13472, 11080, 11080, 11080, 11080, 11, 91, 30727, 10, 20, 18, 11080, 13473), + (13474, -1, -1, 13474, 13474, 9, 91, -1, 0, 0, 18, -1, 13475), + (13477, -1, -1, 10380, 10380, 11, 91, -1, 0, 0, 18, 10382, 13478), + (13483, 13483, 13483, 13483, 13483, 5, 91, 30735, 68, 20, 18, -1, -1), + (13484, 13484, -1, 13484, 13484, 12, 95, 30736, 76, 720, 18, -1, 15879), + (13485, -1, -1, 13485, 13485, 7, 91, -1, 0, 0, 18, -1, 13486), + (13490, 5020, 5020, 5020, 5020, 9, 91, 30742, 9, 300, 18, 10149, 13491), + (13492, 10330, 10330, 10330, 10330, 12, 95, 30744, 35, 30, 18, 13203, 14797), + (13493, 1598, -1, 1598, 1598, 11, 91, 30745, 6, 900, 18, 13195, 13494), + (13496, 1110, 1110, 1110, 1110, 9, 91, 30748, 3, 2160, 18, 13192, 13497), + (13499, 592, 592, 592, 592, 9, 91, 30754, 2, 18, 18, 12751, 13500), + (13502, -1, -1, 6375, 6375, 9, 91, -1, 0, 0, 18, 12736, 13503), + (13505, 6533, 6533, 6533, 6533, 11, 91, 30757, 15, 600, 18, 12742, 13506), + (13508, -1, -1, 8314, 8314, 9, 91, -1, 0, 0, 18, 8316, 13509), + (13511, -1, -1, 255, 255, 9, 91, -1, 0, 0, 18, 13198, 13512), + (13514, 5298, 5298, 5298, 5298, 12, 91, 30760, 32, 1800, 18, 12748, 13515), + (13517, 10336, 10336, 10336, 10336, 11, 91, 30766, 58, 8, 18, 12732, 13518), + (13520, -1, -1, 12419, 12419, 15, 95, -1, 0, 0, 18, 12575, 16886), + (13521, -1, -1, 6386, 6386, 9, 91, -1, 0, 0, 18, 6389, 13522), + (13524, 6534, 6534, 6534, 6534, 11, 91, 30769, 16, 900, 18, 7429, 13525), + (13527, 13527, 13527, 13527, 13527, 9, 91, 30772, 18, 9, 18, -1, 15964), + (13528, 13528, 13528, 13528, 13528, 10, 91, 30773, 42, 60, 18, -1, -1), + (13529, 13529, 13529, 13529, 13529, 15, 95, 30774, 41, 120, 18, -1, -1), + (13530, 1116, 1116, 1116, 1116, 12, 91, 30775, 4, 2160, 18, 12745, 13531), + (13533, -1, -1, 7010, 7010, 9, 91, -1, 0, 0, 18, 7015, 13534), + (13542, 6755, 6755, 6755, 6755, 12, 91, 30784, 42, 900, 18, 6757, 13543), + (13545, -1, -1, 10388, 10388, 12, 95, -1, 0, 0, 18, 10388, 15293), + (13546, 6758, 6758, 6758, 6758, 11, 91, 32360, 43, 900, 18, 10056, 13547), + (13549, 13549, 13549, 13549, 13549, 15, 95, 30788, 64, 180, 18, -1, -1), + (13556, 13556, 13556, 13556, 13556, 9, 91, 30792, 44, 600, 18, -1, 13557), + (13562, -1, -1, 10719, 10719, 15, 91, 0, 0, 0, 18, 10721, 13563), + (13565, -1, -1, 13565, 13565, 11, 91, 0, 0, 0, 18, -1, 13566), + (13568, -1, -1, 13568, 13568, 11, 91, 0, 0, 0, 18, -1, 13569), + (13571, 13571, 13571, 13571, 13571, 12, 91, 30795, 50, 60, 18, -1, -1), + (13575, 5095, 5095, 5095, 5095, 11, 91, 30796, 10, 900, 18, 10642, 13576), + (13578, 0, 0, 10348, 10348, 9, 91, -1, 0, 0, 18, 10350, 13579), + (13584, 10394, 10394, 10394, 10394, 15, 91, 30799, 30, 300, 18, 10704, 14981), + (13585, 7712, 7712, 7712, 7712, 15, 95, 30800, 2, 30, 18, 10646, 15095), + (13586, 188, 188, 188, 188, 12, 91, 30801, 2, 30, 18, 10647, 13587), + (13589, -1, -1, 255, 255, 13, 91, -1, 0, 0, 18, 10625, 13590), + (13590, -1, -1, 255, 255, 15, 93, -1, 0, 0, 18, 13589, 13591), + (13592, 5984, 5984, 5984, 5984, 12, 91, 30803, 2, 30, 18, 10626, 13593), + (13595, 534, 534, 534, 534, 12, 91, 30806, 4, 2160, 18, 10710, 13596), + (13598, -1, -1, 6791, 6791, 11, 91, -1, 0, 0, 18, 10678, 13599), + (13601, -1, -1, 852, 852, 11, 91, -1, 0, 0, 18, 12578, 13602), + (13604, 7850, 7850, 7850, 7850, 15, 91, 30812, 39, 4320, 18, 10620, 13605), + (13607, -1, -1, 10453, 10453, 11, 91, -1, 0, 0, 18, 10455, 13608), + (13610, -1, -1, 602, 602, 12, 91, -1, 0, 0, 18, 10687, 13611), + (13613, -1, -1, 855, 855, 11, 91, -1, 0, 0, 18, 10692, 13614), + (13616, -1, -1, 13616, 13616, 7, 91, -1, 0, 0, 18, -1, 13617), + (13617, -1, -1, 13616, 13616, 9, 93, -1, 0, 0, 18, 13616, 13618), + (13618, -1, -1, 13616, 13616, 12, 95, -1, 0, 0, 18, 13617, 14786), + (13619, 7800, 7800, 7800, 7800, 15, 91, 30815, 39, 4320, 18, 10787, 13620), + (13621, -1, -1, 6630, 6630, 9, 91, -1, 0, 0, 18, 10074, 13622), + (13624, 10900, 10900, 10900, 10900, 9, 91, 30817, 55, 120, 18, 10902, 13625), + (13627, -1, -1, 895, 895, 9, 91, -1, 0, 0, 18, 10908, 13628), + (13628, -1, -1, 895, 895, 12, 93, -1, 0, 0, 18, 13627, 13629), + (13630, -1, -1, 9506, 9506, 11, 91, -1, 0, 0, 18, 9508, 13631), + (13633, 6645, 6645, 6645, 6645, 15, 95, 30820, 45, 60, 18, 13107, 15178), + (13646, 13646, 13646, 13646, 13646, 15, 91, 30837, 45, 600, 18, -1, -1), + (13650, 8060, 8060, 8060, 8060, 9, 91, 31524, 41, 1800, 18, 10239, 13651), + (13653, 8063, 8063, 8063, 8063, 9, 91, 31527, 41, 1800, 18, 10242, 13654), + (13656, 8066, 8066, 8066, 8066, 11, 91, 31530, 41, 1800, 18, 10245, 13657), + (13663, 12893, 12893, 12893, 12893, 15, 91, 31534, 76, 1800, 18, 12893, 13664), + (13667, -1, -1, 13667, 13667, 11, 91, -1, 0, 0, 18, -1, 13668), + (13670, 13670, 13670, 13670, 13670, 12, 91, 31538, 43, 1800, 18, -1, 13671), + (13673, 13673, 13673, 13673, 13673, 18, 95, 32050, 0, 1, 18, -1, -1), + (13674, 13674, 13674, 13674, 13674, 18, 95, 32058, 0, 1, 18, -1, -1), + (13675, -1, -1, 5264, 5264, 12, 91, -1, 0, 0, 18, 12800, 13676), + (13678, 13678, 13678, 13678, 13678, 15, 95, 31543, 74, 1200, 18, 12778, -1), + (13682, 12766, 12766, 12766, 12766, 18, 95, 31545, 69, 3600, 18, 12766, -1), + (13683, 6822, 6822, 6822, 6822, 15, 91, 31546, 42, 120, 18, 6822, 14780), + (13684, -1, -1, 13684, 13684, 9, 91, -1, 0, 0, 18, -1, 13685), + (13685, -1, -1, 13684, 13684, 12, 93, -1, 0, 0, 18, 13684, 13686), + (13686, -1, -1, 13684, 13684, 15, 95, -1, 0, 0, 18, 13685, 16653), + (13687, 13687, 13687, 13687, 13687, 15, 91, 31547, 75, 300, 18, -1, 17521), + (13688, 13225, 13225, 13225, 13225, 12, 91, 31548, 0, 4, 18, 13225, 15620), + (13689, -1, -1, 13689, 13689, 9, 91, -1, 0, 0, 18, -1, 13690), + (13692, 12208, 12208, 12208, 12208, 6, 91, 31549, 17, 12, 18, -1, -1), + (13693, 13693, 13693, 13693, 13693, 18, 95, 31550, 76, 500, 18, -1, 17531), + (13695, 13695, 13695, 13695, 13695, 12, 91, 31577, 91, 1320, 18, -1, 13696), + (13698, 4903, 4903, 4903, 4903, 12, 91, 31580, 9, 1320, 18, 12956, 13699), + (13701, 4906, 4906, 4906, 4906, 12, 91, 31583, 9, 1320, 18, 12959, 13702), + (13704, 4912, 4912, 4912, 4912, 12, 91, 31586, 16, 1320, 18, 12958, 13705), + (13707, -1, -1, 1577, 1577, 12, 91, -1, 0, 0, 18, 10264, 13708), + (13710, -1, -1, 795, 795, 9, 91, -1, 0, 0, 18, 12949, 13711), + (13713, -1, -1, 790, 790, 6, 91, -1, 0, 0, 18, 12954, 13714), + (13718, 167, 167, 167, 167, 12, 91, 31589, 14, 900, 18, 12955, 13719), + (13720, 10600, 10600, 10600, 10600, 11, 91, 31591, 73, 20, 18, 12984, 13721), + (13723, 1126, 1126, 1126, 1126, 11, 91, 31594, 2, 2160, 18, 13255, 13724), + (13726, 1017, 1017, 1017, 1017, 12, 91, 31597, 75, 15, 18, 1017, -1), + (13727, 4938, 4938, 4938, 4938, 12, 95, 31598, 35, 1800, 18, 12875, 16031), + (13734, 773, -1, 773, 773, 9, 91, 31606, 5, 1800, 18, 10566, 13735), + (13753, -1, -1, 13753, 13753, 5, 91, -1, 0, 0, 18, -1, 13754), + (13758, -1, -1, 13758, 13758, 5, 91, -1, 0, 0, 18, -1, 13759), + (13763, -1, -1, 781, 781, 12, 95, -1, 0, 0, 18, 7284, -1), + (13764, -1, -1, 13764, 13764, 9, 91, -1, 0, 0, 18, -1, 13765), + (13767, -1, -1, 1604, 1604, 12, 91, -1, 0, 0, 18, 13095, 13768), + (13770, 6328, 6328, 6328, 6328, 9, 91, 31628, 10, 600, 18, 10170, 13771), + (13771, 6328, 6328, 6328, 6328, 12, 93, 31629, 10, 600, 18, 13770, 13772), + (13773, -1, -1, 255, 255, 11, 91, -1, 0, 0, 18, 12610, 13774), + (13774, -1, -1, 255, 255, 13, 92, -1, 0, 0, 18, 13773, 13775), + (13775, -1, -1, 255, 255, 15, 93, -1, 0, 0, 18, 13774, 14126), + (13779, -1, -1, 10850, 10850, 12, 91, 31637, 0, 0, 18, 13209, 13780), + (13782, -1, -1, 1543, 1543, 9, 91, -1, 0, 0, 18, 13217, 13783), + (13785, 5021, 5021, 5021, 5021, 11, 91, 31640, 7, 60, 18, 12621, 13786), + (13788, 13788, 13788, 13788, 13788, 25, 51, 31643, 31, 2, 3, -1, -1), + (13789, -1, -1, 1304, 1304, 11, 91, -1, 0, 0, 18, 13218, 13790), + (13790, -1, -1, 1304, 1304, 13, 93, -1, 0, 0, 18, 13789, 13791), + (13792, 13792, 13792, 13792, 13792, 9, 91, 31644, 18, 600, 18, 12633, 13793), + (13795, -1, -1, 846, 846, 12, 91, -1, 0, 0, 18, 10175, 13796), + (13798, -1, -1, 8325, 8325, 9, 91, -1, 0, 0, 18, 13221, 13799), + (13804, -1, -1, 10650, 10650, 9, 91, -1, 0, 0, 18, 10652, 13805), + (13807, 1352, 1352, 1352, 1352, 9, 91, 31647, 3, 60, 18, 10115, 13808), + (13810, 1358, 1358, 1358, 1358, 9, 91, 31650, 3, 60, 18, 10118, 13811), + (13813, -1, -1, 12706, 12706, 12, 91, 0, 0, 0, 18, 12708, 13814), + (13816, 7875, 7875, 7875, 7875, 9, 91, 31653, 42, 600, 18, 7880, 13817), + (13819, 10346, 10346, 10346, 10346, 12, 95, 31659, 46, 600, 18, 13183, 16924), + (13820, -1, -1, 820, 820, 9, 91, -1, 0, 0, 18, 12669, 13821), + (13823, -1, -1, 6020, 6020, 9, 91, -1, 0, 0, 18, 12693, 13824), + (13826, -1, -1, 9512, 9512, 9, 91, -1, 0, 0, 18, 13189, 13827), + (13829, -1, -1, 10340, 10340, 12, 91, -1, 0, 0, 18, 13186, 13830), + (13832, 1355, 1355, 1355, 1355, 11, 91, 31661, 3, 60, 18, 12702, 13833), + (13835, -1, -1, 611, 611, 9, 91, -1, 0, 0, 18, 12705, 13836), + (13838, 7872, 7872, 7872, 7872, 9, 91, 31664, 41, 600, 18, 12684, 13839), + (13841, -1, -1, 10343, 10343, 9, 91, 0, 0, 0, 18, 10345, 13842), + (13845, 1178, 1178, 1178, 1178, 9, 91, 31669, 4, 900, 18, 10328, 13846), + (13872, 13872, 13872, 13872, 13872, 15, 95, 31694, 63, 60, 18, -1, 16002), + (13873, -1, -1, 13873, 13873, 7, 91, 0, 0, 0, 18, -1, 13874), + (13878, -1, -1, 13878, 13878, 9, 91, 0, 0, 0, 18, -1, 13879), + (13881, -1, -1, 13881, 13881, 9, 91, 0, 0, 0, 18, -1, 13882), + (13884, -1, -1, 735, 735, 10, 91, -1, 0, 0, 18, 10636, 13885), + (13889, -1, -1, 13889, 13889, 5, 91, 0, 0, 0, 18, -1, 13890), + (13894, -1, -1, 1021, 1021, 6, 91, -1, 0, 0, 18, 7685, 13895), + (13899, 6750, 6750, 6750, 6750, 15, 95, 32100, 60, 120, 18, 6750, 15294), + (13905, -1, -1, 13905, 13905, 10, 91, -1, 0, 0, 18, -1, 13906), + (13908, -1, -1, 13908, 13908, 10, 91, -1, 0, 0, 18, -1, 13909), + (13911, -1, -1, 13911, 13911, 12, 91, -1, 0, 0, 18, -1, 13912), + (13914, 4849, 4849, 4849, 4849, 12, 91, 32103, 7, 1800, 18, 7110, 13915), + (13917, -1, -1, 13917, 13917, 9, 91, -1, 0, 0, 18, -1, 13918), + (13920, 6333, 6333, 6333, 6333, 15, 91, 32140, 3, 600, 18, 7266, 16032), + (13921, -1, -1, 98, 98, 12, 91, -1, 0, 0, 18, 11063, 13922), + (13924, -1, -1, 98, 738, 12, 91, -1, 0, 0, 18, 7600, 13925), + (13927, -1, -1, 10370, 10370, 10, 91, -1, 0, 0, 18, 10372, 13928), + (13930, -1, -1, 1592, 1592, 12, 91, -1, 0, 0, 18, 12536, 13931), + (13933, -1, -1, 8263, 8263, 5, 91, -1, 0, 0, 18, 8360, 13934), + (13943, -1, -1, 8268, 8268, 5, 91, -1, 0, 0, 18, 8370, 13944), + (13953, -1, -1, 8273, 8273, 5, 91, -1, 0, 0, 18, 8380, 13954), + (13963, -1, -1, 8278, 8278, 5, 91, -1, 0, 0, 18, 8390, 13964), + (13973, -1, -1, 8283, 8283, 5, 91, -1, 0, 0, 18, 8400, 13974), + (13983, -1, -1, 8288, 8288, 5, 91, -1, 0, 0, 18, 8410, 13984), + (13993, -1, -1, 8293, 8293, 5, 91, -1, 0, 0, 18, 8420, 13994), + (14003, 6492, 6492, 6492, 6492, 12, 91, 32151, 52, 720, 18, 10681, 14004), + (14006, 10711, 10711, 10711, 10711, 15, 91, 32157, 75, 1200, 18, 10713, 14007), + (14009, 13202, 13202, 13202, 13202, 6, 91, 32160, 98, 20, 18, 13202, -1), + (14010, 14010, 14010, 14010, 14010, 15, 95, 32161, 97, 20, 18, -1, -1), + (14011, -1, -1, 14011, 14011, 5, 91, -1, 0, 0, 18, -1, 14012), + (14016, 10354, 10354, 10354, 10354, 15, 95, 32162, 39, 4320, 18, 10354, 14647), + (14017, -1, -1, 14017, 14017, 0, 90, -1, 0, 0, 18, -1, -1), + (14018, -1, -1, 14018, 14018, 0, 91, -1, 0, 0, 18, -1, -1), + (14019, 14019, 14019, 14019, 14019, 12, 91, 32177, 14, 900, 18, -1, 14020), + (14026, -1, -1, 14026, 14026, 12, 91, -1, 0, 0, 18, -1, 14027), + (14029, -1, -1, 14029, 14029, 12, 91, -1, 0, 0, 18, -1, 14030), + (14032, -1, -1, 14032, 14032, 15, 95, -1, 0, 0, 18, -1, -1), + (14037, -1, -1, 14037, 14037, 9, 91, 0, 0, 0, 18, -1, 14038), + (14040, -1, -1, 14040, 14040, 9, 91, 0, 0, 0, 18, -1, 14041), + (14043, -1, -1, 1313, 1313, 12, 91, -1, 0, 0, 18, 12581, 14044), + (14046, -1, -1, 14046, 14046, 5, 91, -1, 0, 0, 18, -1, 14047), + (14051, 14051, 14051, 14051, 14051, 12, 95, 32300, 62, 8, 18, -1, 15774), + (14052, 14052, 14052, 14052, 14052, 21, 95, 32301, 13, 1440, 18, -1, 14793), + (14053, 10912, 10912, 10912, 10912, 9, 91, 32303, 69, 1800, 18, 10914, 14054), + (14054, 10912, 10912, 10912, 10912, 12, 93, 32304, 69, 1800, 18, 14053, 14055), + (14055, 10912, 10912, 10912, 10912, 15, 95, 32305, 69, 1800, 18, 14054, -1), + (14056, -1, -1, 14056, 14056, 9, 91, -1, 0, 0, 18, -1, 14057), + (14059, -1, -1, 14059, 14059, 9, 91, -1, 0, 0, 18, -1, 14060), + (14062, -1, -1, 14062, 14062, 9, 91, -1, 0, 0, 18, -1, 14063), + (14065, -1, -1, 14065, 14065, 9, 91, 0, 0, 0, 18, -1, 14066), + (14068, -1, -1, 14068, 14068, 9, 91, 0, 0, 0, 18, -1, 14069), + (14071, 14071, 14071, 14071, 14071, 9, 91, 32307, 12, 600, 18, -1, 14072), + (14076, -1, -1, 14076, 14076, 9, 91, -1, 0, 0, 18, -1, 14077), + (14080, 14080, 14080, 14080, 14080, 9, 95, 32312, 13, 900, 18, -1, -1), + (14081, 14081, 14081, 14081, 14081, 9, 95, 32313, 14, 120, 18, -1, 17240), + (14082, -1, -1, 13101, 13101, 9, 91, 0, 0, 0, 18, 13103, 14083), + (14085, -1, -1, 14085, 14085, 9, 91, -1, 0, 0, 18, -1, 14086), + (14088, -1, -1, 14088, 14088, 9, 91, -1, 0, 0, 18, -1, 14089), + (14091, -1, -1, 14091, 14091, 9, 91, -1, 0, 0, 18, -1, 14092), + (14094, -1, -1, 10355, 10355, 9, 91, -1, 0, 0, 18, 10645, 14095), + (14097, -1, -1, 6395, 6395, 12, 91, -1, 0, 0, 18, 10707, 14098), + (14100, -1, -1, 14100, 14100, 15, 95, -1, 0, 0, 18, -1, -1), + (14101, -1, -1, 6355, 6355, 9, 91, -1, 0, 0, 18, 6360, 14263), + (14111, 6754, 6754, 6754, 6754, 12, 95, 32326, 41, 1200, 18, 10053, 14839), + (14112, 6370, 6370, 6370, 6370, 9, 91, 32329, 7, 600, 18, 7352, 14113), + (14115, -1, -1, 14115, 14115, 12, 91, -1, 0, 0, 18, -1, 14116), + (14129, -1, -1, 14129, 14129, 12, 91, -1, 0, 0, 18, -1, 14130), + (14130, -1, -1, 14129, 14129, 15, 93, -1, 0, 0, 18, 14129, 14131), + (14132, -1, -1, 7751, 7751, 7, 91, -1, 0, 0, 18, 7753, 14133), + (14135, -1, -1, 14135, 14135, 12, 91, -1, 0, 0, 18, -1, 14136), + (14138, -1, -1, 12615, 12615, 18, 95, -1, 0, 0, 18, 12617, 15499), + (14139, 14139, 14139, 14139, 14139, 15, 95, 32328, 60, 60, 18, -1, -1), + (14140, -1, -1, 12607, 12607, 15, 95, 0, 0, 0, 18, 12607, 15631), + (14141, -1, -1, 14141, 14141, 9, 91, -1, 0, 0, 18, -1, 14142), + (14144, -1, -1, 14144, 14144, 7, 91, -1, 0, 0, 18, -1, 14145), + (14148, -1, -1, 14148, 14148, 9, 91, 0, 0, 0, 18, -1, 14149), + (14151, -1, -1, 14151, 14151, 9, 91, 0, 0, 0, 18, -1, 14152), + (14154, -1, -1, 10657, 10657, 12, 91, 0, 0, 0, 18, 12681, 14155), + (14157, -1, -1, 14157, 14157, 9, 91, 0, 0, 0, 18, -1, 14158), + (14160, -1, -1, 14160, 14160, 9, 91, 0, 0, 0, 18, -1, 14161), + (14163, -1, -1, 14163, 14163, 9, 91, 0, 0, 0, 18, -1, 14164), + (14166, -1, -1, 14166, 14166, 9, 91, 0, 0, 0, 18, -1, 14167), + (14169, -1, -1, 14169, 14169, 7, 91, -1, 0, 0, 18, -1, 14170), + (14173, -1, -1, 12710, 12710, 9, 91, -1, 0, 0, 18, 12712, 14174), + (14176, -1, -1, 13204, 13204, 9, 91, -1, 0, 0, 18, 13206, 14177), + (14179, -1, -1, 14179, 14179, 9, 95, -1, 0, 0, 18, -1, -1), + (14180, -1, -1, 14180, 14180, 9, 95, -1, 0, 0, 18, -1, -1), + (14181, -1, -1, 14181, 14181, 9, 91, -1, 0, 0, 18, -1, 14182), + (14186, -1, -1, 14186, 14186, 9, 91, -1, 0, 0, 18, -1, 14187), + (14189, 5017, 5017, 5017, 5017, 9, 91, 32332, 8, 600, 18, 10158, 14190), + (14192, 14192, 14192, 14192, 14192, 15, 95, 32335, 36, 12, 18, -1, 15525), + (14196, -1, -1, 6935, 6935, 9, 91, -1, 0, 0, 18, 6904, 14197), + (14199, -1, -1, 6908, 6908, 12, 95, -1, 0, 0, 18, 6910, 15560), + (14200, -1, -1, 14200, 14200, 9, 91, 32336, 0, 0, 18, -1, 14201), + (14203, -1, -1, 14203, 14203, 12, 91, -1, 0, 0, 18, -1, 14204), + (14206, 14206, 14206, 14206, 14206, 12, 95, 32339, 41, 600, 18, -1, 15324), + (14207, 14207, 14207, 14207, 14207, 12, 95, 32340, 39, 180, 18, -1, -1), + (14208, 14208, 14208, 14208, 14208, 12, 95, 32341, 17, 180, 18, -1, 14568), + (14209, 14209, 14209, 14209, 14209, 12, 95, 32342, 22, 3, 18, -1, -1), + (14210, -1, -1, 10358, 10358, 12, 91, -1, 0, 0, 18, 10360, 14211), + (14213, -1, -1, 14213, 14213, 11, 91, -1, 0, 0, 18, -1, 14214), + (14218, -1, -1, 962, 962, 9, 91, -1, 0, 0, 18, 10363, 14219), + (14221, 1383, 1383, 1383, 1383, 18, 95, 32345, 6, 300, 18, 6487, 14581), + (14222, 146, 146, 146, 146, 15, 95, 32346, 2, 180, 18, 13258, 14977), + (14223, -1, -1, 13010, 13010, 12, 95, 0, 0, 0, 18, 13012, 16205), + (14224, 14224, -1, 14224, 14224, 9, 91, 345, 61, 5, 18, -1, 15860), + (14225, -1, -1, 14225, 14225, 9, 91, -1, 0, 0, 18, -1, 14226), + (14229, 14229, 14229, 14229, 14229, 12, 100, 37168, 42, 600, 19, -1, -1), + (14231, 14231, 14231, 14231, 14231, 12, 95, 32347, 91, 6, 18, -1, 16207), + (14232, 14232, -1, 14232, 14232, 12, 95, 32348, 92, 6, 18, -1, 14674), + (14233, 14233, 14233, 14233, 14233, 15, 95, 32349, 93, 30, 18, -1, 15621), + (14234, 14234, 14234, 14234, 14234, 9, 91, 32350, 94, 1800, 18, -1, 14235), + (14237, 12638, 12638, 12638, 12638, 9, 91, 23581, 68, 10, 18, -1, -1), + (14238, -1, -1, 12968, 12968, 9, 91, 0, 0, 0, 18, 12970, 14239), + (14241, -1, -1, 14241, 14241, 9, 91, -1, 0, 0, 18, -1, 14242), + (14244, -1, -1, 14244, 14244, 9, 91, -1, 0, 0, 18, -1, 14245), + (14249, -1, -1, 14249, 14249, 9, 91, -1, 0, 0, 18, -1, 14250), + (14254, -1, -1, 14254, 14254, 11, 91, -1, 0, 0, 18, -1, 14255), + (14256, 6561, 6561, 6561, 6561, 9, 91, 32353, 32, 30, 18, 10420, 14257), + (14259, -1, -1, 14259, 14259, 11, 91, -1, 0, 0, 18, -1, 14260), + (14262, 14262, 14262, 14262, 14262, 15, 95, 32357, 95, 180, 18, -1, -1), + (14264, 14264, 14264, 14264, 14264, 12, 95, 32358, 97, 120, 18, -1, 14600), + (14265, 14265, 14265, 14265, 14265, 15, 95, 32359, 68, 30, 18, -1, -1), + (14272, 6218, 6218, 6218, 14272, 12, 95, 32369, 0, 1, 18, 7488, 17381), + (14273, 723, 723, 723, 723, 12, 95, 32370, 6, 30, 18, 10300, 14869), + (14274, 6971, 6971, 6971, 6971, 9, 91, 32371, 41, 600, 18, 10290, 17383), + (14275, -1, -1, 14275, 14275, 7, 91, -1, 0, 0, 18, -1, 14276), + (14278, -1, -1, 14278, 14278, 12, 95, 0, 0, 0, 18, 6990, 16248), + (14279, -1, -1, 1287, 1287, 11, 95, -1, 0, 0, 18, 12815, 16529), + (14280, 4890, -1, 4890, 4890, 12, 95, 32373, 3, 8640, 18, 5872, 14776), + (14281, 14281, 14281, 14281, 14281, 12, 95, 32375, 39, 15, 18, -1, -1), + (14282, 14282, 14282, 14282, 14282, 9, 91, 32374, 39, 7, 18, -1, -1), + (14283, -1, -1, 14283, 14283, 7, 91, -1, 0, 0, 18, -1, 14284), + (14286, -1, -1, 14286, 14286, 9, 91, -1, 0, 0, 18, -1, 14287), + (14289, -1, -1, 14289, 14289, 9, 91, -1, 0, 0, 18, -1, 14290), + (14292, -1, -1, 14292, 14292, 9, 91, -1, 0, 0, 18, -1, 14293), + (14295, -1, -1, 14295, 14295, 9, 95, -1, 0, 0, 18, -1, 14296), + (14301, -1, -1, 14301, 14301, 9, 91, -1, 0, 0, 18, -1, 14302), + (14304, -1, -1, 14304, 14304, 9, 91, -1, 0, 0, 18, -1, 14305), + (14307, 14307, 14307, 14307, 14307, 12, 95, 32376, 92, 1200, 18, -1, 14743), + (14308, -1, -1, 14308, 14308, 9, 91, -1, 0, 0, 18, -1, 14309), + (14311, -1, -1, 14311, 14311, 9, 91, -1, 0, 0, 18, -1, 14312), + (14314, -1, -1, 7715, 7715, 7, 91, -1, 0, 0, 18, 7717, 14315), + (14318, -1, -1, 14318, 14318, 9, 91, -1, 0, 0, 18, -1, 14319), + (14321, 14321, 14321, 14321, 14321, 12, 95, 32378, 92, 8, 18, -1, 14781), + (14322, 14322, 14322, 14322, 14322, 12, 95, 32379, 94, 2160, 18, -1, 14782), + (14323, 14323, 14323, 14323, 14323, 12, 95, 32380, 92, 150, 18, -1, -1), + (14324, 155, 155, 155, 155, 15, 95, 32381, 8, 60, 18, 7238, 15610), + (14328, -1, -1, 7822, 7822, 7, 91, -1, 0, 0, 18, 7826, 14329), + (14331, -1, -1, 14331, 14331, 9, 91, -1, 0, 0, 18, -1, 14332), + (14338, 1337, 1337, 1337, 1337, 12, 91, 32382, 13, 4320, 18, 6160, 14339), + (14341, -1, -1, 14341, 14341, 5, 91, -1, 0, 0, 18, -1, 14342), + (14346, 14346, 14346, 14346, 14346, 9, 91, 32385, 94, 12, 18, -1, 14347), + (14349, -1, -1, 1210, 1213, 12, 91, -1, 0, 0, 18, 12528, 14350), + (14352, 1274, 1274, 1274, 1274, 12, 91, 32391, 9, 540, 18, 12762, 14353), + (14355, 6815, 6815, 6815, 6815, 9, 91, 32394, 60, 600, 18, 12788, 14356), + (14358, 14358, -1, 14358, 14358, 15, 95, 32397, 98, 300, 18, -1, -1), + (14359, 14359, 14359, 14359, 14359, 15, 95, 32399, 93, 1200, 18, -1, -1), + (14360, 14360, 14360, 14360, 14360, 15, 95, 32400, 95, 1800, 18, -1, 16334), + (14361, -1, -1, 637, 637, 12, 91, -1, 0, 0, 18, 12555, 14362), + (14364, -1, -1, 14364, 14364, 9, 91, -1, 0, 0, 18, -1, 14365), + (14367, -1, -1, 14367, 14367, 0, 1, -1, 0, 0, 0, -1, 14368), + (14371, 14371, 14371, 14371, 14371, 0, 1, 32910, 0, 10, 0, -1, -1), + (14372, 13844, 13844, 13844, 13844, 6, 95, 31667, 47, 6, 18, -1, -1), + (14373, 14373, 14373, 14373, 14373, 0, 85, 33106, 87, 3600, 19, -1, -1), + (14374, 14374, 14374, 14374, 14374, 0, 86, 33107, 88, 28800, 19, -1, -1), + (14690, 14690, 14690, 14690, 14690, 15, 96, 37014, 45, 600, 19, -1, 17479), + (14729, 8342, 8342, 8342, 8342, 15, 100, 33909, 54, 240, 19, 8342, 17501), + (14730, 616, 616, 616, 616, 12, 96, 33910, 7, 900, 19, 10261, 14731), + (14733, 4909, 4909, 4909, 4909, 18, 100, 33913, 16, 1320, 19, 12957, 17147), + (14734, 7903, 7903, 7903, 7903, 12, 100, 33914, 60, 30, 19, 12976, 15853), + (14739, 1462, 1462, 1462, 1462, 18, 99, 33919, 5, 300, 19, 4902, 16054), + (14764, -1, -1, 10551, 10551, 12, 96, -1, 0, 0, 19, 10553, 14765), + (14991, 926, 926, 926, 926, 5, 85, 11071, 12, 1800, 17, 930, 14992), + (14992, 926, 926, 926, 926, 5, 86, 11072, 12, 1800, 17, 14991, 14993), + (15073, 15073, -1, 15073, 15073, 0, 1, 37668, 90, 60, 19, -1, -1), + (15074, -1, -1, 15074, 15074, 0, 1, -1, 0, 0, 19, -1, 15075), + (15096, 15096, 15096, 15096, 15096, 5, 96, 38151, 35, 30, 19, -1, 15097), + (15099, 15099, 15099, 15099, 15099, 12, 100, 37187, 15, 45, 19, -1, 16566), + (15100, -1, -1, 15100, 15100, 5, 96, -1, 0, 0, 19, -1, 15101), + (15105, -1, -1, 15105, 15105, 11, 96, -1, 0, 0, 19, -1, 15106), + (15108, -1, -1, 15108, 15108, 9, 98, -1, 0, 0, 19, -1, 15109), + (15111, 8300, 8300, 8300, 8300, 11, 97, 37189, 8, 900, 19, 8302, 15112), + (15113, -1, -1, 15113, 15113, 11, 96, -1, 0, 0, 19, -1, 15114), + (15119, 15119, 15119, 15119, 15119, 12, 100, 37194, 16, 1200, 19, -1, 15749), + (15120, -1, -1, 15120, 15120, 9, 96, -1, 0, 0, 19, -1, 15121), + (15123, -1, -1, 15123, 15123, 9, 96, -1, 0, 0, 19, -1, 15124), + (15126, -1, -1, 15126, 15126, 9, 96, -1, 0, 0, 19, -1, 15127), + (15129, 15129, 15129, 15129, 15129, 12, 100, 37196, 32, 180, 19, -1, 15736), + (15130, 15130, 15130, 15130, 15130, 12, 100, 37197, 32, 180, 19, -1, 15737), + (15131, 15131, 15131, 15131, 15131, 12, 100, 37198, 32, 180, 19, -1, 15738), + (15132, -1, -1, 15132, 15132, 9, 96, -1, 0, 0, 19, -1, 15133), + (15135, -1, -1, 15135, 15135, 9, 100, -1, 0, 0, 19, -1, -1), + (15136, 15136, 15136, 15136, 15136, 9, 96, 38001, 5, 120, 19, -1, 17241), + (15140, 13100, 13100, 13100, 13100, 11, 100, 38002, 86, 300, 19, 13100, -1), + (15141, -1, -1, 190, 190, 9, 96, -1, 0, 0, 19, 5040, 15142), + (15146, 15146, 15146, 15146, 15146, 13, 100, 38006, 95, 9, 19, -1, 15758), + (15147, 15147, 15147, 15147, 15147, 11, 96, 38007, 8, 1200, 19, -1, 15148), + (15150, -1, -1, 15150, 15150, 7, 96, -1, 0, 0, 19, -1, 15151), + (15153, -1, -1, 15153, 15153, 11, 100, -1, 0, 0, 19, -1, -1), + (15154, -1, -1, 15154, 15154, 9, 96, -1, 0, 0, 19, -1, -1), + (15155, -1, -1, 15155, 15155, 5, 96, -1, 0, 0, 19, -1, 15156), + (15158, -1, -1, 15158, 15158, 13, 100, -1, 0, 0, 19, -1, -1), + (15159, -1, -1, 15159, 15159, 7, 96, -1, 0, 0, 19, -1, 15160), + (15162, -1, -1, 15162, 15162, 7, 96, -1, 0, 0, 19, -1, 15163), + (15168, -1, -1, 15168, 15168, 9, 96, -1, 0, 0, 19, -1, 15169), + (15172, -1, -1, 210, 210, 12, 100, -1, 0, 0, 19, 7401, 16658), + (15173, 6639, 6639, 6639, 6639, 9, 100, 38012, 42, 300, 19, 6639, 15788), + (15174, -1, -1, 12582, 12582, 9, 96, -1, 0, 0, 19, 12584, 15175), + (15177, 15177, 15177, 15177, 15177, 9, 100, 38013, 94, 180, 19, -1, -1), + (15179, -1, -1, 15179, 15179, 7, 96, -1, 0, 0, 19, -1, 15180), + (15182, -1, -1, 7757, 7757, 5, 96, -1, 0, 0, 19, 12589, 15183), + (15188, -1, -1, 1528, 4819, 5, 96, -1, 0, 0, 19, 4823, 15189), + (15193, 15193, 15193, 15193, 15193, 15, 100, 38016, 92, 600, 19, -1, -1), + (15194, -1, -1, 15194, 15194, 9, 100, -1, 0, 0, 19, -1, -1), + (15200, 15200, 15200, 15200, 15200, 9, 96, 38304, 32, 1080, 19, -1, 15201), + (15203, 15203, 15203, 15203, 15203, 15, 100, 38307, 34, 480, 19, -1, -1), + (15204, -1, -1, 15204, 15204, 9, 96, -1, 0, 0, 19, -1, 15205), + (15207, -1, -1, 15207, 15207, 9, 96, -1, 0, 0, 19, -1, 15208), + (15210, 15210, 15210, 15210, 15210, 9, 96, 38308, 12, 120, 19, -1, 15211), + (15213, 15213, 15213, 15213, 15213, 15, 100, 38312, 42, 1080, 19, -1, 17509), + (15214, 15214, 15214, 15214, 15214, 9, 96, 38313, 43, 1800, 19, -1, 15215), + (15217, -1, -1, 15217, 15217, 11, 96, -1, 0, 0, 19, -1, 15218), + (15220, -1, -1, 15220, 15220, 9, 100, -1, 0, 0, 19, -1, 15221), + (15223, -1, -1, 15223, 15223, 9, 100, -1, 0, 0, 19, -1, 15224), + (15226, -1, -1, 15226, 15226, 9, 100, -1, 0, 0, 19, -1, 15227), + (15229, -1, -1, 15229, 15229, 9, 100, -1, 0, 0, 19, -1, 15230), + (15232, -1, -1, 15232, 15232, 9, 96, -1, 0, 0, 19, -1, 15233), + (15235, 785, 785, 785, 785, 9, 96, 38325, 8, 900, 19, 789, 15236), + (15238, -1, -1, 5276, 5276, 11, 96, -1, 0, 0, 19, 5278, 15239), + (15241, 168, 168, 168, 168, 11, 96, 38329, 4, 10, 19, 170, 15242), + (15244, 171, 171, 171, 171, 11, 96, 38333, 4, 10, 19, 173, 15245), + (15247, 174, 174, 174, 174, 11, 96, 38336, 4, 10, 19, 176, 15248), + (15250, 177, 177, 177, 177, 11, 96, 38340, 4, 10, 19, 179, 15251), + (15253, -1, -1, 15253, 15253, 4, 96, -1, 0, 0, 19, -1, 15254), + (15258, -1, -1, 7743, 7743, 11, 100, -1, 0, 0, 19, 10718, -1), + (15270, -1, -1, 12430, 12430, 15, 100, -1, 0, 0, 19, 12878, -1), + (15280, -1, -1, 10722, 10722, 9, 96, -1, 0, 0, 19, 10726, 15281), + (15283, -1, -1, 15283, 15283, 5, 96, -1, 0, 0, 19, -1, 15284), + (15288, -1, -1, 15288, 15288, 7, 96, -1, 0, 0, 19, -1, 15289), + (15295, -1, -1, 15295, 15295, 7, 96, -1, 0, 0, 19, -1, 15296), + (15298, 10806, 10806, 10806, 10806, 9, 96, 38025, 71, 540, 19, 10808, 15299), + (15301, 10809, 10809, 10809, 10809, 9, 96, 38028, 71, 540, 19, 10811, 15302), + (15304, 15304, 15304, 15304, 15304, 12, 100, 38031, 91, 360, 19, -1, -1), + (15314, 0, 0, 6481, 6481, 11, 96, -1, 0, 0, 19, 6483, 15315), + (15317, -1, -1, 15317, 15317, 9, 96, -1, 0, 0, 19, 5012, 15318), + (15320, -1, -1, 7940, 7940, 11, 100, -1, 0, 0, 19, 6486, -1), + (15321, 746, 746, 746, 746, 9, 96, 38033, 10, 2160, 19, 10024, 15322), + (15328, -1, -1, 7948, 7948, 9, 96, -1, 0, 0, 19, 10037, 15329), + (15338, 15338, 15338, 15338, 15338, 9, 96, 38054, 30, 600, 19, -1, 15339), + (15341, 136, -1, 136, 136, 7, 100, 38057, 7, 1800, 19, 136, -1), + (15342, -1, -1, 15341, 15341, 7, 100, -1, 0, 0, 19, -1, -1), + (15343, 15343, 15343, 15343, 15343, 12, 100, 38058, 21, 300, 19, -1, -1), + (15344, -1, -1, 2400, 2400, 12, 97, -1, 0, 0, 19, 2402, 15345), + (15348, -1, -1, 13001, 13001, 7, 96, -1, 0, 0, 19, 13003, 15349), + (15356, -1, -1, 15356, 15356, 15, 100, -1, 0, 0, 19, -1, 15851), + (15357, 15357, 15357, 15357, 15357, 9, 96, 38062, 95, 2, 19, -1, -1), + (15358, -1, -1, 15358, 15358, 12, 100, -1, 0, 0, 19, -1, -1), + (15359, -1, -1, 474, 474, 5, 96, -1, 0, 0, 19, 476, 15360), + (15362, 15362, 15362, 15362, 15362, 15, 100, 38063, 89, 20, 19, -1, -1), + (15363, -1, -1, 10951, 10951, 12, 97, -1, 0, 0, 19, 10953, 15364), + (15371, -1, -1, 15371, 15371, 7, 96, -1, 0, 0, 19, -1, 15372), + (15374, -1, -1, 15374, 15374, 9, 96, -1, 0, 0, 19, -1, 15375), + (15377, 15377, 15377, 15377, 15377, 15, 100, 38070, 75, 420, 19, -1, 15852), + (15383, -1, -1, 15383, 15383, 9, 96, -1, 0, 0, 19, -1, 15384), + (15389, -1, -1, 15389, 15389, 9, 96, -1, 0, 0, 19, -1, 15390), + (15396, -1, -1, 141, 12863, 12, 100, -1, 0, 0, 19, 12863, -1), + (15397, -1, -1, 6346, 6346, 9, 96, -1, 0, 0, 19, 7617, 15398), + (15403, -1, -1, 15403, 15403, 7, 96, -1, 0, 0, 19, -1, 15404), + (15406, -1, -1, 15406, 15406, 7, 96, -1, 0, 0, 19, -1, 15407), + (15414, -1, -1, 15414, 15414, 9, 100, -1, 0, 0, 19, -1, -1), + (15421, -1, -1, 6538, 6538, 12, 100, -1, 0, 0, 19, 7478, -1), + (15422, -1, -1, 83, 83, 12, 100, -1, 0, 0, 19, 1218, -1), + (15423, 15423, 15423, 15423, 15423, 15, 100, 38078, 52, 180, 19, -1, 15884), + (15424, 15424, 15424, 15424, 15424, 12, 100, 38079, 78, 1200, 19, -1, -1), + (15425, 15425, 15425, 15425, 15425, 15, 100, 38077, 79, 6, 19, -1, 15903), + (15426, -1, -1, 810, 810, 5, 96, -1, 0, 0, 19, 4828, 15427), + (15429, -1, -1, 15429, 15429, 7, 96, -1, 0, 0, 19, -1, 15430), + (15432, -1, -1, 15432, 15432, 7, 96, -1, 0, 0, 19, -1, 15433), + (15438, -1, -1, 15438, 15438, 9, 96, -1, 0, 0, 19, -1, 15439), + (15441, -1, -1, 815, 815, 10, 96, -1, 0, 0, 19, 7636, 15442), + (15444, -1, -1, 15444, 15444, 9, 96, 38080, 0, 0, 19, -1, 15445), + (15447, 15447, 15447, 15447, 15447, 9, 96, 38083, 78, 180, 19, -1, 15448), + (15450, -1, -1, 15450, 15450, 9, 96, -1, 0, 0, 19, -1, 15451), + (15453, -1, -1, 15453, 15453, 9, 96, -1, 0, 0, 19, -1, 15454), + (15456, -1, -1, 15456, 15456, 9, 96, -1, 0, 0, 19, -1, 15457), + (15459, 1245, 1245, 1245, 1245, 9, 96, 38404, 8, 2160, 19, 1247, 15460), + (15462, 8039, 8039, 8039, 38407, 15, 100, 38407, 58, 7, 19, 8039, 17167), + (15466, -1, -1, 10561, 10561, 9, 96, -1, 0, 0, 19, 10563, 15467), + (15469, -1, -1, 10558, 10558, 9, 96, -1, 0, 0, 19, 10560, 15470), + (15472, -1, -1, 8035, 8035, 9, 96, -1, 0, 0, 19, 10287, 15473), + (15475, 15475, 15475, 15475, 15475, 11, 96, 38408, 41, 600, 20, -1, 15476), + (15478, -1, -1, 15478, 15478, 9, 96, -1, 0, 0, 19, -1, 15479), + (15481, 15481, 15481, 15481, 15481, 18, 100, 38603, 53, 1080, 19, -1, -1), + (15482, 15482, 15482, 15482, 15482, 11, 96, 38414, 42, 1800, 19, -1, 15483), + (15485, -1, -1, 15485, 15485, 18, 100, -1, 0, 0, 19, -1, -1), + (15486, 15486, 15486, 15486, 15486, 12, 96, 38418, 43, 600, 19, -1, 15487), + (15489, 15489, 15489, 15489, 15489, 18, 100, 38421, 52, 10, 19, -1, -1), + (15490, 15490, 15490, 15490, 15490, 11, 96, 38422, 44, 10, 19, -1, 15491), + (15493, -1, -1, 15493, 15493, 9, 96, -1, 0, 0, 19, -1, 15494), + (15496, 15496, 15496, 15496, 15496, 11, 96, 38425, 46, 1800, 19, -1, 15497), + (15502, -1, -1, 15502, 15502, 9, 96, -1, 0, 0, 19, -1, 15503), + (15509, -1, -1, 15509, 15509, 9, 96, -1, 0, 0, 19, -1, 15510), + (15512, -1, -1, 15512, 15512, 9, 96, 38086, 0, 0, 19, -1, 15513), + (15515, 15515, 15515, 15515, 15515, 12, 100, 38089, 11, 90, 19, -1, 17417), + (15516, -1, -1, 15516, 15516, 9, 100, -1, 0, 0, 19, -1, 15960), + (15517, -1, -1, 15517, 15517, 7, 96, -1, 0, 0, 19, -1, 15518), + (15521, 15521, 15521, 15521, 15521, 12, 96, 38090, 42, 60, 19, -1, -1), + (15526, -1, -1, 12716, 12716, 7, 96, -1, 0, 0, 19, 12718, 15527), + (15529, -1, -1, 695, 695, 4, 96, -1, 0, 0, 19, 699, 15530), + (15540, -1, -1, 15540, 15540, 7, 96, -1, 0, 0, 19, -1, 15541), + (15543, -1, -1, 15543, 15543, 7, 96, -1, 0, 0, 19, -1, 15544), + (15546, -1, -1, 15546, 15546, 7, 96, -1, 0, 0, 19, -1, 15547), + (15549, -1, -1, 15549, 15549, 7, 96, -1, 0, 0, 19, -1, 15550), + (15552, -1, -1, 6302, 6302, 5, 96, -1, 0, 0, 19, 11013, 15553), + (15555, -1, -1, 15555, 15555, 11, 96, -1, 0, 0, 19, -1, 15556), + (15558, 10400, 10400, 10400, 10400, 9, 100, 38104, 62, 900, 19, 10400, -1), + (15564, -1, -1, 15564, 15564, 9, 96, -1, 0, 0, 19, -1, 15565), + (15567, 15567, 15567, 15567, 15567, 12, 96, 38106, 11, 1200, 19, -1, 15568), + (15569, 15569, 15569, 15569, 15569, 12, 96, 38108, 13, 60, 19, -1, 15991), + (15570, 15570, 15570, 15570, 15570, 15, 100, 38109, 64, 600, 19, -1, 15992), + (15571, -1, -1, 15571, 15571, 7, 96, -1, 0, 0, 19, -1, 15572), + (15574, 15574, 15574, 15574, 15574, 9, 80, 38110, 73, 4, 15, -1, 15575), + (15575, 15574, 15574, 15574, 15574, 9, 85, 38111, 73, 4, 16, 15574, 15576), + (15576, 15574, 15574, 15574, 15574, 9, 90, 38112, 73, 4, 17, 15575, 15577), + (15577, 15574, 15574, 15574, 15574, 9, 95, 38113, 73, 4, 18, 15576, 15578), + (15579, -1, -1, 15579, 15579, 7, 96, -1, 0, 0, 19, -1, 15580), + (15582, 15582, 15582, 15582, 15582, 9, 96, 38115, 34, 600, 19, -1, 15583), + (15585, -1, -1, 634, 634, 11, 96, -1, 0, 0, 19, 10780, 15586), + (15588, 10701, 10701, 10701, 10701, 12, 96, 38121, 32, 360, 19, 12756, 15589), + (15591, -1, -1, 15591, 15591, 5, 96, -1, 0, 0, 19, -1, 15592), + (15594, 15594, 15594, 15594, 15594, 9, 96, 38197, 39, 30, 19, -1, 15595), + (15598, -1, -1, 15598, 15598, 12, 96, -1, 0, 0, 19, -1, 15599), + (15601, 15601, 15601, 15601, 15601, 12, 96, 38131, 34, 6, 19, -1, 16077), + (15602, -1, -1, 15602, 15602, 9, 96, -1, 0, 0, 19, -1, 15603), + (15605, 12866, 12866, 12866, 12866, 15, 96, 38132, 74, 1800, 19, 12866, -1), + (15606, -1, -1, 8069, 8069, 5, 96, -1, 0, 0, 19, 8071, 15607), + (15609, -1, -1, 15609, 15609, 15, 100, -1, 0, 0, 19, -1, -1), + (15611, 15611, 15611, 15611, 15611, 18, 100, 38136, 32, 900, 19, -1, 16078), + (15612, 15612, 15612, 15612, 15612, 12, 96, 38137, 36, 20, 19, -1, 15613), + (15615, 15615, 15615, 15615, 15615, 12, 96, 38140, 44, 20, 19, -1, 15616), + (15619, 15619, 15619, 15619, 15619, 15, 100, 37188, 32, 600, 19, -1, -1), + (15622, -1, -1, 15622, 15622, 7, 96, -1, 0, 0, 19, -1, 15623), + (15625, -1, -1, 15625, 15625, 9, 96, -1, 0, 0, 19, -1, 15626), + (15628, 5022, 5022, 5022, 5022, 9, 96, 38176, 5, 600, 19, 6040, 15629), + (15632, -1, -1, 7005, 7005, 5, 96, -1, 0, 0, 19, 7007, 15633), + (15634, -1, -1, 15634, 15634, 3, 80, -1, 0, 0, 19, -1, 15635), + (15635, -1, -1, 15634, 15634, 5, 85, -1, 0, 0, 19, 15634, 15636), + (15639, 15639, 15639, 15639, 15639, 12, 96, 38183, 56, 60, 19, -1, -1), + (15640, 15640, 15640, 15640, 15640, 12, 100, 38184, 43, 60, 19, -1, -1), + (15642, 15642, 15642, 15642, 15642, 18, 100, 38187, 13, 1440, 19, -1, -1), + (15643, 15643, 15643, 15643, 15643, 9, 96, 38188, 75, 600, 19, -1, 15644), + (15646, 15646, 15646, 15646, 15646, 15, 100, 38194, 74, 60, 19, -1, 17255), + (15648, -1, -1, 15648, 15648, 9, 96, -1, 0, 0, 19, -1, 15649), + (15694, -1, -1, 8215, 8215, 5, 96, -1, 0, 0, 20, 12563, 15695), + (15714, -1, -1, 5263, 5263, 12, 96, -1, 0, 0, 20, 12468, 15715), + (15719, -1, -1, 1287, 1287, 11, 96, -1, 0, 0, 20, 13240, 15720), + (15746, -1, -1, 7033, 7033, 12, 96, 0, 0, 0, 20, 7035, 15747), + (15768, -1, -1, 15768, 15768, 7, 96, -1, 0, 0, 20, -1, 15769), + (15771, 15771, -1, 15771, 15771, 1, 55, 38274, 0, 3, 20, -1, -1), + (15772, -1, -1, 8232, 8232, 8, 100, -1, 0, 0, 20, 8261, -1), + (15773, -1, -1, 8040, 8040, 8, 100, -1, 0, 0, 20, 8313, -1), + (15775, 6508, 6508, 6508, 6508, 9, 96, 38276, 38, 600, 20, 10080, 15776), + (15778, -1, -1, 589, 589, 12, 96, -1, 0, 0, 20, 13106, 15779), + (15782, 7755, 7755, 7755, 7755, 12, 96, 38280, 53, 900, 20, 7755, 16187), + (15798, 15798, 15798, 15798, 15798, 9, 100, 38297, 34, 18, 20, -1, 15799), + (15819, 15819, 15819, 15819, 15819, 18, 100, 40807, 18, 900, 20, -1, -1), + (15833, -1, -1, 15833, 15833, 9, 96, 0, 0, 0, 20, -1, 15834), + (15836, -1, -1, 15836, 15836, 9, 100, 0, 0, 0, 20, -1, 15837), + (15839, 10450, 10450, 10450, 10450, 7, 96, 40817, 63, 900, 20, 10670, 15840), + (15855, 13004, 13004, 13004, 13004, 9, 96, 40832, 78, 300, 20, 13004, -1), + (15891, -1, -1, 11078, 11078, 9, 96, 0, 0, 0, 20, 11078, 15892), + (15893, -1, -1, 11079, 11079, 9, 96, 0, 0, 0, 20, 11079, 15894), + (15895, -1, -1, 11077, 11077, 9, 96, 0, 0, 0, 20, 11077, 15896), + (15904, 15904, 15904, 15904, 15904, 7, 66, 40874, 54, 600, 20, -1, -1), + (15908, -1, -1, 15908, 15908, 3, 80, -1, 0, 0, 20, -1, 15909), + (15909, -1, -1, 15908, 15908, 5, 85, -1, 0, 0, 20, 15908, 15910), + (15910, -1, -1, 15908, 15908, 7, 90, -1, 0, 0, 20, 15909, 15911), + (15954, -1, -1, 10853, 10853, 5, 90, -1, 0, 0, 20, 10864, 15955), + (15961, -1, -1, 12737, 12737, 9, 96, 0, 0, 0, 20, 12739, 15962), + (15988, 10333, 10333, 10333, 10333, 9, 96, 40894, 55, 120, 20, 12726, 15989), + (16016, 16016, 16016, 16016, 16016, 12, 100, 40919, 17, 12, 20, -1, -1), + (16062, -1, -1, 1572, 1572, 5, 96, -1, 0, 0, 20, 10556, 16063), + (16071, 16071, 16071, 16071, 16071, 15, 100, 40953, 46, 1800, 20, -1, 16072), + (16081, 16081, 16081, 16081, 16081, 15, 100, 40969, 55, 6, 20, -1, -1), + (16082, 16082, 16082, 16082, 16082, 3, 100, 40970, 53, 6, 20, -1, -1), + (16083, 16083, 16083, 16083, 16083, 3, 55, 40971, 46, 6, 20, -1, -1), + (16084, -1, -1, 16084, 16084, 9, 100, 0, 0, 0, 20, -1, 16085), + (16087, -1, -1, 16087, 16087, 5, 100, 0, 0, 6, 20, -1, 16088), + (16094, -1, -1, 477, 477, 2, 100, -1, 0, 0, 20, 6235, 16095), + (16096, 16096, 16096, 16096, 16096, 12, 100, 40972, 36, 6, 20, -1, -1), + (16097, 16097, 16097, 16097, 16097, 12, 100, 40973, 38, 600, 20, -1, 16098), + (16103, 16103, 16103, 16103, 16103, 0, 85, 41071, 35, 180, 16, -1, -1), + (16104, -1, -1, 16104, 16104, 5, 85, 0, 0, 0, 20, -1, -1), + (16105, 16105, 16105, 16105, 16105, 0, 85, 41086, 76, 30, 20, -1, -1), + (16106, 16106, 16106, 16106, 16106, 0, 85, 41087, 76, 30, 20, -1, -1), + (16107, 16107, 16107, 16107, 16107, 0, 85, 41088, 76, 30, 20, -1, -1), + (16108, 16108, 16108, 16108, 16108, 12, 100, 41090, 77, 120, 20, -1, -1), + (16109, -1, -1, 16109, 16109, 11, 96, -1, 0, 0, 20, -1, 16110), + (16113, 16113, 16113, 16113, 16113, 15, 100, 41096, 78, 60, 20, -1, -1), + (16114, -1, -1, 16114, 16114, 5, 96, -1, 0, 0, 20, -1, 16115), + (16117, -1, -1, 16117, 16117, 11, 96, -1, 0, 0, 20, -1, 16118), + (16120, -1, -1, 16120, 16120, 9, 105, -1, 0, 0, 21, -1, -1), + (16121, -1, -1, 6611, 6611, 6, 100, -1, 0, 0, 20, 10574, 16122), + (16124, -1, -1, 16124, 16124, 5, 96, -1, 0, 0, 20, -1, 16125), + (16128, -1, -1, 16128, 16128, 6, 96, -1, 0, 0, 20, -1, 16129), + (16131, -1, -1, 16131, 16131, 5, 96, -1, 0, 0, 20, -1, 16132), + (16137, -1, -1, 16137, 16137, 9, 100, -1, 0, 0, 20, -1, 16138), + (16140, -1, -1, 16140, 16140, 9, 100, -1, 0, 0, 20, -1, -1), + (16146, -1, -1, 16146, 16146, 11, 100, -1, 0, 0, 20, -1, 16147), + (16149, -1, -1, 16149, 16149, 9, 100, -1, 0, 0, 20, -1, 16150), + (16152, -1, -1, 16152, 16152, 11, 100, -1, 0, 0, 20, -1, 16153), + (16156, -1, -1, 16156, 16156, 12, 100, -1, 0, 0, 20, -1, 16157), + (16159, -1, -1, 16159, 16159, 15, 100, -1, 0, 0, 20, -1, -1), + (16160, 16160, 16160, 16160, 16160, 18, 100, 41110, 81, 900, 20, -1, -1), + (16162, 16162, 16162, 16162, 16162, 12, 100, 41112, 80, 180, 20, -1, -1), + (16163, 16163, 16163, 16163, 16163, 18, 100, 41113, 63, 180, 20, -1, 16695), + (16164, -1, -1, 6636, 6636, 9, 96, -1, 0, 0, 20, 12531, 16165), + (16170, -1, -1, 5248, 5248, 12, 96, -1, 0, 0, 20, 7358, 16171), + (16173, -1, -1, 5263, 5263, 9, 101, -1, 0, 0, 21, 12465, 16174), + (16176, -1, -1, 16176, 16176, 7, 100, -1, 0, 0, 20, -1, 16177), + (16179, -1, -1, 16179, 16179, 18, 100, 41122, 0, 0, 20, -1, -1), + (16180, -1, -1, 16180, 16180, 7, 96, -1, 0, 0, 20, -1, 16181), + (16185, 16185, 16185, 16185, 16185, 18, 100, 41124, 68, 600, 20, -1, 16729), + (16186, -1, -1, 16186, 16186, 12, 100, 41125, 0, 0, 20, -1, -1), + (16188, 16188, 16188, 16188, 16188, 12, 100, 41126, 58, 180, 20, -1, -1), + (16189, -1, -1, 10915, 10915, 9, 96, -1, 0, 0, 20, 10917, 16190), + (16192, -1, -1, 6641, 6641, 9, 96, -1, 0, 0, 20, 10077, 16193), + (16195, 16195, 16195, 16195, 16195, 15, 100, 41133, 59, 60, 20, -1, -1), + (16196, 16196, 16196, 16196, 16196, 15, 100, 41134, 60, 900, 20, -1, 16665), + (16197, 16197, 16197, 16197, 16197, 12, 96, 41136, 61, 900, 20, -1, 16198), + (16200, 16200, 16200, 16200, 16200, 9, 96, 41139, 63, 900, 20, -1, 16201), + (16203, 16203, 16203, 16203, 16203, 12, 96, 41143, 98, 120, 20, -1, 16204), + (16208, -1, -1, 16208, 16208, 5, 96, -1, 0, 0, 20, -1, 16209), + (16211, -1, -1, 16211, 16211, 7, 100, -1, 0, 0, 20, -1, 16212), + (16214, 10958, 10958, 10958, 16214, 18, 100, 41148, 62, 900, 20, 13000, -1), + (16215, 16215, 16215, 16215, 16215, 9, 96, 41150, 92, 300, 20, -1, 16216), + (16218, -1, -1, 16218, 16218, 7, 96, -1, 0, 0, 20, -1, 16219), + (16221, -1, -1, 16221, 16221, 9, 100, -1, 0, 0, 20, -1, 16223), + (16222, 16222, -1, 16222, 16222, 9, 100, 41153, 88, 30, 20, -1, -1), + (16225, -1, -1, 16225, 16225, 5, 96, -1, 0, 0, 20, -1, 16226), + (16230, -1, -1, 16230, 16230, 5, 96, -1, 0, 0, 20, -1, 16231), + (16235, -1, -1, 16235, 16235, 7, 96, -1, 0, 0, 20, -1, 16236), + (16238, -1, -1, 16238, 16238, 7, 96, -1, 0, 0, 20, -1, 16239), + (16246, 6983, 6983, 6983, 6983, 9, 96, 41157, 66, 720, 20, 6983, 16247), + (16249, -1, -1, 230, 230, 9, 100, -1, 0, 0, 20, 12677, -1), + (16250, 828, 828, 828, 828, 9, 96, 41159, 2, 3600, 20, 830, -1), + (16257, -1, -1, 16257, 16257, 11, 100, 0, 0, 0, 20, -1, 16258), + (16260, -1, -1, 16260, 16260, 11, 100, -1, 0, 0, 20, -1, 16261), + (16263, 16263, 16263, 16263, 16263, 11, 96, 41161, 95, 600, 20, -1, 16264), + (16266, -1, -1, 6560, 6560, 9, 96, -1, 0, 0, 20, 6277, -1), + (16267, -1, -1, 888, 888, 3, 96, -1, 0, 0, 20, 892, 16268), + (16272, -1, -1, 16272, 16272, 9, 96, -1, 0, 0, 20, -1, 16273), + (16276, -1, -1, 16276, 16276, 5, 96, -1, 0, 0, 20, -1, 16277), + (16287, -1, -1, 16287, 16287, 7, 96, -1, 0, 0, 20, -1, 16288), + (16296, 16296, 16296, 16296, 16296, 13, 100, 41168, 60, 30, 20, -1, -1), + (16297, -1, -1, 6337, 6337, 6, 96, -1, 0, 0, 20, 10155, 16298), + (16300, -1, -1, 16300, 16300, 9, 100, -1, 0, 0, 20, -1, 16301), + (16303, -1, -1, 12721, 12721, 9, 96, 0, 0, 0, 20, 12723, 16304), + (16306, -1, -1, 6340, 6340, 6, 96, -1, 0, 0, 20, 7453, -1), + (16310, 16310, 16310, 16310, 16310, 12, 100, 41169, 97, 600, 20, -1, -1), + (16317, -1, -1, 16317, 16317, 5, 100, -1, 0, 0, 20, -1, 16318), + (16324, 6607, 6607, 6607, 16324, 9, 96, 16491, 61, 600, 20, 6609, 16325), + (16327, -1, -1, 6362, 6362, 7, 96, 0, 0, 0, 20, 6366, 16328), + (16330, -1, -1, 16330, 16330, 9, 96, -1, 0, 0, 20, -1, 16331), + (16336, -1, -1, 16336, 16336, 7, 96, -1, 0, 0, 20, -1, 16337), + (16339, -1, -1, 16339, 16339, 7, 96, -1, 0, 0, 20, -1, 16340), + (16342, -1, -1, 16342, 16342, 7, 96, -1, 0, 0, 20, -1, 16343), + (16360, 16360, 16360, 16360, 16360, 9, 100, 41188, 91, 6, 20, -1, -1), + (16361, -1, -1, 9509, 9509, 7, 96, -1, 0, 0, 20, 9515, -1), + (16363, 16363, 16363, 16363, 16363, 12, 96, 41193, 89, 1800, 20, -1, 16364), + (16366, -1, -1, 16366, 16366, 12, 96, -1, 0, 0, 20, -1, 16367), + (16369, 16369, 16369, 16369, 16369, 15, 100, 41196, 98, 12, 20, -1, -1), + (16370, 16370, -1, 16370, 16370, 5, 100, 41197, 98, 12, 20, -1, -1), + (16371, -1, -1, 16371, 16371, 3, 96, -1, 0, 0, 20, -1, 16372), + (16380, -1, -1, 16380, 16380, 5, 96, -1, 0, 0, 20, -1, 16381), + (16386, -1, -1, 16386, 16386, 7, 96, -1, 0, 0, 20, -1, 16387), + (16392, -1, -1, 16392, 16392, 5, 96, -1, 0, 0, 20, -1, 16393), + (16395, 16395, 16395, 16395, 16395, 7, 100, 41305, 93, 10, 20, -1, -1), + (16396, -1, -1, 16396, 16396, 7, 96, -1, 0, 0, 20, -1, 16397), + (16402, -1, -1, 6112, 6112, 5, 96, -1, 0, 0, 20, 12967, 16403), + (16414, -1, -1, 1056, 1056, 5, 101, -1, 0, 0, 21, 7525, 16415), + (16419, -1, -1, 12636, 12636, 0, 1, -1, 0, 0, 16, 8447, 16420), + (16420, -1, -1, 12636, 12636, 0, 1, -1, 0, 0, 16, 16419, 16421), + (16421, -1, -1, 12636, 12636, 0, 1, -1, 0, 0, 16, 16420, -1), + (16440, -1, -1, 6540, 6540, 10, 101, -1, 0, 0, 21, 12510, 16441), + (16475, -1, -1, 8201, 8201, 9, 101, -1, 0, 0, 21, 8203, 16476), + (16489, -1, -1, 1107, 1107, 9, 101, -1, 0, 0, 21, 12558, 16490), + (16536, -1, -1, 16536, 16536, 5, 101, -1, 0, 0, 21, -1, 16537), + (16604, -1, -1, 849, 849, 11, 105, -1, 0, 0, 21, 10622, -1), + (16644, -1, -1, 16644, 16644, 11, 101, -1, 0, 0, 21, -1, 16645), + (16666, -1, -1, 16666, 16666, 9, 101, -1, 0, 0, 21, -1, 16667), + (16716, 6764, 6764, 6764, 6764, 12, 105, 41308, 52, 600, 21, 10057, -1), + (16730, -1, -1, 1608, 1608, 13, 101, -1, 0, 0, 21, 10069, 16731), + (16745, -1, -1, 16745, 16745, 9, 101, -1, 0, 0, 21, -1, 16746), + (16883, 1119, 1119, 1119, 1119, 12, 101, 41594, 8, 900, 21, 10299, 16884), + (16887, -1, -1, 729, 729, 11, 101, -1, 0, 0, 21, 10307, 16888), + (16890, -1, -1, 724, 724, 15, 101, -1, 0, 0, 21, 7493, 16891), + (17004, -1, -1, 556, 556, 7, 101, -1, 0, 0, 21, 1567, 17005), + (17030, 4857, 4857, 4857, 4857, 15, 101, 41660, 7, 600, 21, 5769, 17031), + (17131, 12785, 12785, 12785, 12785, 15, 105, 41736, 80, 30, 21, 12785, -1), + (17199, 17199, 17199, 17199, 17199, 100, 51, 41819, 31, 2, 21, -1, -1), + (17206, -1, -1, 10588, 10588, 7, 101, 0, 0, 0, 21, 10592, 17207), + (17209, -1, -1, 17209, 17209, 9, 101, -1, 0, 0, 21, -1, 17210), + (17212, -1, -1, 17212, 17212, 12, 101, -1, 0, 0, 21, -1, 17213), + (17215, -1, -1, 17215, 17215, 12, 101, -1, 0, 0, 21, -1, 17216), + (17218, -1, -1, 17218, 17218, 9, 101, -1, 0, 0, 21, -1, 17219), + (17229, -1, -1, 17229, 17229, 9, 101, -1, 0, 0, 21, -1, 17230), + (17235, -1, -1, 17235, 17235, 15, 101, -1, 0, 0, 21, -1, 17236), + (17238, 17238, 17238, 17238, 17238, 24, 105, 41808, 10, 900, 21, -1, -1), + (17239, -1, -1, 6489, 6489, 12, 101, -1, 0, 0, 21, 6491, -1), + (17242, -1, -1, 17242, 17242, 12, 101, -1, 0, 0, 21, -1, 17243), + (17245, -1, -1, 17245, 17245, 12, 101, -1, 0, 0, 21, -1, 17246), + (17248, 17248, 17248, 17248, 17248, 24, 105, 41811, 93, 1080, 21, -1, -1), + (17249, -1, -1, 17249, 17249, 12, 101, -1, 0, 0, 21, -1, 17250), + (17252, -1, -1, 17252, 17252, 9, 101, -1, 0, 0, 21, -1, 17253), + (17256, 17256, 17256, 17256, 17256, 21, 105, 41815, 93, 360, 21, -1, -1), + (17257, 17257, 17257, 17257, 17257, 21, 105, 41816, 98, 300, 21, -1, -1), + (17258, -1, -1, 17258, 17258, 15, 101, 0, 0, 0, 21, -1, 17259), + (17267, -1, -1, 17267, 17267, 9, 101, -1, 0, 0, 21, -1, 17268), + (17273, 17273, 17273, 17273, 17273, 15, 101, 41830, 98, 720, 21, -1, -1), + (17276, 1569, 1569, 1569, 1569, 9, 101, 41831, 5, 1800, 21, 10161, 17277), + (17280, 17280, 17280, 17280, 17280, 21, 105, 41834, 97, 720, 21, -1, -1), + (17281, -1, -1, 17281, 17281, 15, 105, -1, 0, 0, 21, -1, -1), + (17288, -1, -1, 17288, 17288, 9, 105, -1, 0, 0, 21, 7317, -1), + (17289, -1, -1, 17289, 17289, 7, 101, -1, 0, 0, 21, -1, 17290), + (17295, -1, -1, 692, 692, 12, 101, -1, 0, 0, 21, 12769, 17296), + (17298, 749, 749, 749, 749, 15, 105, 41837, 11, 1800, 21, 1208, -1), + (17307, -1, -1, 17307, 17307, 9, 101, -1, 0, 0, 21, -1, 17308), + (17310, -1, -1, 7945, 7945, 9, 105, -1, 0, 0, 21, 10347, -1), + (17311, 970, 970, 970, 970, 9, 101, 41845, 6, 1800, 21, 1326, 17312), + (17317, -1, -1, 17317, 17317, 9, 101, -1, 0, 0, 21, -1, 17318), + (17328, 17328, 17328, 17328, 17328, 21, 105, 41854, 87, 600, 21, -1, -1), + (17329, 17329, 17329, 17329, 17329, 12, 101, 41855, 88, 20, 21, -1, -1), + (17333, 153, 153, 153, 153, 18, 105, 41856, 3, 2160, 21, 12996, -1), + (17334, -1, -1, 12977, 12977, 12, 102, 0, 0, 0, 21, 12981, 17335), + (17336, -1, -1, 17336, 17336, 9, 101, -1, 0, 0, 21, -1, 17337), + (17339, -1, -1, 17339, 17339, 9, 101, -1, 0, 0, 21, -1, 17340), + (17342, 17342, 17342, 17342, 17342, 15, 105, 41857, 85, 60, 21, -1, -1), + (17344, 17344, 17344, 17344, 17344, 15, 101, 41858, 94, 780, 21, -1, 17345), + (17347, 17347, 17347, 17347, 17347, 12, 101, 41861, 32, 30, 21, -1, 17348), + (17350, -1, -1, 7664, 7664, 5, 102, -1, 0, 0, 21, 10109, 17351), + (17357, -1, -1, 17357, 17357, 9, 96, -1, 0, 0, 19, -1, 17358), + (17361, -1, -1, 17361, 17361, 5, 100, -1, 0, 0, 21, -1, 17362), + (17364, 17364, 17364, 17364, 17364, 15, 105, 46160, 87, 120, 21, -1, -1), + (17365, -1, -1, 10792, 10792, 15, 101, 0, 0, 0, 21, 10796, 17366), + (17370, -1, -1, 17370, 17370, 15, 102, 0, 0, 0, 21, -1, 17371), + (17372, 17372, 17372, 17372, 17372, 18, 104, 46161, 85, 300, 21, -1, -1), + (17373, 17373, -1, 17373, 17373, 15, 105, 46162, 98, 900, 21, -1, -1), + (17375, -1, -1, 17375, 17375, 12, 101, -1, 0, 0, 21, -1, 17376), + (17378, 17378, 17378, 17378, 17378, 10, 101, 46164, 97, 3, 21, -1, -1), + (17379, 17378, 17378, 17378, 17378, 10, 101, 46165, 86, 3, 21, -1, -1), + (17380, 17378, 17378, 17378, 17378, 10, 101, 46166, 97, 3, 21, -1, -1), + (17382, 5015, 5015, 5015, 5015, 15, 103, 46168, 9, 900, 21, 10301, -1), + (17384, 17384, 17384, 17384, 17384, 18, 101, 46171, 10, 20, 21, -1, -1), + (17391, -1, -1, 495, 495, 12, 105, -1, 0, 0, 21, 10668, -1), + (17406, -1, -1, 10653, 10653, 12, 103, -1, 0, 0, 21, 10655, -1), + (17409, -1, -1, 17409, 17409, 15, 105, -1, 0, 0, 21, -1, -1), + (17414, -1, -1, 17414, 17414, 9, 101, -1, 0, 0, 21, -1, 17415), + (17418, -1, -1, 17418, 17418, 7, 101, -1, 0, 0, 21, -1, 17419), + (17428, 17428, 17428, 17428, 17428, 15, 101, 46178, 0, 0, 21, -1, 17429), + (17436, -1, -1, 17436, 17436, 7, 101, -1, 0, 0, 21, -1, 17437), + (17439, -1, -1, 17439, 17439, 9, 102, -1, 0, 0, 21, -1, 17440), + (17441, -1, -1, 255, 255, 15, 102, -1, 0, 0, 21, 7633, -1), + (17445, -1, -1, 17445, 17445, 15, 101, 0, 0, 0, 21, -1, 17446), + (17448, -1, -1, 17448, 17448, 15, 102, 0, 0, 0, 21, -1, 17449), + (17476, -1, -1, 10800, 10800, 15, 101, -1, 0, 0, 21, 10802, 17477), + (17486, 12864, -1, 12864, 12864, 12, 105, 46195, 73, 10, 21, 12864, -1), + (17492, -1, -1, 17492, 17492, 9, 101, -1, 0, 0, 21, -1, 17493), + (17495, -1, -1, 17495, 17495, 9, 101, -1, 0, 0, 21, -1, 17496), + (17515, -1, -1, 17515, 17515, 7, 102, -1, 0, 0, 21, -1, 17516), + (17517, -1, -1, 17517, 17517, 9, 101, -1, 0, 0, 21, -1, 17518), + (17522, -1, -1, 17522, 17522, 9, 101, -1, 0, 0, 21, -1, 17523), + (17533, -1, -1, 17533, 17533, 15, 105, -1, 0, 0, 21, -1, -1), + (17534, 6828, 6828, 6828, 6828, 15, 105, 46207, 43, 60, 21, 10208, -1), + (17535, 967, 967, 967, 967, 9, 101, 46208, 10, 1800, 21, 12791, 17536), + (17538, 17538, 17538, 17538, 17538, 21, 105, 46212, 91, 1800, 21, -1, -1), + (17539, 4934, 4934, 4934, 4934, 12, 105, 46214, 13, 300, 21, 10278, -1), + (17540, 4935, 4935, 4935, 4935, 12, 105, 46215, 14, 300, 21, 10277, -1), + (17541, 8038, 8038, 8038, 8038, 12, 105, 46217, 56, 12, 21, 8038, -1), + (17547, -1, -1, 17547, 17547, 12, 102, -1, 0, 0, 21, -1, 17548), + (17549, -1, -1, 17549, 17549, 9, 101, -1, 0, 0, 21, -1, 17550), + (17553, -1, -1, 17553, 17553, 18, 105, -1, 0, 0, 21, -1, -1), + (17554, -1, -1, 17554, 17554, 15, 105, -1, 0, 0, 21, -1, -1), + (17555, -1, -1, 17555, 17555, 5, 101, -1, 0, 0, 21, -1, 17556), + (17558, -1, -1, 17558, 17558, 5, 101, -1, 0, 0, 21, -1, 17559), + (17561, -1, -1, 17561, 17561, 5, 101, -1, 0, 0, 21, -1, 17562), + (17564, -1, -1, 17564, 17564, 5, 101, -1, 0, 0, 21, -1, 17565), + (17567, -1, -1, 17567, 17567, 5, 101, -1, 0, 0, 21, -1, 17568), + (17570, -1, -1, 17570, 17570, 5, 101, -1, 0, 0, 21, -1, 17571), + (17573, -1, -1, 17573, 17573, 5, 101, -1, 0, 0, 21, -1, 17574), + (17576, -1, -1, 17576, 17576, 5, 101, -1, 0, 0, 21, -1, 17577), + (17579, -1, -1, 17579, 17579, 5, 101, -1, 0, 0, 21, -1, 17580), + (17582, -1, -1, 17582, 17582, 5, 101, -1, 0, 0, 21, -1, 17583), + (17585, -1, -1, 17585, 17585, 5, 101, -1, 0, 0, 21, -1, 17586), + (17588, -1, -1, 17588, 17588, 5, 101, -1, 0, 0, 21, -1, 17589), + (17591, -1, -1, 17591, 17591, 5, 101, -1, 0, 0, 21, -1, 17592), + (17594, -1, -1, 17594, 17594, 5, 101, -1, 0, 0, 21, -1, 17595), + (17597, -1, -1, 17597, 17597, 5, 101, -1, 0, 0, 21, -1, 17598), + (17600, -1, -1, 17600, 17600, 5, 101, -1, 0, 0, 21, -1, 17601), + (17603, -1, -1, 17603, 17603, 5, 101, -1, 0, 0, 21, -1, 17604), + (17606, -1, -1, 17606, 17606, 5, 101, -1, 0, 0, 21, -1, 17607), + (17609, -1, -1, 17609, 17609, 5, 101, -1, 0, 0, 21, -1, 17610), + (17612, -1, -1, 17612, 17612, 5, 101, -1, 0, 0, 21, -1, 17613), + (17615, -1, -1, 17615, 17615, 5, 101, -1, 0, 0, 21, -1, 17616), + (17618, -1, -1, 17618, 17618, 5, 101, -1, 0, 0, 21, -1, 17619), + (17621, -1, -1, 17621, 17621, 5, 101, -1, 0, 0, 21, -1, 17622), + (17624, -1, -1, 17624, 17624, 5, 101, -1, 0, 0, 21, -1, 17625), + (17627, -1, -1, 17627, 17627, 5, 101, -1, 0, 0, 21, -1, 17628), + (17630, -1, -1, 17630, 17630, 5, 101, -1, 0, 0, 21, -1, 17631), + (17633, -1, -1, 17633, 17633, 5, 101, -1, 0, 0, 21, -1, 17634), + (17639, -1, -1, 17639, 17639, 9, 91, 0, 0, 0, 18, -1, 17640), + (18972, -1, -1, 279, 279, 15, 105, -1, 0, 0, 21, 279, -1), + (30050, -1, -1, 30050, 30050, 0, 1, -1, 0, 0, 0, -1, 30051), + (30100, -1, -1, 30100, 30100, 0, 1, -1, 0, 0, 0, -1, 30101), + (30150, -1, -1, 30150, 30150, 0, 1, -1, 0, 0, 0, -1, 30151), + (30175, -1, -1, 30175, 30175, 0, 1, -1, 0, 0, 0, -1, 30176), + (30180, -1, -1, 30180, 30180, 0, 1, -1, 0, 0, 0, -1, 30181), + (30185, -1, -1, 30185, 30185, 0, 1, -1, 0, 0, 0, -1, 30186), + (30190, -1, -1, 30190, 30190, 0, 1, -1, 0, 0, 0, -1, 30191), + (30195, -1, -1, 30195, 30195, 0, 1, -1, 0, 0, 0, -1, 30196), + (49999, -1, -1, -1, -1, 0, 71, 0, 0, 0, 0, -1, 1); + +-- Dumping structure for table eqdb.aa_rank_effects +DROP TABLE IF EXISTS `aa_rank_effects`; +CREATE TABLE IF NOT EXISTS `aa_rank_effects` ( + `rank_id` int(10) unsigned NOT NULL, + `slot` int(10) unsigned NOT NULL DEFAULT '1', + `effect_id` int(10) NOT NULL DEFAULT '0', + `base1` int(10) NOT NULL DEFAULT '0', + `base2` int(10) NOT NULL DEFAULT '0', + PRIMARY KEY (`rank_id`,`slot`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +INSERT INTO `aa_rank_effects` (`rank_id`, `slot`, `effect_id`, `base1`, `base2`) VALUES + (2, 1, 4, 2, 0), + (3, 1, 4, 4, 0), + (4, 1, 4, 6, 0), + (5, 1, 4, 8, 0), + (6, 1, 4, 10, 0), + (7, 1, 7, 2, 0), + (8, 1, 7, 4, 0), + (9, 1, 7, 6, 0), + (10, 1, 7, 8, 0), + (11, 1, 7, 10, 0), + (12, 1, 6, 2, 0), + (13, 1, 6, 4, 0), + (14, 1, 6, 6, 0), + (15, 1, 6, 8, 0), + (16, 1, 6, 10, 0), + (17, 1, 5, 2, 0), + (18, 1, 5, 4, 0), + (19, 1, 5, 6, 0), + (20, 1, 5, 8, 0), + (21, 1, 5, 10, 0), + (22, 1, 8, 2, 0), + (23, 1, 8, 4, 0), + (24, 1, 8, 6, 0), + (25, 1, 8, 8, 0), + (26, 1, 8, 10, 0), + (27, 1, 9, 2, 0), + (28, 1, 9, 4, 0), + (29, 1, 9, 6, 0), + (30, 1, 9, 8, 0), + (31, 1, 9, 10, 0), + (32, 1, 10, 2, 0), + (33, 1, 10, 4, 0), + (34, 1, 10, 6, 0), + (35, 1, 10, 8, 0), + (36, 1, 10, 10, 0), + (37, 1, 46, 2, 0), + (38, 1, 46, 4, 0), + (39, 1, 46, 6, 0), + (40, 1, 46, 8, 0), + (41, 1, 46, 10, 0), + (42, 1, 47, 2, 0), + (43, 1, 47, 4, 0), + (44, 1, 47, 6, 0), + (45, 1, 47, 8, 0), + (46, 1, 47, 10, 0), + (47, 1, 50, 2, 0), + (48, 1, 50, 4, 0), + (49, 1, 50, 6, 0), + (50, 1, 50, 8, 0), + (51, 1, 50, 10, 0), + (52, 1, 48, 2, 0), + (53, 1, 48, 4, 0), + (54, 1, 48, 6, 0), + (55, 1, 48, 8, 0), + (56, 1, 48, 10, 0), + (57, 1, 49, 2, 0), + (58, 1, 49, 4, 0), + (59, 1, 49, 6, 0), + (60, 1, 49, 8, 0), + (61, 1, 49, 10, 0), + (62, 1, 271, 8, 0), + (63, 1, 271, 14, 0), + (64, 1, 271, 21, 0), + (68, 1, 233, 110, 0), + (69, 1, 233, 125, 0), + (70, 1, 233, 150, 0), + (71, 1, 246, 110, 0), + (72, 1, 246, 125, 0), + (73, 1, 246, 150, 0), + (74, 1, 269, 10, 0), + (75, 1, 269, 20, 0), + (76, 1, 269, 30, 0), + (77, 1, 125, 2, 2), + (77, 2, 137, 0, 0), + (77, 3, 141, 1, 0), + (77, 4, 139, -6233, 0), + (77, 5, 139, -6265, 0), + (77, 6, 125, 2, 2), + (77, 7, 137, 147, 0), + (77, 8, 141, 1, 0), + (78, 1, 125, 5, 5), + (78, 2, 137, 0, 0), + (78, 3, 141, 1, 0), + (78, 4, 139, -6233, 0), + (78, 5, 139, -6265, 0), + (78, 6, 125, 5, 5), + (78, 7, 137, 147, 0), + (78, 8, 141, 1, 0), + (79, 1, 125, 10, 10), + (79, 2, 137, 0, 0), + (79, 3, 141, 1, 0), + (79, 4, 139, -6233, 0), + (79, 5, 139, -6265, 0), + (79, 6, 125, 10, 10), + (79, 7, 137, 147, 0), + (79, 8, 141, 1, 0), + (80, 1, 274, 3, 0), + (81, 1, 274, 6, 0), + (82, 1, 274, 10, 0), + (83, 1, 132, 2, 2), + (84, 1, 132, 5, 5), + (85, 1, 132, 10, 10), + (86, 1, 128, 5, 5), + (86, 2, 138, 1, 0), + (86, 3, 140, 1, 0), + (86, 4, 139, -2741, 0), + (86, 5, 139, -16843, 0), + (86, 6, 385, -16192, 0), + (86, 7, 385, -10547, 0), + (86, 8, 385, -13543, 0), + (87, 1, 128, 15, 15), + (87, 2, 138, 1, 0), + (87, 3, 140, 1, 0), + (87, 4, 139, -2741, 0), + (87, 5, 139, -16843, 0), + (87, 6, 385, -16192, 0), + (87, 7, 385, -10547, 0), + (87, 8, 385, -13543, 0), + (88, 1, 128, 30, 30), + (88, 2, 138, 1, 0), + (88, 3, 140, 1, 0), + (88, 4, 139, -2741, 0), + (88, 5, 139, -16843, 0), + (88, 6, 385, -16192, 0), + (88, 7, 385, -10547, 0), + (88, 8, 385, -13543, 0), + (92, 1, 294, 2, 100), + (93, 1, 294, 4, 100), + (94, 1, 294, 7, 100), + (98, 1, 114, -5, 0), + (99, 1, 114, -10, 0), + (100, 1, 114, -20, 0), + (101, 1, 265, 20, 0), + (102, 1, 265, 40, 0), + (103, 1, 265, 52, 0), + (104, 1, 127, 10, 10), + (104, 2, 138, 1, 0), + (104, 3, 140, 1, 0), + (104, 4, 143, 3000, 0), + (105, 1, 127, 25, 25), + (105, 2, 138, 1, 0), + (105, 3, 140, 1, 0), + (105, 4, 143, 3000, 0), + (106, 1, 127, 50, 50), + (106, 2, 138, 1, 0), + (106, 3, 140, 1, 0), + (106, 4, 143, 3000, 0), + (107, 1, 214, 200, 0), + (108, 1, 214, 500, 0), + (109, 1, 214, 1000, 0), + (110, 1, 0, 1, 0), + (111, 1, 0, 2, 0), + (112, 1, 0, 3, 0), + (113, 1, 169, 15, -1), + (114, 1, 169, 40, -1), + (115, 1, 169, 75, -1), + (116, 1, 181, 5, 0), + (117, 1, 181, 10, 0), + (118, 1, 181, 25, 0), + (119, 1, 278, 500, 16000), + (119, 2, 440, 50, 100), + (120, 1, 278, 510, 17102), + (120, 2, 440, 52, 100), + (121, 1, 278, 520, 19635), + (121, 2, 440, 54, 100), + (122, 1, 259, 2, 0), + (123, 1, 259, 5, 0), + (124, 1, 259, 10, 0), + (125, 1, 172, 2, 0), + (126, 1, 172, 5, 0), + (127, 1, 172, 10, 0), + (137, 1, 127, 10, 10), + (137, 2, 137, 88, 0), + (138, 1, 127, 25, 25), + (138, 2, 137, 88, 0), + (139, 1, 127, 50, 50), + (139, 2, 137, 88, 0), + (141, 1, 127, 2, 2), + (141, 2, 137, 0, 0), + (141, 3, 138, 0, 0), + (141, 4, 141, 1, 0), + (141, 5, 143, 3000, 0), + (141, 6, 127, 2, 2), + (141, 7, 385, 16555, 0), + (141, 8, 385, 16655, 0), + (142, 1, 127, 5, 5), + (142, 2, 137, 0, 0), + (142, 3, 138, 0, 0), + (142, 4, 141, 1, 0), + (142, 5, 143, 3000, 0), + (142, 6, 127, 5, 5), + (142, 7, 385, 16555, 0), + (142, 8, 385, 16655, 0), + (143, 1, 127, 10, 10), + (143, 2, 137, 0, 0), + (143, 3, 138, 0, 0), + (143, 4, 141, 1, 0), + (143, 5, 143, 3000, 0), + (143, 6, 127, 10, 10), + (143, 7, 385, 16555, 0), + (143, 8, 385, 16655, 0), + (144, 1, 244, 50, 0), + (147, 1, 127, 10, 10), + (147, 2, 138, 1, 0), + (147, 3, 140, 1, 0), + (147, 4, 143, 3000, 0), + (148, 1, 127, 25, 25), + (148, 2, 138, 1, 0), + (148, 3, 140, 1, 0), + (148, 4, 143, 3000, 0), + (149, 1, 127, 50, 50), + (149, 2, 138, 1, 0), + (149, 3, 140, 1, 0), + (149, 4, 143, 3000, 0), + (150, 1, 268, 10, 59), + (151, 1, 268, 25, 59), + (152, 1, 268, 50, 59), + (158, 1, 238, 1, 0), + (159, 1, 268, 10, 68), + (160, 1, 268, 25, 68), + (161, 1, 268, 50, 68), + (182, 1, 131, 100, 0), + (182, 2, 137, 33, 0), + (190, 1, 219, 225, 680), + (191, 1, 219, 235, 1190), + (192, 1, 219, 240, 1700), + (195, 1, 181, 100, 0), + (196, 1, 226, 1, 0), + (198, 1, 276, 32, 0), + (199, 1, 301, 30, 0), + (200, 1, 301, 60, 0), + (201, 1, 301, 100, 0), + (205, 1, 251, 100, 0), + (210, 1, 302, 50, 50), + (210, 2, 385, 99, 0), + (211, 1, 302, 100, 100), + (211, 2, 385, 99, 0), + (212, 1, 302, 200, 200), + (212, 2, 385, 99, 0), + (213, 1, 260, 2, 23), + (213, 2, 260, 2, 24), + (213, 3, 260, 2, 25), + (213, 4, 260, 2, 26), + (214, 1, 260, 4, 23), + (214, 2, 260, 4, 24), + (214, 3, 260, 4, 25), + (214, 4, 260, 4, 26), + (215, 1, 260, 6, 23), + (215, 2, 260, 6, 24), + (215, 3, 260, 6, 25), + (215, 4, 260, 6, 26), + (225, 1, 272, 1, 0), + (226, 1, 272, 3, 0), + (227, 1, 272, 5, 0), + (230, 1, 275, 10, 0), + (231, 1, 275, 20, 0), + (232, 1, 275, 30, 0), + (237, 1, 227, 1, 25), + (238, 1, 227, 3, 25), + (239, 1, 227, 5, 25), + (240, 1, 224, 20, 26), + (240, 2, 173, 1, 0), + (241, 1, 224, 35, 26), + (241, 2, 173, 2, 0), + (242, 1, 224, 50, 26), + (242, 2, 173, 3, 0), + (244, 1, 268, 10, 56), + (244, 2, 234, 7500, 0), + (245, 1, 268, 25, 56), + (245, 2, 234, 5000, 0), + (246, 1, 268, 50, 56), + (246, 2, 234, 2500, 0), + (247, 1, 224, 15, 0), + (248, 1, 224, 30, 0), + (249, 1, 224, 50, 0), + (255, 1, 279, 7, 0), + (256, 1, 279, 11, 0), + (257, 1, 279, 15, 0), + (263, 1, 282, 10, 0), + (264, 1, 282, 25, 0), + (265, 1, 282, 50, 0), + (266, 1, 128, 50, 50), + (266, 2, 138, 1, 0), + (266, 3, 140, 1, 0), + (266, 4, 139, -2741, 0), + (266, 5, 139, -16843, 0), + (266, 6, 385, -16192, 0), + (266, 7, 385, -10547, 0), + (266, 8, 385, -13543, 0), + (267, 1, 294, 2, 100), + (268, 1, 294, 4, 100), + (269, 1, 294, 6, 100), + (273, 1, 288, 1000, 21), + (275, 1, 260, 2, 50), + (276, 1, 260, 4, 50), + (277, 1, 260, 6, 50), + (278, 1, 0, 1, 0), + (278, 2, 15, 1, 0), + (279, 1, 214, 200, 0), + (279, 2, 259, 2, 0), + (279, 3, 172, 2, 0), + (280, 1, 227, 1, 62), + (280, 2, 227, 1, 17), + (281, 1, 227, 3, 62), + (281, 2, 227, 3, 17), + (282, 1, 227, 5, 62), + (282, 2, 227, 5, 17), + (283, 1, 228, 10, 0), + (284, 1, 228, 20, 0), + (285, 1, 228, 30, 0), + (286, 1, 10, 0, 0), + (287, 1, 253, 1, 0), + (288, 1, 257, 1, 0), + (288, 2, 267, 1, 31), + (288, 3, 267, 1, 32), + (288, 4, 267, 1, 33), + (288, 5, 267, 1, 15), + (288, 6, 267, 1, 16), + (288, 7, 267, 1, 17), + (288, 8, 267, 1, 18), + (288, 9, 267, 1, 19), + (288, 10, 267, 1, 20), + (292, 1, 4, 12, 0), + (293, 1, 4, 14, 0), + (294, 1, 4, 16, 0), + (295, 1, 4, 18, 0), + (296, 1, 4, 20, 0), + (297, 1, 4, 22, 0), + (298, 1, 4, 24, 0), + (299, 1, 4, 26, 0), + (300, 1, 4, 28, 0), + (301, 1, 4, 30, 0), + (302, 1, 7, 12, 0), + (303, 1, 7, 14, 0), + (304, 1, 7, 16, 0), + (305, 1, 7, 18, 0), + (306, 1, 7, 20, 0), + (307, 1, 7, 22, 0), + (308, 1, 7, 24, 0), + (309, 1, 7, 26, 0), + (310, 1, 7, 28, 0), + (311, 1, 7, 30, 0), + (312, 1, 6, 12, 0), + (313, 1, 6, 14, 0), + (314, 1, 6, 16, 0), + (315, 1, 6, 18, 0), + (316, 1, 6, 20, 0), + (317, 1, 6, 22, 0), + (318, 1, 6, 24, 0), + (319, 1, 6, 26, 0), + (320, 1, 6, 28, 0), + (321, 1, 6, 30, 0), + (322, 1, 5, 12, 0), + (323, 1, 5, 14, 0), + (324, 1, 5, 16, 0), + (325, 1, 5, 18, 0), + (326, 1, 5, 20, 0), + (327, 1, 5, 22, 0), + (328, 1, 5, 24, 0), + (329, 1, 5, 26, 0), + (330, 1, 5, 28, 0), + (331, 1, 5, 30, 0), + (332, 1, 8, 12, 0), + (333, 1, 8, 14, 0), + (334, 1, 8, 16, 0), + (335, 1, 8, 18, 0), + (336, 1, 8, 20, 0), + (337, 1, 8, 22, 0), + (338, 1, 8, 24, 0), + (339, 1, 8, 26, 0), + (340, 1, 8, 28, 0), + (341, 1, 8, 30, 0), + (342, 1, 9, 12, 0), + (343, 1, 9, 14, 0), + (344, 1, 9, 16, 0), + (345, 1, 9, 18, 0), + (346, 1, 9, 20, 0), + (347, 1, 9, 22, 0), + (348, 1, 9, 24, 0), + (349, 1, 9, 26, 0), + (350, 1, 9, 28, 0), + (351, 1, 9, 30, 0), + (352, 1, 10, 12, 0), + (353, 1, 10, 14, 0), + (354, 1, 10, 16, 0), + (355, 1, 10, 18, 0), + (356, 1, 10, 20, 0), + (357, 1, 10, 22, 0), + (358, 1, 10, 24, 0), + (359, 1, 10, 26, 0), + (360, 1, 10, 28, 0), + (361, 1, 10, 30, 0), + (362, 1, 46, 12, 0), + (363, 1, 46, 14, 0), + (364, 1, 46, 16, 0), + (365, 1, 46, 18, 0), + (366, 1, 46, 20, 0), + (367, 1, 46, 22, 0), + (368, 1, 46, 24, 0), + (369, 1, 46, 26, 0), + (370, 1, 46, 28, 0), + (371, 1, 46, 30, 0), + (372, 1, 47, 12, 0), + (373, 1, 47, 14, 0), + (374, 1, 47, 16, 0), + (375, 1, 47, 18, 0), + (376, 1, 47, 20, 0), + (377, 1, 47, 22, 0), + (378, 1, 47, 24, 0), + (379, 1, 47, 26, 0), + (380, 1, 47, 28, 0), + (381, 1, 47, 30, 0), + (382, 1, 50, 12, 0), + (383, 1, 50, 14, 0), + (384, 1, 50, 16, 0), + (385, 1, 50, 18, 0), + (386, 1, 50, 20, 0), + (387, 1, 50, 22, 0), + (388, 1, 50, 24, 0), + (389, 1, 50, 26, 0), + (390, 1, 50, 28, 0), + (391, 1, 50, 30, 0), + (392, 1, 48, 12, 0), + (393, 1, 48, 14, 0), + (394, 1, 48, 16, 0), + (395, 1, 48, 18, 0), + (396, 1, 48, 20, 0), + (397, 1, 48, 22, 0), + (398, 1, 48, 24, 0), + (399, 1, 48, 26, 0), + (400, 1, 48, 28, 0), + (401, 1, 48, 30, 0), + (402, 1, 49, 12, 0), + (403, 1, 49, 14, 0), + (404, 1, 49, 16, 0), + (405, 1, 49, 18, 0), + (406, 1, 49, 20, 0), + (407, 1, 49, 22, 0), + (408, 1, 49, 24, 0), + (409, 1, 49, 26, 0), + (410, 1, 49, 28, 0), + (411, 1, 49, 30, 0), + (412, 1, 263, 1, 0), + (413, 1, 263, 2, 0), + (414, 1, 263, 3, 0), + (415, 1, 263, 4, 0), + (416, 1, 263, 5, 0), + (417, 1, 263, 6, 0), + (418, 1, 262, 5, 0), + (418, 2, 262, 5, 1), + (418, 3, 262, 5, 2), + (418, 4, 262, 5, 3), + (418, 5, 262, 5, 4), + (418, 6, 262, 5, 5), + (418, 7, 262, 5, 6), + (419, 1, 262, 10, 0), + (419, 2, 262, 10, 1), + (419, 3, 262, 10, 2), + (419, 4, 262, 10, 3), + (419, 5, 262, 10, 4), + (419, 6, 262, 10, 5), + (419, 7, 262, 10, 6), + (420, 1, 262, 15, 0), + (420, 2, 262, 15, 1), + (420, 3, 262, 15, 2), + (420, 4, 262, 15, 3), + (420, 5, 262, 15, 4), + (420, 6, 262, 15, 5), + (420, 7, 262, 15, 6), + (421, 1, 262, 20, 0), + (421, 2, 262, 20, 1), + (421, 3, 262, 20, 2), + (421, 4, 262, 20, 3), + (421, 5, 262, 20, 4), + (421, 6, 262, 20, 5), + (421, 7, 262, 20, 6), + (422, 1, 262, 25, 0), + (422, 2, 262, 25, 1), + (422, 3, 262, 25, 2), + (422, 4, 262, 25, 3), + (422, 5, 262, 25, 4), + (422, 6, 262, 25, 5), + (422, 7, 262, 25, 6), + (423, 1, 214, 150, 0), + (424, 1, 214, 300, 0), + (425, 1, 214, 450, 0), + (426, 1, 262, 10, 5), + (426, 2, 262, 10, 4), + (427, 1, 262, 20, 5), + (427, 2, 262, 20, 4), + (428, 1, 262, 30, 5), + (428, 2, 262, 30, 4), + (429, 1, 262, 40, 5), + (429, 2, 262, 40, 4), + (430, 1, 262, 50, 5), + (430, 2, 262, 50, 4), + (434, 1, 125, 13, 13), + (434, 2, 137, 0, 0), + (434, 3, 141, 1, 0), + (434, 4, 139, -6233, 0), + (434, 5, 139, -6265, 0), + (434, 6, 125, 13, 13), + (434, 7, 137, 147, 0), + (434, 8, 141, 1, 0), + (435, 1, 125, 16, 16), + (435, 2, 137, 0, 0), + (435, 3, 141, 1, 0), + (435, 4, 139, -6233, 0), + (435, 5, 139, -6265, 0), + (435, 6, 125, 16, 16), + (435, 7, 137, 147, 0), + (435, 8, 141, 1, 0), + (436, 1, 125, 19, 19), + (436, 2, 137, 0, 0), + (436, 3, 141, 1, 0), + (436, 4, 139, -6233, 0), + (436, 5, 139, -6265, 0), + (436, 6, 125, 19, 19), + (436, 7, 137, 147, 0), + (436, 8, 141, 1, 0), + (437, 1, 274, 12, 0), + (438, 1, 274, 14, 0), + (439, 1, 274, 16, 0), + (440, 1, 278, 530, 21210), + (440, 2, 440, 56, 100), + (441, 1, 278, 540, 23160), + (441, 2, 440, 58, 100), + (442, 1, 278, 550, 25230), + (442, 2, 440, 60, 100), + (443, 1, 169, 100, -1), + (444, 1, 169, 125, -1), + (445, 1, 169, 150, -1), + (446, 1, 265, 54, 0), + (447, 1, 265, 56, 0), + (448, 1, 265, 58, 0), + (449, 1, 172, 13, 0), + (450, 1, 172, 16, 0), + (451, 1, 172, 19, 0), + (452, 1, 172, 22, 0), + (453, 1, 172, 25, 0), + (454, 1, 259, 13, 0), + (455, 1, 259, 16, 0), + (456, 1, 259, 19, 0), + (457, 1, 259, 22, 0), + (458, 1, 259, 25, 0), + (462, 1, 264, 60, 39), + (462, 2, 264, 864, 1061), + (463, 1, 264, 120, 39), + (463, 2, 264, 1728, 1061), + (464, 1, 264, 180, 39), + (464, 2, 264, 2592, 1061), + (468, 1, 264, 180, 41), + (469, 1, 264, 360, 41), + (470, 1, 264, 540, 41), + (471, 1, 264, 864, 57), + (471, 2, 264, 864, 616), + (472, 1, 264, 1728, 57), + (472, 2, 264, 1728, 616), + (473, 1, 264, 2592, 57), + (473, 2, 264, 2592, 616), + (474, 1, 264, 240, 50), + (475, 1, 264, 480, 50), + (476, 1, 264, 720, 50), + (477, 1, 264, 432, 43), + (478, 1, 264, 864, 43), + (479, 1, 264, 1296, 43), + (480, 1, 264, 432, 117), + (481, 1, 264, 864, 117), + (482, 1, 264, 1296, 117), + (483, 1, 264, 540, 58), + (483, 2, 264, 540, 418), + (484, 1, 264, 1080, 58), + (484, 2, 264, 1080, 418), + (485, 1, 264, 1620, 58), + (485, 2, 264, 1620, 418), + (489, 1, 264, 90, 110), + (490, 1, 264, 180, 110), + (491, 1, 264, 270, 110), + (492, 1, 264, 60, 109), + (493, 1, 264, 120, 109), + (494, 1, 264, 180, 109), + (495, 1, 264, 180, 98), + (496, 1, 264, 360, 98), + (497, 1, 264, 540, 98), + (498, 1, 264, 144, 102), + (499, 1, 264, 288, 102), + (500, 1, 264, 432, 102), + (501, 1, 264, 432, 107), + (502, 1, 264, 864, 107), + (503, 1, 264, 1296, 107), + (504, 1, 224, 110, 0), + (505, 1, 224, 120, 0), + (506, 1, 224, 130, 0), + (537, 1, 282, 60, 0), + (538, 1, 282, 75, 0), + (539, 1, 275, 68, 0), + (540, 1, 275, 76, 0), + (541, 1, 275, 84, 0), + (542, 1, 279, 17, 0), + (543, 1, 279, 19, 0), + (544, 1, 279, 21, 0), + (551, 1, 225, 3, 0), + (552, 1, 225, 6, 0), + (553, 1, 225, 9, 0), + (554, 1, 225, 12, 0), + (555, 1, 225, 15, 0), + (556, 1, 225, 3, 0), + (557, 1, 225, 6, 0), + (558, 1, 225, 9, 0), + (559, 1, 225, 12, 0), + (560, 1, 225, 15, 0), + (561, 1, 177, 3, -1), + (562, 1, 177, 6, -1), + (563, 1, 177, 9, -1), + (564, 1, 177, 3, -1), + (565, 1, 177, 6, -1), + (566, 1, 177, 9, -1), + (567, 1, 244, -12, 0), + (574, 1, 281, 25, 0), + (575, 1, 281, 50, 0), + (576, 1, 281, 75, 0), + (577, 1, 277, 20, 0), + (578, 1, 277, 40, 0), + (579, 1, 277, 60, 0), + (580, 1, 267, 1, 4), + (580, 2, 267, 1, 5), + (580, 3, 267, 1, 29), + (581, 1, 267, 1, 2), + (581, 2, 267, 1, 3), + (581, 3, 267, 1, 4), + (581, 4, 267, 1, 5), + (581, 5, 267, 1, 29), + (582, 1, 267, 1, 0), + (582, 2, 267, 1, 1), + (582, 3, 267, 1, 2), + (582, 4, 267, 1, 3), + (582, 5, 267, 1, 4), + (582, 6, 267, 1, 4), + (582, 7, 267, 1, 5), + (582, 8, 267, 1, 6), + (582, 9, 267, 1, 7), + (582, 10, 267, 1, 8), + (582, 11, 267, 1, 9), + (582, 12, 267, 1, 10), + (582, 13, 267, 1, 11), + (582, 14, 267, 1, 12), + (582, 15, 267, 1, 13), + (582, 16, 267, 1, 14), + (582, 17, 267, 1, 28), + (582, 18, 267, 1, 29), + (582, 19, 267, 1, 30), + (583, 1, 264, 7, 73), + (583, 2, 264, 7, 702), + (583, 3, 264, 7, 3826), + (583, 4, 264, 7, 7712), + (584, 1, 264, 14, 73), + (584, 2, 264, 14, 702), + (584, 3, 264, 14, 3826), + (584, 4, 264, 14, 7712), + (585, 1, 264, 21, 73), + (585, 2, 264, 21, 702), + (585, 3, 264, 21, 3826), + (585, 4, 264, 21, 7712), + (586, 1, 255, 12, 0), + (587, 1, 255, 24, 0), + (588, 1, 255, 36, 0), + (589, 1, 303, 500, 500), + (589, 2, 139, 2766, 0), + (590, 1, 303, 1000, 1000), + (590, 2, 139, 2766, 0), + (591, 1, 303, 1500, 1500), + (591, 2, 139, 2766, 0), + (593, 1, 264, 720, 6001), + (593, 2, 264, 720, 3676), + (594, 1, 264, 1440, 6001), + (594, 2, 264, 1440, 3676), + (595, 1, 264, 2160, 6001), + (595, 2, 264, 2160, 3676), + (596, 1, 264, 720, 6000), + (596, 2, 264, 720, 87), + (597, 1, 264, 1440, 6000), + (597, 2, 264, 1440, 87), + (598, 1, 264, 2160, 6000), + (598, 2, 264, 2160, 87), + (599, 1, 266, 2, 0), + (600, 1, 266, 5, 0), + (601, 1, 266, 8, 0), + (602, 1, 266, 2, 0), + (603, 1, 266, 5, 0), + (604, 1, 266, 8, 0), + (605, 1, 256, 1, 0), + (606, 1, 285, 20, 0), + (607, 1, 285, 40, 0), + (608, 1, 285, 60, 0), + (609, 1, 285, 80, 0), + (610, 1, 285, 100, 0), + (611, 1, 283, 20, 0), + (612, 1, 283, 40, 0), + (613, 1, 283, 60, 0), + (614, 1, 283, 80, 0), + (615, 1, 283, 100, 0), + (622, 1, 227, 1, 29), + (622, 2, 227, 1, 42), + (623, 1, 227, 2, 29), + (623, 2, 227, 2, 42), + (624, 1, 227, 3, 29), + (624, 2, 227, 3, 42), + (625, 1, 294, 3, 100), + (626, 1, 294, 6, 100), + (627, 1, 294, 9, 100), + (628, 1, 290, 5, 0), + (629, 1, 290, 10, 0), + (631, 1, 292, 15, 0), + (632, 1, 292, 30, 0), + (633, 1, 292, 45, 0), + (634, 1, 274, 3, 0), + (635, 1, 274, 6, 0), + (636, 1, 274, 10, 0), + (637, 1, 294, 2, 100), + (638, 1, 294, 4, 100), + (639, 1, 294, 6, 100), + (640, 1, 294, 7, 100), + (641, 1, 294, 8, 100), + (642, 1, 294, 9, 100), + (644, 1, 217, 0, 32000), + (644, 2, 346, 59, 0), + (649, 1, 243, 15, 0), + (650, 1, 243, 25, 0), + (651, 1, 243, 35, 0), + (652, 1, 293, 25, 0), + (653, 1, 293, 50, 0), + (654, 1, 293, 75, 0), + (655, 1, 127, 10, 10), + (655, 2, 137, 32, 0), + (655, 3, 127, 10, 10), + (655, 4, 137, 33, 0), + (655, 5, 127, 10, 10), + (655, 6, 137, 82, 0), + (655, 7, 127, 2, 2), + (655, 8, 137, 152, 0), + (655, 9, 143, 3000, 0), + (656, 1, 127, 25, 25), + (656, 2, 137, 32, 0), + (656, 3, 127, 25, 25), + (656, 4, 137, 33, 0), + (656, 5, 127, 25, 25), + (656, 6, 137, 82, 0), + (656, 7, 127, 5, 5), + (656, 8, 137, 152, 0), + (656, 9, 143, 3000, 0), + (657, 1, 127, 50, 50), + (657, 2, 137, 32, 0), + (657, 3, 127, 50, 50), + (657, 4, 137, 33, 0), + (657, 5, 127, 50, 50), + (657, 6, 137, 82, 0), + (657, 7, 127, 10, 10), + (657, 8, 137, 152, 0), + (657, 9, 143, 3000, 0), + (658, 1, 15, 1, 0), + (659, 1, 15, 2, 0), + (660, 1, 15, 3, 0), + (661, 1, 0, 1, 0), + (662, 1, 0, 2, 0), + (663, 1, 0, 3, 0), + (665, 1, 270, 10, 0), + (666, 1, 270, 15, 0), + (667, 1, 270, 25, 0), + (668, 1, 270, 55, 0), + (669, 1, 270, 60, 0), + (670, 1, 270, 65, 0), + (671, 1, 241, 95, 0), + (672, 1, 271, 28, 0), + (673, 1, 271, 35, 0), + (674, 1, 0, 4, 0), + (675, 1, 0, 5, 0), + (676, 1, 246, 325, 0), + (677, 1, 246, 350, 0), + (678, 1, 221, 3, 0), + (679, 1, 221, 6, 0), + (680, 1, 221, 9, 0), + (681, 1, 221, 12, 0), + (682, 1, 221, 15, 0), + (683, 1, 189, 1, 0), + (684, 1, 189, 2, 0), + (685, 1, 189, 3, 0), + (686, 1, 200, 10, 0), + (687, 1, 200, 20, 0), + (688, 1, 200, 30, 0), + (689, 1, 200, 40, 0), + (690, 1, 200, 50, 0), + (691, 1, 248, 100, 0), + (692, 1, 229, 5, 0), + (693, 1, 229, 10, 0), + (694, 1, 229, 15, 0), + (695, 1, 247, 10, 53), + (696, 1, 247, 20, 53), + (697, 1, 247, 30, 53), + (698, 1, 247, 40, 53), + (699, 1, 247, 50, 53), + (700, 1, 260, 8, 23), + (700, 2, 260, 8, 24), + (700, 3, 260, 8, 25), + (700, 4, 260, 8, 26), + (701, 1, 260, 8, 50), + (724, 1, 218, 1, 0), + (725, 1, 218, 2, 0), + (726, 1, 218, 3, 0), + (727, 1, 218, 4, 0), + (728, 1, 218, 5, 0), + (729, 1, 280, 4, 0), + (730, 1, 280, 8, 0), + (731, 1, 280, 12, 0), + (732, 1, 280, 16, 0), + (733, 1, 280, 20, 0), + (734, 1, 237, 1, 0), + (735, 1, 265, 54, 0), + (736, 1, 265, 56, 0), + (737, 1, 265, 58, 0), + (738, 1, 114, -5, 0), + (739, 1, 114, -10, 0), + (740, 1, 114, -20, 0), + (754, 1, 264, 18, 153), + (755, 1, 264, 36, 153), + (756, 1, 264, 54, 153), + (762, 1, 247, 10, 53), + (763, 1, 247, 20, 53), + (764, 1, 247, 30, 53), + (765, 1, 247, 40, 53), + (766, 1, 247, 50, 53), + (767, 1, 273, 3, 0), + (768, 1, 273, 6, 0), + (769, 1, 273, 9, 0), + (770, 1, 294, 7, 100), + (771, 1, 294, 8, 100), + (772, 1, 294, 9, 100), + (776, 1, 242, 10, 0), + (777, 1, 242, 20, 0), + (778, 1, 242, 30, 0), + (779, 1, 242, 40, 0), + (780, 1, 242, 50, 0), + (781, 1, 287, 1, 1), + (781, 2, 137, 31, 0), + (781, 3, 136, 5, 0), + (782, 1, 264, 432, 35), + (783, 1, 264, 864, 35), + (784, 1, 264, 1296, 35), + (790, 1, 218, 1, 0), + (791, 1, 218, 2, 0), + (792, 1, 218, 3, 0), + (793, 1, 218, 4, 0), + (794, 1, 218, 5, 0), + (795, 1, 280, 4, 0), + (796, 1, 280, 8, 0), + (797, 1, 280, 12, 0), + (798, 1, 280, 16, 0), + (799, 1, 280, 20, 0), + (800, 1, 215, 2, 0), + (801, 1, 215, 5, 0), + (802, 1, 215, 10, 0), + (803, 1, 213, 2, 0), + (804, 1, 213, 5, 0), + (805, 1, 213, 10, 0), + (806, 1, 249, 1, 0), + (807, 1, 292, 5, 0), + (808, 1, 292, 10, 0), + (809, 1, 292, 15, 0), + (810, 1, 239, 10, 0), + (811, 1, 239, 20, 0), + (812, 1, 239, 30, 0), + (813, 1, 239, 40, 0), + (814, 1, 239, 50, 0), + (815, 1, 279, 7, 0), + (816, 1, 279, 11, 0), + (817, 1, 279, 15, 0), + (818, 1, 279, 17, 0), + (819, 1, 279, 19, 0), + (820, 1, 220, 10, 26), + (820, 2, 220, 10, 30), + (820, 3, 220, 10, 38), + (821, 1, 220, 20, 26), + (821, 2, 220, 20, 30), + (821, 3, 220, 20, 38), + (822, 1, 220, 30, 26), + (822, 2, 220, 30, 30), + (822, 3, 220, 30, 38), + (823, 1, 222, 20, 0), + (824, 1, 222, 40, 0), + (825, 1, 222, 60, 0), + (826, 1, 222, 80, 0), + (827, 1, 222, 100, 0), + (834, 1, 218, 1, 0), + (835, 1, 218, 2, 0), + (836, 1, 218, 3, 0), + (837, 1, 218, 4, 0), + (838, 1, 218, 5, 0), + (839, 1, 280, 4, 0), + (840, 1, 280, 8, 0), + (841, 1, 280, 12, 0), + (842, 1, 280, 16, 0), + (843, 1, 280, 20, 0), + (844, 1, 274, 12, 0), + (845, 1, 274, 14, 0), + (846, 1, 258, 5, 0), + (847, 1, 258, 10, 0), + (848, 1, 258, 15, 0), + (849, 1, 264, 240, 180), + (850, 1, 264, 480, 180), + (851, 1, 264, 720, 180), + (852, 1, 231, 1, 0), + (853, 1, 231, 2, 0), + (854, 1, 231, 3, 0), + (855, 1, 220, 5, 10), + (856, 1, 220, 10, 10), + (857, 1, 220, 15, 10), + (858, 1, 220, 20, 10), + (859, 1, 220, 25, 10), + (864, 1, 216, 10, 0), + (864, 2, 216, 10, 1), + (864, 3, 216, 10, 2), + (864, 4, 216, 10, 3), + (864, 5, 216, 10, 10), + (864, 6, 216, 10, 28), + (864, 7, 216, 10, 30), + (864, 8, 216, 10, 36), + (864, 9, 216, 10, 77), + (865, 1, 216, 20, 0), + (865, 2, 216, 20, 1), + (865, 3, 216, 20, 2), + (865, 4, 216, 20, 3), + (865, 5, 216, 20, 10), + (865, 6, 216, 20, 28), + (865, 7, 216, 20, 30), + (865, 8, 216, 20, 36), + (865, 9, 216, 20, 77), + (866, 1, 216, 30, 0), + (866, 2, 216, 30, 1), + (866, 3, 216, 30, 2), + (866, 4, 216, 30, 3), + (866, 5, 216, 30, 10), + (866, 6, 216, 30, 28), + (866, 7, 216, 30, 30), + (866, 8, 216, 30, 36), + (866, 9, 216, 30, 77), + (867, 1, 59, -3, 0), + (868, 1, 59, -6, 0), + (869, 1, 59, -9, 0), + (870, 1, 59, -12, 0), + (871, 1, 59, -15, 0), + (878, 1, 252, 10, 0), + (879, 1, 252, 20, 0), + (880, 1, 252, 30, 0), + (881, 1, 245, 10, 0), + (882, 1, 245, 20, 0), + (883, 1, 245, 30, 0), + (884, 1, 245, 40, 0), + (885, 1, 245, 50, 0), + (886, 1, 264, 576, 102), + (887, 1, 264, 720, 102), + (888, 1, 250, 10, 0), + (889, 1, 250, 20, 0), + (890, 1, 250, 30, 0), + (891, 1, 250, 40, 0), + (892, 1, 250, 50, 0), + (893, 1, 303, 2000, 2000), + (893, 2, 139, 2766, 0), + (894, 1, 303, 2500, 2500), + (894, 2, 139, 2766, 0), + (895, 1, 59, -3, 0), + (896, 1, 59, -6, 0), + (897, 1, 59, -9, 0), + (898, 1, 59, -12, 0), + (899, 1, 59, -15, 0), + (907, 1, 69, 100, 0), + (908, 1, 69, 200, 0), + (909, 1, 69, 300, 0), + (910, 1, 69, 400, 0), + (911, 1, 69, 500, 0), + (915, 1, 220, 5, 10), + (915, 2, 220, 5, 30), + (916, 1, 220, 10, 10), + (916, 2, 220, 10, 30), + (917, 1, 220, 15, 10), + (917, 2, 220, 15, 30), + (918, 1, 230, 2, 0), + (919, 1, 230, 4, 0), + (920, 1, 230, 6, 0), + (924, 1, 294, 10, 100), + (925, 1, 294, 11, 100), + (934, 1, 169, 15, -1), + (935, 1, 169, 30, -1), + (936, 1, 169, 60, -1), + (937, 1, 169, 15, 0), + (937, 2, 169, 15, 1), + (937, 3, 169, 15, 2), + (937, 4, 169, 15, 3), + (937, 5, 169, 15, 7), + (937, 6, 169, 15, 8), + (937, 7, 169, 15, 10), + (937, 8, 169, 15, 28), + (937, 9, 169, 15, 30), + (937, 10, 169, 15, 36), + (937, 11, 169, 15, 51), + (938, 1, 169, 40, 0), + (938, 2, 169, 40, 1), + (938, 3, 169, 40, 2), + (938, 4, 169, 40, 3), + (938, 5, 169, 40, 7), + (938, 6, 169, 40, 8), + (938, 7, 169, 40, 10), + (938, 8, 169, 40, 28), + (938, 9, 169, 40, 30), + (938, 10, 169, 40, 36), + (938, 11, 169, 30, 51), + (939, 1, 169, 75, 0), + (939, 2, 169, 75, 1), + (939, 3, 169, 75, 2), + (939, 4, 169, 75, 3), + (939, 5, 169, 75, 7), + (939, 6, 169, 75, 8), + (939, 7, 169, 75, 10), + (939, 8, 169, 75, 28), + (939, 9, 169, 75, 30), + (939, 10, 169, 75, 36), + (939, 11, 169, 60, 51), + (940, 1, 169, 15, 0), + (940, 2, 169, 15, 1), + (940, 3, 169, 15, 2), + (940, 4, 169, 15, 3), + (940, 5, 169, 15, 7), + (940, 6, 169, 15, 8), + (940, 7, 169, 15, 10), + (940, 8, 169, 15, 28), + (940, 9, 169, 15, 30), + (940, 10, 169, 15, 36), + (940, 11, 169, 15, 51), + (940, 12, 169, 15, 77), + (941, 1, 169, 40, 0), + (941, 2, 169, 40, 1), + (941, 3, 169, 40, 2), + (941, 4, 169, 40, 3), + (941, 5, 169, 30, 7), + (941, 6, 169, 40, 8), + (941, 7, 169, 40, 10), + (941, 8, 169, 40, 28), + (941, 9, 169, 40, 30), + (941, 10, 169, 40, 36), + (941, 11, 169, 40, 51), + (941, 12, 169, 40, 77), + (942, 1, 169, 75, 0), + (942, 2, 169, 75, 1), + (942, 3, 169, 75, 2), + (942, 4, 169, 75, 3), + (942, 5, 169, 60, 7), + (942, 6, 169, 75, 8), + (942, 7, 169, 75, 10), + (942, 8, 169, 75, 28), + (942, 9, 169, 75, 30), + (942, 10, 169, 75, 36), + (942, 11, 169, 75, 51), + (942, 12, 169, 75, 77), + (943, 1, 169, 146, -1), + (944, 1, 169, 172, -1), + (945, 1, 169, 198, -1), + (946, 1, 169, 175, 0), + (946, 2, 169, 175, 1), + (946, 3, 169, 175, 2), + (946, 4, 169, 175, 3), + (946, 5, 169, 175, 7), + (946, 6, 169, 175, 8), + (946, 7, 169, 175, 10), + (946, 8, 169, 175, 28), + (946, 9, 169, 175, 30), + (946, 10, 169, 175, 36), + (946, 11, 169, 146, 51), + (947, 1, 169, 200, 0), + (947, 2, 169, 200, 1), + (947, 3, 169, 200, 2), + (947, 4, 169, 200, 3), + (947, 5, 169, 200, 7), + (947, 6, 169, 200, 8), + (947, 7, 169, 200, 10), + (947, 8, 169, 200, 28), + (947, 9, 169, 200, 30), + (947, 10, 169, 200, 36), + (947, 11, 169, 172, 51), + (948, 1, 169, 225, 0), + (948, 2, 169, 225, 1), + (948, 3, 169, 225, 2), + (948, 4, 169, 225, 3), + (948, 5, 169, 225, 7), + (948, 6, 169, 225, 8), + (948, 7, 169, 225, 10), + (948, 8, 169, 225, 28), + (948, 9, 169, 225, 30), + (948, 10, 169, 225, 36), + (948, 11, 169, 198, 51), + (949, 1, 169, 175, 0), + (949, 2, 169, 175, 1), + (949, 3, 169, 175, 2), + (949, 4, 169, 175, 3), + (949, 5, 169, 161, 7), + (949, 6, 169, 175, 8), + (949, 7, 169, 175, 10), + (949, 8, 169, 175, 28), + (949, 9, 169, 175, 30), + (949, 10, 169, 175, 36), + (949, 11, 169, 175, 51), + (949, 12, 169, 175, 77), + (950, 1, 169, 200, 0), + (950, 2, 169, 200, 1), + (950, 3, 169, 200, 2), + (950, 4, 169, 200, 3), + (950, 5, 169, 187, 7), + (950, 6, 169, 200, 8), + (950, 7, 169, 200, 10), + (950, 8, 169, 200, 28), + (950, 9, 169, 200, 30), + (950, 10, 169, 200, 36), + (950, 11, 169, 200, 51), + (950, 12, 169, 200, 77), + (951, 1, 169, 225, 0), + (951, 2, 169, 225, 1), + (951, 3, 169, 225, 2), + (951, 4, 169, 225, 3), + (951, 5, 169, 213, 7), + (951, 6, 169, 225, 8), + (951, 7, 169, 225, 10), + (951, 8, 169, 225, 28), + (951, 9, 169, 225, 30), + (951, 10, 169, 225, 36), + (951, 11, 169, 225, 51), + (951, 12, 169, 225, 77), + (952, 1, 214, 125, 0), + (953, 1, 214, 250, 0), + (954, 1, 214, 375, 0), + (955, 1, 262, 10, 4), + (955, 2, 262, 10, 5), + (956, 1, 262, 20, 4), + (956, 2, 262, 20, 5), + (957, 1, 262, 30, 4), + (957, 2, 262, 30, 5), + (958, 1, 262, 40, 4), + (958, 2, 262, 40, 5), + (959, 1, 262, 50, 4), + (959, 2, 262, 50, 5), + (962, 1, 232, 2, 4544), + (963, 1, 232, 4, 4544), + (964, 1, 232, 6, 4544), + (965, 1, 232, 8, 4544), + (966, 1, 232, 10, 4544), + (975, 1, 264, 864, 102), + (976, 1, 131, 100, 0), + (976, 2, 137, 33, 0), + (978, 1, 14, 1, 0), + (978, 2, 246, 350, 0), + (979, 1, 268, 10, 63), + (980, 1, 268, 25, 63), + (981, 1, 268, 50, 63), + (982, 1, 268, 10, 60), + (983, 1, 268, 25, 60), + (984, 1, 268, 50, 60), + (985, 1, 268, 10, 65), + (986, 1, 268, 25, 65), + (987, 1, 268, 50, 65), + (988, 1, 268, 10, 64), + (989, 1, 268, 25, 64), + (990, 1, 268, 50, 64), + (991, 1, 268, 10, 69), + (992, 1, 268, 25, 69), + (993, 1, 268, 50, 69), + (994, 1, 268, 10, 61), + (995, 1, 268, 25, 61), + (996, 1, 268, 50, 61), + (997, 1, 331, 5, 0), + (998, 1, 331, 15, 0), + (999, 1, 331, 25, 0), + (1001, 1, 262, 30, 0), + (1001, 2, 262, 30, 1), + (1001, 3, 262, 30, 2), + (1001, 4, 262, 30, 3), + (1001, 5, 262, 30, 4), + (1001, 6, 262, 30, 5), + (1001, 7, 262, 30, 6), + (1002, 1, 262, 35, 0), + (1002, 2, 262, 35, 1), + (1002, 3, 262, 35, 2), + (1002, 4, 262, 35, 3), + (1002, 5, 262, 35, 4), + (1002, 6, 262, 35, 5), + (1002, 7, 262, 35, 6), + (1003, 1, 262, 40, 0), + (1003, 2, 262, 40, 1), + (1003, 3, 262, 40, 2), + (1003, 4, 262, 40, 3), + (1003, 5, 262, 40, 4), + (1003, 6, 262, 40, 5), + (1003, 7, 262, 40, 6), + (1004, 1, 262, 45, 0), + (1004, 2, 262, 45, 1), + (1004, 3, 262, 45, 2), + (1004, 4, 262, 45, 3), + (1004, 5, 262, 45, 4), + (1004, 6, 262, 45, 5), + (1004, 7, 262, 45, 6), + (1005, 1, 262, 50, 0), + (1005, 2, 262, 50, 1), + (1005, 3, 262, 50, 2), + (1005, 4, 262, 50, 3), + (1005, 5, 262, 50, 4), + (1005, 6, 262, 50, 5), + (1005, 7, 262, 50, 6), + (1006, 1, 262, 5, 7), + (1006, 2, 262, 5, 8), + (1006, 3, 262, 5, 9), + (1006, 4, 262, 5, 10), + (1006, 5, 262, 5, 11), + (1007, 1, 262, 10, 7), + (1007, 2, 262, 10, 8), + (1007, 3, 262, 10, 9), + (1007, 4, 262, 10, 10), + (1007, 5, 262, 10, 11), + (1008, 1, 262, 15, 7), + (1008, 2, 262, 15, 8), + (1008, 3, 262, 15, 9), + (1008, 4, 262, 15, 10), + (1008, 5, 262, 15, 11), + (1009, 1, 262, 20, 7), + (1009, 2, 262, 20, 8), + (1009, 3, 262, 20, 9), + (1009, 4, 262, 20, 10), + (1009, 5, 262, 20, 11), + (1010, 1, 262, 25, 7), + (1010, 2, 262, 25, 8), + (1010, 3, 262, 25, 9), + (1010, 4, 262, 25, 10), + (1010, 5, 262, 25, 11), + (1011, 1, 262, 8, 7), + (1011, 2, 262, 8, 8), + (1011, 3, 262, 8, 9), + (1011, 4, 262, 8, 10), + (1011, 5, 262, 8, 11), + (1012, 1, 262, 16, 7), + (1012, 2, 262, 16, 8), + (1012, 3, 262, 16, 9), + (1012, 4, 262, 16, 10), + (1012, 5, 262, 16, 11), + (1013, 1, 262, 24, 7), + (1013, 2, 262, 24, 8), + (1013, 3, 262, 24, 9), + (1013, 4, 262, 24, 10), + (1013, 5, 262, 24, 11), + (1014, 1, 262, 32, 7), + (1014, 2, 262, 32, 8), + (1014, 3, 262, 32, 9), + (1014, 4, 262, 32, 10), + (1014, 5, 262, 32, 11), + (1016, 1, 262, 50, 7), + (1016, 2, 262, 50, 8), + (1016, 3, 262, 50, 9), + (1016, 4, 262, 50, 10), + (1016, 5, 262, 50, 11), + (1021, 1, 327, 1, 0), + (1022, 1, 327, 2, 0), + (1023, 1, 327, 3, 0), + (1024, 1, 327, 4, 0), + (1025, 1, 327, 5, 0), + (1026, 1, 328, 50, 0), + (1027, 1, 328, 100, 0), + (1028, 1, 328, 150, 0), + (1029, 1, 328, 200, 0), + (1030, 1, 328, 250, 0), + (1031, 1, 0, 6, 0), + (1032, 1, 0, 7, 0), + (1033, 1, 0, 8, 0), + (1034, 1, 0, 9, 0), + (1035, 1, 0, 10, 0), + (1036, 1, 189, 4, 0), + (1037, 1, 189, 5, 0), + (1038, 1, 189, 6, 0), + (1041, 1, 330, 25, 0), + (1041, 2, 330, 25, 1), + (1041, 3, 330, 25, 2), + (1041, 4, 330, 25, 3), + (1041, 5, 330, 25, 28), + (1041, 6, 330, 25, 36), + (1041, 7, 330, 25, 77), + (1042, 1, 330, 50, 0), + (1042, 2, 330, 50, 1), + (1042, 3, 330, 50, 2), + (1042, 4, 330, 50, 3), + (1042, 5, 330, 50, 28), + (1042, 6, 330, 50, 36), + (1042, 7, 330, 50, 77), + (1043, 1, 330, 75, 0), + (1043, 2, 330, 75, 1), + (1043, 3, 330, 75, 2), + (1043, 4, 330, 75, 3), + (1043, 5, 330, 75, 28), + (1043, 6, 330, 75, 36), + (1043, 7, 330, 75, 77), + (1044, 1, 330, 25, 0), + (1044, 2, 330, 25, 1), + (1044, 3, 330, 25, 2), + (1044, 4, 330, 25, 3), + (1044, 5, 330, 25, 28), + (1044, 6, 330, 25, 36), + (1045, 1, 330, 50, 0), + (1045, 2, 330, 50, 1), + (1045, 3, 330, 50, 2), + (1045, 4, 330, 50, 3), + (1045, 5, 330, 50, 28), + (1045, 6, 330, 50, 36), + (1046, 1, 330, 75, 0), + (1046, 2, 330, 75, 1), + (1046, 3, 330, 75, 2), + (1046, 4, 330, 75, 3), + (1046, 5, 330, 75, 28), + (1046, 6, 330, 75, 36), + (1047, 1, 330, 25, 0), + (1047, 2, 330, 25, 1), + (1047, 3, 330, 25, 2), + (1047, 4, 330, 25, 3), + (1047, 5, 330, 25, 28), + (1047, 6, 330, 25, 36), + (1047, 7, 330, 25, 77), + (1048, 1, 330, 50, 0), + (1048, 2, 330, 50, 1), + (1048, 3, 330, 50, 2), + (1048, 4, 330, 50, 3), + (1048, 5, 330, 50, 28), + (1048, 6, 330, 50, 36), + (1048, 7, 330, 50, 77), + (1049, 1, 330, 75, 0), + (1049, 2, 330, 75, 1), + (1049, 3, 330, 75, 2), + (1049, 4, 330, 75, 3), + (1049, 5, 330, 75, 28), + (1049, 6, 330, 75, 36), + (1049, 7, 330, 75, 77), + (1050, 1, 330, 15, 0), + (1050, 2, 330, 15, 1), + (1050, 3, 330, 15, 2), + (1050, 4, 330, 15, 3), + (1050, 5, 330, 15, 28), + (1050, 6, 330, 15, 36), + (1050, 7, 330, 15, 77), + (1051, 1, 330, 30, 0), + (1051, 2, 330, 30, 1), + (1051, 3, 330, 30, 2), + (1051, 4, 330, 30, 3), + (1051, 5, 330, 30, 28), + (1051, 6, 330, 30, 36), + (1051, 7, 330, 30, 77), + (1052, 1, 330, 50, 0), + (1052, 2, 330, 50, 1), + (1052, 3, 330, 50, 2), + (1052, 4, 330, 50, 3), + (1052, 5, 330, 50, 28), + (1052, 6, 330, 50, 36), + (1052, 7, 330, 50, 77), + (1053, 1, 278, 560, 27200), + (1053, 2, 440, 61, 100), + (1054, 1, 278, 580, 30135), + (1054, 2, 440, 63, 100), + (1055, 1, 278, 600, 32780), + (1055, 2, 440, 65, 100), + (1056, 1, 317, 1, 0), + (1057, 1, 317, 2, 0), + (1058, 1, 317, 3, 0), + (1059, 1, 317, 4, 0), + (1060, 1, 317, 5, 0), + (1061, 1, 172, 26, 0), + (1062, 1, 172, 27, 0), + (1063, 1, 172, 28, 0), + (1064, 1, 172, 30, 0), + (1065, 1, 172, 32, 0), + (1066, 1, 259, 27, 0), + (1067, 1, 259, 29, 0), + (1068, 1, 259, 31, 0), + (1069, 1, 259, 33, 0), + (1070, 1, 259, 35, 0), + (1071, 1, 326, 1, 0), + (1072, 1, 318, 1, 0), + (1073, 1, 318, 2, 0), + (1074, 1, 318, 3, 0), + (1075, 1, 318, 4, 0), + (1076, 1, 318, 5, 0), + (1083, 1, 125, 22, 22), + (1083, 2, 137, 0, 0), + (1083, 3, 141, 1, 0), + (1083, 4, 139, -6233, 0), + (1083, 5, 139, -6265, 0), + (1083, 6, 125, 22, 22), + (1083, 7, 137, 147, 0), + (1083, 8, 141, 1, 0), + (1084, 1, 125, 25, 25), + (1084, 2, 137, 0, 0), + (1084, 3, 141, 1, 0), + (1084, 4, 139, -6233, 0), + (1084, 5, 139, -6265, 0), + (1084, 6, 125, 25, 25), + (1084, 7, 137, 147, 0), + (1084, 8, 141, 1, 0), + (1085, 1, 125, 28, 28), + (1085, 2, 137, 0, 0), + (1085, 3, 141, 1, 0), + (1085, 4, 139, -6233, 0), + (1085, 5, 139, -6265, 0), + (1085, 6, 125, 28, 28), + (1085, 7, 137, 147, 0), + (1085, 8, 141, 1, 0), + (1086, 1, 274, 18, 0), + (1087, 1, 274, 20, 0), + (1088, 1, 274, 22, 0), + (1089, 1, 268, 10, 58), + (1090, 1, 268, 25, 58), + (1091, 1, 268, 50, 58), + (1092, 1, 238, 1, 0), + (1093, 1, 304, -20, 0), + (1094, 1, 304, -40, 0), + (1095, 1, 304, -60, 0), + (1096, 1, 304, -80, 0), + (1097, 1, 304, -100, 0), + (1099, 1, 273, 12, 0), + (1100, 1, 273, 15, 0), + (1101, 1, 273, 18, 0), + (1107, 1, 294, 2, 100), + (1108, 1, 294, 4, 100), + (1109, 1, 294, 6, 100), + (1113, 1, 331, 30, 0), + (1114, 1, 331, 35, 0), + (1115, 1, 331, 40, 0), + (1122, 1, 308, 1, 0), + (1129, 1, 267, 1, 24), + (1129, 2, 267, 1, 25), + (1129, 3, 267, 1, 26), + (1130, 1, 267, 1, 18), + (1130, 2, 267, 1, 19), + (1130, 3, 267, 1, 20), + (1130, 4, 267, 1, 21), + (1130, 5, 267, 1, 22), + (1130, 6, 267, 1, 23), + (1130, 7, 267, 1, 24), + (1130, 8, 267, 1, 25), + (1130, 9, 267, 1, 26), + (1131, 1, 185, 10, 51), + (1132, 1, 185, 20, 51), + (1133, 1, 185, 30, 51), + (1134, 1, 220, 32, 74), + (1135, 1, 220, 64, 74), + (1136, 1, 220, 96, 74), + (1137, 1, 310, 180000, 0), + (1137, 2, 139, 5027, 0), + (1137, 3, 310, 180000, 0), + (1137, 4, 139, 5028, 0), + (1137, 5, 310, 180000, 0), + (1137, 6, 139, 5029, 0), + (1137, 7, 310, 180000, 0), + (1137, 8, 139, 5030, 0), + (1137, 9, 310, 180000, 0), + (1137, 10, 139, 5031, 0), + (1137, 11, 310, 180000, 0), + (1137, 12, 139, 5032, 0), + (1137, 13, 310, 180000, 0), + (1137, 14, 139, 8476, 0), + (1138, 1, 310, 360000, 0), + (1138, 2, 139, 5027, 0), + (1138, 3, 310, 360000, 0), + (1138, 4, 139, 5028, 0), + (1138, 5, 310, 360000, 0), + (1138, 6, 139, 5029, 0), + (1138, 7, 310, 360000, 0), + (1138, 8, 139, 5030, 0), + (1138, 9, 310, 360000, 0), + (1138, 10, 139, 5031, 0), + (1138, 11, 310, 360000, 0), + (1138, 12, 139, 5032, 0), + (1138, 13, 310, 360000, 0), + (1138, 14, 139, 8476, 0), + (1139, 1, 310, 540000, 0), + (1139, 2, 139, 5027, 0), + (1139, 3, 310, 540000, 0), + (1139, 4, 139, 5028, 0), + (1139, 5, 310, 540000, 0), + (1139, 6, 139, 5029, 0), + (1139, 7, 310, 540000, 0), + (1139, 8, 139, 5030, 0), + (1139, 9, 310, 540000, 0), + (1139, 10, 139, 5031, 0), + (1139, 11, 310, 540000, 0), + (1139, 12, 139, 5032, 0), + (1139, 13, 310, 540000, 0), + (1139, 14, 139, 8476, 0), + (1140, 1, 216, 10, 51), + (1141, 1, 216, 20, 51), + (1142, 1, 216, 30, 51), + (1155, 1, 128, 25, 0), + (1155, 2, 139, 5027, 0), + (1155, 3, 128, 25, 0), + (1155, 4, 139, 5028, 0), + (1155, 5, 128, 25, 0), + (1155, 6, 139, 5029, 0), + (1155, 7, 128, 25, 0), + (1155, 8, 139, 5030, 0), + (1155, 9, 128, 25, 0), + (1155, 10, 139, 5031, 0), + (1155, 11, 128, 25, 0), + (1155, 12, 139, 5032, 0), + (1155, 13, 128, 25, 0), + (1155, 14, 139, 8476, 0), + (1156, 1, 128, 50, 0), + (1156, 2, 139, 5027, 0), + (1156, 3, 128, 50, 0), + (1156, 4, 139, 5028, 0), + (1156, 5, 128, 50, 0), + (1156, 6, 139, 5029, 0), + (1156, 7, 128, 50, 0), + (1156, 8, 139, 5030, 0), + (1156, 9, 128, 50, 0), + (1156, 10, 139, 5031, 0), + (1156, 11, 128, 50, 0), + (1156, 12, 139, 5032, 0), + (1156, 13, 128, 50, 0), + (1156, 14, 139, 8476, 0), + (1157, 1, 128, 100, 0), + (1157, 2, 139, 5027, 0), + (1157, 3, 128, 100, 0), + (1157, 4, 139, 5028, 0), + (1157, 5, 128, 100, 0), + (1157, 6, 139, 5029, 0), + (1157, 7, 128, 100, 0), + (1157, 8, 139, 5030, 0), + (1157, 9, 128, 100, 0), + (1157, 10, 139, 5031, 0), + (1157, 11, 128, 100, 0), + (1157, 12, 139, 5032, 0), + (1157, 13, 128, 100, 0), + (1157, 14, 139, 8476, 0), + (1158, 1, 220, 128, 74), + (1159, 1, 220, 160, 74), + (1160, 1, 220, 192, 74), + (1161, 1, 220, 224, 74), + (1162, 1, 220, 256, 74), + (1163, 1, 279, 23, 0), + (1164, 1, 279, 25, 0), + (1165, 1, 279, 27, 0), + (1166, 1, 224, 20, 74), + (1166, 2, 173, 1, 0), + (1167, 1, 224, 35, 74), + (1167, 2, 173, 1, 0), + (1168, 1, 224, 50, 74), + (1168, 2, 173, 2, 0), + (1172, 1, 292, 50, 0), + (1173, 1, 292, 55, 0), + (1174, 1, 292, 60, 0), + (1181, 1, 305, -20, 0), + (1182, 1, 305, -40, 0), + (1183, 1, 305, -60, 0), + (1184, 1, 305, -80, 0), + (1185, 1, 305, -100, 0), + (1186, 1, 319, 3, 0), + (1187, 1, 319, 6, 0), + (1188, 1, 319, 10, 0), + (1196, 1, 220, 20, 7), + (1197, 1, 220, 40, 7), + (1198, 1, 220, 60, 7), + (1199, 1, 220, 80, 7), + (1200, 1, 220, 100, 7), + (1210, 1, 294, 0, 107), + (1211, 1, 294, 0, 115), + (1212, 1, 294, 0, 125), + (1213, 1, 294, 0, 107), + (1214, 1, 294, 0, 115), + (1215, 1, 294, 0, 125), + (1216, 1, 132, 2, 2), + (1217, 1, 132, 5, 5), + (1218, 1, 132, 10, 10), + (1219, 1, 339, 3, 8105), + (1219, 2, 142, 65, 0), + (1219, 3, 311, 0, 0), + (1219, 4, 134, 70, 0), + (1219, 5, 348, 10, 0), + (1219, 6, 137, 0, 0), + (1219, 7, 339, 3, 8105), + (1219, 8, 142, 65, 0), + (1219, 9, 311, 0, 0), + (1219, 10, 134, 70, 0), + (1219, 11, 348, 10, 0), + (1219, 12, 137, 100, 0), + (1219, 13, 339, 3, 8105), + (1219, 14, 142, 65, 0), + (1219, 15, 311, 0, 0), + (1219, 16, 134, 70, 0), + (1219, 17, 348, 10, 0), + (1219, 18, 137, 79, 0), + (1219, 19, 339, 3, 8105), + (1219, 20, 142, 65, 0), + (1219, 21, 311, 0, 0), + (1219, 22, 134, 70, 0), + (1219, 23, 348, 10, 0), + (1219, 24, 137, 147, 0), + (1220, 1, 339, 6, 8105), + (1220, 2, 142, 65, 0), + (1220, 3, 311, 0, 0), + (1220, 4, 134, 70, 0), + (1220, 5, 348, 10, 0), + (1220, 6, 137, 0, 0), + (1220, 7, 339, 6, 8105), + (1220, 8, 142, 65, 0), + (1220, 9, 311, 0, 0), + (1220, 10, 134, 70, 0), + (1220, 11, 348, 10, 0), + (1220, 12, 137, 100, 0), + (1220, 13, 339, 6, 8105), + (1220, 14, 142, 65, 0), + (1220, 15, 311, 0, 0), + (1220, 16, 134, 70, 0), + (1220, 17, 348, 10, 0), + (1220, 18, 137, 79, 0), + (1220, 19, 339, 6, 8105), + (1220, 20, 142, 65, 0), + (1220, 21, 311, 0, 0), + (1220, 22, 134, 70, 0), + (1220, 23, 348, 10, 0), + (1220, 24, 137, 147, 0), + (1221, 1, 339, 10, 8105), + (1221, 2, 142, 65, 0), + (1221, 3, 311, 0, 0), + (1221, 4, 134, 70, 0), + (1221, 5, 348, 10, 0), + (1221, 6, 137, 0, 0), + (1221, 7, 339, 10, 8105), + (1221, 8, 142, 65, 0), + (1221, 9, 311, 0, 0), + (1221, 10, 134, 70, 0), + (1221, 11, 348, 10, 0), + (1221, 12, 137, 100, 0), + (1221, 13, 339, 10, 8105), + (1221, 14, 142, 65, 0), + (1221, 15, 311, 0, 0), + (1221, 16, 134, 70, 0), + (1221, 17, 348, 10, 0), + (1221, 18, 137, 79, 0), + (1221, 19, 339, 10, 8105), + (1221, 20, 142, 65, 0), + (1221, 21, 311, 0, 0), + (1221, 22, 134, 70, 0), + (1221, 23, 348, 10, 0), + (1221, 24, 137, 147, 0), + (1230, 1, 313, 25, 0), + (1231, 1, 313, 50, 0), + (1232, 1, 313, 75, 0), + (1265, 1, 220, 40, 26), + (1265, 2, 220, 40, 30), + (1265, 3, 220, 40, 38), + (1266, 1, 220, 50, 26), + (1266, 2, 220, 50, 30), + (1266, 3, 220, 50, 38), + (1267, 1, 220, 60, 26), + (1267, 2, 220, 60, 30), + (1267, 3, 220, 60, 38), + (1268, 1, 292, 20, 0), + (1269, 1, 292, 25, 0), + (1270, 1, 292, 30, 0), + (1284, 1, 293, 15, 0), + (1285, 1, 293, 30, 0), + (1286, 1, 293, 50, 0), + (1287, 1, 320, 1, 0), + (1288, 1, 320, 3, 0), + (1289, 1, 320, 5, 0), + (1290, 1, 216, 40, 0), + (1290, 2, 216, 40, 1), + (1290, 3, 216, 40, 2), + (1290, 4, 216, 40, 3), + (1290, 5, 216, 40, 10), + (1290, 6, 216, 40, 28), + (1290, 7, 216, 40, 30), + (1290, 8, 216, 40, 36), + (1290, 9, 216, 40, 77), + (1291, 1, 216, 50, 0), + (1291, 2, 216, 50, 1), + (1291, 3, 216, 50, 2), + (1291, 4, 216, 50, 3), + (1291, 5, 216, 50, 10), + (1291, 6, 216, 50, 28), + (1291, 7, 216, 50, 30), + (1291, 8, 216, 50, 36), + (1291, 9, 216, 50, 77), + (1292, 1, 216, 60, 0), + (1292, 2, 216, 60, 1), + (1292, 3, 216, 60, 2), + (1292, 4, 216, 60, 3), + (1292, 5, 216, 60, 10), + (1292, 6, 216, 60, 28), + (1292, 7, 216, 60, 30), + (1292, 8, 216, 60, 36), + (1292, 9, 216, 60, 77), + (1296, 1, 247, 20, 53), + (1297, 1, 247, 40, 53), + (1298, 1, 247, 60, 53), + (1299, 1, 247, 80, 53), + (1300, 1, 247, 100, 53), + (1301, 1, 258, 20, 0), + (1302, 1, 258, 25, 0), + (1303, 1, 258, 30, 0), + (1304, 1, 216, 50, 8), + (1305, 1, 216, 100, 8), + (1306, 1, 216, 150, 8), + (1307, 1, 325, 10, 0), + (1308, 1, 325, 20, 0), + (1309, 1, 325, 30, 0), + (1310, 1, 325, 40, 0), + (1311, 1, 325, 50, 0), + (1313, 1, 85, 6037, 0), + (1314, 1, 85, 6038, 0), + (1315, 1, 85, 6039, 0), + (1316, 1, 302, 216, 216), + (1316, 2, 385, 99, 0), + (1317, 1, 302, 233, 233), + (1317, 2, 385, 99, 0), + (1318, 1, 302, 250, 250), + (1318, 2, 385, 99, 0), + (1319, 1, 274, 16, 0), + (1320, 1, 274, 18, 0), + (1321, 1, 274, 20, 0), + (1361, 1, 159, 10, 0), + (1361, 2, 262, 10, 0), + (1361, 3, 262, 10, 1), + (1361, 4, 262, 10, 2), + (1361, 5, 262, 10, 3), + (1361, 6, 262, 10, 4), + (1361, 7, 262, 10, 5), + (1361, 8, 262, 10, 6), + (1362, 1, 214, 300, 0), + (1362, 2, 97, 200, 0), + (1362, 3, 190, 200, 0), + (1363, 1, 327, 1, 0), + (1364, 1, 273, 1, 0), + (1364, 2, 274, 1, 0), + (1364, 3, 294, 1, 100), + (1364, 4, 169, 40, 0), + (1364, 5, 169, 40, 1), + (1364, 6, 169, 40, 2), + (1364, 7, 169, 40, 3), + (1364, 8, 169, 40, 8), + (1364, 9, 169, 40, 10), + (1364, 10, 169, 40, 26), + (1364, 11, 169, 40, 28), + (1364, 12, 169, 40, 30), + (1364, 13, 169, 40, 36), + (1364, 14, 169, 40, 74), + (1365, 1, 180, 2, 0), + (1366, 1, 159, 10, 0), + (1366, 2, 262, 10, 0), + (1366, 3, 262, 10, 1), + (1366, 4, 262, 10, 2), + (1366, 5, 262, 10, 3), + (1366, 6, 262, 10, 4), + (1366, 7, 262, 10, 5), + (1366, 8, 262, 10, 6), + (1367, 1, 214, 300, 0), + (1367, 2, 97, 200, 0), + (1367, 3, 190, 200, 0), + (1368, 1, 327, 1, 0), + (1369, 1, 273, 1, 0), + (1369, 2, 274, 1, 0), + (1369, 3, 294, 1, 100), + (1369, 4, 169, 40, 0), + (1369, 5, 169, 40, 1), + (1369, 6, 169, 40, 2), + (1369, 7, 169, 40, 3), + (1369, 8, 169, 40, 8), + (1369, 9, 169, 40, 10), + (1369, 10, 169, 40, 26), + (1369, 11, 169, 40, 28), + (1369, 12, 169, 40, 30), + (1369, 13, 169, 40, 36), + (1369, 14, 169, 40, 74), + (1370, 1, 180, 2, 0), + (1378, 1, 10, 0, 0), + (1379, 1, 10, 0, 0), + (1380, 1, 10, 0, 0), + (1382, 1, 10, 0, 0), + (1388, 2, 13, 1, 0), + (1389, 1, 328, 300, 0), + (1390, 1, 328, 350, 0), + (1391, 1, 328, 400, 0), + (1392, 1, 328, 450, 0), + (1393, 1, 328, 500, 0), + (1394, 1, 172, 33, 0), + (1395, 1, 172, 34, 0), + (1396, 1, 172, 35, 0), + (1397, 1, 172, 37, 0), + (1398, 1, 172, 39, 0), + (1399, 1, 259, 37, 0), + (1400, 1, 259, 39, 0), + (1401, 1, 259, 41, 0), + (1402, 1, 259, 43, 0), + (1403, 1, 259, 45, 0), + (1414, 1, 264, 432, 451), + (1415, 1, 264, 864, 451), + (1416, 1, 264, 1296, 451), + (1417, 1, 264, 1728, 451), + (1418, 1, 264, 2160, 451), + (1420, 1, 282, 20, 0), + (1421, 1, 282, 40, 0), + (1422, 1, 282, 60, 0), + (1423, 1, 282, 80, 0), + (1424, 1, 282, 100, 0), + (1430, 1, 280, 27, 0), + (1431, 1, 280, 34, 0), + (1432, 1, 280, 41, 0), + (1435, 1, 339, 3, 8105), + (1435, 2, 142, 65, 0), + (1435, 3, 311, 0, 0), + (1435, 4, 134, 70, 0), + (1435, 5, 348, 10, 0), + (1435, 6, 137, 0, 0), + (1435, 7, 339, 3, 8105), + (1435, 8, 142, 65, 0), + (1435, 9, 311, 0, 0), + (1435, 10, 134, 70, 0), + (1435, 11, 348, 10, 0), + (1435, 12, 137, 100, 0), + (1435, 13, 339, 3, 8105), + (1435, 14, 142, 65, 0), + (1435, 15, 311, 0, 0), + (1435, 16, 134, 70, 0), + (1435, 17, 348, 10, 0), + (1435, 18, 137, 79, 0), + (1435, 19, 339, 3, 8105), + (1435, 20, 142, 65, 0), + (1435, 21, 311, 0, 0), + (1435, 22, 134, 70, 0), + (1435, 23, 348, 10, 0), + (1435, 24, 137, 147, 0), + (1436, 1, 339, 6, 8105), + (1436, 2, 142, 65, 0), + (1436, 3, 311, 0, 0), + (1436, 4, 134, 70, 0), + (1436, 5, 348, 10, 0), + (1436, 6, 137, 0, 0), + (1436, 7, 339, 6, 8105), + (1436, 8, 142, 65, 0), + (1436, 9, 311, 0, 0), + (1436, 10, 134, 70, 0), + (1436, 11, 348, 10, 0), + (1436, 12, 137, 100, 0), + (1436, 13, 339, 6, 8105), + (1436, 14, 142, 65, 0), + (1436, 15, 311, 0, 0), + (1436, 16, 134, 70, 0), + (1436, 17, 348, 10, 0), + (1436, 18, 137, 79, 0), + (1436, 19, 339, 6, 8105), + (1436, 20, 142, 65, 0), + (1436, 21, 311, 0, 0), + (1436, 22, 134, 70, 0), + (1436, 23, 348, 10, 0), + (1436, 24, 137, 147, 0), + (1437, 1, 339, 10, 8105), + (1437, 2, 142, 65, 0), + (1437, 3, 311, 0, 0), + (1437, 4, 134, 70, 0), + (1437, 5, 348, 10, 0), + (1437, 6, 137, 0, 0), + (1437, 7, 339, 10, 8105), + (1437, 8, 142, 65, 0), + (1437, 9, 311, 0, 0), + (1437, 10, 134, 70, 0), + (1437, 11, 348, 10, 0), + (1437, 12, 137, 100, 0), + (1437, 13, 339, 10, 8105), + (1437, 14, 142, 65, 0), + (1437, 15, 311, 0, 0), + (1437, 16, 134, 70, 0), + (1437, 17, 348, 10, 0), + (1437, 18, 137, 79, 0), + (1437, 19, 339, 10, 8105), + (1437, 20, 142, 65, 0), + (1437, 21, 311, 0, 0), + (1437, 22, 134, 70, 0), + (1437, 23, 348, 10, 0), + (1437, 24, 137, 147, 0), + (1453, 1, 131, 10, 10), + (1453, 2, 137, 32, 0), + (1453, 3, 311, 1, 0), + (1454, 1, 131, 20, 20), + (1454, 2, 137, 32, 0), + (1454, 3, 311, 1, 0), + (1455, 1, 131, 30, 30), + (1455, 2, 137, 32, 0), + (1455, 3, 311, 1, 0), + (1456, 1, 131, 40, 40), + (1456, 2, 137, 32, 0), + (1456, 3, 311, 1, 0), + (1457, 1, 131, 50, 50), + (1457, 2, 137, 32, 0), + (1457, 3, 311, 1, 0), + (1467, 1, 280, 27, 0), + (1468, 1, 280, 34, 0), + (1469, 1, 280, 41, 0), + (1471, 1, 264, 90, 362), + (1472, 1, 264, 180, 362), + (1473, 1, 264, 270, 362), + (1474, 1, 264, 360, 362), + (1475, 1, 264, 450, 362), + (1483, 1, 294, 0, 133), + (1484, 1, 294, 0, 141), + (1485, 1, 294, 0, 150), + (1486, 1, 339, 1, 8165), + (1486, 2, 138, 1, 0), + (1486, 3, 141, 1, 0), + (1486, 4, 142, 60, 0), + (1486, 5, 137, 0, 0), + (1486, 6, 311, 0, 0), + (1486, 7, 134, 75, 0), + (1486, 8, 139, -265, 0), + (1486, 9, 139, -754, 0), + (1486, 10, 139, -1332, 0), + (1486, 11, 139, -1572, 0), + (1486, 12, 139, -2749, 0), + (1486, 13, 139, -4979, 0), + (1486, 14, 139, -5418, 0), + (1486, 15, 139, -5403, 0), + (1486, 16, 348, 10, 0), + (1487, 1, 339, 3, 8166), + (1487, 2, 138, 1, 0), + (1487, 3, 141, 1, 0), + (1487, 4, 142, 60, 0), + (1487, 5, 137, 0, 0), + (1487, 6, 311, 0, 0), + (1487, 7, 134, 75, 0), + (1487, 8, 139, -265, 0), + (1487, 9, 139, -754, 0), + (1487, 10, 139, -1332, 0), + (1487, 11, 139, -1572, 0), + (1487, 12, 139, -2749, 0), + (1487, 13, 139, -4979, 0), + (1487, 14, 139, -5418, 0), + (1487, 15, 139, -5403, 0), + (1487, 16, 348, 10, 0), + (1488, 1, 339, 5, 8167), + (1488, 2, 138, 1, 0), + (1488, 3, 141, 1, 0), + (1488, 4, 142, 60, 0), + (1488, 5, 137, 0, 0), + (1488, 6, 311, 0, 0), + (1488, 7, 134, 75, 0), + (1488, 8, 139, -265, 0), + (1488, 9, 139, -754, 0), + (1488, 10, 139, -1332, 0), + (1488, 11, 139, -1572, 0), + (1488, 12, 139, -2749, 0), + (1488, 13, 139, -4979, 0), + (1488, 14, 139, -5418, 0), + (1488, 15, 139, -5403, 0), + (1488, 16, 348, 10, 0), + (1489, 1, 339, 7, 8168), + (1489, 2, 138, 1, 0), + (1489, 3, 141, 1, 0), + (1489, 4, 142, 60, 0), + (1489, 5, 137, 0, 0), + (1489, 6, 311, 0, 0), + (1489, 7, 134, 75, 0), + (1489, 8, 139, -265, 0), + (1489, 9, 139, -754, 0), + (1489, 10, 139, -1332, 0), + (1489, 11, 139, -1572, 0), + (1489, 12, 139, -2749, 0), + (1489, 13, 139, -4979, 0), + (1489, 14, 139, -5418, 0), + (1489, 15, 139, -5403, 0), + (1489, 16, 348, 10, 0), + (1490, 1, 339, 9, 8169), + (1490, 2, 138, 1, 0), + (1490, 3, 141, 1, 0), + (1490, 4, 142, 60, 0), + (1490, 5, 137, 0, 0), + (1490, 6, 311, 0, 0), + (1490, 7, 134, 75, 0), + (1490, 8, 139, -265, 0), + (1490, 9, 139, -754, 0), + (1490, 10, 139, -1332, 0), + (1490, 11, 139, -1572, 0), + (1490, 12, 139, -2749, 0), + (1490, 13, 139, -4979, 0), + (1490, 14, 139, -5418, 0), + (1490, 15, 139, -5403, 0), + (1490, 16, 348, 10, 0), + (1504, 1, 287, 2, 0), + (1504, 2, 385, 2754, 1), + (1505, 1, 287, 4, 0), + (1505, 2, 385, 2754, 1), + (1506, 1, 287, 6, 0), + (1506, 2, 385, 2754, 1), + (1511, 1, 264, 60, 175), + (1511, 2, 264, 60, 792), + (1512, 1, 264, 120, 175), + (1512, 2, 264, 120, 792), + (1513, 1, 264, 180, 175), + (1513, 2, 264, 180, 792), + (1514, 1, 273, 2, 0), + (1515, 1, 273, 4, 0), + (1516, 1, 273, 6, 0), + (1524, 1, 219, 260, 1800), + (1525, 1, 219, 300, 2000), + (1526, 1, 219, 280, 1900), + (1528, 1, 239, 30, 0), + (1529, 1, 239, 35, 0), + (1530, 1, 239, 40, 0), + (1531, 1, 239, 45, 0), + (1532, 1, 239, 50, 0), + (1533, 1, 266, 11, 0), + (1534, 1, 266, 14, 0), + (1535, 1, 266, 17, 0), + (1536, 1, 266, 11, 0), + (1537, 1, 266, 14, 0), + (1538, 1, 266, 17, 0), + (1539, 1, 252, 37, 0), + (1540, 1, 252, 44, 0), + (1541, 1, 252, 50, 0), + (1543, 1, 220, 10, 8), + (1544, 1, 220, 20, 8), + (1545, 1, 220, 30, 8), + (1546, 1, 264, 120, 420), + (1547, 1, 264, 240, 420), + (1548, 1, 264, 360, 420), + (1549, 1, 293, 25, 0), + (1550, 1, 293, 50, 0), + (1551, 1, 293, 75, 0), + (1552, 1, 271, 5, 0), + (1553, 1, 271, 10, 0), + (1554, 1, 271, 15, 0), + (1555, 1, 264, 240, 359), + (1556, 1, 264, 480, 359), + (1557, 1, 264, 720, 359), + (1563, 1, 225, 18, 0), + (1564, 1, 225, 21, 0), + (1565, 1, 225, 24, 0), + (1566, 1, 225, 27, 0), + (1567, 1, 225, 30, 0), + (1572, 1, 339, 2, 8261), + (1572, 2, 138, 0, 0), + (1572, 3, 137, 31, 0), + (1572, 4, 311, 0, 0), + (1573, 1, 339, 4, 8262), + (1573, 2, 138, 0, 0), + (1573, 3, 137, 31, 0), + (1573, 4, 311, 0, 0), + (1574, 1, 339, 6, 8263), + (1574, 2, 138, 0, 0), + (1574, 3, 137, 31, 0), + (1574, 4, 311, 0, 0), + (1575, 1, 339, 8, 8264), + (1575, 2, 138, 0, 0), + (1575, 3, 137, 31, 0), + (1575, 4, 311, 0, 0), + (1576, 1, 339, 10, 8265), + (1576, 2, 138, 0, 0), + (1576, 3, 137, 31, 0), + (1576, 4, 311, 0, 0), + (1577, 1, 274, 3, 0), + (1578, 1, 274, 6, 0), + (1579, 1, 274, 10, 0), + (1583, 1, 264, 360, 300), + (1584, 1, 264, 720, 300), + (1585, 1, 264, 1080, 300), + (1586, 1, 264, 1440, 300), + (1587, 1, 264, 1800, 300), + (1588, 1, 344, 50, 0), + (1589, 1, 344, 100, 0), + (1590, 1, 344, 150, 0), + (1591, 1, 293, 25, 0), + (1592, 1, 341, 10, 0), + (1593, 1, 341, 20, 0), + (1594, 1, 341, 30, 0), + (1595, 1, 341, 40, 0), + (1596, 1, 341, 50, 0), + (1601, 1, 217, 0, 35200), + (1601, 2, 346, 60, 0), + (1602, 1, 217, 0, 42440), + (1602, 2, 346, 62, 0), + (1603, 1, 217, 0, 46480), + (1603, 2, 346, 64, 0), + (1604, 1, 439, 0, 32000), + (1604, 2, 345, 59, 0), + (1605, 1, 439, 0, 35200), + (1605, 2, 345, 60, 0), + (1606, 1, 439, 0, 42440), + (1606, 2, 345, 61, 0), + (1608, 1, 347, 2, 0), + (1609, 1, 347, 4, 0), + (1610, 1, 347, 6, 0), + (1611, 1, 282, 20, 0), + (1612, 1, 282, 40, 0), + (1613, 1, 282, 60, 0), + (1614, 1, 282, 80, 0), + (1615, 1, 282, 100, 0), + (1616, 1, 279, 7, 0), + (1617, 1, 279, 11, 0), + (1618, 1, 279, 15, 0), + (1619, 1, 279, 17, 0), + (1620, 1, 279, 19, 0), + (1621, 1, 177, 20, -1), + (1622, 1, 177, 22, -1), + (1623, 1, 177, 24, -1), + (1624, 1, 177, 20, -1), + (1625, 1, 177, 22, -1), + (1626, 1, 177, 24, -1), + (1627, 1, 271, 5, 0), + (1628, 1, 271, 10, 0), + (1629, 1, 271, 15, 0), + (1633, 1, 225, 18, 0), + (1634, 1, 225, 21, 0), + (1635, 1, 225, 24, 0), + (1636, 1, 225, 27, 0), + (1637, 1, 225, 30, 0), + (1641, 1, 359, 100, 0), + (1642, 1, 359, 60, 0), + (1648, 1, 339, 10, 8105), + (1648, 2, 142, 65, 0), + (1648, 3, 311, 0, 0), + (1648, 4, 134, 70, 0), + (1648, 5, 348, 10, 0), + (1648, 6, 137, 0, 0), + (1648, 7, 339, 10, 8105), + (1648, 8, 142, 65, 0), + (1648, 9, 311, 0, 0), + (1648, 10, 134, 70, 0), + (1648, 11, 348, 10, 0), + (1648, 12, 137, 100, 0), + (1648, 13, 339, 10, 8105), + (1648, 14, 142, 65, 0), + (1648, 15, 311, 0, 0), + (1648, 16, 134, 70, 0), + (1648, 17, 348, 10, 0), + (1648, 18, 137, 79, 0), + (1648, 19, 339, 10, 8105), + (1648, 20, 142, 65, 0), + (1648, 21, 311, 0, 0), + (1648, 22, 134, 70, 0), + (1648, 23, 348, 10, 0), + (1648, 24, 137, 147, 0), + (1648, 25, 339, 10, 11404), + (1648, 26, 142, 71, 0), + (1648, 27, 311, 0, 0), + (1648, 28, 134, 75, 0), + (1648, 29, 348, 10, 0), + (1648, 30, 137, 0, 0), + (1648, 31, 339, 10, 11404), + (1648, 32, 142, 71, 0), + (1648, 33, 311, 0, 0), + (1648, 34, 134, 75, 0), + (1648, 35, 348, 10, 0), + (1648, 36, 137, 100, 0), + (1648, 37, 339, 10, 11404), + (1648, 38, 142, 71, 0), + (1648, 39, 311, 0, 0), + (1648, 40, 134, 75, 0), + (1648, 41, 348, 10, 0), + (1648, 42, 137, 79, 0), + (1648, 43, 339, 10, 11404), + (1648, 44, 142, 71, 0), + (1648, 45, 311, 0, 0), + (1648, 46, 134, 75, 0), + (1648, 47, 348, 10, 0), + (1648, 48, 137, 147, 0), + (1649, 1, 339, 10, 8105), + (1649, 2, 142, 65, 0), + (1649, 3, 311, 0, 0), + (1649, 4, 134, 70, 0), + (1649, 5, 348, 10, 0), + (1649, 6, 137, 0, 0), + (1649, 7, 339, 10, 8105), + (1649, 8, 142, 65, 0), + (1649, 9, 311, 0, 0), + (1649, 10, 134, 70, 0), + (1649, 11, 348, 10, 0), + (1649, 12, 137, 100, 0), + (1649, 13, 339, 10, 8105), + (1649, 14, 142, 65, 0), + (1649, 15, 311, 0, 0), + (1649, 16, 134, 70, 0), + (1649, 17, 348, 10, 0), + (1649, 18, 137, 79, 0), + (1649, 19, 339, 10, 8105), + (1649, 20, 142, 65, 0), + (1649, 21, 311, 0, 0), + (1649, 22, 134, 70, 0), + (1649, 23, 348, 10, 0), + (1649, 24, 137, 147, 0), + (1649, 25, 339, 10, 11404), + (1649, 26, 142, 71, 0), + (1649, 27, 311, 0, 0), + (1649, 28, 134, 75, 0), + (1649, 29, 348, 10, 0), + (1649, 30, 137, 0, 0), + (1649, 31, 339, 10, 11404), + (1649, 32, 142, 71, 0), + (1649, 33, 311, 0, 0), + (1649, 34, 134, 75, 0), + (1649, 35, 348, 10, 0), + (1649, 36, 137, 100, 0), + (1649, 37, 339, 10, 11404), + (1649, 38, 142, 71, 0), + (1649, 39, 311, 0, 0), + (1649, 40, 134, 75, 0), + (1649, 41, 348, 10, 0), + (1649, 42, 137, 79, 0), + (1649, 43, 339, 10, 11404), + (1649, 44, 142, 71, 0), + (1649, 45, 311, 0, 0), + (1649, 46, 134, 75, 0), + (1649, 47, 348, 10, 0), + (1649, 48, 137, 147, 0), + (1649, 49, 339, 10, 13199), + (1649, 50, 142, 76, 0), + (1649, 51, 311, 0, 0), + (1649, 52, 134, 80, 0), + (1649, 53, 348, 10, 0), + (1649, 54, 137, 0, 0), + (1649, 55, 339, 10, 13199), + (1649, 56, 142, 76, 0), + (1649, 57, 311, 0, 0), + (1649, 58, 134, 80, 0), + (1649, 59, 348, 10, 0), + (1649, 60, 137, 100, 0), + (1649, 61, 339, 10, 13199), + (1649, 62, 142, 76, 0), + (1649, 63, 311, 0, 0), + (1649, 64, 134, 80, 0), + (1649, 65, 348, 10, 0), + (1649, 66, 137, 79, 0), + (1649, 67, 339, 10, 13199), + (1649, 68, 142, 76, 0), + (1649, 69, 311, 0, 0), + (1649, 70, 134, 80, 0), + (1649, 71, 348, 10, 0), + (1649, 72, 137, 147, 0), + (1650, 1, 339, 10, 8105), + (1650, 2, 142, 65, 0), + (1650, 3, 311, 0, 0), + (1650, 4, 134, 70, 0), + (1650, 5, 348, 10, 0), + (1650, 6, 137, 0, 0), + (1650, 7, 339, 10, 8105), + (1650, 8, 142, 65, 0), + (1650, 9, 311, 0, 0), + (1650, 10, 134, 70, 0), + (1650, 11, 348, 10, 0), + (1650, 12, 137, 100, 0), + (1650, 13, 339, 10, 8105), + (1650, 14, 142, 65, 0), + (1650, 15, 311, 0, 0), + (1650, 16, 134, 70, 0), + (1650, 17, 348, 10, 0), + (1650, 18, 137, 79, 0), + (1650, 19, 339, 10, 8105), + (1650, 20, 142, 65, 0), + (1650, 21, 311, 0, 0), + (1650, 22, 134, 70, 0), + (1650, 23, 348, 10, 0), + (1650, 24, 137, 147, 0), + (1650, 25, 339, 10, 11404), + (1650, 26, 142, 71, 0), + (1650, 27, 311, 0, 0), + (1650, 28, 134, 75, 0), + (1650, 29, 348, 10, 0), + (1650, 30, 137, 0, 0), + (1650, 31, 339, 10, 11404), + (1650, 32, 142, 71, 0), + (1650, 33, 311, 0, 0), + (1650, 34, 134, 75, 0), + (1650, 35, 348, 10, 0), + (1650, 36, 137, 100, 0), + (1650, 37, 339, 10, 11404), + (1650, 38, 142, 71, 0), + (1650, 39, 311, 0, 0), + (1650, 40, 134, 75, 0), + (1650, 41, 348, 10, 0), + (1650, 42, 137, 79, 0), + (1650, 43, 339, 10, 11404), + (1650, 44, 142, 71, 0), + (1650, 45, 311, 0, 0), + (1650, 46, 134, 75, 0), + (1650, 47, 348, 10, 0), + (1650, 48, 137, 147, 0), + (1650, 49, 339, 10, 13199), + (1650, 50, 142, 76, 0), + (1650, 51, 311, 0, 0), + (1650, 52, 134, 80, 0), + (1650, 53, 348, 10, 0), + (1650, 54, 137, 0, 0), + (1650, 55, 339, 10, 13199), + (1650, 56, 142, 76, 0), + (1650, 57, 311, 0, 0), + (1650, 58, 134, 80, 0), + (1650, 59, 348, 10, 0), + (1650, 60, 137, 100, 0), + (1650, 61, 339, 10, 13199), + (1650, 62, 142, 76, 0), + (1650, 63, 311, 0, 0), + (1650, 64, 134, 80, 0), + (1650, 65, 348, 10, 0), + (1650, 66, 137, 79, 0), + (1650, 67, 339, 10, 13199), + (1650, 68, 142, 76, 0), + (1650, 69, 311, 0, 0), + (1650, 70, 134, 80, 0), + (1650, 71, 348, 10, 0), + (1650, 72, 137, 147, 0), + (1650, 73, 339, 10, 13830), + (1650, 74, 142, 81, 0), + (1650, 75, 311, 0, 0), + (1650, 76, 134, 85, 0), + (1650, 77, 348, 10, 0), + (1650, 78, 137, 0, 0), + (1650, 79, 339, 10, 13830), + (1650, 80, 142, 81, 0), + (1650, 81, 311, 0, 0), + (1650, 82, 134, 85, 0), + (1650, 83, 348, 10, 0), + (1650, 84, 137, 100, 0), + (1650, 85, 339, 10, 13830), + (1650, 86, 142, 81, 0), + (1650, 87, 311, 0, 0), + (1650, 88, 134, 85, 0), + (1650, 89, 348, 10, 0), + (1650, 90, 137, 79, 0), + (1650, 91, 339, 10, 13830), + (1650, 92, 142, 81, 0), + (1650, 93, 311, 0, 0), + (1650, 94, 134, 85, 0), + (1650, 95, 348, 10, 0), + (1650, 96, 137, 147, 0), + (1651, 1, 97, 300, 0), + (1652, 1, 97, 350, 0), + (1653, 1, 97, 400, 0), + (1654, 1, 97, 450, 0), + (1655, 1, 97, 500, 0), + (1656, 1, 127, 40, 0), + (1656, 2, 137, 154, 0), + (1656, 3, 403, 2, 0), + (1656, 4, 404, 10, 0), + (1657, 1, 127, 50, 0), + (1657, 2, 137, 154, 0), + (1657, 3, 403, 2, 0), + (1657, 4, 404, 10, 0), + (1659, 1, 127, 40, 0), + (1659, 2, 137, 154, 0), + (1659, 3, 403, 2, 0), + (1659, 4, 404, 10, 0), + (1660, 1, 127, 50, 0), + (1660, 2, 137, 154, 0), + (1660, 3, 403, 2, 0), + (1660, 4, 404, 10, 0), + (1662, 1, 370, 2, 0), + (1663, 1, 370, 4, 0), + (1664, 1, 370, 6, 0), + (1665, 1, 370, 8, 0), + (1666, 1, 370, 10, 0), + (2400, 1, 264, 90, 38), + (2401, 1, 264, 180, 38), + (2402, 1, 264, 270, 38), + (4666, 0, 366, 10, 50), + (4666, 1, 349, 5, 0), + (4667, 0, 366, 30, 50), + (4667, 1, 349, 10, 0), + (4668, 0, 366, 60, 50), + (4668, 1, 349, 15, 0), + (4669, 0, 366, 10, 500), + (4669, 1, 349, 20, 0), + (4670, 0, 366, 30, 500), + (4670, 1, 349, 25, 0), + (4672, 1, 268, 10, 57), + (4673, 1, 268, 25, 57), + (4674, 1, 268, 50, 57), + (4675, 1, 268, 10, 68), + (4676, 1, 268, 25, 68), + (4677, 1, 268, 50, 68), + (4678, 1, 262, 55, 0), + (4678, 2, 262, 55, 1), + (4678, 3, 262, 55, 2), + (4678, 4, 262, 55, 3), + (4678, 5, 262, 55, 4), + (4678, 6, 262, 55, 5), + (4678, 7, 262, 55, 6), + (4679, 1, 262, 60, 0), + (4679, 2, 262, 60, 1), + (4679, 3, 262, 60, 2), + (4679, 4, 262, 60, 3), + (4679, 5, 262, 60, 4), + (4679, 6, 262, 60, 5), + (4679, 7, 262, 60, 6), + (4680, 1, 262, 65, 0), + (4680, 2, 262, 65, 1), + (4680, 3, 262, 65, 2), + (4680, 4, 262, 65, 3), + (4680, 5, 262, 65, 4), + (4680, 6, 262, 65, 5), + (4680, 7, 262, 65, 6), + (4681, 1, 262, 70, 0), + (4681, 2, 262, 70, 1), + (4681, 3, 262, 70, 2), + (4681, 4, 262, 70, 3), + (4681, 5, 262, 70, 4), + (4681, 6, 262, 70, 5), + (4681, 7, 262, 70, 6), + (4682, 1, 262, 75, 0), + (4682, 2, 262, 75, 1), + (4682, 3, 262, 75, 2), + (4682, 4, 262, 75, 3), + (4682, 5, 262, 75, 4), + (4682, 6, 262, 75, 5), + (4682, 7, 262, 75, 6), + (4683, 1, 328, 550, 0), + (4684, 1, 328, 600, 0), + (4685, 1, 328, 650, 0), + (4686, 1, 328, 700, 0), + (4687, 1, 328, 750, 0), + (4688, 1, 282, 20, 0), + (4689, 1, 282, 40, 0), + (4690, 1, 282, 60, 0), + (4691, 1, 282, 80, 0), + (4692, 1, 282, 100, 0), + (4693, 1, 0, 11, 0), + (4694, 1, 0, 12, 0), + (4695, 1, 0, 13, 0), + (4696, 1, 0, 14, 0), + (4697, 1, 0, 15, 0), + (4698, 1, 362, 1, 0), + (4699, 1, 363, 1, 0), + (4707, 1, 330, 85, 0), + (4707, 2, 330, 85, 1), + (4707, 3, 330, 85, 2), + (4707, 4, 330, 85, 3), + (4707, 5, 330, 85, 28), + (4707, 6, 330, 85, 36), + (4707, 7, 330, 85, 77), + (4708, 1, 330, 95, 0), + (4708, 2, 330, 95, 1), + (4708, 3, 330, 95, 2), + (4708, 4, 330, 95, 3), + (4708, 5, 330, 95, 28), + (4708, 6, 330, 95, 36), + (4708, 7, 330, 95, 77), + (4709, 1, 330, 105, 0), + (4709, 2, 330, 105, 1), + (4709, 3, 330, 105, 2), + (4709, 4, 330, 105, 3), + (4709, 5, 330, 105, 28), + (4709, 6, 330, 105, 36), + (4709, 7, 330, 105, 77), + (4710, 1, 330, 85, 0), + (4710, 2, 330, 85, 1), + (4710, 3, 330, 85, 2), + (4710, 4, 330, 85, 3), + (4710, 5, 330, 85, 28), + (4710, 6, 330, 85, 36), + (4711, 1, 330, 95, 0), + (4711, 2, 330, 95, 1), + (4711, 3, 330, 95, 2), + (4711, 4, 330, 95, 3), + (4711, 5, 330, 95, 28), + (4711, 6, 330, 95, 36), + (4712, 1, 330, 105, 0), + (4712, 2, 330, 105, 1), + (4712, 3, 330, 105, 2), + (4712, 4, 330, 105, 3), + (4712, 5, 330, 105, 28), + (4712, 6, 330, 105, 36), + (4713, 1, 330, 85, 0), + (4713, 2, 330, 85, 1), + (4713, 3, 330, 85, 2), + (4713, 4, 330, 85, 3), + (4713, 5, 330, 85, 28), + (4713, 6, 330, 85, 36), + (4713, 7, 330, 85, 77), + (4714, 1, 330, 95, 0), + (4714, 2, 330, 95, 1), + (4714, 3, 330, 95, 2), + (4714, 4, 330, 95, 3), + (4714, 5, 330, 95, 28), + (4714, 6, 330, 95, 36), + (4714, 7, 330, 95, 77), + (4715, 1, 330, 105, 0), + (4715, 2, 330, 105, 1), + (4715, 3, 330, 105, 2), + (4715, 4, 330, 105, 3), + (4715, 5, 330, 105, 28), + (4715, 6, 330, 105, 36), + (4715, 7, 330, 105, 77), + (4716, 1, 330, 60, 0), + (4716, 2, 330, 60, 1), + (4716, 3, 330, 60, 2), + (4716, 4, 330, 60, 3), + (4716, 5, 330, 60, 28), + (4716, 6, 330, 60, 36), + (4716, 7, 330, 60, 77), + (4717, 1, 330, 70, 0), + (4717, 2, 330, 70, 1), + (4717, 3, 330, 70, 2), + (4717, 4, 330, 70, 3), + (4717, 5, 330, 70, 28), + (4717, 6, 330, 70, 36), + (4717, 7, 330, 70, 77), + (4718, 1, 330, 80, 0), + (4718, 2, 330, 80, 1), + (4718, 3, 330, 80, 2), + (4718, 4, 330, 80, 3), + (4718, 5, 330, 80, 28), + (4718, 6, 330, 80, 36), + (4718, 7, 330, 80, 77), + (4722, 1, 278, 620, 35216), + (4722, 2, 440, 66, 100), + (4723, 1, 278, 650, 38310), + (4723, 2, 440, 68, 100), + (4724, 1, 278, 670, 41300), + (4724, 2, 440, 70, 100), + (4725, 1, 341, 60, 0), + (4726, 1, 341, 70, 0), + (4727, 1, 341, 80, 0), + (4728, 1, 341, 90, 0), + (4729, 1, 341, 100, 0), + (4733, 1, 294, 11, 100), + (4734, 1, 294, 13, 100), + (4735, 1, 294, 15, 100), + (4739, 1, 360, 10, 11023), + (4740, 1, 360, 20, 11023), + (4741, 1, 360, 30, 11023), + (4744, 1, 318, 6, 0), + (4745, 1, 318, 7, 0), + (4746, 1, 318, 8, 0), + (4747, 1, 318, 9, 0), + (4748, 1, 318, 10, 0), + (4749, 1, 294, 11, 100), + (4750, 1, 294, 13, 100), + (4751, 1, 294, 15, 100), + (4752, 1, 294, 0, 155), + (4753, 1, 294, 0, 160), + (4754, 1, 294, 0, 165), + (4755, 1, 294, 0, 130), + (4756, 1, 294, 0, 135), + (4757, 1, 294, 0, 140), + (4758, 1, 266, 27, 0), + (4759, 1, 266, 28, 0), + (4760, 1, 266, 29, 0), + (4761, 1, 273, 2, 0), + (4762, 1, 273, 3, 0), + (4763, 1, 273, 4, 0), + (4764, 1, 326, 2, 0), + (4767, 1, 114, -43, 0), + (4768, 1, 114, -46, 0), + (4769, 1, 114, -50, 0), + (4773, 1, 339, 10, 8105), + (4773, 2, 142, 65, 0), + (4773, 3, 311, 0, 0), + (4773, 4, 134, 70, 0), + (4773, 5, 348, 10, 0), + (4773, 6, 137, 0, 0), + (4773, 7, 339, 10, 8105), + (4773, 8, 142, 65, 0), + (4773, 9, 311, 0, 0), + (4773, 10, 134, 70, 0), + (4773, 11, 348, 10, 0), + (4773, 12, 137, 100, 0), + (4773, 13, 339, 10, 8105), + (4773, 14, 142, 65, 0), + (4773, 15, 311, 0, 0), + (4773, 16, 134, 70, 0), + (4773, 17, 348, 10, 0), + (4773, 18, 137, 79, 0), + (4773, 19, 339, 10, 8105), + (4773, 20, 142, 65, 0), + (4773, 21, 311, 0, 0), + (4773, 22, 134, 70, 0), + (4773, 23, 348, 10, 0), + (4773, 24, 137, 147, 0), + (4773, 25, 339, 10, 11404), + (4773, 26, 142, 71, 0), + (4773, 27, 311, 0, 0), + (4773, 28, 134, 75, 0), + (4773, 29, 348, 10, 0), + (4773, 30, 137, 0, 0), + (4773, 31, 339, 10, 11404), + (4773, 32, 142, 71, 0), + (4773, 33, 311, 0, 0), + (4773, 34, 134, 75, 0), + (4773, 35, 348, 10, 0), + (4773, 36, 137, 100, 0), + (4773, 37, 339, 10, 11404), + (4773, 38, 142, 71, 0), + (4773, 39, 311, 0, 0), + (4773, 40, 134, 75, 0), + (4773, 41, 348, 10, 0), + (4773, 42, 137, 79, 0), + (4773, 43, 339, 10, 11404), + (4773, 44, 142, 71, 0), + (4773, 45, 311, 0, 0), + (4773, 46, 134, 75, 0), + (4773, 47, 348, 10, 0), + (4773, 48, 137, 147, 0), + (4776, 1, 319, 12, 0), + (4777, 1, 319, 14, 0), + (4778, 1, 319, 16, 0), + (4779, 1, 274, 24, 0), + (4780, 1, 274, 26, 0), + (4781, 1, 274, 28, 0), + (4790, 1, 220, 288, 74), + (4791, 1, 220, 320, 74), + (4792, 1, 220, 352, 74), + (4793, 1, 220, 384, 74), + (4794, 1, 220, 416, 74), + (4795, 1, 279, 28, 0), + (4796, 1, 279, 29, 0), + (4797, 1, 279, 30, 0), + (4798, 1, 292, 65, 0), + (4799, 1, 292, 70, 0), + (4800, 1, 292, 75, 0), + (4801, 1, 227, 30, 32), + (4802, 1, 227, 60, 32), + (4803, 1, 227, 90, 32), + (4804, 1, 220, 448, 74), + (4805, 1, 220, 480, 74), + (4806, 1, 220, 512, 74), + (4807, 1, 220, 544, 74), + (4808, 1, 220, 576, 74), + (4809, 1, 216, 40, 74), + (4810, 1, 216, 80, 74), + (4811, 1, 216, 120, 74), + (4813, 1, 220, 70, 26), + (4813, 2, 220, 70, 30), + (4813, 3, 220, 70, 38), + (4814, 1, 220, 80, 26), + (4814, 2, 220, 80, 30), + (4814, 3, 220, 80, 38), + (4815, 1, 220, 90, 26), + (4815, 2, 220, 90, 30), + (4815, 3, 220, 90, 38), + (4819, 1, 239, 52, 0), + (4820, 1, 239, 54, 0), + (4821, 1, 239, 56, 0), + (4822, 1, 239, 58, 0), + (4823, 1, 239, 60, 0), + (4824, 1, 239, 52, 0), + (4825, 1, 239, 54, 0), + (4826, 1, 239, 56, 0), + (4827, 1, 239, 58, 0), + (4828, 1, 239, 60, 0), + (4829, 1, 264, 480, 420), + (4830, 1, 264, 600, 420), + (4831, 1, 264, 720, 420), + (4844, 1, 349, 5, 0), + (4845, 1, 349, 10, 0), + (4846, 1, 349, 15, 0), + (4847, 1, 349, 20, 0), + (4848, 1, 349, 25, 0), + (4861, 1, 264, 600, 68), + (4862, 1, 264, 1200, 68), + (4863, 1, 264, 1800, 68), + (4887, 1, 264, 120, 413), + (4888, 1, 264, 240, 413), + (4889, 1, 264, 360, 413), + (4897, 1, 280, 44, 0), + (4898, 1, 280, 47, 0), + (4899, 1, 280, 50, 0), + (4921, 1, 264, 1896, 117), + (4921, 2, 244, 75, 0), + (4922, 1, 264, 2496, 117), + (4922, 2, 244, 60, 0), + (4923, 1, 264, 3096, 117), + (4923, 2, 244, 45, 0), + (4924, 1, 273, 1, 0), + (4925, 1, 273, 2, 0), + (4926, 1, 273, 3, 0), + (4948, 1, 258, 35, 0), + (4949, 1, 258, 40, 0), + (4950, 1, 258, 45, 0), + (4951, 1, 220, 40, 8), + (4952, 1, 220, 50, 8), + (4953, 1, 220, 60, 8), + (4957, 1, 252, 55, 0), + (4958, 1, 252, 60, 0), + (4959, 1, 252, 65, 0), + (4960, 1, 280, 46, 0), + (4961, 1, 280, 51, 0), + (4962, 1, 280, 56, 0), + (4983, 1, 216, 65, 0), + (4983, 2, 216, 65, 1), + (4983, 3, 216, 65, 2), + (4983, 4, 216, 65, 3), + (4983, 5, 216, 65, 10), + (4983, 6, 216, 65, 28), + (4983, 7, 216, 65, 30), + (4983, 8, 216, 65, 36), + (4983, 9, 216, 65, 77), + (4984, 1, 216, 70, 0), + (4984, 2, 216, 70, 1), + (4984, 3, 216, 70, 2), + (4984, 4, 216, 70, 3), + (4984, 5, 216, 70, 10), + (4984, 6, 216, 70, 28), + (4984, 7, 216, 70, 30), + (4984, 8, 216, 70, 36), + (4984, 9, 216, 70, 77), + (4985, 1, 216, 75, 0), + (4985, 2, 216, 75, 1), + (4985, 3, 216, 75, 2), + (4985, 4, 216, 75, 3), + (4985, 5, 216, 75, 10), + (4985, 6, 216, 75, 28), + (4985, 7, 216, 75, 30), + (4985, 8, 216, 75, 36), + (4985, 9, 216, 75, 77), + (4986, 1, 217, 0, 52960), + (4986, 2, 346, 66, 40), + (4987, 1, 217, 0, 55400), + (4987, 2, 346, 68, 40), + (4988, 1, 217, 0, 60280), + (4988, 2, 346, 70, 40), + (4989, 1, 347, 8, 0), + (4990, 1, 347, 10, 0), + (4991, 1, 347, 12, 0), + (4992, 1, 279, 21, 0), + (4993, 1, 279, 23, 0), + (4994, 1, 279, 25, 0), + (4995, 1, 279, 27, 0), + (4996, 1, 279, 28, 0), + (5000, 1, 313, 80, 0), + (5001, 1, 313, 90, 0), + (5002, 1, 313, 100, 0), + (5010, 1, 264, 432, 35), + (5011, 1, 264, 864, 35), + (5012, 1, 264, 1296, 35), + (5013, 1, 293, 90, 0), + (5014, 1, 293, 100, 0), + (5029, 1, 85, 11621, 0), + (5030, 1, 85, 11622, 0), + (5031, 1, 85, 11623, 0), + (5032, 1, 274, 22, 0), + (5033, 1, 274, 24, 0), + (5034, 1, 274, 26, 0), + (5035, 1, 293, 60, 0), + (5036, 1, 293, 70, 0), + (5037, 1, 293, 80, 0), + (5038, 1, 219, 330, 2100), + (5039, 1, 219, 360, 2200), + (5040, 1, 219, 390, 2300), + (5045, 1, 180, 5, 0), + (5061, 1, 244, -25, 0), + (5085, 1, 360, 25, 11297), + (5086, 1, 360, 25, 11298), + (5087, 1, 360, 25, 11299), + (5118, 1, 264, 720, 396), + (5118, 2, 264, 720, 8504), + (5118, 3, 264, 720, 8505), + (5119, 1, 264, 1440, 396), + (5119, 2, 264, 1440, 8504), + (5119, 3, 264, 1440, 8505), + (5120, 1, 264, 2160, 396), + (5120, 2, 264, 2160, 8504), + (5120, 3, 264, 2160, 8505), + (5127, 1, 264, 300, 261), + (5128, 1, 264, 600, 261), + (5129, 1, 264, 900, 261), + (5133, 1, 294, 13, 100), + (5134, 1, 294, 15, 100), + (5135, 1, 294, 17, 100), + (5136, 1, 282, 20, 0), + (5137, 1, 282, 40, 0), + (5138, 1, 282, 60, 0), + (5139, 1, 282, 80, 0), + (5140, 1, 282, 100, 0), + (5141, 1, 279, 21, 0), + (5142, 1, 279, 23, 0), + (5143, 1, 279, 25, 0), + (5144, 1, 279, 27, 0), + (5145, 1, 279, 28, 0), + (5243, 1, 69, 600, 0), + (5244, 1, 69, 700, 0), + (5245, 1, 69, 800, 0), + (5246, 1, 69, 900, 0), + (5247, 1, 69, 1000, 0), + (5248, 1, 360, 10, 11232), + (5249, 1, 360, 20, 11232), + (5250, 1, 360, 30, 11232), + (5254, 1, 218, 6, 0), + (5255, 1, 218, 7, 0), + (5256, 1, 218, 8, 0), + (5257, 1, 218, 9, 0), + (5258, 1, 218, 10, 0), + (5259, 1, 218, 6, 0), + (5260, 1, 218, 7, 0), + (5261, 1, 218, 8, 0), + (5262, 1, 218, 9, 0), + (5263, 1, 218, 10, 0), + (5264, 1, 218, 1, 0), + (5265, 1, 218, 2, 0), + (5266, 1, 218, 3, 0), + (5267, 1, 218, 4, 0), + (5268, 1, 218, 5, 0), + (5269, 1, 131, 50, 50), + (5269, 2, 137, 82, 0), + (5270, 1, 303, 3000, 3000), + (5270, 2, 139, 2766, 0), + (5271, 1, 303, 3500, 3500), + (5271, 2, 139, 2766, 0), + (5272, 1, 303, 4000, 4000), + (5272, 2, 139, 2766, 0), + (5276, 1, 264, 60, 621), + (5276, 2, 264, 60, 622), + (5276, 3, 264, 60, 623), + (5276, 4, 264, 60, 784), + (5276, 5, 264, 60, 785), + (5276, 6, 264, 60, 786), + (5276, 7, 264, 60, 787), + (5276, 8, 264, 60, 624), + (5277, 1, 264, 120, 621), + (5277, 2, 264, 120, 622), + (5277, 3, 264, 120, 623), + (5277, 4, 264, 120, 784), + (5277, 5, 264, 120, 785), + (5277, 6, 264, 120, 786), + (5277, 7, 264, 120, 787), + (5277, 8, 264, 120, 624), + (5278, 1, 264, 180, 621), + (5278, 2, 264, 180, 622), + (5278, 3, 264, 180, 623), + (5278, 4, 264, 180, 784), + (5278, 5, 264, 180, 785), + (5278, 6, 264, 180, 786), + (5278, 7, 264, 180, 787), + (5278, 8, 264, 180, 624), + (5283, 1, 320, 1, 0), + (5284, 1, 320, 3, 0), + (5285, 1, 320, 5, 0), + (5286, 1, 294, 7, 100), + (5287, 1, 294, 8, 100), + (5288, 1, 294, 9, 100), + (5290, 1, 439, 0, 46480), + (5290, 2, 345, 62, 0), + (5291, 1, 439, 0, 52960), + (5291, 2, 345, 63, 0), + (5292, 1, 439, 0, 55400), + (5292, 2, 345, 64, 0), + (5293, 1, 439, 0, 60280), + (5293, 2, 345, 65, 0), + (5294, 1, 439, 0, 65440), + (5294, 2, 345, 66, 50), + (5295, 1, 360, 10, 11629), + (5296, 1, 360, 20, 11629), + (5297, 1, 360, 30, 11629), + (5301, 1, 189, 7, 0), + (5302, 1, 189, 8, 0), + (5303, 1, 189, 9, 0), + (5304, 1, 189, 10, 0), + (5305, 1, 189, 11, 0), + (5306, 1, 15, 4, 0), + (5307, 1, 15, 5, 0), + (5308, 1, 15, 6, 0), + (5309, 1, 15, 7, 0), + (5310, 1, 15, 8, 0), + (5317, 1, 114, -43, 0), + (5318, 1, 114, -46, 0), + (5319, 1, 114, -50, 0), + (5320, 1, 218, 11, 0), + (5321, 1, 218, 12, 0), + (5322, 1, 218, 13, 0), + (5323, 1, 218, 14, 0), + (5324, 1, 218, 15, 0), + (5325, 1, 280, 27, 0), + (5326, 1, 280, 34, 0), + (5327, 1, 280, 41, 0), + (5328, 1, 280, 44, 0), + (5329, 1, 280, 47, 0), + (5339, 1, 215, 24, 0), + (5347, 1, 375, 225, 0), + (5348, 1, 375, 230, 0), + (5360, 1, 397, 1300, 0), + (5366, 1, 247, 75, 20), + (5500, 1, 231, 5, 0), + (5501, 1, 231, 7, 0), + (5502, 1, 231, 9, 0), + (5516, 1, 320, 6, 0), + (5517, 1, 320, 7, 0), + (5518, 1, 320, 8, 0), + (5519, 1, 172, 40, 0), + (5520, 1, 172, 41, 0), + (5521, 1, 172, 42, 0), + (5522, 1, 172, 43, 0), + (5523, 1, 172, 44, 0), + (5524, 1, 259, 46, 0), + (5525, 1, 259, 47, 0), + (5526, 1, 259, 48, 0), + (5527, 1, 259, 49, 0), + (5528, 1, 259, 50, 0), + (5529, 1, 339, 11, 12680), + (5529, 2, 138, 1, 0), + (5529, 3, 141, 1, 0), + (5529, 4, 142, 60, 0), + (5529, 5, 137, 0, 0), + (5529, 6, 311, 0, 0), + (5529, 7, 134, 80, 0), + (5529, 8, 139, -265, 0), + (5529, 9, 139, -754, 0), + (5529, 10, 139, -1332, 0), + (5529, 11, 139, -1572, 0), + (5529, 12, 139, -2749, 0), + (5529, 13, 139, -4979, 0), + (5529, 14, 139, -5418, 0), + (5529, 15, 139, -5403, 0), + (5529, 16, 348, 10, 0), + (5530, 1, 339, 13, 12681), + (5530, 2, 138, 1, 0), + (5530, 3, 141, 1, 0), + (5530, 4, 142, 60, 0), + (5530, 5, 137, 0, 0), + (5530, 6, 311, 0, 0), + (5530, 7, 134, 80, 0), + (5530, 8, 139, -265, 0), + (5530, 9, 139, -754, 0), + (5530, 10, 139, -1332, 0), + (5530, 11, 139, -1572, 0), + (5530, 12, 139, -2749, 0), + (5530, 13, 139, -4979, 0), + (5530, 14, 139, -5418, 0), + (5530, 15, 139, -5403, 0), + (5530, 16, 348, 10, 0), + (5531, 1, 339, 15, 12682), + (5531, 2, 138, 1, 0), + (5531, 3, 141, 1, 0), + (5531, 4, 142, 60, 0), + (5531, 5, 137, 0, 0), + (5531, 6, 311, 0, 0), + (5531, 7, 134, 80, 0), + (5531, 8, 139, -265, 0), + (5531, 9, 139, -754, 0), + (5531, 10, 139, -1332, 0), + (5531, 11, 139, -1572, 0), + (5531, 12, 139, -2749, 0), + (5531, 13, 139, -4979, 0), + (5531, 14, 139, -5418, 0), + (5531, 15, 139, -5403, 0), + (5531, 16, 348, 10, 0), + (5532, 1, 339, 17, 12683), + (5532, 2, 138, 1, 0), + (5532, 3, 141, 1, 0), + (5532, 4, 142, 60, 0), + (5532, 5, 137, 0, 0), + (5532, 6, 311, 0, 0), + (5532, 7, 134, 80, 0), + (5532, 8, 139, -265, 0), + (5532, 9, 139, -754, 0), + (5532, 10, 139, -1332, 0), + (5532, 11, 139, -1572, 0), + (5532, 12, 139, -2749, 0), + (5532, 13, 139, -4979, 0), + (5532, 14, 139, -5418, 0), + (5532, 15, 139, -5403, 0), + (5532, 16, 348, 10, 0), + (5533, 1, 339, 19, 12684), + (5533, 2, 138, 1, 0), + (5533, 3, 141, 1, 0), + (5533, 4, 142, 60, 0), + (5533, 5, 137, 0, 0), + (5533, 6, 311, 0, 0), + (5533, 7, 134, 80, 0), + (5533, 8, 139, -265, 0), + (5533, 9, 139, -754, 0), + (5533, 10, 139, -1332, 0), + (5533, 11, 139, -1572, 0), + (5533, 12, 139, -2749, 0), + (5533, 13, 139, -4979, 0), + (5533, 14, 139, -5418, 0), + (5533, 15, 139, -5403, 0), + (5533, 16, 348, 10, 0), + (5534, 1, 266, 18, 0), + (5535, 1, 266, 20, 0), + (5536, 1, 266, 22, 0), + (5542, 1, 330, 110, 0), + (5542, 2, 330, 110, 1), + (5542, 3, 330, 110, 2), + (5542, 4, 330, 110, 3), + (5542, 5, 330, 110, 28), + (5542, 6, 330, 110, 36), + (5542, 7, 330, 110, 77), + (5543, 1, 330, 115, 0), + (5543, 2, 330, 115, 1), + (5543, 3, 330, 115, 2), + (5543, 4, 330, 115, 3), + (5543, 5, 330, 115, 28), + (5543, 6, 330, 115, 36), + (5543, 7, 330, 115, 77), + (5544, 1, 330, 120, 0), + (5544, 2, 330, 120, 1), + (5544, 3, 330, 120, 2), + (5544, 4, 330, 120, 3), + (5544, 5, 330, 120, 28), + (5544, 6, 330, 120, 36), + (5544, 7, 330, 120, 77), + (5545, 1, 330, 110, 0), + (5545, 2, 330, 110, 1), + (5545, 3, 330, 110, 2), + (5545, 4, 330, 110, 3), + (5545, 5, 330, 110, 28), + (5545, 6, 330, 110, 36), + (5546, 1, 330, 115, 0), + (5546, 2, 330, 115, 1), + (5546, 3, 330, 115, 2), + (5546, 4, 330, 115, 3), + (5546, 5, 330, 115, 28), + (5546, 6, 330, 115, 36), + (5547, 1, 330, 120, 0), + (5547, 2, 330, 120, 1), + (5547, 3, 330, 120, 2), + (5547, 4, 330, 120, 3), + (5547, 5, 330, 120, 28), + (5547, 6, 330, 120, 36), + (5548, 1, 330, 110, 0), + (5548, 2, 330, 110, 1), + (5548, 3, 330, 110, 2), + (5548, 4, 330, 110, 3), + (5548, 5, 330, 110, 28), + (5548, 6, 330, 110, 36), + (5548, 7, 330, 110, 77), + (5549, 1, 330, 115, 0), + (5549, 2, 330, 115, 1), + (5549, 3, 330, 115, 2), + (5549, 4, 330, 115, 3), + (5549, 5, 330, 115, 28), + (5549, 6, 330, 115, 36), + (5549, 7, 330, 115, 77), + (5550, 1, 330, 120, 0), + (5550, 2, 330, 120, 1), + (5550, 3, 330, 120, 2), + (5550, 4, 330, 120, 3), + (5550, 5, 330, 120, 28), + (5550, 6, 330, 120, 36), + (5550, 7, 330, 120, 77), + (5551, 1, 330, 85, 0), + (5551, 2, 330, 85, 1), + (5551, 3, 330, 85, 2), + (5551, 4, 330, 85, 3), + (5551, 5, 330, 85, 28), + (5551, 6, 330, 85, 36), + (5551, 7, 330, 85, 77), + (5552, 1, 330, 90, 0), + (5552, 2, 330, 90, 1), + (5552, 3, 330, 90, 2), + (5552, 4, 330, 90, 3), + (5552, 5, 330, 90, 28), + (5552, 6, 330, 90, 36), + (5552, 7, 330, 90, 77), + (5553, 1, 330, 95, 0), + (5553, 2, 330, 95, 1), + (5553, 3, 330, 95, 2), + (5553, 4, 330, 95, 3), + (5553, 5, 330, 95, 28), + (5553, 6, 330, 95, 36), + (5553, 7, 330, 95, 77), + (5554, 1, 278, 700, 44340), + (5554, 2, 440, 71, 100), + (5555, 1, 278, 720, 47230), + (5555, 2, 440, 73, 100), + (5556, 1, 278, 750, 51057), + (5556, 2, 440, 75, 100), + (5557, 1, 341, 110, 0), + (5558, 1, 341, 120, 0), + (5559, 1, 341, 130, 0), + (5560, 1, 341, 140, 0), + (5561, 1, 341, 150, 0), + (5562, 1, 360, 40, 11023), + (5563, 1, 360, 50, 11023), + (5564, 1, 360, 60, 11023), + (5566, 1, 318, 11, 0), + (5567, 1, 318, 12, 0), + (5568, 1, 318, 13, 0), + (5569, 1, 318, 14, 0), + (5570, 1, 318, 15, 0), + (5571, 1, 294, 16, 100), + (5572, 1, 294, 17, 100), + (5573, 1, 294, 18, 100), + (5574, 1, 294, 0, 170), + (5575, 1, 294, 0, 175), + (5576, 1, 294, 0, 180), + (5577, 1, 294, 0, 145), + (5578, 1, 294, 0, 150), + (5579, 1, 294, 0, 155), + (5580, 1, 266, 30, 0), + (5581, 1, 266, 31, 0), + (5582, 1, 266, 32, 0), + (5586, 1, 114, -53, 0), + (5587, 1, 114, -56, 0), + (5588, 1, 114, -59, 0), + (5589, 1, 319, 17, 0), + (5590, 1, 319, 19, 0), + (5591, 1, 319, 21, 0), + (5592, 1, 274, 30, 0), + (5593, 1, 274, 32, 0), + (5594, 1, 274, 34, 0), + (5595, 1, 279, 31, 0), + (5596, 1, 279, 32, 0), + (5597, 1, 279, 33, 0), + (5611, 1, 274, 28, 0), + (5612, 1, 274, 30, 0), + (5613, 1, 274, 32, 0), + (5617, 1, 294, 18, 100), + (5618, 1, 294, 19, 100), + (5619, 1, 294, 20, 100), + (5620, 1, 320, 6, 0), + (5621, 1, 320, 7, 0), + (5622, 1, 320, 8, 0), + (5623, 1, 15, 9, 0), + (5624, 1, 15, 10, 0), + (5625, 1, 15, 11, 0), + (5626, 1, 15, 12, 0), + (5627, 1, 15, 13, 0), + (5628, 1, 114, -53, 0), + (5629, 1, 114, -56, 0), + (5630, 1, 114, -59, 0), + (5729, 1, 218, 11, 0), + (5730, 1, 218, 12, 0), + (5731, 1, 218, 13, 0), + (5732, 1, 218, 14, 0), + (5733, 1, 218, 15, 0), + (5738, 1, 280, 62, 0), + (5739, 1, 280, 63, 0), + (5740, 1, 280, 64, 0), + (5776, 1, 169, 5, -1), + (5777, 1, 169, 10, -1), + (5778, 1, 169, 15, -1), + (5797, 1, 264, 2520, 396), + (5797, 2, 264, 2520, 8504), + (5797, 3, 264, 2520, 8505), + (5798, 1, 264, 2880, 396), + (5798, 2, 264, 2880, 8504), + (5798, 3, 264, 2880, 8505), + (5799, 1, 264, 3240, 396), + (5799, 2, 264, 3240, 8504), + (5799, 3, 264, 3240, 8505), + (5806, 1, 279, 7, 0), + (5807, 1, 279, 11, 0), + (5808, 1, 279, 15, 0), + (5825, 1, 244, -40, 0), + (5850, 1, 287, 2, 1), + (5850, 2, 137, 31, 0), + (5850, 3, 136, 5, 0), + (5860, 1, 243, 40, 0), + (5861, 1, 243, 45, 0), + (5862, 1, 243, 50, 0), + (5880, 1, 287, 8, 0), + (5880, 2, 385, 2754, 1), + (5881, 1, 287, 10, 0), + (5881, 2, 385, 2754, 1), + (5882, 1, 287, 12, 0), + (5882, 2, 385, 2754, 1), + (5883, 2, 139, 2754, 1), + (5886, 1, 274, 12, 0), + (5887, 1, 274, 14, 0), + (5888, 1, 274, 16, 0), + (5889, 1, 280, 51, 0), + (5890, 1, 280, 52, 0), + (5891, 1, 280, 53, 0), + (5909, 1, 279, 29, 0), + (5910, 1, 279, 30, 0), + (5911, 1, 279, 31, 0), + (5912, 1, 279, 32, 0), + (5913, 1, 279, 33, 0), + (5917, 1, 220, 100, 26), + (5917, 2, 220, 100, 30), + (5917, 3, 220, 100, 38), + (5918, 1, 220, 110, 26), + (5918, 2, 220, 110, 30), + (5918, 3, 220, 110, 38), + (5919, 1, 220, 120, 26), + (5919, 2, 220, 120, 30), + (5919, 3, 220, 120, 38), + (5922, 1, 292, 35, 0), + (5923, 1, 292, 40, 0), + (5924, 1, 292, 45, 0), + (5939, 1, 218, 6, 0), + (5940, 1, 218, 7, 0), + (5941, 1, 218, 8, 0), + (5942, 1, 218, 9, 0), + (5943, 1, 218, 10, 0), + (5944, 1, 273, 4, 0), + (5945, 1, 273, 5, 0), + (5946, 1, 273, 6, 0), + (5950, 1, 264, 240, 175), + (5950, 2, 264, 240, 792), + (5951, 1, 264, 300, 175), + (5951, 2, 264, 300, 792), + (5952, 1, 264, 360, 175), + (5952, 2, 264, 360, 792), + (5954, 1, 264, 2400, 68), + (5955, 1, 264, 3000, 68), + (5956, 1, 264, 3600, 68), + (5972, 1, 264, 2880, 6001), + (5972, 2, 264, 2880, 3676), + (5973, 1, 264, 2880, 6000), + (5973, 2, 264, 2880, 87), + (6003, 1, 279, 29, 0), + (6004, 1, 279, 30, 0), + (6005, 1, 279, 31, 0), + (6006, 1, 279, 32, 0), + (6007, 1, 279, 33, 0), + (6011, 1, 216, 95, 0), + (6011, 2, 216, 95, 1), + (6011, 3, 216, 95, 2), + (6011, 4, 216, 95, 3), + (6011, 5, 216, 95, 10), + (6011, 6, 216, 95, 28), + (6011, 7, 216, 95, 30), + (6011, 8, 216, 95, 36), + (6011, 9, 216, 95, 77), + (6012, 1, 216, 100, 0), + (6012, 2, 216, 100, 1), + (6012, 3, 216, 100, 2), + (6012, 4, 216, 100, 3), + (6012, 5, 216, 100, 10), + (6012, 6, 216, 100, 28), + (6012, 7, 216, 100, 30), + (6012, 8, 216, 100, 36), + (6012, 9, 216, 100, 77), + (6013, 1, 216, 105, 0), + (6013, 2, 216, 105, 1), + (6013, 3, 216, 105, 2), + (6013, 4, 216, 105, 3), + (6013, 5, 216, 105, 10), + (6013, 6, 216, 105, 28), + (6013, 7, 216, 105, 30), + (6013, 8, 216, 105, 36), + (6013, 9, 216, 105, 77), + (6014, 1, 360, 40, 12617), + (6015, 1, 360, 50, 12617), + (6016, 1, 360, 60, 12617), + (6017, 1, 217, 0, 65440), + (6017, 2, 346, 72, 28), + (6018, 1, 217, 0, 70880), + (6018, 2, 346, 74, 28), + (6019, 1, 217, 0, 76600), + (6019, 2, 346, 76, 28), + (6020, 1, 220, 15, 21), + (6020, 2, 220, 15, 23), + (6020, 3, 220, 30, 52), + (6020, 4, 220, 15, 28), + (6021, 1, 220, 25, 21), + (6021, 2, 220, 25, 23), + (6021, 3, 220, 50, 52), + (6021, 4, 220, 25, 28), + (6022, 1, 220, 35, 21), + (6022, 2, 220, 35, 23), + (6022, 3, 220, 70, 52), + (6022, 4, 220, 35, 28), + (6023, 1, 278, 900, 66950), + (6023, 2, 440, 82, 100), + (6024, 1, 278, 900, 70230), + (6024, 2, 440, 84, 100), + (6025, 1, 278, 900, 74935), + (6025, 2, 440, 86, 100), + (6026, 1, 127, 10, 0), + (6026, 2, 139, 16106, 0), + (6027, 1, 127, 25, 0), + (6027, 2, 139, 16106, 0), + (6028, 1, 127, 50, 0), + (6028, 2, 139, 16106, 0), + (6029, 1, 216, 200, 8), + (6030, 1, 216, 250, 8), + (6031, 1, 216, 300, 8), + (6032, 1, 439, 0, 70880), + (6032, 2, 345, 68, 50), + (6033, 1, 439, 0, 76600), + (6033, 2, 345, 70, 50), + (6034, 1, 439, 0, 82600), + (6034, 2, 345, 72, 35), + (6035, 1, 258, 48, 0), + (6036, 1, 258, 51, 0), + (6037, 1, 258, 54, 0), + (6042, 1, 220, 70, 8), + (6043, 1, 220, 80, 8), + (6044, 1, 220, 100, 8), + (6045, 1, 220, 45, 21), + (6045, 2, 220, 45, 23), + (6045, 3, 220, 90, 52), + (6045, 4, 220, 45, 28), + (6046, 1, 220, 55, 21), + (6046, 2, 220, 55, 23), + (6046, 3, 220, 110, 52), + (6046, 4, 220, 55, 28), + (6047, 1, 220, 65, 21), + (6047, 2, 220, 65, 23), + (6047, 3, 220, 130, 52), + (6047, 4, 220, 65, 28), + (6048, 1, 220, 75, 21), + (6048, 2, 220, 75, 23), + (6048, 3, 220, 150, 52), + (6048, 4, 220, 75, 28), + (6049, 1, 220, 85, 21), + (6049, 2, 220, 85, 23), + (6049, 3, 220, 170, 52), + (6049, 4, 220, 85, 28), + (6050, 1, 220, 95, 21), + (6050, 2, 220, 95, 23), + (6050, 3, 220, 190, 52), + (6050, 4, 220, 95, 28), + (6051, 1, 213, 1, 0), + (6052, 1, 213, 3, 0), + (6053, 1, 213, 5, 0), + (6057, 1, 220, 105, 21), + (6057, 2, 220, 105, 23), + (6057, 3, 220, 210, 52), + (6057, 4, 220, 105, 28), + (6058, 1, 220, 115, 21), + (6058, 2, 220, 115, 23), + (6058, 3, 220, 230, 52), + (6058, 4, 220, 115, 28), + (6059, 1, 220, 125, 21), + (6059, 2, 220, 125, 23), + (6059, 3, 220, 250, 52), + (6059, 4, 220, 125, 28), + (6060, 1, 247, 5, 76), + (6061, 1, 247, 10, 76), + (6063, 1, 303, 4500, 4500), + (6063, 2, 139, 2766, 0), + (6064, 1, 303, 5000, 5000), + (6064, 2, 139, 2766, 0), + (6065, 1, 303, 5500, 5500), + (6065, 2, 139, 2766, 0), + (6066, 1, 85, 12629, 0), + (6067, 1, 85, 12630, 0), + (6068, 1, 85, 12631, 0), + (6069, 1, 85, 12632, 0), + (6070, 1, 85, 12633, 0), + (6071, 1, 85, 12634, 0), + (6072, 1, 302, 266, 266), + (6072, 2, 385, 99, 0), + (6073, 1, 302, 290, 290), + (6073, 2, 385, 99, 0), + (6074, 1, 302, 310, 310), + (6074, 2, 385, 99, 0), + (6075, 1, 59, -18, 0), + (6076, 1, 59, -21, 0), + (6077, 1, 59, -24, 0), + (6078, 1, 59, -27, 0), + (6079, 1, 59, -30, 0), + (6080, 1, 189, 12, 0), + (6081, 1, 189, 13, 0), + (6082, 1, 247, 50, 20), + (6083, 1, 247, 75, 20), + (6084, 1, 247, 100, 20), + (6085, 1, 292, 20, 0), + (6086, 1, 292, 30, 0), + (6087, 1, 292, 40, 0), + (6088, 1, 264, 180, 392), + (6089, 1, 264, 360, 392), + (6090, 1, 264, 540, 392), + (6112, 1, 131, 10, 10), + (6112, 2, 348, 10, 0), + (6112, 3, 137, -32, 0), + (6113, 1, 287, 2, 0), + (6113, 2, 137, 100, 0), + (6113, 3, 385, -4232, 0), + (6113, 4, 385, -4332, 0), + (6113, 5, 139, -2741, 0), + (6113, 6, 385, -16192, 0), + (6113, 7, 139, -16843, 0), + (6114, 1, 287, 3, 0), + (6114, 2, 137, 100, 0), + (6114, 3, 385, -4232, 0), + (6114, 4, 385, -4332, 0), + (6114, 5, 139, -2741, 0), + (6114, 6, 385, -16192, 0), + (6114, 7, 139, -16843, 0), + (6115, 1, 287, 4, 0), + (6115, 2, 137, 100, 0), + (6115, 3, 385, -4232, 0), + (6115, 4, 385, -4332, 0), + (6115, 5, 139, -2741, 0), + (6115, 6, 385, -16192, 0), + (6115, 7, 139, -16843, 0), + (6119, 1, 69, 100, 0), + (6120, 1, 69, 200, 0), + (6121, 1, 69, 300, 0), + (6122, 1, 69, 400, 0), + (6123, 1, 69, 500, 0), + (6124, 1, 320, 1, 0), + (6125, 1, 320, 3, 0), + (6126, 1, 320, 5, 0), + (6127, 1, 320, 6, 0), + (6128, 1, 320, 7, 0), + (6129, 1, 320, 8, 0), + (6130, 1, 255, 48, 0), + (6131, 1, 255, 60, 0), + (6132, 1, 255, 72, 0), + (6136, 1, 264, 360, 300), + (6202, 1, 247, 10, 35), + (6203, 1, 247, 20, 35), + (6204, 1, 247, 60, 35), + (6209, 1, 264, 720, 245), + (6210, 1, 264, 1440, 245), + (6211, 1, 264, 2160, 245), + (6215, 1, 247, 5, 76), + (6216, 1, 247, 10, 76), + (6217, 1, 247, 15, 76), + (6223, 1, 232, 11, 4544), + (6224, 1, 232, 12, 4544), + (6225, 1, 232, 13, 4544), + (6226, 1, 232, 14, 4544), + (6227, 1, 232, 15, 4544), + (6228, 1, 264, 120, 404), + (6229, 1, 264, 240, 404), + (6230, 1, 264, 360, 404), + (6231, 1, 264, 480, 404), + (6233, 1, 264, 1728, 43), + (6234, 1, 264, 2160, 43), + (6235, 1, 264, 2592, 43), + (6236, 1, 287, 1, 0), + (6236, 2, 137, 3, 0), + (6236, 3, 137, 99, 0), + (6236, 4, 138, 0, 0), + (6236, 5, 244, 50, 0), + (6237, 1, 287, 2, 0), + (6237, 2, 137, 3, 0), + (6237, 3, 137, 99, 0), + (6237, 4, 138, 0, 0), + (6237, 5, 244, 38, 0), + (6238, 1, 287, 3, 0), + (6238, 2, 137, 3, 0), + (6238, 3, 137, 99, 0), + (6238, 4, 138, 0, 0), + (6238, 5, 244, 25, 0), + (6240, 1, 273, 3, 0), + (6241, 1, 273, 6, 0), + (6242, 1, 273, 9, 0), + (6243, 1, 273, 12, 0), + (6244, 1, 273, 15, 0), + (6245, 1, 273, 18, 0), + (6249, 1, 310, 1000, 0), + (6249, 2, 139, 11903, 0), + (6249, 3, 310, 1000, 0), + (6249, 4, 139, 11904, 0), + (6249, 5, 310, 1000, 0), + (6249, 6, 139, 11905, 0), + (6249, 7, 310, 1000, 0), + (6249, 8, 139, 1362, 0), + (6249, 9, 310, 1000, 0), + (6249, 10, 139, 8032, 0), + (6249, 11, 310, 1000, 0), + (6249, 12, 385, 6131, 0), + (6249, 13, 385, 6231, 0), + (6249, 14, 385, 6331, 0), + (6249, 15, 385, 6431, 0), + (6249, 16, 385, 6531, 0), + (6249, 17, 385, 6631, 0), + (6250, 1, 310, 2000, 0), + (6250, 2, 139, 11903, 0), + (6250, 3, 310, 2000, 0), + (6250, 4, 139, 11904, 0), + (6250, 5, 310, 2000, 0), + (6250, 6, 139, 11905, 0), + (6250, 7, 310, 2000, 0), + (6250, 8, 139, 1362, 0), + (6250, 9, 310, 2000, 0), + (6250, 10, 139, 8032, 0), + (6250, 11, 310, 2000, 0), + (6250, 12, 385, 6131, 0), + (6250, 13, 385, 6231, 0), + (6250, 14, 385, 6331, 0), + (6250, 15, 385, 6431, 0), + (6250, 16, 385, 6531, 0), + (6250, 17, 385, 6631, 0), + (6251, 1, 310, 3000, 0), + (6251, 2, 139, 11903, 0), + (6251, 3, 310, 3000, 0), + (6251, 4, 139, 11904, 0), + (6251, 5, 310, 3000, 0), + (6251, 6, 139, 11905, 0), + (6251, 7, 310, 3000, 0), + (6251, 8, 139, 1362, 0), + (6251, 9, 310, 3000, 0), + (6251, 10, 139, 8032, 0), + (6251, 11, 310, 3000, 0), + (6251, 12, 385, 6131, 0), + (6251, 13, 385, 6231, 0), + (6251, 14, 385, 6331, 0), + (6251, 15, 385, 6431, 0), + (6251, 16, 385, 6531, 0), + (6251, 17, 385, 6631, 0), + (6252, 1, 310, 4000, 0), + (6252, 2, 139, 11903, 0), + (6252, 3, 310, 4000, 0), + (6252, 4, 139, 11904, 0), + (6252, 5, 310, 4000, 0), + (6252, 6, 139, 11905, 0), + (6252, 7, 310, 4000, 0), + (6252, 8, 139, 1362, 0), + (6252, 9, 310, 4000, 0), + (6252, 10, 139, 8032, 0), + (6252, 11, 310, 4000, 0), + (6252, 12, 385, 6131, 0), + (6252, 13, 385, 6231, 0), + (6252, 14, 385, 6331, 0), + (6252, 15, 385, 6431, 0), + (6252, 16, 385, 6531, 0), + (6252, 17, 385, 6631, 0), + (6253, 1, 310, 5000, 0), + (6253, 2, 139, 11903, 0), + (6253, 3, 310, 5000, 0), + (6253, 4, 139, 11904, 0), + (6253, 5, 310, 5000, 0), + (6253, 6, 139, 11905, 0), + (6253, 7, 310, 5000, 0), + (6253, 8, 139, 1362, 0), + (6253, 9, 310, 5000, 0), + (6253, 10, 139, 8032, 0), + (6253, 11, 310, 5000, 0), + (6253, 12, 385, 6131, 0), + (6253, 13, 385, 6231, 0), + (6253, 14, 385, 6331, 0), + (6253, 15, 385, 6431, 0), + (6253, 16, 385, 6531, 0), + (6253, 17, 385, 6631, 0), + (6257, 1, 128, 5, 5), + (6257, 2, 138, 1, 0), + (6257, 3, 140, 1, 0), + (6257, 4, 139, -2741, 0), + (6257, 5, 139, -16843, 0), + (6257, 6, 385, -16192, 0), + (6258, 1, 128, 15, 15), + (6258, 2, 138, 1, 0), + (6258, 3, 140, 1, 0), + (6258, 4, 139, -2741, 0), + (6258, 5, 139, -16843, 0), + (6258, 6, 385, -16192, 0), + (6259, 1, 128, 30, 30), + (6259, 2, 138, 1, 0), + (6259, 3, 140, 1, 0), + (6259, 4, 139, -2741, 0), + (6259, 5, 139, -16843, 0), + (6259, 6, 385, -16192, 0), + (6260, 1, 264, 720, 98), + (6261, 1, 264, 900, 98), + (6262, 1, 264, 1080, 98), + (6266, 1, 224, 20, 10), + (6266, 2, 173, 1, 0), + (6267, 1, 224, 35, 10), + (6267, 2, 173, 2, 0), + (6268, 1, 224, 50, 10), + (6268, 2, 173, 3, 0), + (6269, 1, 224, 20, 30), + (6269, 2, 173, 1, 0), + (6270, 1, 224, 35, 30), + (6270, 2, 173, 2, 0), + (6271, 1, 224, 50, 30), + (6271, 2, 173, 3, 0), + (6272, 1, 264, 15, 672), + (6273, 1, 264, 30, 672), + (6274, 1, 264, 45, 672), + (6275, 1, 224, 20, 8), + (6275, 2, 173, 1, 0), + (6276, 1, 224, 35, 8), + (6276, 2, 173, 2, 0), + (6277, 1, 224, 50, 8), + (6277, 2, 173, 3, 0), + (6283, 1, 85, 13200, 0), + (6284, 1, 85, 13200, 25), + (6285, 1, 85, 13200, 50), + (6287, 1, 224, 20, 30), + (6287, 2, 173, 1, 0), + (6288, 1, 224, 35, 30), + (6288, 2, 173, 3, 0), + (6289, 1, 224, 50, 30), + (6289, 2, 173, 3, 0), + (6300, 1, 247, 20, 76), + (6301, 1, 247, 25, 76), + (6302, 1, 264, 120, 3710), + (6303, 1, 264, 240, 3710), + (6304, 1, 264, 360, 3710), + (6319, 1, 264, 1728, 107), + (6320, 1, 264, 2160, 107), + (6321, 1, 264, 2592, 107), + (6322, 1, 216, 5, 51), + (6323, 1, 216, 15, 51), + (6324, 1, 216, 25, 51), + (6331, 1, 252, 70, 0), + (6332, 1, 252, 75, 0), + (6334, 1, 185, 5, 51), + (6335, 1, 185, 10, 51), + (6336, 1, 185, 15, 51), + (6337, 1, 264, 60, 553), + (6338, 1, 264, 120, 553), + (6339, 1, 264, 180, 553), + (6340, 1, 264, 180, 777), + (6341, 1, 264, 360, 777), + (6342, 1, 264, 540, 777), + (6343, 1, 264, 5, 468), + (6343, 2, 264, 5, 469), + (6343, 3, 264, 5, 470), + (6344, 1, 264, 10, 468), + (6344, 2, 264, 10, 469), + (6344, 3, 264, 10, 470), + (6345, 1, 264, 15, 468), + (6345, 2, 264, 15, 469), + (6345, 3, 264, 15, 470), + (6346, 1, 264, 180, 494), + (6347, 1, 264, 360, 494), + (6348, 1, 264, 540, 494), + (6349, 1, 264, 180, 500), + (6350, 1, 264, 360, 500), + (6351, 1, 264, 540, 500), + (6355, 1, 310, 360000, 0), + (6355, 2, 139, 4506, 0), + (6355, 3, 310, 360000, 0), + (6355, 4, 385, 11122, 0), + (6355, 5, 385, 11222, 0), + (6355, 6, 385, 11322, 0), + (6355, 7, 385, 11522, 0), + (6356, 1, 310, 720000, 0), + (6356, 2, 139, 4506, 0), + (6356, 3, 310, 720000, 0), + (6356, 4, 385, 11122, 0), + (6356, 5, 385, 11222, 0), + (6356, 6, 385, 11322, 0), + (6356, 7, 385, 11522, 0), + (6357, 1, 310, 1080000, 0), + (6357, 2, 139, 4506, 0), + (6357, 3, 310, 1080000, 0), + (6357, 4, 385, 11122, 0), + (6357, 5, 385, 11222, 0), + (6357, 6, 385, 11322, 0), + (6357, 7, 385, 11522, 0), + (6358, 1, 310, 1440000, 0), + (6358, 2, 139, 4506, 0), + (6358, 3, 310, 1440000, 0), + (6358, 4, 385, 11122, 0), + (6358, 5, 385, 11222, 0), + (6358, 6, 385, 11322, 0), + (6358, 7, 385, 11522, 0), + (6359, 1, 310, 1800000, 0), + (6359, 2, 139, 4506, 0), + (6359, 3, 310, 1800000, 0), + (6359, 4, 385, 11122, 0), + (6359, 5, 385, 11222, 0), + (6359, 6, 385, 11322, 0), + (6359, 7, 385, 11522, 0), + (6360, 1, 310, 2160000, 0), + (6360, 2, 139, 4506, 0), + (6360, 3, 310, 2160000, 0), + (6360, 4, 385, 11122, 0), + (6360, 5, 385, 11222, 0), + (6360, 6, 385, 11322, 0), + (6360, 7, 385, 11522, 0), + (6361, 1, 213, 3, 0), + (6362, 1, 310, 120000, 0), + (6362, 2, 139, 5040, 0), + (6363, 1, 310, 240000, 0), + (6363, 2, 139, 5040, 0), + (6364, 1, 310, 360000, 0), + (6364, 2, 139, 5040, 0), + (6365, 1, 310, 480000, 0), + (6365, 2, 139, 5040, 0), + (6366, 1, 310, 600000, 0), + (6366, 2, 139, 5040, 0), + (6375, 1, 375, 107, 0), + (6376, 1, 375, 115, 0), + (6377, 1, 375, 125, 0), + (6383, 1, 215, 5, 0), + (6384, 1, 215, 7, 0), + (6385, 1, 215, 10, 0), + (6386, 1, 293, 5, 0), + (6387, 1, 293, 10, 0), + (6388, 1, 293, 15, 0), + (6389, 1, 293, 20, 0), + (6390, 1, 0, 16, 0), + (6391, 1, 0, 17, 0), + (6392, 1, 0, 18, 0), + (6393, 1, 0, 19, 0), + (6394, 1, 0, 20, 0), + (6395, 1, 85, 13502, 0), + (6396, 1, 85, 13503, 0), + (6397, 1, 85, 13504, 0), + (6403, 1, 294, 11, 100), + (6404, 1, 294, 13, 100), + (6405, 1, 294, 15, 100), + (6406, 1, 360, 25, 13201), + (6407, 1, 360, 25, 13202), + (6408, 1, 360, 25, 13203), + (6409, 1, 247, 5, 76), + (6410, 1, 247, 10, 76), + (6411, 1, 247, 15, 76), + (6412, 1, 247, 20, 76), + (6413, 1, 247, 25, 76), + (6414, 1, 247, 30, 76), + (6415, 1, 247, 35, 76), + (6416, 1, 247, 40, 76), + (6417, 1, 247, 45, 76), + (6418, 1, 247, 50, 76), + (6419, 1, 247, 5, 76), + (6420, 1, 247, 10, 76), + (6421, 1, 247, 15, 76), + (6422, 1, 214, 100, 0), + (6423, 1, 214, 200, 0), + (6424, 1, 214, 300, 0), + (6428, 1, 320, 1, 0), + (6429, 1, 320, 3, 0), + (6430, 1, 320, 5, 0), + (6431, 1, 317, 6, 0), + (6432, 1, 317, 7, 0), + (6433, 1, 317, 8, 0), + (6434, 1, 317, 9, 0), + (6435, 1, 317, 10, 0), + (6436, 1, 244, 70, 0), + (6437, 1, 244, 60, 0), + (6438, 1, 244, 50, 0), + (6439, 1, 264, 720, 41), + (6440, 1, 264, 900, 41), + (6441, 1, 264, 840, 420), + (6442, 1, 264, 540, 362), + (6443, 1, 264, 630, 362), + (6445, 1, 127, 15, 0), + (6445, 2, 139, 3248, 0), + (6445, 3, 127, 15, 0), + (6445, 4, 139, 3249, 0), + (6446, 1, 127, 30, 0), + (6446, 2, 139, 3248, 0), + (6446, 3, 127, 30, 0), + (6446, 4, 139, 3249, 0), + (6447, 1, 127, 50, 0), + (6447, 2, 139, 3248, 0), + (6447, 3, 127, 50, 0), + (6447, 4, 139, 3249, 0), + (6452, 1, 310, 1000, 0), + (6452, 2, 403, 7, 0), + (6452, 3, 404, 35, 0), + (6452, 4, 144, 2000, 0), + (6452, 5, 310, 5000, 0), + (6452, 6, 403, 7, 0), + (6452, 7, 404, 35, 0), + (6452, 8, 144, 10000, 0), + (6453, 1, 310, 2000, 0), + (6453, 2, 403, 7, 0), + (6453, 3, 404, 35, 0), + (6453, 4, 144, 2000, 0), + (6453, 5, 310, 10000, 0), + (6453, 6, 403, 7, 0), + (6453, 7, 404, 35, 0), + (6453, 8, 144, 10000, 0), + (6454, 1, 310, 3000, 0), + (6454, 2, 403, 7, 0), + (6454, 3, 404, 35, 0), + (6454, 4, 144, 2000, 0), + (6454, 5, 310, 15000, 0), + (6454, 6, 403, 7, 0), + (6454, 7, 404, 35, 0), + (6454, 8, 144, 10000, 0), + (6458, 1, 310, 30000, 0), + (6458, 2, 385, 5137, 0), + (6458, 3, 385, 5237, 0), + (6458, 4, 385, 5337, 0), + (6458, 5, 385, 5437, 0), + (6458, 6, 385, 5537, 0), + (6458, 7, 385, 5637, 0), + (6458, 8, 127, 15, 15), + (6458, 9, 385, 5137, 0), + (6458, 10, 385, 5237, 0), + (6458, 11, 385, 5337, 0), + (6458, 12, 385, 5437, 0), + (6458, 13, 385, 5537, 0), + (6458, 14, 385, 5637, 0), + (6459, 1, 310, 60000, 0), + (6459, 2, 385, 5137, 0), + (6459, 3, 385, 5237, 0), + (6459, 4, 385, 5337, 0), + (6459, 5, 385, 5437, 0), + (6459, 6, 385, 5537, 0), + (6459, 7, 385, 5637, 0), + (6459, 8, 127, 30, 30), + (6459, 9, 385, 5137, 0), + (6459, 10, 385, 5237, 0), + (6459, 11, 385, 5337, 0), + (6459, 12, 385, 5437, 0), + (6459, 13, 385, 5537, 0), + (6459, 14, 385, 5637, 0), + (6460, 1, 310, 90000, 0), + (6460, 2, 385, 5137, 0), + (6460, 3, 385, 5237, 0), + (6460, 4, 385, 5337, 0), + (6460, 5, 385, 5437, 0), + (6460, 6, 385, 5537, 0), + (6460, 7, 385, 5637, 0), + (6460, 8, 127, 50, 50), + (6460, 9, 385, 5137, 0), + (6460, 10, 385, 5237, 0), + (6460, 11, 385, 5337, 0), + (6460, 12, 385, 5437, 0), + (6460, 13, 385, 5537, 0), + (6460, 14, 385, 5637, 0), + (6461, 1, 127, 15, 0), + (6461, 2, 385, 14130, 0), + (6461, 3, 385, 14230, 0), + (6461, 4, 385, 14330, 0), + (6461, 5, 385, 14430, 0), + (6461, 6, 385, 14530, 0), + (6461, 7, 385, 14630, 0), + (6461, 8, 310, 30000, 0), + (6461, 9, 385, 14130, 0), + (6461, 10, 385, 14230, 0), + (6461, 11, 385, 14330, 0), + (6461, 12, 385, 14430, 0), + (6461, 13, 385, 14530, 0), + (6461, 14, 385, 14630, 0), + (6462, 1, 127, 30, 0), + (6462, 2, 385, 14130, 0), + (6462, 3, 385, 14230, 0), + (6462, 4, 385, 14330, 0), + (6462, 5, 385, 14430, 0), + (6462, 6, 385, 14530, 0), + (6462, 7, 385, 14630, 0), + (6462, 8, 310, 60000, 0), + (6462, 9, 385, 14130, 0), + (6462, 10, 385, 14230, 0), + (6462, 11, 385, 14330, 0), + (6462, 12, 385, 14430, 0), + (6462, 13, 385, 14530, 0), + (6462, 14, 385, 14630, 0), + (6463, 1, 127, 50, 0), + (6463, 2, 385, 14130, 0), + (6463, 3, 385, 14230, 0), + (6463, 4, 385, 14330, 0), + (6463, 5, 385, 14430, 0), + (6463, 6, 385, 14530, 0), + (6463, 7, 385, 14630, 0), + (6463, 8, 310, 90000, 0), + (6463, 9, 385, 14130, 0), + (6463, 10, 385, 14230, 0), + (6463, 11, 385, 14330, 0), + (6463, 12, 385, 14430, 0), + (6463, 13, 385, 14530, 0), + (6463, 14, 385, 14630, 0), + (6467, 1, 214, 100, 0), + (6468, 1, 214, 200, 0), + (6469, 1, 214, 300, 0), + (6470, 1, 247, 15, 76), + (6471, 1, 247, 20, 76), + (6472, 1, 247, 30, 76), + (6473, 1, 247, 35, 76), + (6474, 1, 247, 55, 76), + (6475, 1, 247, 60, 76), + (6476, 1, 247, 20, 76), + (6477, 1, 247, 25, 76), + (6478, 1, 264, 1, 3800), + (6479, 1, 264, 2, 3800), + (6480, 1, 264, 3, 3800), + (6481, 1, 264, 6480, 36), + (6482, 1, 264, 12960, 36), + (6483, 1, 264, 19440, 36), + (6484, 1, 264, 105, 558), + (6485, 1, 264, 120, 558), + (6486, 1, 264, 135, 558), + (6489, 1, 310, 600000, 0), + (6489, 2, 139, 4500, 0), + (6489, 3, 411, 8, 0), + (6490, 1, 310, 1200000, 0), + (6490, 2, 139, 4500, 0), + (6490, 3, 411, 8, 0), + (6491, 1, 310, 1800000, 0), + (6491, 2, 139, 4500, 0), + (6491, 3, 411, 8, 0), + (6500, 1, 273, 5, 0), + (6501, 1, 273, 6, 0), + (6502, 1, 273, 7, 0), + (6503, 1, 127, 12, 0), + (6503, 2, 385, 3338, 0), + (6504, 1, 127, 24, 0), + (6504, 2, 385, 3338, 0), + (6505, 1, 127, 36, 0), + (6505, 2, 385, 3338, 0), + (6506, 1, 127, 50, 0), + (6506, 2, 385, 3338, 0), + (6511, 1, 216, 5, 7), + (6512, 1, 216, 15, 7), + (6513, 1, 216, 25, 7), + (6514, 1, 127, 15, 0), + (6514, 2, 139, 5880, 0), + (6515, 1, 127, 30, 0), + (6515, 2, 139, 5880, 0), + (6516, 1, 127, 50, 0), + (6516, 2, 139, 5880, 0), + (6517, 1, 339, 10, 8105), + (6517, 2, 142, 65, 0), + (6517, 3, 311, 0, 0), + (6517, 4, 134, 70, 0), + (6517, 5, 348, 10, 0), + (6517, 6, 137, 0, 0), + (6517, 7, 339, 10, 8105), + (6517, 8, 142, 65, 0), + (6517, 9, 311, 0, 0), + (6517, 10, 134, 70, 0), + (6517, 11, 348, 10, 0), + (6517, 12, 137, 100, 0), + (6517, 13, 339, 10, 8105), + (6517, 14, 142, 65, 0), + (6517, 15, 311, 0, 0), + (6517, 16, 134, 70, 0), + (6517, 17, 348, 10, 0), + (6517, 18, 137, 79, 0), + (6517, 19, 339, 10, 8105), + (6517, 20, 142, 65, 0), + (6517, 21, 311, 0, 0), + (6517, 22, 134, 70, 0), + (6517, 23, 348, 10, 0), + (6517, 24, 137, 147, 0), + (6517, 25, 339, 10, 11404), + (6517, 26, 142, 71, 0), + (6517, 27, 311, 0, 0), + (6517, 28, 134, 75, 0), + (6517, 29, 348, 10, 0), + (6517, 30, 137, 0, 0), + (6517, 31, 339, 10, 11404), + (6517, 32, 142, 71, 0), + (6517, 33, 311, 0, 0), + (6517, 34, 134, 75, 0), + (6517, 35, 348, 10, 0), + (6517, 36, 137, 100, 0), + (6517, 37, 339, 10, 11404), + (6517, 38, 142, 71, 0), + (6517, 39, 311, 0, 0), + (6517, 40, 134, 75, 0), + (6517, 41, 348, 10, 0), + (6517, 42, 137, 79, 0), + (6517, 43, 339, 10, 11404), + (6517, 44, 142, 71, 0), + (6517, 45, 311, 0, 0), + (6517, 46, 134, 75, 0), + (6517, 47, 348, 10, 0), + (6517, 48, 137, 147, 0), + (6517, 49, 339, 10, 13199), + (6517, 50, 142, 76, 0), + (6517, 51, 311, 0, 0), + (6517, 52, 134, 80, 0), + (6517, 53, 348, 10, 0), + (6517, 54, 137, 0, 0), + (6517, 55, 339, 10, 13199), + (6517, 56, 142, 76, 0), + (6517, 57, 311, 0, 0), + (6517, 58, 134, 80, 0), + (6517, 59, 348, 10, 0), + (6517, 60, 137, 100, 0), + (6517, 61, 339, 10, 13199), + (6517, 62, 142, 76, 0), + (6517, 63, 311, 0, 0), + (6517, 64, 134, 80, 0), + (6517, 65, 348, 10, 0), + (6517, 66, 137, 79, 0), + (6517, 67, 339, 10, 13199), + (6517, 68, 142, 76, 0), + (6517, 69, 311, 0, 0), + (6517, 70, 134, 80, 0), + (6517, 71, 348, 10, 0), + (6517, 72, 137, 147, 0), + (6518, 1, 221, 18, 0), + (6519, 1, 221, 21, 0), + (6520, 1, 221, 24, 0), + (6521, 1, 327, 6, 0), + (6522, 1, 327, 7, 0), + (6523, 1, 328, 800, 0), + (6524, 1, 328, 850, 0), + (6525, 1, 328, 900, 0), + (6526, 1, 328, 950, 0), + (6527, 1, 328, 1000, 0), + (6528, 1, 264, 3024, 107), + (6531, 1, 360, 40, 11629), + (6532, 1, 360, 50, 11629), + (6533, 1, 360, 60, 11629), + (6540, 1, 363, 2, 0), + (6545, 1, 362, 2, 0), + (6546, 1, 2, 4, 0), + (6547, 1, 2, 8, 0), + (6548, 1, 2, 12, 0), + (6549, 1, 2, 16, 0), + (6550, 1, 2, 20, 0), + (6551, 1, 2, 24, 0), + (6552, 1, 2, 28, 0), + (6553, 1, 2, 32, 0), + (6554, 1, 2, 36, 0), + (6555, 1, 2, 40, 0), + (6556, 1, 2, 44, 0), + (6557, 1, 2, 48, 0), + (6558, 1, 2, 52, 0), + (6559, 1, 2, 56, 0), + (6560, 1, 2, 60, 0), + (6561, 1, 2, 64, 0), + (6562, 1, 2, 68, 0), + (6563, 1, 2, 72, 0), + (6564, 1, 2, 76, 0), + (6565, 1, 2, 80, 0), + (6566, 1, 2, 84, 0), + (6567, 1, 2, 88, 0), + (6568, 1, 2, 92, 0), + (6569, 1, 2, 96, 0), + (6570, 1, 2, 100, 0), + (6571, 1, 2, 104, 0), + (6601, 1, 339, 5, 13519), + (6601, 2, 137, 21, 0), + (6602, 1, 339, 10, 13519), + (6602, 2, 137, 21, 0), + (6603, 1, 339, 15, 13519), + (6603, 2, 137, 21, 0), + (6604, 1, 339, 20, 13519), + (6604, 2, 137, 21, 0), + (6605, 1, 339, 25, 13519), + (6605, 2, 137, 21, 0), + (6611, 1, 310, 120000, 0), + (6611, 2, 139, 4670, 0), + (6612, 1, 310, 240000, 0), + (6612, 2, 139, 4670, 0), + (6613, 1, 310, 360000, 0), + (6613, 2, 139, 4670, 0), + (6614, 1, 310, 120000, 0), + (6614, 2, 139, 4674, 0), + (6615, 1, 310, 240000, 0), + (6615, 2, 139, 4674, 0), + (6616, 1, 310, 360000, 0), + (6616, 2, 139, 4674, 0), + (6618, 1, 310, 480000, 0), + (6618, 2, 139, 4670, 0), + (6619, 1, 310, 600000, 0), + (6619, 2, 139, 4670, 0), + (6630, 1, 218, 1, 0), + (6631, 1, 218, 2, 0), + (6632, 1, 218, 3, 0), + (6633, 1, 218, 4, 0), + (6634, 1, 218, 5, 0), + (6636, 1, 294, 0, 107), + (6637, 1, 294, 0, 115), + (6638, 1, 294, 0, 125), + (6641, 1, 339, 10, 16101), + (6641, 2, 138, 0, 0), + (6641, 3, 142, 70, 0), + (6641, 4, 403, 4, 0), + (6641, 5, 348, 1, 0), + (6641, 6, 404, 2, 0), + (6641, 7, 141, 1, 0), + (6642, 1, 339, 10, 16102), + (6642, 2, 138, 0, 0), + (6642, 3, 142, 70, 0), + (6642, 4, 403, 4, 0), + (6642, 5, 348, 1, 0), + (6642, 6, 404, 2, 0), + (6642, 7, 141, 1, 0), + (6643, 1, 339, 10, 16103), + (6643, 2, 138, 0, 0), + (6643, 3, 142, 70, 0), + (6643, 4, 403, 4, 0), + (6643, 5, 348, 1, 0), + (6643, 6, 404, 2, 0), + (6643, 7, 141, 1, 0), + (6660, 1, 325, 55, 0), + (6661, 1, 325, 60, 0), + (6662, 1, 325, 65, 0), + (6666, 1, 287, 2, 0), + (6666, 2, 139, 8001, 0), + (6666, 3, 385, 12529, 0), + (6667, 1, 287, 4, 0), + (6667, 2, 139, 8001, 0), + (6667, 3, 385, 12529, 0), + (6668, 1, 287, 2, 0), + (6668, 2, 139, 11251, 0), + (6668, 3, 139, 11252, 0), + (6668, 4, 139, 11253, 0), + (6669, 1, 287, 4, 0), + (6669, 2, 139, 11251, 0), + (6669, 3, 139, 11252, 0), + (6669, 4, 139, 11253, 0), + (6670, 1, 287, 6, 0), + (6670, 2, 139, 11251, 0), + (6670, 3, 139, 11252, 0), + (6670, 4, 139, 11253, 0), + (6697, 1, 264, 30, 857), + (6698, 1, 264, 60, 857), + (6699, 1, 264, 90, 857), + (6700, 1, 264, 120, 857), + (6701, 1, 264, 150, 857), + (6703, 1, 264, 10, 171), + (6704, 1, 264, 20, 171), + (6705, 1, 264, 30, 171), + (6709, 1, 127, 5, 0), + (6709, 2, 139, 3842, 0), + (6710, 1, 127, 10, 0), + (6710, 2, 139, 3842, 0), + (6711, 1, 127, 15, 0), + (6711, 2, 139, 3842, 0), + (6712, 1, 264, 30, 177), + (6713, 1, 264, 60, 177), + (6714, 1, 264, 90, 177), + (6715, 1, 264, 120, 177), + (6716, 1, 264, 150, 177), + (6751, 1, 310, 240000, 0), + (6751, 2, 139, 4519, 0), + (6752, 1, 310, 480000, 0), + (6752, 2, 139, 4519, 0), + (6753, 1, 310, 720000, 0), + (6753, 2, 139, 4519, 0), + (6761, 1, 292, 5, 0), + (6762, 1, 292, 10, 0), + (6763, 1, 292, 15, 0), + (6765, 1, 330, 15, 7), + (6766, 1, 330, 30, 7), + (6767, 1, 330, 50, 7), + (6768, 1, 310, 960000, 0), + (6768, 2, 139, 4519, 0), + (6769, 1, 310, 1200000, 0), + (6769, 2, 139, 4519, 0), + (6791, 1, 339, 20, 16139), + (6791, 2, 137, 21, 0), + (6791, 3, 385, -18000, 0), + (6791, 4, 339, 20, 16139), + (6791, 5, 137, 343, 0), + (6791, 6, 385, -18000, 0), + (6792, 1, 339, 20, 16140), + (6792, 2, 137, 21, 0), + (6792, 3, 385, -18000, 0), + (6792, 4, 339, 20, 16140), + (6792, 5, 137, 343, 0), + (6792, 6, 385, -18000, 0), + (6793, 1, 339, 20, 16141), + (6793, 2, 137, 21, 0), + (6793, 3, 385, -18000, 0), + (6793, 4, 339, 20, 16141), + (6793, 5, 137, 343, 0), + (6793, 6, 385, -18000, 0), + (6819, 1, 264, 180, 524), + (6820, 1, 264, 360, 524), + (6821, 1, 264, 540, 524), + (6823, 1, 264, 180, 320), + (6824, 1, 264, 360, 320), + (6825, 1, 264, 540, 320), + (6826, 1, 264, 720, 320), + (6827, 1, 264, 900, 320), + (6870, 1, 264, 180, 544), + (6871, 1, 264, 360, 544), + (6872, 1, 264, 540, 544), + (6873, 1, 279, 7, 0), + (6874, 1, 279, 11, 0), + (6875, 1, 279, 15, 0), + (6876, 1, 375, 107, 0), + (6877, 1, 375, 115, 0), + (6878, 1, 375, 125, 0), + (6879, 1, 243, 15, 0), + (6880, 1, 243, 25, 0), + (6881, 1, 243, 35, 0), + (6882, 1, 242, 5, 0), + (6883, 1, 242, 10, 0), + (6884, 1, 242, 15, 0), + (6900, 1, 264, 840, 465), + (6901, 1, 264, 1140, 465), + (6902, 1, 264, 1440, 465), + (6903, 1, 264, 1740, 465), + (6904, 1, 264, 2040, 465), + (6905, 1, 225, 33, 0), + (6906, 1, 225, 36, 0), + (6907, 1, 225, 39, 0), + (6908, 1, 264, 180, 499), + (6909, 1, 264, 360, 499), + (6910, 1, 264, 540, 499), + (6911, 1, 224, 60, 74), + (6911, 2, 173, 2, 0), + (6912, 1, 224, 70, 74), + (6912, 2, 173, 3, 0), + (6913, 1, 224, 80, 74), + (6913, 2, 173, 3, 0), + (6935, 1, 264, 180, 465), + (6936, 1, 264, 360, 465), + (6937, 1, 264, 540, 465), + (6938, 1, 361, 65, 16164), + (6939, 1, 361, 75, 16165), + (6940, 1, 361, 85, 16166), + (6941, 1, 264, 120, 962), + (6942, 1, 264, 240, 962), + (6943, 1, 264, 360, 962), + (6944, 1, 264, 480, 962), + (6945, 1, 264, 600, 962), + (6974, 1, 264, 3, 247), + (6974, 2, 264, 2, 986), + (6974, 3, 264, 2, 987), + (6974, 4, 264, 2, 988), + (6975, 1, 264, 6, 247), + (6975, 2, 264, 4, 986), + (6975, 3, 264, 4, 987), + (6975, 4, 264, 4, 988), + (6976, 1, 264, 12, 247), + (6976, 2, 264, 6, 986), + (6976, 3, 264, 6, 987), + (6976, 4, 264, 6, 988), + (6977, 1, 264, 6, 3817), + (6978, 1, 264, 12, 3817), + (6979, 1, 264, 18, 3817), + (6980, 1, 264, 45, 128), + (6981, 1, 264, 90, 128), + (6982, 1, 264, 135, 128), + (6987, 1, 353, 1, 0), + (6988, 1, 287, 1, 0), + (6988, 2, 385, 16439, 0), + (6988, 3, 411, 32768, 0), + (6989, 1, 287, 2, 0), + (6989, 2, 385, 16439, 0), + (6989, 3, 411, 32768, 0), + (6990, 1, 287, 3, 0), + (6990, 2, 385, 16439, 0), + (6990, 3, 411, 32768, 0), + (7005, 1, 264, 432, 789), + (7006, 1, 264, 864, 789), + (7007, 1, 264, 1296, 789), + (7008, 1, 439, 0, 109400), + (7008, 2, 345, 80, 35), + (7009, 1, 439, 0, 116800), + (7009, 2, 345, 82, 35), + (7010, 1, 378, 25, 96), + (7011, 1, 378, 30, 96), + (7012, 1, 378, 35, 96), + (7013, 1, 378, 40, 96), + (7014, 1, 378, 45, 96), + (7015, 1, 378, 50, 96), + (7033, 1, 421, 5, 0), + (7033, 2, 139, 16097, 0), + (7033, 3, 139, 23612, 0), + (7033, 4, 139, 32196, 0), + (7033, 5, 139, 32565, 0), + (7033, 6, 423, 6, 0), + (7033, 7, 422, 5, 0), + (7033, 8, 411, 2, 0), + (7034, 1, 421, 10, 0), + (7034, 2, 139, 16097, 0), + (7034, 3, 139, 23612, 0), + (7034, 4, 139, 32196, 0), + (7034, 5, 139, 32565, 0), + (7034, 6, 423, 6, 0), + (7034, 7, 422, 5, 0), + (7034, 8, 411, 2, 0), + (7035, 1, 421, 15, 0), + (7035, 2, 139, 16097, 0), + (7035, 3, 139, 23612, 0), + (7035, 4, 139, 32196, 0), + (7035, 5, 139, 32565, 0), + (7035, 6, 423, 6, 0), + (7035, 7, 422, 5, 0), + (7035, 8, 411, 2, 0), + (7036, 1, 264, 10, 3646), + (7037, 1, 264, 20, 3646), + (7038, 1, 264, 30, 3646), + (7050, 1, 265, 62, 0), + (7051, 1, 265, 64, 0), + (7052, 1, 265, 66, 0), + (7053, 1, 265, 67, 0), + (7054, 1, 265, 69, 0), + (7055, 1, 265, 71, 0), + (7056, 1, 265, 62, 0), + (7057, 1, 265, 64, 0), + (7058, 1, 265, 66, 0), + (7059, 1, 265, 67, 0), + (7060, 1, 265, 69, 0), + (7061, 1, 265, 71, 0), + (7062, 1, 372, 50, 0), + (7063, 1, 265, 72, 0), + (7064, 1, 265, 74, 0), + (7065, 1, 265, 76, 0), + (7066, 1, 265, 72, 0), + (7067, 1, 265, 74, 0), + (7068, 1, 265, 76, 0), + (7100, 1, 264, 180, 254), + (7101, 1, 264, 360, 254), + (7102, 1, 264, 540, 254), + (7103, 1, 264, 432, 286), + (7103, 2, 264, 432, 10753), + (7103, 3, 264, 432, 9101), + (7104, 1, 264, 864, 286), + (7104, 2, 264, 864, 10753), + (7104, 3, 264, 864, 9101), + (7105, 1, 264, 1296, 286), + (7105, 2, 264, 1296, 10753), + (7105, 3, 264, 1296, 9101), + (7106, 1, 224, 20, 30), + (7106, 2, 173, 1, 0), + (7107, 1, 224, 35, 30), + (7107, 2, 173, 2, 0), + (7108, 1, 224, 50, 30), + (7108, 2, 173, 3, 0), + (7112, 1, 85, 13596, 50), + (7113, 1, 85, 13597, 50), + (7114, 1, 85, 13598, 50), + (7116, 1, 264, 360, 110), + (7117, 1, 264, 450, 110), + (7118, 1, 264, 540, 110), + (7122, 1, 349, 30, 0), + (7123, 1, 349, 35, 0), + (7124, 1, 349, 40, 0), + (7125, 1, 349, 45, 0), + (7126, 1, 349, 50, 0), + (7128, 1, 264, 240, 109), + (7129, 1, 264, 300, 109), + (7130, 1, 264, 360, 109), + (7131, 1, 439, 0, 88880), + (7131, 2, 345, 74, 28), + (7132, 1, 439, 0, 95440), + (7132, 2, 345, 76, 28), + (7133, 1, 439, 0, 102280), + (7133, 2, 345, 78, 28), + (7134, 1, 220, 120, 8), + (7135, 1, 220, 140, 8), + (7136, 1, 220, 165, 8), + (7137, 1, 264, 60, 672), + (7138, 1, 264, 75, 672), + (7139, 1, 264, 90, 672), + (7146, 1, 252, 80, 0), + (7147, 1, 252, 85, 0), + (7148, 1, 216, 350, 8), + (7149, 1, 216, 400, 8), + (7150, 1, 216, 450, 8), + (7151, 1, 258, 59, 0), + (7152, 1, 258, 64, 0), + (7153, 1, 258, 69, 0), + (7160, 1, 227, 120, 32), + (7161, 1, 227, 150, 32), + (7162, 1, 227, 180, 32), + (7163, 1, 220, 130, 26), + (7163, 2, 220, 130, 30), + (7163, 3, 220, 130, 38), + (7164, 1, 220, 140, 26), + (7164, 2, 220, 140, 30), + (7164, 3, 220, 140, 38), + (7165, 1, 220, 150, 26), + (7165, 2, 220, 150, 30), + (7165, 3, 220, 150, 38), + (7166, 1, 264, 20, 468), + (7166, 2, 264, 20, 469), + (7166, 3, 264, 20, 470), + (7167, 1, 264, 25, 468), + (7167, 2, 264, 25, 469), + (7167, 3, 264, 25, 470), + (7168, 1, 264, 30, 468), + (7168, 2, 264, 30, 469), + (7168, 3, 264, 30, 470), + (7169, 1, 220, 135, 21), + (7169, 2, 220, 135, 23), + (7169, 3, 220, 270, 52), + (7169, 4, 220, 135, 28), + (7170, 1, 220, 145, 21), + (7170, 2, 220, 145, 23), + (7170, 3, 220, 290, 52), + (7170, 4, 220, 145, 28), + (7171, 1, 220, 155, 21), + (7171, 2, 220, 155, 23), + (7171, 3, 220, 310, 52), + (7171, 4, 220, 155, 28), + (7175, 1, 283, 120, 0), + (7176, 1, 283, 140, 0), + (7177, 1, 283, 160, 0), + (7196, 1, 169, 20, -1), + (7197, 1, 169, 25, -1), + (7198, 1, 169, 30, -1), + (7204, 1, 218, 11, 0), + (7205, 1, 218, 12, 0), + (7206, 1, 218, 13, 0), + (7207, 1, 218, 14, 0), + (7208, 1, 218, 15, 0), + (7210, 1, 280, 50, 0), + (7211, 1, 280, 53, 0), + (7212, 1, 280, 56, 0), + (7213, 1, 280, 59, 0), + (7214, 1, 280, 62, 0), + (7215, 1, 264, 4200, 68), + (7216, 1, 264, 4800, 68), + (7220, 1, 360, 60, 12701), + (7221, 1, 360, 60, 12702), + (7222, 1, 360, 60, 12703), + (7232, 1, 294, 0, 185), + (7233, 1, 294, 0, 190), + (7234, 1, 294, 0, 195), + (7260, 1, 287, 14, 0), + (7260, 2, 385, 2754, 1), + (7261, 1, 287, 16, 0), + (7261, 2, 385, 2754, 1), + (7262, 1, 287, 18, 0), + (7262, 2, 385, 2754, 1), + (7263, 1, 274, 18, 0), + (7264, 1, 274, 20, 0), + (7265, 1, 274, 22, 0), + (7267, 1, 280, 54, 0), + (7268, 1, 280, 55, 0), + (7269, 1, 280, 56, 0), + (7270, 1, 218, 16, 0), + (7271, 1, 218, 17, 0), + (7272, 1, 218, 18, 0), + (7273, 1, 218, 19, 0), + (7274, 1, 218, 20, 0), + (7279, 1, 310, 6000, 0), + (7279, 2, 139, 11903, 0), + (7279, 3, 310, 6000, 0), + (7279, 4, 139, 11904, 0), + (7279, 5, 310, 6000, 0), + (7279, 6, 139, 11905, 0), + (7279, 7, 310, 6000, 0), + (7279, 8, 139, 1362, 0), + (7279, 9, 310, 6000, 0), + (7279, 10, 139, 8032, 0), + (7279, 11, 310, 6000, 0), + (7279, 12, 385, 6131, 0), + (7279, 13, 385, 6231, 0), + (7279, 14, 385, 6331, 0), + (7279, 15, 385, 6431, 0), + (7279, 16, 385, 6531, 0), + (7279, 17, 385, 6631, 0), + (7280, 1, 310, 7000, 0), + (7280, 2, 139, 11903, 0), + (7280, 3, 310, 7000, 0), + (7280, 4, 139, 11904, 0), + (7280, 5, 310, 7000, 0), + (7280, 6, 139, 11905, 0), + (7280, 7, 310, 7000, 0), + (7280, 8, 139, 1362, 0), + (7280, 9, 310, 7000, 0), + (7280, 10, 139, 8032, 0), + (7280, 11, 310, 7000, 0), + (7280, 12, 385, 6131, 0), + (7280, 13, 385, 6231, 0), + (7280, 14, 385, 6331, 0), + (7280, 15, 385, 6431, 0), + (7280, 16, 385, 6531, 0), + (7280, 17, 385, 6631, 0), + (7281, 1, 310, 8000, 0), + (7281, 2, 139, 11903, 0), + (7281, 3, 310, 8000, 0), + (7281, 4, 139, 11904, 0), + (7281, 5, 310, 8000, 0), + (7281, 6, 139, 11905, 0), + (7281, 7, 310, 8000, 0), + (7281, 8, 139, 1362, 0), + (7281, 9, 310, 8000, 0), + (7281, 10, 139, 8032, 0), + (7281, 11, 310, 8000, 0), + (7281, 12, 385, 6131, 0), + (7281, 13, 385, 6231, 0), + (7281, 14, 385, 6331, 0), + (7281, 15, 385, 6431, 0), + (7281, 16, 385, 6531, 0), + (7281, 17, 385, 6631, 0), + (7282, 1, 310, 9000, 0), + (7282, 2, 139, 11903, 0), + (7282, 3, 310, 9000, 0), + (7282, 4, 139, 11904, 0), + (7282, 5, 310, 9000, 0), + (7282, 6, 139, 11905, 0), + (7282, 7, 310, 9000, 0), + (7282, 8, 139, 1362, 0), + (7282, 9, 310, 9000, 0), + (7282, 10, 139, 8032, 0), + (7282, 11, 310, 9000, 0), + (7282, 12, 385, 6131, 0), + (7282, 13, 385, 6231, 0), + (7282, 14, 385, 6331, 0), + (7282, 15, 385, 6431, 0), + (7282, 16, 385, 6531, 0), + (7282, 17, 385, 6631, 0), + (7283, 1, 310, 10000, 0), + (7283, 2, 139, 11903, 0), + (7283, 3, 310, 10000, 0), + (7283, 4, 139, 11904, 0), + (7283, 5, 310, 10000, 0), + (7283, 6, 139, 11905, 0), + (7283, 7, 310, 10000, 0), + (7283, 8, 139, 1362, 0), + (7283, 9, 310, 10000, 0), + (7283, 10, 139, 8032, 0), + (7283, 11, 310, 10000, 0), + (7283, 12, 385, 6131, 0), + (7283, 13, 385, 6231, 0), + (7283, 14, 385, 6331, 0), + (7283, 15, 385, 6431, 0), + (7283, 16, 385, 6531, 0), + (7283, 17, 385, 6631, 0), + (7284, 1, 287, 3, 0), + (7284, 2, 137, 31, 0), + (7284, 3, 136, 5, 0), + (7313, 1, 244, 40, 0), + (7314, 1, 244, 30, 0), + (7315, 1, 244, 20, 0), + (7316, 1, 264, 1080, 41), + (7317, 1, 264, 1260, 41), + (7318, 1, 339, 25, 16015), + (7318, 2, 137, 21, 0), + (7319, 1, 339, 25, 16016), + (7319, 2, 137, 21, 0), + (7320, 1, 339, 25, 16017), + (7320, 2, 137, 21, 0), + (7321, 1, 339, 25, 16018), + (7321, 2, 137, 21, 0), + (7322, 1, 339, 25, 16019), + (7322, 2, 137, 21, 0), + (7323, 1, 264, 720, 254), + (7324, 1, 264, 900, 254), + (7325, 1, 264, 1080, 254), + (7326, 1, 264, 1728, 286), + (7326, 2, 264, 1728, 10753), + (7326, 3, 264, 1728, 9101), + (7327, 1, 264, 2160, 286), + (7327, 2, 264, 2160, 10753), + (7327, 3, 264, 2160, 9101), + (7328, 1, 264, 2592, 286), + (7328, 2, 264, 2592, 10753), + (7328, 3, 264, 2592, 9101), + (7336, 1, 85, 16029, 0), + (7337, 1, 85, 16030, 0), + (7338, 1, 85, 16031, 0), + (7353, 1, 216, 115, 0), + (7353, 2, 216, 115, 1), + (7353, 3, 216, 115, 2), + (7353, 4, 216, 115, 3), + (7353, 5, 216, 115, 10), + (7353, 6, 216, 115, 28), + (7353, 7, 216, 115, 30), + (7353, 8, 216, 115, 36), + (7353, 9, 216, 115, 77), + (7354, 1, 216, 120, 0), + (7354, 2, 216, 120, 1), + (7354, 3, 216, 120, 2), + (7354, 4, 216, 120, 3), + (7354, 5, 216, 120, 10), + (7354, 6, 216, 120, 28), + (7354, 7, 216, 120, 30), + (7354, 8, 216, 120, 36), + (7354, 9, 216, 120, 77), + (7355, 1, 216, 125, 0), + (7355, 2, 216, 125, 1), + (7355, 3, 216, 125, 2), + (7355, 4, 216, 125, 3), + (7355, 5, 216, 125, 10), + (7355, 6, 216, 125, 28), + (7355, 7, 216, 125, 30), + (7355, 8, 216, 125, 36), + (7355, 9, 216, 125, 77), + (7356, 1, 360, 60, 16056), + (7357, 1, 360, 60, 16057), + (7358, 1, 360, 60, 16058), + (7359, 1, 217, 0, 82600), + (7359, 2, 346, 78, 22), + (7360, 1, 217, 0, 88880), + (7360, 2, 346, 80, 22), + (7361, 1, 217, 0, 95440), + (7361, 2, 346, 82, 22), + (7362, 1, 59, -18, 0), + (7363, 1, 59, -21, 0), + (7364, 1, 59, -24, 0), + (7365, 1, 59, -27, 0), + (7366, 1, 59, -30, 0), + (7373, 1, 2, 108, 0), + (7374, 1, 2, 112, 0), + (7375, 1, 2, 116, 0), + (7376, 1, 2, 120, 0), + (7377, 1, 2, 124, 0), + (7378, 1, 347, 14, 0), + (7379, 1, 347, 16, 0), + (7380, 1, 347, 18, 0), + (7381, 1, 347, 20, 0), + (7382, 1, 347, 22, 0), + (7383, 1, 347, 24, 0), + (7384, 1, 360, 25, 16063), + (7385, 1, 360, 25, 16064), + (7386, 1, 360, 25, 16065), + (7390, 1, 303, 6000, 6000), + (7390, 2, 139, 2766, 0), + (7391, 1, 303, 6500, 6500), + (7391, 2, 139, 2766, 0), + (7392, 1, 303, 7500, 8500), + (7392, 2, 139, 2766, 0), + (7393, 1, 85, 16066, 0), + (7394, 1, 85, 16067, 0), + (7395, 1, 85, 16068, 0), + (7396, 1, 85, 16069, 0), + (7397, 1, 85, 16070, 0), + (7398, 1, 85, 16071, 0), + (7399, 1, 302, 350, 350), + (7399, 2, 385, 99, 0), + (7400, 1, 302, 370, 370), + (7400, 2, 385, 99, 0), + (7401, 1, 302, 400, 400), + (7401, 2, 385, 99, 0), + (7402, 1, 59, -33, 0), + (7403, 1, 59, -36, 0), + (7404, 1, 59, -39, 0), + (7405, 1, 59, -42, 0), + (7406, 1, 59, -45, 0), + (7407, 1, 181, 100, -1), + (7448, 1, 264, 240, 553), + (7449, 1, 264, 300, 553), + (7450, 1, 264, 360, 553), + (7451, 1, 264, 720, 777), + (7452, 1, 264, 900, 777), + (7453, 1, 264, 1080, 777), + (7478, 1, 264, 2880, 245), + (7489, 1, 218, 16, 0), + (7490, 1, 218, 17, 0), + (7491, 1, 218, 18, 0), + (7492, 1, 218, 19, 0), + (7493, 1, 218, 20, 0), + (7494, 1, 280, 65, 0), + (7495, 1, 280, 66, 0), + (7496, 1, 280, 67, 0), + (7500, 1, 363, 3, 0), + (7501, 1, 172, 45, 0), + (7502, 1, 172, 46, 0), + (7503, 1, 172, 47, 0), + (7504, 1, 172, 48, 0), + (7505, 1, 172, 49, 0), + (7506, 1, 259, 51, 0), + (7507, 1, 259, 52, 0), + (7508, 1, 259, 53, 0), + (7509, 1, 259, 54, 0), + (7510, 1, 259, 55, 0), + (7511, 1, 328, 1050, 0), + (7512, 1, 328, 1100, 0), + (7513, 1, 328, 1150, 0), + (7514, 1, 328, 1200, 0), + (7515, 1, 328, 1250, 0), + (7516, 1, 262, 30, 7), + (7516, 2, 262, 30, 8), + (7516, 3, 262, 30, 9), + (7516, 4, 262, 30, 10), + (7516, 5, 262, 30, 11), + (7517, 1, 262, 35, 7), + (7517, 2, 262, 35, 8), + (7517, 3, 262, 35, 9), + (7517, 4, 262, 35, 10), + (7517, 5, 262, 35, 11), + (7518, 1, 262, 40, 7), + (7518, 2, 262, 40, 8), + (7518, 3, 262, 40, 9), + (7518, 4, 262, 40, 10), + (7518, 5, 262, 40, 11), + (7519, 1, 262, 45, 7), + (7519, 2, 262, 45, 8), + (7519, 3, 262, 45, 9), + (7519, 4, 262, 45, 10), + (7519, 5, 262, 45, 11), + (7520, 1, 262, 50, 7), + (7520, 2, 262, 50, 8), + (7520, 3, 262, 50, 9), + (7520, 4, 262, 50, 10), + (7520, 5, 262, 50, 11), + (7521, 1, 317, 11, 0), + (7522, 1, 317, 12, 0), + (7523, 1, 317, 13, 0), + (7524, 1, 317, 14, 0), + (7525, 1, 317, 15, 0), + (7526, 1, 69, 600, 0), + (7527, 1, 69, 700, 0), + (7528, 1, 69, 800, 0), + (7529, 1, 69, 900, 0), + (7530, 1, 69, 1000, 0), + (7534, 1, 0, 21, 0), + (7535, 1, 0, 22, 0), + (7536, 1, 0, 23, 0), + (7537, 1, 0, 24, 0), + (7538, 1, 0, 25, 0), + (7539, 1, 327, 8, 0), + (7540, 1, 327, 9, 0), + (7541, 1, 214, 1100, 0), + (7542, 1, 214, 1200, 0), + (7543, 1, 214, 1300, 0), + (7544, 1, 221, 27, 0), + (7545, 1, 221, 30, 0), + (7546, 1, 221, 33, 0), + (7547, 1, 262, 80, 0), + (7547, 2, 262, 80, 1), + (7547, 3, 262, 80, 2), + (7547, 4, 262, 80, 3), + (7547, 5, 262, 80, 4), + (7547, 6, 262, 80, 5), + (7547, 7, 262, 80, 6), + (7548, 1, 262, 85, 0), + (7548, 2, 262, 85, 1), + (7548, 3, 262, 85, 2), + (7548, 4, 262, 85, 3), + (7548, 5, 262, 85, 4), + (7548, 6, 262, 85, 5), + (7548, 7, 262, 85, 6), + (7549, 1, 262, 90, 0), + (7549, 2, 262, 90, 1), + (7549, 3, 262, 90, 2), + (7549, 4, 262, 90, 3), + (7549, 5, 262, 90, 4), + (7549, 6, 262, 90, 5), + (7549, 7, 262, 90, 6), + (7550, 1, 262, 95, 0), + (7550, 2, 262, 95, 1), + (7550, 3, 262, 95, 2), + (7550, 4, 262, 95, 3), + (7550, 5, 262, 95, 4), + (7550, 6, 262, 95, 5), + (7550, 7, 262, 95, 6), + (7551, 1, 262, 100, 0), + (7551, 2, 262, 100, 1), + (7551, 3, 262, 100, 2), + (7551, 4, 262, 100, 3), + (7551, 5, 262, 100, 4), + (7551, 6, 262, 100, 5), + (7551, 7, 262, 100, 6), + (7553, 1, 326, 3, 0), + (7554, 1, 339, 20, 16194), + (7554, 2, 138, 1, 0), + (7554, 3, 141, 1, 0), + (7554, 4, 142, 65, 0), + (7554, 5, 137, 0, 0), + (7554, 6, 311, 0, 0), + (7554, 7, 134, 85, 0), + (7554, 8, 139, -265, 0), + (7554, 9, 139, -754, 0), + (7554, 10, 139, -1332, 0), + (7554, 11, 139, -1572, 0), + (7554, 12, 139, -2749, 0), + (7554, 13, 139, -4979, 0), + (7554, 14, 139, -5418, 0), + (7554, 15, 139, -5403, 0), + (7554, 16, 348, 10, 0), + (7555, 1, 339, 21, 16195), + (7555, 2, 138, 1, 0), + (7555, 3, 141, 1, 0), + (7555, 4, 142, 65, 0), + (7555, 5, 137, 0, 0), + (7555, 6, 311, 0, 0), + (7555, 7, 134, 85, 0), + (7555, 8, 139, -265, 0), + (7555, 9, 139, -754, 0), + (7555, 10, 139, -1332, 0), + (7555, 11, 139, -1572, 0), + (7555, 12, 139, -2749, 0), + (7555, 13, 139, -4979, 0), + (7555, 14, 139, -5418, 0), + (7555, 15, 139, -5403, 0), + (7555, 16, 348, 10, 0), + (7556, 1, 339, 22, 16196), + (7556, 2, 138, 1, 0), + (7556, 3, 141, 1, 0), + (7556, 4, 142, 65, 0), + (7556, 5, 137, 0, 0), + (7556, 6, 311, 0, 0), + (7556, 7, 134, 85, 0), + (7556, 8, 139, -265, 0), + (7556, 9, 139, -754, 0), + (7556, 10, 139, -1332, 0), + (7556, 11, 139, -1572, 0), + (7556, 12, 139, -2749, 0), + (7556, 13, 139, -4979, 0), + (7556, 14, 139, -5418, 0), + (7556, 15, 139, -5403, 0), + (7556, 16, 348, 10, 0), + (7557, 1, 339, 23, 16417), + (7557, 2, 138, 1, 0), + (7557, 3, 141, 1, 0), + (7557, 4, 142, 65, 0), + (7557, 5, 137, 0, 0), + (7557, 6, 311, 0, 0), + (7557, 7, 134, 85, 0), + (7557, 8, 139, -265, 0), + (7557, 9, 139, -754, 0), + (7557, 10, 139, -1332, 0), + (7557, 11, 139, -1572, 0), + (7557, 12, 139, -2749, 0), + (7557, 13, 139, -4979, 0), + (7557, 14, 139, -5418, 0), + (7557, 15, 139, -5403, 0), + (7557, 16, 348, 10, 0), + (7558, 1, 339, 24, 16418), + (7558, 2, 138, 1, 0), + (7558, 3, 141, 1, 0), + (7558, 4, 142, 65, 0), + (7558, 5, 137, 0, 0), + (7558, 6, 311, 0, 0), + (7558, 7, 134, 85, 0), + (7558, 8, 139, -265, 0), + (7558, 9, 139, -754, 0), + (7558, 10, 139, -1332, 0), + (7558, 11, 139, -1572, 0), + (7558, 12, 139, -2749, 0), + (7558, 13, 139, -4979, 0), + (7558, 14, 139, -5418, 0), + (7558, 15, 139, -5403, 0), + (7558, 16, 348, 10, 0), + (7559, 1, 266, 23, 0), + (7560, 1, 266, 24, 0), + (7561, 1, 266, 25, 0), + (7562, 1, 330, 125, 0), + (7562, 2, 330, 125, 1), + (7562, 3, 330, 125, 2), + (7562, 4, 330, 125, 3), + (7562, 5, 330, 125, 28), + (7562, 6, 330, 125, 36), + (7562, 7, 330, 125, 77), + (7563, 1, 330, 130, 0), + (7563, 2, 330, 130, 1), + (7563, 3, 330, 130, 2), + (7563, 4, 330, 130, 3), + (7563, 5, 330, 130, 28), + (7563, 6, 330, 130, 36), + (7563, 7, 330, 130, 77), + (7564, 1, 330, 135, 0), + (7564, 2, 330, 135, 1), + (7564, 3, 330, 135, 2), + (7564, 4, 330, 135, 3), + (7564, 5, 330, 135, 28), + (7564, 6, 330, 135, 36), + (7564, 7, 330, 135, 77), + (7565, 1, 278, 800, 54510), + (7565, 2, 440, 76, 100), + (7566, 1, 278, 850, 58400), + (7566, 2, 440, 78, 100), + (7567, 1, 278, 900, 62680), + (7567, 2, 440, 80, 100), + (7568, 1, 341, 160, 0), + (7569, 1, 341, 170, 0), + (7570, 1, 341, 180, 0), + (7571, 1, 341, 190, 0), + (7572, 1, 341, 200, 0), + (7573, 1, 360, 70, 11023), + (7574, 1, 360, 80, 11023), + (7575, 1, 360, 90, 11023), + (7576, 1, 318, 16, 0), + (7577, 1, 318, 17, 0), + (7578, 1, 318, 18, 0), + (7579, 1, 318, 19, 0), + (7580, 1, 318, 20, 0), + (7581, 1, 294, 0, 160), + (7582, 1, 294, 0, 165), + (7583, 1, 294, 0, 170), + (7584, 1, 114, -60, 0), + (7585, 1, 114, -61, 0), + (7586, 1, 114, -62, 0), + (7587, 1, 319, 22, 0), + (7588, 1, 319, 23, 0), + (7589, 1, 319, 24, 0), + (7590, 1, 274, 35, 0), + (7591, 1, 274, 36, 0), + (7592, 1, 274, 37, 0), + (7593, 1, 15, 14, 0), + (7594, 1, 15, 15, 0), + (7595, 1, 15, 16, 0), + (7596, 1, 15, 17, 0), + (7597, 1, 15, 18, 0), + (7598, 1, 114, -60, 0), + (7599, 1, 114, -61, 0), + (7600, 1, 114, -62, 0), + (7601, 1, 213, 7, 0), + (7602, 1, 213, 9, 0), + (7603, 1, 213, 11, 0), + (7604, 1, 189, 14, 0), + (7605, 1, 189, 15, 0), + (7612, 1, 270, 70, 0), + (7613, 1, 270, 75, 0), + (7614, 1, 270, 80, 0), + (7615, 1, 264, 720, 494), + (7616, 1, 264, 900, 494), + (7617, 1, 264, 1080, 494), + (7618, 1, 264, 720, 500), + (7619, 1, 264, 900, 500), + (7620, 1, 264, 1080, 500), + (7621, 1, 339, 10, 8105), + (7621, 2, 142, 65, 0), + (7621, 3, 311, 0, 0), + (7621, 4, 134, 70, 0), + (7621, 5, 348, 10, 0), + (7621, 6, 137, 0, 0), + (7621, 7, 339, 10, 8105), + (7621, 8, 142, 65, 0), + (7621, 9, 311, 0, 0), + (7621, 10, 134, 70, 0), + (7621, 11, 348, 10, 0), + (7621, 12, 137, 100, 0), + (7621, 13, 339, 10, 8105), + (7621, 14, 142, 65, 0), + (7621, 15, 311, 0, 0), + (7621, 16, 134, 70, 0), + (7621, 17, 348, 10, 0), + (7621, 18, 137, 79, 0), + (7621, 19, 339, 10, 8105), + (7621, 20, 142, 65, 0), + (7621, 21, 311, 0, 0), + (7621, 22, 134, 70, 0), + (7621, 23, 348, 10, 0), + (7621, 24, 137, 147, 0), + (7621, 25, 339, 10, 11404), + (7621, 26, 142, 71, 0), + (7621, 27, 311, 0, 0), + (7621, 28, 134, 75, 0), + (7621, 29, 348, 10, 0), + (7621, 30, 137, 0, 0), + (7621, 31, 339, 10, 11404), + (7621, 32, 142, 71, 0), + (7621, 33, 311, 0, 0), + (7621, 34, 134, 75, 0), + (7621, 35, 348, 10, 0), + (7621, 36, 137, 100, 0), + (7621, 37, 339, 10, 11404), + (7621, 38, 142, 71, 0), + (7621, 39, 311, 0, 0), + (7621, 40, 134, 75, 0), + (7621, 41, 348, 10, 0), + (7621, 42, 137, 79, 0), + (7621, 43, 339, 10, 11404), + (7621, 44, 142, 71, 0), + (7621, 45, 311, 0, 0), + (7621, 46, 134, 75, 0), + (7621, 47, 348, 10, 0), + (7621, 48, 137, 147, 0), + (7621, 49, 339, 10, 13199), + (7621, 50, 142, 76, 0), + (7621, 51, 311, 0, 0), + (7621, 52, 134, 80, 0), + (7621, 53, 348, 10, 0), + (7621, 54, 137, 0, 0), + (7621, 55, 339, 10, 13199), + (7621, 56, 142, 76, 0), + (7621, 57, 311, 0, 0), + (7621, 58, 134, 80, 0), + (7621, 59, 348, 10, 0), + (7621, 60, 137, 100, 0), + (7621, 61, 339, 10, 13199), + (7621, 62, 142, 76, 0), + (7621, 63, 311, 0, 0), + (7621, 64, 134, 80, 0), + (7621, 65, 348, 10, 0), + (7621, 66, 137, 79, 0), + (7621, 67, 339, 10, 13199), + (7621, 68, 142, 76, 0), + (7621, 69, 311, 0, 0), + (7621, 70, 134, 80, 0), + (7621, 71, 348, 10, 0), + (7621, 72, 137, 147, 0), + (7621, 73, 339, 10, 13830), + (7621, 74, 142, 81, 0), + (7621, 75, 311, 0, 0), + (7621, 76, 134, 85, 0), + (7621, 77, 348, 10, 0), + (7621, 78, 137, 0, 0), + (7621, 79, 339, 10, 13830), + (7621, 80, 142, 81, 0), + (7621, 81, 311, 0, 0), + (7621, 82, 134, 85, 0), + (7621, 83, 348, 10, 0), + (7621, 84, 137, 100, 0), + (7621, 85, 339, 10, 13830), + (7621, 86, 142, 81, 0), + (7621, 87, 311, 0, 0), + (7621, 88, 134, 85, 0), + (7621, 89, 348, 10, 0), + (7621, 90, 137, 79, 0), + (7621, 91, 339, 10, 13830), + (7621, 92, 142, 81, 0), + (7621, 93, 311, 0, 0), + (7621, 94, 134, 85, 0), + (7621, 95, 348, 10, 0), + (7621, 96, 137, 147, 0), + (7622, 1, 265, 79, 0), + (7623, 1, 265, 80, 0), + (7624, 1, 265, 81, 0), + (7625, 1, 265, 79, 0), + (7626, 1, 265, 80, 0), + (7627, 1, 265, 81, 0), + (7628, 1, 292, 46, 0), + (7629, 1, 292, 47, 0), + (7630, 1, 292, 48, 0), + (7631, 1, 279, 34, 0), + (7632, 1, 279, 35, 0), + (7633, 1, 279, 36, 0), + (7634, 1, 279, 34, 0), + (7635, 1, 279, 35, 0), + (7636, 1, 279, 36, 0), + (7637, 1, 279, 34, 0), + (7638, 1, 279, 35, 0), + (7639, 1, 279, 36, 0), + (7640, 1, 200, 60, 0), + (7641, 1, 294, 17, 100), + (7642, 1, 294, 19, 100), + (7643, 1, 294, 21, 100), + (7644, 1, 375, 130, 0), + (7645, 1, 375, 135, 0), + (7646, 1, 375, 140, 0), + (7647, 1, 229, 20, 0), + (7648, 1, 229, 25, 0), + (7649, 1, 229, 30, 0), + (7650, 1, 330, 125, 0), + (7650, 2, 330, 125, 1), + (7650, 3, 330, 125, 2), + (7650, 4, 330, 125, 3), + (7650, 5, 330, 125, 28), + (7650, 6, 330, 125, 36), + (7651, 1, 330, 130, 0), + (7651, 2, 330, 130, 1), + (7651, 3, 330, 130, 2), + (7651, 4, 330, 130, 3), + (7651, 5, 330, 130, 28), + (7651, 6, 330, 130, 36), + (7652, 1, 330, 135, 0), + (7652, 2, 330, 135, 1), + (7652, 3, 330, 135, 2), + (7652, 4, 330, 135, 3), + (7652, 5, 330, 135, 28), + (7652, 6, 330, 135, 36), + (7653, 1, 330, 125, 0), + (7653, 2, 330, 125, 1), + (7653, 3, 330, 125, 2), + (7653, 4, 330, 125, 3), + (7653, 5, 330, 125, 28), + (7653, 6, 330, 125, 36), + (7653, 7, 330, 125, 77), + (7654, 1, 330, 130, 0), + (7654, 2, 330, 130, 1), + (7654, 3, 330, 130, 2), + (7654, 4, 330, 130, 3), + (7654, 5, 330, 130, 28), + (7654, 6, 330, 130, 36), + (7654, 7, 330, 130, 77), + (7655, 1, 330, 135, 0), + (7655, 2, 330, 135, 1), + (7655, 3, 330, 135, 2), + (7655, 4, 330, 135, 3), + (7655, 5, 330, 135, 28), + (7655, 6, 330, 135, 36), + (7655, 7, 330, 135, 77), + (7656, 1, 330, 100, 0), + (7656, 2, 330, 100, 1), + (7656, 3, 330, 100, 2), + (7656, 4, 330, 100, 3), + (7656, 5, 330, 100, 28), + (7656, 6, 330, 100, 36), + (7656, 7, 330, 100, 77), + (7657, 1, 330, 105, 0), + (7657, 2, 330, 105, 1), + (7657, 3, 330, 105, 2), + (7657, 4, 330, 105, 3), + (7657, 5, 330, 105, 28), + (7657, 6, 330, 105, 36), + (7657, 7, 330, 105, 77), + (7658, 1, 330, 110, 0), + (7658, 2, 330, 110, 1), + (7658, 3, 330, 110, 2), + (7658, 4, 330, 110, 3), + (7658, 5, 330, 110, 28), + (7658, 6, 330, 110, 36), + (7658, 7, 330, 110, 77), + (7659, 1, 264, 72, 153), + (7660, 1, 264, 90, 153), + (7661, 1, 264, 108, 153), + (7663, 1, 375, 150, 0), + (7664, 1, 264, 10, 170), + (7665, 1, 264, 20, 170), + (7666, 1, 264, 30, 170), + (7667, 1, 264, 40, 170), + (7668, 1, 264, 50, 170), + (7670, 1, 229, 35, 0), + (7671, 1, 229, 40, 0), + (7672, 1, 229, 45, 0), + (7673, 1, 220, 50, 10), + (7674, 1, 220, 65, 10), + (7675, 1, 220, 80, 10), + (7676, 1, 220, 95, 10), + (7677, 1, 220, 110, 10), + (7678, 1, 231, 11, 0), + (7679, 1, 231, 13, 0), + (7680, 1, 231, 15, 0), + (7681, 1, 326, 4, 0), + (7682, 1, 264, 5400, 68), + (7683, 1, 327, 10, 0), + (7684, 1, 327, 11, 0), + (7685, 1, 327, 12, 0), + (7686, 1, 349, 55, 0), + (7687, 1, 349, 60, 0), + (7688, 1, 349, 65, 0), + (7690, 1, 353, 1, 0), + (7692, 1, 319, 25, 0), + (7693, 1, 319, 26, 0), + (7694, 1, 319, 27, 0), + (7695, 1, 127, 5, 0), + (7695, 2, 385, 14232, 0), + (7696, 1, 127, 10, 0), + (7696, 2, 385, 14232, 0), + (7697, 1, 127, 15, 0), + (7697, 2, 385, 14232, 0), + (7699, 1, 181, 100, 0), + (7700, 1, 279, 7, 0), + (7701, 1, 279, 11, 0), + (7702, 1, 279, 15, 0), + (7704, 1, 264, 540, 3707), + (7705, 1, 264, 720, 3707), + (7706, 1, 264, 900, 3707), + (7707, 1, 303, 8500, 9500), + (7707, 2, 139, 2766, 0), + (7708, 1, 303, 9500, 11000), + (7708, 2, 139, 2766, 0), + (7709, 1, 303, 11000, 14000), + (7709, 2, 139, 2766, 0), + (7713, 1, 274, 34, 0), + (7714, 1, 274, 36, 0), + (7715, 1, 264, 2, 901), + (7716, 1, 264, 4, 901), + (7717, 1, 264, 6, 901), + (7718, 1, 281, 90, 0), + (7722, 1, 339, 25, 23492), + (7722, 2, 138, 1, 0), + (7722, 3, 141, 1, 0), + (7722, 4, 142, 70, 0), + (7722, 5, 137, 0, 0), + (7722, 6, 311, 0, 0), + (7722, 7, 134, 90, 0), + (7722, 8, 139, -265, 0), + (7722, 9, 139, -754, 0), + (7722, 10, 139, -1332, 0), + (7722, 11, 139, -1572, 0), + (7722, 12, 139, -2749, 0), + (7722, 13, 139, -4979, 0), + (7722, 14, 139, -5418, 0), + (7722, 15, 139, -5403, 0), + (7722, 16, 348, 10, 0), + (7723, 1, 339, 26, 23493), + (7723, 2, 138, 1, 0), + (7723, 3, 141, 1, 0), + (7723, 4, 142, 70, 0), + (7723, 5, 137, 0, 0), + (7723, 6, 311, 0, 0), + (7723, 7, 134, 90, 0), + (7723, 8, 139, -265, 0), + (7723, 9, 139, -754, 0), + (7723, 10, 139, -1332, 0), + (7723, 11, 139, -1572, 0), + (7723, 12, 139, -2749, 0), + (7723, 13, 139, -4979, 0), + (7723, 14, 139, -5418, 0), + (7723, 15, 139, -5403, 0), + (7723, 16, 348, 10, 0), + (7724, 1, 339, 27, 23494), + (7724, 2, 138, 1, 0), + (7724, 3, 141, 1, 0), + (7724, 4, 142, 70, 0), + (7724, 5, 137, 0, 0), + (7724, 6, 311, 0, 0), + (7724, 7, 134, 90, 0), + (7724, 8, 139, -265, 0), + (7724, 9, 139, -754, 0), + (7724, 10, 139, -1332, 0), + (7724, 11, 139, -1572, 0), + (7724, 12, 139, -2749, 0), + (7724, 13, 139, -4979, 0), + (7724, 14, 139, -5418, 0), + (7724, 15, 139, -5403, 0), + (7724, 16, 348, 10, 0), + (7725, 1, 339, 28, 23495), + (7725, 2, 138, 1, 0), + (7725, 3, 141, 1, 0), + (7725, 4, 142, 70, 0), + (7725, 5, 137, 0, 0), + (7725, 6, 311, 0, 0), + (7725, 7, 134, 90, 0), + (7725, 8, 139, -265, 0), + (7725, 9, 139, -754, 0), + (7725, 10, 139, -1332, 0), + (7725, 11, 139, -1572, 0), + (7725, 12, 139, -2749, 0), + (7725, 13, 139, -4979, 0), + (7725, 14, 139, -5418, 0), + (7725, 15, 139, -5403, 0), + (7725, 16, 348, 10, 0), + (7726, 1, 339, 29, 23496), + (7726, 2, 138, 1, 0), + (7726, 3, 141, 1, 0), + (7726, 4, 142, 70, 0), + (7726, 5, 137, 0, 0), + (7726, 6, 311, 0, 0), + (7726, 7, 134, 90, 0), + (7726, 8, 139, -265, 0), + (7726, 9, 139, -754, 0), + (7726, 10, 139, -1332, 0), + (7726, 11, 139, -1572, 0), + (7726, 12, 139, -2749, 0), + (7726, 13, 139, -4979, 0), + (7726, 14, 139, -5418, 0), + (7726, 15, 139, -5403, 0), + (7726, 16, 348, 10, 0), + (7733, 1, 257, 1, 0), + (7733, 2, 267, 1, 31), + (7733, 3, 267, 1, 32), + (7733, 4, 267, 1, 33), + (7733, 5, 267, 1, 15), + (7733, 6, 267, 1, 16), + (7733, 7, 267, 1, 17), + (7733, 8, 267, 1, 18), + (7733, 9, 267, 1, 19), + (7733, 10, 267, 1, 20), + (7743, 1, 264, 90, 184), + (7744, 1, 264, 180, 184), + (7745, 1, 264, 270, 184), + (7746, 1, 310, 2000, 0), + (7746, 2, 385, 11233, 0), + (7746, 3, 385, 11333, 0), + (7746, 4, 411, 16, 0), + (7748, 1, 271, 5, 0), + (7749, 1, 271, 10, 0), + (7750, 1, 271, 15, 0), + (7751, 1, 264, 60, 2234), + (7752, 1, 264, 120, 2234), + (7753, 1, 264, 180, 2234), + (7757, 1, 264, 120, 9403), + (7758, 1, 264, 240, 9403), + (7759, 1, 264, 360, 9403), + (7760, 1, 264, 2, 824), + (7761, 1, 264, 4, 824), + (7762, 1, 264, 6, 824), + (7763, 1, 310, 4000, 0), + (7763, 2, 385, 11233, 0), + (7763, 3, 385, 11333, 0), + (7763, 4, 411, 16, 0), + (7764, 1, 310, 6000, 0), + (7764, 2, 385, 11233, 0), + (7764, 3, 385, 11333, 0), + (7764, 4, 411, 16, 0), + (7765, 1, 392, 1000, 0), + (7765, 2, 139, 21820, 0), + (7765, 3, 411, 4, 0), + (7766, 1, 392, 2000, 0), + (7766, 2, 139, 21820, 0), + (7766, 3, 411, 4, 0), + (7767, 1, 392, 3000, 0), + (7767, 2, 139, 21820, 0), + (7767, 3, 411, 4, 0), + (7768, 1, 392, 4000, 0), + (7768, 2, 139, 21820, 0), + (7768, 3, 411, 4, 0), + (7818, 1, 288, 200, 51), + (7818, 2, 288, 50, 51), + (7819, 1, 405, 7, 0), + (7820, 1, 405, 9, 0), + (7821, 1, 405, 11, 0), + (7822, 1, 264, 1, 1154), + (7823, 1, 264, 2, 1154), + (7824, 1, 264, 3, 1154), + (7825, 1, 264, 4, 1154), + (7826, 1, 264, 5, 1154), + (7827, 1, 398, 9000, 0), + (7827, 2, 385, 7225, 0), + (7827, 3, 385, 7325, 0), + (7827, 4, 385, 7425, 0), + (7828, 1, 310, 2000, 0), + (7828, 2, 385, 7225, 0), + (7828, 3, 385, 7325, 0), + (7828, 4, 385, 7425, 0), + (7828, 5, 385, 7525, 0), + (7828, 6, 385, 7625, 0), + (7829, 1, 310, 4000, 0), + (7829, 2, 385, 7225, 0), + (7829, 3, 385, 7325, 0), + (7829, 4, 385, 7425, 0), + (7829, 5, 385, 7525, 0), + (7829, 6, 385, 7625, 0), + (7830, 1, 310, 6000, 0), + (7830, 2, 385, 7225, 0), + (7830, 3, 385, 7325, 0), + (7830, 4, 385, 7425, 0), + (7830, 5, 385, 7525, 0), + (7830, 6, 385, 7625, 0), + (7832, 1, 264, 60, 60), + (7833, 2, 264, 120, 60), + (7834, 3, 264, 180, 60), + (7835, 4, 264, 240, 60), + (7836, 5, 264, 300, 60), + (7837, 1, 262, 55, 7), + (7837, 2, 262, 55, 8), + (7837, 3, 262, 55, 9), + (7837, 4, 262, 55, 10), + (7837, 5, 262, 55, 11), + (7838, 1, 262, 60, 7), + (7838, 2, 262, 60, 8), + (7838, 3, 262, 60, 9), + (7838, 4, 262, 60, 10), + (7838, 5, 262, 60, 11), + (7839, 1, 262, 65, 7), + (7839, 2, 262, 65, 8), + (7839, 3, 262, 65, 9), + (7839, 4, 262, 65, 10), + (7839, 5, 262, 65, 11), + (7840, 1, 262, 70, 7), + (7840, 2, 262, 70, 8), + (7840, 3, 262, 70, 9), + (7840, 4, 262, 70, 10), + (7840, 5, 262, 70, 11), + (7841, 1, 262, 75, 7), + (7841, 2, 262, 75, 8), + (7841, 3, 262, 75, 9), + (7841, 4, 262, 75, 10), + (7841, 5, 262, 75, 11), + (7842, 1, 339, 30, 27695), + (7842, 2, 138, 1, 0), + (7842, 3, 141, 1, 0), + (7842, 4, 142, 70, 0), + (7842, 5, 137, 0, 0), + (7842, 6, 311, 0, 0), + (7842, 7, 134, 100, 0), + (7842, 8, 139, -265, 0), + (7842, 9, 139, -754, 0), + (7842, 10, 139, -1332, 0), + (7842, 11, 139, -1572, 0), + (7842, 12, 139, -2749, 0), + (7842, 13, 139, -4979, 0), + (7842, 14, 139, -5418, 0), + (7842, 15, 139, -5403, 0), + (7842, 16, 348, 10, 0), + (7843, 1, 339, 31, 27696), + (7843, 2, 138, 1, 0), + (7843, 3, 141, 1, 0), + (7843, 4, 142, 70, 0), + (7843, 5, 137, 0, 0), + (7843, 6, 311, 0, 0), + (7843, 7, 134, 100, 0), + (7843, 8, 139, -265, 0), + (7843, 9, 139, -754, 0), + (7843, 10, 139, -1332, 0), + (7843, 11, 139, -1572, 0), + (7843, 12, 139, -2749, 0), + (7843, 13, 139, -4979, 0), + (7843, 14, 139, -5418, 0), + (7843, 15, 139, -5403, 0), + (7843, 16, 348, 10, 0), + (7844, 1, 339, 32, 27697), + (7844, 2, 138, 1, 0), + (7844, 3, 141, 1, 0), + (7844, 4, 142, 70, 0), + (7844, 5, 137, 0, 0), + (7844, 6, 311, 0, 0), + (7844, 7, 134, 100, 0), + (7844, 8, 139, -265, 0), + (7844, 9, 139, -754, 0), + (7844, 10, 139, -1332, 0), + (7844, 11, 139, -1572, 0), + (7844, 12, 139, -2749, 0), + (7844, 13, 139, -4979, 0), + (7844, 14, 139, -5418, 0), + (7844, 15, 139, -5403, 0), + (7844, 16, 348, 10, 0), + (7881, 1, 405, 13, 0), + (7882, 1, 405, 15, 0), + (7883, 1, 405, 17, 0), + (7884, 1, 287, 1, 0), + (7884, 2, 139, 4691, 0), + (7884, 3, 411, 128, 0), + (7885, 1, 287, 1, 0), + (7885, 2, 385, 8111, 0), + (7885, 3, 385, 15008, 0), + (7885, 4, 385, 8411, 0), + (7885, 5, 385, 8511, 0), + (7885, 6, 411, 128, 0), + (7886, 1, 328, 1300, 0), + (7887, 1, 328, 1350, 0), + (7888, 1, 328, 1400, 0), + (7889, 1, 328, 1450, 0), + (7890, 1, 328, 1500, 0), + (7900, 1, 339, 45, 16189), + (7900, 2, 136, 11, 0), + (7900, 3, 383, 45, 16189), + (7900, 4, 385, 11012, 0), + (7900, 5, 383, 45, 16189), + (7900, 6, 385, 5130, 0), + (7900, 7, 383, 45, 16189), + (7900, 8, 385, 5230, 0), + (7900, 9, 383, 45, 16189), + (7900, 10, 136, 22, 0), + (7900, 11, 383, 45, 16189), + (7900, 12, 385, 5330, 0), + (7900, 13, 385, 5430, 0), + (7900, 14, 385, 5530, 0), + (7901, 1, 339, 45, 16190), + (7901, 2, 136, 11, 0), + (7901, 3, 383, 45, 16190), + (7901, 4, 385, 11012, 0), + (7901, 5, 383, 45, 16190), + (7901, 6, 385, 5130, 0), + (7901, 7, 383, 45, 16190), + (7901, 8, 385, 5230, 0), + (7901, 9, 383, 45, 16190), + (7901, 10, 136, 22, 0), + (7901, 11, 383, 45, 16190), + (7901, 12, 385, 5330, 0), + (7901, 13, 385, 5430, 0), + (7901, 14, 385, 5530, 0), + (7902, 1, 339, 45, 16191), + (7902, 2, 136, 11, 0), + (7902, 3, 383, 45, 16191), + (7902, 4, 385, 11012, 0), + (7902, 5, 383, 45, 16191), + (7902, 6, 385, 5130, 0), + (7902, 7, 383, 45, 16191), + (7902, 8, 385, 5230, 0), + (7902, 9, 383, 45, 16191), + (7902, 10, 136, 22, 0), + (7902, 11, 383, 45, 16191), + (7902, 12, 385, 5330, 0), + (7902, 13, 385, 5430, 0), + (7902, 14, 385, 5530, 0), + (7904, 1, 0, 26, 0), + (7905, 1, 0, 27, 0), + (7906, 1, 0, 28, 0), + (7907, 1, 0, 29, 0), + (7908, 1, 0, 30, 0), + (7940, 1, 264, 15, 558), + (7941, 1, 264, 30, 558), + (7942, 1, 264, 45, 558), + (7945, 1, 310, 2000, 0), + (7945, 2, 139, 8007, 0), + (7945, 3, 310, 2000, 0), + (7945, 4, 385, 4140, 0), + (7945, 5, 385, 4240, 0), + (7945, 6, 385, 4340, 0), + (7945, 7, 385, 4440, 0), + (7945, 8, 385, 4540, 0), + (7945, 9, 385, 4640, 0), + (7946, 1, 310, 4000, 0), + (7946, 2, 139, 8007, 0), + (7946, 3, 310, 4000, 0), + (7946, 4, 385, 4140, 0), + (7946, 5, 385, 4240, 0), + (7946, 6, 385, 4340, 0), + (7946, 7, 385, 4440, 0), + (7946, 8, 385, 4540, 0), + (7946, 9, 385, 4640, 0), + (7947, 1, 310, 6000, 0), + (7947, 2, 139, 8007, 0), + (7947, 3, 310, 6000, 0), + (7947, 4, 385, 4140, 0), + (7947, 5, 385, 4240, 0), + (7947, 6, 385, 4340, 0), + (7947, 7, 385, 4440, 0), + (7947, 8, 385, 4540, 0), + (7947, 9, 385, 4640, 0), + (7948, 1, 339, 25, 16197), + (7948, 2, 138, 1, 0), + (7948, 3, 142, 60, 0), + (7948, 4, 137, 35, 0), + (7948, 5, 134, 75, 0), + (7948, 6, 339, 25, 16197), + (7948, 7, 138, 1, 0), + (7948, 8, 142, 60, 0), + (7948, 9, 137, 36, 0), + (7948, 10, 134, 75, 0), + (7948, 11, 339, 25, 16197), + (7948, 12, 138, 1, 0), + (7948, 13, 142, 60, 0), + (7948, 14, 137, 369, 0), + (7948, 15, 134, 75, 0), + (7948, 16, 339, 25, 16197), + (7948, 17, 138, 1, 0), + (7948, 18, 142, 60, 0), + (7948, 19, 137, 116, 0), + (7948, 20, 134, 75, 0), + (7949, 1, 339, 25, 16198), + (7949, 2, 138, 1, 0), + (7949, 3, 142, 60, 0), + (7949, 4, 137, 35, 0), + (7949, 5, 134, 80, 0), + (7949, 6, 339, 25, 16198), + (7949, 7, 138, 1, 0), + (7949, 8, 142, 60, 0), + (7949, 9, 137, 36, 0), + (7949, 10, 134, 80, 0), + (7949, 11, 339, 25, 16198), + (7949, 12, 138, 1, 0), + (7949, 13, 142, 60, 0), + (7949, 14, 137, 369, 0), + (7949, 15, 134, 80, 0), + (7949, 16, 339, 25, 16198), + (7949, 17, 138, 1, 0), + (7949, 18, 142, 60, 0), + (7949, 19, 137, 116, 0), + (7949, 20, 134, 80, 0), + (7950, 1, 339, 25, 16199), + (7950, 2, 138, 1, 0), + (7950, 3, 142, 60, 0), + (7950, 4, 137, 35, 0), + (7950, 5, 134, 85, 0), + (7950, 6, 339, 25, 16199), + (7950, 7, 138, 1, 0), + (7950, 8, 142, 60, 0), + (7950, 9, 137, 36, 0), + (7950, 10, 134, 85, 0), + (7950, 11, 339, 25, 16199), + (7950, 12, 138, 1, 0), + (7950, 13, 142, 60, 0), + (7950, 14, 137, 369, 0), + (7950, 15, 134, 85, 0), + (7950, 16, 339, 25, 16199), + (7950, 17, 138, 1, 0), + (7950, 18, 142, 60, 0), + (7950, 19, 137, 116, 0), + (7950, 20, 134, 85, 0), + (7980, 1, 243, 15, 0), + (7981, 1, 243, 25, 0), + (7982, 1, 243, 35, 0), + (7983, 1, 264, 120, 520), + (7984, 1, 264, 240, 520), + (7985, 1, 264, 360, 520), + (7989, 1, 264, 30, 705), + (7989, 2, 264, 30, 1092), + (7989, 3, 264, 30, 10396), + (7989, 4, 264, 30, 10397), + (7990, 1, 264, 60, 705), + (7990, 2, 264, 60, 1092), + (7990, 3, 264, 60, 10396), + (7990, 4, 264, 60, 10397), + (7991, 1, 264, 90, 705), + (7991, 2, 264, 90, 1092), + (7991, 3, 264, 90, 10396), + (7991, 4, 264, 90, 10397), + (7992, 1, 264, 120, 705), + (7992, 2, 264, 120, 1092), + (7992, 3, 264, 120, 10396), + (7992, 4, 264, 120, 10397), + (7994, 1, 264, 240, 39), + (7994, 2, 264, 3456, 1061), + (7995, 1, 264, 300, 39), + (7995, 2, 264, 4320, 1061), + (8000, 1, 69, 200, 0), + (8000, 2, 2, 75, 0), + (8000, 3, 97, 200, 0), + (8000, 4, 317, 8, 0), + (8031, 1, 264, 30, 791), + (8032, 1, 264, 60, 791), + (8033, 1, 264, 90, 791), + (8035, 1, 264, 180, 521), + (8036, 1, 264, 360, 521), + (8037, 1, 264, 540, 521), + (8040, 1, 128, 5, 5), + (8040, 2, 138, 1, 0), + (8040, 3, 140, 1, 0), + (8040, 4, 311, 0, 0), + (8040, 5, 411, 256, 0), + (8040, 6, 137, -40, 0), + (8040, 7, 391, 1, 0), + (8041, 1, 128, 15, 15), + (8041, 2, 138, 1, 0), + (8041, 3, 140, 1, 0), + (8041, 4, 311, 0, 0), + (8041, 5, 411, 256, 0), + (8041, 6, 137, -40, 0), + (8041, 7, 391, 1, 0), + (8042, 1, 128, 30, 30), + (8042, 2, 138, 1, 0), + (8042, 3, 140, 1, 0), + (8042, 4, 311, 0, 0), + (8042, 5, 411, 256, 0), + (8042, 6, 137, -40, 0), + (8042, 7, 391, 1, 0), + (8043, 1, 128, 50, 50), + (8043, 2, 138, 1, 0), + (8043, 3, 140, 1, 0), + (8043, 4, 311, 0, 0), + (8043, 5, 411, 256, 0), + (8043, 6, 137, -40, 0), + (8043, 7, 391, 1, 0), + (8059, 1, 128, 50, 50), + (8059, 2, 138, 1, 0), + (8059, 3, 140, 1, 0), + (8059, 4, 311, 0, 0), + (8059, 5, 411, 66434, 0), + (8059, 6, 137, -40, 0), + (8069, 1, 244, -10, 0), + (8070, 1, 244, -15, 0), + (8071, 1, 244, -20, 0), + (8076, 1, 264, 360, 565), + (8076, 2, 264, 360, 793), + (8076, 3, 264, 360, 794), + (8077, 1, 264, 720, 565), + (8077, 2, 264, 720, 793), + (8077, 3, 264, 720, 794), + (8078, 1, 264, 1080, 565), + (8078, 2, 264, 1080, 793), + (8078, 3, 264, 1080, 794), + (8079, 1, 264, 1440, 565), + (8079, 2, 264, 1440, 793), + (8079, 3, 264, 1440, 794), + (8080, 1, 264, 1800, 565), + (8080, 2, 264, 1800, 793), + (8080, 3, 264, 1800, 794), + (8081, 1, 264, 2160, 565), + (8081, 2, 264, 2160, 793), + (8081, 3, 264, 2160, 794), + (8082, 1, 264, 60, 208), + (8083, 1, 264, 120, 208), + (8084, 1, 264, 180, 208), + (8190, 1, 280, 2, 0), + (8191, 1, 280, 4, 0), + (8192, 1, 280, 6, 0), + (8193, 1, 339, 100, 16225), + (8193, 2, 139, 6838, 0), + (8195, 1, 264, 120, 3707), + (8196, 1, 264, 240, 3707), + (8197, 1, 264, 360, 3707), + (8198, 1, 294, 0, 110), + (8199, 1, 294, 0, 120), + (8200, 1, 294, 0, 130), + (8201, 1, 218, 1, 0), + (8202, 1, 218, 2, 0), + (8203, 1, 218, 3, 0), + (8204, 1, 127, 10, 0), + (8204, 2, 137, 154, 0), + (8204, 3, 403, 2, 0), + (8204, 4, 404, 10, 0), + (8205, 1, 127, 20, 0), + (8205, 2, 137, 154, 0), + (8205, 3, 403, 2, 0), + (8205, 4, 404, 10, 0), + (8206, 1, 127, 30, 0), + (8206, 2, 137, 154, 0), + (8206, 3, 403, 2, 0), + (8206, 4, 404, 10, 0), + (8207, 1, 127, 10, 0), + (8207, 2, 137, 154, 0), + (8207, 3, 403, 2, 0), + (8207, 4, 404, 10, 0), + (8208, 1, 127, 20, 0), + (8208, 2, 137, 154, 0), + (8208, 3, 403, 2, 0), + (8208, 4, 404, 10, 0), + (8209, 1, 127, 30, 0), + (8209, 2, 137, 154, 0), + (8209, 3, 403, 2, 0), + (8209, 4, 404, 10, 0), + (8210, 1, 97, 50, 0), + (8211, 1, 97, 100, 0), + (8212, 1, 97, 150, 0), + (8213, 1, 97, 200, 0), + (8214, 1, 97, 250, 0), + (8215, 1, 190, 50, 0), + (8216, 1, 190, 100, 0), + (8217, 1, 190, 150, 0), + (8218, 1, 190, 200, 0), + (8219, 1, 190, 250, 0), + (8223, 1, 128, 50, 50), + (8223, 2, 138, 1, 0), + (8223, 3, 140, 1, 0), + (8223, 4, 139, -2741, 0), + (8223, 5, 139, -16843, 0), + (8223, 6, 385, -16192, 0), + (8224, 1, 339, 10, 16230), + (8224, 2, 138, 1, 0), + (8224, 3, 141, 1, 0), + (8224, 4, 142, 60, 0), + (8224, 5, 137, 0, 0), + (8224, 6, 311, 0, 0), + (8224, 7, 134, 80, 0), + (8224, 8, 139, -265, 0), + (8224, 9, 139, -754, 0), + (8224, 10, 139, -1332, 0), + (8224, 11, 139, -1572, 0), + (8224, 12, 139, -2749, 0), + (8224, 13, 139, -4979, 0), + (8224, 14, 139, -5418, 0), + (8224, 15, 139, -5403, 0), + (8225, 1, 339, 10, 16231), + (8225, 2, 138, 1, 0), + (8225, 3, 141, 1, 0), + (8225, 4, 142, 65, 0), + (8225, 5, 137, 0, 0), + (8225, 6, 311, 0, 0), + (8225, 7, 134, 85, 0), + (8225, 8, 139, -265, 0), + (8225, 9, 139, -754, 0), + (8225, 10, 139, -1332, 0), + (8225, 11, 139, -1572, 0), + (8225, 12, 139, -2749, 0), + (8225, 13, 139, -4979, 0), + (8225, 14, 139, -5418, 0), + (8225, 15, 139, -5403, 0), + (8226, 1, 339, 10, 16232), + (8226, 2, 138, 1, 0), + (8226, 3, 141, 1, 0), + (8226, 4, 142, 70, 0), + (8226, 5, 137, 0, 0), + (8226, 6, 311, 0, 0), + (8226, 7, 134, 90, 0), + (8226, 8, 139, -265, 0), + (8226, 9, 139, -754, 0), + (8226, 10, 139, -1332, 0), + (8226, 11, 139, -1572, 0), + (8226, 12, 139, -2749, 0), + (8226, 13, 139, -4979, 0), + (8226, 14, 139, -5418, 0), + (8226, 15, 139, -5403, 0), + (8228, 1, 378, 5, 22), + (8229, 1, 378, 10, 22), + (8230, 1, 378, 15, 22), + (8232, 1, 128, 5, 5), + (8232, 2, 138, 1, 0), + (8232, 3, 140, 1, 0), + (8232, 4, 311, 0, 0), + (8232, 5, 411, 66434, 0), + (8232, 6, 137, -40, 0), + (8233, 1, 128, 15, 15), + (8233, 2, 138, 1, 0), + (8233, 3, 140, 1, 0), + (8233, 4, 311, 0, 0), + (8233, 5, 411, 66434, 0), + (8233, 6, 137, -40, 0), + (8234, 1, 128, 30, 30), + (8234, 2, 138, 1, 0), + (8234, 3, 140, 1, 0), + (8234, 4, 311, 0, 0), + (8234, 5, 411, 66434, 0), + (8234, 6, 137, -40, 0), + (8235, 1, 1, 29, 0), + (8236, 1, 1, 58, 0), + (8237, 1, 1, 87, 0), + (8238, 1, 1, 116, 0), + (8239, 1, 1, 145, 0), + (8240, 1, 1, 31, 0), + (8241, 1, 1, 62, 0), + (8242, 1, 1, 93, 0), + (8243, 1, 1, 124, 0), + (8244, 1, 1, 155, 0), + (8245, 1, 1, 33, 0), + (8246, 1, 1, 66, 0), + (8247, 1, 1, 99, 0), + (8248, 1, 1, 132, 0), + (8249, 1, 1, 165, 0), + (8250, 1, 1, 40, 0), + (8251, 1, 1, 80, 0), + (8252, 1, 1, 120, 0), + (8253, 1, 1, 160, 0), + (8254, 1, 1, 200, 0), + (8255, 1, 1, 50, 0), + (8256, 1, 1, 100, 0), + (8257, 1, 1, 150, 0), + (8258, 1, 1, 200, 0), + (8259, 1, 1, 250, 0), + (8261, 1, 128, 65, 65), + (8261, 2, 138, 1, 0), + (8261, 3, 140, 1, 0), + (8261, 4, 311, 0, 0), + (8261, 5, 411, 66434, 0), + (8261, 6, 137, -40, 0), + (8262, 1, 128, 70, 70), + (8262, 2, 138, 1, 0), + (8262, 3, 140, 1, 0), + (8262, 4, 139, -2741, 0), + (8262, 5, 139, -16843, 0), + (8262, 6, 385, -16192, 0), + (8263, 1, 262, 5, 0), + (8264, 1, 262, 10, 0), + (8265, 1, 262, 15, 0), + (8266, 1, 262, 20, 0), + (8267, 1, 262, 25, 0), + (8268, 1, 262, 5, 1), + (8269, 1, 262, 10, 1), + (8270, 1, 262, 15, 1), + (8271, 1, 262, 20, 1), + (8272, 1, 262, 25, 1), + (8273, 1, 262, 5, 2), + (8274, 1, 262, 10, 2), + (8275, 1, 262, 15, 2), + (8276, 1, 262, 20, 2), + (8277, 1, 262, 25, 2), + (8278, 1, 262, 5, 3), + (8279, 1, 262, 10, 3), + (8280, 1, 262, 15, 3), + (8281, 1, 262, 20, 3), + (8282, 1, 262, 25, 3), + (8283, 1, 262, 5, 4), + (8284, 1, 262, 10, 4), + (8285, 1, 262, 15, 4), + (8286, 1, 262, 20, 4), + (8287, 1, 262, 25, 4), + (8288, 1, 262, 5, 5), + (8289, 1, 262, 10, 5), + (8290, 1, 262, 15, 5), + (8291, 1, 262, 20, 5), + (8292, 1, 262, 25, 5), + (8293, 1, 262, 5, 6), + (8294, 1, 262, 10, 6), + (8295, 1, 262, 15, 6), + (8296, 1, 262, 20, 6), + (8297, 1, 262, 25, 6), + (8304, 1, 1, 174, 0), + (8305, 1, 1, 203, 0), + (8306, 1, 1, 232, 0), + (8307, 1, 1, 261, 0), + (8308, 1, 1, 290, 0), + (8313, 1, 128, 65, 65), + (8313, 2, 138, 1, 0), + (8313, 3, 140, 1, 0), + (8313, 4, 311, 0, 0), + (8313, 5, 411, 256, 0), + (8313, 6, 137, -40, 0), + (8313, 7, 391, 1, 0), + (8314, 1, 378, 2, 3), + (8315, 1, 378, 3, 3), + (8316, 1, 378, 4, 3), + (8317, 1, 264, 1, 8205), + (8318, 1, 264, 2, 8205), + (8319, 1, 264, 2, 199), + (8320, 1, 264, 4, 199), + (8321, 1, 264, 6, 199), + (8322, 1, 378, 15, 31), + (8323, 1, 378, 20, 31), + (8324, 1, 378, 25, 31), + (8325, 1, 114, -3, 0), + (8326, 1, 114, -6, 0), + (8327, 1, 114, -9, 0), + (8328, 1, 268, 75, 56), + (8328, 2, 234, 1000, 0), + (8329, 1, 227, 4, 29), + (8329, 2, 227, 4, 42), + (8331, 1, 413, 10, 0), + (8331, 2, 139, 8001, 0), + (8331, 3, 385, 12529, 0), + (8331, 4, 411, 512, 0), + (8332, 1, 287, 1, 0), + (8332, 2, 385, 116121, 0), + (8333, 1, 287, 2, 0), + (8333, 2, 385, 116121, 0), + (8334, 1, 287, 3, 0), + (8334, 2, 385, 116121, 0), + (8335, 1, 127, 10, 0), + (8335, 2, 385, 16188, 0), + (8336, 1, 127, 20, 0), + (8336, 2, 385, 16188, 0), + (8337, 1, 127, 30, 0), + (8337, 2, 385, 16188, 0), + (8338, 1, 127, 40, 0), + (8338, 2, 385, 16188, 0), + (8339, 1, 127, 50, 0), + (8339, 2, 385, 16188, 0), + (8344, 1, 294, 0, 175), + (8345, 1, 294, 0, 180), + (8346, 1, 294, 0, 185), + (8347, 1, 264, 600, 616), + (8348, 1, 264, 1200, 616), + (8349, 1, 264, 1800, 616), + (8350, 1, 310, 1200, 0), + (8350, 2, 385, 6212, 0), + (8350, 3, 310, 600, 0), + (8350, 4, 385, 6215, 0), + (8350, 5, 310, 150, 0), + (8350, 6, 385, 6218, 0), + (8350, 7, 310, 9000, 0), + (8350, 8, 385, 6232, 0), + (8350, 9, 310, 600, 0), + (8350, 10, 385, 6243, 0), + (8350, 11, 310, 150, 0), + (8350, 12, 385, 6245, 0), + (8350, 13, 310, 1200, 0), + (8350, 14, 385, 6412, 0), + (8350, 15, 310, 600, 0), + (8350, 16, 385, 6415, 0), + (8350, 17, 310, 150, 0), + (8350, 18, 385, 6418, 0), + (8350, 19, 310, 9000, 0), + (8350, 20, 385, 6432, 0), + (8350, 21, 310, 600, 0), + (8350, 22, 385, 6443, 0), + (8350, 23, 310, 150, 0), + (8350, 24, 385, 6445, 0), + (8351, 1, 262, 30, 0), + (8352, 1, 262, 35, 0), + (8353, 1, 262, 40, 0), + (8354, 1, 262, 45, 0), + (8355, 1, 262, 50, 0), + (8356, 1, 262, 55, 0), + (8357, 1, 262, 60, 0), + (8358, 1, 262, 65, 0), + (8359, 1, 262, 70, 0), + (8360, 1, 262, 75, 0), + (8361, 1, 262, 30, 1), + (8362, 1, 262, 35, 1), + (8363, 1, 262, 40, 1), + (8364, 1, 262, 45, 1), + (8365, 1, 262, 50, 1), + (8366, 1, 262, 55, 1), + (8367, 1, 262, 60, 1), + (8368, 1, 262, 65, 1), + (8369, 1, 262, 70, 1), + (8370, 1, 262, 75, 1), + (8371, 1, 262, 30, 2), + (8372, 1, 262, 35, 2), + (8373, 1, 262, 40, 2), + (8374, 1, 262, 45, 2), + (8375, 1, 262, 50, 2), + (8376, 1, 262, 55, 2), + (8377, 1, 262, 60, 2), + (8378, 1, 262, 65, 2), + (8379, 1, 262, 70, 2), + (8380, 1, 262, 75, 2), + (8381, 1, 262, 30, 3), + (8382, 1, 262, 35, 3), + (8383, 1, 262, 40, 3), + (8384, 1, 262, 45, 3), + (8385, 1, 262, 50, 3), + (8386, 1, 262, 55, 3), + (8387, 1, 262, 60, 3), + (8388, 1, 262, 65, 3), + (8389, 1, 262, 70, 3), + (8390, 1, 262, 75, 3), + (8391, 1, 262, 30, 4), + (8392, 1, 262, 35, 4), + (8393, 1, 262, 40, 4), + (8394, 1, 262, 45, 4), + (8395, 1, 262, 50, 4), + (8396, 1, 262, 55, 4), + (8397, 1, 262, 60, 4), + (8398, 1, 262, 65, 4), + (8399, 1, 262, 70, 4), + (8400, 1, 262, 75, 4), + (8401, 1, 262, 30, 5), + (8402, 1, 262, 35, 5), + (8403, 1, 262, 40, 5), + (8404, 1, 262, 45, 5), + (8405, 1, 262, 50, 5), + (8406, 1, 262, 55, 5), + (8407, 1, 262, 60, 5), + (8408, 1, 262, 65, 5), + (8409, 1, 262, 70, 5), + (8410, 1, 262, 75, 5), + (8411, 1, 262, 30, 6), + (8412, 1, 262, 35, 6), + (8413, 1, 262, 40, 6), + (8414, 1, 262, 45, 6), + (8415, 1, 262, 50, 6), + (8416, 1, 262, 55, 6), + (8417, 1, 262, 60, 6), + (8418, 1, 262, 65, 6), + (8419, 1, 262, 70, 6), + (8420, 1, 262, 75, 6), + (8421, 1, 339, 10, 27535), + (8421, 2, 138, 1, 0), + (8421, 3, 141, 1, 0), + (8421, 4, 142, 75, 0), + (8421, 5, 137, 0, 0), + (8421, 6, 311, 0, 0), + (8421, 7, 134, 95, 0), + (8421, 8, 139, -265, 0), + (8421, 9, 139, -754, 0), + (8421, 10, 139, -1332, 0), + (8421, 11, 139, -1572, 0), + (8421, 12, 139, -2749, 0), + (8421, 13, 139, -4979, 0), + (8421, 14, 139, -5418, 0), + (8421, 15, 139, -5403, 0), + (8422, 1, 1, 198, 0), + (8423, 1, 1, 231, 0), + (8424, 1, 1, 264, 0), + (8425, 1, 1, 297, 0), + (8426, 1, 1, 330, 0), + (8427, 1, 264, 1260, 254), + (8428, 1, 264, 1440, 254), + (8429, 1, 264, 1620, 254), + (8430, 1, 328, 1600, 0), + (8435, 1, 0, 35, 0), + (8440, 1, 259, 66, 0), + (8445, 1, 426, 3, 0), + (8446, 1, 426, 4, 0), + (8447, 1, 426, 5, 0), + (8448, 1, 69, 2200, 0), + (8463, 1, 172, 60, 0), + (8464, 1, 172, 61, 0), + (8470, 1, 262, 80, 7), + (8470, 2, 262, 80, 8), + (8470, 3, 262, 80, 9), + (8470, 4, 262, 80, 10), + (8470, 5, 262, 80, 11), + (9001, 1, 247, 10, 58), + (9002, 1, 247, 20, 58), + (9003, 1, 247, 30, 58), + (9004, 1, 247, 40, 58), + (9005, 1, 247, 50, 58), + (9006, 1, 247, 60, 58), + (9007, 1, 247, 70, 58), + (9008, 1, 247, 80, 58), + (9009, 1, 247, 90, 58), + (9010, 1, 247, 100, 58), + (9011, 1, 247, 10, 58), + (9012, 1, 247, 20, 58), + (9013, 1, 247, 30, 58), + (9014, 1, 247, 40, 58), + (9015, 1, 247, 50, 58), + (9016, 1, 247, 60, 58), + (9017, 1, 247, 70, 58), + (9018, 1, 247, 80, 58), + (9019, 1, 247, 90, 58), + (9020, 1, 247, 100, 58), + (9021, 1, 247, 10, 58), + (9022, 1, 247, 20, 58), + (9023, 1, 247, 30, 58), + (9024, 1, 247, 40, 58), + (9025, 1, 247, 50, 58), + (9026, 1, 247, 60, 58), + (9027, 1, 247, 70, 58), + (9028, 1, 247, 80, 58), + (9029, 1, 247, 90, 58), + (9030, 1, 247, 100, 58), + (9033, 1, 264, 18000, 481), + (9033, 2, 264, 18000, 482), + (9033, 3, 264, 18000, 483), + (9033, 4, 264, 147600, 484), + (9033, 5, 264, 18000, 485), + (9033, 6, 264, 61200, 486), + (9033, 7, 264, 3600, 487), + (9033, 8, 264, 1080, 511), + (9033, 9, 264, 18000, 182), + (9033, 10, 264, 18000, 8081), + (9033, 11, 264, 18000, 8130), + (9033, 12, 264, 18000, 453), + (9033, 13, 264, 18000, 2000), + (9100, 1, 97, 10, 0), + (9100, 2, 262, 1, 5), + (9101, 1, 97, 20, 0), + (9101, 2, 262, 2, 5), + (9102, 1, 97, 30, 0), + (9102, 2, 262, 3, 5), + (9103, 1, 97, 40, 0), + (9103, 2, 262, 4, 5), + (9104, 1, 97, 50, 0), + (9104, 2, 262, 5, 5), + (9105, 1, 97, 60, 0), + (9105, 2, 262, 6, 5), + (9106, 1, 97, 70, 0), + (9106, 2, 262, 7, 5), + (9107, 1, 97, 80, 0), + (9107, 2, 262, 8, 5), + (9108, 1, 97, 90, 0), + (9108, 2, 262, 9, 5), + (9109, 1, 69, 10, 0), + (9109, 2, 262, 1, 1), + (9110, 1, 69, 20, 0), + (9110, 2, 262, 2, 1), + (9111, 1, 69, 30, 0), + (9111, 2, 262, 3, 1), + (9112, 1, 69, 40, 0), + (9112, 2, 262, 4, 1), + (9113, 1, 69, 50, 0), + (9113, 2, 262, 5, 1), + (9114, 1, 69, 60, 0), + (9114, 2, 262, 6, 1), + (9115, 1, 69, 70, 0), + (9115, 2, 262, 7, 1), + (9116, 1, 69, 80, 0), + (9116, 2, 262, 8, 1), + (9117, 1, 69, 90, 0), + (9117, 2, 262, 9, 1), + (9118, 1, 97, 10, 0), + (9118, 2, 262, 1, 5), + (9119, 1, 97, 20, 0), + (9119, 2, 262, 2, 5), + (9120, 1, 97, 30, 0), + (9120, 2, 262, 3, 5), + (9121, 1, 97, 40, 0), + (9121, 2, 262, 4, 5), + (9122, 1, 97, 50, 0), + (9122, 2, 262, 5, 5), + (9123, 1, 97, 60, 0), + (9123, 2, 262, 6, 5), + (9124, 1, 97, 70, 0), + (9124, 2, 262, 7, 5), + (9125, 1, 97, 80, 0), + (9125, 2, 262, 8, 5), + (9126, 1, 97, 90, 0), + (9126, 2, 262, 9, 5), + (9127, 1, 69, 10, 0), + (9127, 2, 262, 1, 5), + (9128, 1, 69, 20, 0), + (9128, 2, 262, 2, 5), + (9129, 1, 69, 30, 0), + (9129, 2, 262, 3, 5), + (9130, 1, 69, 40, 0), + (9130, 2, 262, 4, 5), + (9131, 1, 69, 50, 0), + (9131, 2, 262, 5, 5), + (9132, 1, 69, 60, 0), + (9132, 2, 262, 6, 5), + (9133, 1, 69, 70, 0), + (9133, 2, 262, 7, 5), + (9134, 1, 69, 80, 0), + (9134, 2, 262, 8, 5), + (9135, 1, 69, 90, 0), + (9135, 2, 262, 9, 5), + (9136, 1, 97, 10, 0), + (9136, 2, 262, 1, 4), + (9137, 1, 97, 20, 0), + (9137, 2, 262, 2, 4), + (9138, 1, 97, 30, 0), + (9138, 2, 262, 3, 4), + (9139, 1, 97, 40, 0), + (9139, 2, 262, 4, 4), + (9140, 1, 97, 50, 0), + (9140, 2, 262, 5, 4), + (9141, 1, 97, 60, 0), + (9141, 2, 262, 6, 4), + (9142, 1, 97, 70, 0), + (9142, 2, 262, 7, 4), + (9143, 1, 97, 80, 0), + (9143, 2, 262, 8, 4), + (9144, 1, 97, 90, 0), + (9144, 2, 262, 9, 4), + (9145, 1, 97, 10, 0), + (9145, 2, 262, 1, 4), + (9146, 1, 97, 20, 0), + (9146, 2, 262, 2, 4), + (9147, 1, 97, 30, 0), + (9147, 2, 262, 3, 4), + (9148, 1, 97, 40, 0), + (9148, 2, 262, 4, 4), + (9149, 1, 97, 50, 0), + (9149, 2, 262, 5, 4), + (9150, 1, 97, 60, 0), + (9150, 2, 262, 6, 4), + (9151, 1, 97, 70, 0), + (9151, 2, 262, 7, 4), + (9152, 1, 97, 80, 0), + (9152, 2, 262, 8, 4), + (9153, 1, 97, 90, 0), + (9153, 2, 262, 9, 4), + (9154, 1, 69, 10, 0), + (9154, 2, 262, 1, 1), + (9155, 1, 69, 20, 0), + (9155, 2, 262, 2, 1), + (9156, 1, 69, 30, 0), + (9156, 2, 262, 3, 1), + (9157, 1, 69, 40, 0), + (9157, 2, 262, 4, 1), + (9158, 1, 69, 50, 0), + (9158, 2, 262, 5, 1), + (9159, 1, 69, 60, 0), + (9159, 2, 262, 6, 1), + (9160, 1, 69, 70, 0), + (9160, 2, 262, 7, 1), + (9161, 1, 69, 80, 0), + (9161, 2, 262, 8, 1), + (9162, 1, 69, 90, 0), + (9162, 2, 262, 9, 1), + (9163, 1, 69, 10, 0), + (9163, 2, 262, 1, 3), + (9164, 1, 69, 20, 0), + (9164, 2, 262, 2, 3), + (9165, 1, 69, 30, 0), + (9165, 2, 262, 3, 3), + (9166, 1, 69, 40, 0), + (9166, 2, 262, 4, 3), + (9167, 1, 69, 50, 0), + (9167, 2, 262, 5, 3), + (9168, 1, 69, 60, 0), + (9168, 2, 262, 6, 3), + (9169, 1, 69, 70, 0), + (9169, 2, 262, 7, 3), + (9170, 1, 69, 80, 0), + (9170, 2, 262, 8, 3), + (9171, 1, 69, 90, 0), + (9171, 2, 262, 9, 3), + (9172, 1, 69, 10, 0), + (9172, 2, 262, 1, 0), + (9173, 1, 69, 20, 0), + (9173, 2, 262, 2, 0), + (9174, 1, 69, 30, 0), + (9174, 2, 262, 3, 0), + (9175, 1, 69, 40, 0), + (9175, 2, 262, 4, 0), + (9176, 1, 69, 50, 0), + (9176, 2, 262, 5, 0), + (9177, 1, 69, 60, 0), + (9177, 2, 262, 6, 0), + (9178, 1, 69, 70, 0), + (9178, 2, 262, 7, 0), + (9179, 1, 69, 80, 0), + (9179, 2, 262, 8, 0), + (9180, 1, 69, 90, 0), + (9180, 2, 262, 9, 0), + (9181, 1, 69, 10, 0), + (9181, 2, 262, 1, 0), + (9182, 1, 69, 20, 0), + (9182, 2, 262, 2, 0), + (9183, 1, 69, 30, 0), + (9183, 2, 262, 3, 0), + (9184, 1, 69, 40, 0), + (9184, 2, 262, 4, 0), + (9185, 1, 69, 50, 0), + (9185, 2, 262, 5, 0), + (9186, 1, 69, 60, 0), + (9186, 2, 262, 6, 0), + (9187, 1, 69, 70, 0), + (9187, 2, 262, 7, 0), + (9188, 1, 69, 80, 0), + (9188, 2, 262, 8, 0), + (9189, 1, 69, 90, 0), + (9189, 2, 262, 9, 0), + (9190, 1, 69, 10, 0), + (9190, 2, 262, 1, 0), + (9191, 1, 69, 20, 0), + (9191, 2, 262, 2, 0), + (9192, 1, 69, 30, 0), + (9192, 2, 262, 3, 0), + (9193, 1, 69, 40, 0), + (9193, 2, 262, 4, 0), + (9194, 1, 69, 50, 0), + (9194, 2, 262, 5, 0), + (9195, 1, 69, 60, 0), + (9195, 2, 262, 6, 0), + (9196, 1, 69, 70, 0), + (9196, 2, 262, 7, 0), + (9197, 1, 69, 80, 0), + (9197, 2, 262, 8, 0), + (9198, 1, 69, 90, 0), + (9198, 2, 262, 9, 0), + (9199, 1, 97, 10, 0), + (9199, 2, 262, 1, 0), + (9200, 1, 97, 20, 0), + (9200, 2, 262, 2, 0), + (9201, 1, 97, 30, 0), + (9201, 2, 262, 3, 0), + (9202, 1, 97, 40, 0), + (9202, 2, 262, 4, 0), + (9203, 1, 97, 50, 0), + (9203, 2, 262, 5, 0), + (9204, 1, 97, 60, 0), + (9204, 2, 262, 6, 0), + (9205, 1, 97, 70, 0), + (9205, 2, 262, 7, 0), + (9206, 1, 97, 80, 0), + (9206, 2, 262, 8, 0), + (9207, 1, 97, 90, 0), + (9207, 2, 262, 9, 0), + (9208, 1, 69, 10, 0), + (9208, 2, 262, 1, 0), + (9209, 1, 69, 20, 0), + (9209, 2, 262, 2, 0), + (9210, 1, 69, 30, 0), + (9210, 2, 262, 3, 0), + (9211, 1, 69, 40, 0), + (9211, 2, 262, 4, 0), + (9212, 1, 69, 50, 0), + (9212, 2, 262, 5, 0), + (9213, 1, 69, 60, 0), + (9213, 2, 262, 6, 0), + (9214, 1, 69, 70, 0), + (9214, 2, 262, 7, 0), + (9215, 1, 69, 80, 0), + (9215, 2, 262, 8, 0), + (9216, 1, 69, 90, 0), + (9216, 2, 262, 9, 0), + (9217, 1, 190, 10, 0), + (9217, 2, 262, 1, 0), + (9218, 1, 190, 20, 0), + (9218, 2, 262, 2, 0), + (9219, 1, 190, 30, 0), + (9219, 2, 262, 3, 0), + (9220, 1, 190, 40, 0), + (9220, 2, 262, 4, 0), + (9221, 1, 190, 50, 0), + (9221, 2, 262, 5, 0), + (9222, 1, 190, 60, 0), + (9222, 2, 262, 6, 0), + (9223, 1, 190, 70, 0), + (9223, 2, 262, 7, 0), + (9224, 1, 190, 80, 0), + (9224, 2, 262, 8, 0), + (9225, 1, 190, 90, 0), + (9225, 2, 262, 9, 0), + (9226, 1, 69, 10, 0), + (9226, 2, 262, 1, 0), + (9227, 1, 69, 20, 0), + (9227, 2, 262, 2, 0), + (9228, 1, 69, 30, 0), + (9228, 2, 262, 3, 0), + (9229, 1, 69, 40, 0), + (9229, 2, 262, 4, 0), + (9230, 1, 69, 50, 0), + (9230, 2, 262, 5, 0), + (9231, 1, 69, 60, 0), + (9231, 2, 262, 6, 0), + (9232, 1, 69, 70, 0), + (9232, 2, 262, 7, 0), + (9233, 1, 69, 80, 0), + (9233, 2, 262, 8, 0), + (9234, 1, 69, 90, 0), + (9234, 2, 262, 9, 0), + (9235, 1, 190, 10, 0), + (9235, 2, 262, 1, 0), + (9236, 1, 190, 20, 0), + (9236, 2, 262, 2, 0), + (9237, 1, 190, 30, 0), + (9237, 2, 262, 3, 0), + (9238, 1, 190, 40, 0), + (9238, 2, 262, 4, 0), + (9239, 1, 190, 50, 0), + (9239, 2, 262, 5, 0), + (9240, 1, 190, 60, 0), + (9240, 2, 262, 6, 0), + (9241, 1, 190, 70, 0), + (9241, 2, 262, 7, 0), + (9242, 1, 190, 80, 0), + (9242, 2, 262, 8, 0), + (9243, 1, 190, 90, 0), + (9243, 2, 262, 9, 0), + (9503, 1, 397, 100, 0), + (9504, 1, 397, 200, 0), + (9505, 1, 397, 300, 0), + (9506, 1, 398, 1000, 0), + (9506, 2, 137, 152, 0), + (9507, 1, 398, 2000, 0), + (9507, 2, 137, 152, 0), + (9508, 1, 398, 3000, 0), + (9508, 2, 137, 152, 0), + (9509, 1, 399, 1, 0), + (9509, 2, 141, 1, 0), + (9509, 3, 138, 0, 0), + (9509, 4, 134, 254, 0), + (9509, 5, 348, 10, 0), + (9509, 6, 137, 0, 0), + (9509, 7, 311, 0, 0), + (9509, 8, 137, -152, 0), + (9509, 9, 137, -39, 0), + (9510, 1, 399, 2, 0), + (9510, 2, 141, 1, 0), + (9510, 3, 138, 0, 0), + (9510, 4, 134, 254, 0), + (9510, 5, 348, 10, 0), + (9510, 6, 137, 0, 0), + (9510, 7, 311, 0, 0), + (9510, 8, 137, -152, 0), + (9510, 9, 137, -39, 0), + (9511, 1, 399, 3, 0), + (9511, 2, 141, 1, 0), + (9511, 3, 138, 0, 0), + (9511, 4, 134, 254, 0), + (9511, 5, 348, 10, 0), + (9511, 6, 137, 0, 0), + (9511, 7, 311, 0, 0), + (9511, 8, 137, -152, 0), + (9511, 9, 137, -39, 0), + (9512, 1, 405, 1, 0), + (9513, 1, 405, 3, 0), + (9514, 1, 405, 5, 0), + (9515, 1, 399, 4, 0), + (9515, 2, 141, 1, 0), + (9515, 3, 138, 0, 0), + (9515, 4, 134, 254, 0), + (9515, 5, 348, 10, 0), + (9515, 6, 137, 0, 0), + (9515, 7, 311, 0, 0), + (9515, 8, 137, -152, 0), + (9515, 9, 137, -39, 0), + (10004, 1, 310, 480000, 0), + (10004, 2, 139, 4674, 0), + (10005, 1, 310, 600000, 0), + (10005, 2, 139, 4674, 0), + (10007, 1, 85, 16500, 50), + (10008, 1, 85, 16501, 50), + (10009, 1, 85, 16502, 50), + (10025, 1, 339, 25, 16517), + (10025, 2, 137, 21, 0), + (10026, 1, 339, 25, 16518), + (10026, 2, 137, 21, 0), + (10027, 1, 339, 25, 16519), + (10027, 2, 137, 21, 0), + (10028, 1, 339, 25, 16520), + (10028, 2, 137, 21, 0), + (10029, 1, 339, 25, 16555), + (10029, 2, 137, 21, 0), + (10030, 1, 264, 60, 558), + (10031, 1, 264, 75, 558), + (10032, 1, 264, 90, 558), + (10033, 1, 310, 8000, 0), + (10033, 2, 139, 8007, 0), + (10033, 3, 310, 8000, 0), + (10033, 4, 385, 4140, 0), + (10033, 5, 385, 4240, 0), + (10033, 6, 385, 4340, 0), + (10033, 7, 385, 4440, 0), + (10033, 8, 385, 4540, 0), + (10033, 9, 385, 4640, 0), + (10034, 1, 310, 10000, 0), + (10034, 2, 139, 8007, 0), + (10034, 3, 310, 10000, 0), + (10034, 4, 385, 4140, 0), + (10034, 5, 385, 4240, 0), + (10034, 6, 385, 4340, 0), + (10034, 7, 385, 4440, 0), + (10034, 8, 385, 4540, 0), + (10034, 9, 385, 4640, 0), + (10035, 1, 339, 25, 16556), + (10035, 2, 138, 1, 0), + (10035, 3, 142, 60, 0), + (10035, 4, 137, 35, 0), + (10035, 5, 134, 85, 0), + (10035, 6, 339, 25, 16556), + (10035, 7, 138, 1, 0), + (10035, 8, 142, 60, 0), + (10035, 9, 137, 36, 0), + (10035, 10, 134, 85, 0), + (10035, 11, 339, 25, 16556), + (10035, 12, 138, 1, 0), + (10035, 13, 142, 60, 0), + (10035, 14, 137, 369, 0), + (10035, 15, 134, 85, 0), + (10035, 16, 339, 25, 16556), + (10035, 17, 138, 1, 0), + (10035, 18, 142, 60, 0), + (10035, 19, 137, 116, 0), + (10035, 20, 134, 85, 0), + (10036, 1, 339, 25, 16557), + (10036, 2, 138, 1, 0), + (10036, 3, 142, 60, 0), + (10036, 4, 137, 35, 0), + (10036, 5, 134, 85, 0), + (10036, 6, 339, 25, 16557), + (10036, 7, 138, 1, 0), + (10036, 8, 142, 60, 0), + (10036, 9, 137, 36, 0), + (10036, 10, 134, 85, 0), + (10036, 11, 339, 25, 16557), + (10036, 12, 138, 1, 0), + (10036, 13, 142, 60, 0), + (10036, 14, 137, 369, 0), + (10036, 15, 134, 85, 0), + (10036, 16, 339, 25, 16557), + (10036, 17, 138, 1, 0), + (10036, 18, 142, 60, 0), + (10036, 19, 137, 116, 0), + (10036, 20, 134, 85, 0), + (10037, 1, 339, 25, 16558), + (10037, 2, 138, 1, 0), + (10037, 3, 142, 60, 0), + (10037, 4, 137, 35, 0), + (10037, 5, 134, 85, 0), + (10037, 6, 339, 25, 16558), + (10037, 7, 138, 1, 0), + (10037, 8, 142, 60, 0), + (10037, 9, 137, 36, 0), + (10037, 10, 134, 85, 0), + (10037, 11, 339, 25, 16558), + (10037, 12, 138, 1, 0), + (10037, 13, 142, 60, 0), + (10037, 14, 137, 369, 0), + (10037, 15, 134, 85, 0), + (10037, 16, 339, 25, 16558), + (10037, 17, 138, 1, 0), + (10037, 18, 142, 60, 0), + (10037, 19, 137, 116, 0), + (10037, 20, 134, 85, 0), + (10041, 1, 294, 0, 135), + (10042, 1, 294, 0, 145), + (10043, 1, 294, 0, 155), + (10044, 1, 339, 20, 16564), + (10044, 2, 137, 21, 0), + (10044, 3, 385, -18000, 0), + (10044, 4, 339, 20, 16564), + (10044, 5, 137, 343, 0), + (10044, 6, 385, -18000, 0), + (10045, 1, 339, 20, 16565), + (10045, 2, 137, 21, 0), + (10045, 3, 385, -18000, 0), + (10045, 4, 339, 20, 16565), + (10045, 5, 137, 343, 0), + (10045, 6, 385, -18000, 0), + (10046, 1, 339, 20, 16566), + (10046, 2, 137, 21, 0), + (10046, 3, 385, -18000, 0), + (10046, 4, 339, 20, 16566), + (10046, 5, 137, 343, 0), + (10046, 6, 385, -18000, 0), + (10050, 1, 85, 16567, 0), + (10051, 1, 85, 16568, 0), + (10052, 1, 85, 16569, 0), + (10058, 1, 330, 55, 7), + (10059, 1, 330, 60, 7), + (10060, 1, 330, 65, 7), + (10064, 1, 347, 25, 0), + (10065, 1, 347, 26, 0), + (10066, 1, 347, 27, 0), + (10067, 1, 347, 28, 0), + (10068, 1, 347, 29, 0), + (10069, 1, 347, 30, 0), + (10070, 1, 218, 6, 0), + (10071, 1, 218, 7, 0), + (10072, 1, 218, 8, 0), + (10073, 1, 218, 9, 0), + (10074, 1, 218, 10, 0), + (10075, 1, 339, 10, 16581), + (10075, 2, 138, 0, 0), + (10075, 3, 142, 70, 0), + (10075, 4, 403, 4, 0), + (10075, 5, 348, 1, 0), + (10075, 6, 404, 2, 0), + (10075, 7, 141, 1, 0), + (10076, 1, 339, 10, 16582), + (10076, 2, 138, 0, 0), + (10076, 3, 142, 70, 0), + (10076, 4, 403, 4, 0), + (10076, 5, 348, 1, 0), + (10076, 6, 404, 2, 0), + (10076, 7, 141, 1, 0), + (10077, 1, 339, 10, 16583), + (10077, 2, 138, 0, 0), + (10077, 3, 142, 70, 0), + (10077, 4, 403, 4, 0), + (10077, 5, 348, 1, 0), + (10077, 6, 404, 2, 0), + (10077, 7, 141, 1, 0), + (10081, 1, 85, 16584, 0), + (10082, 1, 85, 16585, 0), + (10083, 1, 85, 16586, 0), + (10084, 1, 375, 175, 0), + (10085, 1, 375, 200, 0), + (10086, 1, 375, 215, 0), + (10087, 1, 397, 400, 0), + (10088, 1, 397, 600, 0), + (10089, 1, 397, 800, 0), + (10105, 1, 264, 60, 170), + (10106, 1, 264, 70, 170), + (10107, 1, 264, 80, 170), + (10108, 1, 264, 90, 170), + (10109, 1, 264, 100, 170), + (10110, 1, 264, 480, 520), + (10111, 1, 264, 600, 520), + (10112, 1, 264, 720, 520), + (10122, 1, 227, 210, 32), + (10123, 1, 227, 240, 32), + (10124, 1, 283, 180, 0), + (10125, 1, 283, 200, 0), + (10126, 1, 283, 220, 0), + (10130, 1, 264, 720, 544), + (10131, 1, 264, 900, 544), + (10132, 1, 264, 1080, 544), + (10133, 1, 279, 19, 0), + (10134, 1, 279, 23, 0), + (10135, 1, 279, 27, 0), + (10136, 1, 375, 130, 0), + (10137, 1, 375, 135, 0), + (10138, 1, 375, 140, 0), + (10153, 1, 264, 420, 553), + (10154, 1, 264, 480, 553), + (10155, 1, 264, 540, 553), + (10165, 1, 220, 195, 8), + (10166, 1, 220, 225, 8), + (10167, 1, 220, 255, 8), + (10171, 1, 252, 90, 0), + (10172, 1, 252, 95, 0), + (10173, 1, 258, 70, 0), + (10174, 1, 258, 71, 0), + (10175, 1, 258, 72, 0), + (10176, 1, 264, 40, 171), + (10177, 1, 264, 50, 171), + (10178, 1, 264, 60, 171), + (10182, 1, 264, 180, 177), + (10183, 1, 264, 210, 177), + (10184, 1, 264, 240, 177), + (10185, 1, 264, 270, 177), + (10186, 1, 264, 300, 177), + (10203, 1, 264, 720, 524), + (10204, 1, 264, 900, 524), + (10205, 1, 264, 1080, 524), + (10206, 1, 264, 1080, 320), + (10207, 1, 264, 1260, 320), + (10213, 1, 218, 16, 0), + (10214, 1, 218, 17, 0), + (10215, 1, 218, 18, 0), + (10216, 1, 218, 19, 0), + (10217, 1, 218, 20, 0), + (10219, 1, 280, 63, 0), + (10220, 1, 280, 64, 0), + (10221, 1, 280, 65, 0), + (10222, 1, 280, 66, 0), + (10223, 1, 280, 67, 0), + (10227, 1, 360, 60, 16720), + (10228, 1, 360, 60, 16721), + (10229, 1, 360, 60, 16722), + (10249, 1, 264, 240, 208), + (10250, 1, 264, 300, 208), + (10251, 1, 264, 360, 208), + (10262, 1, 274, 23, 0), + (10263, 1, 274, 24, 0), + (10264, 1, 274, 25, 0), + (10265, 1, 280, 57, 0), + (10266, 1, 280, 58, 0), + (10267, 1, 280, 59, 0), + (10268, 1, 339, 45, 16736), + (10268, 2, 136, 11, 0), + (10268, 3, 383, 45, 16736), + (10268, 4, 385, 11012, 0), + (10268, 5, 383, 45, 16736), + (10268, 6, 385, 5130, 0), + (10268, 7, 383, 45, 16736), + (10268, 8, 385, 5230, 0), + (10268, 9, 383, 45, 16736), + (10268, 10, 136, 22, 0), + (10268, 11, 383, 45, 16736), + (10268, 12, 385, 5330, 0), + (10268, 13, 385, 5430, 0), + (10268, 14, 385, 5530, 0), + (10269, 1, 339, 45, 16737), + (10269, 2, 136, 11, 0), + (10269, 3, 383, 45, 16737), + (10269, 4, 385, 11012, 0), + (10269, 5, 383, 45, 16737), + (10269, 6, 385, 5130, 0), + (10269, 7, 383, 45, 16737), + (10269, 8, 385, 5230, 0), + (10269, 9, 383, 45, 16737), + (10269, 10, 136, 22, 0), + (10269, 11, 383, 45, 16737), + (10269, 12, 385, 5330, 0), + (10269, 13, 385, 5430, 0), + (10269, 14, 385, 5530, 0), + (10270, 1, 339, 45, 16738), + (10270, 2, 136, 11, 0), + (10270, 3, 383, 45, 16738), + (10270, 4, 385, 11012, 0), + (10270, 5, 383, 45, 16738), + (10270, 6, 385, 5130, 0), + (10270, 7, 383, 45, 16738), + (10270, 8, 385, 5230, 0), + (10270, 9, 383, 45, 16738), + (10270, 10, 136, 22, 0), + (10270, 11, 383, 45, 16738), + (10270, 12, 385, 5330, 0), + (10270, 13, 385, 5430, 0), + (10270, 14, 385, 5530, 0), + (10282, 1, 264, 120, 791), + (10283, 1, 264, 150, 791), + (10284, 1, 264, 180, 791), + (10285, 1, 264, 720, 521), + (10286, 1, 264, 900, 521), + (10287, 1, 264, 1080, 521), + (10291, 1, 264, 15, 247), + (10291, 2, 264, 8, 986), + (10291, 3, 264, 8, 987), + (10291, 4, 264, 8, 988), + (10292, 1, 264, 18, 247), + (10292, 2, 264, 10, 986), + (10292, 3, 264, 10, 987), + (10292, 4, 264, 10, 988), + (10293, 1, 264, 21, 247), + (10293, 2, 264, 12, 986), + (10293, 3, 264, 12, 987), + (10293, 4, 264, 12, 988), + (10305, 1, 280, 68, 0), + (10306, 1, 280, 69, 0), + (10307, 1, 280, 70, 0), + (10311, 1, 220, 608, 74), + (10312, 1, 220, 640, 74), + (10313, 1, 220, 672, 74), + (10314, 1, 220, 704, 74), + (10315, 1, 220, 736, 74), + (10316, 1, 216, 160, 74), + (10317, 1, 216, 200, 74), + (10318, 1, 216, 240, 74), + (10329, 1, 264, 60, 3701), + (10332, 1, 287, 1, 0), + (10332, 2, 137, 22, 0), + (10332, 3, 411, 256, 0), + (10340, 1, 220, 100, 26), + (10341, 1, 220, 160, 26), + (10342, 1, 220, 235, 26), + (10343, 1, 264, 5, 469), + (10344, 1, 264, 10, 469), + (10345, 1, 264, 15, 469), + (10347, 1, 310, 12000, 0), + (10347, 2, 139, 8007, 0), + (10347, 3, 310, 12000, 0), + (10347, 4, 385, 4140, 0), + (10347, 5, 385, 4240, 0), + (10347, 6, 385, 4340, 0), + (10347, 7, 385, 4440, 0), + (10347, 8, 385, 4540, 0), + (10347, 9, 385, 4640, 0), + (10348, 1, 244, 60, 0), + (10349, 1, 244, 50, 0), + (10350, 1, 244, 40, 0), + (10355, 1, 124, 50, 50), + (10355, 2, 385, 19, 0), + (10355, 3, 144, 0, 0), + (10355, 4, 403, 3, 0), + (10355, 5, 404, 48, 0), + (10355, 6, 385, -21768, 0), + (10356, 1, 124, 100, 100), + (10356, 2, 385, 19, 0), + (10356, 3, 144, 0, 0), + (10356, 4, 403, 3, 0), + (10356, 5, 404, 48, 0), + (10356, 6, 385, -21768, 0), + (10357, 1, 124, 150, 150), + (10357, 2, 385, 19, 0), + (10357, 3, 144, 0, 0), + (10357, 4, 403, 3, 0), + (10357, 5, 404, 48, 0), + (10357, 6, 385, -21768, 0), + (10358, 1, 310, 10000, 0), + (10358, 2, 139, 1546, 0), + (10358, 3, 310, 10000, 0), + (10358, 4, 385, 4357, 0), + (10358, 5, 385, 4457, 0), + (10358, 6, 385, 4557, 0), + (10358, 7, 385, 4657, 0), + (10358, 8, 411, 4, 0), + (10359, 1, 310, 20000, 0), + (10359, 2, 139, 1546, 0), + (10359, 3, 310, 20000, 0), + (10359, 4, 385, 4357, 0), + (10359, 5, 385, 4457, 0), + (10359, 6, 385, 4557, 0), + (10359, 7, 385, 4657, 0), + (10359, 8, 411, 4, 0), + (10360, 1, 310, 30000, 0), + (10360, 2, 139, 1546, 0), + (10360, 3, 310, 30000, 0), + (10360, 4, 385, 4357, 0), + (10360, 5, 385, 4457, 0), + (10360, 6, 385, 4557, 0), + (10360, 7, 385, 4657, 0), + (10360, 8, 411, 4, 0), + (10361, 1, 232, 17, 4544), + (10362, 1, 232, 19, 4544), + (10363, 1, 232, 21, 4544), + (10364, 1, 413, -5, 0), + (10364, 2, 139, 480, 0), + (10364, 3, 385, 4352, 0), + (10364, 4, 385, 4452, 0), + (10365, 1, 413, -10, 0), + (10365, 2, 139, 480, 0), + (10365, 3, 385, 4352, 0), + (10365, 4, 385, 4452, 0), + (10366, 1, 413, -15, 0), + (10366, 2, 139, 480, 0), + (10366, 3, 385, 4352, 0), + (10366, 4, 385, 4452, 0), + (10370, 1, 114, -5, 0), + (10371, 1, 114, -10, 0), + (10372, 1, 114, -20, 0), + (10380, 1, 126, 5, 0), + (10380, 2, 134, 85, 0), + (10380, 3, 135, 4, 0), + (10380, 4, 135, 5, 0), + (10381, 1, 126, 10, 0), + (10381, 2, 134, 85, 0), + (10381, 3, 135, 4, 0), + (10381, 4, 135, 5, 0), + (10382, 1, 126, 15, 0), + (10382, 2, 134, 85, 0), + (10382, 3, 135, 4, 0), + (10382, 4, 135, 5, 0), + (10383, 1, 360, 25, 21770), + (10384, 1, 360, 25, 21771), + (10385, 1, 360, 25, 21772), + (10388, 1, 323, 21850, 0), + (10389, 1, 287, 5, 0), + (10389, 2, 385, 16107, 0), + (10389, 3, 411, 512, 0), + (10390, 1, 287, 10, 0), + (10390, 2, 385, 16107, 0), + (10390, 3, 411, 512, 0), + (10391, 1, 287, 15, 0), + (10391, 2, 385, 16107, 0), + (10391, 3, 411, 512, 0), + (10398, 1, 264, 120, 3701), + (10399, 1, 264, 180, 3701), + (10401, 1, 310, 30000, 0), + (10401, 2, 385, 3107, 0), + (10401, 3, 385, 3207, 0), + (10401, 4, 385, 3307, 0), + (10401, 5, 385, 3407, 0), + (10401, 6, 385, 3507, 0), + (10401, 7, 385, 3607, 0), + (10402, 1, 310, 60000, 0), + (10402, 2, 385, 3107, 0), + (10402, 3, 385, 3207, 0), + (10402, 4, 385, 3307, 0), + (10402, 5, 385, 3407, 0), + (10402, 6, 385, 3507, 0), + (10402, 7, 385, 3607, 0), + (10403, 1, 310, 90000, 0), + (10403, 2, 385, 3107, 0), + (10403, 3, 385, 3207, 0), + (10403, 4, 385, 3307, 0), + (10403, 5, 385, 3407, 0), + (10403, 6, 385, 3507, 0), + (10403, 7, 385, 3607, 0), + (10404, 1, 287, 1, 0), + (10404, 2, 139, 8003, 0), + (10405, 1, 310, 120000, 0), + (10405, 2, 139, 4590, 0), + (10406, 1, 310, 240000, 0), + (10406, 2, 139, 4590, 0), + (10407, 1, 310, 360000, 0), + (10407, 2, 139, 4590, 0), + (10408, 1, 310, 480000, 0), + (10408, 2, 139, 4590, 0), + (10409, 1, 310, 600000, 0), + (10409, 2, 139, 4590, 0), + (10410, 1, 247, 130, 76), + (10413, 1, 264, 60, 207), + (10414, 2, 264, 120, 207), + (10415, 3, 264, 180, 207), + (10416, 4, 264, 240, 207), + (10417, 5, 264, 300, 207), + (10431, 1, 264, 210, 791), + (10432, 1, 264, 240, 791), + (10433, 1, 264, 270, 791), + (10434, 1, 127, 16, 0), + (10434, 2, 385, 5921, 0), + (10435, 1, 127, 33, 0), + (10435, 2, 385, 5921, 0), + (10436, 1, 127, 50, 0), + (10436, 2, 385, 5921, 0), + (10437, 1, 339, 25, 23523), + (10437, 2, 137, 21, 0), + (10438, 1, 339, 25, 23524), + (10438, 2, 137, 21, 0), + (10439, 1, 339, 25, 23525), + (10439, 2, 137, 21, 0), + (10440, 1, 339, 25, 23526), + (10440, 2, 137, 21, 0), + (10442, 1, 413, -20, 0), + (10442, 2, 139, 480, 0), + (10442, 3, 385, 4352, 0), + (10442, 4, 385, 4452, 0), + (10443, 1, 413, -25, 0), + (10443, 2, 139, 480, 0), + (10443, 3, 385, 4352, 0), + (10443, 4, 385, 4452, 0), + (10453, 1, 126, 1, 1), + (10453, 2, 137, 21, 0), + (10453, 3, 231, 1, 0), + (10454, 1, 126, 2, 2), + (10454, 2, 137, 21, 0), + (10454, 3, 231, 2, 0), + (10455, 1, 126, 3, 3), + (10455, 2, 137, 21, 0), + (10455, 3, 231, 3, 0), + (10456, 1, 127, 15, 15), + (10456, 2, 139, 12786, 0), + (10457, 1, 127, 30, 30), + (10457, 2, 139, 12786, 0), + (10458, 1, 127, 50, 50), + (10458, 2, 139, 12786, 0), + (10459, 1, 310, 3000, 0), + (10459, 2, 139, 480, 0), + (10459, 3, 310, 3000, 0), + (10459, 4, 385, 4352, 0), + (10459, 5, 385, 4452, 0), + (10459, 6, 385, 4552, 0), + (10460, 1, 310, 6000, 0), + (10460, 2, 139, 480, 0), + (10460, 3, 310, 6000, 0), + (10460, 4, 385, 4352, 0), + (10460, 5, 385, 4452, 0), + (10460, 6, 385, 4552, 0), + (10461, 1, 310, 10000, 0), + (10461, 2, 139, 480, 0), + (10461, 3, 310, 10000, 0), + (10461, 4, 385, 4352, 0), + (10461, 5, 385, 4452, 0), + (10461, 6, 385, 4552, 0), + (10464, 1, 264, 120, 391), + (10465, 1, 264, 240, 391), + (10466, 1, 264, 360, 391), + (10467, 1, 128, 70, 70), + (10467, 2, 138, 1, 0), + (10467, 3, 140, 1, 0), + (10467, 4, 139, -2741, 0), + (10467, 5, 139, -16843, 0), + (10467, 6, 385, -16192, 0), + (10467, 7, 385, -10547, 0), + (10467, 8, 385, -13543, 0), + (10470, 1, 127, 10, 0), + (10470, 2, 385, 8048, 0), + (10471, 1, 127, 20, 0), + (10471, 2, 385, 8048, 0), + (10472, 1, 127, 30, 0), + (10472, 2, 385, 8048, 0), + (10473, 1, 265, 82, 0), + (10474, 1, 265, 83, 0), + (10475, 1, 265, 84, 0), + (10476, 1, 265, 85, 0), + (10477, 1, 265, 86, 0), + (10478, 1, 360, 3, 46246), + (10511, 1, 264, 60, 185), + (10511, 2, 264, 60, 10426), + (10512, 1, 264, 120, 185), + (10512, 2, 264, 120, 10426), + (10513, 1, 264, 180, 185), + (10513, 2, 264, 180, 10426), + (10514, 1, 264, 60, 519), + (10514, 2, 264, 60, 10427), + (10515, 1, 264, 180, 519), + (10515, 2, 264, 180, 10427), + (10516, 1, 264, 120, 519), + (10516, 2, 264, 120, 10427), + (10519, 1, 264, 60, 3213), + (10522, 1, 264, 2, 3732), + (10527, 1, 264, 30, 1400), + (10532, 1, 264, 30, 1401), + (10537, 1, 264, 30, 1402), + (10548, 1, 349, 10, 0), + (10548, 2, 200, 10, 0), + (10548, 3, 419, 27672, 20), + (10551, 1, 339, 10, 16825), + (10551, 2, 137, 31, 0), + (10552, 1, 339, 10, 16826), + (10552, 2, 137, 31, 0), + (10553, 1, 339, 10, 16827), + (10553, 2, 137, 31, 0), + (10554, 1, 339, 12, 8265), + (10554, 2, 138, 0, 0), + (10554, 3, 137, 31, 0), + (10554, 4, 311, 0, 0), + (10555, 1, 339, 14, 8265), + (10555, 2, 138, 0, 0), + (10555, 3, 137, 31, 0), + (10555, 4, 311, 0, 0), + (10556, 1, 339, 16, 8265), + (10556, 2, 138, 0, 0), + (10556, 3, 137, 31, 0), + (10556, 4, 311, 0, 0), + (10558, 1, 264, 60, 1120), + (10559, 1, 264, 120, 1120), + (10560, 1, 264, 180, 1120), + (10561, 1, 126, 5, 5), + (10561, 2, 139, 12576, 0), + (10561, 3, 126, 5, 5), + (10561, 4, 139, 12828, 0), + (10562, 1, 126, 10, 10), + (10562, 2, 139, 12576, 0), + (10562, 3, 126, 10, 10), + (10562, 4, 139, 12828, 0), + (10563, 1, 126, 15, 15), + (10563, 2, 139, 12576, 0), + (10563, 3, 126, 15, 15), + (10563, 4, 139, 12828, 0), + (10568, 1, 85, 23614, 50), + (10574, 1, 310, 720000, 0), + (10574, 2, 139, 4670, 0), + (10575, 1, 310, 720000, 0), + (10575, 2, 139, 4674, 0), + (10576, 1, 264, 420, 109), + (10579, 1, 264, 40, 3646), + (10580, 1, 264, 50, 3646), + (10588, 1, 264, 2, 601), + (10589, 1, 264, 4, 601), + (10590, 1, 264, 6, 601), + (10591, 1, 264, 8, 601), + (10592, 1, 264, 10, 601), + (10604, 1, 213, 13, 0), + (10605, 1, 213, 15, 0), + (10606, 1, 213, 17, 0), + (10607, 1, 215, 12, 0), + (10608, 1, 215, 14, 0), + (10609, 1, 215, 16, 0), + (10610, 1, 129, 25, 25), + (10610, 2, 385, 100265, 0), + (10611, 1, 129, 25, 25), + (10611, 2, 385, 100265, 0), + (10612, 1, 129, 25, 25), + (10612, 2, 385, 100265, 0), + (10621, 1, 264, 960, 180), + (10622, 1, 264, 1200, 180), + (10623, 1, 279, 19, 0), + (10624, 1, 279, 24, 0), + (10625, 1, 279, 30, 0), + (10627, 1, 224, 20, 74), + (10627, 2, 173, 1, 0), + (10628, 1, 224, 35, 74), + (10628, 2, 173, 2, 0), + (10629, 1, 224, 50, 74), + (10629, 2, 173, 3, 0), + (10632, 1, 265, 82, 0), + (10633, 1, 265, 83, 0), + (10634, 1, 265, 84, 0), + (10635, 1, 265, 85, 0), + (10636, 1, 265, 86, 0), + (10637, 1, 320, 12, 0), + (10638, 1, 320, 13, 0), + (10639, 1, 320, 14, 0), + (10641, 2, 385, 11064, 0), + (10643, 1, 124, 200, 200), + (10643, 2, 385, 19, 0), + (10643, 3, 144, 0, 0), + (10643, 4, 403, 3, 0), + (10643, 5, 404, 48, 0), + (10643, 6, 385, -21768, 0), + (10644, 1, 124, 250, 250), + (10644, 2, 385, 19, 0), + (10644, 3, 144, 0, 0), + (10644, 4, 403, 3, 0), + (10644, 5, 404, 48, 0), + (10644, 6, 385, -21768, 0), + (10645, 1, 124, 300, 300), + (10645, 2, 385, 19, 0), + (10645, 3, 144, 0, 0), + (10645, 4, 403, 3, 0), + (10645, 5, 404, 48, 0), + (10645, 6, 385, -21768, 0), + (10650, 1, 378, 1, 3), + (10651, 1, 378, 2, 3), + (10652, 1, 378, 3, 3), + (10653, 1, 310, 120000, 0), + (10653, 2, 139, 4502, 0), + (10653, 3, 139, 4509, 0), + (10654, 1, 310, 240000, 0), + (10654, 2, 139, 4502, 0), + (10654, 3, 139, 4509, 0), + (10655, 1, 310, 360000, 0), + (10655, 2, 139, 4502, 0), + (10655, 3, 139, 4509, 0), + (10656, 1, 287, 1, 0), + (10656, 2, 385, 15002, 0), + (10656, 3, 385, 15003, 0), + (10656, 4, 411, 128, 0), + (10657, 1, 264, 300, 276), + (10658, 1, 264, 600, 276), + (10659, 1, 264, 900, 276), + (10660, 1, 220, 175, 26), + (10660, 2, 220, 175, 30), + (10660, 3, 220, 175, 38), + (10661, 1, 220, 200, 26), + (10661, 2, 220, 200, 30), + (10661, 3, 220, 200, 38), + (10662, 1, 220, 225, 26), + (10662, 2, 220, 225, 30), + (10662, 3, 220, 225, 38), + (10663, 1, 220, 165, 21), + (10663, 2, 220, 165, 23), + (10663, 3, 220, 330, 52), + (10663, 4, 220, 165, 28), + (10664, 1, 220, 175, 21), + (10664, 2, 220, 175, 23), + (10664, 3, 220, 350, 52), + (10664, 4, 220, 175, 28), + (10665, 1, 220, 185, 21), + (10665, 2, 220, 185, 23), + (10665, 3, 220, 370, 52), + (10665, 4, 220, 185, 28), + (10666, 1, 264, 1200, 98), + (10667, 1, 264, 1320, 98), + (10668, 1, 264, 1440, 98), + (10671, 1, 310, 720000, 0), + (10671, 2, 139, 4590, 0), + (10672, 1, 310, 840000, 0), + (10672, 2, 139, 4590, 0), + (10673, 1, 310, 960000, 0), + (10673, 2, 139, 4590, 0), + (10674, 1, 310, 1080000, 0), + (10674, 2, 139, 4590, 0), + (10675, 1, 310, 1200000, 0), + (10675, 2, 139, 4590, 0), + (10676, 1, 339, 20, 23623), + (10676, 2, 137, 21, 0), + (10676, 3, 385, -18000, 0), + (10676, 4, 339, 20, 23623), + (10676, 5, 137, 343, 0), + (10676, 6, 385, -18000, 0), + (10677, 1, 339, 20, 23624), + (10677, 2, 137, 21, 0), + (10677, 3, 385, -18000, 0), + (10677, 4, 339, 20, 23624), + (10677, 5, 137, 343, 0), + (10677, 6, 385, -18000, 0), + (10678, 1, 339, 20, 23625), + (10678, 2, 137, 21, 0), + (10678, 3, 385, -18000, 0), + (10678, 4, 339, 20, 23625), + (10678, 5, 137, 343, 0), + (10678, 6, 385, -18000, 0), + (10685, 1, 266, 34, 0), + (10686, 1, 266, 39, 0), + (10687, 1, 266, 45, 0), + (10688, 1, 220, 125, 10), + (10689, 1, 220, 145, 10), + (10690, 1, 220, 165, 10), + (10691, 1, 220, 190, 10), + (10692, 1, 220, 220, 10), + (10705, 1, 85, 23542, 0), + (10706, 1, 85, 23543, 0), + (10707, 1, 85, 23544, 0), + (10714, 1, 264, 90, 873), + (10715, 1, 264, 180, 873), + (10717, 1, 264, 360, 184), + (10718, 1, 264, 450, 184), + (10719, 1, 264, 120, 872), + (10720, 1, 264, 240, 872), + (10721, 1, 264, 360, 872), + (10722, 1, 264, 120, 778), + (10723, 1, 264, 240, 778), + (10724, 1, 264, 360, 778), + (10725, 1, 264, 480, 778), + (10726, 1, 264, 600, 778), + (10727, 1, 264, 120, 2235), + (10728, 1, 264, 240, 2235), + (10730, 1, 264, 10, 870), + (10731, 1, 264, 20, 870), + (10733, 1, 264, 1, 219), + (10734, 1, 264, 2, 219), + (10735, 1, 264, 3, 219), + (10743, 1, 220, 135, 7), + (10744, 1, 220, 170, 7), + (10745, 1, 220, 205, 7), + (10748, 1, 59, -35, 0), + (10749, 1, 59, -42, 0), + (10750, 1, 264, 3024, 286), + (10750, 2, 264, 3024, 10753), + (10750, 3, 264, 3024, 9101), + (10751, 1, 264, 3456, 286), + (10751, 2, 264, 3456, 10753), + (10751, 3, 264, 3456, 9101), + (10755, 1, 59, -50, 0), + (10763, 1, 292, 50, 0), + (10764, 1, 292, 60, 0), + (10766, 1, 330, 70, 7), + (10767, 1, 330, 75, 7), + (10768, 1, 330, 80, 7), + (10769, 1, 310, 1440000, 0), + (10769, 2, 139, 4519, 0), + (10770, 1, 310, 1680000, 0), + (10770, 2, 139, 4519, 0), + (10778, 1, 274, 38, 0), + (10779, 1, 274, 40, 0), + (10780, 1, 274, 42, 0), + (10781, 1, 1, 186, 0), + (10782, 1, 1, 217, 0), + (10783, 1, 1, 248, 0), + (10784, 1, 1, 279, 0), + (10785, 1, 1, 310, 0), + (10788, 1, 363, 4, 0), + (10792, 1, 287, 1, 0), + (10792, 2, 385, 5240, 0), + (10792, 3, 385, 5340, 0), + (10792, 4, 385, 5440, 0), + (10792, 5, 385, 5540, 0), + (10792, 6, 385, 5640, 0), + (10793, 1, 287, 2, 0), + (10793, 2, 385, 5240, 0), + (10793, 3, 385, 5340, 0), + (10793, 4, 385, 5440, 0), + (10793, 5, 385, 5540, 0), + (10793, 6, 385, 5640, 0), + (10794, 1, 287, 3, 0), + (10794, 2, 385, 5240, 0), + (10794, 3, 385, 5340, 0), + (10794, 4, 385, 5440, 0), + (10794, 5, 385, 5540, 0), + (10794, 6, 385, 5640, 0), + (10795, 1, 287, 4, 0), + (10795, 2, 385, 5240, 0), + (10795, 3, 385, 5340, 0), + (10795, 4, 385, 5440, 0), + (10795, 5, 385, 5540, 0), + (10795, 6, 385, 5640, 0), + (10796, 1, 287, 5, 0), + (10796, 2, 385, 5240, 0), + (10796, 3, 385, 5340, 0), + (10796, 4, 385, 5440, 0), + (10796, 5, 385, 5540, 0), + (10796, 6, 385, 5640, 0), + (10800, 1, 264, 60, 462), + (10801, 1, 264, 120, 462), + (10802, 1, 264, 180, 462), + (10803, 1, 293, 25, 0), + (10804, 1, 293, 50, 0), + (10805, 1, 293, 75, 0), + (10815, 1, 185, 2, 1), + (10815, 2, 185, 2, 3), + (10816, 1, 185, 4, 1), + (10816, 2, 185, 4, 3), + (10817, 1, 185, 6, 1), + (10817, 2, 185, 6, 3), + (10818, 1, 185, 1, 36), + (10819, 1, 185, 3, 36), + (10820, 1, 185, 5, 36), + (10821, 1, 185, 2, 0), + (10821, 2, 185, 2, 2), + (10822, 1, 185, 4, 0), + (10822, 2, 185, 4, 2), + (10823, 1, 185, 6, 0), + (10823, 2, 185, 6, 2), + (10850, 1, 288, 100, 8), + (10851, 1, 288, 100, 8), + (10852, 1, 288, 100, 8), + (10853, 1, 292, 5, 0), + (10854, 1, 292, 10, 0), + (10855, 1, 292, 15, 0), + (10856, 1, 292, 20, 0), + (10857, 1, 292, 25, 0), + (10858, 1, 292, 30, 0), + (10859, 1, 292, 35, 0), + (10860, 1, 292, 40, 0), + (10861, 1, 292, 45, 0), + (10862, 1, 292, 46, 0), + (10863, 1, 292, 47, 0), + (10864, 1, 292, 48, 0), + (10865, 1, 216, 500, 8), + (10866, 1, 216, 550, 8), + (10867, 1, 216, 650, 8), + (10903, 1, 281, 25, 0), + (10904, 1, 281, 50, 0), + (10905, 1, 281, 75, 0), + (10906, 1, 59, -48, 0), + (10907, 1, 59, -51, 0), + (10908, 1, 59, -54, 0), + (10909, 1, 264, 60, 7007), + (10910, 1, 264, 120, 7007), + (10911, 1, 264, 180, 7007), + (10915, 1, 339, 10, 16876), + (10915, 2, 138, 0, 0), + (10915, 3, 142, 70, 0), + (10915, 4, 411, 32, 0), + (10915, 5, 348, 1, 0), + (10915, 6, 141, 1, 0), + (10916, 1, 339, 10, 16877), + (10916, 2, 138, 0, 0), + (10916, 3, 142, 70, 0), + (10916, 4, 411, 32, 0), + (10916, 5, 348, 1, 0), + (10916, 6, 141, 1, 0), + (10917, 1, 339, 10, 16878), + (10917, 2, 138, 0, 0), + (10917, 3, 142, 70, 0), + (10917, 4, 411, 32, 0), + (10917, 5, 348, 1, 0), + (10917, 6, 141, 1, 0), + (10950, 1, 287, 1, 0), + (10950, 2, 403, 4, 0), + (10950, 3, 404, 38, 0), + (10950, 4, 348, 1, 0), + (10950, 5, 137, 11, 0), + (10950, 6, 140, 2, 0), + (10951, 1, 264, 60, 447), + (10952, 1, 264, 120, 447), + (10953, 1, 264, 180, 447), + (10954, 1, 264, 60, 662), + (10955, 1, 264, 120, 662), + (10956, 1, 264, 180, 662), + (11000, 1, 227, 1, 73), + (11001, 1, 227, 2, 73), + (11002, 1, 227, 3, 73), + (11003, 1, 287, 1, 0), + (11003, 2, 137, 158, 0), + (11003, 3, 411, 2, 0), + (11004, 1, 287, 1, 0), + (11004, 2, 139, 8000, 0), + (11005, 1, 287, 2, 0), + (11005, 2, 139, 8000, 0), + (11006, 1, 287, 3, 0), + (11006, 2, 139, 8000, 0), + (11011, 1, 264, 480, 3710), + (11012, 1, 264, 600, 3710), + (11013, 1, 264, 720, 3710), + (11014, 1, 264, 10, 3899), + (11014, 2, 264, 10, 611), + (11014, 3, 264, 10, 960), + (11014, 4, 264, 10, 1252), + (11015, 1, 264, 20, 3899), + (11015, 2, 264, 20, 611), + (11015, 3, 264, 20, 960), + (11015, 4, 264, 20, 1252), + (11016, 1, 264, 30, 3899), + (11016, 2, 264, 30, 611), + (11016, 3, 264, 30, 960), + (11016, 4, 264, 30, 1252), + (11020, 1, 264, 40, 3899), + (11020, 2, 264, 40, 611), + (11020, 3, 264, 40, 960), + (11020, 4, 264, 40, 1252), + (11050, 1, 264, 360, 452), + (11050, 2, 264, 360, 6106), + (11050, 3, 264, 360, 493), + (11051, 1, 264, 720, 452), + (11051, 2, 264, 720, 6106), + (11051, 3, 264, 720, 493), + (11052, 1, 264, 1080, 452), + (11052, 2, 264, 1080, 6106), + (11052, 3, 264, 1080, 493), + (11053, 1, 264, 1260, 500), + (11054, 1, 264, 1440, 500), + (11059, 1, 264, 1440, 452), + (11059, 2, 264, 1440, 6106), + (11059, 3, 264, 1440, 493), + (11060, 1, 264, 1800, 452), + (11060, 2, 264, 1800, 6106), + (11060, 3, 264, 1800, 493), + (11061, 1, 114, -63, 0), + (11062, 1, 114, -64, 0), + (11063, 1, 114, -65, 0), + (11074, 1, 247, 100, 39), + (11075, 1, 247, 150, 39), + (11076, 1, 247, 200, 39), + (11077, 1, 264, 10, 986), + (11078, 1, 264, 10, 988), + (11079, 1, 264, 10, 987), + (11082, 1, 185, 40, 51), + (11083, 1, 185, 50, 51), + (11084, 1, 185, 60, 51), + (11085, 1, 247, 20, 2), + (11085, 2, 247, 20, 3), + (11085, 3, 247, 20, 77), + (11085, 4, 220, 25, 77), + (11085, 5, 220, 25, 2), + (11085, 6, 220, 25, 3), + (11086, 1, 247, 40, 2), + (11086, 2, 247, 40, 3), + (11086, 3, 247, 40, 77), + (11086, 4, 220, 35, 77), + (11086, 5, 220, 35, 2), + (11086, 6, 220, 35, 3), + (11087, 1, 247, 60, 2), + (11087, 2, 247, 60, 3), + (11087, 3, 247, 60, 77), + (11087, 4, 220, 50, 77), + (11087, 5, 220, 50, 2), + (11087, 6, 220, 50, 3), + (11088, 1, 264, 180, 505), + (11089, 1, 264, 360, 505), + (11090, 1, 264, 540, 505), + (11091, 1, 264, 720, 505), + (12396, 1, 172, 50, 0), + (12397, 1, 172, 51, 0), + (12398, 1, 172, 52, 0), + (12399, 1, 172, 53, 0), + (12400, 1, 172, 54, 0), + (12401, 1, 259, 56, 0), + (12402, 1, 259, 57, 0), + (12403, 1, 259, 58, 0), + (12404, 1, 259, 59, 0), + (12405, 1, 259, 60, 0), + (12406, 1, 69, 1100, 0), + (12407, 1, 69, 1200, 0), + (12408, 1, 69, 1300, 0), + (12409, 1, 69, 1400, 0), + (12410, 1, 69, 1500, 0), + (12411, 1, 1, 300, 0), + (12412, 1, 1, 350, 0), + (12413, 1, 1, 400, 0), + (12414, 1, 1, 450, 0), + (12415, 1, 1, 500, 0), + (12416, 1, 399, 3, 0), + (12416, 2, 141, 1, 0), + (12416, 3, 138, 0, 0), + (12416, 4, 142, 255, 0), + (12416, 5, 391, 0, 0), + (12416, 6, 311, 0, 0), + (12416, 7, 137, -152, 0), + (12416, 8, 411, 100350, 0), + (12416, 9, 137, -39, 0), + (12417, 1, 399, 6, 0), + (12417, 2, 141, 1, 0), + (12417, 3, 138, 0, 0), + (12417, 4, 142, 255, 0), + (12417, 5, 391, 0, 0), + (12417, 6, 311, 0, 0), + (12417, 7, 137, -152, 0), + (12417, 8, 411, 100350, 0), + (12417, 9, 137, -39, 0), + (12418, 1, 399, 9, 0), + (12418, 2, 141, 1, 0), + (12418, 3, 138, 0, 0), + (12418, 4, 142, 255, 0), + (12418, 5, 391, 0, 0), + (12418, 6, 311, 0, 0), + (12418, 7, 137, -152, 0), + (12418, 8, 411, 100350, 0), + (12418, 9, 137, -39, 0), + (12419, 1, 292, 15, 0), + (12420, 1, 292, 30, 0), + (12421, 1, 292, 45, 0), + (12423, 1, 273, 21, 0), + (12424, 1, 273, 24, 0), + (12425, 1, 273, 27, 0), + (12426, 1, 273, 21, 0), + (12427, 1, 273, 24, 0), + (12428, 1, 273, 27, 0), + (12432, 1, 294, 17, 100), + (12433, 1, 294, 19, 100), + (12434, 1, 294, 21, 100), + (12435, 1, 294, 23, 100), + (12436, 1, 294, 25, 100), + (12437, 1, 294, 27, 100), + (12438, 1, 200, 70, 0), + (12439, 1, 341, 210, 0), + (12440, 1, 341, 220, 0), + (12441, 1, 341, 230, 0), + (12442, 1, 341, 240, 0), + (12443, 1, 341, 250, 0), + (12444, 1, 318, 21, 0), + (12445, 1, 318, 22, 0), + (12446, 1, 318, 23, 0), + (12447, 1, 318, 24, 0), + (12448, 1, 318, 25, 0), + (12449, 1, 125, 31, 31), + (12449, 2, 137, 0, 0), + (12449, 3, 141, 1, 0), + (12449, 4, 139, -6233, 0), + (12449, 5, 139, -6265, 0), + (12449, 6, 125, 31, 31), + (12449, 7, 137, 147, 0), + (12449, 8, 141, 1, 0), + (12450, 1, 125, 34, 34), + (12450, 2, 137, 0, 0), + (12450, 3, 141, 1, 0), + (12450, 4, 139, -6233, 0), + (12450, 5, 139, -6265, 0), + (12450, 6, 125, 34, 34), + (12450, 7, 137, 147, 0), + (12450, 8, 141, 1, 0), + (12451, 1, 125, 37, 37), + (12451, 2, 137, 0, 0), + (12451, 3, 141, 1, 0), + (12451, 4, 139, -6233, 0), + (12451, 5, 139, -6265, 0), + (12451, 6, 125, 37, 37), + (12451, 7, 137, 147, 0), + (12451, 8, 141, 1, 0), + (12452, 1, 274, 38, 0), + (12453, 1, 274, 39, 0), + (12454, 1, 274, 40, 0), + (12455, 1, 15, 19, 0), + (12456, 1, 15, 20, 0), + (12457, 1, 15, 21, 0), + (12458, 1, 15, 22, 0), + (12459, 1, 15, 23, 0), + (12463, 1, 320, 9, 0), + (12464, 1, 320, 10, 0), + (12465, 1, 320, 11, 0), + (12466, 1, 320, 9, 0), + (12467, 1, 320, 10, 0), + (12468, 1, 320, 11, 0), + (12469, 1, 320, 9, 0), + (12470, 1, 320, 10, 0), + (12471, 1, 320, 11, 0), + (12472, 1, 320, 6, 0), + (12473, 1, 320, 7, 0), + (12474, 1, 320, 8, 0), + (12475, 1, 264, 180, 7003), + (12476, 1, 264, 360, 7003), + (12477, 1, 264, 540, 7003), + (12478, 1, 264, 60, 3705), + (12479, 1, 264, 120, 3705), + (12480, 1, 264, 180, 3705), + (12481, 1, 247, 40, 76), + (12482, 1, 247, 45, 76), + (12483, 1, 247, 65, 76), + (12484, 1, 247, 70, 76), + (12485, 1, 247, 30, 76), + (12486, 1, 247, 35, 76), + (12487, 1, 247, 25, 76), + (12488, 1, 247, 30, 76), + (12492, 1, 69, 1600, 0), + (12493, 1, 69, 1700, 0), + (12494, 1, 69, 1800, 0), + (12495, 1, 69, 1900, 0), + (12496, 1, 69, 2000, 0), + (12497, 1, 125, 40, 40), + (12497, 2, 137, 0, 0), + (12497, 3, 141, 1, 0), + (12497, 4, 139, -6233, 0), + (12497, 5, 139, -6265, 0), + (12497, 6, 125, 40, 40), + (12497, 7, 137, 147, 0), + (12497, 8, 141, 1, 0), + (12498, 1, 125, 43, 43), + (12498, 2, 137, 0, 0), + (12498, 3, 141, 1, 0), + (12498, 4, 139, -6233, 0), + (12498, 5, 139, -6265, 0), + (12498, 6, 125, 43, 43), + (12498, 7, 137, 147, 0), + (12498, 8, 141, 1, 0), + (12499, 1, 125, 46, 46), + (12499, 2, 137, 0, 0), + (12499, 3, 141, 1, 0), + (12499, 4, 139, -6233, 0), + (12499, 5, 139, -6265, 0), + (12499, 6, 125, 46, 46), + (12499, 7, 137, 147, 0), + (12499, 8, 141, 1, 0), + (12500, 1, 310, 1000, 0), + (12500, 2, 385, 4004, 0), + (12500, 3, 385, 11202, 0), + (12500, 4, 385, 11302, 0), + (12500, 5, 385, 11402, 0), + (12500, 6, 385, 11502, 0), + (12500, 7, 385, 11602, 0), + (12501, 1, 310, 2000, 0), + (12501, 2, 385, 4004, 0), + (12501, 3, 385, 11202, 0), + (12501, 4, 385, 11302, 0), + (12501, 5, 385, 11402, 0), + (12501, 6, 385, 11502, 0), + (12501, 7, 385, 11602, 0), + (12502, 1, 310, 3000, 0), + (12502, 2, 385, 4004, 0), + (12502, 3, 385, 11202, 0), + (12502, 4, 385, 11302, 0), + (12502, 5, 385, 11402, 0), + (12502, 6, 385, 11502, 0), + (12502, 7, 385, 11602, 0), + (12505, 1, 310, 4000, 0), + (12505, 2, 385, 4004, 0), + (12505, 3, 385, 11202, 0), + (12505, 4, 385, 11302, 0), + (12505, 5, 385, 11402, 0), + (12505, 6, 385, 11502, 0), + (12505, 7, 385, 11602, 0), + (12506, 1, 310, 5000, 0), + (12506, 2, 385, 4004, 0), + (12506, 3, 385, 11202, 0), + (12506, 4, 385, 11302, 0), + (12506, 5, 385, 11402, 0), + (12506, 6, 385, 11502, 0), + (12506, 7, 385, 11602, 0), + (12507, 1, 301, 120, 0), + (12508, 1, 247, 50, 76), + (12509, 1, 247, 55, 76), + (12510, 1, 247, 60, 76), + (12511, 1, 247, 75, 76), + (12512, 1, 247, 80, 76), + (12513, 1, 247, 85, 76), + (12514, 1, 247, 40, 76), + (12515, 1, 247, 45, 76), + (12516, 1, 247, 50, 76), + (12517, 1, 247, 35, 76), + (12518, 1, 247, 40, 76), + (12519, 1, 247, 45, 76), + (12523, 1, 294, 0, 200), + (12526, 1, 294, 0, 190), + (12527, 1, 294, 0, 195), + (12528, 1, 294, 0, 200), + (12529, 1, 294, 0, 165), + (12530, 1, 294, 0, 175), + (12531, 1, 294, 0, 185), + (12532, 1, 341, 260, 0), + (12533, 1, 341, 270, 0), + (12534, 1, 341, 280, 0), + (12535, 1, 341, 290, 0), + (12536, 1, 341, 300, 0), + (12537, 1, 318, 26, 0), + (12538, 1, 318, 27, 0), + (12539, 1, 318, 28, 0), + (12540, 1, 318, 29, 0), + (12541, 1, 318, 30, 0), + (12548, 1, 278, 900, 79230), + (12548, 2, 440, 87, 100), + (12549, 1, 278, 900, 86260), + (12549, 2, 440, 88, 100), + (12550, 1, 278, 900, 88260), + (12550, 2, 440, 89, 100), + (12551, 1, 278, 900, 91510), + (12551, 2, 440, 90, 100), + (12552, 1, 278, 900, 96305), + (12552, 2, 440, 91, 100), + (12553, 1, 294, 29, 102), + (12554, 1, 294, 31, 104), + (12555, 1, 294, 33, 106), + (12556, 1, 294, 23, 100), + (12557, 1, 294, 25, 100), + (12558, 1, 294, 27, 100), + (12559, 1, 190, 300, 0), + (12560, 1, 190, 350, 0), + (12561, 1, 190, 400, 0), + (12562, 1, 190, 450, 0), + (12563, 1, 190, 500, 0), + (12564, 1, 319, 28, 0), + (12565, 1, 319, 29, 0), + (12566, 1, 319, 30, 0), + (12567, 1, 274, 41, 0), + (12568, 1, 274, 42, 0), + (12569, 1, 274, 43, 0), + (12570, 1, 15, 24, 0), + (12571, 1, 15, 25, 0), + (12572, 1, 15, 26, 0), + (12573, 1, 15, 27, 0), + (12574, 1, 15, 28, 0), + (12575, 1, 292, 60, 0), + (12576, 1, 231, 17, 0), + (12577, 1, 231, 19, 0), + (12578, 1, 231, 21, 0), + (12579, 1, 85, 23569, 0), + (12580, 1, 85, 23570, 0), + (12581, 1, 85, 23571, 0), + (12582, 1, 264, 10, 9400), + (12583, 1, 264, 20, 9400), + (12584, 1, 264, 30, 9400), + (12587, 1, 264, 480, 9403), + (12588, 1, 264, 600, 9403), + (12589, 1, 264, 720, 9403), + (12591, 1, 247, 90, 76), + (12594, 1, 247, 55, 76), + (12597, 1, 247, 50, 76), + (12598, 1, 247, 55, 76), + (12600, 1, 310, 60000, 0), + (12600, 2, 139, 6197, 0), + (12600, 3, 411, 512, 0), + (12603, 1, 287, 1, 0), + (12603, 2, 139, 6197, 0), + (12603, 3, 411, 512, 0), + (12606, 1, 271, 5, 0), + (12607, 1, 310, 12000, 0), + (12607, 2, 385, 13007, 0), + (12607, 3, 385, 12105, 0), + (12607, 4, 385, 12205, 0), + (12607, 5, 310, 36000, 0), + (12607, 6, 385, 12305, 0), + (12607, 7, 385, 12405, 0), + (12607, 8, 385, 12505, 0), + (12607, 9, 411, 512, 0), + (12610, 1, 279, 19, 0), + (12612, 1, 439, 0, 124480), + (12612, 2, 345, 84, 25), + (12613, 1, 439, 0, 132440), + (12613, 2, 345, 86, 25), + (12615, 1, 310, 120000, 0), + (12615, 2, 139, 4695, 0), + (12615, 3, 411, 512, 0), + (12616, 1, 310, 240000, 0), + (12616, 2, 139, 4695, 0), + (12616, 3, 411, 512, 0), + (12617, 1, 310, 360000, 0), + (12617, 2, 139, 4695, 0), + (12617, 3, 411, 512, 0), + (12636, 1, 426, 1, 0), + (12637, 1, 426, 2, 0), + (12639, 1, 264, 240, 519), + (12639, 2, 264, 240, 10427), + (12642, 1, 264, 240, 185), + (12642, 2, 264, 240, 10426), + (12645, 1, 287, 1, 0), + (12645, 2, 385, 8190, 0), + (12645, 3, 287, 1, 0), + (12645, 4, 385, 21818, 0), + (12645, 5, 411, 64, 0), + (12646, 1, 287, 1, 0), + (12646, 2, 385, 3277, 0), + (12646, 3, 287, 1, 0), + (12646, 4, 385, 21816, 0), + (12652, 1, 399, 1, 0), + (12652, 2, 138, 1, 0), + (12652, 3, 137, 0, 0), + (12652, 4, 348, 10, 0), + (12652, 5, 311, 0, 0), + (12652, 6, 141, 1, 0), + (12652, 7, 134, 254, 0), + (12652, 8, 137, -39, 0), + (12653, 1, 399, 2, 0), + (12653, 2, 138, 1, 0), + (12653, 3, 137, 0, 0), + (12653, 4, 348, 10, 0), + (12653, 5, 311, 0, 0), + (12653, 6, 141, 1, 0), + (12653, 7, 134, 254, 0), + (12653, 8, 137, -39, 0), + (12654, 1, 399, 3, 0), + (12654, 2, 138, 1, 0), + (12654, 3, 137, 0, 0), + (12654, 4, 348, 10, 0), + (12654, 5, 311, 0, 0), + (12654, 6, 141, 1, 0), + (12654, 7, 134, 254, 0), + (12654, 8, 137, -39, 0), + (12664, 1, 264, 2, 3728), + (12667, 1, 220, 250, 26), + (12667, 2, 220, 250, 30), + (12667, 3, 220, 250, 38), + (12668, 1, 220, 275, 26), + (12668, 2, 220, 275, 30), + (12668, 3, 220, 275, 38), + (12669, 1, 220, 300, 26), + (12669, 2, 220, 300, 30), + (12669, 3, 220, 300, 38), + (12670, 1, 220, 200, 21), + (12670, 2, 220, 200, 23), + (12670, 3, 220, 400, 52), + (12670, 4, 220, 200, 28), + (12671, 1, 220, 215, 21), + (12671, 2, 220, 215, 23), + (12671, 3, 220, 450, 52), + (12671, 4, 220, 215, 28), + (12672, 1, 220, 235, 21), + (12672, 2, 220, 235, 23), + (12672, 3, 220, 510, 52), + (12672, 4, 220, 235, 28), + (12673, 1, 264, 960, 420), + (12674, 1, 227, 270, 32), + (12675, 1, 227, 300, 32), + (12676, 1, 227, 330, 32), + (12677, 1, 275, 92, 0), + (12678, 1, 287, 2, 0), + (12678, 2, 385, 15002, 0), + (12678, 3, 385, 15003, 0), + (12678, 4, 411, 128, 0), + (12679, 1, 264, 1200, 276), + (12680, 1, 264, 1500, 276), + (12681, 1, 264, 1800, 276), + (12685, 1, 292, 49, 0), + (12686, 1, 292, 50, 0), + (12687, 1, 292, 51, 0), + (12688, 1, 287, 1, 0), + (12688, 2, 385, 8473, 0), + (12688, 3, 385, 8318, 0), + (12688, 4, 385, 8418, 0), + (12688, 5, 385, 8518, 0), + (12688, 6, 411, 128, 0), + (12689, 1, 287, 2, 0), + (12689, 2, 139, 4691, 0), + (12689, 3, 411, 128, 0), + (12690, 1, 287, 2, 0), + (12690, 2, 385, 8111, 0), + (12690, 3, 385, 15008, 0), + (12690, 4, 385, 8411, 0), + (12690, 5, 385, 8511, 0), + (12690, 6, 411, 128, 0), + (12691, 1, 287, 1, 0), + (12691, 2, 385, 15007, 0), + (12691, 3, 411, 128, 0), + (12691, 4, 385, 8316, 0), + (12692, 1, 220, 255, 21), + (12692, 2, 220, 255, 23), + (12692, 3, 220, 570, 52), + (12692, 4, 220, 255, 28), + (12693, 1, 220, 275, 21), + (12693, 2, 220, 275, 23), + (12693, 3, 220, 630, 52), + (12693, 4, 220, 275, 28), + (12694, 1, 189, 16, 0), + (12695, 1, 189, 17, 0), + (12696, 1, 189, 18, 0), + (12697, 1, 330, 140, 0), + (12697, 2, 330, 140, 1), + (12697, 3, 330, 140, 2), + (12697, 4, 330, 140, 3), + (12697, 5, 330, 140, 28), + (12697, 6, 330, 140, 36), + (12697, 7, 330, 140, 77), + (12698, 1, 330, 145, 0), + (12698, 2, 330, 145, 1), + (12698, 3, 330, 145, 2), + (12698, 4, 330, 145, 3), + (12698, 5, 330, 145, 28), + (12698, 6, 330, 145, 36), + (12698, 7, 330, 145, 77), + (12699, 1, 330, 150, 0), + (12699, 2, 330, 150, 1), + (12699, 3, 330, 150, 2), + (12699, 4, 330, 150, 3), + (12699, 5, 330, 150, 28), + (12699, 6, 330, 150, 36), + (12699, 7, 330, 150, 77), + (12703, 1, 283, 240, 0), + (12704, 1, 283, 260, 0), + (12705, 1, 283, 280, 0), + (12706, 1, 220, 60, 28), + (12706, 2, 220, 60, 0), + (12706, 3, 427, 23598, 3), + (12706, 4, 428, 28, 0), + (12706, 5, 428, 0, 0), + (12707, 1, 220, 85, 28), + (12707, 2, 220, 85, 0), + (12707, 3, 427, 23598, 5), + (12707, 4, 428, 28, 0), + (12707, 5, 428, 0, 0), + (12708, 1, 220, 115, 28), + (12708, 2, 220, 115, 0), + (12708, 3, 427, 23598, 7), + (12708, 4, 428, 28, 0), + (12708, 5, 428, 0, 0), + (12709, 1, 287, 1, 0), + (12709, 2, 139, 4516, 0), + (12709, 3, 411, 256, 0), + (12710, 1, 310, 360000, 0), + (12710, 2, 139, 4516, 0), + (12710, 3, 411, 256, 0), + (12711, 1, 310, 720000, 0), + (12711, 2, 139, 4516, 0), + (12711, 3, 411, 256, 0), + (12712, 1, 310, 1080000, 0), + (12712, 2, 139, 4516, 0), + (12712, 3, 411, 256, 0), + (12713, 1, 264, 2, 8202), + (12714, 1, 264, 4, 8202), + (12715, 1, 264, 6, 8202), + (12716, 1, 264, 30, 3702), + (12717, 1, 264, 60, 3702), + (12718, 1, 264, 90, 3702), + (12719, 1, 128, 10, 0), + (12719, 2, 385, 12769, 0), + (12719, 3, 411, 256, 0), + (12720, 1, 287, 1, 0), + (12720, 2, 139, 12519, 0), + (12720, 3, 411, 256, 0), + (12721, 1, 264, 60, 3506), + (12722, 1, 264, 120, 3506), + (12723, 1, 264, 180, 3506), + (12727, 1, 264, 960, 359), + (12728, 1, 264, 1200, 359), + (12729, 1, 264, 1440, 359), + (12733, 1, 287, 2, 0), + (12733, 2, 137, 22, 0), + (12733, 3, 411, 256, 0), + (12734, 1, 375, 145, 0), + (12735, 1, 375, 150, 0), + (12736, 1, 375, 155, 0), + (12737, 1, 129, 5, 0), + (12737, 2, 385, 12768, 0), + (12737, 3, 411, 256, 0), + (12738, 1, 129, 10, 0), + (12738, 2, 385, 12768, 0), + (12738, 3, 411, 256, 0), + (12739, 1, 129, 15, 0), + (12739, 2, 385, 12768, 0), + (12739, 3, 411, 256, 0), + (12757, 1, 264, 6000, 68), + (12758, 1, 264, 6600, 68), + (12759, 1, 264, 7200, 68), + (12767, 1, 229, 50, 0), + (12768, 1, 229, 55, 0), + (12769, 1, 229, 60, 0), + (12773, 1, 264, 60, 1580), + (12774, 1, 264, 120, 1580), + (12775, 1, 264, 180, 1580), + (12776, 1, 264, 240, 1580), + (12777, 1, 264, 300, 1580), + (12779, 1, 264, 0, 826), + (12780, 1, 264, 1, 826), + (12781, 1, 264, 1, 826), + (12782, 1, 129, 10, 0), + (12782, 2, 385, 16106, 0), + (12783, 1, 129, 20, 0), + (12783, 2, 385, 16106, 0), + (12784, 1, 129, 30, 0), + (12784, 2, 385, 16106, 0), + (12792, 1, 397, 1000, 0), + (12793, 1, 397, 1200, 0), + (12794, 1, 397, 1250, 0), + (12795, 1, 213, 19, 0), + (12796, 1, 213, 21, 0), + (12797, 1, 213, 23, 0), + (12798, 1, 218, 21, 0), + (12799, 1, 218, 22, 0), + (12800, 1, 218, 23, 0), + (12801, 1, 215, 18, 0), + (12802, 1, 215, 20, 0), + (12803, 1, 215, 22, 0), + (12813, 1, 320, 2, 0), + (12814, 1, 320, 4, 0), + (12815, 1, 320, 6, 0), + (12816, 1, 128, 1, 0), + (12816, 2, 385, 2223, 0), + (12816, 3, 385, 2323, 0), + (12816, 4, 385, 2240, 0), + (12816, 5, 385, 2340, 0), + (12816, 6, 385, 2440, 0), + (12816, 7, 385, 2540, 0), + (12816, 8, 398, 6000, 0), + (12816, 9, 385, 11872, 0), + (12816, 10, 385, 14154, 0), + (12816, 11, 385, 18166, 0), + (12816, 12, 385, 27225, 0), + (12816, 13, 385, 2419, 0), + (12816, 14, 385, 2427, 0), + (12816, 15, 385, 30374, 0), + (12816, 16, 385, 2527, 0), + (12816, 17, 385, 36431, 0), + (12819, 1, 310, 23400, 0), + (12819, 2, 139, 4671, 0), + (12819, 3, 411, 32768, 0), + (12820, 1, 310, 46800, 0), + (12820, 2, 139, 4671, 0), + (12820, 3, 411, 32768, 0), + (12822, 1, 310, 153000, 0), + (12822, 2, 139, 8233, 0), + (12822, 3, 310, 120000, 0), + (12822, 4, 385, 2439, 0), + (12822, 5, 385, 2539, 0), + (12822, 6, 411, 32768, 0), + (12831, 1, 127, 17, 0), + (12831, 2, 385, 3291, 0), + (12831, 3, 385, 3817, 0), + (12831, 4, 411, 32768, 0), + (12834, 1, 264, 180, 128), + (12835, 1, 264, 225, 128), + (12840, 1, 264, 24, 3817), + (12841, 1, 264, 30, 3817), + (12843, 1, 225, 42, 0), + (12846, 1, 288, 20, 28), + (12846, 2, 288, 20, 0), + (12849, 1, 127, 14, 0), + (12849, 2, 385, 16794, 0), + (12849, 3, 411, 32768, 0), + (12860, 1, 294, 21, 102), + (12863, 1, 127, 15, 15), + (12863, 2, 137, 0, 0), + (12863, 3, 138, 0, 0), + (12863, 4, 141, 1, 0), + (12863, 5, 143, 3000, 0), + (12863, 6, 127, 15, 15), + (12863, 7, 385, 16555, 0), + (12863, 8, 385, 16655, 0), + (12871, 1, 264, 2160, 452), + (12871, 2, 264, 2160, 6106), + (12871, 3, 264, 2160, 493), + (12872, 1, 264, 2520, 452), + (12872, 2, 264, 2520, 6106), + (12872, 3, 264, 2520, 493), + (12874, 1, 264, 2572, 451), + (12876, 1, 264, 900, 7003), + (12877, 1, 264, 1260, 7003), + (12878, 1, 264, 1620, 7003), + (12881, 1, 264, 45, 172), + (12886, 1, 10, 0, 0), + (12887, 1, 10, 0, 0), + (12888, 1, 10, 0, 0), + (12889, 1, 10, 0, 0), + (12890, 1, 10, 0, 0), + (12894, 1, 264, 30, 1122), + (12899, 1, 264, 3456, 57), + (12899, 2, 264, 3456, 616), + (12900, 1, 264, 4320, 57), + (12900, 2, 264, 4320, 616), + (12902, 1, 264, 30, 1380), + (12903, 1, 264, 60, 1380), + (12907, 1, 264, 30, 1381), + (12908, 1, 264, 60, 1381), + (12912, 1, 264, 30, 1382), + (12913, 1, 264, 60, 1382), + (12920, 1, 130, 10, 10), + (12920, 2, 139, 2569, 0), + (12920, 3, 130, -10, -10), + (12920, 4, 139, 2568, 0), + (12929, 1, 287, 4, 0), + (12929, 2, 137, 3, 0), + (12929, 3, 137, 99, 0), + (12929, 4, 138, 0, 0), + (12929, 5, 244, 20, 0), + (12930, 1, 287, 5, 0), + (12930, 2, 137, 3, 0), + (12930, 3, 137, 99, 0), + (12930, 4, 138, 0, 0), + (12930, 5, 244, 15, 0), + (12945, 1, 280, 60, 0), + (12946, 1, 280, 61, 0), + (12947, 1, 280, 62, 0), + (12948, 1, 280, 63, 0), + (12949, 1, 280, 64, 0), + (12950, 1, 218, 21, 0), + (12951, 1, 218, 22, 0), + (12952, 1, 218, 23, 0), + (12953, 1, 218, 24, 0), + (12954, 1, 218, 25, 0), + (12966, 1, 131, 25, 25), + (12966, 2, 348, 10, 0), + (12966, 3, 137, -32, 0), + (12967, 1, 131, 50, 50), + (12967, 2, 348, 10, 0), + (12967, 3, 137, -32, 0), + (12968, 1, 264, 3, 1041), + (12969, 1, 264, 6, 1041), + (12970, 1, 264, 9, 1041), + (12977, 1, 287, 2, 0), + (12977, 2, 385, 16188, 0), + (12978, 1, 287, 4, 0), + (12978, 2, 385, 16188, 0), + (12979, 1, 287, 6, 0), + (12979, 2, 385, 16188, 0), + (12980, 1, 287, 8, 0), + (12980, 2, 385, 16188, 0), + (12981, 1, 287, 10, 0), + (12981, 2, 385, 16188, 0), + (12988, 1, 287, 3, 0), + (12988, 2, 140, 3, 0), + (12988, 3, 348, 1, 0), + (12988, 4, 138, 0, 0), + (12988, 5, 137, 0, 0), + (13001, 1, 264, 60, 9504), + (13002, 1, 264, 120, 9504), + (13003, 1, 264, 180, 9504), + (13005, 1, 264, 70, 171), + (13006, 1, 264, 80, 171), + (13007, 1, 264, 90, 171), + (13010, 1, 264, 10, 47), + (13011, 1, 264, 20, 47), + (13012, 1, 264, 30, 47), + (13013, 1, 264, 120, 446), + (13014, 1, 264, 240, 446), + (13015, 1, 264, 360, 446), + (13017, 1, 375, 15, 0), + (13018, 1, 375, 25, 0), + (13019, 1, 375, 35, 0), + (13021, 1, 247, 80, 2), + (13021, 2, 247, 80, 3), + (13021, 3, 247, 80, 77), + (13021, 4, 220, 75, 77), + (13021, 5, 220, 75, 2), + (13021, 6, 220, 75, 3), + (13023, 1, 330, 115, 0), + (13023, 2, 330, 115, 1), + (13023, 3, 330, 115, 2), + (13023, 4, 330, 115, 3), + (13023, 5, 330, 115, 28), + (13023, 6, 330, 115, 36), + (13023, 7, 330, 115, 77), + (13026, 1, 266, 26, 0), + (13027, 1, 266, 27, 0), + (13028, 1, 266, 28, 0), + (13029, 1, 288, 250, 51), + (13029, 2, 288, 60, 51), + (13032, 1, 185, 70, 51), + (13033, 1, 185, 80, 51), + (13035, 1, 220, 768, 74), + (13040, 1, 216, 280, 74), + (13043, 1, 169, 35, -1), + (13046, 1, 1, 240, 0), + (13047, 1, 1, 280, 0), + (13048, 1, 1, 320, 0), + (13049, 1, 1, 360, 0), + (13050, 1, 1, 400, 0), + (13051, 1, 287, 2, 0), + (13051, 2, 139, 8003, 0), + (13052, 1, 310, 120000, 0), + (13052, 2, 385, 3107, 0), + (13052, 3, 385, 3207, 0), + (13052, 4, 385, 3307, 0), + (13052, 5, 385, 3407, 0), + (13052, 6, 385, 3507, 0), + (13052, 7, 385, 3607, 0), + (13055, 1, 264, 60, 8400), + (13067, 1, 264, 120, 643), + (13072, 1, 310, 120000, 0), + (13072, 2, 139, 6197, 0), + (13072, 3, 411, 512, 0), + (13073, 1, 310, 180000, 0), + (13073, 2, 139, 6197, 0), + (13073, 3, 411, 512, 0), + (13074, 1, 330, 140, 0), + (13074, 2, 330, 140, 1), + (13074, 3, 330, 140, 2), + (13074, 4, 330, 140, 3), + (13074, 5, 330, 140, 28), + (13074, 6, 330, 140, 36), + (13075, 1, 330, 145, 0), + (13075, 2, 330, 145, 1), + (13075, 3, 330, 145, 2), + (13075, 4, 330, 145, 3), + (13075, 5, 330, 145, 28), + (13075, 6, 330, 145, 36), + (13076, 1, 330, 150, 0), + (13076, 2, 330, 150, 1), + (13076, 3, 330, 150, 2), + (13076, 4, 330, 150, 3), + (13076, 5, 330, 150, 28), + (13076, 6, 330, 150, 36), + (13077, 1, 330, 140, 0), + (13077, 2, 330, 140, 1), + (13077, 3, 330, 140, 2), + (13077, 4, 330, 140, 3), + (13077, 5, 330, 140, 28), + (13077, 6, 330, 140, 36), + (13077, 7, 330, 140, 77), + (13078, 1, 330, 145, 0), + (13078, 2, 330, 145, 1), + (13078, 3, 330, 145, 2), + (13078, 4, 330, 145, 3), + (13078, 5, 330, 145, 28), + (13078, 6, 330, 145, 36), + (13078, 7, 330, 145, 77), + (13080, 1, 172, 55, 0), + (13081, 1, 172, 56, 0), + (13082, 1, 172, 57, 0), + (13083, 1, 172, 58, 0), + (13084, 1, 172, 59, 0), + (13085, 1, 259, 61, 0), + (13086, 1, 259, 62, 0), + (13087, 1, 259, 63, 0), + (13088, 1, 259, 64, 0), + (13089, 1, 259, 65, 0), + (13090, 1, 339, 10, 8105), + (13090, 2, 142, 65, 0), + (13090, 3, 311, 0, 0), + (13090, 4, 134, 70, 0), + (13090, 5, 348, 10, 0), + (13090, 6, 137, 0, 0), + (13090, 7, 339, 10, 8105), + (13090, 8, 142, 65, 0), + (13090, 9, 311, 0, 0), + (13090, 10, 134, 70, 0), + (13090, 11, 348, 10, 0), + (13090, 12, 137, 100, 0), + (13090, 13, 339, 10, 8105), + (13090, 14, 142, 65, 0), + (13090, 15, 311, 0, 0), + (13090, 16, 134, 70, 0), + (13090, 17, 348, 10, 0), + (13090, 18, 137, 79, 0), + (13090, 19, 339, 10, 8105), + (13090, 20, 142, 65, 0), + (13090, 21, 311, 0, 0), + (13090, 22, 134, 70, 0), + (13090, 23, 348, 10, 0), + (13090, 24, 137, 147, 0), + (13090, 25, 339, 10, 11404), + (13090, 26, 142, 71, 0), + (13090, 27, 311, 0, 0), + (13090, 28, 134, 75, 0), + (13090, 29, 348, 10, 0), + (13090, 30, 137, 0, 0), + (13090, 31, 339, 10, 11404), + (13090, 32, 142, 71, 0), + (13090, 33, 311, 0, 0), + (13090, 34, 134, 75, 0), + (13090, 35, 348, 10, 0), + (13090, 36, 137, 100, 0), + (13090, 37, 339, 10, 11404), + (13090, 38, 142, 71, 0), + (13090, 39, 311, 0, 0), + (13090, 40, 134, 75, 0), + (13090, 41, 348, 10, 0), + (13090, 42, 137, 79, 0), + (13090, 43, 339, 10, 11404), + (13090, 44, 142, 71, 0), + (13090, 45, 311, 0, 0), + (13090, 46, 134, 75, 0), + (13090, 47, 348, 10, 0), + (13090, 48, 137, 147, 0), + (13090, 49, 339, 10, 13199), + (13090, 50, 142, 76, 0), + (13090, 51, 311, 0, 0), + (13090, 52, 134, 80, 0), + (13090, 53, 348, 10, 0), + (13090, 54, 137, 0, 0), + (13090, 55, 339, 10, 13199), + (13090, 56, 142, 76, 0), + (13090, 57, 311, 0, 0), + (13090, 58, 134, 80, 0), + (13090, 59, 348, 10, 0), + (13090, 60, 137, 100, 0), + (13090, 61, 339, 10, 13199), + (13090, 62, 142, 76, 0), + (13090, 63, 311, 0, 0), + (13090, 64, 134, 80, 0), + (13090, 65, 348, 10, 0), + (13090, 66, 137, 79, 0), + (13090, 67, 339, 10, 13199), + (13090, 68, 142, 76, 0), + (13090, 69, 311, 0, 0), + (13090, 70, 134, 80, 0), + (13090, 71, 348, 10, 0), + (13090, 72, 137, 147, 0), + (13090, 73, 339, 10, 13830), + (13090, 74, 142, 81, 0), + (13090, 75, 311, 0, 0), + (13090, 76, 134, 85, 0), + (13090, 77, 348, 10, 0), + (13090, 78, 137, 0, 0), + (13090, 79, 339, 10, 13830), + (13090, 80, 142, 81, 0), + (13090, 81, 311, 0, 0), + (13090, 82, 134, 85, 0), + (13090, 83, 348, 10, 0), + (13090, 84, 137, 100, 0), + (13090, 85, 339, 10, 13830), + (13090, 86, 142, 81, 0), + (13090, 87, 311, 0, 0), + (13090, 88, 134, 85, 0), + (13090, 89, 348, 10, 0), + (13090, 90, 137, 79, 0), + (13090, 91, 339, 10, 13830), + (13090, 92, 142, 81, 0), + (13090, 93, 311, 0, 0), + (13090, 94, 134, 85, 0), + (13090, 95, 348, 10, 0), + (13090, 96, 137, 147, 0), + (13090, 97, 339, 10, 27527), + (13090, 98, 142, 86, 0), + (13090, 99, 311, 0, 0), + (13090, 100, 134, 90, 0), + (13090, 101, 348, 10, 0), + (13090, 102, 137, 0, 0), + (13090, 103, 339, 10, 27527), + (13090, 104, 142, 86, 0), + (13090, 105, 311, 0, 0), + (13090, 106, 134, 90, 0), + (13090, 107, 348, 10, 0), + (13090, 108, 137, 100, 0), + (13090, 109, 339, 10, 27527), + (13090, 110, 142, 86, 0), + (13090, 111, 311, 0, 0), + (13090, 112, 134, 90, 0), + (13090, 113, 348, 10, 0), + (13090, 114, 137, 79, 0), + (13090, 115, 339, 10, 27527), + (13090, 116, 142, 86, 0), + (13090, 117, 311, 0, 0), + (13090, 118, 134, 90, 0), + (13090, 119, 348, 10, 0), + (13090, 120, 137, 147, 0), + (13091, 1, 339, 10, 8105), + (13091, 2, 142, 65, 0), + (13091, 3, 311, 0, 0), + (13091, 4, 134, 70, 0), + (13091, 5, 348, 10, 0), + (13091, 6, 137, 0, 0), + (13091, 7, 339, 10, 8105), + (13091, 8, 142, 65, 0), + (13091, 9, 311, 0, 0), + (13091, 10, 134, 70, 0), + (13091, 11, 348, 10, 0), + (13091, 12, 137, 100, 0), + (13091, 13, 339, 10, 8105), + (13091, 14, 142, 65, 0), + (13091, 15, 311, 0, 0), + (13091, 16, 134, 70, 0), + (13091, 17, 348, 10, 0), + (13091, 18, 137, 79, 0), + (13091, 19, 339, 10, 8105), + (13091, 20, 142, 65, 0), + (13091, 21, 311, 0, 0), + (13091, 22, 134, 70, 0), + (13091, 23, 348, 10, 0), + (13091, 24, 137, 147, 0), + (13091, 25, 339, 10, 11404), + (13091, 26, 142, 71, 0), + (13091, 27, 311, 0, 0), + (13091, 28, 134, 75, 0), + (13091, 29, 348, 10, 0), + (13091, 30, 137, 0, 0), + (13091, 31, 339, 10, 11404), + (13091, 32, 142, 71, 0), + (13091, 33, 311, 0, 0), + (13091, 34, 134, 75, 0), + (13091, 35, 348, 10, 0), + (13091, 36, 137, 100, 0), + (13091, 37, 339, 10, 11404), + (13091, 38, 142, 71, 0), + (13091, 39, 311, 0, 0), + (13091, 40, 134, 75, 0), + (13091, 41, 348, 10, 0), + (13091, 42, 137, 79, 0), + (13091, 43, 339, 10, 11404), + (13091, 44, 142, 71, 0), + (13091, 45, 311, 0, 0), + (13091, 46, 134, 75, 0), + (13091, 47, 348, 10, 0), + (13091, 48, 137, 147, 0), + (13091, 49, 339, 10, 13199), + (13091, 50, 142, 76, 0), + (13091, 51, 311, 0, 0), + (13091, 52, 134, 80, 0), + (13091, 53, 348, 10, 0), + (13091, 54, 137, 0, 0), + (13091, 55, 339, 10, 13199), + (13091, 56, 142, 76, 0), + (13091, 57, 311, 0, 0), + (13091, 58, 134, 80, 0), + (13091, 59, 348, 10, 0), + (13091, 60, 137, 100, 0), + (13091, 61, 339, 10, 13199), + (13091, 62, 142, 76, 0), + (13091, 63, 311, 0, 0), + (13091, 64, 134, 80, 0), + (13091, 65, 348, 10, 0), + (13091, 66, 137, 79, 0), + (13091, 67, 339, 10, 13199), + (13091, 68, 142, 76, 0), + (13091, 69, 311, 0, 0), + (13091, 70, 134, 80, 0), + (13091, 71, 348, 10, 0), + (13091, 72, 137, 147, 0), + (13091, 73, 339, 10, 13830), + (13091, 74, 142, 81, 0), + (13091, 75, 311, 0, 0), + (13091, 76, 134, 85, 0), + (13091, 77, 348, 10, 0), + (13091, 78, 137, 0, 0), + (13091, 79, 339, 10, 13830), + (13091, 80, 142, 81, 0), + (13091, 81, 311, 0, 0), + (13091, 82, 134, 85, 0), + (13091, 83, 348, 10, 0), + (13091, 84, 137, 100, 0), + (13091, 85, 339, 10, 13830), + (13091, 86, 142, 81, 0), + (13091, 87, 311, 0, 0), + (13091, 88, 134, 85, 0), + (13091, 89, 348, 10, 0), + (13091, 90, 137, 79, 0), + (13091, 91, 339, 10, 13830), + (13091, 92, 142, 81, 0), + (13091, 93, 311, 0, 0), + (13091, 94, 134, 85, 0), + (13091, 95, 348, 10, 0), + (13091, 96, 137, 147, 0), + (13091, 97, 339, 10, 27527), + (13091, 98, 142, 86, 0), + (13091, 99, 311, 0, 0), + (13091, 100, 134, 90, 0), + (13091, 101, 348, 10, 0), + (13091, 102, 137, 0, 0), + (13091, 103, 339, 10, 27527), + (13091, 104, 142, 86, 0), + (13091, 105, 311, 0, 0), + (13091, 106, 134, 90, 0), + (13091, 107, 348, 10, 0), + (13091, 108, 137, 100, 0), + (13091, 109, 339, 10, 27527), + (13091, 110, 142, 86, 0), + (13091, 111, 311, 0, 0), + (13091, 112, 134, 90, 0), + (13091, 113, 348, 10, 0), + (13091, 114, 137, 79, 0), + (13091, 115, 339, 10, 27527), + (13091, 116, 142, 86, 0), + (13091, 117, 311, 0, 0), + (13091, 118, 134, 90, 0), + (13091, 119, 348, 10, 0), + (13091, 120, 137, 147, 0), + (13092, 1, 217, 0, 102280), + (13092, 2, 346, 84, 18), + (13093, 1, 217, 0, 109400), + (13093, 2, 346, 86, 18), + (13094, 1, 217, 0, 116800), + (13094, 2, 346, 88, 18), + (13095, 1, 439, 0, 140680), + (13095, 2, 345, 88, 25), + (13096, 1, 287, 1, 0), + (13096, 2, 140, 3, 0), + (13096, 3, 348, 1, 0), + (13096, 4, 138, 0, 0), + (13096, 5, 137, 0, 0), + (13097, 1, 287, 2, 0), + (13097, 2, 140, 3, 0), + (13097, 3, 348, 1, 0), + (13097, 4, 138, 0, 0), + (13097, 5, 137, 0, 0), + (13098, 1, 287, 3, 0), + (13098, 2, 140, 3, 0), + (13098, 3, 348, 1, 0), + (13098, 4, 138, 0, 0), + (13098, 5, 137, 0, 0), + (13099, 1, 132, 15, 15), + (13101, 1, 360, 25, 27537), + (13102, 1, 360, 25, 27538), + (13103, 1, 360, 25, 27539), + (13104, 1, 303, 14000, 18000), + (13104, 2, 139, 2766, 0), + (13105, 1, 303, 18000, 22500), + (13105, 2, 139, 2766, 0), + (13106, 1, 303, 22500, 27500), + (13106, 2, 139, 2766, 0), + (13110, 1, 185, 8, 1), + (13110, 2, 185, 8, 3), + (13111, 1, 185, 10, 1), + (13111, 2, 185, 10, 3), + (13113, 1, 185, 7, 36), + (13114, 1, 185, 9, 36), + (13116, 1, 185, 8, 0), + (13116, 2, 185, 8, 2), + (13117, 1, 185, 10, 0), + (13117, 2, 185, 10, 2), + (13122, 1, 2, 128, 0), + (13123, 1, 2, 132, 0), + (13124, 1, 2, 136, 0), + (13127, 1, 287, 4, 0), + (13127, 2, 140, 3, 0), + (13127, 3, 348, 1, 0), + (13127, 4, 138, 0, 0), + (13127, 5, 137, 0, 0), + (13130, 1, 264, 1440, 7003), + (13140, 1, 264, 480, 391), + (13141, 1, 264, 600, 391), + (13142, 1, 264, 720, 391), + (13143, 1, 127, 17, 0), + (13143, 2, 385, 8054, 0), + (13144, 1, 127, 34, 0), + (13144, 2, 385, 8054, 0), + (13145, 1, 127, 50, 0), + (13145, 2, 385, 8054, 0), + (13146, 1, 127, 17, 0), + (13146, 2, 385, 8054, 0), + (13147, 1, 127, 34, 0), + (13147, 2, 385, 8054, 0), + (13148, 1, 127, 50, 0), + (13148, 2, 385, 8054, 0), + (13149, 1, 97, 550, 0), + (13150, 1, 97, 600, 0), + (13151, 1, 97, 650, 0), + (13152, 1, 97, 700, 0), + (13153, 1, 97, 750, 0), + (13166, 1, 264, 5, 749), + (13166, 2, 264, 5, 822), + (13166, 3, 264, 5, 1274), + (13166, 4, 264, 5, 1275), + (13167, 1, 264, 10, 749), + (13167, 2, 264, 10, 822), + (13167, 3, 264, 10, 1274), + (13167, 4, 264, 10, 1275), + (13168, 1, 264, 15, 749), + (13168, 2, 264, 15, 822), + (13168, 3, 264, 15, 1274), + (13168, 4, 264, 15, 1275), + (13184, 1, 220, 315, 26), + (13185, 1, 220, 400, 26), + (13186, 1, 220, 500, 26), + (13187, 1, 405, 19, 0), + (13188, 1, 405, 21, 0), + (13189, 1, 405, 23, 0), + (13196, 1, 279, 31, 0), + (13197, 1, 279, 35, 0), + (13198, 1, 279, 39, 0), + (13199, 1, 378, 30, 31), + (13200, 1, 378, 35, 31), + (13201, 1, 378, 40, 31), + (13204, 1, 264, 180, 8261), + (13205, 1, 264, 360, 8261), + (13206, 1, 264, 540, 8261), + (13207, 1, 288, 100, 8), + (13208, 1, 288, 100, 8), + (13209, 1, 288, 100, 8), + (13210, 1, 325, 70, 0), + (13211, 1, 325, 75, 0), + (13212, 1, 325, 80, 0), + (13213, 1, 220, 285, 8), + (13214, 1, 220, 315, 8), + (13215, 1, 220, 350, 8), + (13216, 1, 220, 390, 8), + (13217, 1, 220, 440, 8), + (13218, 1, 216, 750, 8), + (13219, 1, 114, -12, 0), + (13220, 1, 114, -15, 0), + (13221, 1, 114, -18, 0), + (13222, 1, 310, 240000, 0), + (13222, 2, 139, 6197, 0), + (13222, 3, 411, 512, 0), + (13223, 1, 310, 300000, 0), + (13223, 2, 139, 6197, 0), + (13223, 3, 411, 512, 0), + (13226, 1, 360, 60, 27593), + (13238, 1, 320, 9, 0), + (13239, 1, 320, 10, 0), + (13240, 1, 320, 11, 0), + (13262, 1, 264, 1008, 102), + (13263, 1, 264, 1152, 102), + (13264, 1, 264, 1290, 102), + (13278, 1, 213, 25, 0), + (13281, 1, 318, 31, 0), + (13286, 1, 278, 900, 102200), + (13286, 2, 440, 92, 100), + (13294, 1, 339, 10, 8105), + (13294, 2, 142, 65, 0), + (13294, 3, 311, 0, 0), + (13294, 4, 134, 70, 0), + (13294, 5, 348, 10, 0), + (13294, 6, 137, 0, 0), + (13294, 7, 339, 10, 8105), + (13294, 8, 142, 65, 0), + (13294, 9, 311, 0, 0), + (13294, 10, 134, 70, 0), + (13294, 11, 348, 10, 0), + (13294, 12, 137, 100, 0), + (13294, 13, 339, 10, 8105), + (13294, 14, 142, 65, 0), + (13294, 15, 311, 0, 0), + (13294, 16, 134, 70, 0), + (13294, 17, 348, 10, 0), + (13294, 18, 137, 79, 0), + (13294, 19, 339, 10, 8105), + (13294, 20, 142, 65, 0), + (13294, 21, 311, 0, 0), + (13294, 22, 134, 70, 0), + (13294, 23, 348, 10, 0), + (13294, 24, 137, 147, 0), + (13294, 25, 339, 10, 11404), + (13294, 26, 142, 71, 0), + (13294, 27, 311, 0, 0), + (13294, 28, 134, 75, 0), + (13294, 29, 348, 10, 0), + (13294, 30, 137, 0, 0), + (13294, 31, 339, 10, 11404), + (13294, 32, 142, 71, 0), + (13294, 33, 311, 0, 0), + (13294, 34, 134, 75, 0), + (13294, 35, 348, 10, 0), + (13294, 36, 137, 100, 0), + (13294, 37, 339, 10, 11404), + (13294, 38, 142, 71, 0), + (13294, 39, 311, 0, 0), + (13294, 40, 134, 75, 0), + (13294, 41, 348, 10, 0), + (13294, 42, 137, 79, 0), + (13294, 43, 339, 10, 11404), + (13294, 44, 142, 71, 0), + (13294, 45, 311, 0, 0), + (13294, 46, 134, 75, 0), + (13294, 47, 348, 10, 0), + (13294, 48, 137, 147, 0), + (13294, 49, 339, 10, 13199), + (13294, 50, 142, 76, 0), + (13294, 51, 311, 0, 0), + (13294, 52, 134, 80, 0), + (13294, 53, 348, 10, 0), + (13294, 54, 137, 0, 0), + (13294, 55, 339, 10, 13199), + (13294, 56, 142, 76, 0), + (13294, 57, 311, 0, 0), + (13294, 58, 134, 80, 0), + (13294, 59, 348, 10, 0), + (13294, 60, 137, 100, 0), + (13294, 61, 339, 10, 13199), + (13294, 62, 142, 76, 0), + (13294, 63, 311, 0, 0), + (13294, 64, 134, 80, 0), + (13294, 65, 348, 10, 0), + (13294, 66, 137, 79, 0), + (13294, 67, 339, 10, 13199), + (13294, 68, 142, 76, 0), + (13294, 69, 311, 0, 0), + (13294, 70, 134, 80, 0), + (13294, 71, 348, 10, 0), + (13294, 72, 137, 147, 0), + (13294, 73, 339, 10, 13830), + (13294, 74, 142, 81, 0), + (13294, 75, 311, 0, 0), + (13294, 76, 134, 85, 0), + (13294, 77, 348, 10, 0), + (13294, 78, 137, 0, 0), + (13294, 79, 339, 10, 13830), + (13294, 80, 142, 81, 0), + (13294, 81, 311, 0, 0), + (13294, 82, 134, 85, 0), + (13294, 83, 348, 10, 0), + (13294, 84, 137, 100, 0), + (13294, 85, 339, 10, 13830), + (13294, 86, 142, 81, 0), + (13294, 87, 311, 0, 0), + (13294, 88, 134, 85, 0), + (13294, 89, 348, 10, 0), + (13294, 90, 137, 79, 0), + (13294, 91, 339, 10, 13830), + (13294, 92, 142, 81, 0), + (13294, 93, 311, 0, 0), + (13294, 94, 134, 85, 0), + (13294, 95, 348, 10, 0), + (13294, 96, 137, 147, 0), + (13294, 97, 339, 10, 27527), + (13294, 98, 142, 86, 0), + (13294, 99, 311, 0, 0), + (13294, 100, 134, 90, 0), + (13294, 101, 348, 10, 0), + (13294, 102, 137, 0, 0), + (13294, 103, 339, 10, 27527), + (13294, 104, 142, 86, 0), + (13294, 105, 311, 0, 0), + (13294, 106, 134, 90, 0), + (13294, 107, 348, 10, 0), + (13294, 108, 137, 100, 0), + (13294, 109, 339, 10, 27527), + (13294, 110, 142, 86, 0), + (13294, 111, 311, 0, 0), + (13294, 112, 134, 90, 0), + (13294, 113, 348, 10, 0), + (13294, 114, 137, 79, 0), + (13294, 115, 339, 10, 27527), + (13294, 116, 142, 86, 0), + (13294, 117, 311, 0, 0), + (13294, 118, 134, 90, 0), + (13294, 119, 348, 10, 0), + (13294, 120, 137, 147, 0), + (13294, 121, 339, 10, 30644), + (13294, 122, 142, 91, 0), + (13294, 123, 311, 0, 0), + (13294, 124, 134, 95, 0), + (13294, 125, 348, 10, 0), + (13294, 126, 137, 0, 0), + (13294, 127, 339, 10, 30644), + (13294, 128, 142, 91, 0), + (13294, 129, 311, 0, 0), + (13294, 130, 134, 95, 0), + (13294, 131, 348, 10, 0), + (13294, 132, 137, 100, 0), + (13294, 133, 339, 10, 30644), + (13294, 134, 142, 91, 0), + (13294, 135, 311, 0, 0), + (13294, 136, 134, 95, 0), + (13294, 137, 348, 10, 0), + (13294, 138, 137, 79, 0), + (13294, 139, 339, 10, 30644), + (13294, 140, 142, 91, 0), + (13294, 141, 311, 0, 0), + (13294, 142, 134, 95, 0), + (13294, 143, 348, 10, 0), + (13294, 144, 137, 147, 0), + (13295, 1, 339, 10, 8105), + (13295, 2, 142, 65, 0), + (13295, 3, 311, 0, 0), + (13295, 4, 134, 70, 0), + (13295, 5, 348, 10, 0), + (13295, 6, 137, 0, 0), + (13295, 7, 339, 10, 8105), + (13295, 8, 142, 65, 0), + (13295, 9, 311, 0, 0), + (13295, 10, 134, 70, 0), + (13295, 11, 348, 10, 0), + (13295, 12, 137, 100, 0), + (13295, 13, 339, 10, 8105), + (13295, 14, 142, 65, 0), + (13295, 15, 311, 0, 0), + (13295, 16, 134, 70, 0), + (13295, 17, 348, 10, 0), + (13295, 18, 137, 79, 0), + (13295, 19, 339, 10, 8105), + (13295, 20, 142, 65, 0), + (13295, 21, 311, 0, 0), + (13295, 22, 134, 70, 0), + (13295, 23, 348, 10, 0), + (13295, 24, 137, 147, 0), + (13295, 25, 339, 10, 11404), + (13295, 26, 142, 71, 0), + (13295, 27, 311, 0, 0), + (13295, 28, 134, 75, 0), + (13295, 29, 348, 10, 0), + (13295, 30, 137, 0, 0), + (13295, 31, 339, 10, 11404), + (13295, 32, 142, 71, 0), + (13295, 33, 311, 0, 0), + (13295, 34, 134, 75, 0), + (13295, 35, 348, 10, 0), + (13295, 36, 137, 100, 0), + (13295, 37, 339, 10, 11404), + (13295, 38, 142, 71, 0), + (13295, 39, 311, 0, 0), + (13295, 40, 134, 75, 0), + (13295, 41, 348, 10, 0), + (13295, 42, 137, 79, 0), + (13295, 43, 339, 10, 11404), + (13295, 44, 142, 71, 0), + (13295, 45, 311, 0, 0), + (13295, 46, 134, 75, 0), + (13295, 47, 348, 10, 0), + (13295, 48, 137, 147, 0), + (13295, 49, 339, 10, 13199), + (13295, 50, 142, 76, 0), + (13295, 51, 311, 0, 0), + (13295, 52, 134, 80, 0), + (13295, 53, 348, 10, 0), + (13295, 54, 137, 0, 0), + (13295, 55, 339, 10, 13199), + (13295, 56, 142, 76, 0), + (13295, 57, 311, 0, 0), + (13295, 58, 134, 80, 0), + (13295, 59, 348, 10, 0), + (13295, 60, 137, 100, 0), + (13295, 61, 339, 10, 13199), + (13295, 62, 142, 76, 0), + (13295, 63, 311, 0, 0), + (13295, 64, 134, 80, 0), + (13295, 65, 348, 10, 0), + (13295, 66, 137, 79, 0), + (13295, 67, 339, 10, 13199), + (13295, 68, 142, 76, 0), + (13295, 69, 311, 0, 0), + (13295, 70, 134, 80, 0), + (13295, 71, 348, 10, 0), + (13295, 72, 137, 147, 0), + (13295, 73, 339, 10, 13830), + (13295, 74, 142, 81, 0), + (13295, 75, 311, 0, 0), + (13295, 76, 134, 85, 0), + (13295, 77, 348, 10, 0), + (13295, 78, 137, 0, 0), + (13295, 79, 339, 10, 13830), + (13295, 80, 142, 81, 0), + (13295, 81, 311, 0, 0), + (13295, 82, 134, 85, 0), + (13295, 83, 348, 10, 0), + (13295, 84, 137, 100, 0), + (13295, 85, 339, 10, 13830), + (13295, 86, 142, 81, 0), + (13295, 87, 311, 0, 0), + (13295, 88, 134, 85, 0), + (13295, 89, 348, 10, 0), + (13295, 90, 137, 79, 0), + (13295, 91, 339, 10, 13830), + (13295, 92, 142, 81, 0), + (13295, 93, 311, 0, 0), + (13295, 94, 134, 85, 0), + (13295, 95, 348, 10, 0), + (13295, 96, 137, 147, 0), + (13295, 97, 339, 10, 27527), + (13295, 98, 142, 86, 0), + (13295, 99, 311, 0, 0), + (13295, 100, 134, 90, 0), + (13295, 101, 348, 10, 0), + (13295, 102, 137, 0, 0), + (13295, 103, 339, 10, 27527), + (13295, 104, 142, 86, 0), + (13295, 105, 311, 0, 0), + (13295, 106, 134, 90, 0), + (13295, 107, 348, 10, 0), + (13295, 108, 137, 100, 0), + (13295, 109, 339, 10, 27527), + (13295, 110, 142, 86, 0), + (13295, 111, 311, 0, 0), + (13295, 112, 134, 90, 0), + (13295, 113, 348, 10, 0), + (13295, 114, 137, 79, 0), + (13295, 115, 339, 10, 27527), + (13295, 116, 142, 86, 0), + (13295, 117, 311, 0, 0), + (13295, 118, 134, 90, 0), + (13295, 119, 348, 10, 0), + (13295, 120, 137, 147, 0), + (13295, 121, 339, 10, 30644), + (13295, 122, 142, 91, 0), + (13295, 123, 311, 0, 0), + (13295, 124, 134, 95, 0), + (13295, 125, 348, 10, 0), + (13295, 126, 137, 0, 0), + (13295, 127, 339, 10, 30644), + (13295, 128, 142, 91, 0), + (13295, 129, 311, 0, 0), + (13295, 130, 134, 95, 0), + (13295, 131, 348, 10, 0), + (13295, 132, 137, 100, 0), + (13295, 133, 339, 10, 30644), + (13295, 134, 142, 91, 0), + (13295, 135, 311, 0, 0), + (13295, 136, 134, 95, 0), + (13295, 137, 348, 10, 0), + (13295, 138, 137, 79, 0), + (13295, 139, 339, 10, 30644), + (13295, 140, 142, 91, 0), + (13295, 141, 311, 0, 0), + (13295, 142, 134, 95, 0), + (13295, 143, 348, 10, 0), + (13295, 144, 137, 147, 0), + (13296, 1, 125, 49, 49), + (13296, 2, 137, 0, 0), + (13296, 3, 141, 1, 0), + (13296, 4, 139, -6233, 0), + (13296, 5, 139, -6265, 0), + (13296, 6, 125, 49, 49), + (13296, 7, 137, 147, 0), + (13296, 8, 141, 1, 0), + (13297, 1, 125, 52, 52), + (13297, 2, 137, 0, 0), + (13297, 3, 141, 1, 0), + (13297, 4, 139, -6233, 0), + (13297, 5, 139, -6265, 0), + (13297, 6, 125, 52, 52), + (13297, 7, 137, 147, 0), + (13297, 8, 141, 1, 0), + (13299, 1, 319, 31, 0), + (13302, 1, 274, 44, 0), + (13305, 1, 189, 19, 0), + (13308, 1, 265, 87, 0), + (13313, 1, 15, 29, 0), + (13318, 1, 97, 850, 0), + (13323, 1, 320, 15, 0), + (13326, 1, 330, 155, 0), + (13326, 2, 330, 155, 1), + (13326, 3, 330, 155, 2), + (13326, 4, 330, 155, 3), + (13326, 5, 330, 155, 28), + (13326, 6, 330, 155, 36), + (13332, 1, 330, 155, 0), + (13332, 2, 330, 155, 1), + (13332, 3, 330, 155, 2), + (13332, 4, 330, 155, 3), + (13332, 5, 330, 155, 28), + (13332, 6, 330, 155, 36), + (13332, 7, 330, 155, 77), + (13338, 1, 1, 370, 0), + (13343, 1, 1, 340, 0), + (13348, 1, 1, 440, 0), + (13353, 1, 1, 330, 0), + (13358, 1, 1, 540, 0), + (13396, 1, 375, 40, 0), + (13404, 1, 273, 8, 0), + (13411, 1, 399, 4, 0), + (13411, 2, 138, 1, 0), + (13411, 3, 137, 0, 0), + (13411, 4, 348, 10, 0), + (13411, 5, 311, 0, 0), + (13411, 6, 141, 1, 0), + (13411, 7, 134, 254, 0), + (13411, 8, 137, -39, 0), + (13413, 1, 399, 12, 0), + (13413, 2, 141, 1, 0), + (13413, 3, 138, 0, 0), + (13413, 4, 142, 255, 0), + (13413, 5, 391, 0, 0), + (13413, 6, 311, 0, 0), + (13413, 7, 137, -152, 0), + (13413, 8, 411, 100350, 0), + (13413, 9, 137, -39, 0), + (13415, 1, 264, 150, 705), + (13415, 2, 264, 150, 1092), + (13415, 3, 264, 150, 10396), + (13415, 4, 264, 150, 10397), + (13416, 1, 264, 20, 626), + (13438, 1, 266, 29, 0), + (13449, 1, 264, 2, 11073), + (13463, 1, 264, 90, 458), + (13474, 1, 264, 120, 444), + (13477, 1, 126, 20, 0), + (13477, 2, 134, 95, 0), + (13477, 3, 135, 4, 0), + (13477, 4, 135, 5, 0), + (13485, 1, 279, 3, 0), + (13502, 1, 375, 160, 0), + (13508, 1, 378, 5, 3), + (13511, 1, 279, 43, 0), + (13520, 1, 292, 70, 0), + (13521, 1, 293, 25, 0), + (13533, 1, 378, 55, 96), + (13545, 1, 323, 30787, 0), + (13562, 1, 264, 480, 872), + (13565, 1, 264, 60, 3804), + (13568, 1, 264, 60, 876), + (13578, 1, 244, 30, 0), + (13589, 1, 279, 34, 0), + (13590, 1, 279, 38, 0), + (13598, 1, 339, 20, 30809), + (13598, 2, 137, 21, 0), + (13598, 3, 385, -18000, 0), + (13598, 4, 339, 20, 30809), + (13598, 5, 137, 343, 0), + (13598, 6, 385, -18000, 0), + (13601, 1, 231, 22, 0), + (13607, 1, 126, 4, 4), + (13607, 2, 137, 21, 0), + (13607, 3, 231, 4, 4), + (13610, 1, 266, 47, 0), + (13613, 1, 220, 260, 10), + (13616, 1, 220, 150, 2), + (13616, 2, 220, 150, 3), + (13616, 3, 220, 150, 77), + (13617, 1, 220, 375, 2), + (13617, 2, 220, 375, 3), + (13617, 3, 220, 375, 77), + (13618, 1, 220, 500, 2), + (13618, 2, 220, 500, 3), + (13618, 3, 220, 500, 77), + (13621, 1, 218, 11, 0), + (13627, 1, 59, -59, 0), + (13628, 1, 59, -64, 0), + (13630, 1, 398, 10000, 0), + (13630, 2, 137, 152, 0), + (13667, 1, 287, 1, 0), + (13667, 2, 385, 8054, 0), + (13675, 1, 218, 24, 0), + (13684, 1, 399, 2, 0), + (13684, 2, 140, 2, 0), + (13684, 3, 348, 10, 0), + (13684, 4, 138, 0, 0), + (13684, 5, 137, -152, 0), + (13684, 6, 137, -39, 0), + (13685, 1, 399, 3, 0), + (13685, 2, 140, 2, 0), + (13685, 3, 348, 10, 0), + (13685, 4, 138, 0, 0), + (13685, 5, 137, -152, 0), + (13685, 6, 137, -39, 0), + (13686, 1, 399, 4, 0), + (13686, 2, 140, 2, 0), + (13686, 3, 348, 10, 0), + (13686, 4, 138, 0, 0), + (13686, 5, 137, -152, 0), + (13686, 6, 137, -39, 0), + (13689, 1, 127, 10, 0), + (13689, 2, 139, 27592, 0), + (13689, 3, 139, 31548, 0), + (13707, 1, 274, 26, 0), + (13710, 1, 280, 65, 0), + (13713, 1, 218, 26, 0), + (13753, 1, 264, 360, 534), + (13758, 1, 264, 360, 602), + (13763, 1, 287, 4, 0), + (13763, 2, 137, 31, 0), + (13763, 3, 136, 5, 0), + (13764, 1, 264, 60, 535), + (13767, 1, 439, 0, 153514), + (13767, 2, 345, 90, 22), + (13773, 1, 279, 21, 0), + (13774, 1, 279, 23, 0), + (13775, 1, 279, 25, 0), + (13779, 1, 288, 100, 8), + (13782, 1, 220, 490, 8), + (13789, 1, 216, 850, 8), + (13790, 1, 216, 950, 8), + (13795, 1, 258, 73, 0), + (13798, 1, 114, -21, 0), + (13804, 1, 378, 4, 3), + (13813, 1, 220, 150, 28), + (13813, 2, 220, 150, 0), + (13813, 3, 427, 23598, 9), + (13813, 4, 428, 28, 0), + (13813, 5, 428, 0, 0), + (13820, 1, 220, 325, 26), + (13820, 2, 220, 325, 30), + (13820, 3, 220, 325, 38), + (13823, 1, 220, 295, 21), + (13823, 2, 220, 295, 23), + (13823, 3, 220, 670, 52), + (13823, 4, 220, 295, 28), + (13826, 1, 405, 25, 0), + (13829, 1, 220, 550, 26), + (13835, 1, 283, 300, 0), + (13841, 1, 264, 17, 469), + (13873, 1, 264, 30, 961), + (13878, 1, 264, 60, 609), + (13881, 1, 264, 60, 387), + (13884, 1, 265, 87, 0), + (13889, 1, 264, 60, 1012), + (13894, 1, 327, 13, 0), + (13905, 1, 310, 24000, 0), + (13905, 2, 385, 15319, 0), + (13908, 1, 310, 3000, 0), + (13908, 2, 385, 15307, 0), + (13908, 3, 385, 15407, 0), + (13908, 4, 385, 15507, 0), + (13908, 5, 385, 15607, 0), + (13911, 1, 310, 3000, 0), + (13911, 2, 385, 16005, 0), + (13911, 3, 310, 3000, 0), + (13911, 4, 385, 15405, 0), + (13911, 5, 385, 15505, 0), + (13911, 6, 385, 15605, 0), + (13911, 7, 411, 2, 0), + (13917, 1, 264, 120, 606), + (13921, 1, 114, -66, 0), + (13924, 1, 114, -64, 0), + (13927, 1, 114, -25, 0), + (13930, 1, 341, 310, 0), + (13933, 1, 262, 80, 0), + (13943, 1, 262, 80, 1), + (13953, 1, 262, 80, 2), + (13963, 1, 262, 80, 3), + (13973, 1, 262, 80, 4), + (13983, 1, 262, 80, 5), + (13993, 1, 262, 80, 6), + (14011, 1, 264, 30, 10394), + (14017, 1, 69, 10, 0), + (14018, 1, 69, 10, 0), + (14026, 1, 185, 3, 2), + (14026, 2, 185, 3, 3), + (14026, 3, 185, 3, 77), + (14026, 4, 220, 50, 2), + (14026, 5, 220, 50, 3), + (14026, 6, 220, 50, 77), + (14029, 1, 395, 5, 5), + (14029, 2, 385, 9758, 0), + (14029, 3, 385, 9858, 0), + (14029, 4, 385, 9958, 0), + (14032, 1, 181, 100, 0), + (14037, 1, 264, 180, 804), + (14040, 1, 264, 180, 300), + (14043, 1, 85, 32197, 0), + (14046, 1, 264, 90, 87), + (14056, 1, 310, 360000, 0), + (14056, 2, 139, 4504, 0), + (14059, 1, 310, -180000, 0), + (14059, 2, 139, 4520, 0), + (14062, 1, 264, 60, 821), + (14065, 1, 264, 60, 3215), + (14068, 1, 264, 60, 3216), + (14076, 1, 310, 480000, 0), + (14076, 2, 139, 4518, 0), + (14082, 1, 360, 26, 32314), + (14085, 1, 264, 2, 741), + (14088, 1, 264, 30, 769), + (14091, 1, 264, 120, 701), + (14094, 1, 124, 325, 350), + (14094, 2, 385, 19, 0), + (14094, 3, 144, 0, 0), + (14094, 4, 403, 3, 0), + (14094, 5, 404, 48, 0), + (14094, 6, 385, -21768, 0), + (14097, 1, 85, 32317, 5), + (14100, 1, 127, 50, 0), + (14100, 2, 137, 21, 0), + (14100, 3, 143, 1, 0), + (14100, 4, 134, 253, 0), + (14100, 5, 348, 1, 0), + (14101, 1, 310, 2520000, 0), + (14101, 2, 139, 4506, 0), + (14101, 3, 310, 2520000, 0), + (14101, 4, 385, 11122, 0), + (14101, 5, 385, 11222, 0), + (14101, 6, 385, 11322, 0), + (14101, 7, 385, 11522, 0), + (14115, 1, 287, 1, 0), + (14115, 2, 385, 16130, 0), + (14129, 1, 220, 60, 36), + (14129, 2, 427, 32327, 3), + (14129, 3, 428, 36, 0), + (14130, 1, 220, 90, 36), + (14130, 2, 427, 32327, 5), + (14130, 3, 428, 36, 0), + (14132, 1, 264, 240, 2234), + (14135, 1, 310, 132000, 0), + (14135, 2, 385, 13005, 0), + (14135, 3, 385, 12423, 0), + (14135, 4, 385, 12504, 0), + (14135, 5, 310, 132000, 0), + (14135, 6, 139, 4676, 0), + (14135, 7, 411, 512, 0), + (14138, 1, 310, 480000, 0), + (14138, 2, 139, 4695, 0), + (14138, 3, 411, 512, 0), + (14140, 1, 310, 24000, 0), + (14140, 2, 385, 13007, 0), + (14140, 3, 385, 12105, 0), + (14140, 4, 385, 12205, 0), + (14140, 5, 310, 72000, 0), + (14140, 6, 385, 12305, 0), + (14140, 7, 385, 12405, 0), + (14140, 8, 385, 12505, 0), + (14140, 9, 411, 512, 0), + (14141, 1, 185, 2, 36), + (14144, 1, 287, 1, 0), + (14144, 2, 385, 13204, 0), + (14144, 3, 411, 512, 0), + (14148, 1, 310, 90000, 0), + (14148, 2, 139, 4691, 0), + (14151, 1, 185, 2, 26), + (14151, 2, 220, 100, 26), + (14154, 1, 264, 2100, 276), + (14157, 1, 216, 150, 26), + (14160, 1, 264, 60, 7001), + (14163, 1, 287, 1, 0), + (14163, 2, 385, 16178, 0), + (14163, 3, 411, 128, 0), + (14166, 1, 264, 60, 945), + (14169, 1, 310, 202500, 0), + (14169, 2, 139, 8030, 0), + (14169, 3, 411, 256, 0), + (14173, 1, 310, 1440000, 0), + (14173, 2, 139, 4516, 0), + (14173, 3, 411, 256, 0), + (14176, 1, 264, 660, 8261), + (14179, 1, 287, 1, 0), + (14179, 2, 385, 5830, 0), + (14179, 3, 411, 256, 0), + (14180, 1, 287, 1, 0), + (14180, 2, 139, 8030, 0), + (14180, 3, 411, 256, 0), + (14181, 1, 247, 25, 20), + (14186, 1, 247, 25, 76), + (14196, 1, 264, 2340, 465), + (14199, 1, 264, 720, 499), + (14200, 1, 288, 15, 2), + (14200, 2, 288, 15, 3), + (14200, 3, 288, 15, 51), + (14200, 4, 288, 15, 77), + (14203, 1, 310, 150000, 0), + (14203, 2, 385, 3419, 0), + (14203, 3, 385, 14005, 0), + (14203, 4, 385, 3519, 0), + (14203, 5, 411, 65536, 0), + (14210, 1, 310, 40000, 0), + (14210, 2, 139, 1546, 0), + (14210, 3, 310, 40000, 0), + (14210, 4, 385, 4357, 0), + (14210, 5, 385, 4457, 0), + (14210, 6, 385, 4557, 0), + (14210, 7, 385, 4657, 0), + (14210, 8, 411, 4, 0), + (14213, 1, 264, 120, 1065), + (14218, 1, 232, 23, 4544), + (14223, 1, 264, 40, 47), + (14225, 1, 127, 16, 0), + (14225, 2, 385, 3283, 0), + (14225, 3, 411, 1024, 0), + (14238, 1, 264, 12, 1041), + (14241, 1, 264, 180, 386), + (14244, 1, 286, 100, 0), + (14244, 2, 138, 0, 0), + (14244, 3, 143, 1, 0), + (14244, 4, 348, 1, 0), + (14244, 5, 411, 64, 0), + (14249, 1, 392, 200, 0), + (14249, 2, 138, 1, 0), + (14249, 3, 348, 1, 0), + (14254, 1, 287, 1, 0), + (14254, 2, 385, 2025, 0), + (14254, 3, 385, 5121, 0), + (14254, 4, 385, 5221, 0), + (14254, 5, 385, 5562, 0), + (14259, 1, 287, 1, 0), + (14259, 2, 139, 23585, 0), + (14275, 1, 239, 20, 0), + (14278, 1, 287, 4, 0), + (14278, 2, 385, 16439, 0), + (14278, 3, 411, 32768, 0), + (14279, 1, 320, 8, 0), + (14283, 1, 127, 17, 0), + (14283, 2, 385, 3151, 0), + (14283, 3, 385, 5887, 0), + (14286, 1, 287, 1, 0), + (14286, 2, 385, 4877, 0), + (14289, 1, 127, 10, 0), + (14289, 2, 385, 2754, 0), + (14292, 1, 127, 10, 0), + (14292, 2, 385, 3286, 0), + (14295, 1, 264, 1, 3816), + (14301, 1, 405, 5, 0), + (14304, 1, 264, 45, 8341), + (14308, 1, 264, 20, 431), + (14311, 1, 264, 360, 430), + (14314, 1, 264, 8, 901), + (14318, 1, 127, 10, 0), + (14318, 2, 139, 21754, 0), + (14328, 1, 264, 6, 1154), + (14331, 1, 264, 120, 515), + (14341, 1, 264, 360, 748), + (14349, 1, 294, 0, 205), + (14361, 1, 294, 35, 109), + (14364, 1, 264, 90, 173), + (14367, 1, 445, 1, 0), + (14764, 1, 339, 10, 33950), + (14764, 2, 137, 31, 0), + (15074, 1, 264, 5, 15073), + (15100, 1, 264, 2, 467), + (15105, 1, 264, 120, 131), + (15108, 1, 310, 60000, 0), + (15108, 2, 385, 15521, 0), + (15108, 3, 411, 2, 0), + (15111, 1, 287, 1, 0), + (15111, 2, 385, 21778, 0), + (15113, 1, 287, 3, 0), + (15113, 2, 385, 21778, 0), + (15113, 3, 411, 2, 0), + (15120, 1, 264, 60, 800), + (15123, 1, 310, 120000, 0), + (15123, 2, 385, 15422, 0), + (15123, 3, 411, 2, 0), + (15126, 1, 310, 1000, 0), + (15126, 2, 385, 15212, 0), + (15126, 3, 411, 2, 0), + (15132, 1, 264, 10, 660), + (15135, 1, 287, 1, 0), + (15135, 2, 139, 32313, 0), + (15141, 1, 219, 420, 2400), + (15150, 1, 127, 10, 0), + (15150, 2, 385, 10505, 0), + (15150, 3, 385, 10105, 0), + (15150, 4, 385, 10205, 0), + (15150, 5, 385, 10305, 0), + (15150, 6, 385, 10405, 0), + (15150, 7, 385, 10605, 0), + (15153, 1, 287, 1, 0), + (15153, 2, 139, 4518, 0), + (15154, 1, 287, 1, 0), + (15154, 2, 139, 32312, 0), + (15155, 1, 287, 1, 0), + (15155, 2, 385, 10320, 0), + (15155, 3, 385, 10420, 0), + (15155, 4, 385, 10520, 0), + (15158, 1, 287, 1, 0), + (15158, 2, 385, 32307, 0), + (15159, 1, 287, 1, 0), + (15159, 2, 385, 27537, 0), + (15162, 1, 264, 120, 659), + (15168, 1, 264, 60, 657), + (15172, 1, 302, 430, 430), + (15172, 2, 385, 99, 0), + (15174, 1, 264, 40, 9400), + (15179, 1, 127, 10, 0), + (15179, 2, 139, 21804, 0), + (15179, 3, 139, 38280, 0), + (15182, 1, 264, 840, 9403), + (15188, 1, 239, 62, 0), + (15194, 1, 287, 1, 0), + (15194, 2, 385, 13407, 0), + (15194, 3, 385, 13507, 0), + (15204, 1, 264, 60, 390), + (15207, 1, 264, 60, 323), + (15217, 1, 339, 10, 38319), + (15217, 2, 385, 11006, 0), + (15217, 3, 385, 7108, 0), + (15217, 4, 385, 7208, 0), + (15217, 5, 385, 7308, 0), + (15217, 6, 385, 7408, 0), + (15217, 7, 385, 7508, 0), + (15217, 8, 385, 7608, 0), + (15220, 1, 287, 1, 0), + (15220, 2, 385, 11065, 0), + (15223, 1, 287, 1, 0), + (15223, 2, 385, 11067, 0), + (15226, 1, 287, 1, 0), + (15226, 2, 385, 11064, 0), + (15229, 1, 287, 1, 0), + (15229, 2, 385, 11066, 0), + (15232, 1, 339, 100, 38322), + (15232, 2, 385, 7518, 0), + (15238, 1, 264, 240, 621), + (15238, 2, 264, 240, 622), + (15238, 3, 264, 240, 623), + (15238, 4, 264, 240, 784), + (15238, 5, 264, 240, 785), + (15238, 6, 264, 240, 786), + (15238, 7, 264, 240, 787), + (15238, 8, 264, 240, 624), + (15253, 1, 127, 10, 0), + (15253, 2, 385, 32322, 0), + (15258, 1, 264, 540, 184), + (15270, 1, 264, 1980, 7003), + (15280, 1, 264, 720, 778), + (15283, 1, 310, 1000, 0), + (15283, 2, 385, 11402, 0), + (15283, 3, 385, 11502, 0), + (15283, 4, 385, 11441, 0), + (15283, 5, 385, 11541, 0), + (15283, 6, 385, 11641, 0), + (15288, 1, 220, 50, 0), + (15288, 2, 220, 50, 1), + (15288, 3, 220, 100, 2), + (15288, 4, 220, 100, 3), + (15288, 5, 220, 50, 36), + (15288, 6, 220, 100, 77), + (15295, 1, 127, 10, 0), + (15295, 2, 385, 21654, 0), + (15314, 1, 264, 25920, 36), + (15317, 1, 264, 1728, 35), + (15320, 1, 264, 150, 558), + (15328, 1, 339, 25, 38037), + (15328, 2, 138, 1, 0), + (15328, 3, 142, 65, 0), + (15328, 4, 137, 35, 0), + (15328, 5, 134, 90, 0), + (15328, 6, 339, 25, 38037), + (15328, 7, 138, 1, 0), + (15328, 8, 142, 65, 0), + (15328, 9, 137, 36, 0), + (15328, 10, 134, 90, 0), + (15328, 11, 339, 25, 38037), + (15328, 12, 138, 1, 0), + (15328, 13, 142, 65, 0), + (15328, 14, 137, 369, 0), + (15328, 15, 134, 90, 0), + (15328, 16, 339, 25, 38037), + (15328, 17, 138, 1, 0), + (15328, 18, 142, 65, 0), + (15328, 19, 137, 116, 0), + (15328, 20, 134, 90, 0), + (15342, 1, 287, 1, 0), + (15342, 2, 385, 23605, 0), + (15344, 1, 264, 360, 38), + (15348, 1, 264, 240, 9504), + (15356, 1, 232, 20, 4544), + (15358, 1, 287, 1, 0), + (15358, 2, 385, 32350, 0), + (15359, 1, 264, 960, 50), + (15363, 1, 264, 240, 447), + (15371, 1, 264, 1, 3729), + (15374, 1, 195, 20, 0), + (15383, 1, 310, 1000, 0), + (15383, 2, 385, 5132, 0), + (15383, 3, 385, 5232, 0), + (15383, 4, 385, 5332, 0), + (15383, 5, 385, 5432, 0), + (15383, 6, 385, 5532, 0), + (15383, 7, 385, 5032, 0), + (15383, 8, 385, 5632, 0), + (15389, 1, 127, 16, 0), + (15389, 2, 385, 23575, 0), + (15396, 1, 127, 20, 20), + (15396, 2, 137, 0, 0), + (15396, 3, 138, 0, 0), + (15396, 4, 141, 1, 0), + (15396, 5, 143, 3000, 0), + (15396, 6, 127, 20, 20), + (15396, 7, 385, 16555, 0), + (15396, 8, 385, 16655, 0), + (15397, 1, 264, 1260, 494), + (15403, 1, 264, 10, 8604), + (15406, 1, 127, 10, 10), + (15406, 2, 385, 37097, 0), + (15414, 1, 287, 1, 0), + (15414, 2, 139, 30736, 0), + (15421, 1, 264, 3600, 245), + (15422, 1, 132, 15, 15), + (15426, 1, 239, 62, 0), + (15429, 1, 220, 135, 2), + (15432, 1, 184, 5, -1), + (15438, 1, 310, 180000, 0), + (15438, 2, 385, 8316, 0), + (15438, 3, 411, 128, 0), + (15441, 1, 279, 38, 0), + (15444, 1, 288, 60, 26), + (15450, 1, 310, 3000, 0), + (15450, 2, 385, 8202, 0), + (15450, 3, 385, 8302, 0), + (15450, 4, 385, 8402, 0), + (15450, 5, 385, 8502, 0), + (15450, 6, 385, 8602, 0), + (15450, 7, 411, 128, 0), + (15453, 1, 310, 60000, 0), + (15453, 2, 385, 8421, 0), + (15453, 3, 411, 128, 0), + (15456, 1, 264, 5, 470), + (15466, 1, 126, 20, 20), + (15466, 2, 139, 12576, 0), + (15466, 3, 126, 20, 20), + (15466, 4, 139, 12828, 0), + (15469, 1, 264, 240, 1120), + (15472, 1, 264, 1260, 521), + (15478, 1, 264, 120, 578), + (15485, 1, 339, 10, 38417), + (15485, 2, 142, 96, 0), + (15485, 3, 311, 0, 0), + (15485, 4, 134, 105, 0), + (15485, 5, 348, 10, 0), + (15485, 6, 137, 0, 0), + (15485, 7, 339, 10, 38417), + (15485, 8, 142, 96, 0), + (15485, 9, 311, 0, 0), + (15485, 10, 134, 105, 0), + (15485, 11, 348, 10, 0), + (15485, 12, 137, 100, 0), + (15485, 13, 339, 10, 38417), + (15485, 14, 142, 96, 0), + (15485, 15, 311, 0, 0), + (15485, 16, 134, 105, 0), + (15485, 17, 348, 10, 0), + (15485, 18, 137, 79, 0), + (15485, 19, 339, 10, 38417), + (15485, 20, 142, 96, 0), + (15485, 21, 311, 0, 0), + (15485, 22, 134, 105, 0), + (15485, 23, 348, 10, 0), + (15485, 24, 137, 147, 0), + (15493, 1, 127, 10, 0), + (15493, 2, 137, 31, 0), + (15502, 1, 310, 240000, 0), + (15502, 2, 139, 4673, 0), + (15502, 3, 411, 512, 0), + (15509, 1, 310, 3000, 0), + (15509, 2, 385, 12315, 0), + (15509, 3, 385, 12415, 0), + (15509, 4, 385, 12515, 0), + (15509, 5, 385, 12615, 0), + (15509, 10, 411, 512, 0), + (15512, 1, 288, 50, 8), + (15516, 1, 126, 20, 0), + (15516, 2, 139, 3066, 0), + (15516, 3, 411, 256, 0), + (15517, 1, 127, 16, 0), + (15517, 2, 139, 3066, 0), + (15517, 3, 411, 256, 0), + (15526, 1, 264, 120, 3702), + (15529, 1, 247, 60, 53), + (15540, 1, 185, 5, 1), + (15543, 1, 185, 5, 0), + (15546, 1, 185, 5, 36), + (15549, 1, 264, 15, 244), + (15552, 1, 264, 840, 3710), + (15555, 1, 339, 5, 38103), + (15555, 2, 385, 3208, 0), + (15555, 3, 385, 3308, 0), + (15555, 4, 385, 3408, 0), + (15555, 5, 385, 3508, 0), + (15564, 1, 220, 68, 51), + (15571, 1, 264, 180, 351), + (15579, 1, 287, 2, 0), + (15579, 2, 139, 16106, 0), + (15585, 1, 274, 44, 0), + (15591, 1, 127, 10, 0), + (15591, 2, 139, 16839, 0), + (15598, 1, 264, 180, 759), + (15598, 2, 264, 180, 1150), + (15598, 3, 264, 180, 1151), + (15598, 4, 264, 180, 1152), + (15602, 1, 124, 1, 0), + (15602, 2, 138, 0, 0), + (15602, 3, 141, 1, 0), + (15602, 4, 348, 10, 0), + (15606, 1, 244, -25, 0), + (15609, 1, 383, 10, 38134), + (15609, 2, 141, 1, 0), + (15609, 3, 348, 10, 0), + (15609, 4, 142, 85, 0), + (15609, 5, 143, 3000, 0), + (15622, 1, 127, 5, 5), + (15622, 2, 137, 0, 0), + (15622, 3, 138, 0, 0), + (15622, 4, 141, 1, 0), + (15625, 1, 330, 10, 8), + (15632, 1, 264, 1728, 789), + (15634, 1, 310, 1500, 0), + (15634, 2, 385, 12110, 0), + (15634, 3, 385, 12210, 0), + (15634, 4, 385, 12310, 0), + (15634, 5, 385, 12410, 0), + (15634, 6, 385, 12510, 0), + (15635, 1, 310, 3000, 0), + (15635, 2, 385, 12110, 0), + (15635, 3, 385, 12210, 0), + (15635, 4, 385, 12310, 0), + (15635, 5, 385, 12410, 0), + (15635, 6, 385, 12510, 0), + (15648, 1, 185, 3, 74), + (15694, 1, 190, 550, 0), + (15714, 1, 320, 12, 0), + (15719, 1, 320, 12, 0), + (15746, 1, 421, 20, 0), + (15746, 2, 139, 16097, 0), + (15746, 3, 139, 23612, 0), + (15746, 4, 139, 32196, 0), + (15746, 5, 139, 32565, 0), + (15746, 6, 423, 6, 0), + (15746, 7, 422, 5, 0), + (15746, 8, 411, 2, 0), + (15768, 1, 125, 1, 2), + (15768, 2, 136, 46, 0), + (15772, 1, 128, 80, 80), + (15772, 2, 138, 1, 0), + (15772, 3, 140, 1, 0), + (15772, 4, 311, 0, 0), + (15772, 5, 411, 66434, 0), + (15772, 6, 137, -40, 0), + (15773, 1, 128, 80, 80), + (15773, 2, 138, 1, 0), + (15773, 3, 140, 1, 0), + (15773, 4, 311, 0, 0), + (15773, 5, 411, 256, 0), + (15773, 6, 137, -40, 0), + (15773, 7, 391, 1, 0), + (15778, 1, 303, 27500, 32500), + (15778, 2, 139, 2766, 0), + (15833, 1, 264, 60, 2045), + (15836, 1, 264, 60, 463), + (15891, 1, 264, 20, 988), + (15893, 1, 264, 20, 987), + (15895, 1, 264, 20, 986), + (15908, 1, 220, 125, 0), + (15908, 2, 220, 200, 2), + (15909, 1, 220, 155, 0), + (15909, 2, 220, 290, 2), + (15910, 1, 220, 185, 0), + (15910, 2, 220, 385, 2), + (15954, 1, 292, 49, 0), + (15961, 1, 129, 20, 0), + (15961, 2, 385, 12768, 0), + (15961, 3, 411, 256, 0), + (16062, 1, 339, 20, 40941), + (16062, 2, 138, 0, 0), + (16062, 3, 137, 31, 0), + (16062, 4, 311, 0, 0), + (16084, 1, 158, 1, 0), + (16087, 1, 264, 432, 53), + (16094, 1, 264, 3024, 43), + (16104, 1, 10, 0, 0), + (16109, 1, 69, 3000, 0), + (16114, 1, 114, 2, 0), + (16117, 1, 171, 2, 0), + (16120, 1, 226, 1, 0), + (16121, 1, 310, 840000, 0), + (16121, 2, 139, 4670, 0), + (16124, 1, 264, 2, 3711), + (16128, 1, 127, 8, 0), + (16128, 2, 139, 13143, 0), + (16131, 1, 130, 10, 0), + (16131, 2, 385, 18000, 0), + (16137, 1, 287, 1, 0), + (16137, 2, 385, 21821, 0), + (16140, 1, 287, 1, 0), + (16140, 2, 385, 30666, 0), + (16146, 1, 339, 2, 41107), + (16146, 2, 142, 95, 0), + (16146, 3, 138, 1, 0), + (16146, 4, 137, 0, 0), + (16146, 5, 348, 10, 0), + (16146, 6, 141, 1, 0), + (16149, 1, 129, 20, 0), + (16149, 2, 385, 4357, 0), + (16149, 3, 385, 4457, 0), + (16149, 4, 385, 4557, 0), + (16149, 5, 411, 4, 0), + (16152, 1, 339, 3, 41108), + (16152, 2, 142, 90, 0), + (16152, 3, 138, 0, 0), + (16152, 4, 137, 0, 0), + (16152, 5, 348, 10, 0), + (16152, 6, 141, 1, 0), + (16156, 1, 392, 1000, 0), + (16156, 2, 385, 32341, 0), + (16159, 1, 287, 1, 0), + (16159, 2, 385, 32307, 0), + (16164, 1, 294, 0, 195), + (16170, 1, 360, 70, 41119), + (16173, 1, 320, 12, 0), + (16176, 1, 264, 2, 337), + (16179, 1, 288, 8, 7), + (16180, 1, 264, 5, 584), + (16186, 1, 288, 100, 30), + (16189, 1, 339, 12, 41127), + (16189, 2, 138, 0, 0), + (16189, 3, 142, 70, 0), + (16189, 4, 411, 32, 0), + (16189, 5, 348, 1, 0), + (16189, 6, 141, 1, 0), + (16192, 1, 339, 12, 41130), + (16192, 2, 138, 0, 0), + (16192, 3, 142, 70, 0), + (16192, 4, 403, 4, 0), + (16192, 5, 348, 1, 0), + (16192, 6, 404, 2, 0), + (16192, 7, 141, 1, 0), + (16208, 1, 247, 5, 27), + (16211, 1, 287, 1, 0), + (16211, 2, 139, 23581, 0), + (16211, 3, 139, 32359, 0), + (16218, 1, 264, 10, 403), + (16221, 1, 287, 1, 0), + (16221, 2, 385, 23586, 0), + (16225, 1, 264, 1, 219), + (16230, 1, 310, 1000, 0), + (16230, 2, 385, 2431, 0), + (16230, 3, 385, 2531, 0), + (16230, 4, 385, 2545, 0), + (16230, 5, 385, 2631, 0), + (16235, 1, 126, 35, 0), + (16235, 2, 134, 100, 0), + (16235, 3, 135, 3, 0), + (16238, 1, 287, 2, 0), + (16238, 2, 385, 23693, 0), + (16238, 3, 460, 1, 0), + (16249, 1, 275, 100, 0), + (16257, 1, 429, 37114, 2), + (16257, 2, 428, 52, 0), + (16260, 1, 427, 41160, 3), + (16260, 2, 428, 23, 0), + (16266, 1, 224, 50, 8), + (16266, 2, 173, 4, 0), + (16267, 1, 250, 52, 0), + (16272, 1, 175, 2, 0), + (16276, 1, 247, 10, 36), + (16287, 1, 264, 20, 669), + (16297, 1, 264, 600, 553), + (16300, 1, 264, 60, 668), + (16303, 1, 264, 240, 3506), + (16306, 1, 264, 1260, 777), + (16317, 1, 220, 100, -1), + (16327, 1, 310, 720000, 0), + (16327, 2, 139, 5040, 0), + (16330, 1, 330, 105, 74), + (16336, 1, 264, 30, 1257), + (16339, 1, 264, 10, 773), + (16342, 1, 127, 10, 0), + (16342, 2, 385, 38115, 0), + (16361, 1, 399, 5, 0), + (16361, 2, 141, 1, 0), + (16361, 3, 138, 0, 0), + (16361, 4, 134, 254, 0), + (16361, 5, 348, 10, 0), + (16361, 6, 137, 0, 0), + (16361, 7, 311, 0, 0), + (16361, 8, 137, -152, 0), + (16361, 9, 137, -39, 0), + (16366, 1, 286, 200, 0), + (16366, 2, 138, 0, 0), + (16366, 3, 143, 1, 0), + (16366, 4, 348, 10, 0), + (16371, 1, 129, 20, 0), + (16371, 2, 385, 2754, 0), + (16380, 1, 264, 30, 2061), + (16386, 1, 264, 10, 2064), + (16392, 1, 264, 90, 2202), + (16396, 1, 127, 5, 5), + (16396, 2, 137, 0, 0), + (16396, 3, 138, 0, 0), + (16396, 4, 141, 1, 0), + (16402, 1, 131, 60, 60), + (16402, 2, 348, 10, 0), + (16402, 3, 137, -32, 0), + (16414, 1, 317, 16, 0), + (16419, 1, 426, 6, 0), + (16420, 1, 426, 7, 0), + (16421, 1, 426, 8, 0), + (16440, 1, 247, 65, 76), + (16475, 1, 218, 4, 0), + (16489, 1, 294, 29, 102), + (16536, 1, 405, 3, 0), + (16604, 1, 264, 1440, 180), + (16644, 1, 264, 60, 747), + (16666, 1, 264, 60, 742), + (16730, 1, 347, 31, 0), + (16745, 1, 264, 60, 706), + (16887, 1, 280, 75, 0), + (16890, 1, 218, 21, 0), + (17004, 1, 225, 35, 0), + (17206, 1, 264, 12, 601), + (17209, 1, 264, 180, 111), + (17212, 1, 264, 60, 10367), + (17215, 1, 378, 2, 22), + (17215, 2, 378, 2, 31), + (17215, 3, 378, 2, 3), + (17215, 4, 378, 2, 20), + (17218, 1, 127, 10, 0), + (17218, 2, 139, 27560, 0), + (17229, 1, 220, 900, 3), + (17229, 2, 220, 900, 2), + (17229, 3, 220, 900, 77), + (17235, 1, 127, 15, 0), + (17235, 2, 385, 12609, 0), + (17239, 1, 310, 2400000, 0), + (17239, 2, 139, 4500, 0), + (17239, 3, 411, 8, 0), + (17242, 1, 378, 1, 22), + (17242, 2, 378, 1, 31), + (17242, 3, 378, 1, 3), + (17242, 4, 378, 1, 20), + (17245, 1, 378, 1, 22), + (17245, 2, 378, 1, 31), + (17245, 3, 378, 1, 3), + (17245, 4, 378, 1, 20), + (17249, 1, 264, 120, 651), + (17252, 1, 310, 3000, 0), + (17252, 2, 385, 13438, 0), + (17252, 3, 385, 13538, 0), + (17252, 4, 385, 13638, 0), + (17258, 1, 399, 2, 0), + (17258, 2, 137, 457, 0), + (17258, 3, 399, 2, 0), + (17258, 4, 134, 253, 0), + (17258, 5, 142, 100, 0), + (17258, 6, 138, 0, 0), + (17258, 7, 136, 13, 0), + (17258, 8, 136, 20, 0), + (17258, 9, 137, -39, 0), + (17267, 1, 127, 10, 0), + (17267, 2, 385, 13507, 0), + (17267, 3, 385, 13107, 0), + (17267, 4, 385, 13207, 0), + (17267, 5, 385, 13307, 0), + (17267, 6, 385, 13407, 0), + (17267, 7, 385, 13607, 0), + (17281, 1, 287, 1, 0), + (17281, 2, 385, 16646, 0), + (17288, 1, 264, 1440, 41), + (17289, 1, 264, 180, 1062), + (17295, 1, 229, 62, 0), + (17307, 1, 127, 8, 0), + (17307, 2, 139, 38058, 0), + (17310, 1, 310, 14000, 0), + (17310, 2, 139, 8007, 0), + (17310, 3, 310, 14000, 0), + (17310, 4, 385, 4140, 0), + (17310, 5, 385, 4240, 0), + (17310, 6, 385, 4340, 0), + (17310, 7, 385, 4440, 0), + (17310, 8, 385, 4540, 0), + (17310, 9, 385, 4640, 0), + (17317, 1, 264, 60, 1270), + (17334, 1, 287, 12, 0), + (17334, 2, 385, 16188, 0), + (17336, 1, 287, 1, 0), + (17336, 2, 385, 32348, 0), + (17339, 1, 264, 12, 760), + (17350, 1, 264, 110, 170), + (17357, 1, 287, 1, 0), + (17357, 2, 137, 100, 0), + (17357, 3, 138, 1, 0), + (17361, 1, 264, 60, 405), + (17361, 2, 264, 60, 426), + (17365, 1, 287, 6, 0), + (17365, 2, 385, 5240, 0), + (17365, 3, 385, 5340, 0), + (17365, 4, 385, 5440, 0), + (17365, 5, 385, 5540, 0), + (17365, 6, 385, 5640, 0), + (17370, 1, 287, 1, 0), + (17370, 2, 138, 0, 0), + (17370, 3, 137, 0, 0), + (17370, 4, 137, 100, 0), + (17370, 5, 140, 1, 0), + (17370, 6, 348, 10, 0), + (17375, 1, 127, 10, 0), + (17375, 2, 385, 38078, 0), + (17391, 1, 264, 1560, 98), + (17406, 1, 310, 480000, 0), + (17406, 2, 139, 4502, 0), + (17406, 3, 139, 4509, 0), + (17409, 1, 214, 205, 0), + (17409, 2, 259, 4, 0), + (17409, 3, 172, 4, 0), + (17414, 1, 264, 120, 673), + (17418, 1, 247, 10, 74), + (17428, 1, 288, 5, 51), + (17436, 1, 264, 60, 372), + (17439, 1, 287, 1, 0), + (17439, 2, 385, 6040, 0), + (17441, 1, 279, 37, 0), + (17445, 1, 310, 60000, 0), + (17445, 2, 385, 3312, 0), + (17448, 1, 287, 1, 0), + (17448, 2, 385, 14005, 0), + (17448, 3, 385, 3519, 0), + (17476, 1, 264, 240, 462), + (17492, 1, 264, 120, 840), + (17495, 1, 264, 20, 9702), + (17515, 1, 127, 25, 0), + (17515, 2, 385, 7125, 0), + (17517, 1, 127, 17, 0), + (17517, 2, 385, 23683, 0), + (17517, 3, 460, 1, 0), + (17522, 1, 264, 30, 764), + (17533, 1, 287, 1, 0), + (17533, 2, 139, 32399, 0), + (17533, 3, 460, 1, 0), + (17547, 1, 287, 1, 0), + (17547, 2, 137, 0, 0), + (17547, 3, 137, 100, 0), + (17547, 4, 140, 2, 0), + (17547, 5, 138, 0, 0), + (17547, 6, 348, 10, 0), + (17549, 1, 264, 10, 8700), + (17553, 1, 339, 8, 41768), + (17553, 2, 138, 0, 0), + (17553, 3, 141, 1, 0), + (17553, 4, 134, 253, 0), + (17553, 5, 142, 85, 0), + (17553, 6, 143, 1, 0), + (17553, 7, 311, 0, 0), + (17553, 8, 348, 1, 0), + (17553, 9, 137, 0, 0), + (17554, 1, 227, 2, 74), + (17555, 1, 286, 126, 2), + (17555, 2, 385, 9606, 0), + (17555, 3, 303, 252, 0), + (17555, 4, 385, 9606, 0), + (17558, 1, 413, 2, 2), + (17558, 2, 385, 9603, 0), + (17558, 3, 411, 2048, 0), + (17561, 1, 413, 2, 2), + (17561, 2, 385, 9609, 0), + (17561, 3, 411, 2048, 0), + (17564, 1, 413, 2, 2), + (17564, 2, 385, 9619, 0), + (17564, 3, 411, 2048, 0), + (17567, 1, 413, 2, 2), + (17567, 2, 385, 9613, 0), + (17567, 3, 411, 2048, 0), + (17570, 1, 413, 2, 2), + (17570, 2, 385, 9604, 0), + (17570, 3, 411, 2048, 0), + (17573, 1, 413, 2, 2), + (17573, 2, 385, 9651, 0), + (17573, 3, 411, 2048, 0), + (17576, 1, 413, 2, 2), + (17576, 2, 385, 16652, 0), + (17576, 3, 411, 4096, 0), + (17579, 1, 413, 2, 2), + (17579, 2, 385, 16629, 0), + (17579, 3, 411, 4096, 0), + (17582, 1, 413, 2, 2), + (17582, 2, 385, 16650, 0), + (17582, 3, 411, 4096, 0), + (17585, 1, 413, 2, 2), + (17585, 2, 385, 16608, 0), + (17585, 3, 411, 4096, 0), + (17588, 1, 413, 2, 2), + (17588, 2, 385, 16615, 0), + (17588, 3, 411, 4096, 0), + (17591, 1, 413, 2, 2), + (17591, 2, 385, 16618, 0), + (17591, 3, 411, 4096, 0), + (17594, 1, 413, 2, 2), + (17594, 2, 385, 16625, 0), + (17594, 3, 411, 4096, 0), + (17597, 1, 286, 345, 0), + (17597, 2, 385, 7604, 0), + (17600, 1, 413, 2, 2), + (17600, 2, 385, 7608, 0), + (17600, 3, 411, 8192, 0), + (17603, 1, 413, 2, 2), + (17603, 2, 385, 7612, 0), + (17603, 3, 411, 8192, 0), + (17606, 1, 392, 419, 0), + (17606, 2, 385, 7613, 0), + (17606, 3, 396, 838, 0), + (17606, 4, 385, 7613, 0), + (17609, 1, 413, 2, 2), + (17609, 2, 385, 7636, 0), + (17609, 3, 411, 8192, 0), + (17612, 1, 413, 2, 2), + (17612, 2, 385, 7618, 0), + (17612, 3, 411, 8192, 0), + (17615, 1, 286, 539, 0), + (17615, 2, 385, 7638, 0), + (17618, 1, 413, 2, 2), + (17618, 2, 385, 6664, 0), + (17618, 3, 411, 16384, 0), + (17621, 1, 413, 2, 2), + (17621, 2, 385, 6648, 0), + (17621, 3, 411, 16384, 0), + (17624, 1, 413, 2, 2), + (17624, 2, 385, 6649, 0), + (17624, 3, 411, 16384, 0), + (17627, 1, 413, 2, 2), + (17627, 2, 385, 6611, 0), + (17627, 3, 411, 16384, 0), + (17630, 1, 413, 2, 2), + (17630, 2, 385, 6652, 0), + (17630, 3, 411, 16384, 0), + (17633, 1, 413, 2, 2), + (17633, 2, 385, 6655, 0), + (17633, 3, 411, 16384, 0), + (17639, 1, 323, 37182, 100), + (18972, 1, 214, 210, 0), + (18972, 2, 259, 5, 0), + (18972, 3, 172, 5, 0), + (30050, 1, 69, 25, 0), + (30050, 2, 97, 25, 0), + (30050, 3, 190, 25, 0), + (30050, 4, 328, 25, 0), + (30100, 1, 1, 10, 0), + (30100, 2, 2, 10, 0), + (30100, 3, 341, 10, 0), + (30150, 1, 262, 5, 0), + (30150, 2, 262, 5, 1), + (30150, 3, 262, 5, 2), + (30150, 4, 262, 5, 3), + (30150, 5, 262, 5, 4), + (30150, 6, 262, 5, 5), + (30150, 7, 262, 5, 6), + (30150, 8, 159, 5, 0), + (30150, 9, 0, 2, 0), + (30150, 10, 15, 2, 0), + (30150, 11, 189, 2, 0), + (30150, 12, 317, 2, 0), + (30150, 13, 318, 2, 0), + (30175, 1, 271, 1, 0), + (30180, 1, 264, 1, 8202), + (30185, 1, 264, 1, 1011), + (30195, 1, 432, 1, 0), + (49999, 1, 10, 0, 0); + +DROP TABLE IF EXISTS `aa_rank_prereqs`; +CREATE TABLE IF NOT EXISTS `aa_rank_prereqs` ( + `rank_id` int(10) unsigned NOT NULL, + `aa_id` int(10) NOT NULL, + `points` int(10) NOT NULL, + PRIMARY KEY (`rank_id`,`aa_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +INSERT INTO `aa_rank_prereqs` (`rank_id`, `aa_id`, `points`) VALUES + (129, 19, 3), + (131, 19, 3), + (136, 19, 3), + (141, 23, 3), + (142, 23, 3), + (143, 23, 3), + (146, 224, 3), + (162, 224, 3), + (190, 30, 3), + (191, 30, 3), + (192, 30, 3), + (195, 31, 3), + (230, 17, 3), + (231, 17, 3), + (232, 17, 3), + (255, 309, 3), + (256, 309, 3), + (257, 309, 3), + (260, 31, 3), + (261, 31, 3), + (262, 31, 3), + (263, 17, 3), + (264, 17, 3), + (265, 17, 3), + (267, 23, 3), + (268, 23, 3), + (269, 23, 3), + (446, 26, 3), + (447, 26, 3), + (448, 26, 3), + (462, 39, 1), + (463, 39, 1), + (464, 39, 1), + (468, 41, 1), + (469, 41, 1), + (470, 41, 1), + (471, 57, 1), + (472, 57, 1), + (473, 57, 1), + (474, 50, 1), + (475, 50, 1), + (476, 50, 1), + (477, 43, 1), + (478, 43, 1), + (479, 43, 1), + (480, 117, 1), + (481, 117, 1), + (482, 117, 1), + (483, 58, 1), + (484, 58, 1), + (485, 58, 1), + (489, 110, 1), + (490, 110, 1), + (491, 110, 1), + (492, 109, 1), + (493, 109, 1), + (494, 109, 1), + (495, 98, 1), + (496, 98, 1), + (497, 98, 1), + (498, 102, 1), + (499, 102, 1), + (500, 102, 1), + (501, 107, 1), + (502, 107, 1), + (503, 107, 1), + (531, 19, 3), + (532, 19, 3), + (534, 6001, 11), + (535, 6001, 11), + (536, 6001, 11), + (537, 112, 3), + (538, 112, 3), + (539, 17, 3), + (540, 17, 3), + (541, 17, 3), + (542, 309, 3), + (543, 309, 3), + (544, 309, 3), + (567, 45, 1), + (574, 125, 1), + (575, 125, 1), + (576, 125, 1), + (583, 73, 1), + (584, 73, 1), + (585, 73, 1), + (586, 120, 1), + (587, 120, 1), + (588, 120, 1), + (589, 87, 1), + (590, 87, 1), + (591, 87, 1), + (592, 30, 1), + (593, 6001, 11), + (594, 6001, 11), + (595, 6001, 11), + (596, 6000, 11), + (597, 6000, 11), + (598, 6000, 11), + (637, 23, 3), + (638, 23, 3), + (639, 23, 3), + (640, 23, 3), + (641, 23, 3), + (642, 23, 3), + (643, 55, 1), + (644, 82, 1), + (702, 30, 1), + (703, 30, 1), + (704, 30, 1), + (705, 30, 1), + (706, 30, 1), + (715, 6001, 11), + (716, 6001, 11), + (717, 6001, 11), + (754, 153, 3), + (755, 153, 3), + (756, 153, 3), + (770, 23, 3), + (771, 23, 3), + (772, 23, 3), + (773, 217, 1), + (774, 217, 1), + (775, 217, 1), + (782, 35, 1), + (783, 35, 1), + (784, 35, 1), + (806, 81, 1), + (849, 180, 3), + (850, 180, 3), + (851, 180, 3), + (886, 102, 1), + (887, 102, 1), + (893, 87, 1), + (894, 87, 1), + (924, 23, 3), + (925, 23, 3), + (931, 23, 1), + (932, 23, 1), + (933, 23, 1), + (975, 102, 1), + (1018, 227, 3), + (1041, 30, 6), + (1042, 30, 6), + (1043, 30, 6), + (1044, 310, 6), + (1045, 310, 6), + (1046, 310, 6), + (1047, 311, 3), + (1048, 311, 3), + (1049, 311, 3), + (1050, 309, 6), + (1051, 309, 6), + (1052, 309, 6), + (1102, 30, 1), + (1103, 30, 1), + (1104, 30, 1), + (1105, 30, 1), + (1106, 30, 1), + (1107, 23, 3), + (1108, 23, 3), + (1109, 23, 3), + (1110, 187, 5), + (1111, 187, 5), + (1112, 187, 5), + (1122, 176, 2), + (1126, 58, 1), + (1127, 58, 1), + (1128, 58, 1), + (1129, 125, 1), + (1130, 125, 1), + (1150, 189, 3), + (1151, 189, 3), + (1152, 189, 3), + (1163, 309, 3), + (1164, 309, 3), + (1165, 309, 3), + (1203, 19, 3), + (1204, 19, 3), + (1205, 19, 3), + (1210, 114, 6), + (1211, 114, 6), + (1212, 114, 6), + (1213, 215, 6), + (1214, 215, 6), + (1215, 215, 6), + (1242, 173, 3), + (1243, 173, 3), + (1244, 173, 3), + (1251, 61, 1), + (1252, 64, 1), + (1253, 62, 1), + (1254, 63, 1), + (1274, 175, 3), + (1275, 175, 3), + (1276, 175, 3), + (1278, 6001, 11), + (1279, 6001, 11), + (1280, 6001, 11), + (1323, 47, 1), + (1337, 308, 3), + (1338, 308, 3), + (1339, 308, 3), + (1414, 451, 1), + (1415, 451, 1), + (1416, 451, 1), + (1417, 451, 1), + (1418, 451, 1), + (1420, 17, 3), + (1421, 17, 3), + (1422, 17, 3), + (1423, 17, 3), + (1424, 17, 3), + (1425, 374, 3), + (1426, 374, 3), + (1427, 374, 3), + (1428, 374, 3), + (1429, 374, 3), + (1435, 20, 3), + (1436, 20, 3), + (1437, 20, 3), + (1458, 375, 3), + (1459, 255, 5), + (1460, 255, 5), + (1461, 255, 5), + (1471, 362, 1), + (1472, 362, 1), + (1473, 362, 1), + (1474, 362, 1), + (1475, 362, 1), + (1483, 114, 6), + (1484, 114, 6), + (1485, 114, 6), + (1486, 19, 7), + (1487, 19, 7), + (1488, 19, 7), + (1489, 19, 7), + (1490, 19, 7), + (1494, 80, 1), + (1495, 185, 6), + (1496, 185, 6), + (1497, 185, 6), + (1501, 46, 1), + (1502, 46, 1), + (1503, 46, 1), + (1504, 60, 1), + (1505, 60, 1), + (1506, 60, 1), + (1511, 175, 3), + (1512, 175, 3), + (1513, 175, 3), + (1514, 259, 6), + (1515, 259, 6), + (1516, 259, 6), + (1524, 30, 3), + (1525, 30, 3), + (1526, 30, 3), + (1543, 439, 3), + (1544, 439, 3), + (1545, 439, 3), + (1546, 420, 1), + (1547, 420, 1), + (1548, 420, 1), + (1552, 13, 5), + (1553, 13, 5), + (1554, 13, 5), + (1555, 359, 3), + (1556, 359, 3), + (1557, 359, 3), + (1558, 46, 1), + (1559, 46, 1), + (1560, 46, 1), + (1572, 263, 1), + (1573, 263, 1), + (1574, 263, 1), + (1575, 263, 1), + (1576, 263, 1), + (1577, 58, 1), + (1578, 58, 1), + (1579, 58, 1), + (1583, 300, 6), + (1584, 300, 6), + (1585, 300, 6), + (1586, 300, 6), + (1587, 300, 6), + (1591, 222, 3), + (1601, 82, 1), + (1602, 82, 1), + (1603, 82, 1), + (1608, 82, 3), + (1609, 82, 3), + (1610, 82, 3), + (1611, 181, 2), + (1612, 181, 2), + (1613, 181, 2), + (1614, 181, 2), + (1615, 181, 2), + (1627, 13, 5), + (1628, 13, 5), + (1629, 13, 5), + (1638, 224, 3), + (1639, 565, 1), + (1640, 793, 1), + (1641, 121, 3), + (1642, 121, 3), + (1643, 77, 1), + (1644, 85, 1), + (1645, 77, 1), + (1646, 85, 1), + (1656, 153, 1), + (1657, 153, 1), + (1659, 285, 1), + (1660, 285, 1), + (1667, 570, 1), + (2400, 38, 1), + (2401, 38, 1), + (2402, 38, 1), + (3676, 35, 1), + (4666, 435, 3), + (4667, 435, 3), + (4668, 435, 3), + (4669, 435, 3), + (4670, 435, 3), + (4688, 497, 5), + (4689, 497, 5), + (4690, 497, 5), + (4691, 497, 5), + (4692, 497, 5), + (4707, 30, 6), + (4708, 30, 6), + (4709, 30, 6), + (4710, 310, 6), + (4711, 310, 6), + (4712, 310, 6), + (4713, 311, 3), + (4714, 311, 3), + (4715, 311, 3), + (4716, 309, 6), + (4717, 309, 6), + (4718, 309, 6), + (4749, 23, 3), + (4750, 23, 3), + (4751, 23, 3), + (4752, 114, 6), + (4753, 114, 6), + (4754, 114, 6), + (4755, 215, 6), + (4756, 215, 6), + (4757, 215, 6), + (4761, 526, 3), + (4762, 526, 3), + (4763, 526, 3), + (4773, 20, 3), + (4795, 309, 3), + (4796, 309, 3), + (4797, 309, 3), + (4829, 420, 1), + (4830, 420, 1), + (4831, 420, 1), + (4844, 435, 3), + (4845, 435, 3), + (4846, 435, 3), + (4847, 435, 3), + (4848, 435, 3), + (4861, 68, 1), + (4862, 68, 1), + (4863, 68, 1), + (4864, 175, 3), + (4865, 175, 3), + (4866, 175, 3), + (4887, 413, 3), + (4888, 413, 3), + (4889, 413, 3), + (4890, 57, 1), + (4894, 409, 3), + (4895, 409, 3), + (4896, 409, 3), + (4903, 784, 1), + (4906, 785, 1), + (4909, 786, 1), + (4912, 787, 1), + (4915, 794, 1), + (4916, 794, 1), + (4917, 794, 1), + (4921, 117, 1), + (4922, 117, 1), + (4923, 117, 1), + (4924, 740, 3), + (4925, 740, 3), + (4926, 740, 3), + (4931, 173, 8), + (4932, 173, 8), + (4933, 173, 8), + (4951, 439, 3), + (4952, 439, 3), + (4953, 439, 3), + (4975, 30, 1), + (4976, 30, 1), + (4977, 30, 1), + (4978, 30, 1), + (4979, 30, 1), + (4986, 82, 1), + (4987, 82, 1), + (4988, 82, 1), + (4989, 82, 3), + (4990, 82, 3), + (4991, 82, 3), + (5010, 35, 1), + (5011, 35, 1), + (5012, 35, 1), + (5038, 30, 3), + (5039, 30, 3), + (5040, 30, 3), + (5041, 6001, 11), + (5042, 6001, 11), + (5043, 6001, 11), + (5061, 45, 1), + (5069, 224, 3), + (5070, 19, 3), + (5071, 19, 3), + (5072, 19, 3), + (5080, 255, 5), + (5081, 255, 5), + (5082, 255, 5), + (5098, 73, 2), + (5118, 396, 1), + (5119, 396, 1), + (5120, 396, 1), + (5127, 261, 3), + (5128, 261, 3), + (5129, 261, 3), + (5133, 23, 3), + (5134, 23, 3), + (5135, 23, 3), + (5136, 496, 5), + (5137, 496, 5), + (5138, 496, 5), + (5139, 496, 5), + (5140, 496, 5), + (5251, 447, 3), + (5252, 447, 3), + (5253, 447, 3), + (5264, 278, 5), + (5265, 278, 5), + (5266, 278, 5), + (5267, 278, 5), + (5268, 278, 5), + (5270, 87, 1), + (5271, 87, 1), + (5272, 87, 1), + (5286, 23, 3), + (5287, 23, 3), + (5288, 23, 3), + (5311, 185, 6), + (5312, 185, 6), + (5313, 185, 6), + (5330, 1685, 1), + (5333, 1685, 1), + (5336, 1685, 1), + (5339, 1685, 1), + (5342, 1685, 1), + (5347, 1685, 1), + (5348, 1685, 1), + (5350, 707, 4), + (5350, 1685, 1), + (5353, 1685, 1), + (5356, 1685, 1), + (5357, 1685, 1), + (5360, 1685, 1), + (5363, 447, 3), + (5363, 1685, 1), + (5366, 1685, 1), + (5369, 1685, 1), + (5513, 58, 1), + (5514, 58, 1), + (5515, 58, 1), + (5529, 19, 7), + (5530, 19, 7), + (5531, 19, 7), + (5532, 19, 7), + (5533, 19, 7), + (5542, 30, 6), + (5543, 30, 6), + (5544, 30, 6), + (5545, 310, 6), + (5546, 310, 6), + (5547, 310, 6), + (5548, 311, 3), + (5549, 311, 3), + (5550, 311, 3), + (5551, 309, 6), + (5552, 309, 6), + (5553, 309, 6), + (5571, 23, 3), + (5572, 23, 3), + (5573, 23, 3), + (5574, 114, 6), + (5575, 114, 6), + (5576, 114, 6), + (5577, 215, 6), + (5578, 215, 6), + (5579, 215, 6), + (5595, 309, 3), + (5596, 309, 3), + (5597, 309, 3), + (5607, 794, 1), + (5608, 794, 1), + (5609, 794, 1), + (5617, 23, 3), + (5618, 23, 3), + (5619, 23, 3), + (5702, 30, 1), + (5703, 30, 1), + (5704, 30, 1), + (5705, 30, 1), + (5706, 30, 1), + (5759, 374, 3), + (5760, 374, 3), + (5761, 374, 3), + (5762, 374, 3), + (5763, 374, 3), + (5791, 19, 3), + (5792, 19, 3), + (5793, 19, 3), + (5797, 396, 1), + (5798, 396, 1), + (5799, 396, 1), + (5803, 255, 5), + (5804, 255, 5), + (5805, 255, 5), + (5806, 30, 3), + (5807, 30, 3), + (5808, 30, 3), + (5825, 45, 1), + (5826, 185, 6), + (5827, 185, 6), + (5828, 185, 6), + (5854, 217, 1), + (5855, 217, 1), + (5856, 217, 1), + (5857, 173, 3), + (5858, 173, 3), + (5859, 173, 3), + (5869, 57, 1), + (5871, 57, 1), + (5872, 57, 1), + (5880, 60, 1), + (5881, 60, 1), + (5882, 60, 1), + (5886, 58, 1), + (5887, 58, 1), + (5888, 58, 1), + (5892, 784, 1), + (5893, 785, 1), + (5894, 786, 1), + (5895, 787, 1), + (5939, 278, 5), + (5940, 278, 5), + (5941, 278, 5), + (5942, 278, 5), + (5943, 278, 5), + (5944, 740, 3), + (5945, 740, 3), + (5946, 740, 3), + (5947, 175, 3), + (5948, 175, 3), + (5949, 175, 3), + (5950, 175, 3), + (5951, 175, 3), + (5952, 175, 3), + (5954, 68, 1), + (5955, 68, 1), + (5956, 68, 1), + (5969, 6001, 11), + (5970, 6001, 11), + (5971, 6001, 11), + (5972, 6001, 11), + (5973, 6000, 11), + (5984, 702, 1), + (6017, 82, 1), + (6018, 82, 1), + (6019, 82, 1), + (6026, 826, 1), + (6027, 826, 1), + (6028, 826, 1), + (6042, 439, 3), + (6043, 439, 3), + (6044, 439, 3), + (6054, 173, 8), + (6055, 173, 8), + (6056, 173, 8), + (6063, 87, 1), + (6064, 87, 1), + (6065, 87, 1), + (6088, 392, 1), + (6089, 392, 1), + (6090, 392, 1), + (6092, 447, 3), + (6093, 447, 3), + (6094, 447, 3), + (6102, 224, 3), + (6106, 308, 3), + (6107, 308, 3), + (6108, 308, 3), + (6109, 308, 3), + (6110, 308, 3), + (6111, 308, 3), + (6130, 120, 1), + (6131, 120, 1), + (6132, 120, 1), + (6136, 300, 6), + (6158, 308, 3), + (6159, 308, 3), + (6160, 308, 3), + (6209, 245, 3), + (6210, 245, 3), + (6211, 245, 3), + (6228, 404, 1), + (6229, 404, 1), + (6230, 404, 1), + (6231, 404, 1), + (6233, 43, 1), + (6234, 43, 1), + (6235, 43, 1), + (6260, 98, 1), + (6261, 98, 1), + (6262, 98, 1), + (6272, 672, 1), + (6273, 672, 1), + (6274, 672, 1), + (6275, 790, 1), + (6276, 790, 1), + (6277, 790, 1), + (6302, 3710, 1), + (6303, 3710, 1), + (6304, 3710, 1), + (6319, 107, 1), + (6320, 107, 1), + (6321, 107, 1), + (6333, 125, 1), + (6337, 553, 1), + (6338, 553, 1), + (6339, 553, 1), + (6340, 777, 1), + (6341, 777, 1), + (6342, 777, 1), + (6346, 494, 3), + (6347, 494, 3), + (6348, 494, 3), + (6349, 500, 3), + (6350, 500, 3), + (6351, 500, 3), + (6352, 409, 3), + (6353, 409, 3), + (6354, 409, 3), + (6380, 128, 3), + (6381, 128, 3), + (6382, 128, 3), + (6400, 187, 5), + (6401, 187, 5), + (6402, 187, 5), + (6403, 23, 3), + (6404, 23, 3), + (6405, 23, 3), + (6439, 41, 1), + (6440, 41, 1), + (6441, 420, 1), + (6442, 362, 1), + (6443, 362, 1), + (6445, 176, 1), + (6446, 176, 1), + (6447, 176, 1), + (6478, 3800, 1), + (6479, 3800, 1), + (6480, 3800, 1), + (6481, 36, 1), + (6482, 36, 1), + (6483, 36, 1), + (6484, 558, 1), + (6485, 558, 1), + (6486, 558, 1), + (6499, 611, 1), + (6500, 526, 3), + (6501, 526, 3), + (6502, 526, 3), + (6503, 172, 1), + (6504, 172, 1), + (6505, 172, 1), + (6506, 172, 1), + (6514, 404, 1), + (6515, 404, 1), + (6516, 404, 1), + (6517, 20, 1), + (6528, 107, 1), + (6630, 278, 5), + (6631, 278, 5), + (6632, 278, 5), + (6633, 278, 5), + (6634, 278, 5), + (6636, 358, 3), + (6637, 358, 3), + (6638, 358, 3), + (6668, 672, 3), + (6669, 672, 3), + (6670, 672, 3), + (6697, 857, 1), + (6698, 857, 1), + (6699, 857, 1), + (6700, 857, 1), + (6701, 857, 1), + (6703, 171, 1), + (6704, 171, 1), + (6705, 171, 1), + (6712, 177, 1), + (6713, 177, 1), + (6714, 177, 1), + (6715, 177, 1), + (6716, 177, 1), + (6755, 184, 3), + (6756, 184, 3), + (6757, 184, 3), + (6819, 524, 1), + (6820, 524, 1), + (6821, 524, 1), + (6823, 320, 1), + (6824, 320, 1), + (6825, 320, 1), + (6826, 320, 1), + (6827, 320, 1), + (6870, 544, 1), + (6871, 544, 1), + (6872, 544, 1), + (6873, 3837, 3), + (6874, 3837, 3), + (6875, 3837, 3), + (6876, 259, 3), + (6877, 259, 3), + (6878, 259, 3), + (6900, 465, 3), + (6901, 465, 3), + (6902, 465, 3), + (6903, 465, 3), + (6904, 465, 3), + (6908, 499, 1), + (6909, 499, 1), + (6910, 499, 1), + (6930, 611, 1), + (6935, 465, 3), + (6936, 465, 3), + (6937, 465, 3), + (6941, 962, 1), + (6942, 962, 1), + (6943, 962, 1), + (6944, 962, 1), + (6945, 962, 1), + (6977, 3817, 1), + (6978, 3817, 1), + (6979, 3817, 1), + (6980, 128, 1), + (6981, 128, 1), + (6982, 128, 1), + (6983, 245, 3), + (6988, 985, 1), + (6989, 985, 1), + (6990, 985, 1), + (7005, 789, 1), + (7006, 789, 1), + (7007, 789, 1), + (7033, 804, 1), + (7034, 804, 1), + (7035, 804, 1), + (7036, 3646, 1), + (7037, 3646, 1), + (7038, 3646, 1), + (7050, 26, 3), + (7051, 26, 3), + (7052, 26, 3), + (7053, 26, 3), + (7054, 26, 3), + (7055, 26, 3), + (7063, 26, 3), + (7064, 26, 3), + (7065, 26, 3), + (7100, 254, 3), + (7101, 254, 3), + (7102, 254, 3), + (7103, 286, 1), + (7104, 286, 1), + (7105, 286, 1), + (7116, 110, 1), + (7117, 110, 1), + (7118, 110, 1), + (7122, 435, 3), + (7123, 435, 3), + (7124, 435, 3), + (7125, 435, 3), + (7126, 435, 3), + (7128, 109, 1), + (7129, 109, 1), + (7130, 109, 1), + (7134, 439, 3), + (7135, 439, 3), + (7136, 439, 3), + (7137, 672, 1), + (7138, 672, 1), + (7139, 672, 1), + (7184, 1685, 1), + (7199, 175, 3), + (7200, 175, 3), + (7201, 175, 3), + (7204, 278, 5), + (7205, 278, 5), + (7206, 278, 5), + (7207, 278, 5), + (7208, 278, 5), + (7215, 68, 1), + (7216, 68, 1), + (7232, 114, 6), + (7233, 114, 6), + (7234, 114, 6), + (7246, 794, 1), + (7247, 794, 1), + (7248, 794, 1), + (7253, 784, 1), + (7254, 785, 1), + (7255, 786, 1), + (7256, 787, 1), + (7260, 60, 1), + (7261, 60, 1), + (7262, 60, 1), + (7263, 58, 1), + (7264, 58, 1), + (7265, 58, 1), + (7266, 125, 1), + (7276, 217, 1), + (7277, 217, 1), + (7278, 217, 1), + (7285, 173, 3), + (7286, 173, 3), + (7287, 173, 3), + (7288, 409, 3), + (7289, 409, 3), + (7290, 409, 3), + (7291, 173, 8), + (7292, 173, 8), + (7293, 173, 8), + (7301, 19, 3), + (7302, 19, 3), + (7303, 19, 3), + (7310, 255, 5), + (7311, 255, 5), + (7312, 255, 5), + (7316, 41, 1), + (7317, 41, 1), + (7323, 254, 3), + (7324, 254, 3), + (7325, 254, 3), + (7326, 286, 1), + (7327, 286, 1), + (7328, 286, 1), + (7329, 6001, 11), + (7330, 6001, 11), + (7331, 6001, 11), + (7335, 702, 1), + (7359, 82, 1), + (7360, 82, 1), + (7361, 82, 1), + (7378, 82, 3), + (7379, 82, 3), + (7380, 82, 3), + (7381, 82, 3), + (7382, 82, 3), + (7383, 82, 3), + (7390, 87, 1), + (7391, 87, 1), + (7392, 87, 1), + (7407, 31, 3), + (7414, 185, 6), + (7415, 185, 6), + (7416, 185, 6), + (7433, 30, 1), + (7434, 30, 1), + (7435, 30, 1), + (7436, 30, 1), + (7437, 30, 1), + (7445, 187, 5), + (7446, 187, 5), + (7447, 187, 5), + (7448, 553, 1), + (7449, 553, 1), + (7450, 553, 1), + (7451, 777, 1), + (7452, 777, 1), + (7453, 777, 1), + (7466, 224, 3), + (7472, 447, 3), + (7473, 447, 3), + (7474, 447, 3), + (7478, 245, 3), + (7497, 128, 3), + (7498, 128, 3), + (7499, 128, 3), + (7554, 19, 7), + (7555, 19, 7), + (7556, 19, 7), + (7557, 19, 7), + (7558, 19, 7), + (7562, 30, 6), + (7563, 30, 6), + (7564, 30, 6), + (7581, 215, 6), + (7582, 215, 6), + (7583, 215, 6), + (7615, 494, 3), + (7616, 494, 3), + (7617, 494, 3), + (7618, 500, 3), + (7619, 500, 3), + (7620, 500, 3), + (7621, 20, 1), + (7622, 26, 3), + (7623, 26, 3), + (7624, 26, 3), + (7631, 309, 3), + (7632, 309, 3), + (7633, 309, 3), + (7650, 310, 6), + (7651, 310, 6), + (7652, 310, 6), + (7653, 311, 3), + (7654, 311, 3), + (7655, 311, 3), + (7656, 309, 6), + (7657, 309, 6), + (7658, 309, 6), + (7659, 153, 3), + (7660, 153, 3), + (7661, 153, 3), + (7664, 170, 3), + (7665, 170, 3), + (7666, 170, 3), + (7667, 170, 3), + (7668, 170, 3), + (7682, 68, 1), + (7686, 435, 3), + (7687, 435, 3), + (7688, 435, 3), + (7691, 224, 3), + (7695, 862, 3), + (7696, 862, 3), + (7697, 862, 3), + (7700, 310, 3), + (7701, 310, 3), + (7702, 310, 3), + (7704, 3707, 1), + (7705, 3707, 1), + (7706, 3707, 1), + (7707, 87, 1), + (7708, 87, 1), + (7709, 87, 1), + (7710, 702, 1), + (7711, 702, 1), + (7712, 3826, 1), + (7715, 901, 1), + (7716, 901, 1), + (7717, 901, 1), + (7718, 125, 1), + (7722, 19, 7), + (7723, 19, 7), + (7724, 19, 7), + (7725, 19, 7), + (7726, 19, 7), + (7733, 195, 3), + (7743, 184, 1), + (7744, 184, 1), + (7745, 184, 1), + (7748, 13, 5), + (7749, 13, 5), + (7750, 13, 5), + (7751, 2234, 1), + (7752, 2234, 1), + (7753, 2234, 1), + (7754, 85, 1), + (7757, 9403, 1), + (7758, 9403, 1), + (7759, 9403, 1), + (7760, 824, 1), + (7761, 824, 1), + (7762, 824, 1), + (7765, 7689, 1), + (7766, 7689, 1), + (7767, 7689, 1), + (7768, 7689, 1), + (7770, 19, 3), + (7771, 19, 3), + (7772, 19, 3), + (7773, 19, 3), + (7774, 19, 3), + (7775, 19, 3), + (7822, 1154, 1), + (7823, 1154, 1), + (7824, 1154, 1), + (7825, 1154, 1), + (7826, 1154, 1), + (7827, 1404, 3), + (7832, 60, 1), + (7833, 60, 1), + (7834, 60, 1), + (7835, 60, 1), + (7836, 60, 1), + (7842, 19, 7), + (7843, 19, 7), + (7844, 19, 7), + (7940, 558, 1), + (7941, 558, 1), + (7942, 558, 1), + (7943, 39, 1), + (7944, 41, 1), + (7951, 19, 3), + (7952, 19, 3), + (7953, 19, 3), + (7983, 520, 1), + (7984, 520, 1), + (7985, 520, 1), + (7986, 705, 1), + (7987, 705, 1), + (7988, 705, 1), + (7989, 1092, 1), + (7990, 1092, 1), + (7991, 1092, 1), + (7992, 1092, 1), + (7993, 39, 1), + (7994, 39, 1), + (7995, 39, 1), + (8031, 791, 1), + (8032, 791, 1), + (8033, 791, 1), + (8035, 521, 1), + (8036, 521, 1), + (8037, 521, 1), + (8069, 160, 4), + (8070, 160, 4), + (8071, 160, 4), + (8076, 565, 1), + (8077, 565, 1), + (8078, 565, 1), + (8079, 565, 1), + (8080, 565, 1), + (8081, 565, 1), + (8082, 208, 1), + (8083, 208, 1), + (8084, 208, 1), + (8195, 3707, 1), + (8196, 3707, 1), + (8197, 3707, 1), + (8198, 210, 1), + (8199, 210, 1), + (8200, 210, 1), + (8204, 153, 1), + (8205, 153, 1), + (8206, 153, 1), + (8207, 285, 1), + (8208, 285, 1), + (8209, 285, 1), + (8220, 3812, 1), + (8224, 516, 3), + (8225, 516, 3), + (8226, 516, 3), + (8260, 1211, 1), + (8263, 142, 20), + (8264, 142, 20), + (8265, 142, 20), + (8266, 142, 20), + (8267, 142, 20), + (8268, 142, 20), + (8269, 142, 20), + (8270, 142, 20), + (8271, 142, 20), + (8272, 142, 20), + (8273, 142, 20), + (8274, 142, 20), + (8275, 142, 20), + (8276, 142, 20), + (8277, 142, 20), + (8278, 142, 20), + (8279, 142, 20), + (8280, 142, 20), + (8281, 142, 20), + (8282, 142, 20), + (8283, 142, 20), + (8284, 142, 20), + (8285, 142, 20), + (8286, 142, 20), + (8287, 142, 20), + (8288, 142, 20), + (8289, 142, 20), + (8290, 142, 20), + (8291, 142, 20), + (8292, 142, 20), + (8293, 142, 20), + (8294, 142, 20), + (8295, 142, 20), + (8296, 142, 20), + (8297, 142, 20), + (8303, 309, 6), + (8309, 31, 3), + (8310, 31, 3), + (8311, 31, 3), + (8312, 110, 1), + (8317, 8205, 1), + (8318, 8205, 1), + (8319, 199, 1), + (8320, 199, 1), + (8321, 199, 1), + (8332, 861, 1), + (8333, 861, 1), + (8334, 861, 1), + (8335, 1041, 1), + (8336, 1041, 1), + (8337, 1041, 1), + (8338, 1041, 1), + (8339, 1041, 1), + (8344, 215, 6), + (8345, 215, 6), + (8346, 215, 6), + (8347, 616, 1), + (8348, 616, 1), + (8349, 616, 1), + (8351, 142, 20), + (8352, 142, 20), + (8353, 142, 20), + (8354, 142, 20), + (8355, 142, 20), + (8356, 142, 20), + (8357, 142, 20), + (8358, 142, 20), + (8359, 142, 20), + (8360, 142, 20), + (8361, 142, 20), + (8362, 142, 20), + (8363, 142, 20), + (8364, 142, 20), + (8365, 142, 20), + (8366, 142, 20), + (8367, 142, 20), + (8368, 142, 20), + (8369, 142, 20), + (8370, 142, 20), + (8371, 142, 20), + (8372, 142, 20), + (8373, 142, 20), + (8374, 142, 20), + (8375, 142, 20), + (8376, 142, 20), + (8377, 142, 20), + (8378, 142, 20), + (8379, 142, 20), + (8380, 142, 20), + (8381, 142, 20), + (8382, 142, 20), + (8383, 142, 20), + (8384, 142, 20), + (8385, 142, 20), + (8386, 142, 20), + (8387, 142, 20), + (8388, 142, 20), + (8389, 142, 20), + (8390, 142, 20), + (8391, 142, 20), + (8392, 142, 20), + (8393, 142, 20), + (8394, 142, 20), + (8395, 142, 20), + (8396, 142, 20), + (8397, 142, 20), + (8398, 142, 20), + (8399, 142, 20), + (8400, 142, 20), + (8401, 142, 20), + (8402, 142, 20), + (8403, 142, 20), + (8404, 142, 20), + (8405, 142, 20), + (8406, 142, 20), + (8407, 142, 20), + (8408, 142, 20), + (8409, 142, 20), + (8410, 142, 20), + (8411, 142, 20), + (8412, 142, 20), + (8413, 142, 20), + (8414, 142, 20), + (8415, 142, 20), + (8416, 142, 20), + (8417, 142, 20), + (8418, 142, 20), + (8419, 142, 20), + (8420, 142, 20), + (8421, 516, 3), + (8427, 254, 3), + (8428, 254, 3), + (8429, 254, 3), + (9103, 1350, 3), + (9104, 1350, 3), + (9105, 1350, 3), + (9106, 1351, 3), + (9107, 1351, 3), + (9108, 1351, 3), + (9112, 1390, 3), + (9113, 1390, 3), + (9114, 1390, 3), + (9115, 1391, 3), + (9116, 1391, 3), + (9117, 1391, 3), + (9121, 1370, 3), + (9122, 1370, 3), + (9123, 1370, 3), + (9124, 1371, 3), + (9125, 1371, 3), + (9126, 1371, 3), + (9130, 1380, 3), + (9131, 1380, 3), + (9132, 1380, 3), + (9133, 1381, 3), + (9134, 1381, 3), + (9135, 1381, 3), + (9139, 1470, 3), + (9140, 1470, 3), + (9141, 1470, 3), + (9142, 1471, 3), + (9143, 1471, 3), + (9144, 1471, 3), + (9148, 1480, 3), + (9149, 1480, 3), + (9150, 1480, 3), + (9151, 1481, 3), + (9152, 1481, 3), + (9153, 1481, 3), + (9157, 1490, 3), + (9158, 1490, 3), + (9159, 1490, 3), + (9160, 1491, 3), + (9161, 1491, 3), + (9162, 1491, 3), + (9166, 1460, 3), + (9167, 1460, 3), + (9168, 1460, 3), + (9169, 1461, 3), + (9170, 1461, 3), + (9171, 1461, 3), + (9175, 1450, 3), + (9176, 1450, 3), + (9177, 1450, 3), + (9178, 1451, 3), + (9179, 1451, 3), + (9180, 1451, 3), + (9184, 1440, 3), + (9185, 1440, 3), + (9186, 1440, 3), + (9187, 1441, 3), + (9188, 1441, 3), + (9189, 1441, 3), + (9193, 1420, 3), + (9194, 1420, 3), + (9195, 1420, 3), + (9196, 1421, 3), + (9197, 1421, 3), + (9198, 1421, 3), + (9202, 1430, 3), + (9203, 1430, 3), + (9204, 1430, 3), + (9205, 1431, 3), + (9206, 1431, 3), + (9207, 1431, 3), + (9211, 1400, 3), + (9212, 1400, 3), + (9213, 1400, 3), + (9214, 1401, 3), + (9215, 1401, 3), + (9216, 1401, 3), + (9220, 1360, 3), + (9221, 1360, 3), + (9222, 1360, 3), + (9223, 1361, 3), + (9224, 1361, 3), + (9225, 1361, 3), + (9229, 1500, 3), + (9230, 1500, 3), + (9231, 1500, 3), + (9232, 1501, 3), + (9233, 1501, 3), + (9234, 1501, 3), + (9238, 1410, 3), + (9239, 1410, 3), + (9240, 1410, 3), + (9241, 1411, 3), + (9242, 1411, 3), + (9243, 1411, 3), + (9300, 1300, 3), + (9301, 1300, 3), + (9302, 1300, 3), + (9303, 1300, 6), + (9304, 1300, 6), + (9305, 1300, 6), + (9306, 1300, 9), + (9307, 1300, 9), + (9308, 1300, 9), + (9309, 1313, 3), + (9310, 1313, 3), + (9311, 1313, 3), + (9312, 1313, 6), + (9313, 1313, 6), + (9314, 1313, 6), + (9315, 1313, 9), + (9316, 1313, 9), + (9317, 1313, 9), + (9318, 1302, 3), + (9319, 1302, 3), + (9320, 1302, 3), + (9321, 1302, 6), + (9322, 1302, 6), + (9323, 1302, 6), + (9324, 1302, 9), + (9325, 1302, 9), + (9326, 1302, 9), + (9327, 1303, 3), + (9328, 1303, 3), + (9329, 1303, 3), + (9330, 1303, 6), + (9331, 1303, 6), + (9332, 1303, 6), + (9333, 1303, 9), + (9334, 1303, 9), + (9335, 1303, 9), + (9336, 1301, 3), + (9337, 1301, 3), + (9338, 1301, 3), + (9339, 1301, 6), + (9340, 1301, 6), + (9341, 1301, 6), + (9342, 1301, 9), + (9343, 1301, 9), + (9344, 1301, 9), + (9345, 1312, 3), + (9346, 1312, 3), + (9347, 1312, 3), + (9348, 1312, 6), + (9349, 1312, 6), + (9350, 1312, 6), + (9351, 1312, 9), + (9352, 1312, 9), + (9353, 1312, 9), + (9354, 1315, 3), + (9355, 1315, 3), + (9356, 1315, 3), + (9357, 1315, 6), + (9358, 1315, 6), + (9359, 1315, 6), + (9360, 1315, 9), + (9361, 1315, 9), + (9362, 1315, 9), + (9363, 1310, 3), + (9364, 1310, 3), + (9365, 1310, 3), + (9366, 1310, 6), + (9367, 1310, 6), + (9368, 1310, 6), + (9369, 1310, 9), + (9370, 1310, 9), + (9371, 1310, 9), + (9372, 1311, 3), + (9373, 1311, 3), + (9374, 1311, 3), + (9375, 1311, 6), + (9376, 1311, 6), + (9377, 1311, 6), + (9378, 1311, 9), + (9379, 1311, 9), + (9380, 1311, 9), + (9381, 1309, 3), + (9382, 1309, 3), + (9383, 1309, 3), + (9384, 1309, 6), + (9385, 1309, 6), + (9386, 1309, 6), + (9387, 1309, 9), + (9388, 1309, 9), + (9389, 1309, 9), + (9390, 1308, 3), + (9391, 1308, 3), + (9392, 1308, 3), + (9393, 1308, 6), + (9394, 1308, 6), + (9395, 1308, 6), + (9396, 1308, 9), + (9397, 1308, 9), + (9398, 1308, 9), + (9399, 1307, 3), + (9400, 1307, 3), + (9401, 1307, 3), + (9402, 1307, 6), + (9403, 1307, 6), + (9404, 1307, 6), + (9405, 1307, 9), + (9406, 1307, 9), + (9407, 1307, 9), + (9408, 1304, 3), + (9409, 1304, 3), + (9410, 1304, 3), + (9411, 1304, 6), + (9412, 1304, 6), + (9413, 1304, 6), + (9414, 1304, 9), + (9415, 1304, 9), + (9416, 1304, 9), + (9417, 1305, 3), + (9418, 1305, 3), + (9419, 1305, 3), + (9420, 1305, 6), + (9421, 1305, 6), + (9422, 1305, 6), + (9423, 1305, 9), + (9424, 1305, 9), + (9425, 1305, 9), + (9426, 1306, 3), + (9427, 1306, 3), + (9428, 1306, 3), + (9429, 1306, 6), + (9430, 1306, 6), + (9431, 1306, 6), + (9432, 1306, 9), + (9433, 1306, 9), + (9434, 1306, 9), + (9435, 1314, 3), + (9436, 1314, 3), + (9437, 1314, 3), + (9438, 1314, 6), + (9439, 1314, 6), + (9440, 1314, 6), + (9441, 1314, 9), + (9442, 1314, 9), + (9443, 1314, 9), + (9500, 72, 1), + (10016, 19, 3), + (10017, 19, 3), + (10018, 19, 3), + (10030, 558, 1), + (10031, 558, 1), + (10032, 558, 1), + (10038, 19, 3), + (10039, 19, 3), + (10040, 19, 3), + (10041, 358, 3), + (10042, 358, 3), + (10043, 358, 3), + (10047, 6001, 11), + (10048, 6001, 11), + (10049, 6001, 11), + (10064, 82, 3), + (10065, 82, 3), + (10066, 82, 3), + (10067, 82, 3), + (10068, 82, 3), + (10069, 82, 3), + (10070, 278, 5), + (10071, 278, 5), + (10072, 278, 5), + (10073, 278, 5), + (10074, 278, 5), + (10093, 185, 6), + (10105, 170, 3), + (10106, 170, 3), + (10107, 170, 3), + (10108, 170, 3), + (10109, 170, 3), + (10110, 520, 1), + (10111, 520, 1), + (10112, 520, 1), + (10130, 544, 1), + (10131, 544, 1), + (10132, 544, 1), + (10133, 3837, 3), + (10134, 3837, 3), + (10135, 3837, 3), + (10136, 259, 3), + (10137, 259, 3), + (10138, 259, 3), + (10150, 187, 5), + (10151, 187, 5), + (10152, 187, 5), + (10153, 553, 1), + (10154, 553, 1), + (10155, 553, 1), + (10165, 439, 3), + (10166, 439, 3), + (10167, 439, 3), + (10176, 171, 1), + (10177, 171, 1), + (10178, 171, 1), + (10182, 177, 1), + (10183, 177, 1), + (10184, 177, 1), + (10185, 177, 1), + (10186, 177, 1), + (10197, 447, 3), + (10198, 447, 3), + (10199, 447, 3), + (10203, 524, 1), + (10204, 524, 1), + (10205, 524, 1), + (10206, 320, 1), + (10207, 320, 1), + (10209, 175, 3), + (10210, 175, 3), + (10211, 175, 3), + (10213, 278, 5), + (10214, 278, 5), + (10215, 278, 5), + (10216, 278, 5), + (10217, 278, 5), + (10249, 208, 1), + (10250, 208, 1), + (10251, 208, 1), + (10255, 784, 1), + (10256, 785, 1), + (10257, 786, 1), + (10258, 787, 1), + (10262, 58, 1), + (10263, 58, 1), + (10264, 58, 1), + (10271, 173, 3), + (10272, 173, 3), + (10273, 173, 3), + (10274, 173, 8), + (10275, 173, 8), + (10276, 173, 8), + (10282, 791, 1), + (10283, 791, 1), + (10284, 791, 1), + (10285, 521, 1), + (10286, 521, 1), + (10287, 521, 1), + (10308, 128, 3), + (10309, 128, 3), + (10310, 128, 3), + (10329, 3701, 1), + (10330, 199, 3), + (10332, 943, 3), + (10336, 941, 1), + (10337, 941, 1), + (10338, 941, 1), + (10354, 6001, 17), + (10389, 841, 1), + (10390, 841, 1), + (10391, 841, 1), + (10396, 705, 4), + (10397, 1092, 4), + (10398, 3701, 1), + (10399, 3701, 1), + (10413, 207, 1), + (10414, 207, 1), + (10415, 207, 1), + (10416, 207, 1), + (10417, 207, 1), + (10426, 185, 18), + (10427, 519, 15), + (10428, 173, 8), + (10429, 173, 8), + (10430, 173, 8), + (10431, 791, 1), + (10432, 791, 1), + (10433, 791, 1), + (10434, 792, 1), + (10435, 792, 1), + (10436, 792, 1), + (10450, 19, 9), + (10451, 19, 9), + (10452, 19, 9), + (10456, 3800, 1), + (10457, 3800, 1), + (10458, 3800, 1), + (10462, 396, 1), + (10463, 396, 1), + (10464, 391, 9), + (10465, 391, 9), + (10466, 391, 9), + (10468, 19, 9), + (10469, 19, 9), + (10470, 558, 1), + (10471, 558, 1), + (10472, 558, 1), + (10473, 26, 3), + (10474, 26, 3), + (10475, 26, 3), + (10476, 26, 3), + (10477, 26, 3), + (10510, 705, 1), + (10511, 185, 3), + (10512, 185, 3), + (10513, 185, 3), + (10514, 519, 3), + (10515, 519, 3), + (10516, 519, 3), + (10519, 3213, 1), + (10522, 3732, 1), + (10527, 1400, 1), + (10532, 1401, 1), + (10537, 1402, 1), + (10548, 605, 13), + (10554, 263, 1), + (10555, 263, 1), + (10556, 263, 1), + (10557, 1120, 1), + (10558, 1120, 1), + (10559, 1120, 1), + (10560, 1120, 1), + (10561, 3551, 1), + (10562, 3551, 1), + (10563, 3551, 1), + (10564, 217, 1), + (10565, 217, 1), + (10566, 217, 1), + (10576, 109, 1), + (10579, 3646, 1), + (10580, 3646, 1), + (10588, 601, 1), + (10589, 601, 1), + (10590, 601, 1), + (10591, 601, 1), + (10592, 601, 1), + (10610, 265, 5), + (10611, 265, 5), + (10612, 265, 5), + (10621, 180, 3), + (10622, 180, 3), + (10623, 30, 3), + (10624, 30, 3), + (10625, 30, 3), + (10626, 702, 1), + (10646, 3826, 1), + (10657, 276, 3), + (10658, 276, 3), + (10659, 276, 3), + (10666, 98, 1), + (10667, 98, 1), + (10668, 98, 1), + (10670, 19, 9), + (10708, 6001, 11), + (10709, 6001, 11), + (10710, 6001, 11), + (10711, 30, 6), + (10712, 30, 6), + (10713, 30, 6), + (10714, 873, 1), + (10715, 873, 1), + (10717, 184, 1), + (10718, 184, 1), + (10719, 872, 1), + (10720, 872, 1), + (10721, 872, 1), + (10722, 778, 1), + (10723, 778, 1), + (10724, 778, 1), + (10725, 778, 1), + (10726, 778, 1), + (10727, 2235, 1), + (10728, 2235, 1), + (10730, 870, 1), + (10731, 870, 1), + (10733, 219, 1), + (10734, 219, 1), + (10735, 219, 1), + (10750, 286, 1), + (10751, 286, 1), + (10752, 7108, 1), + (10753, 286, 1), + (10789, 10424, 1), + (10790, 705, 4), + (10791, 1092, 4), + (10800, 462, 3), + (10801, 462, 3), + (10802, 462, 3), + (10903, 125, 1), + (10904, 125, 1), + (10905, 125, 1), + (10909, 7007, 1), + (10910, 7007, 1), + (10911, 7007, 1), + (10915, 823, 3), + (10916, 823, 3), + (10917, 823, 3), + (10951, 447, 3), + (10952, 447, 3), + (10953, 447, 3), + (10954, 662, 3), + (10955, 662, 3), + (10956, 662, 3), + (11011, 3710, 1), + (11012, 3710, 1), + (11013, 3710, 1), + (11014, 3899, 1), + (11015, 3899, 1), + (11016, 3899, 1), + (11020, 3899, 1), + (11050, 452, 3), + (11051, 452, 3), + (11052, 452, 3), + (11053, 500, 3), + (11054, 500, 3), + (11059, 452, 3), + (11060, 452, 3), + (11077, 986, 1), + (11078, 988, 1), + (11079, 987, 1), + (11088, 505, 1), + (11089, 505, 1), + (11090, 505, 1), + (11091, 505, 1), + (12422, 1202, 1), + (12432, 23, 3), + (12433, 23, 3), + (12434, 23, 3), + (12435, 23, 3), + (12436, 23, 3), + (12437, 23, 3), + (12475, 7003, 1), + (12476, 7003, 1), + (12477, 7003, 1), + (12478, 3705, 9), + (12479, 3705, 9), + (12480, 3705, 9), + (12523, 114, 6), + (12526, 215, 6), + (12527, 215, 6), + (12528, 215, 6), + (12529, 358, 3), + (12530, 358, 3), + (12531, 358, 3), + (12553, 23, 3), + (12554, 23, 3), + (12555, 23, 3), + (12556, 23, 3), + (12557, 23, 3), + (12558, 23, 3), + (12582, 9400, 1), + (12583, 9400, 1), + (12584, 9400, 1), + (12587, 9403, 1), + (12588, 9403, 1), + (12589, 9403, 1), + (12600, 3514, 1), + (12606, 13, 5), + (12610, 310, 3), + (12626, 1410, 3), + (12629, 1411, 3), + (12632, 1412, 3), + (12635, 428, 2), + (12639, 519, 3), + (12642, 185, 3), + (12645, 519, 1), + (12646, 185, 1), + (12664, 3728, 1), + (12673, 420, 1), + (12677, 17, 3), + (12679, 276, 3), + (12680, 276, 3), + (12681, 276, 3), + (12697, 30, 6), + (12698, 30, 6), + (12699, 30, 6), + (12713, 8202, 1), + (12714, 8202, 1), + (12715, 8202, 1), + (12716, 3702, 1), + (12717, 3702, 1), + (12718, 3702, 1), + (12719, 3702, 1), + (12720, 3506, 1), + (12721, 3506, 1), + (12722, 3506, 1), + (12723, 3506, 1), + (12727, 359, 3), + (12728, 359, 3), + (12729, 359, 3), + (12730, 941, 1), + (12731, 941, 1), + (12732, 941, 1), + (12733, 943, 3), + (12734, 259, 3), + (12735, 259, 3), + (12736, 259, 3), + (12737, 3701, 1), + (12738, 3701, 1), + (12739, 3701, 1), + (12749, 30, 1), + (12750, 30, 1), + (12751, 30, 1), + (12757, 68, 1), + (12758, 68, 1), + (12759, 68, 1), + (12760, 175, 3), + (12761, 175, 3), + (12762, 175, 3), + (12773, 1580, 1), + (12774, 1580, 1), + (12775, 1580, 1), + (12776, 1580, 1), + (12777, 1580, 1), + (12779, 826, 1), + (12780, 826, 1), + (12781, 826, 1), + (12782, 826, 1), + (12783, 826, 1), + (12784, 826, 1), + (12798, 278, 5), + (12799, 278, 5), + (12800, 278, 5), + (12831, 128, 1), + (12834, 128, 1), + (12835, 128, 1), + (12840, 3817, 1), + (12841, 3817, 1), + (12849, 8303, 1), + (12860, 23, 3), + (12863, 23, 3), + (12865, 1155, 1), + (12866, 639, 1), + (12867, 6106, 6), + (12871, 452, 3), + (12872, 452, 3), + (12874, 451, 1), + (12876, 7003, 1), + (12877, 7003, 1), + (12878, 7003, 1), + (12881, 172, 1), + (12886, 304, 5), + (12887, 303, 5), + (12888, 305, 5), + (12889, 501, 1), + (12890, 507, 1), + (12892, 509, 3), + (12894, 1122, 1), + (12899, 57, 1), + (12900, 57, 1), + (12902, 1380, 1), + (12903, 1380, 1), + (12907, 1381, 1), + (12908, 1381, 1), + (12912, 1382, 1), + (12913, 1382, 1), + (12934, 173, 3), + (12956, 784, 1), + (12957, 786, 1), + (12958, 787, 1), + (12959, 785, 1), + (12964, 596, 1), + (12965, 597, 1), + (12968, 1041, 1), + (12969, 1041, 1), + (12970, 1041, 1), + (12977, 1041, 1), + (12978, 1041, 1), + (12979, 1041, 1), + (12980, 1041, 1), + (12981, 1041, 1), + (12992, 707, 4), + (12993, 707, 4), + (12994, 707, 4), + (13001, 9504, 1), + (13002, 9504, 1), + (13003, 9504, 1), + (13004, 153, 9), + (13005, 171, 1), + (13006, 171, 1), + (13007, 171, 1), + (13008, 859, 1), + (13009, 3730, 1), + (13010, 47, 1), + (13011, 47, 1), + (13012, 47, 1), + (13013, 446, 1), + (13014, 446, 1), + (13015, 446, 1), + (13017, 3815, 10), + (13018, 3815, 10), + (13019, 3815, 10), + (13023, 309, 6), + (13055, 8400, 1), + (13067, 643, 1), + (13072, 3514, 1), + (13073, 3514, 1), + (13074, 310, 6), + (13075, 310, 6), + (13076, 310, 6), + (13077, 311, 3), + (13078, 311, 3), + (13090, 20, 1), + (13092, 82, 1), + (13093, 82, 1), + (13094, 82, 1), + (13104, 87, 1), + (13105, 87, 1), + (13106, 87, 1), + (13130, 1685, 1), + (13140, 391, 9), + (13141, 391, 9), + (13142, 391, 9), + (13143, 500, 1), + (13144, 500, 1), + (13145, 500, 1), + (13146, 494, 1), + (13147, 494, 1), + (13148, 494, 1), + (13155, 705, 1), + (13166, 822, 1), + (13167, 822, 1), + (13168, 822, 1), + (13170, 128, 3), + (13190, 187, 5), + (13191, 187, 5), + (13192, 187, 5), + (13196, 3837, 3), + (13197, 3837, 3), + (13198, 3837, 3), + (13203, 199, 3), + (13204, 8261, 1), + (13205, 8261, 1), + (13206, 8261, 1), + (13213, 439, 3), + (13214, 439, 3), + (13215, 439, 3), + (13216, 439, 3), + (13217, 439, 3), + (13222, 3514, 1), + (13223, 3514, 1), + (13241, 173, 8), + (13244, 46, 1), + (13247, 409, 3), + (13253, 58, 1), + (13254, 58, 1), + (13255, 58, 1), + (13256, 224, 3), + (13257, 224, 3), + (13258, 224, 3), + (13262, 102, 1), + (13263, 102, 1), + (13264, 102, 1), + (13271, 1685, 1), + (13272, 1685, 1), + (13295, 20, 1), + (13308, 26, 3), + (13326, 310, 6), + (13326, 1685, 1), + (13332, 30, 6), + (13363, 1685, 1), + (13383, 1685, 1), + (13385, 1685, 1), + (13388, 1685, 1), + (13389, 1685, 1), + (13396, 1685, 1), + (13396, 3815, 10), + (13401, 1685, 1), + (13404, 259, 6), + (13404, 1685, 1), + (13410, 1685, 1), + (13413, 1685, 1), + (13415, 1092, 1), + (13415, 1685, 1), + (13416, 626, 1), + (13416, 1685, 1), + (13419, 1685, 1), + (13425, 1685, 1), + (13444, 1685, 1), + (13447, 1685, 1), + (13449, 1685, 1), + (13449, 11073, 1), + (13454, 1685, 1), + (13463, 458, 1), + (13463, 1685, 1), + (13466, 1685, 1), + (13467, 1685, 1), + (13468, 1685, 1), + (13472, 1685, 1), + (13474, 444, 1), + (13474, 1685, 1), + (13477, 1685, 1), + (13483, 1685, 1), + (13484, 1685, 1), + (13485, 1685, 1), + (13490, 1685, 1), + (13492, 199, 3), + (13492, 1685, 1), + (13493, 1685, 1), + (13496, 187, 5), + (13496, 1685, 1), + (13499, 30, 1), + (13499, 1685, 1), + (13502, 259, 3), + (13502, 1685, 1), + (13505, 1685, 1), + (13508, 1685, 1), + (13511, 1685, 1), + (13511, 3837, 3), + (13514, 1685, 1), + (13517, 941, 1), + (13517, 1685, 1), + (13520, 1685, 1), + (13521, 1685, 1), + (13524, 1685, 1), + (13527, 1685, 1), + (13528, 1685, 1), + (13529, 1685, 1), + (13530, 1685, 1), + (13533, 1685, 1), + (13542, 184, 3), + (13542, 1685, 1), + (13545, 1685, 1), + (13546, 1685, 1), + (13549, 1685, 1), + (13556, 1685, 1), + (13562, 872, 1), + (13562, 1685, 1), + (13565, 1685, 1), + (13565, 3804, 1), + (13568, 876, 1), + (13568, 1685, 1), + (13571, 1685, 1), + (13575, 1685, 1), + (13578, 1685, 1), + (13584, 1685, 1), + (13585, 1685, 1), + (13585, 3826, 1), + (13586, 1685, 1), + (13589, 30, 3), + (13589, 1685, 1), + (13590, 30, 3), + (13590, 1685, 1), + (13592, 702, 1), + (13592, 1685, 1), + (13595, 1685, 1), + (13595, 6001, 11), + (13598, 1685, 1), + (13601, 1685, 1), + (13604, 1685, 1), + (13607, 1685, 1), + (13610, 1685, 1), + (13613, 1685, 1), + (13616, 1685, 1), + (13617, 1685, 1), + (13618, 1685, 1), + (13619, 1685, 1), + (13621, 278, 5), + (13621, 1685, 1), + (13624, 1685, 1), + (13627, 1685, 1), + (13628, 1685, 1), + (13630, 1685, 1), + (13633, 1685, 1), + (13646, 1668, 1), + (13646, 1685, 1), + (13650, 1685, 1), + (13653, 1685, 1), + (13656, 1685, 1), + (13663, 1685, 1), + (13667, 500, 1), + (13667, 1685, 1), + (13670, 1685, 1), + (13673, 1158, 1), + (13674, 7754, 1), + (13675, 278, 5), + (13675, 1685, 1), + (13678, 1685, 1), + (13682, 1685, 1), + (13683, 1685, 1), + (13684, 1685, 1), + (13685, 1685, 1), + (13686, 1685, 1), + (13687, 1685, 1), + (13688, 1685, 1), + (13689, 751, 1), + (13689, 1685, 1), + (13692, 1685, 1), + (13693, 1685, 1), + (13695, 1685, 1), + (13698, 784, 1), + (13698, 1685, 1), + (13701, 785, 1), + (13701, 1685, 1), + (13704, 787, 1), + (13704, 1685, 1), + (13707, 58, 1), + (13707, 1685, 1), + (13710, 1685, 1), + (13713, 1685, 1), + (13718, 1685, 1), + (13720, 1685, 1), + (13723, 58, 1), + (13723, 1685, 1), + (13726, 1685, 1), + (13727, 25, 3), + (13727, 1685, 1), + (13734, 217, 1), + (13734, 1685, 1), + (13753, 534, 1), + (13753, 1685, 1), + (13758, 602, 1), + (13758, 1685, 1), + (13763, 1685, 1), + (13764, 535, 1), + (13764, 1685, 1), + (13767, 1685, 1), + (13770, 1685, 1), + (13771, 1685, 1), + (13773, 310, 3), + (13773, 1685, 1), + (13774, 310, 3), + (13774, 1685, 1), + (13775, 310, 3), + (13775, 1685, 1), + (13779, 1685, 1), + (13782, 439, 3), + (13782, 1685, 1), + (13785, 1685, 1), + (13789, 1685, 1), + (13790, 1685, 1), + (13792, 1685, 1), + (13795, 1685, 1), + (13798, 1685, 1), + (13804, 1685, 1), + (13807, 1685, 1), + (13810, 1685, 1), + (13813, 1685, 1), + (13816, 1685, 1), + (13819, 1685, 1), + (13820, 1685, 1), + (13823, 1685, 1), + (13826, 1685, 1), + (13829, 1685, 1), + (13832, 1685, 1), + (13835, 1685, 1), + (13838, 1685, 1), + (13841, 1685, 1), + (13845, 1685, 1), + (13872, 1685, 1), + (13873, 961, 1), + (13873, 1685, 1), + (13878, 609, 1), + (13878, 1685, 1), + (13881, 387, 1), + (13881, 1685, 1), + (13889, 1012, 1), + (13889, 1685, 1), + (13899, 1685, 1), + (13905, 1685, 1), + (13908, 1685, 1), + (13911, 1685, 1), + (13914, 1685, 1), + (13917, 606, 1), + (13917, 1685, 1), + (13920, 125, 1), + (13920, 1685, 1), + (13933, 142, 20), + (13943, 142, 20), + (13953, 142, 20), + (13963, 142, 20), + (13973, 142, 20), + (13983, 142, 20), + (13993, 142, 20), + (14003, 1685, 1), + (14006, 30, 6), + (14006, 1685, 1), + (14009, 1685, 1), + (14010, 1685, 1), + (14011, 1685, 1), + (14011, 10394, 1), + (14016, 1685, 1), + (14016, 6001, 17), + (14018, 1684, 1), + (14019, 1685, 1), + (14026, 1685, 1), + (14029, 1685, 1), + (14032, 1685, 1), + (14037, 804, 1), + (14037, 1685, 1), + (14040, 300, 1), + (14040, 1685, 1), + (14043, 1685, 1), + (14046, 87, 1), + (14046, 1685, 1), + (14051, 1685, 1), + (14052, 1685, 1), + (14053, 1685, 1), + (14054, 1685, 1), + (14055, 1685, 1), + (14056, 1685, 1), + (14059, 1685, 1), + (14062, 821, 1), + (14062, 1685, 1), + (14065, 1685, 1), + (14065, 3215, 1), + (14068, 1685, 1), + (14068, 3216, 1), + (14071, 1685, 1), + (14076, 1685, 1), + (14080, 1685, 1), + (14081, 1685, 1), + (14082, 1685, 1), + (14085, 741, 1), + (14085, 1685, 1), + (14088, 769, 1), + (14088, 1685, 1), + (14091, 701, 1), + (14091, 1685, 1), + (14094, 1685, 1), + (14097, 1685, 1), + (14100, 1685, 1), + (14101, 1685, 1), + (14111, 1685, 1), + (14112, 1685, 1), + (14115, 872, 1), + (14115, 1685, 1), + (14129, 1685, 1), + (14130, 1685, 1), + (14132, 1685, 1), + (14132, 2234, 1), + (14135, 1685, 1), + (14138, 1685, 1), + (14139, 1685, 1), + (14140, 1685, 1), + (14141, 1685, 1), + (14144, 1685, 1), + (14144, 3515, 1), + (14148, 1685, 1), + (14151, 1685, 1), + (14154, 276, 3), + (14154, 1685, 1), + (14157, 1685, 1), + (14160, 1685, 1), + (14160, 7001, 1), + (14163, 1685, 1), + (14163, 7001, 1), + (14166, 945, 1), + (14166, 1685, 1), + (14169, 1685, 1), + (14173, 1685, 1), + (14176, 1685, 1), + (14176, 8261, 1), + (14179, 359, 1), + (14179, 1685, 1), + (14180, 1685, 1), + (14181, 1685, 1), + (14181, 3837, 12), + (14186, 809, 5), + (14186, 1685, 1), + (14189, 1685, 1), + (14192, 1685, 1), + (14196, 465, 3), + (14196, 1685, 1), + (14199, 499, 1), + (14199, 1685, 1), + (14200, 1685, 1), + (14203, 1685, 1), + (14206, 1685, 1), + (14207, 1685, 1), + (14208, 1685, 1), + (14208, 7689, 1), + (14209, 1685, 1), + (14210, 1685, 1), + (14213, 1065, 1), + (14213, 1685, 1), + (14218, 1685, 1), + (14221, 1685, 1), + (14222, 224, 3), + (14222, 1685, 1), + (14223, 47, 1), + (14223, 1685, 1), + (14224, 1685, 1), + (14225, 177, 1), + (14225, 1685, 1), + (14229, 135, 1), + (14231, 1685, 1), + (14232, 1685, 1), + (14233, 1685, 1), + (14234, 1685, 1), + (14237, 1685, 1), + (14238, 1041, 1), + (14238, 1685, 1), + (14241, 386, 1), + (14241, 1685, 1), + (14244, 1685, 1), + (14249, 1685, 1), + (14254, 386, 1), + (14254, 1685, 1), + (14256, 1685, 1), + (14259, 384, 1), + (14259, 1685, 1), + (14265, 939, 1), + (14265, 1685, 1), + (14272, 1685, 1), + (14273, 1685, 1), + (14274, 1685, 1), + (14275, 1685, 1), + (14278, 985, 1), + (14278, 1685, 1), + (14280, 57, 1), + (14280, 1685, 1), + (14281, 291, 1), + (14281, 1685, 1), + (14282, 1685, 1), + (14282, 3812, 1), + (14283, 1685, 1), + (14286, 753, 1), + (14286, 1685, 1), + (14289, 1685, 1), + (14292, 207, 1), + (14292, 1685, 1), + (14295, 1685, 1), + (14295, 3816, 1), + (14304, 1685, 1), + (14304, 8341, 1), + (14307, 1685, 1), + (14308, 431, 1), + (14308, 1685, 1), + (14311, 430, 1), + (14311, 1685, 1), + (14314, 901, 1), + (14314, 1685, 1), + (14318, 1685, 1), + (14318, 7703, 1), + (14321, 1685, 1), + (14322, 1685, 1), + (14323, 1685, 1), + (14324, 1685, 1), + (14328, 1154, 1), + (14328, 1685, 1), + (14331, 515, 1), + (14331, 1685, 1), + (14338, 308, 3), + (14338, 1685, 1), + (14341, 748, 1), + (14341, 1685, 1), + (14346, 1685, 1), + (14349, 215, 6), + (14352, 175, 3), + (14352, 1685, 1), + (14355, 1685, 1), + (14358, 1685, 1), + (14359, 1685, 1), + (14360, 1685, 1), + (14361, 23, 3), + (14364, 173, 1), + (14364, 1685, 1), + (14372, 1685, 1), + (14690, 756, 1), + (14733, 786, 1), + (15100, 467, 1), + (15105, 131, 1), + (15113, 130, 1), + (15120, 800, 1), + (15132, 660, 1), + (15135, 660, 1), + (15141, 30, 3), + (15147, 701, 13), + (15154, 659, 1), + (15158, 657, 1), + (15159, 770, 1), + (15162, 659, 1), + (15168, 657, 1), + (15174, 9400, 1), + (15179, 7755, 1), + (15182, 9403, 1), + (15204, 390, 1), + (15207, 323, 1), + (15210, 1041, 1), + (15220, 622, 1), + (15223, 624, 1), + (15226, 621, 1), + (15229, 623, 1), + (15253, 462, 1), + (15258, 184, 1), + (15270, 7003, 1), + (15280, 778, 1), + (15295, 2234, 1), + (15314, 36, 1), + (15317, 35, 1), + (15320, 558, 1), + (15341, 19, 3), + (15342, 8500, 1), + (15344, 38, 1), + (15348, 9504, 1), + (15356, 149, 1), + (15358, 151, 1), + (15359, 50, 1), + (15363, 447, 3), + (15371, 3729, 1), + (15377, 638, 1), + (15389, 935, 1), + (15396, 23, 3), + (15397, 494, 3), + (15403, 8604, 1), + (15406, 3817, 1), + (15414, 241, 1), + (15421, 245, 3), + (15424, 247, 1), + (15424, 982, 6), + (15466, 3551, 1), + (15469, 1120, 1), + (15472, 521, 1), + (15478, 578, 1), + (15481, 398, 24), + (15482, 261, 1), + (15485, 495, 9), + (15486, 534, 3), + (15526, 3702, 1), + (15549, 244, 1), + (15552, 3710, 1), + (15571, 351, 1), + (15579, 826, 1), + (15591, 2899, 1), + (15598, 759, 1), + (15598, 1150, 1), + (15598, 1151, 1), + (15598, 1152, 1), + (15605, 639, 1), + (15606, 160, 4), + (15622, 23, 3), + (15632, 789, 1), + (15639, 749, 1), + (15640, 822, 2), + (15746, 804, 1), + (15778, 87, 1), + (15833, 2045, 1), + (15836, 463, 1), + (15839, 19, 9), + (15855, 153, 9), + (15891, 988, 1), + (15893, 987, 1), + (15895, 986, 1), + (15961, 3701, 1), + (16062, 263, 1), + (16071, 2209, 3), + (16087, 53, 1), + (16094, 43, 1), + (16103, 7703, 1), + (16105, 684, 1), + (16106, 684, 1), + (16107, 684, 1), + (16117, 309, 6), + (16124, 3711, 1), + (16128, 3711, 1), + (16131, 73, 1), + (16137, 10394, 1), + (16140, 489, 1), + (16156, 137, 1), + (16159, 2045, 1), + (16163, 260, 1), + (16163, 7747, 1), + (16164, 358, 3), + (16176, 337, 1), + (16180, 584, 1), + (16185, 9202, 1), + (16185, 9203, 1), + (16189, 823, 3), + (16203, 403, 1), + (16211, 152, 1), + (16218, 403, 1), + (16221, 393, 1), + (16225, 219, 1), + (16238, 443, 1), + (16246, 245, 3), + (16249, 17, 3), + (16257, 470, 20), + (16266, 790, 1), + (16287, 669, 1), + (16297, 553, 1), + (16300, 668, 1), + (16303, 3506, 1), + (16306, 777, 1), + (16336, 1257, 1), + (16339, 773, 1), + (16342, 1257, 1), + (16371, 60, 1), + (16380, 2061, 1), + (16386, 2064, 1), + (16392, 2202, 1), + (16489, 23, 3), + (16604, 180, 3), + (16644, 747, 1), + (16666, 742, 1), + (16730, 82, 3), + (16745, 706, 1), + (17206, 601, 1), + (17209, 111, 1), + (17212, 10367, 1), + (17218, 744, 1), + (17235, 3826, 1), + (17280, 8205, 1), + (17281, 359, 1), + (17288, 41, 1), + (17289, 1062, 1), + (17307, 2047, 1), + (17317, 1270, 1), + (17334, 1041, 1), + (17336, 148, 1), + (17339, 760, 1), + (17342, 148, 1), + (17350, 170, 3), + (17361, 405, 1), + (17361, 426, 1), + (17364, 935, 4), + (17375, 1239, 1), + (17391, 98, 1), + (17409, 120, 1), + (17414, 673, 1), + (17436, 372, 1), + (17439, 372, 1), + (17441, 309, 3), + (17476, 462, 3), + (17492, 840, 1), + (17495, 9702, 1), + (17515, 3841, 1), + (17517, 441, 1), + (17522, 764, 1), + (17533, 677, 1), + (17549, 8700, 1); + +DROP TABLE IF EXISTS `character_alternate_abilities`; +CREATE TABLE IF NOT EXISTS `character_alternate_abilities` ( + `id` int(11) unsigned NOT NULL DEFAULT '0', + `aa_id` smallint(11) unsigned NOT NULL DEFAULT '0', + `aa_value` smallint(11) unsigned NOT NULL DEFAULT '0', + `charges` smallint(11) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`,`aa_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; From 25c6ddd6318f77672341f5670e7896dea518ebd7 Mon Sep 17 00:00:00 2001 From: KimLS Date: Thu, 2 Jul 2015 20:07:09 -0700 Subject: [PATCH 58/90] Scary final SQL stuff for aa branch --- common/version.h | 2 +- utils/sql/db_update_manifest.txt | 1 + .../sql/git/required/2015_07_02_aa_rework.sql | 20 +++++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/common/version.h b/common/version.h index 1813f77c3..00f74e801 100644 --- a/common/version.h +++ b/common/version.h @@ -30,7 +30,7 @@ Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt */ -#define CURRENT_BINARY_DATABASE_VERSION 9083 +#define CURRENT_BINARY_DATABASE_VERSION 9084 #define COMPILE_DATE __DATE__ #define COMPILE_TIME __TIME__ #ifndef WIN32 diff --git a/utils/sql/db_update_manifest.txt b/utils/sql/db_update_manifest.txt index e7aa46221..1a67e2893 100644 --- a/utils/sql/db_update_manifest.txt +++ b/utils/sql/db_update_manifest.txt @@ -337,6 +337,7 @@ 9081|2015_05_23_dbstr_us.sql|SHOW TABLES LIKE 'db_str'|empty| 9082|2015_05_25_npc_types_texture_fields.sql|SHOW COLUMNS FROM `npc_types` LIKE 'armtexture'|empty| 9083|2015_06_07_aa_update.sql|SHOW COLUMNS FROM `character_alternate_abilities` LIKE 'charges'|empty| +9084|2015_07_92_aa_rework.sql|SHOW TABLES LIKE 'aa_ranks'|empty| # Upgrade conditions: # This won't be needed after this system is implemented, but it is used database that are not diff --git a/utils/sql/git/required/2015_07_02_aa_rework.sql b/utils/sql/git/required/2015_07_02_aa_rework.sql index 41a67f7c0..8a585113c 100644 --- a/utils/sql/git/required/2015_07_02_aa_rework.sql +++ b/utils/sql/git/required/2015_07_02_aa_rework.sql @@ -20649,6 +20649,7 @@ INSERT INTO `aa_rank_prereqs` (`rank_id`, `aa_id`, `points`) VALUES (17533, 677, 1), (17549, 8700, 1); +RENAME TABLE `character_alternate_abilities` TO `character_alternate_abilities_old`; DROP TABLE IF EXISTS `character_alternate_abilities`; CREATE TABLE IF NOT EXISTS `character_alternate_abilities` ( `id` int(11) unsigned NOT NULL DEFAULT '0', @@ -20657,3 +20658,22 @@ CREATE TABLE IF NOT EXISTS `character_alternate_abilities` ( `charges` smallint(11) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`,`aa_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +ALTER TABLE `character_data` ADD COLUMN `aa_points_spent_old` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `aa_points_spent`; +ALTER TABLE `character_data` ADD COLUMN `aa_points_old` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `aa_points`; + +UPDATE `character_data` SET `aa_points_spent_old` = `aa_points_spent`, `aa_points_old` = `aa_points`; + + -- sanity checks since if someone never logged in after the db conversion there is junk data + -- I don't have a good way of addressing this so I keep the old data in aa_points_spent_old and aa_points_old and character_alternate_abilities_old + -- for anyone who wants to personally polish up their player data +UPDATE `character_data` SET `aa_points_spent` = 2700 WHERE `aa_points_spent` > 2700; +UPDATE `character_data` SET `aa_points` = 5000 WHERE `aa_points` > 5000; + + -- another sanity check, give people a few levels below 51 to keep their points +UPDATE `character_data` SET `aa_points_spent` = 0 WHERE `level` < 48; +UPDATE `character_data` SET `aa_points` = 0 WHERE `level` < 48; + + -- aa refund here +UPDATE `character_data` SET `aa_points` = `aa_points_spent` + `aa_points`; +UPDATE `character_data` SET `aa_points_spent` = 0; From 233b096c17aee4fe521a5898f407b8f2f2a7add2 Mon Sep 17 00:00:00 2001 From: KimLS Date: Thu, 2 Jul 2015 20:10:26 -0700 Subject: [PATCH 59/90] 0 != 9 and i suck at manifests cause of that fact --- utils/sql/db_update_manifest.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/sql/db_update_manifest.txt b/utils/sql/db_update_manifest.txt index 1a67e2893..08b3994fa 100644 --- a/utils/sql/db_update_manifest.txt +++ b/utils/sql/db_update_manifest.txt @@ -337,7 +337,7 @@ 9081|2015_05_23_dbstr_us.sql|SHOW TABLES LIKE 'db_str'|empty| 9082|2015_05_25_npc_types_texture_fields.sql|SHOW COLUMNS FROM `npc_types` LIKE 'armtexture'|empty| 9083|2015_06_07_aa_update.sql|SHOW COLUMNS FROM `character_alternate_abilities` LIKE 'charges'|empty| -9084|2015_07_92_aa_rework.sql|SHOW TABLES LIKE 'aa_ranks'|empty| +9084|2015_07_02_aa_rework.sql|SHOW TABLES LIKE 'aa_ranks'|empty| # Upgrade conditions: # This won't be needed after this system is implemented, but it is used database that are not From 81e827481b2c3fc4d919fd8de488a76bcdf07ad0 Mon Sep 17 00:00:00 2001 From: KimLS Date: Thu, 2 Jul 2015 20:18:08 -0700 Subject: [PATCH 60/90] Final touch up on this, changelog + fix for sql classes default being left shifted 1. --- changelog.txt | 6 ++++++ utils/sql/git/required/2015_07_02_aa_rework.sql | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index eaaa6fb7a..3c31c83e5 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,11 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 7/2/2015 == +KLS/Demonstar55: AA system has been rewritten fixing a ton of bugs and extending functionality while making it easier to create new AA points. +KLS/Demonstar55: New tables are needed and so older data will need to be migrated to the new system. +KLS/Demonstar55: The SQL saves the old aa points spent/avail/character_alt_abilities data if any server ops want to do something different than PEQ did with it. +KLS/Demonstar55: Will try to get a wiki entry written up next week some time explaining the system but it's really not hard to follow the db tables in the meantime. + == 7/1/2015 == Akkadius: Fix an issue where emote messages would overflow the buffer of 256 by increasing the size and changing some of the initialization Akkadius: Added a custom Health Update message that will display in the middle of the players screen, to enable this server wide you must enable rule 'Character:MarqueeHPUpdates' diff --git a/utils/sql/git/required/2015_07_02_aa_rework.sql b/utils/sql/git/required/2015_07_02_aa_rework.sql index 8a585113c..77dde6b86 100644 --- a/utils/sql/git/required/2015_07_02_aa_rework.sql +++ b/utils/sql/git/required/2015_07_02_aa_rework.sql @@ -3,7 +3,7 @@ CREATE TABLE IF NOT EXISTS `aa_ability` ( `id` int(10) unsigned NOT NULL, `name` text NOT NULL, `category` int(10) NOT NULL DEFAULT '-1', - `classes` int(10) NOT NULL DEFAULT '131070', + `classes` int(10) NOT NULL DEFAULT '65535', `races` int(10) NOT NULL DEFAULT '65535', `drakkin_heritage` int(10) NOT NULL DEFAULT '127', `deities` int(10) NOT NULL DEFAULT '131071', From 803fa48c053b6cb6b81c14b2b69eb735f1a63cf7 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Fri, 3 Jul 2015 02:17:14 -0400 Subject: [PATCH 61/90] Fix AA class check --- zone/aa.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index db765e813..9794aea77 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -839,7 +839,7 @@ void Client::SendAlternateAdvancementRank(int aa_id, int level) { return; } - if(!(ability->classes & (1 << GetClass()))) { + if(!(ability->classes & (1 << (GetClass() - 1)))) { return; } @@ -1400,7 +1400,7 @@ bool Mob::CanUseAlternateAdvancementRank(AA::Rank *rank) { if(!ability) return false; - if(!ability->classes & (1 << GetClass())) { + if(!(ability->classes & (1 << (GetClass() - 1)))) { return false; } From 927a88cf96931a2d0d087ea1ad4a28d030ceaeb0 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Fri, 3 Jul 2015 02:31:12 -0400 Subject: [PATCH 62/90] Really fix class AA check --- zone/aa.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index 9794aea77..d1dad4f40 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -839,7 +839,7 @@ void Client::SendAlternateAdvancementRank(int aa_id, int level) { return; } - if(!(ability->classes & (1 << (GetClass() - 1)))) { + if(!(ability->classes & (1 << GetClass()))) { return; } @@ -1400,7 +1400,7 @@ bool Mob::CanUseAlternateAdvancementRank(AA::Rank *rank) { if(!ability) return false; - if(!(ability->classes & (1 << (GetClass() - 1)))) { + if(!(ability->classes & (1 << GetClass()))) { return false; } From 59e40b3fbe76f6ca1c8453eeb7e7a9d14ad08b96 Mon Sep 17 00:00:00 2001 From: Kinglykrab Date: Fri, 3 Jul 2015 14:57:48 -0400 Subject: [PATCH 63/90] Files changed: command.cpp, questmgr.cpp - Added command aliases: #findzone -> #fz, #reloadquest -> #rq - Added instance ID to $client->GoToSafeCoords() in quest::safemove(); --- zone/command.cpp | 2 ++ zone/questmgr.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/zone/command.cpp b/zone/command.cpp index 24c343dd0..ac419043f 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -218,6 +218,7 @@ int command_init(void) { command_add("flymode", "[0/1/2] - Set your or your player target's flymode to off/on/levitate", 50, command_flymode) || command_add("fov", "- Check wether you're behind or in your target's field of view", 80, command_fov) || command_add("freeze", "- Freeze your target", 80, command_freeze) || + command_add("fz", nullptr, 10, command_findzone) || command_add("gassign", "[id] - Assign targetted NPC to predefined wandering grid id", 100, command_gassign) || command_add("gender", "[0/1/2] - Change your or your target's gender to male/female/neuter", 50, command_gender) || command_add("getplayerburriedcorpsecount", "- Get the target's total number of burried player corpses.", 100, command_getplayerburriedcorpsecount) || @@ -336,6 +337,7 @@ int command_init(void) { command_add("resetaa", "- Resets a Player's AA in their profile and refunds spent AA's to unspent, may disconnect player.", 200, command_resetaa) || command_add("resetaa_timer", "Command to reset AA cooldown timers.", 200, command_resetaa_timer) || command_add("revoke", "[charname] [1/0] - Makes charname unable to talk on OOC", 200, command_revoke) || + command_add("rq", nullptr, 150, command_reloadqst) || command_add("rules", "(subcommand) - Manage server rules", 250, command_rules) || command_add("save", "- Force your player or player corpse target to be saved to the database", 50, command_save) || command_add("scribespell", "[spellid] - Scribe specified spell in your target's spell book.", 180, command_scribespell) || diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 67a1f06da..71f0de917 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -874,7 +874,7 @@ bool QuestManager::isdisctome(int item_id) { void QuestManager::safemove() { QuestManagerCurrentQuestVars(); if (initiator && initiator->IsClient()) - initiator->GoToSafeCoords(zone->GetZoneID(), 0); + initiator->GoToSafeCoords(zone->GetZoneID(), zone->GetInstanceID()); } void QuestManager::rain(int weather) { From 037265161301787f6e1a2d0bd88e7eef818080f5 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Fri, 3 Jul 2015 17:42:31 -0400 Subject: [PATCH 64/90] Fix Bot::LoadAA --- zone/bot.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/zone/bot.cpp b/zone/bot.cpp index 9dae2fc6a..912997a88 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -1271,6 +1271,7 @@ void Bot::LoadAAs() { //skip expendables if(!ability->first || ability->charges > 0) { + ++iter; continue; } From 80c2d9d68db38192a75c311fe96e62c9d6145ee3 Mon Sep 17 00:00:00 2001 From: Natedog2012 Date: Fri, 3 Jul 2015 15:44:31 -0700 Subject: [PATCH 65/90] Set a deity for bots so they can LoadAA --- zone/bot.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/zone/bot.cpp b/zone/bot.cpp index 912997a88..5450d4f8a 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -694,6 +694,7 @@ void Bot::GenerateBaseStats() { this->pAggroRange = 0; this->pAssistRange = 0; this->raid_target = false; + this->deity = 396; } void Bot::GenerateAppearance() { From 49e9c9ee345556ca46b6fe429c2d9de5d49b7853 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sat, 4 Jul 2015 02:13:26 -0400 Subject: [PATCH 66/90] Reworked activated avoidance skills based on dev quotes --- changelog.txt | 5 + zone/attack.cpp | 368 ++++++++++++++++++--------------------- zone/bot.cpp | 263 ++++++---------------------- zone/bot.h | 3 +- zone/mob.h | 2 +- zone/special_attacks.cpp | 58 +++--- 6 files changed, 258 insertions(+), 441 deletions(-) diff --git a/changelog.txt b/changelog.txt index 3c31c83e5..f3fdc3ba0 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,10 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 7/4/2015 == +mackal: Reworked the activated avoidace skills (riposte, dodge, etc) based on dev quotes + This also fixes the order things are checked (avoidance skills, THEN hit/miss) + Also riposte immunity from the increase riposte chance spell effect. + == 7/2/2015 == KLS/Demonstar55: AA system has been rewritten fixing a ton of bugs and extending functionality while making it easier to create new AA points. KLS/Demonstar55: New tables are needed and so older data will need to be migrated to the new system. diff --git a/zone/attack.cpp b/zone/attack.cpp index c493b159f..8a120b896 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -341,7 +341,7 @@ bool Mob::CheckHitChance(Mob* other, SkillUseTypes skillinuse, int Hand, int16 c return(tohit_roll <= chancetohit); } -bool Mob::AvoidDamage(Mob* other, int32 &damage, bool CanRiposte) +bool Mob::AvoidDamage(Mob *other, int32 &damage, int hand) { /* called when a mob is attacked, does the checks to see if it's a hit * and does other mitigation checks. 'this' is the mob being attacked. @@ -353,22 +353,32 @@ bool Mob::AvoidDamage(Mob* other, int32 &damage, bool CanRiposte) * -4 - dodge * */ - float skill; - float bonus; - float RollTable[4] = {0,0,0,0}; - float roll; - Mob *attacker=other; - Mob *defender=this; - //garunteed hit - bool ghit = false; - if((attacker->aabonuses.MeleeSkillCheck + attacker->spellbonuses.MeleeSkillCheck + attacker->itembonuses.MeleeSkillCheck) > 500) - ghit = true; + /* Order according to current (SoF+?) dev quotes: + * https://forums.daybreakgames.com/eq/index.php?threads/test-update-06-10-15.223510/page-2#post-3261772 + * https://forums.daybreakgames.com/eq/index.php?threads/test-update-06-10-15.223510/page-2#post-3268227 + * Riposte 50, hDEX, must have weapon/fists, doesn't work on archery/throwing + * Block 25, hDEX, works on archery/throwing, behind block done here if back to attacker base1 is chance + * Parry 45, hDEX, doesn't work on throwing/archery, must be facing target + * Dodge 45, hAGI, works on archery/throwing, monks can dodge attacks from behind + * Shield Block, rand base1 + * Staff Block, rand base1 + * regular strike through + * avoiding the attack (CheckHitChance) + * As soon as one succeeds, none of the rest are checked + * + * Formula (all int math) + * (posted for parry, assume rest at the same) + * Chance = (((SKILL + 100) + [((SKILL+100) * SPA(175).Base1) / 100]) / 45) + [(hDex / 25) - min([hDex / 25], hStrikethrough)]. + * hStrikethrough is a mob stat that was added to counter the bonuses of heroic stats + * Number rolled against 100, if the chance is greater than 100 it happens 100% of time + * + * Things with 10k accuracy mods can be avoided with these skills qq + */ + Mob *attacker = other; + Mob *defender = this; - bool InFront = false; - - if (attacker->InFrontMob(this, attacker->GetX(), attacker->GetY())) - InFront = true; + bool InFront = attacker->InFrontMob(this, attacker->GetX(), attacker->GetY()); /* This special ability adds a negative modifer to the defenders riposte/block/parry/chance @@ -383,10 +393,9 @@ bool Mob::AvoidDamage(Mob* other, int32 &damage, bool CanRiposte) int counter_parry = 0; int counter_dodge = 0; - if (attacker->GetSpecialAbility(COUNTER_AVOID_DAMAGE)){ - + if (attacker->GetSpecialAbility(COUNTER_AVOID_DAMAGE)) { counter_all = attacker->GetSpecialAbilityParam(COUNTER_AVOID_DAMAGE, 0); - counter_riposte = attacker->GetSpecialAbilityParam(COUNTER_AVOID_DAMAGE,1); + counter_riposte = attacker->GetSpecialAbilityParam(COUNTER_AVOID_DAMAGE, 1); counter_block = attacker->GetSpecialAbilityParam(COUNTER_AVOID_DAMAGE, 2); counter_parry = attacker->GetSpecialAbilityParam(COUNTER_AVOID_DAMAGE, 3); counter_dodge = attacker->GetSpecialAbilityParam(COUNTER_AVOID_DAMAGE, 4); @@ -400,31 +409,37 @@ bool Mob::AvoidDamage(Mob* other, int32 &damage, bool CanRiposte) Log.Out(Logs::Detail, Logs::Combat, "I am enraged, riposting frontal attack."); } - ///////////////////////////////////////////////////////// - // riposte - ///////////////////////////////////////////////////////// - float riposte_chance = 0.0f; - if (CanRiposte && damage > 0 && CanThisClassRiposte() && InFront) - { - riposte_chance = (100.0f + static_cast(aabonuses.RiposteChance + spellbonuses.RiposteChance + - itembonuses.RiposteChance - counter_riposte - counter_all)) / 100.0f; - skill = GetSkill(SkillRiposte); - if (IsClient()) { + // riposte -- it may seem crazy, but if the attacker has SPA 173 on them, they are immune to Ripo + bool ImmuneRipo = attacker->aabonuses.RiposteChance || attacker->spellbonuses.RiposteChance || attacker->itembonuses.RiposteChance; + // Need to check if we have something in MainHand to actually attack with (or fists) + if (hand != MainRange && CanThisClassRiposte() && InFront && !ImmuneRipo) { + if (IsClient()) CastToClient()->CheckIncreaseSkill(SkillRiposte, other, -10); + // check auto discs ... I guess aa/items too :P + if (spellbonuses.RiposteChance == 10000 || aabonuses.RiposteChance == 10000 || itembonuses.RiposteChance == 10000) { + damage = -3; + return true; } - - if (!ghit) { //if they are not using a garunteed hit discipline - bonus = 2.0 + skill/60.0 + (GetDEX()/200); - bonus *= riposte_chance; - bonus = mod_riposte_chance(bonus, attacker); - RollTable[0] = bonus + (itembonuses.HeroicDEX / 25); // 25 heroic = 1%, applies to ripo, parry, block + int chance = GetSkill(SkillRiposte) + 100; + chance += (chance * (aabonuses.RiposteChance + spellbonuses.RiposteChance + itembonuses.RiposteChance)) / 100; + chance /= 50; + chance += itembonuses.HeroicDEX / 25; // live has "heroic strickthrough" here to counter + if (counter_riposte || counter_all) { + float counter = (counter_riposte + counter_all) / 100.0f; + chance -= chance * counter; + } + // AA Slippery Attacks + if (hand == MainSecondary) { + int slip = aabonuses.OffhandRiposteFail + itembonuses.OffhandRiposteFail + spellbonuses.OffhandRiposteFail; + chance += chance * slip / 100; + } + if (chance > 0 && zone->random.Roll(chance)) { // could be <0 from offhand stuff + damage = -3; + return true; } } - /////////////////////////////////////////////////////// // block - /////////////////////////////////////////////////////// - bool bBlockFromRear = false; // a successful roll on this does not mean a successful block is forthcoming. only that a chance to block @@ -435,101 +450,100 @@ bool Mob::AvoidDamage(Mob* other, int32 &damage, bool CanRiposte) if (BlockBehindChance && zone->random.Roll(BlockBehindChance)) bBlockFromRear = true; - float block_chance = 0.0f; - if (damage > 0 && CanThisClassBlock() && (InFront || bBlockFromRear)) { - block_chance = (100.0f + static_cast(aabonuses.IncreaseBlockChance + spellbonuses.IncreaseBlockChance + - itembonuses.IncreaseBlockChance - counter_block - counter_all)) / 100.0f; - skill = CastToClient()->GetSkill(SkillBlock); - if (IsClient()) { + if (CanThisClassBlock() && (InFront || bBlockFromRear)) { + if (IsClient()) CastToClient()->CheckIncreaseSkill(SkillBlock, other, -10); - } - - if (!ghit) { //if they are not using a garunteed hit discipline - bonus = 2.0 + skill/35.0 + (GetDEX()/200); - bonus = mod_block_chance(bonus, attacker); - RollTable[1] = RollTable[0] + (bonus * block_chance); - } - } - else{ - RollTable[1] = RollTable[0]; - } - - //Try Shield Block OR TwoHandBluntBlockCheck - if(damage > 0 && HasShieldEquiped() && (aabonuses.ShieldBlock || spellbonuses.ShieldBlock || itembonuses.ShieldBlock) && (InFront || bBlockFromRear)) - RollTable[1] += static_cast(aabonuses.ShieldBlock + spellbonuses.ShieldBlock + itembonuses.ShieldBlock - counter_block - counter_all); - - else if(damage > 0 && HasTwoHandBluntEquiped() && (aabonuses.TwoHandBluntBlock || spellbonuses.TwoHandBluntBlock || itembonuses.TwoHandBluntBlock) && (InFront || bBlockFromRear)) - RollTable[1] += static_cast(aabonuses.TwoHandBluntBlock + spellbonuses.TwoHandBluntBlock + itembonuses.TwoHandBluntBlock - counter_block - counter_all); - - ////////////////////////////////////////////////////// - // parry - ////////////////////////////////////////////////////// - float parry_chance = 0.0f; - if (damage > 0 && CanThisClassParry() && InFront){ - parry_chance = (100.0f + static_cast(aabonuses.ParryChance + itembonuses.ParryChance + - itembonuses.ParryChance - counter_parry - counter_all)) / 100.0f; - skill = CastToClient()->GetSkill(SkillParry); - if (IsClient()) { - CastToClient()->CheckIncreaseSkill(SkillParry, other, -10); - } - - if (!ghit) { //if they are not using a garunteed hit discipline - bonus = 2.0 + skill/60.0 + (GetDEX()/200); - bonus *= parry_chance; - bonus = mod_parry_chance(bonus, attacker); - RollTable[2] = RollTable[1] + bonus; - } - } - else{ - RollTable[2] = RollTable[1]; - } - - //////////////////////////////////////////////////////// - // dodge - //////////////////////////////////////////////////////// - float dodge_chance = 0.0f; - if (damage > 0 && CanThisClassDodge() && InFront){ - - dodge_chance = (100.0f + static_cast(aabonuses.DodgeChance + spellbonuses.DodgeChance + - itembonuses.DodgeChance - counter_dodge - counter_all)) / 100.0f; - - skill = CastToClient()->GetSkill(SkillDodge); - if (IsClient()) { - CastToClient()->CheckIncreaseSkill(SkillDodge, other, -10); - } - - if (!ghit) { //if they are not using a garunteed hit discipline - bonus = 2.0 + skill/60.0 + (GetAGI()/200); - bonus *= dodge_chance; - //DCBOOMKAR - bonus = mod_dodge_chance(bonus, attacker); - RollTable[3] = RollTable[2] + bonus - (itembonuses.HeroicDEX / 25) + (itembonuses.HeroicAGI / 25); - } - } - else{ - RollTable[3] = RollTable[2]; - } - - if(damage > 0){ - roll = zone->random.Real(0,100); - if(roll <= RollTable[0]){ - damage = -3; - } - else if(roll <= RollTable[1]){ + // check auto discs ... I guess aa/items too :P + if (spellbonuses.IncreaseBlockChance == 10000 || aabonuses.IncreaseBlockChance == 10000 || + itembonuses.IncreaseBlockChance == 10000) { damage = -1; + return true; } - else if(roll <= RollTable[2]){ - damage = -2; + int chance = GetSkill(SkillBlock) + 100; + chance += (chance * (aabonuses.IncreaseBlockChance + spellbonuses.IncreaseBlockChance + itembonuses.IncreaseBlockChance)) / 100; + chance /= 25; + chance += itembonuses.HeroicDEX / 25; // live has "heroic strickthrough" here to counter + if (counter_block || counter_all) { + float counter = (counter_block + counter_all) / 100.0f; + chance -= chance * counter; } - else if(roll <= RollTable[3]){ - damage = -4; + if (zone->random.Roll(chance)) { + damage = -1; + return true; } } - Log.Out(Logs::Detail, Logs::Combat, "Final damage after all avoidances: %d", damage); + // parry + if (CanThisClassParry() && InFront && hand != MainRange) { + if (IsClient()) + CastToClient()->CheckIncreaseSkill(SkillParry, other, -10); + // check auto discs ... I guess aa/items too :P + if (spellbonuses.ParryChance == 10000 || aabonuses.ParryChance == 10000 || itembonuses.ParryChance == 10000) { + damage = -2; + return true; + } + int chance = GetSkill(SkillParry) + 100; + chance += (chance * (aabonuses.ParryChance + spellbonuses.ParryChance + itembonuses.ParryChance)) / 100; + chance /= 45; + chance += itembonuses.HeroicDEX / 25; // live has "heroic strickthrough" here to counter + if (counter_parry || counter_all) { + float counter = (counter_parry + counter_all) / 100.0f; + chance -= chance * counter; + } + if (zone->random.Roll(chance)) { + damage = -2; + return true; + } + } + + // dodge + if (CanThisClassDodge() && (InFront || GetClass() == MONK) ) { + if (IsClient()) + CastToClient()->CheckIncreaseSkill(SkillDodge, other, -10); + // check auto discs ... I guess aa/items too :P + if (spellbonuses.DodgeChance == 10000 || aabonuses.DodgeChance == 10000 || itembonuses.DodgeChance == 10000) { + damage = -4; + return true; + } + int chance = GetSkill(SkillDodge) + 100; + chance += (chance * (aabonuses.DodgeChance + spellbonuses.DodgeChance + itembonuses.DodgeChance)) / 100; + chance /= 45; + chance += itembonuses.HeroicAGI / 25; // live has "heroic strickthrough" here to counter + if (counter_dodge || counter_all) { + float counter = (counter_dodge + counter_all) / 100.0f; + chance -= chance * counter; + } + if (zone->random.Roll(chance)) { + damage = -4; + return true; + } + } + + // Try Shield Block OR TwoHandBluntBlockCheck + if (HasShieldEquiped() && (aabonuses.ShieldBlock || spellbonuses.ShieldBlock || itembonuses.ShieldBlock) && (InFront || bBlockFromRear)) { + int chance = aabonuses.ShieldBlock + spellbonuses.ShieldBlock + itembonuses.ShieldBlock; + if (counter_block || counter_all) { + float counter = (counter_block + counter_all) / 100.0f; + chance -= chance * counter; + } + if (zone->random.Roll(chance)) { + damage = -1; + return true; + } + } + + if (HasTwoHandBluntEquiped() && (aabonuses.TwoHandBluntBlock || spellbonuses.TwoHandBluntBlock || itembonuses.TwoHandBluntBlock) && (InFront || bBlockFromRear)) { + int chance = aabonuses.TwoHandBluntBlock + itembonuses.TwoHandBluntBlock + spellbonuses.TwoHandBluntBlock; + if (counter_block || counter_all) { + float counter = (counter_block + counter_all) / 100.0f; + chance -= chance * counter; + } + if (zone->random.Roll(chance)) { + damage = -1; + return true; + } + } - if (damage < 0) - return true; return false; } @@ -1286,6 +1300,7 @@ bool Client::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, b } } + // this effect is actually a min cap that happens after the final damage is calculated min_hit += min_hit * GetMeleeMinDamageMod_SE(skillinuse) / 100; if(max_hit < min_hit) @@ -1312,62 +1327,41 @@ bool Client::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, b } //check to see if we hit.. - if(!other->CheckHitChance(this, skillinuse, Hand, hit_chance_bonus)) { - Log.Out(Logs::Detail, Logs::Combat, "Attack missed. Damage set to 0."); - damage = 0; - } else { //we hit, try to avoid it - other->AvoidDamage(this, damage); - other->MeleeMitigation(this, damage, min_hit, opts); - if(damage > 0) - CommonOutgoingHitSuccess(other, damage, skillinuse); - - Log.Out(Logs::Detail, Logs::Combat, "Final damage after all reductions: %d", damage); - } - - //riposte - bool slippery_attack = false; // Part of hack to allow riposte to become a miss, but still allow a Strikethrough chance (like on Live) - if (damage == -3) { - if (bRiposte) return false; - else { - if (Hand == MainSecondary) {// Do we even have it & was attack with mainhand? If not, don't bother with other calculations - //Live AA - SlipperyAttacks - //This spell effect most likely directly modifies the actual riposte chance when using offhand attack. - int32 OffhandRiposteFail = aabonuses.OffhandRiposteFail + itembonuses.OffhandRiposteFail + spellbonuses.OffhandRiposteFail; - OffhandRiposteFail *= -1; //Live uses a negative value for this. - - if (OffhandRiposteFail && - (OffhandRiposteFail > 99 || zone->random.Roll(OffhandRiposteFail))) { - damage = 0; // Counts as a miss - slippery_attack = true; - } else - DoRiposte(other); - if (IsDead()) return false; + if (other->AvoidDamage(this, damage, Hand)) { + if (!bRiposte && !IsStrikethrough) { + int strike_through = itembonuses.StrikeThrough + spellbonuses.StrikeThrough + aabonuses.StrikeThrough; + if(strike_through && zone->random.Roll(strike_through)) { + Message_StringID(MT_StrikeThrough, STRIKETHROUGH_STRING); // You strike through your opponents defenses! + Attack(other, Hand, false, true); // Strikethrough only gives another attempted hit + return false; } - else + // I'm pretty sure you can riposte a riposte + if (damage == -3 && !bRiposte) { DoRiposte(other); - if (IsDead()) return false; + if (IsDead()) + return false; + } + } + Log.Out(Logs::Detail, Logs::Combat, "Avoided damage with code %d", damage); + } else { + if (other->CheckHitChance(this, skillinuse, Hand, hit_chance_bonus)) { + other->MeleeMitigation(this, damage, min_hit, opts); + if (damage > 0) + CommonOutgoingHitSuccess(other, damage, skillinuse); + Log.Out(Logs::Detail, Logs::Combat, "Final damage after all reductions: %d", damage); + } else { + Log.Out(Logs::Detail, Logs::Combat, "Attack missed. Damage set to 0."); + damage = 0; } } - - if (((damage < 0) || slippery_attack) && !bRiposte && !IsStrikethrough) { // Hack to still allow Strikethrough chance w/ Slippery Attacks AA - int32 bonusStrikeThrough = itembonuses.StrikeThrough + spellbonuses.StrikeThrough + aabonuses.StrikeThrough; - - if(bonusStrikeThrough && zone->random.Roll(bonusStrikeThrough)) { - Message_StringID(MT_StrikeThrough, STRIKETHROUGH_STRING); // You strike through your opponents defenses! - Attack(other, Hand, false, true); // Strikethrough only gives another attempted hit - return false; - } - } - } - else{ + } else { damage = -5; } // Hate Generation is on a per swing basis, regardless of a hit, miss, or block, its always the same. // If we are this far, this means we are atleast making a swing. - if (!bRiposte) // Ripostes never generate any aggro. - other->AddToHateList(this, hate); + other->AddToHateList(this, hate); /////////////////////////////////////////////////////////// ////// Send Attack Damage @@ -1912,21 +1906,18 @@ bool NPC::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, bool hit_chance_bonus += opts->hit_chance; } - if(!other->CheckHitChance(this, skillinuse, Hand, hit_chance_bonus)) { - damage = 0; //miss - } else { //hit, check for damage avoidance - other->AvoidDamage(this, damage); - other->MeleeMitigation(this, damage, min_dmg+eleBane, opts); - if(damage > 0) { + if (other->AvoidDamage(this, damage, Hand)) { + if (!bRiposte && damage == -3) + DoRiposte(other); + } else { + if (other->CheckHitChance(this, skillinuse, Hand, hit_chance_bonus)) { + other->MeleeMitigation(this, damage, min_dmg+eleBane, opts); CommonOutgoingHitSuccess(other, damage, skillinuse); + } else { + damage = 0; } - Log.Out(Logs::Detail, Logs::Combat, "Generating hate %d towards %s", hate, GetName()); - // now add done damage to the hate list - if(damage > 0) - other->AddToHateList(this, hate); - else - other->AddToHateList(this, 0); } + other->AddToHateList(this, hate); } Log.Out(Logs::Detail, Logs::Combat, "Final damage against %s: %d", other->GetName(), damage); @@ -1939,12 +1930,6 @@ bool NPC::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, bool else damage = -5; - //cant riposte a riposte - if (bRiposte && damage == -3) { - Log.Out(Logs::Detail, Logs::Combat, "Riposte of riposte canceled."); - return false; - } - if(GetHP() > 0 && !other->HasDied()) { other->Damage(this, damage, SPELL_UNKNOWN, skillinuse, false); // Not avoidable client already had thier chance to Avoid } else @@ -1974,11 +1959,6 @@ bool NPC::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, bool if(GetHP() > 0 && !other->HasDied()) TriggerDefensiveProcs(nullptr, other, Hand, damage); - // now check ripostes - if (damage == -3) { // riposting - DoRiposte(other); - } - if (damage > 0) return true; @@ -3581,7 +3561,7 @@ void Mob::CommonDamage(Mob* attacker, int32 &damage, const uint16 spell_id, cons //final damage has been determined. SetHP(GetHP() - damage); - + if (IsClient()) this->CastToClient()->SendHPUpdateMarquee(); diff --git a/zone/bot.cpp b/zone/bot.cpp index 5450d4f8a..4bc291e84 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -2192,24 +2192,25 @@ void Bot::DoMeleeSkillAttackDmg(Mob* other, uint16 weapon_damage, SkillUseTypes else damage = zone->random.Int(min_hit, max_hit); - if(!other->CheckHitChance(this, skillinuse, Hand, chance_mod)) - damage = 0; - else { - other->AvoidDamage(this, damage, CanRiposte); - other->MeleeMitigation(this, damage, min_hit); - if(damage > 0) { - damage += damage*focus/100; - ApplyMeleeDamageBonus(skillinuse, damage); - damage += other->GetFcDamageAmtIncoming(this, 0, true, skillinuse); - damage += ((itembonuses.HeroicSTR / 10) + (damage * other->GetSkillDmgTaken(skillinuse) / 100) + GetSkillDmgAmt(skillinuse)); - TryCriticalHit(other, skillinuse, damage, nullptr); + if (other->AvoidDamage(this, damage, CanRiposte ? MainRange : MainPrimary)) { // MainRange excludes ripo, primary doesn't have any extra behavior + if (damage == -3) { + DoRiposte(other); + if (HasDied()) + return; + } + } else { + if (other->CheckHitChance(this, skillinuse, Hand, chance_mod)) { + other->MeleeMitigation(this, damage, min_hit); + if (damage > 0) { + damage += damage*focus/100; + ApplyMeleeDamageBonus(skillinuse, damage); + damage += other->GetFcDamageAmtIncoming(this, 0, true, skillinuse); + damage += ((itembonuses.HeroicSTR / 10) + (damage * other->GetSkillDmgTaken(skillinuse) / 100) + GetSkillDmgAmt(skillinuse)); + TryCriticalHit(other, skillinuse, damage, nullptr); + } + } else { + damage = 0; } - } - - if (damage == -3) { - DoRiposte(other); - if (HasDied()) - return; } } else @@ -4813,70 +4814,38 @@ bool Bot::Attack(Mob* other, int Hand, bool FromRiposte, bool IsStrikethrough, b } //check to see if we hit.. - if(!other->CheckHitChance(other, skillinuse, Hand)) { - Log.Out(Logs::Detail, Logs::Combat, "Attack missed. Damage set to 0."); - damage = 0; - other->AddToHateList(this, 0); - } else { //we hit, try to avoid it - other->AvoidDamage(this, damage); - other->MeleeMitigation(this, damage, min_hit, opts); - if(damage > 0) { + if (other->AvoidDamage(this, damage, Hand)) { + if (!FromRiposte && !IsStrikethrough) { + int strike_through = itembonuses.StrikeThrough + spellbonuses.StrikeThrough + aabonuses.StrikeThrough; + if(strike_through && zone->random.Roll(strike_through)) { + Message_StringID(MT_StrikeThrough, STRIKETHROUGH_STRING); // You strike through your opponents defenses! + Attack(other, Hand, false, true); // Strikethrough only gives another attempted hit + return false; + } + if (damage == -3 && !FromRiposte) { + DoRiposte(other); + if (HasDied()) + return false; + } + } + } else { + if (other->CheckHitChance(this, skillinuse, Hand)) { + other->MeleeMitigation(this, damage, min_hit, opts); ApplyMeleeDamageBonus(skillinuse, damage); damage += ((itembonuses.HeroicSTR / 10) + (damage * other->GetSkillDmgTaken(skillinuse) / 100) + GetSkillDmgAmt(skillinuse)); TryCriticalHit(other, skillinuse, damage, opts); - Log.Out(Logs::Detail, Logs::Combat, "Generating hate %d towards %s", hate, GetCleanName()); - // now add done damage to the hate list - //other->AddToHateList(this, hate); - } - else - other->AddToHateList(this, 0); - Log.Out(Logs::Detail, Logs::Combat, "Final damage after all reductions: %d", damage); - } - - //riposte - bool slippery_attack = false; // Part of hack to allow riposte to become a miss, but still allow a Strikethrough chance (like on Live) - if (damage == -3) { - if (FromRiposte) - return false; - else { - if (Hand == MainSecondary) {// Do we even have it & was attack with mainhand? If not, don't bother with other calculations - //Live AA - SlipperyAttacks - //This spell effect most likely directly modifies the actual riposte chance when using offhand attack. - int32 OffhandRiposteFail = (aabonuses.OffhandRiposteFail + itembonuses.OffhandRiposteFail + spellbonuses.OffhandRiposteFail); - OffhandRiposteFail *= -1; //Live uses a negative value for this. - - if (OffhandRiposteFail && - (OffhandRiposteFail > 99 || (zone->random.Int(0, 100) < OffhandRiposteFail))) { - damage = 0; // Counts as a miss - slippery_attack = true; - } else - DoRiposte(other); - if (GetHP() < 0) - return false; - } - else - DoRiposte(other); - if (GetHP() < 0) - return false; - } - } - - if (((damage < 0) || slippery_attack) && !FromRiposte && !IsStrikethrough) { // Hack to still allow Strikethrough chance w/ Slippery Attacks AA - int32 bonusStrikeThrough = (itembonuses.StrikeThrough + spellbonuses.StrikeThrough + aabonuses.StrikeThrough); - if(bonusStrikeThrough && (zone->random.Int(0, 100) < bonusStrikeThrough)) { - Message_StringID(MT_StrikeThrough, STRIKETHROUGH_STRING); // You strike through your opponents defenses! - Attack(other, Hand, false, true); // Strikethrough only gives another attempted hit - return false; + } else { + damage = 0; } } + Log.Out(Logs::Detail, Logs::Combat, "Final damage after all reductions: %d", damage); } else damage = -5; // Hate Generation is on a per swing basis, regardless of a hit, miss, or block, its always the same. // If we are this far, this means we are atleast making a swing. - if (!FromRiposte) - other->AddToHateList(this, hate); + other->AddToHateList(this, hate); /////////////////////////////////////////////////////////// ////// Send Attack Damage @@ -5771,132 +5740,6 @@ float Bot::GetProcChances(float ProcBonus, uint16 hand) { return ProcChance; } -bool Bot::AvoidDamage(Mob* other, int32 &damage, bool CanRiposte) { - if(GetAppearance() == eaDead) - return false; - - float skill = 0; - float bonus = 0; - float RollTable[4] = {0,0,0,0}; - float roll = 0; - Mob *attacker = other; - Mob *defender = this; - - bool ghit = false; - if((attacker->GetSpellBonuses().MeleeSkillCheck + attacker->GetItemBonuses().MeleeSkillCheck) > 500) - ghit = true; - - if (IsEnraged() && !other->BehindMob(this, other->GetX(), other->GetY())) { - damage = -3; - Log.Out(Logs::Detail, Logs::Combat, "I am enraged, riposting frontal attack."); - } - - float riposte_chance = 0.0f; - if (CanRiposte && damage > 0 && CanThisClassRiposte() && !other->BehindMob(this, other->GetX(), other->GetY())) { - riposte_chance = ((100.0f + (float)defender->GetAABonuses().RiposteChance + (float)defender->GetSpellBonuses().RiposteChance + (float)defender->GetItemBonuses().RiposteChance) / 100.0f); - skill = GetSkill(SkillRiposte); - if (!ghit) { - bonus = (2.0 + skill / 60.0 + (GetDEX() / 200)); - bonus *= riposte_chance; - RollTable[0] = (bonus + (itembonuses.HeroicDEX / 25)); - } - } - - bool bBlockFromRear = false; - bool bShieldBlockFromRear = false; - if (this->IsBot()) { - int aaChance = 0; - int BlockBehindChance = (aabonuses.BlockBehind + spellbonuses.BlockBehind + itembonuses.BlockBehind); - if (BlockBehindChance && (BlockBehindChance > zone->random.Int(1, 100))){ - bBlockFromRear = true; - if (spellbonuses.BlockBehind || itembonuses.BlockBehind) - bShieldBlockFromRear = true; - } - } - - float block_chance = 0.0f; - if (damage > 0 && CanThisClassBlock() && (!other->BehindMob(this, other->GetX(), other->GetY()) || bBlockFromRear)) { - block_chance = ((100.0f + (float)spellbonuses.IncreaseBlockChance + (float)itembonuses.IncreaseBlockChance) / 100.0f); - skill = GetSkill(SkillBlock); - if (!ghit) { - bonus = (2.0 + skill / 35.0 + (GetDEX() / 200)); - RollTable[1] = (RollTable[0] + (bonus * block_chance) - riposte_chance); - block_chance *= bonus; - } - } else - RollTable[1] = RollTable[0]; - - if(damage > 0 && (aabonuses.ShieldBlock || spellbonuses.ShieldBlock || itembonuses.ShieldBlock) - && (!other->BehindMob(this, other->GetX(), other->GetY()) || bShieldBlockFromRear)) { - bool equiped = GetBotItem(MainSecondary); - if(equiped) { - uint8 shield = GetBotItem(MainSecondary)->GetItem()->ItemType; - float bonusShieldBlock = 0.0f; - if(shield == ItemTypeShield) { - bonusShieldBlock = (aabonuses.ShieldBlock + spellbonuses.ShieldBlock + itembonuses.ShieldBlock); - RollTable[1] = (RollTable[0] + bonusShieldBlock); - } - } - } - - if(damage > 0 && (aabonuses.TwoHandBluntBlock || spellbonuses.TwoHandBluntBlock || itembonuses.TwoHandBluntBlock) - && (!other->BehindMob(this, other->GetX(), other->GetY()) || bShieldBlockFromRear)) { - bool equiped2 = GetBotItem(MainPrimary); - if(equiped2) { - uint8 TwoHandBlunt = GetBotItem(MainPrimary)->GetItem()->ItemType; - float bonusStaffBlock = 0.0f; - if(TwoHandBlunt == ItemType2HBlunt) { - bonusStaffBlock = (aabonuses.TwoHandBluntBlock + spellbonuses.TwoHandBluntBlock + itembonuses.TwoHandBluntBlock); - RollTable[1] = (RollTable[0] + bonusStaffBlock); - } - } - } - - float parry_chance = 0.0f; - if (damage > 0 && CanThisClassParry() && !other->BehindMob(this, other->GetX(), other->GetY())) { - parry_chance = ((100.0f + (float)defender->GetSpellBonuses().ParryChance + (float)defender->GetItemBonuses().ParryChance) / 100.0f); - skill = GetSkill(SkillParry); - if (!ghit) { - bonus = (2.0 + skill / 60.0 + (GetDEX() / 200)); - bonus *= parry_chance; - RollTable[2] = (RollTable[1] + bonus - block_chance); - } - } else - RollTable[2] = (RollTable[1] - block_chance); - - float dodge_chance = 0.0f; - if (damage > 0 && CanThisClassDodge() && !other->BehindMob(this, other->GetX(), other->GetY())) { - dodge_chance = ((100.0f + (float)defender->GetSpellBonuses().DodgeChance + (float)defender->GetItemBonuses().DodgeChance) / 100.0f); - skill = GetSkill(SkillDodge); - if (!ghit) { - bonus = (2.0 + skill / 60.0 + (GetAGI() / 200)); - bonus *= dodge_chance; - RollTable[3] = (RollTable[2] + bonus - (itembonuses.HeroicDEX / 25) + (itembonuses.HeroicAGI / 25) - parry_chance); - } - } else { - RollTable[3] = (RollTable[2] - (itembonuses.HeroicDEX / 25) + (itembonuses.HeroicAGI / 25) - parry_chance); - } - - if(damage > 0) { - roll = zone->random.Real(0,100); - if(roll <= RollTable[0]) - damage = -3; - else if(roll <= RollTable[1]) - damage = -1; - else if(roll <= RollTable[2]) - damage = -2; - else if(roll <= RollTable[3]) - damage = -4; - } - - Log.Out(Logs::Detail, Logs::Combat, "Final damage after all avoidances: %d", damage); - - if (damage < 0) - return true; - - return false; -} - int Bot::GetMonkHandToHandDamage(void) { static int damage[66] = { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @@ -5986,26 +5829,25 @@ void Bot::DoSpecialAttackDamage(Mob *who, SkillUseTypes skill, int32 max_damage, } min_damage += (min_damage * GetMeleeMinDamageMod_SE(skill) / 100); - if(HitChance && !who->CheckHitChance(this, skill, MainPrimary)) - max_damage = 0; - else { - bool CanRiposte = true; - if(skill == SkillThrowing || skill == SkillArchery) - CanRiposte = false; - - who->AvoidDamage(this, max_damage, CanRiposte); - who->MeleeMitigation(this, max_damage, min_damage); - - if(max_damage > 0) { + int hand = MainPrimary; + if (skill == SkillThrowing || skill == SkillArchery) + hand = MainRange; + if (who->AvoidDamage(this, max_damage, hand)) { + if (max_damage == -3) + DoRiposte(who); + } else { + if (HitChance || who->CheckHitChance(this, skill, MainPrimary)) { + who->MeleeMitigation(this, max_damage, min_damage); ApplyMeleeDamageBonus(skill, max_damage); max_damage += who->GetFcDamageAmtIncoming(this, 0, true, skill); max_damage += ((itembonuses.HeroicSTR / 10) + (max_damage * who->GetSkillDmgTaken(skill) / 100) + GetSkillDmgAmt(skill)); TryCriticalHit(who, skill, max_damage); + } else { + max_damage = 0; } } - if(max_damage >= 0) - who->AddToHateList(this, hate); + who->AddToHateList(this, hate); who->Damage(this, max_damage, SPELL_UNKNOWN, skill, false); @@ -6030,9 +5872,6 @@ void Bot::DoSpecialAttackDamage(Mob *who, SkillUseTypes skill, int32 max_damage, if (max_damage > 0 && HasSkillProcSuccess()) TrySkillProc(who, skill, (ReuseTime * 1000), true); - - if(max_damage == -3 && !(who->GetHP() <= 0)) - DoRiposte(who); } void Bot::TryBackstab(Mob *other, int ReuseTime) { diff --git a/zone/bot.h b/zone/bot.h index 86a1ef895..7f2652498 100644 --- a/zone/bot.h +++ b/zone/bot.h @@ -169,7 +169,6 @@ public: uint16 BotGetSpellType(int spellslot) { return AIspells[spellslot].type; } uint16 BotGetSpellPriority(int spellslot) { return AIspells[spellslot].priority; } virtual float GetProcChances(float ProcBonus, uint16 hand); - virtual bool AvoidDamage(Mob* other, int32 &damage, bool CanRiposte); virtual int GetMonkHandToHandDamage(void); virtual bool TryFinishingBlow(Mob *defender, SkillUseTypes skillinuse); virtual void DoRiposte(Mob* defender); @@ -314,7 +313,7 @@ public: virtual float GetAOERange(uint16 spell_id); virtual bool SpellEffect(Mob* caster, uint16 spell_id, float partial = 100); virtual void DoBuffTic(const Buffs_Struct &buff, int slot, Mob* caster = nullptr); - virtual bool CastSpell(uint16 spell_id, uint16 target_id, uint16 slot = USE_ITEM_SPELL_SLOT, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, + virtual bool CastSpell(uint16 spell_id, uint16 target_id, uint16 slot = USE_ITEM_SPELL_SLOT, int32 casttime = -1, int32 mana_cost = -1, uint32* oSpellWillFinish = 0, uint32 item_slot = 0xFFFFFFFF, int16 *resist_adjust = nullptr, uint32 aa_id = 0); virtual bool SpellOnTarget(uint16 spell_id, Mob* spelltar); virtual bool IsImmuneToSpell(uint16 spell_id, Mob *caster); diff --git a/zone/mob.h b/zone/mob.h index 4cb4ef8dd..6a696256f 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -149,7 +149,7 @@ public: int MonkSpecialAttack(Mob* other, uint8 skill_used); virtual void TryBackstab(Mob *other,int ReuseTime = 10); void TriggerDefensiveProcs(const ItemInst* weapon, Mob *on, uint16 hand = MainPrimary, int damage = 0); - virtual bool AvoidDamage(Mob* attacker, int32 &damage, bool CanRiposte = true); + bool AvoidDamage(Mob* attacker, int32 &damage, int hand); virtual bool CheckHitChance(Mob* attacker, SkillUseTypes skillinuse, int Hand, int16 chance_mod = 0); virtual void TryCriticalHit(Mob *defender, uint16 skill, int32 &damage, ExtraAttackOptions *opts = nullptr); void TryPetCriticalHit(Mob *defender, uint16 skill, int32 &damage); diff --git a/zone/special_attacks.cpp b/zone/special_attacks.cpp index bd8000e63..1bcccf272 100644 --- a/zone/special_attacks.cpp +++ b/zone/special_attacks.cpp @@ -130,22 +130,19 @@ void Mob::DoSpecialAttackDamage(Mob *who, SkillUseTypes skill, int32 max_damage, min_damage += min_damage * GetMeleeMinDamageMod_SE(skill) / 100; - if(HitChance && !who->CheckHitChance(this, skill, MainPrimary)) - max_damage = 0; - - else{ - bool CanRiposte = true; - if(skill == SkillThrowing || skill == SkillArchery) // changed from '&&' - CanRiposte = false; - - if (CanAvoid) - who->AvoidDamage(this, max_damage, CanRiposte); - - who->MeleeMitigation(this, max_damage, min_damage); - - if(max_damage > 0) + int hand = MainPrimary; // Avoid checks hand for throwing/archery exclusion, primary should work for most + if (skill == SkillThrowing || skill == SkillArchery) + hand = MainRange; + if (who->AvoidDamage(this, max_damage, hand)) { + if (max_damage == -3) + DoRiposte(who); + } else { + if (HitChance || who->CheckHitChance(this, skill, MainPrimary)) { + who->MeleeMitigation(this, max_damage, min_damage); CommonOutgoingHitSuccess(who, max_damage, skill); - + } else { + max_damage = 0; + } } who->AddToHateList(this, hate, 0, false); @@ -168,8 +165,6 @@ void Mob::DoSpecialAttackDamage(Mob *who, SkillUseTypes skill, int32 max_damage, if (max_damage > 0 && HasSkillProcSuccess()) TrySkillProc(who, skill, ReuseTime*1000, true); - if(max_damage == -3 && !who->HasDied()) - DoRiposte(who); } @@ -972,7 +967,7 @@ void Mob::DoArcheryAttackDmg(Mob* other, const ItemInst* RangeWeapon, const Ite } if (!HeadShot) - other->AvoidDamage(this, TotalDmg, false); + other->AvoidDamage(this, TotalDmg, MainRange); other->MeleeMitigation(this, TotalDmg, minDmg); if(TotalDmg > 0){ @@ -1305,7 +1300,7 @@ void NPC::DoRangedAttackDmg(Mob* other, bool Launch, int16 damage_mod, int16 cha TotalDmg += TotalDmg * damage_mod / 100; - other->AvoidDamage(this, TotalDmg, false); + other->AvoidDamage(this, TotalDmg, MainRange); other->MeleeMitigation(this, TotalDmg, MinDmg); if (TotalDmg > 0) @@ -1539,7 +1534,7 @@ void Mob::DoThrowingAttackDmg(Mob* other, const ItemInst* RangeWeapon, const Ite Log.Out(Logs::Detail, Logs::Combat, "Item DMG %d. Max Damage %d. Hit for damage %d", WDmg, MaxDmg, TotalDmg); if (!Assassinate_Dmg) - other->AvoidDamage(this, TotalDmg, false); //CanRiposte=false - Can not riposte throw attacks. + other->AvoidDamage(this, TotalDmg, MainRange); other->MeleeMitigation(this, TotalDmg, minDmg); if(TotalDmg > 0) @@ -2411,27 +2406,26 @@ void Mob::DoMeleeSkillAttackDmg(Mob* other, uint16 weapon_damage, SkillUseTypes else damage = zone->random.Int(min_hit, max_hit); - if(!other->CheckHitChance(this, skillinuse, Hand, chance_mod)) { - damage = 0; + if (other->AvoidDamage(this, damage, CanRiposte ? MainRange : MainPrimary)) { // MainRange excludes ripo, primary doesn't have any extra behavior + if (damage == -3) { + DoRiposte(other); + if (HasDied()) + return; + } } else { - other->AvoidDamage(this, damage, CanRiposte); - other->MeleeMitigation(this, damage, min_hit); - if(damage > 0) + if (other->CheckHitChance(this, skillinuse, Hand, chance_mod)) { + other->MeleeMitigation(this, damage, min_hit); CommonOutgoingHitSuccess(other, damage, skillinuse); + } else { + damage = 0; + } } - if (damage == -3) { - DoRiposte(other); - if (HasDied()) - return; - } } else damage = -5; - other->AddToHateList(this, hate); - bool CanSkillProc = true; if (skillinuse == SkillOffense){ //Hack to allow damage to display. skillinuse = SkillTigerClaw; //'strike' your opponent - Arbitrary choice for message. From fe98b3363d49ff61fec5513f452fad40b80c64e9 Mon Sep 17 00:00:00 2001 From: JJ Date: Sat, 4 Jul 2015 12:10:58 -0400 Subject: [PATCH 67/90] Filename consistency. [skip ci] --- utils/sql/db_update_manifest.txt | 2 +- utils/sql/git/required/2015_7_1_Marquee_Rule.sql | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 utils/sql/git/required/2015_7_1_Marquee_Rule.sql diff --git a/utils/sql/db_update_manifest.txt b/utils/sql/db_update_manifest.txt index 480aeb309..7394c7863 100644 --- a/utils/sql/db_update_manifest.txt +++ b/utils/sql/db_update_manifest.txt @@ -338,7 +338,7 @@ 9082|2015_05_25_npc_types_texture_fields.sql|SHOW COLUMNS FROM `npc_types` LIKE 'armtexture'|empty| 9083|2015_06_07_aa_update.sql|SHOW COLUMNS FROM `character_alternate_abilities` LIKE 'charges'|empty| 9084|2015_06_30_runspeed_adjustments.sql|SELECT `runspeed` FROM `npc_types` WHERE `runspeed` > 3|not_empty| -9085|2015_7_1_Marquee_Rule.sql|SELECT * FROM `rule_values` WHERE `rule_name` LIKE '%Character:MarqueeHPUpdates%'|empty| +9085|2015_07_01_Marquee_Rule.sql|SELECT * FROM `rule_values` WHERE `rule_name` LIKE '%Character:MarqueeHPUpdates%'|empty| 9086|2015_07_02_aa_rework.sql|SHOW TABLES LIKE 'aa_ranks'|empty| # Upgrade conditions: diff --git a/utils/sql/git/required/2015_7_1_Marquee_Rule.sql b/utils/sql/git/required/2015_7_1_Marquee_Rule.sql deleted file mode 100644 index 039a34412..000000000 --- a/utils/sql/git/required/2015_7_1_Marquee_Rule.sql +++ /dev/null @@ -1 +0,0 @@ -INSERT INTO `rule_values` (`rule_name`, `rule_value`, `notes`) VALUES ('Character:MarqueeHPUpdates', 'false', 'Will show Health % in center of screen < 100%'); \ No newline at end of file From 947145a6425a0bc95b9819e8b9f69b99444d50b0 Mon Sep 17 00:00:00 2001 From: JJ Date: Sat, 4 Jul 2015 12:12:18 -0400 Subject: [PATCH 68/90] Oops. [skip ci] --- utils/sql/git/required/2015_07_01_Marquee_Rule.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 utils/sql/git/required/2015_07_01_Marquee_Rule.sql diff --git a/utils/sql/git/required/2015_07_01_Marquee_Rule.sql b/utils/sql/git/required/2015_07_01_Marquee_Rule.sql new file mode 100644 index 000000000..039a34412 --- /dev/null +++ b/utils/sql/git/required/2015_07_01_Marquee_Rule.sql @@ -0,0 +1 @@ +INSERT INTO `rule_values` (`rule_name`, `rule_value`, `notes`) VALUES ('Character:MarqueeHPUpdates', 'false', 'Will show Health % in center of screen < 100%'); \ No newline at end of file From 8d3d3d2af296350e3fd4e9ee23fa083ef486ef80 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 5 Jul 2015 00:42:06 -0400 Subject: [PATCH 69/90] Add Dual Wield/Double Attack NPC skill overrides The vast majority of mobs on live follow this path. The exception appears most commonly with PC pets though. Eventually these should be changeable in the DB. --- zone/npc.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/zone/npc.cpp b/zone/npc.cpp index ba6a2393b..8dbab7c64 100644 --- a/zone/npc.cpp +++ b/zone/npc.cpp @@ -278,6 +278,18 @@ NPC::NPC(const NPCType* d, Spawn2* in_respawn, const glm::vec4& position, int if for(r = 0; r <= HIGHEST_SKILL; r++) { skills[r] = database.GetSkillCap(GetClass(),(SkillUseTypes)r,moblevel); } + // some overrides -- really we need to be able to set skills for mobs in the DB + // There are some known low level SHM/BST pets that do not follow this, which supports + // the theory of needing to be able to set skills for each mob separately + if (moblevel > 50) { + skills[SkillDoubleAttack] = 250; + skills[SkillDualWield] = 250; + } else if (moblevel > 3) { + skills[SkillDoubleAttack] = moblevel * 5; + skills[SkillDualWield] = skills[SkillDoubleAttack]; + } else { + skills[SkillDoubleAttack] = moblevel * 5; + } if(d->trap_template > 0) { @@ -1928,14 +1940,14 @@ void NPC::ModifyNPCStat(const char *identifier, const char *newValue) else if(id == "pr") { PR = atoi(val.c_str()); return; } else if(id == "dr") { DR = atoi(val.c_str()); return; } else if(id == "PhR") { PhR = atoi(val.c_str()); return; } - else if(id == "runspeed") { + else if(id == "runspeed") { runspeed = (float)atof(val.c_str()); base_runspeed = (int)((float)runspeed * 40.0f); base_walkspeed = base_runspeed * 100 / 265; walkspeed = ((float)base_walkspeed) * 0.025f; base_fearspeed = base_runspeed * 100 / 127; fearspeed = ((float)base_fearspeed) * 0.025f; - CalcBonuses(); return; + CalcBonuses(); return; } else if(id == "special_attacks") { NPCSpecialAttacks(val.c_str(), 0, 1); return; } else if(id == "special_abilities") { ProcessSpecialAbilities(val.c_str()); return; } From 99620f8535853636545e8a022089751df973d882 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 5 Jul 2015 00:45:46 -0400 Subject: [PATCH 70/90] Add Mob/Client CheckDualWield functions --- zone/attack.cpp | 28 ++++++++++++++++++++++++++++ zone/client.h | 1 + zone/client_process.cpp | 10 +--------- zone/mob.h | 1 + 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/zone/attack.cpp b/zone/attack.cpp index 8a120b896..86f8b8d65 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -5075,3 +5075,31 @@ void Client::DoAttackRounds(Mob *target, int hand, bool IsFromSpell) } } } + +bool Mob::CheckDualWield() +{ + // Pets /might/ follow a slightly different progression + // although it could all be from pets having different skills than most mobs + int chance = GetSkill(SkillDualWield); + if (GetLevel() > 35) + chance += GetLevel(); + + chance += aabonuses.Ambidexterity + spellbonuses.Ambidexterity + itembonuses.Ambidexterity; + int per_inc = spellbonuses.DualWieldChance + aabonuses.DualWieldChance + itembonuses.DualWieldChance; + if (per_inc) + chance += chance * per_inc / 100; + + return zone->random.Int(1, 375) <= chance; +} + +bool Client::CheckDualWield() +{ + int chance = GetSkill(SkillDualWield) + GetLevel(); + + chance += aabonuses.Ambidexterity + spellbonuses.Ambidexterity + itembonuses.Ambidexterity; + int per_inc = spellbonuses.DualWieldChance + aabonuses.DualWieldChance + itembonuses.DualWieldChance; + if (per_inc) + chance += chance * per_inc / 100; + + return zone->random.Int(1, 375) <= chance; +} diff --git a/zone/client.h b/zone/client.h index 375006536..7558d9bb6 100644 --- a/zone/client.h +++ b/zone/client.h @@ -890,6 +890,7 @@ public: void Insight(uint32 t_id); bool CheckDoubleAttack(bool tripleAttack = false); bool CheckDoubleRangedAttack(); + bool CheckDualWield(); //remove charges/multiple objects from inventory: //bool DecreaseByType(uint32 type, uint8 amt); diff --git a/zone/client_process.cpp b/zone/client_process.cpp index 7cc3f9917..70899e2d6 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -428,16 +428,8 @@ bool Client::Process() { //you can't see your target } else if(auto_attack_target->GetHP() > -10) { - float DualWieldProbability = 0.0f; - - int16 Ambidexterity = aabonuses.Ambidexterity + spellbonuses.Ambidexterity + itembonuses.Ambidexterity; - DualWieldProbability = (GetSkill(SkillDualWield) + GetLevel() + Ambidexterity) / 400.0f; // 78.0 max - int16 DWBonus = spellbonuses.DualWieldChance + itembonuses.DualWieldChance; - DualWieldProbability += DualWieldProbability*float(DWBonus)/ 100.0f; - - float random = zone->random.Real(0, 1); CheckIncreaseSkill(SkillDualWield, auto_attack_target, -10); - if (random < DualWieldProbability) { // Max 78% of DW + if (CheckDualWield()) { ItemInst *wpn = GetInv().GetItem(MainSecondary); TryWeaponProc(wpn, auto_attack_target, MainSecondary); diff --git a/zone/mob.h b/zone/mob.h index 6a696256f..e329128a9 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -166,6 +166,7 @@ public: void CommonOutgoingHitSuccess(Mob* defender, int32 &damage, SkillUseTypes skillInUse); void CommonBreakInvisible(); bool HasDied(); + virtual bool CheckDualWield(); //Appearance void SendLevelAppearance(); From 578bbf657a14d1b1ecf75d83239d521f2c20001c Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 5 Jul 2015 00:46:37 -0400 Subject: [PATCH 71/90] Make Client::AI_Process in line with uncharmed --- zone/mob_ai.cpp | 109 +++++++----------------------------------------- 1 file changed, 16 insertions(+), 93 deletions(-) diff --git a/zone/mob_ai.cpp b/zone/mob_ai.cpp index 045c724d6..f171d72e3 100644 --- a/zone/mob_ai.cpp +++ b/zone/mob_ai.cpp @@ -827,112 +827,35 @@ void Client::AI_Process() bool is_combat_range = CombatRange(GetTarget()); - if(is_combat_range) { - if(charm_class_attacks_timer.Check()) { + if (is_combat_range) { + if (charm_class_attacks_timer.Check()) { DoClassAttacks(GetTarget()); } if (AImovement_timer->Check()) { - if(CalculateHeadingToTarget(GetTarget()->GetX(), GetTarget()->GetY()) != m_Position.w) - { + if (CalculateHeadingToTarget(GetTarget()->GetX(), GetTarget()->GetY()) != + m_Position.w) { SetHeading(CalculateHeadingToTarget(GetTarget()->GetX(), GetTarget()->GetY())); SendPosition(); } SetCurrentSpeed(0); } - if(GetTarget() && !IsStunned() && !IsMezzed() && !GetFeigned()) { - if(attack_timer.Check()) { - Attack(GetTarget(), MainPrimary); - if(GetTarget()) { - if(CheckDoubleAttack()) { - Attack(GetTarget(), MainPrimary); - if(GetTarget()) { - bool triple_attack_success = false; - if((((GetClass() == MONK || GetClass() == WARRIOR || GetClass() == RANGER || GetClass() == BERSERKER) - && GetLevel() >= 60) || GetSpecialAbility(SPECATK_TRIPLE)) - && CheckDoubleAttack(true)) - { - Attack(GetTarget(), MainPrimary, true); - triple_attack_success = true; - } - - if(GetTarget()) - { - //Live AA - Flurry, Rapid Strikes ect (Flurry does not require Triple Attack). - int16 flurrychance = aabonuses.FlurryChance + spellbonuses.FlurryChance + itembonuses.FlurryChance; - - if (flurrychance) - { - if(zone->random.Roll(flurrychance)) - { - Message_StringID(MT_NPCFlurry, YOU_FLURRY); - Attack(GetTarget(), MainPrimary, false); - Attack(GetTarget(), MainPrimary, false); - } - } - - int16 ExtraAttackChanceBonus = spellbonuses.ExtraAttackChance + itembonuses.ExtraAttackChance + aabonuses.ExtraAttackChance; - - if (ExtraAttackChanceBonus && GetTarget()) { - ItemInst *wpn = GetInv().GetItem(MainPrimary); - if(wpn){ - if(wpn->GetItem()->ItemType == ItemType2HSlash || - wpn->GetItem()->ItemType == ItemType2HBlunt || - wpn->GetItem()->ItemType == ItemType2HPiercing ) - { - if(zone->random.Roll(ExtraAttackChanceBonus)) - { - Attack(GetTarget(), MainPrimary, false); - } - } - } - } - - if (GetClass() == WARRIOR || GetClass() == BERSERKER) - { - if(!dead && !berserk && this->GetHPRatio() < 30) - { - entity_list.MessageClose_StringID(this, false, 200, 0, BERSERK_START, GetName()); - berserk = true; - } - else if (berserk && this->GetHPRatio() > 30) - { - entity_list.MessageClose_StringID(this, false, 200, 0, BERSERK_END, GetName()); - berserk = false; - } - } - } - } - } - } + if (GetTarget() && !IsStunned() && !IsMezzed() && !GetFeigned()) { + if (attack_timer.Check()) { + // Should charmed clients not be procing? + DoAttackRounds(GetTarget(), MainPrimary); } } - if(CanThisClassDualWield() && attack_dw_timer.Check()) - { - if(GetTarget()) - { - float DualWieldProbability = 0.0f; - - int16 Ambidexterity = aabonuses.Ambidexterity + spellbonuses.Ambidexterity + itembonuses.Ambidexterity; - DualWieldProbability = (GetSkill(SkillDualWield) + GetLevel() + Ambidexterity) / 400.0f; // 78.0 max - int16 DWBonus = spellbonuses.DualWieldChance + itembonuses.DualWieldChance; - DualWieldProbability += DualWieldProbability*float(DWBonus)/ 100.0f; - - if(zone->random.Roll(DualWieldProbability)) - { - Attack(GetTarget(), MainSecondary); - if(CheckDoubleAttack()) - { - Attack(GetTarget(), MainSecondary); - } - + if (CanThisClassDualWield() && GetTarget() && !IsStunned() && !IsMezzed() && !GetFeigned()) { + if (attack_dw_timer.Check()) { + if (CheckDualWield()) { + // Should charmed clients not be procing? + DoAttackRounds(GetTarget(), MainSecondary); } } } - } - else - { + } else { if(!IsRooted()) { if(AImovement_timer->Check()) @@ -1000,7 +923,7 @@ void Client::AI_Process() animation = nspeed; nspeed *= 2; SetCurrentSpeed(nspeed); - + CalculateNewPosition2(owner->GetX(), owner->GetY(), owner->GetZ(), nspeed); } } @@ -1502,7 +1425,7 @@ void Mob::AI_Process() { int speed = GetWalkspeed(); if (dist >= 5625) speed = GetRunspeed(); - + CalculateNewPosition2(owner->GetX(), owner->GetY(), owner->GetZ(), speed); } else From 7c89ab3fec2a4824a489696419645e8fb545b62f Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 5 Jul 2015 01:15:46 -0400 Subject: [PATCH 72/90] Pull Mob mainhand/offhand attack rounds into their own functions --- zone/attack.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++++++ zone/mob.h | 2 ++ zone/mob_ai.cpp | 56 ++--------------------------------------------- 3 files changed, 62 insertions(+), 54 deletions(-) diff --git a/zone/attack.cpp b/zone/attack.cpp index 86f8b8d65..a702f0efe 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -5103,3 +5103,61 @@ bool Client::CheckDualWield() return zone->random.Int(1, 375) <= chance; } + +void Mob::DoMainHandAttackRounds(Mob *target, ExtraAttackOptions *opts) +{ + if (IsNPC()) { + int16 n_atk = CastToNPC()->GetNumberOfAttacks(); + if (n_atk <= 1) { + Attack(target, MainPrimary, false, false, false, opts); + } else { + for (int i = 0; i < n_atk; ++i) { + Attack(target, MainPrimary, false, false, false, opts); + } + } + } else { + Attack(target, MainPrimary, false, false, false, opts); + } + + if (target) { + // we use this random value in three comparisons with different + // thresholds, and if its truely random, then this should work + // out reasonably and will save us compute resources. + int32 RandRoll = zone->random.Int(0, 99); + if ((CanThisClassDoubleAttack() || GetSpecialAbility(SPECATK_TRIPLE) || GetSpecialAbility(SPECATK_QUAD)) + // check double attack, this is NOT the same rules that clients use... + && + RandRoll < (GetLevel() + NPCDualAttackModifier)) { + Attack(target, MainPrimary, false, false, false, opts); + // lets see if we can do a triple attack with the main hand + // pets are excluded from triple and quads... + if ((GetSpecialAbility(SPECATK_TRIPLE) || GetSpecialAbility(SPECATK_QUAD)) && !IsPet() && + RandRoll < (GetLevel() + NPCTripleAttackModifier)) { + Attack(target, MainPrimary, false, false, false, opts); + // now lets check the quad attack + if (GetSpecialAbility(SPECATK_QUAD) && + RandRoll < (GetLevel() + NPCQuadAttackModifier)) { + Attack(target, MainPrimary, false, false, false, opts); + } + } + } + } +} + +void Mob::DoOffHandAttackRounds(Mob *target, ExtraAttackOptions *opts) +{ + if (!target) + return; + // Mobs will only dual wield w/ the flag or have a secondary weapon + if (GetSpecialAbility(SPECATK_INNATE_DW) || GetEquipment(MaterialSecondary) != 0) { + if (CheckDualWield()) { + Attack(target, MainSecondary, false, false, false, opts); + if (CanThisClassDoubleAttack()) { + // This isn't correct yet + if (zone->random.Roll(GetLevel() + 20)) { + Attack(target, MainSecondary, false, false, false, opts); + } + } + } + } +} diff --git a/zone/mob.h b/zone/mob.h index e329128a9..84aa46595 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -167,6 +167,8 @@ public: void CommonBreakInvisible(); bool HasDied(); virtual bool CheckDualWield(); + void DoMainHandAttackRounds(Mob *target, ExtraAttackOptions *opts = nullptr); + void DoOffHandAttackRounds(Mob *target, ExtraAttackOptions *opts = nullptr); //Appearance void SendLevelAppearance(); diff --git a/zone/mob_ai.cpp b/zone/mob_ai.cpp index f171d72e3..f4a511b7b 100644 --- a/zone/mob_ai.cpp +++ b/zone/mob_ai.cpp @@ -1101,42 +1101,7 @@ void Mob::AI_Process() { //try main hand first if(attack_timer.Check()) { - if(IsNPC()) { - int16 n_atk = CastToNPC()->GetNumberOfAttacks(); - if(n_atk <= 1) { - Attack(target, MainPrimary); - } else { - for(int i = 0; i < n_atk; ++i) { - Attack(target, MainPrimary); - } - } - } else { - Attack(target, MainPrimary); - } - - if (target) { - //we use this random value in three comparisons with different - //thresholds, and if its truely random, then this should work - //out reasonably and will save us compute resources. - int32 RandRoll = zone->random.Int(0, 99); - if ((CanThisClassDoubleAttack() || GetSpecialAbility(SPECATK_TRIPLE) - || GetSpecialAbility(SPECATK_QUAD)) - //check double attack, this is NOT the same rules that clients use... - && RandRoll < (GetLevel() + NPCDualAttackModifier)) { - Attack(target, MainPrimary); - // lets see if we can do a triple attack with the main hand - //pets are excluded from triple and quads... - if ((GetSpecialAbility(SPECATK_TRIPLE) || GetSpecialAbility(SPECATK_QUAD)) - && !IsPet() && RandRoll < (GetLevel() + NPCTripleAttackModifier)) { - Attack(target, MainPrimary); - // now lets check the quad attack - if (GetSpecialAbility(SPECATK_QUAD) - && RandRoll < (GetLevel() + NPCQuadAttackModifier)) { - Attack(target, MainPrimary); - } - } - } - } + DoMainHandAttackRounds(target); if (GetSpecialAbility(SPECATK_FLURRY)) { int flurry_chance = GetSpecialAbilityParam(SPECATK_FLURRY, 0); @@ -1271,24 +1236,7 @@ void Mob::AI_Process() { //now off hand if (attack_dw_timer.Check() && CanThisClassDualWield()) - { - int myclass = GetClass(); - //can only dual wield without a weapon if your a monk - if(GetSpecialAbility(SPECATK_INNATE_DW) || (GetEquipment(MaterialSecondary) != 0 && GetLevel() > 29) || myclass == MONK || myclass == MONKGM) { - float DualWieldProbability = (GetSkill(SkillDualWield) + GetLevel()) / 400.0f; - if(zone->random.Roll(DualWieldProbability)) - { - Attack(target, MainSecondary); - if (CanThisClassDoubleAttack()) - { - if (zone->random.Roll(GetLevel() + 20)) - { - Attack(target, MainSecondary); - } - } - } - } - } + DoOffHandAttackRounds(target); //now special attacks (kick, etc) if(IsNPC()) From 82fe15190b6be27554bd00de14765cbc73345f59 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 5 Jul 2015 01:37:14 -0400 Subject: [PATCH 73/90] Add CheckDoubleAttack for mobs --- zone/attack.cpp | 23 ++++++++++++++++++----- zone/mob.h | 1 + 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/zone/attack.cpp b/zone/attack.cpp index a702f0efe..1ca596016 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -3452,6 +3452,21 @@ bool Client::CheckDoubleRangedAttack() { return false; } +bool Mob::CheckDoubleAttack(bool tripleAttack) +{ + // Not 100% certain pets follow this or if it's just from pets not always + // having the same skills as most mobs + int chance = GetSkill(SkillDoubleAttack); + if (GetLevel() > 35) + chance += GetLevel(); + + int per_inc = aabonuses.DoubleAttackChance + spellbonuses.DoubleAttackChance + itembonuses.DoubleAttackChance; + if (per_inc) + chance += chance * per_inc / 100; + + return zone->random.Int(1, 500) <= chance; +} + void Mob::CommonDamage(Mob* attacker, int32 &damage, const uint16 spell_id, const SkillUseTypes skill_used, bool &avoidable, const int8 buffslot, const bool iBuffTic) { // This method is called with skill_used=ABJURE for Damage Shield damage. bool FromDamageShield = (skill_used == SkillAbjuration); @@ -5029,8 +5044,7 @@ void NPC::SetAttackTimer() //special offhand stuff if (i == MainSecondary) { - //NPCs get it for free at 13 - if(GetLevel() < 13) { + if(!CanThisClassDualWield()) { attack_dw_timer.Disable(); continue; } @@ -5152,9 +5166,8 @@ void Mob::DoOffHandAttackRounds(Mob *target, ExtraAttackOptions *opts) if (GetSpecialAbility(SPECATK_INNATE_DW) || GetEquipment(MaterialSecondary) != 0) { if (CheckDualWield()) { Attack(target, MainSecondary, false, false, false, opts); - if (CanThisClassDoubleAttack()) { - // This isn't correct yet - if (zone->random.Roll(GetLevel() + 20)) { + if (CanThisClassDoubleAttack() && GetLevel() > 35) { + if (CheckDoubleAttack()) { Attack(target, MainSecondary, false, false, false, opts); } } diff --git a/zone/mob.h b/zone/mob.h index 84aa46595..ec705faf7 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -169,6 +169,7 @@ public: virtual bool CheckDualWield(); void DoMainHandAttackRounds(Mob *target, ExtraAttackOptions *opts = nullptr); void DoOffHandAttackRounds(Mob *target, ExtraAttackOptions *opts = nullptr); + virtual bool CheckDoubleAttack(bool tripleAttack = false); // mob version doesn't use this flag //Appearance void SendLevelAppearance(); From 22efe33f9b22aceaa8a2083adb80195ad51f86fd Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 5 Jul 2015 02:05:50 -0400 Subject: [PATCH 74/90] Correct the definition of "quading" If you would like your NPCs to use the old rules, turn Combat:UseLiveCombatRounds to false. --- common/ruletypes.h | 1 + zone/attack.cpp | 52 ++++++++++++++++++++++++++-------------------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/common/ruletypes.h b/common/ruletypes.h index 6a52b1e78..8613eeebe 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -448,6 +448,7 @@ RULE_BOOL(Combat, OneProcPerWeapon, true) //If enabled, One proc per weapon per RULE_BOOL(Combat, ProjectileDmgOnImpact, true) //If enabled, projectiles (ie arrows) will hit on impact, instead of instantly. RULE_BOOL(Combat, MeleePush, true) // enable melee push RULE_INT(Combat, MeleePushChance, 50) // (NPCs) chance the target will be pushed. Made up, 100 actually isn't that bad +RULE_BOOL(Combat, UseLiveCombatRounds, true) // turn this false if you don't want to worry about fixing up combat rounds for NPCs RULE_CATEGORY_END() RULE_CATEGORY(NPC) diff --git a/zone/attack.cpp b/zone/attack.cpp index 1ca596016..4f8ca4a53 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -5120,6 +5120,18 @@ bool Client::CheckDualWield() void Mob::DoMainHandAttackRounds(Mob *target, ExtraAttackOptions *opts) { + if (!target) + return; + + if (RuleB(Combat, UseLiveCombatRounds)) { + // A "quad" on live really is just a successful dual wield where both double attack + // The mobs that could triple lost the ability to when the triple attack skill was added in + Attack(target, MainPrimary, false, false, false, opts); + if (CanThisClassDoubleAttack() && CheckDoubleAttack()) + Attack(target, MainPrimary, false, false, false, opts); + return; + } + if (IsNPC()) { int16 n_atk = CastToNPC()->GetNumberOfAttacks(); if (n_atk <= 1) { @@ -5133,26 +5145,23 @@ void Mob::DoMainHandAttackRounds(Mob *target, ExtraAttackOptions *opts) Attack(target, MainPrimary, false, false, false, opts); } - if (target) { - // we use this random value in three comparisons with different - // thresholds, and if its truely random, then this should work - // out reasonably and will save us compute resources. - int32 RandRoll = zone->random.Int(0, 99); - if ((CanThisClassDoubleAttack() || GetSpecialAbility(SPECATK_TRIPLE) || GetSpecialAbility(SPECATK_QUAD)) - // check double attack, this is NOT the same rules that clients use... - && - RandRoll < (GetLevel() + NPCDualAttackModifier)) { + // we use this random value in three comparisons with different + // thresholds, and if its truely random, then this should work + // out reasonably and will save us compute resources. + int32 RandRoll = zone->random.Int(0, 99); + if ((CanThisClassDoubleAttack() || GetSpecialAbility(SPECATK_TRIPLE) || GetSpecialAbility(SPECATK_QUAD)) + // check double attack, this is NOT the same rules that clients use... + && + RandRoll < (GetLevel() + NPCDualAttackModifier)) { + Attack(target, MainPrimary, false, false, false, opts); + // lets see if we can do a triple attack with the main hand + // pets are excluded from triple and quads... + if ((GetSpecialAbility(SPECATK_TRIPLE) || GetSpecialAbility(SPECATK_QUAD)) && !IsPet() && + RandRoll < (GetLevel() + NPCTripleAttackModifier)) { Attack(target, MainPrimary, false, false, false, opts); - // lets see if we can do a triple attack with the main hand - // pets are excluded from triple and quads... - if ((GetSpecialAbility(SPECATK_TRIPLE) || GetSpecialAbility(SPECATK_QUAD)) && !IsPet() && - RandRoll < (GetLevel() + NPCTripleAttackModifier)) { + // now lets check the quad attack + if (GetSpecialAbility(SPECATK_QUAD) && RandRoll < (GetLevel() + NPCQuadAttackModifier)) { Attack(target, MainPrimary, false, false, false, opts); - // now lets check the quad attack - if (GetSpecialAbility(SPECATK_QUAD) && - RandRoll < (GetLevel() + NPCQuadAttackModifier)) { - Attack(target, MainPrimary, false, false, false, opts); - } } } } @@ -5166,11 +5175,8 @@ void Mob::DoOffHandAttackRounds(Mob *target, ExtraAttackOptions *opts) if (GetSpecialAbility(SPECATK_INNATE_DW) || GetEquipment(MaterialSecondary) != 0) { if (CheckDualWield()) { Attack(target, MainSecondary, false, false, false, opts); - if (CanThisClassDoubleAttack() && GetLevel() > 35) { - if (CheckDoubleAttack()) { - Attack(target, MainSecondary, false, false, false, opts); - } - } + if (CanThisClassDoubleAttack() && GetLevel() > 35 && CheckDoubleAttack()) + Attack(target, MainSecondary, false, false, false, opts); } } } From fe97af4d8990eb08d81cdc2bd4546d18dd1d34a7 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 5 Jul 2015 02:27:51 -0400 Subject: [PATCH 75/90] Fix some issues with Rampage/AE Ramp --- zone/hate_list.cpp | 37 ++++++++++--------------------------- zone/mob.h | 10 ++++++++++ zone/mob_ai.cpp | 17 ++++++++++------- 3 files changed, 30 insertions(+), 34 deletions(-) diff --git a/zone/hate_list.cpp b/zone/hate_list.cpp index e68924844..86a75a545 100644 --- a/zone/hate_list.cpp +++ b/zone/hate_list.cpp @@ -535,37 +535,20 @@ int HateList::AreaRampage(Mob *caster, Mob *target, int count, ExtraAttackOption if (!target || !caster) return 0; - int ret = 0; - std::list id_list; - auto iterator = list.begin(); - while (iterator != list.end()) - { - struct_HateList *h = (*iterator); - ++iterator; - if (h && h->entity_on_hatelist && h->entity_on_hatelist != caster) - { - if (caster->CombatRange(h->entity_on_hatelist)) - { - id_list.push_back(h->entity_on_hatelist->GetID()); - ++ret; + int hit_count = 0; + auto it = list.begin(); + while (it != list.end() && hit_count < count) { + struct_HateList *h = (*it); + if (h && h->entity_on_hatelist && h->entity_on_hatelist != caster) { + if (caster->CombatRange(h->entity_on_hatelist)) { + ++hit_count; + caster->ProcessAttackRounds(h->entity_on_hatelist, opts); } } + ++it; } - std::list::iterator iter = id_list.begin(); - while (iter != id_list.end()) - { - Mob *cur = entity_list.GetMobID((*iter)); - if (cur) - { - for (int i = 0; i < count; ++i) { - caster->Attack(cur, MainPrimary, false, false, false, opts); - } - } - iter++; - } - - return ret; + return hit_count; } void HateList::SpellCast(Mob *caster, uint32 spell_id, float range, Mob* ae_center) diff --git a/zone/mob.h b/zone/mob.h index ec705faf7..02d6d3e55 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -170,6 +170,16 @@ public: void DoMainHandAttackRounds(Mob *target, ExtraAttackOptions *opts = nullptr); void DoOffHandAttackRounds(Mob *target, ExtraAttackOptions *opts = nullptr); virtual bool CheckDoubleAttack(bool tripleAttack = false); // mob version doesn't use this flag + // inline process for places where we need to do them outside of the AI_Process + void ProcessAttackRounds(Mob *target, ExtraAttackOptions *opts = nullptr) + { + if (target) { + DoMainHandAttackRounds(target, opts); + if (CanThisClassDualWield()) + DoOffHandAttackRounds(target, opts); + } + return; + } //Appearance void SendLevelAppearance(); diff --git a/zone/mob_ai.cpp b/zone/mob_ai.cpp index f4a511b7b..c8654849a 100644 --- a/zone/mob_ai.cpp +++ b/zone/mob_ai.cpp @@ -1103,6 +1103,7 @@ void Mob::AI_Process() { if(attack_timer.Check()) { DoMainHandAttackRounds(target); + bool specialed = false; // NPCs can only do one of these a round if (GetSpecialAbility(SPECATK_FLURRY)) { int flurry_chance = GetSpecialAbilityParam(SPECATK_FLURRY, 0); flurry_chance = flurry_chance > 0 ? flurry_chance : RuleI(Combat, NPCFlurryChance); @@ -1134,6 +1135,7 @@ void Mob::AI_Process() { opts.crit_flat = cur; Flurry(&opts); + specialed = true; } } @@ -1154,7 +1156,7 @@ void Mob::AI_Process() { } } - if (GetSpecialAbility(SPECATK_RAMPAGE)) + if (GetSpecialAbility(SPECATK_RAMPAGE) && !specialed) { int rampage_chance = GetSpecialAbilityParam(SPECATK_RAMPAGE, 0); rampage_chance = rampage_chance > 0 ? rampage_chance : 20; @@ -1190,10 +1192,11 @@ void Mob::AI_Process() { opts.crit_flat = cur; } Rampage(&opts); + specialed = true; } } - if (GetSpecialAbility(SPECATK_AREA_RAMPAGE)) + if (GetSpecialAbility(SPECATK_AREA_RAMPAGE) && !specialed) { int rampage_chance = GetSpecialAbilityParam(SPECATK_AREA_RAMPAGE, 0); rampage_chance = rampage_chance > 0 ? rampage_chance : 20; @@ -1230,6 +1233,7 @@ void Mob::AI_Process() { } AreaRampage(&opts); + specialed = true; } } } @@ -1974,14 +1978,14 @@ bool Mob::Rampage(ExtraAttackOptions *opts) if (m_target == GetTarget()) continue; if (CombatRange(m_target)) { - Attack(m_target, MainPrimary, false, false, false, opts); + ProcessAttackRounds(m_target, opts); index_hit++; } } } if (RuleB(Combat, RampageHitsTarget) && index_hit < rampage_targets) - Attack(GetTarget(), MainPrimary, false, false, false, opts); + ProcessAttackRounds(GetTarget(), opts); return true; } @@ -1999,9 +2003,8 @@ void Mob::AreaRampage(ExtraAttackOptions *opts) rampage_targets = rampage_targets > 0 ? rampage_targets : 1; index_hit = hate_list.AreaRampage(this, GetTarget(), rampage_targets, opts); - if(index_hit == 0) { - Attack(GetTarget(), MainPrimary, false, false, false, opts); - } + if(index_hit == 0) + ProcessAttackRounds(GetTarget(), opts); } uint32 Mob::GetLevelCon(uint8 mylevel, uint8 iOtherLevel) { From d083262555c2ae6525ff2a76539fbf8f970d2125 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 5 Jul 2015 02:43:33 -0400 Subject: [PATCH 76/90] Fix clients offhand double attack check --- zone/attack.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/zone/attack.cpp b/zone/attack.cpp index 4f8ca4a53..f953ce3db 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -5061,7 +5061,13 @@ void Client::DoAttackRounds(Mob *target, int hand, bool IsFromSpell) Attack(target, hand, false, false, IsFromSpell); - if (CanThisClassDoubleAttack()) { + bool candouble = CanThisClassDoubleAttack(); + // extra off hand non-sense, can only double with skill of 150 or above + // or you have any amount of GiveDoubleAttack + if (candouble && hand == MainSecondary) + candouble = GetSkill(SkillDoubleAttack) > 149 || (aabonuses.GiveDoubleAttack + spellbonuses.GiveDoubleAttack + itembonuses.GiveDoubleAttack) > 0; + + if (candouble) { CheckIncreaseSkill(SkillDoubleAttack, target, -10); if (CheckDoubleAttack()) Attack(target, hand, false, false, IsFromSpell); @@ -5073,9 +5079,9 @@ void Client::DoAttackRounds(Mob *target, int hand, bool IsFromSpell) if (hand == MainPrimary) { auto flurrychance = aabonuses.FlurryChance + spellbonuses.FlurryChance + itembonuses.FlurryChance; if (flurrychance && zone->random.Roll(flurrychance)) { + Attack(target, hand, false, false, IsFromSpell); + Attack(target, hand, false, false, IsFromSpell); Message_StringID(MT_NPCFlurry, YOU_FLURRY); - Attack(target, hand, false, false, IsFromSpell); - Attack(target, hand, false, false, IsFromSpell); } auto extraattackchance = aabonuses.ExtraAttackChance + spellbonuses.ExtraAttackChance + itembonuses.ExtraAttackChance; From dcd1a0755316b34ab8a9394adb6c816892ad1c46 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 5 Jul 2015 03:11:25 -0400 Subject: [PATCH 77/90] Fix issue with two hander for NPCs dual wielding Cleaned up some other 2hander logic as well --- zone/attack.cpp | 29 ++++------------------------- zone/bonuses.cpp | 6 +++++- zone/loottables.cpp | 4 +++- zone/mob.cpp | 1 + zone/mob.h | 3 +++ 5 files changed, 16 insertions(+), 27 deletions(-) diff --git a/zone/attack.cpp b/zone/attack.cpp index f953ce3db..3714bb8e2 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -4921,7 +4921,6 @@ void Client::SetAttackTimer() attack_timer.SetAtTrigger(4000, true); Timer *TimerToUse = nullptr; - const Item_Struct *PrimaryWeapon = nullptr; for (int i = MainRange; i <= MainSecondary; i++) { //pick a timer @@ -4943,19 +4942,8 @@ void Client::SetAttackTimer() //special offhand stuff if (i == MainSecondary) { - //if we have a 2H weapon in our main hand, no dual - if (PrimaryWeapon != nullptr) { - if (PrimaryWeapon->ItemClass == ItemClassCommon - && (PrimaryWeapon->ItemType == ItemType2HSlash - || PrimaryWeapon->ItemType == ItemType2HBlunt - || PrimaryWeapon->ItemType == ItemType2HPiercing)) { - attack_dw_timer.Disable(); - continue; - } - } - //if we cant dual wield, skip it - if (!CanThisClassDualWield()) { + if (!CanThisClassDualWield() || HasTwoHanderEquipped()) { attack_dw_timer.Disable(); continue; } @@ -5004,9 +4992,6 @@ void Client::SetAttackTimer() if (quiver_haste > 0) speed *= quiver_haste; TimerToUse->SetAtTrigger(std::max(RuleI(Combat, MinHastedDelay), speed), true, true); - - if (i == MainPrimary) - PrimaryWeapon = ItemToUse; } } @@ -5044,7 +5029,7 @@ void NPC::SetAttackTimer() //special offhand stuff if (i == MainSecondary) { - if(!CanThisClassDualWield()) { + if(!CanThisClassDualWield() || HasTwoHanderEquipped()) { attack_dw_timer.Disable(); continue; } @@ -5085,14 +5070,8 @@ void Client::DoAttackRounds(Mob *target, int hand, bool IsFromSpell) } auto extraattackchance = aabonuses.ExtraAttackChance + spellbonuses.ExtraAttackChance + itembonuses.ExtraAttackChance; - if (extraattackchance) { - auto wpn = GetInv().GetItem(MainPrimary); - if (wpn && (wpn->GetItem()->ItemType == ItemType2HBlunt || - wpn->GetItem()->ItemType == ItemType2HSlash || - wpn->GetItem()->ItemType == ItemType2HPiercing)) - if (zone->random.Roll(extraattackchance)) - Attack(target, hand, false, false, IsFromSpell); - } + if (extraattackchance && HasTwoHanderEquipped() && zone->random.Roll(extraattackchance)) + Attack(target, hand, false, false, IsFromSpell); } } diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index 1e719dceb..155dfc4ae 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -141,6 +141,7 @@ void Client::CalcItemBonuses(StatBonuses* newbon) { ClearItemFactionBonuses(); SetShieldEquiped(false); SetTwoHandBluntEquiped(false); + SetTwoHanderEquipped(false); unsigned int i; //should not include 21 (SLOT_AMMO) @@ -154,8 +155,11 @@ void Client::CalcItemBonuses(StatBonuses* newbon) { const Item_Struct *item = inst->GetItem(); if (i == MainSecondary && (item && item->ItemType == ItemTypeShield)) SetShieldEquiped(true); - else if (i == MainPrimary && (item && item->ItemType == ItemType2HBlunt)) + else if (i == MainPrimary && (item && item->ItemType == ItemType2HBlunt)) { SetTwoHandBluntEquiped(true); + SetTwoHanderEquipped(true); + } else if (i == MainPrimary && (item && (item->ItemType == ItemType2HSlash || item->ItemType == ItemType2HPiercing))) + SetTwoHanderEquipped(true); } //Power Source Slot diff --git a/zone/loottables.cpp b/zone/loottables.cpp index e3014b12e..12766b57f 100644 --- a/zone/loottables.cpp +++ b/zone/loottables.cpp @@ -334,9 +334,11 @@ void NPC::AddLootDrop(const Item_Struct *item2, ItemList* itemlist, int16 charge eslot = MaterialPrimary; if (item2->Damage > 0) SendAddPlayerState(PlayerState::PrimaryWeaponEquipped); + if (item2->ItemType == ItemType2HBlunt || item2->ItemType == ItemType2HSlash || item2->ItemType == ItemType2HPiercing) + SetTwoHanderEquipped(true); } else if (foundslot == MainSecondary - && (GetOwner() != nullptr || (GetLevel() >= 13 && zone->random.Roll(NPC_DW_CHANCE)) || (item2->Damage==0)) && + && (GetOwner() != nullptr || (CanThisClassDualWield() && zone->random.Roll(NPC_DW_CHANCE)) || (item2->Damage==0)) && (item2->ItemType == ItemType1HSlash || item2->ItemType == ItemType1HBlunt || item2->ItemType == ItemTypeShield || item2->ItemType == ItemType1HPiercing)) { diff --git a/zone/mob.cpp b/zone/mob.cpp index ad0a60899..ce0a97db9 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -211,6 +211,7 @@ Mob::Mob(const char* in_name, trackable = true; has_shieldequiped = false; has_twohandbluntequiped = false; + has_twohanderequipped = false; has_numhits = false; has_MGB = false; has_ProjectIllusion = false; diff --git a/zone/mob.h b/zone/mob.h index 02d6d3e55..0094b0fbc 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -336,6 +336,8 @@ public: inline void SetShieldEquiped(bool val) { has_shieldequiped = val; } bool HasTwoHandBluntEquiped() const { return has_twohandbluntequiped; } inline void SetTwoHandBluntEquiped(bool val) { has_twohandbluntequiped = val; } + bool HasTwoHanderEquipped() { return has_twohanderequipped; } + void SetTwoHanderEquipped(bool val) { has_twohanderequipped = val; } virtual uint16 GetSkill(SkillUseTypes skill_num) const { return 0; } virtual uint32 GetEquipment(uint8 material_slot) const { return(0); } virtual int32 GetEquipmentMaterial(uint8 material_slot) const; @@ -1221,6 +1223,7 @@ protected: bool offhand; bool has_shieldequiped; bool has_twohandbluntequiped; + bool has_twohanderequipped; bool has_numhits; bool has_MGB; bool has_ProjectIllusion; From 70577584ab834e74e59e11a253a90bc620957d98 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 5 Jul 2015 03:33:16 -0400 Subject: [PATCH 78/90] Make SPECATK_QUAD == SPECATK_INNATE_DW when Combat:UseLiveCombatRounds is true --- zone/attack.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/zone/attack.cpp b/zone/attack.cpp index 3714bb8e2..02b16c64e 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -5157,7 +5157,10 @@ void Mob::DoOffHandAttackRounds(Mob *target, ExtraAttackOptions *opts) if (!target) return; // Mobs will only dual wield w/ the flag or have a secondary weapon - if (GetSpecialAbility(SPECATK_INNATE_DW) || GetEquipment(MaterialSecondary) != 0) { + // For now, SPECATK_QUAD means innate DW when Combat:UseLiveCombatRounds is true + if ((GetSpecialAbility(SPECATK_INNATE_DW) || + (RuleB(Combat, UseLiveCombatRounds) && GetSpecialAbility(SPECATK_QUAD))) || + GetEquipment(MaterialSecondary) != 0) { if (CheckDualWield()) { Attack(target, MainSecondary, false, false, false, opts); if (CanThisClassDoubleAttack() && GetLevel() > 35 && CheckDoubleAttack()) From 1d29c873fbf2223819afe1c0f0bdf2128cffcc8a Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 5 Jul 2015 16:36:12 -0400 Subject: [PATCH 79/90] Rewrite NPC combat rounds logic See changelog.txt --- changelog.txt | 9 +++++++++ utils/sql/git/optional/2015_07_05_LiveCombatRounds.sql | 1 + 2 files changed, 10 insertions(+) create mode 100644 utils/sql/git/optional/2015_07_05_LiveCombatRounds.sql diff --git a/changelog.txt b/changelog.txt index f3fdc3ba0..27b3f9de4 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,14 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 07/05/2015 == +mackal: Rewrite NPC combat attack round logic + An NPC "quading" is really just an NPC with innate dual wield that doubles on both hands + The old rules allowed NPCs to hit 6 times in one round + NPCs also seem to have their own skill progression for DW/DA + See: http://www.eqemulator.org/forums/showthread.php?t=38708 + You can set Combat:UseLiveCombatRounds to false to use the old rules + PC Double Attack rates kind of follow the same thing but still needs to be implemented + == 7/4/2015 == mackal: Reworked the activated avoidace skills (riposte, dodge, etc) based on dev quotes This also fixes the order things are checked (avoidance skills, THEN hit/miss) diff --git a/utils/sql/git/optional/2015_07_05_LiveCombatRounds.sql b/utils/sql/git/optional/2015_07_05_LiveCombatRounds.sql new file mode 100644 index 000000000..2a5377656 --- /dev/null +++ b/utils/sql/git/optional/2015_07_05_LiveCombatRounds.sql @@ -0,0 +1 @@ +INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Combat:UseLiveCombatRounds', 'true', 'If true use live NPC combat rules, false will use old rules.'); From e2ac647e03c6ceac9131e89faa18d76f1e0fa637 Mon Sep 17 00:00:00 2001 From: Kinglykrab Date: Sun, 5 Jul 2015 22:32:59 -0400 Subject: [PATCH 80/90] Bot saylinks and command aliases. --- changelog.txt | 6 + common/ruletypes.h | 2 + zone/bot.cpp | 456 ++++++++++++++++------------------------- zone/bot.h | 2 + zone/client_packet.cpp | 2 +- zone/command.cpp | 19 +- zone/command.h | 4 +- zone/corpse.cpp | 2 +- zone/embparser_api.cpp | 20 +- zone/lua_general.cpp | 12 +- zone/questmgr.cpp | 4 +- zone/questmgr.h | 4 +- 12 files changed, 222 insertions(+), 311 deletions(-) diff --git a/changelog.txt b/changelog.txt index 27b3f9de4..227058eba 100644 --- a/changelog.txt +++ b/changelog.txt @@ -8,6 +8,12 @@ mackal: Rewrite NPC combat attack round logic See: http://www.eqemulator.org/forums/showthread.php?t=38708 You can set Combat:UseLiveCombatRounds to false to use the old rules PC Double Attack rates kind of follow the same thing but still needs to be implemented +Kinglykrab: WARNING: summonburriedplayercorpse is now summonburiedplayercorpse, getplayerburriedcorpsecount is now getplayerburiedcorpsecount, summon_burried_player_corpse is now summon_buried_player_corpse, and get_player_burried_corpse_count is now get_player_buried_corpse_count FIX THESE IN YOUR SCRIPTS OR THEY WILL NOT WORK!!!! + Added bot saylinks (thanks Uleat!) + Command aliases for #augmentitem (#aug), #findnpctype (#fn), #findspell (#fs) + Bot command changes: #bot sow -> #bot speed, #bot magepet -> #bot setpet, #bot resurrectme -> #bot resurrect + Changed all occurrences of burried to buried in the code. + client_packet.cpp was referencing old columns in character_corpses, not sure how we didn't already see this before. == 7/4/2015 == mackal: Reworked the activated avoidace skills (riposte, dodge, etc) based on dev quotes diff --git a/common/ruletypes.h b/common/ruletypes.h index 8613eeebe..e1a095724 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -506,6 +506,8 @@ RULE_INT(Bots, BotAAExpansion, 8) // Bots get AAs through this expansion RULE_BOOL(Bots, BotGroupXP, false) // Determines whether client gets xp for bots outside their group. RULE_BOOL(Bots, BotBardUseOutOfCombatSongs, true) // Determines whether bard bots use additional out of combat songs. RULE_BOOL(Bots, BotLevelsWithOwner, false) // Auto-updates spawned bots as owner levels/de-levels (false is original behavior) +RULE_BOOL(Bots, BotCharacterLevelEnabled, false) // Enables required level to spawn bots +RULE_INT(Bots, BotCharacterLevel, 0) // 0 as default (if level > this value you can spawn bots if BotCharacterLevelEnabled is true) RULE_CATEGORY_END() #endif diff --git a/zone/bot.cpp b/zone/bot.cpp index 4bc291e84..6e9a1f2fc 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -8731,52 +8731,53 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(0, "#bot create [name] [class (id)] [race (id)] [model (male/female)] - create a permanent bot. See #bot help create."); c->Message(0, "#bot help create - show all the race/class id. (make it easier to create bots)"); c->Message(0, "#bot delete - completely destroy forever the targeted bot and all its items."); - c->Message(0, "#bot list [all/class(1-16)] - list your bots all or by class. Classes: 1(WAR), 2(CLR), 3(PAL), 4(RNG), 5(SHD), 6(DRU), 7(MNK), 8(BRD), 9(ROG), 10(SHM), 11(NEC), 12(WIZ), 13(MAG), 14(ENC), 15(BST), 16(BER)"); + c->Message(0, "#bot list [all/class(1-16)] - list all of your bots or list by class. Classes: 1(WAR), 2(CLR), 3(PAL), 4(RNG), 5(SHD), 6(DRU), 7(MNK), 8(BRD), 9(ROG), 10(SHM), 11(NEC), 12(WIZ), 13(MAG), 14(ENC), 15(BST), 16(BER)"); c->Message(0, "#bot spawn [bot name] - spawn a bot from it's name (use list to see all the bots). "); c->Message(0, "#bot inventory list - show the inventory (and the slots IDs) of the targeted bot."); c->Message(0, "#bot inventory remove [slotid] - remove the item at the given slot in the inventory of the targeted bot."); c->Message(0, "#bot update - you must type that command once you gain a level."); c->Message(0, "#bot summon - It will summon your targeted bot to you."); - c->Message(0, "#bot ai mez - If you're grouped with an Enchanter, he will mez your target."); + c->Message(0, "#bot ai mez - If you're grouped with an Enchanter, he will mesmerize your target."); c->Message(0, "#bot picklock - You must have a targeted Rogue bot in your group and be right on the door."); c->Message(0, "#bot cure [poison|disease|curse|blindness] Cleric has most options"); c->Message(0, "#bot bindme - You must have a Cleric in your group to get Bind Affinity cast on you."); - c->Message(0, "#bot track - look at mobs in the zone (ranger has options)"); + c->Message(0, "#bot track - look at mobs in the zone (Ranger has options)"); c->Message(0, "#bot target calm - attempts to pacify your target mob."); - c->Message(0, "#bot evac - transports your pc group to safe location in the current zone. bots are lost"); - c->Message(0, "#bot resurrectme - Your bot Cleric will rez you."); - c->Message(0, "#bot corpse summon - Necromancers summon corpse."); + c->Message(0, "#bot evac - transports your group to safe location in the current zone (bots are lost)"); + c->Message(0, "#bot resurrect - Your Cleric bot will resurrect your targeted player corpse."); + c->Message(0, "#bot corpse summon - Necromancers summon your targeted player's corpses."); c->Message(0, "#bot lore - cast Identify on the item on your mouse pointer."); - c->Message(0, "#bot sow - Bot sow on you (Druid has options)"); + c->Message(0, "#bot speed - Bots will cast Spirit of Wolf on you (Druid has options)"); c->Message(0, "#bot invis - Bot invisiblity (must have proper class in group)"); c->Message(0, "#bot levitate - Bot levitation (must have proper class in group)"); c->Message(0, "#bot resist - Bot resist buffs (must have proper class in group)"); - c->Message(0, "#bot runeme - Enchanter Bot cast Rune spell on you"); + c->Message(0, "#bot runeme - Enchanter bot casts Rune spell on you"); c->Message(0, "#bot shrink - Shaman or Beastlord will shrink target"); c->Message(0, "#bot endureb - Bot enduring breath (must have proper class in group)"); c->Message(0, "#bot charm - (must have proper class in group)"); c->Message(0, "#bot dire charm - (must have proper class in group)"); c->Message(0, "#bot pet remove - (remove pet before charm)"); - c->Message(0, "#bot gate - you need a Druid or Wizard in your group)"); + c->Message(0, "#bot gate - Druid or Wizard bot will cast gate."); c->Message(0, "#bot archery - Toggle Archery Skilled bots between using a Bow or using Melee weapons."); - c->Message(0, "#bot magepet [earth|water|air|fire|monster] - Select the pet type you want your Mage bot to use."); + c->Message(0, "#bot setpet [earth|water|air|fire|monster] - Select the pet type you want your Magician bot to use."); c->Message(0, "#bot giveitem - Gives your targeted bot the item you have on your cursor."); - c->Message(0, "#bot augmentitem - Allows you to augment items for other classes. You must have the Augmentation Sealer window filled."); + c->Message(0, "#bot augmentitem - Allows you to augment items for other classes. (You MUST have the Augmentation Sealer window filled)"); c->Message(0, "#bot camp - Tells your bot to camp out of the game."); - c->Message(0, "#bot group help - Displays the commands available to manage any BOTs in your group."); - c->Message(0, "#bot botgroup help - Displays the commands available to manage BOT ONLY groups."); + c->Message(0, "#bot group help - Displays the commands available to manage any bots in your group."); + c->Message(0, "#bot botgroup help - Displays the commands available to manage bot ONLY groups."); c->Message(0, "#bot mana [ | all] - Displays a mana report for all your spawned bots."); c->Message(0, "#bot setfollowdistance ### - sets target bots follow distance to ### (ie 30 or 250)."); - c->Message(0, "#bot [hair|haircolor|beard|beardcolor|face|eyes|heritage|tattoo|details ] - Change your BOTs appearance."); + c->Message(0, "#bot [hair|haircolor|beard|beardcolor|face|eyes|heritage|tattoo|details ] - Change your bot's appearance."); c->Message(0, "#bot armorcolor - #bot help armorcolor for info"); - c->Message(0, "#bot taunt [on|off] - Turns taunt on/off for targeted bot"); + c->Message(0, "#bot taunt [on|off] - Determines whether or not your targeted bot will taunt."); c->Message(0, "#bot stance [name] [stance (id)|list] - Sets/lists stance for named bot (Passive = 0, Balanced = 1, Efficient = 2, Reactive = 3, Aggressive = 4, Burn = 5, BurnAE = 6)"); c->Message(0, "#bot groupmessages [on|off] [bot name|all] - Turns group messages on/off for named bot/all bots."); - c->Message(0, "#bot defensive [bot name] - Causes warrior or knight bot to use defensive discipline / buff."); + c->Message(0, "#bot defensive [bot name] - Causes Warrior, Shadow Knight, or Paladin bot to use their defensive discipline or buff."); c->Message(0, "#bot healrotation help - Displays the commands available to manage BOT heal rotations."); - c->Message(0, "#bot pull [] [target] - Bot Pulling Target NPC's"); + c->Message(0, "#bot pull [] [target] - Bot Pulling Target NPCs"); c->Message(0, "#bot setinspectmessage - Copies your inspect message to a targeted bot that you own"); - c->Message(0, "#bot bardoutofcombat [on|off] - Determines wheter bard bots use out of combat songs."); + c->Message(0, "#bot bardoutofcombat [on|off] - Determines whether Bard bots use out of combat songs."); + c->Message(0, "#bot showhelm [on|off] - Determines whether or not your targeted bot's helmet will show. (Requires a respawn to take effect)"); return; } @@ -9083,6 +9084,13 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } if(!strcasecmp(sep->arg[1], "spawn") ) { + if (RuleB(Bots, BotCharacterLevelEnabled)) { + if (c->GetLevel() < RuleI(Bots, BotCharacterLevel)) { + c->Message(0, "You are only level %d, you must be level %d to spawn a bot!", c->GetLevel(), RuleI(Bots, BotCharacterLevel)); + return; + } + } + uint32 botId = GetBotIDByBotName(std::string(sep->arg[2])); if(GetBotOwnerCharacterID(botId, &TempErrorMessage) != c->CharacterID()) { @@ -9588,7 +9596,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { Tracker->CastToBot()->BotGroupSay(Tracker->CastToBot(), "Tracking mobs nearby", c->GetName()); entity_list.ShowSpawnWindow(c, RangeD, false); } else - Tracker->CastToBot()->BotGroupSay(Tracker->CastToBot(), "You want to [track all], [track near], or [track rare]?", c->GetName()); + Tracker->CastToBot()->BotGroupSay(Tracker->CastToBot(), "Do you want to %s, %s, or %s?", Tracker->CastToBot()->CreateSayLink(c, "#bot track all", "track all").c_str(), Tracker->CastToBot()->CreateSayLink(c, "#bot track near", "track near").c_str(), Tracker->CastToBot()->CreateSayLink(c, "#bot track rare", "track rare").c_str()); break; case BARD: @@ -9658,7 +9666,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { || !strcasecmp(sep->arg[2], "poison") && (c->GetLevel() <= 1)) { Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I don't have the needed level yet", sep->arg[2]); } else - Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "Do you want [cure poison], [cure disease], [cure curse], or [cure blindness]?", c->GetName()); + Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "Do you want to cure %s, %s, %s, or %s?", Curer->CastToBot()->CreateSayLink(c, "#bot cure poison", "poison").c_str(), Curer->CastToBot()->CreateSayLink(c, "#bot cure disease", "disease").c_str(), Curer->CastToBot()->CreateSayLink(c, "#bot cure curse", "curse").c_str(), Curer->CastToBot()->CreateSayLink(c, "#bot cure blindness", "blindness").c_str()); break; case SHAMAN: @@ -9678,7 +9686,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { || !strcasecmp(sep->arg[2], "poison") && (c->GetLevel() <= 2)) { Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I don't have the needed level yet", sep->arg[2]); } else - Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "Do you want [cure poison], [cure disease], or [cure blindness]?", c->GetName()); + Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "Do you want to cure %s, %s, or %s?", Curer->CastToBot()->CreateSayLink(c, "#bot cure poison", "poison").c_str(), Curer->CastToBot()->CreateSayLink(c, "#bot cure disease", "disease").c_str(), Curer->CastToBot()->CreateSayLink(c, "#bot cure blindness", "blindness").c_str()); break; case DRUID: @@ -9696,7 +9704,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { || !strcasecmp(sep->arg[2], "poison") && (c->GetLevel() <= 5)) { Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I don't have the needed level yet", sep->arg[2]) ; } else - Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "Do you want [cure poison], or [cure disease]?", c->GetName()); + Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "Do you want to cure %s or %s?", Curer->CastToBot()->CreateSayLink(c, "#bot cure poison", "poison").c_str(), Curer->CastToBot()->CreateSayLink(c, "#bot cure disease", "disease").c_str()); break; default: c->Message(15, "You must have a Cleric, Shaman, or Druid in your group."); @@ -9780,9 +9788,9 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } //Resurrect - if(!strcasecmp(sep->arg[1], "resurrectme")) { + if(!strcasecmp(sep->arg[1], "resurrect")) { Mob *target = c->GetTarget(); - if(target == nullptr || !target->IsCorpse()) { + if(target == nullptr || !target->IsPlayerCorpse()) { c->Message(15, "You must select a corpse!"); return; } @@ -9808,7 +9816,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { return; } - if(!strcasecmp(sep->arg[1], "magepet")) { + if(!strcasecmp(sep->arg[1], "setpet")) { if(c->GetTarget() && c->GetTarget()->IsBot() && (c->GetTarget()->GetClass() == MAGICIAN)) { if(c->GetTarget()->CastToBot()->GetBotOwnerCharacterID() == c->CharacterID()) { int botlevel = c->GetTarget()->GetLevel(); @@ -10144,7 +10152,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } // Sow - if ((!strcasecmp(sep->arg[1], "sow")) && (c->IsGrouped())) { + if ((!strcasecmp(sep->arg[1], "speed")) && (c->IsGrouped())) { Mob *Sower; uint32 SowerClass = 0; Group *g = c->GetGroup(); @@ -10182,37 +10190,37 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { switch(SowerClass) { case DRUID: if ((!strcasecmp(sep->arg[2], "regular")) && (zone->CanCastOutdoor()) && (c->GetLevel() >= 10)) { - Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "Casting sow..."); + Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "Casting Spirit of Wolf."); Sower->CastSpell(278, c->GetID(), 1, -1, -1); } else if ((!strcasecmp(sep->arg[2], "regular")) && (zone->CanCastOutdoor()) && (c->GetLevel() <= 10)) Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "I'm not level 10 yet."); else if ((!strcasecmp(sep->arg[2], "wolf")) && zone->CanCastOutdoor() && (c->GetLevel() >= 20)) { - Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "Casting group wolf..."); + Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "Casting group Spirit of Wolf."); Sower->CastSpell(428, c->GetID(), 1, -1, -1); } else if ((!strcasecmp(sep->arg[2], "wolf")) && (c->GetLevel() <= 20)) Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "I'm not level 20 yet."); else if ((!strcasecmp(sep->arg[2], "feral")) && (c->GetLevel() >= 50)) { - Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "Casting Feral Pack..."); + Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "Casting Feral Pack."); Sower->CastSpell(4058, c->GetID(), 1, -1, -1); } else if ((!strcasecmp(sep->arg[2], "feral")) && (c->GetLevel() <= 50)) Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "I'm not level 50 yet."); else if ((!strcasecmp(sep->arg[2], "shrew")) && (c->GetLevel() >= 35)) { - Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "Casting Pack Shrew..."); + Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "Casting Pack Shrew."); Sower->CastSpell(4055, c->GetID(), 1, -1, -1); } else if ((!strcasecmp(sep->arg[2], "wolf")) && (c->GetLevel() <= 35)) Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "I'm not level 35 yet."); else if ((!zone->CanCastOutdoor()) && (!strcasecmp(sep->arg[2], "regular")) || (!zone->CanCastOutdoor()) && (!strcasecmp(sep->arg[2], "wolf"))) - Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "I can't cast this spell indoors, try [sow shrew] if you're 35 or higher, or [sow feral] if you're 50 or higher."); + Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "I can't cast this spell indoors, try %s if you're 35 or higher, or %s if you're 50 or higher.", Sower->CastToBot()->CreateSayLink(c, "#bot speed shrew", "Pack Shrew").c_str(), Sower->CastToBot()->CreateSayLink(c, "#bot speed feral", "Feral Pack").c_str()); else if (!zone->CanCastOutdoor()) - Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "I can't cast this spell indoors, try [sow shrew] if you're 35 or higher, or [sow feral] if you're 50 or higher."); + Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "I can't cast this spell indoors, try 5s if you're 35 or higher, or %s if you're 50 or higher.", Sower->CastToBot()->CreateSayLink(c, "#bot speed shrew", "Pack Shrew").c_str(), Sower->CastToBot()->CreateSayLink(c, "#bot speed feral", "Feral Pack").c_str()); else if (zone->CanCastOutdoor()) - Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "Do you want [sow regular] or [sow wolf]?"); + Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "Do you want %s or %s?", Sower->CastToBot()->CreateSayLink(c, "#bot speed regular", "Spirit of Wolf").c_str(), Sower->CastToBot()->CreateSayLink(c, "#bot speed wolf", "Group Spirit of Wolf").c_str()); else if (!zone->CanCastOutdoor()) - Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "I can't cast this spell indoors, try [sow shrew] if you're 35 or higher, or [sow feral] if you're 50 or higher."); + Sower->CastToBot()->BotGroupSay(Sower->CastToBot(), "I can't cast this spell indoors, try %s if you're 35 or higher, or %s if you're 50 or higher.", Sower->CastToBot()->CreateSayLink(c, "#bot speed shrew", "Pack Shrew").c_str(), Sower->CastToBot()->CreateSayLink(c, "#bot speed feral", "Feral").c_str()); break; case SHAMAN: if ((zone->CanCastOutdoor()) && (c->GetLevel() >= 9)) { @@ -10258,7 +10266,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { Group *g = c->GetGroup(); Mob *target = c->GetTarget(); if(target == nullptr || (!target->IsClient() && (c->GetTarget()->CastToBot()->GetBotOwner() != c))) - c->Message(15, "You must select a player or bot you own"); + c->Message(15, "You must select a player or bot you own!"); else if(g) { for(int i = 0; i < MAX_GROUP_MEMBERS; i++){ @@ -10305,6 +10313,25 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { // Gate if ((!strcasecmp(sep->arg[1], "gate")) && (c->IsGrouped())) { + const char* druidgate[25][4] = { { "#bot gate karana", "karana", "North Karana", "550" }, { "#bot gate commons", "commons", "West Commonlands", "551" }, + { "#bot gate tox", "tox", "Toxxulia Forest", "552" }, { "#bot gate butcher", "butcher", "Butcherblock Mountains", "553" }, { "#bot gate lava", "lava", "Lavastorm Mountains", "554" }, + { "#bot gate ro", "ro", "South Ro", "555" }, { "#bot gate feerott", "feerrott", "Feerrott", "556" }, { "#bot gate steamfont", "steamfont", "Steamfont Mountains", "557" }, + { "#bot gate misty", "misty", "Misty Thicket", "558" }, { "#bot gate wakening", "wakening", "Wakening Lands", "1398" }, { "#bot gate iceclad", "iceclad", "Ieclad Ocean", "1434" }, + { "#bot gate divide", "divide", "The Great Divide", "1438" }, { "#bot gate cobalt", "cobalt", "Cobalt Scar", "1440" }, { "#bot gate combines", "combines", "The Combines", "1517" }, + { "#bot gate surefall", "surefall", "Surefall Glade", "2020" }, { "#bot gate grimling", "grimling", "Grimling Forest", "2419" }, { "#bot gate twilight", "twilight", "The Twilight Sea", "2424" }, + { "#bot gate dawnshroud", "dawnshroud", "Dawnshroud Peak", "2429" }, { "#bot gate nexus", "nexus", "The Nexus", "2432" }, { "#bot gate pok", "pok", "Plane of Knowledge", "3184" }, + { "#bot gate stonebrunt", "stonebrunt", "Stonebrunt Mountains", "3792" }, { "#bot gate bloodfields", "bloodfields", "Bloodfields", "6184" }, + { "#bot gate emerald", "emerald", "The Emerald Jungle", "1737" }, { "#bot gate skyfire", "skyfire", "Skyfire Mountains", "1736" }, { "#bot gate slaughter", "slaughter", "Wall of Slaughter", "6179" } }; + const char* wizardgate[24][4] = { { "#bot gate commons", "commons", "West Commonlands", "566" }, { "#bot gate fay", "fay", "Greater Faydark", "563" }, + { "#bot gate ro", "ro", "South Ro", "567" }, { "#bot gate tox", "tox", "Toxxulia Forest", "561" }, { "#bot gate nk", "nk", "North Karana", "562" }, + { "#bot gate nek", "nek", "Nektulos Forest", "564" }, { "#bot gate wakening", "wakening", "Wakening Lands", "1399" }, { "#bot gate iceclad", "iceclad", "Iceclad Ocean", "1418" }, + { "#bot gate divide", "divide", "The Great Divide", "1423" }, { "#bot gate cobalt", "cobalt", "Cobaltscar", "1425" }, { "#bot gate dreadlands", "dreadlands", "Dreadlands", "1516" }, + { "#bot gate wk", "wk", "West Karana", "568" }, { "#bot gate twilight", "twilight", "Twilight Sea", "2425" }, { "#bot gate dawnshroud", "dawnshroud", "Dawnshroud Peak", "2430" }, + { "#bot gate nexus", "nexus", "Nexus", "2944" }, { "#bot gate pok", "pok", "Plane of Knowledge", "3180" }, { "#bot gate wos", "wos", "Wall of Slaughter", "6178" }, + { "#bot gate grimling", "grimling", "Grimling Forest", "2420" }, { "#bot gate emerald", "emerald", "Emerald Jungle", "1739" }, { "#bot gate hateplane", "hateplane", "Plane of Hate", "666" }, + { "#bot gate airplane", "airplane", "Plane of Sky", "674" }, { "#bot gate skyfire", "skyfire", "Skyfire Mountains", "1738" }, + { "#bot gate bloodfields", "bloodfields", "Bloodfields", "6183" }, { "#bot gate stonebrunt", "stonebrunt", "Stonebrunt Mountains", "3793" } }; + bool valid = false; Mob *Gater; uint32 GaterClass = 0; Group *g = c->GetGroup(); @@ -10328,212 +10355,36 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } } switch(GaterClass) { - case DRUID: - if ((!strcasecmp(sep->arg[2], "karana")) && (c->GetLevel() >= 25) ) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Karana."); - Gater->CastSpell(550, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "commons")) && (c->GetLevel() >= 27)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Commons."); - Gater->CastSpell(551, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "tox")) && (c->GetLevel() >= 25)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Toxxulia."); - Gater->CastSpell(552, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "butcher")) && (c->GetLevel() >= 25)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Butcherblock."); - Gater->CastSpell(553, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "lava")) && (c->GetLevel() >= 30)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Lavastorm."); - Gater->CastSpell(554, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "ro")) && (c->GetLevel() >= 32)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Ro."); - Gater->CastSpell(555, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "feerrott")) && (c->GetLevel() >= 32)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Feerrott."); - Gater->CastSpell(556, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "steamfont")) && (c->GetLevel() >= 31)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Steamfont."); - Gater->CastSpell(557, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "misty")) && (c->GetLevel() >= 36)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Misty."); - Gater->CastSpell(558, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "wakening")) && (c->GetLevel() >= 40)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Wakening Lands."); - Gater->CastSpell(1398, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "iceclad")) && (c->GetLevel() >= 32)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Iceclad Ocean."); - Gater->CastSpell(1434, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "divide")) && (c->GetLevel() >= 36)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of The Great Divide."); - Gater->CastSpell(1438, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "cobalt")) && (c->GetLevel() >= 42)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Cobalt Scar."); - Gater->CastSpell(1440, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "combines")) && (c->GetLevel() >= 33)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of The Combines."); - Gater->CastSpell(1517, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "surefall")) && (c->GetLevel() >= 26)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Surefall Glade."); - Gater->CastSpell(2020, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "grimling")) && (c->GetLevel() >= 29)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Grimling Forest."); - Gater->CastSpell(2419, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "twilight")) && (c->GetLevel() >= 33)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Twilight."); - Gater->CastSpell(2424, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "dawnshroud")) && (c->GetLevel() >= 37)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Dawnshroud."); - Gater->CastSpell(2429, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "nexus")) && (c->GetLevel() >= 26)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of The Nexus."); - Gater->CastSpell(2432, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "pok")) && (c->GetLevel() >= 38)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Knowledge."); - Gater->CastSpell(3184, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "stonebrunt")) && (c->GetLevel() >= 28)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Stonebrunt Mountains."); - Gater->CastSpell(3792, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "bloodfields")) && (c->GetLevel() >= 55)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Bloodfields."); - Gater->CastSpell(6184, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "emerald")) && (c->GetLevel() >= 39)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Wind of the South."); - Gater->CastSpell(1737, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "skyfire")) && (c->GetLevel() >= 44)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Wind of the North."); - Gater->CastSpell(1736, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "slaughter")) && (c->GetLevel() >= 64)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Circle of Slaughter."); - Gater->CastSpell(6179, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "karana") - || !strcasecmp(sep->arg[2], "tox") - || !strcasecmp(sep->arg[2], "butcher") && (c->GetLevel() <= 25)) - || !strcasecmp(sep->arg[2], "commons") && (c->GetLevel() <= 27) - || (!strcasecmp(sep->arg[2], "ro") - || !strcasecmp(sep->arg[2], "feerrott") && (c->GetLevel() <= 32)) - || !strcasecmp(sep->arg[2], "steamfont") && (c->GetLevel() <= 31) - || !strcasecmp(sep->arg[2], "misty") && (c->GetLevel() <= 36) - || !strcasecmp(sep->arg[2], "lava") && (c->GetLevel() <= 30) - || !strcasecmp(sep->arg[2], "wakening") && (c->GetLevel() <= 40) - || !strcasecmp(sep->arg[2], "iceclad") && (c->GetLevel() <= 32) - || !strcasecmp(sep->arg[2], "divide") && (c->GetLevel() <= 38) - || !strcasecmp(sep->arg[2], "cobalt") && (c->GetLevel() <= 42) - || !strcasecmp(sep->arg[2], "combines") && (c->GetLevel() <= 33) - || !strcasecmp(sep->arg[2], "surefall") && (c->GetLevel() <= 26) - || !strcasecmp(sep->arg[2], "grimling") && (c->GetLevel() <= 29) - || !strcasecmp(sep->arg[2], "twilight") && (c->GetLevel() <= 33) - || !strcasecmp(sep->arg[2], "dawnshroud") && (c->GetLevel() <= 37) - || !strcasecmp(sep->arg[2], "nexus") && (c->GetLevel() <= 26) - || !strcasecmp(sep->arg[2], "pok") && (c->GetLevel() <= 38) - || !strcasecmp(sep->arg[2], "stonebrunt") && (c->GetLevel() <= 28) - || !strcasecmp(sep->arg[2], "bloodfields") && (c->GetLevel() <= 55) - || !strcasecmp(sep->arg[2], "emerald") && (c->GetLevel() <= 38) - || !strcasecmp(sep->arg[2], "skyfire") && (c->GetLevel() <= 43) - || !strcasecmp(sep->arg[2], "wos") && (c->GetLevel() <= 64)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "I don't have the needed level yet."); - } else - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "With the proper level I can [gate] to [karana], [commons], [tox], [butcher], [lava], [ro], [feerrott], [steamfont], [misty], [wakening], [iceclad], [divide], [cobalt], [combines], [surefall], [grimling], [twilight], [dawnshroud], [nexus], [pok], [stonebrunt], [bloodfields], [emerald], [skyfire] or [wos]."); + case DRUID: { + for (int i = 0; i < 25; i++) { + if (!strcasecmp(sep->arg[2], druidgate[i][1])) { + Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Gating to %s!", druidgate[i][2]); + Gater->CastSpell(atoi(druidgate[i][3]), c->GetID(), 1, -1, -1); + valid = true; + } + } + if (!valid) { + Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "With the proper level I can gate you to all of the following zones:"); + for (int i = 0; i < 25; i++) + Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "%s", Gater->CastToBot()->CreateSayLink(c, druidgate[i][0], druidgate[i][2]).c_str()); + } break; - case WIZARD: - if ((!strcasecmp(sep->arg[2], "commons")) && (c->GetLevel() >= 35) ) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Common Portal."); - Gater->CastSpell(566, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "fay")) && (c->GetLevel() >= 27)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Fay Portal."); - Gater->CastSpell(563, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "ro")) && (c->GetLevel() >= 37)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Ro Portal."); - Gater->CastSpell(567, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "tox")) && (c->GetLevel() >= 25)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Toxxulia Portal."); - Gater->CastSpell(561, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "nk")) && (c->GetLevel() >= 27)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting North Karana Portal."); - Gater->CastSpell(562, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "nek")) && (c->GetLevel() >= 32)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Nektulos Portal."); - Gater->CastSpell(564, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "wakening")) && (c->GetLevel() >= 43)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Wakening Lands Portal."); - Gater->CastSpell(1399, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "iceclad")) && (c->GetLevel() >= 33)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Iceclad Ocean Portal."); - Gater->CastSpell(1418, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "divide")) && (c->GetLevel() >= 36)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Great Divide Portal."); - Gater->CastSpell(1423, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "cobalt")) && (c->GetLevel() >= 43)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Cobalt Scar Portal."); - Gater->CastSpell(1425, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "combines")) && (c->GetLevel() >= 34)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Combines Portal."); - Gater->CastSpell(1516, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "wk")) && (c->GetLevel() >= 27)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting West Karana Portal."); - Gater->CastSpell(568, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "twilight")) && (c->GetLevel() >= 27)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Twilight Portal."); - Gater->CastSpell(2425, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "dawnshroud")) && (c->GetLevel() >= 27)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Dawnshroud Portal."); - Gater->CastSpell(2430, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "nexus")) && (c->GetLevel() >= 29)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Nexus Portal."); - Gater->CastSpell(2944, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "pok")) && (c->GetLevel() >= 27)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Plane of Knowledge Portal."); - Gater->CastSpell(3180, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "wos")) && (c->GetLevel() >= 27)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Wall of Slaughter Portal."); - Gater->CastSpell(6178, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "grimling")) && (c->GetLevel() >= 29)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Fay Portal."); - Gater->CastSpell(2420, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "emerald")) && (c->GetLevel() >= 37)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Porting to Emerald Jungle."); - Gater->CastSpell(1739, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "hateplane")) && (c->GetLevel() >= 39)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Porting to Hate Plane."); - Gater->CastSpell(666, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "airplane")) && (c->GetLevel() >= 39)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Porting to Airplane."); - Gater->CastSpell(674, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "skyfire")) && (c->GetLevel() >= 36)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Porting to Skyfire."); - Gater->CastSpell(1738, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "bloodfields")) && (c->GetLevel() >= 55)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Bloodfields Portal."); - Gater->CastSpell(6183, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "stonebrunt")) && (c->GetLevel() >= 27)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Casting Stonebrunt Portal."); - Gater->CastSpell(3793, c->GetID(), 1, -1, -1); - } else if ((!strcasecmp(sep->arg[2], "commons") && (c->GetLevel() <= 35)) - || !strcasecmp(sep->arg[2], "fay") && (c->GetLevel() <= 27) - || (!strcasecmp(sep->arg[2], "ro") && (c->GetLevel() <= 37)) - || !strcasecmp(sep->arg[2], "tox") && (c->GetLevel() <= 25) - || !strcasecmp(sep->arg[2], "nk") && (c->GetLevel() <= 25) - || !strcasecmp(sep->arg[2], "nek") && (c->GetLevel() <= 32) - || !strcasecmp(sep->arg[2], "wakening") && (c->GetLevel() <= 43) - || !strcasecmp(sep->arg[2], "iceclad") && (c->GetLevel() <= 33) - || !strcasecmp(sep->arg[2], "divide") && (c->GetLevel() <= 36) - || !strcasecmp(sep->arg[2], "cobalt") && (c->GetLevel() <= 43) - || !strcasecmp(sep->arg[2], "combines") && (c->GetLevel() <= 34) - || !strcasecmp(sep->arg[2], "wk") && (c->GetLevel() <= 37) - || !strcasecmp(sep->arg[2], "twilight") && (c->GetLevel() <= 33) - || !strcasecmp(sep->arg[2], "dawnshroud") && (c->GetLevel() <= 39) - || !strcasecmp(sep->arg[2], "nexus") && (c->GetLevel() <= 29) - || (!strcasecmp(sep->arg[2], "pok") - || !strcasecmp(sep->arg[2], "hateplane") - || !strcasecmp(sep->arg[2], "airplane") && (c->GetLevel() <= 38)) - || !strcasecmp(sep->arg[2], "grimling") && (c->GetLevel() <= 29) - || !strcasecmp(sep->arg[2], "bloodfields") && (c->GetLevel() <= 55) - || !strcasecmp(sep->arg[2], "stonebrunt") && (c->GetLevel() <= 27) - || !strcasecmp(sep->arg[2], "emerald") && (c->GetLevel() <= 36) - || !strcasecmp(sep->arg[2], "skyfire") && (c->GetLevel() <= 36) - || !strcasecmp(sep->arg[2], "wos") && (c->GetLevel() <= 64)) { - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "I don't have the needed level yet."); - } else - Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "With the proper level I can [gate] to [commons], [fay], [ro], [tox], [nk], [wakening], [iceclad], [divide], [cobalt], [combines], [wk], [grimling], [twilight], [dawnshroud], [nexus], [pok], [stonebrunt], [bloodfields], [emerald], [skyfire], [hateplane], [airplane] or [wos].", c->GetName()); + } + case WIZARD: { + for (int i = 0; i < 24; i++) { + if (!strcasecmp(sep->arg[2], wizardgate[i][1])) { + Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "Gating to %s!", wizardgate[i][2]); + Gater->CastSpell(atoi(wizardgate[i][3]), c->GetID(), 1, -1, -1); + valid = true; + } + } + if (!valid) { + Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "With the proper level I can gate you to all of the following zones:"); + for (int i = 0; i < 24; i++) + Gater->CastToBot()->BotGroupSay(Gater->CastToBot(), "%s", Gater->CastToBot()->CreateSayLink(c, wizardgate[i][0], wizardgate[i][2]).c_str()); + } break; + } default: c->Message(15, "You must have a Druid or Wizard in your group."); break; @@ -10680,25 +10531,25 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if ((c->GetLevel() <= 14) && (!strcasecmp(sep->arg[2], "undead"))) Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I'm not level 14 yet."); else if ((!c->IsInvisible(c)) && (!c->invisible_undead) && (c->GetLevel() >= 14) && (!strcasecmp(sep->arg[2], "undead"))) { - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting invis undead."); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting Invisibility vs. Undead."); Inviser->CastSpell(235, c->GetID(), 1, -1, -1); } else if ((c->GetLevel() <= 4) && (!strcasecmp(sep->arg[2], "live"))) Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I'm not level 4 yet."); else if ((!c->IsInvisible(c))&& (!c->invisible_undead) && (c->GetLevel() >= 4) && (!strcasecmp(sep->arg[2], "live"))) { - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting invisibilty."); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting Invisibilty."); Inviser->CastSpell(42, c->GetID(), 1, -1, -1); } else if ((c->GetLevel() <= 6) && (!strcasecmp(sep->arg[2], "see"))) Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I'm not level 6 yet."); else if ((c->GetLevel() >= 6) && (!strcasecmp(sep->arg[2], "see"))) { - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting see invisible."); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting See Invisibility."); Inviser->CastSpell(80, c->GetID(), 1, -1, -1); } else if ((c->IsInvisible(c)) || (c->invisible_undead)) Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I can't cast this if you're already invis-buffed."); else - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Do you want [invis undead], [invis live] or [invis see]?"); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Do you want %s, %s, or %s?", Inviser->CastToBot()->CreateSayLink(c, "#bot invis live", "Invisibility").c_str(), Inviser->CastToBot()->CreateSayLink(c, "#bot invis undead", "Invisibility vs. Undead").c_str(), Inviser->CastToBot()->CreateSayLink(c, "#bot invis see", "See Invisibility").c_str()); break; case MAGICIAN: if (!strcasecmp(sep->arg[2], "undead")) @@ -10706,47 +10557,47 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { else if ((c->GetLevel() <= 8) && (!strcasecmp(sep->arg[2], "live"))) Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I'm not level 8 yet."); else if ((!c->IsInvisible(c))&& (!c->invisible_undead) && (c->GetLevel() >= 8) && (!strcasecmp(sep->arg[2], "live"))) { - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting invisibilty."); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting Invisibilty."); Inviser->CastSpell(42, c->GetID(), 1, -1, -1); } else if ((c->GetLevel() <= 16) && (!strcasecmp(sep->arg[2], "see"))) Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I'm not level 16 yet."); else if ((c->GetLevel() >= 16) && (!strcasecmp(sep->arg[2], "see"))) { - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting see invisible."); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting See Invisibility."); Inviser->CastSpell(80, c->GetID(), 1, -1, -1); } else if ((c->IsInvisible(c)) || (c->invisible_undead)) Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I can't cast this if you're already invis-buffed."); else - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Do you want [invis live] or [invis see]?"); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Do you want %s or %s?", Inviser->CastToBot()->CreateSayLink(c, "#bot invis live", "Invisibility").c_str(), Inviser->CastToBot()->CreateSayLink(c, "#bot invis see", "see Invisibility").c_str()); break; case WIZARD: if ((c->GetLevel() <= 39) && (!strcasecmp(sep->arg[2], "undead"))) Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I'm not level 39 yet."); else if ((!c->IsInvisible(c))&& (!c->invisible_undead) && (c->GetLevel() >= 39) && (!strcasecmp(sep->arg[2], "undead"))) { - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting invis undead."); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting Invisibility vs. Undead."); Inviser->CastSpell(235, c->GetID(), 1, -1, -1); } else if ((c->GetLevel() <= 16) && (!strcasecmp(sep->arg[2], "live"))) Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I'm not level 16 yet."); else if ((!c->IsInvisible(c))&& (!c->invisible_undead) && (c->GetLevel() >= 16) && (!strcasecmp(sep->arg[2], "live"))) { - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting invisibilty."); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting Invisibilty."); Inviser->CastSpell(42, c->GetID(), 1, -1, -1); } else if ((c->GetLevel() <= 4) && (!strcasecmp(sep->arg[2], "see"))) Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I'm not level 6 yet."); else if ((c->GetLevel() >= 4) && (!strcasecmp(sep->arg[2], "see"))) { - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting see invisible."); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting See Invisibility."); Inviser->CastSpell(80, c->GetID(), 1, -1, -1); } else if ((c->IsInvisible(c)) || (c->invisible_undead)) Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I can't cast this if you're already invis-buffed."); else - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Do you want [invis undead], [invis live] or [invis see]?"); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Do you want %s, %s, or %s?", Inviser->CastToBot()->CreateSayLink(c, "#bot invis undead", "Invisibility vs. Undead").c_str(), Inviser->CastToBot()->CreateSayLink(c, "#bot invis live", "Invisibility").c_str(), Inviser->CastToBot()->CreateSayLink(c, "#bot invis see", "See Invisibility").c_str()); break; case NECROMANCER: if ((!c->IsInvisible(c))&& (!c->invisible_undead) && (!strcasecmp(sep->arg[2], "undead"))) { - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting invis undead."); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting Invisibility vs. Undead."); Inviser->CastSpell(235, c->GetID(), 1, -1, -1); } else if (!strcasecmp(sep->arg[2], "see")) @@ -10756,7 +10607,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { else if ((c->IsInvisible(c))|| (c->invisible_undead)) Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I can't cast this if you're already invis-buffed."); else - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I only have [invis undead]"); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I only have %s.", Inviser->CastToBot()->CreateSayLink(c, "#bot invis undead", "Invisibility vs. Undead").c_str()); break; case DRUID: if (!strcasecmp(sep->arg[2], "undead")) @@ -10767,7 +10618,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting Superior Camouflage."); Inviser->CastSpell(34, c->GetID(), 1, -1, -1); } else if ((!c->IsInvisible(c))&& (!c->invisible_undead) && (c->GetLevel() >= 4) && (!strcasecmp(sep->arg[2], "live")) && (zone->CanCastOutdoor())) { - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting Camouflage..."); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting Camouflage."); Inviser->CastSpell(247, c->GetID(), 1, -1, -1); } else if ((c->GetLevel() >= 4) && (!strcasecmp(sep->arg[2], "live")) && (!zone->CanCastOutdoor())) @@ -10775,13 +10626,13 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { else if ((c->GetLevel() <= 13) && (!strcasecmp(sep->arg[2], "see"))) Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I'm not level 13 yet."); else if ((c->GetLevel() >= 13) && (!strcasecmp(sep->arg[2], "see"))) { - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting see invisible."); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Casting See Invisibility."); Inviser->CastSpell(80, c->GetID(), 1, -1, -1); } else if ((c->IsInvisible(c)) || (c->invisible_undead)) Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "I can't cast this if you're already invis-buffed."); else - Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Do you want [invis live] or [invis see]?"); + Inviser->CastToBot()->BotGroupSay(Inviser->CastToBot(), "Do you want %s or %s?", Inviser->CastToBot()->CreateSayLink(c, "#bot invis live", "Invisibility").c_str(), Inviser->CastToBot()->CreateSayLink(c, "#bot invis see", "See Invisibility").c_str()); break; default: c->Message(15, "You must have a Enchanter, Magician, Wizard, Druid, or Necromancer in your group."); @@ -10908,19 +10759,19 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { switch(ResisterClass) { case CLERIC: if(!strcasecmp(sep->arg[2], "poison") && (c->GetLevel() >= 6)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting poison protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Poison protection."); Resister->CastToBot()->Bot_Command_Resist(1, Resister->GetLevel()); } else if(!strcasecmp(sep->arg[2], "disease") && (c->GetLevel() >= 11)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting disease protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Disease protection."); Resister->CastToBot()->Bot_Command_Resist(2, Resister->GetLevel()); } else if(!strcasecmp(sep->arg[2], "fire") && (c->GetLevel() >= 8)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting fire protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Fire protection."); Resister->CastToBot()->Bot_Command_Resist(3, Resister->GetLevel()); } else if(!strcasecmp(sep->arg[2], "cold") && (c->GetLevel() >= 13)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting cold protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Cold protection."); Resister->CastToBot()->Bot_Command_Resist(4, Resister->GetLevel()); } else if(!strcasecmp(sep->arg[2], "magic") && (c->GetLevel() >= 16)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting magic protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Magic protection."); Resister->CastToBot()->Bot_Command_Resist(5, Resister->GetLevel()); } else if(!strcasecmp(sep->arg[2], "magic") && (c->GetLevel() <= 16) || !strcasecmp(sep->arg[2], "cold") && (c->GetLevel() <= 13) @@ -10929,24 +10780,24 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { || !strcasecmp(sep->arg[2], "poison") && (c->GetLevel() <= 6)) { Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "I don't have the required level yet."); } else - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Do you want [resist poison], [resist disease], [resist fire], [resist cold], or [resist magic]?"); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Do you want %s, %s, %s, %s, or %s?", Resister->CastToBot()->CreateSayLink(c, "#bot resist poison", "Resist Poison").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot resist disease", "Resist Disease").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis fire", "Resist Fire").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis cold", "Resist Cold").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis magic", "Resist Magic").c_str()); break; case SHAMAN: if(!strcasecmp(sep->arg[2], "poison") && (c->GetLevel() >= 20)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting poison protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Poison protection."); Resister->CastToBot()->Bot_Command_Resist(12, Resister->GetLevel()); } else if(!strcasecmp(sep->arg[2], "disease") && (c->GetLevel() >= 8)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting disease protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Disease protection."); Resister->CastToBot()->Bot_Command_Resist(13, Resister->GetLevel()); } else if(!strcasecmp(sep->arg[2], "fire") && (c->GetLevel() >= 5)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting fire protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Fire protection."); Resister->CastToBot()->Bot_Command_Resist(14, Resister->GetLevel()); } else if(!strcasecmp(sep->arg[2], "cold") && (c->GetLevel() >= 1)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting cold protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Cold protection."); Resister->CastToBot()->Bot_Command_Resist(15, Resister->GetLevel()); } else if(!strcasecmp(sep->arg[2], "magic") && (c->GetLevel() >= 19)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting magic protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Magic protection."); Resister->CastToBot()->Bot_Command_Resist(16, Resister->GetLevel()); } else if(!strcasecmp(sep->arg[2], "magic") && (c->GetLevel() <= 19) || !strcasecmp(sep->arg[2], "cold") && (c->GetLevel() <= 1) @@ -10955,24 +10806,24 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { || !strcasecmp(sep->arg[2], "poison") && (c->GetLevel() <= 20)) { Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "I don't have the needed level yet."); } else - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Do you want [resist poison], [resist disease], [resist fire], [resist cold], or [resist magic]?"); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Do you want %s, %s, %s, %s, or %s?", Resister->CastToBot()->CreateSayLink(c, "#bot resist poison", "Resist Poison").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot resist disease", "Resist Disease").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis fire", "Resist Fire").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis cold", "Resist Cold").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis magic", "Resist Magic").c_str()); break; case DRUID: if (!strcasecmp(sep->arg[2], "poison") && (c->GetLevel() >= 19)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting poison protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Poison protection."); Resister->CastToBot()->Bot_Command_Resist(7, Resister->GetLevel()); } else if (!strcasecmp(sep->arg[2], "disease") && (c->GetLevel() >= 19)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting disease protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Disease protection."); Resister->CastToBot()->Bot_Command_Resist(8, Resister->GetLevel()); } else if(!strcasecmp(sep->arg[2], "fire")) { // Fire level 1 - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting fire protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Fire protection."); Resister->CastToBot()->Bot_Command_Resist(9, Resister->GetLevel()); } else if(!strcasecmp(sep->arg[2], "cold") && (c->GetLevel() >= 13)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting cold protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Cold protection."); Resister->CastToBot()->Bot_Command_Resist(10, Resister->GetLevel()); } else if(!strcasecmp(sep->arg[2], "magic") && (c->GetLevel() >= 16)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting magic protection."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Casting Magic protection."); Resister->CastToBot()->Bot_Command_Resist(11, Resister->GetLevel()); } else if (!strcasecmp(sep->arg[2], "magic") && (c->GetLevel() <= 16) || !strcasecmp(sep->arg[2], "cold") && (c->GetLevel() <= 9) @@ -10980,7 +10831,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { || !strcasecmp(sep->arg[2], "poison") && (c->GetLevel() <= 19)) { Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "I don't have the required level yet.") ; } else - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Do you want [resist poison], [resist disease], [resist fire], [resist cold], or [resist magic]?"); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Do you want %s, %s, %s, %s, or %s?", Resister->CastToBot()->CreateSayLink(c, "#bot resist poison", "Resist Poison").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot resist disease", "Resist Disease").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis fire", "Resist Fire").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis cold", "Resist Cold").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis magic", "Resist Magic").c_str()); break; default: c->Message(15, "You must have a Cleric, Shaman, or Druid in your group."); @@ -11053,7 +10904,8 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { botGroupLeader->BotGroupSay(botGroupLeader, "I am prepared to lead."); else botGroupLeader->BotGroupSay(botGroupLeader, "I cannot lead."); - } else + } + else c->Message(13, "You must target a spawned bot first."); return; @@ -11108,16 +10960,19 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(Bot::AddBotToGroup(botGroupMember, g)) { database.SetGroupID(botGroupMember->GetName(), g->GetID(), botGroupMember->GetBotID()); botGroupMember->BotGroupSay(botGroupMember, "I have joined %s\'s group.", botGroupLeader->GetName()); - } else + } + else botGroupMember->BotGroupSay(botGroupMember, "I can not join %s\'s group.", botGroupLeader->GetName()); } else { Group* tempGroup = botGroupMember->GetGroup(); if(tempGroup) botGroupMember->BotGroupSay(botGroupMember, "I can not join %s\'s group. I am already a member in %s\'s group.", botGroupLeader->GetName(), tempGroup->GetLeaderName()); } - } else + } + else c->Message(13, "You must target a spawned bot first."); - } else + } + else botGroupLeader->BotGroupSay(botGroupMember, "I have no more openings in my group, %s.", c->GetName()); } else { Group* tempGroup = botGroupLeader->GetGroup(); @@ -11148,9 +11003,11 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { botGroupMember->BotGroupSay(botGroupMember, "I am no longer in a group."); else botGroupMember->BotGroupSay(botGroupMember, "I can not leave %s\'s group.", g->GetLeaderName()); - } else + } + else botGroupMember->BotGroupSay(botGroupMember, "I am not in a group."); - } else + } + else c->Message(13, "You must target a spawned bot first."); return; @@ -13350,4 +13207,45 @@ void Bot::BotHealRotationsClear(Client* c) { } } +std::string Bot::CreateSayLink(Client* c, const char* message, const char* name) { + int sayid = 0; + int sz = strlen(message); + char *escaped_string = new char[sz * 2]; + database.DoEscapeString(escaped_string, message, sz); + std::string query = StringFormat("SELECT `id` FROM `saylink` WHERE `phrase` = '%s'", escaped_string); + auto results = database.QueryDatabase(query); + if (results.Success()) { + if (results.RowCount() >= 1) { + for (auto row = results.begin();row != results.end(); ++row) + sayid = atoi(row[0]); + } else { + std::string insert_query = StringFormat("INSERT INTO `saylink` (`phrase`) VALUES ('%s')", escaped_string); + results = database.QueryDatabase(insert_query); + if (!results.Success()) { + Log.Out(Logs::General, Logs::Error, "Error in saylink phrase queries", results.ErrorMessage().c_str()); + } else { + results = database.QueryDatabase(query); + if (results.Success()) { + if (results.RowCount() >= 1) + for(auto row = results.begin(); row != results.end(); ++row) + sayid = atoi(row[0]); + } + else + Log.Out(Logs::General, Logs::Error, "Error in saylink phrase queries", results.ErrorMessage().c_str()); + } + } + } + safe_delete_array(escaped_string); + + sayid += 500000; + + Client::TextLink linker; + linker.SetLinkType(linker.linkItemData); + linker.SetProxyItemID(sayid); + linker.SetProxyText(name); + + auto say_link = linker.GenerateLink(); + return say_link; +} + #endif diff --git a/zone/bot.h b/zone/bot.h index 7f2652498..2c5e30644 100644 --- a/zone/bot.h +++ b/zone/bot.h @@ -549,6 +549,8 @@ public: void SetNumHealRotationMembers( uint8 numMembers ) { _numHealRotationMembers = numMembers; } void SetBardUseOutOfCombatSongs(bool useOutOfCombatSongs) { _bardUseOutOfCombatSongs = useOutOfCombatSongs;} void SetShowHelm(bool showhelm) { _showhelm = showhelm; } + + std::string CreateSayLink(Client* botOwner, const char* message, const char* name); // Class Destructors virtual ~Bot(); diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 0e2f0da08..ce63610da 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -6008,7 +6008,7 @@ void Client::Handle_OP_GMSearchCorpse(const EQApplicationPacket *app) char *escSearchString = new char[129]; database.DoEscapeString(escSearchString, gmscs->Name, strlen(gmscs->Name)); - std::string query = StringFormat("SELECT charname, zoneid, x, y, z, time_of_death, rezzed, IsBurried " + std::string query = StringFormat("SELECT charname, zoneid, x, y, z, time_of_death, is_rezzed, is_buried " "FROM character_corpses WheRE charname LIKE '%%%s%%' ORDER BY charname LIMIT %i", escSearchString, maxResults); safe_delete_array(escSearchString); diff --git a/zone/command.cpp b/zone/command.cpp index ac419043f..7a846898b 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -170,6 +170,7 @@ int command_init(void) { command_add("appearance", "[type] [value] - Send an appearance packet for you or your target", 150, command_appearance) || command_add("attack", "[targetname] - Make your NPC target attack targetname", 150, command_attack) || command_add("augmentitem", "Force augments an item. Must have the augment item window open.", 250, command_augmentitem) || + command_add("aug", nullptr, 250, command_augmentitem) || command_add("ban", "[name] [reason]- Ban by character name", 150, command_ban) || command_add("beard", "- Change the beard of your target", 80, command_beard) || command_add("beardcolor", "- Change the beard color of your target", 80, command_beardcolor) || @@ -216,12 +217,14 @@ int command_init(void) { command_add("flagedit", "- Edit zone flags on your target", 100, command_flagedit) || command_add("flags", "- displays the flags of you or your target", 0, command_flags) || command_add("flymode", "[0/1/2] - Set your or your player target's flymode to off/on/levitate", 50, command_flymode) || + command_add("fn", nullptr, 100, command_findnpctype) || command_add("fov", "- Check wether you're behind or in your target's field of view", 80, command_fov) || command_add("freeze", "- Freeze your target", 80, command_freeze) || - command_add("fz", nullptr, 10, command_findzone) || + command_add("fs", nullptr, 50, command_findspell) || + command_add("fz", nullptr, 100, command_findzone) || command_add("gassign", "[id] - Assign targetted NPC to predefined wandering grid id", 100, command_gassign) || command_add("gender", "[0/1/2] - Change your or your target's gender to male/female/neuter", 50, command_gender) || - command_add("getplayerburriedcorpsecount", "- Get the target's total number of burried player corpses.", 100, command_getplayerburriedcorpsecount) || + command_add("getplayerburiedcorpsecount", "- Get the target's total number of buried player corpses.", 100, command_getplayerburiedcorpsecount) || command_add("getvariable", "[varname] - Get the value of a variable from the database", 200, command_getvariable) || command_add("gi", nullptr,200, command_giveitem) || command_add("ginfo", "- get group info on target.", 20, command_ginfo) || @@ -386,7 +389,7 @@ int command_init(void) { command_add("spon", "- Sends OP_MemorizeSpell", 80, command_spon) || command_add("stun", "[duration] - Stuns you or your target for duration", 100, command_stun) || command_add("summon", "[charname] - Summons your player/npc/corpse target, or charname if specified", 80, command_summon) || - command_add("summonburriedplayercorpse", "- Summons the target's oldest burried corpse, if any exist.", 100, command_summonburriedplayercorpse) || + command_add("summonburiedplayercorpse", "- Summons the target's oldest buried corpse, if any exist.", 100, command_summonburiedplayercorpse) || command_add("summonitem", "[itemid] [charges] - Summon an item onto your cursor. Charges are optional.", 200, command_summonitem) || command_add("suspend", "[name] [days] [reason] - Suspend by character name and for specificed number of days", 150, command_suspend) || command_add("task", "(subcommand) - Task system commands", 150, command_task) || @@ -7801,7 +7804,7 @@ void command_deletegraveyard(Client *c, const Seperator *sep) return; } -void command_summonburriedplayercorpse(Client *c, const Seperator *sep) +void command_summonburiedplayercorpse(Client *c, const Seperator *sep) { Client *t=c; @@ -7815,12 +7818,12 @@ void command_summonburriedplayercorpse(Client *c, const Seperator *sep) Corpse* PlayerCorpse = database.SummonBuriedCharacterCorpses(t->CharacterID(), t->GetZoneID(), zone->GetInstanceID(), t->GetPosition()); if(!PlayerCorpse) - c->Message(0, "Your target doesn't have any burried corpses."); + c->Message(0, "Your target doesn't have any buried corpses."); return; } -void command_getplayerburriedcorpsecount(Client *c, const Seperator *sep) +void command_getplayerburiedcorpsecount(Client *c, const Seperator *sep) { Client *t=c; @@ -7834,9 +7837,9 @@ void command_getplayerburriedcorpsecount(Client *c, const Seperator *sep) uint32 CorpseCount = database.GetCharacterBuriedCorpseCount(t->CharacterID()); if(CorpseCount > 0) - c->Message(0, "Your target has a total of %u burried corpses.", CorpseCount); + c->Message(0, "Your target has a total of %u buried corpses.", CorpseCount); else - c->Message(0, "Your target doesn't have any burried corpses."); + c->Message(0, "Your target doesn't have any buried corpses."); return; } diff --git a/zone/command.h b/zone/command.h index 795f75919..bf20d46d2 100644 --- a/zone/command.h +++ b/zone/command.h @@ -279,8 +279,8 @@ void command_refundaa(Client *c, const Seperator *sep); void command_traindisc(Client *c, const Seperator *sep); void command_deletegraveyard(Client *c, const Seperator *sep); void command_setgraveyard(Client *c, const Seperator *sep); -void command_getplayerburriedcorpsecount(Client *c, const Seperator *sep); -void command_summonburriedplayercorpse(Client *c, const Seperator *sep); +void command_getplayerburiedcorpsecount(Client *c, const Seperator *sep); +void command_summonburiedplayercorpse(Client *c, const Seperator *sep); void command_unscribespell(Client *c, const Seperator *sep); void command_scribespell(Client *c, const Seperator *sep); void command_refreshgroup(Client *c, const Seperator *sep); diff --git a/zone/corpse.cpp b/zone/corpse.cpp index fad65aa3a..af937e41b 100644 --- a/zone/corpse.cpp +++ b/zone/corpse.cpp @@ -835,7 +835,7 @@ bool Corpse::Process() { Save(); player_corpse_depop = true; corpse_db_id = 0; - Log.Out(Logs::General, Logs::None, "Tagged %s player corpse has burried.", this->GetName()); + Log.Out(Logs::General, Logs::None, "Tagged %s player corpse has buried.", this->GetName()); } else { Log.Out(Logs::General, Logs::Error, "Unable to bury %s player corpse.", this->GetName()); diff --git a/zone/embparser_api.cpp b/zone/embparser_api.cpp index 6db7777ac..871d47074 100644 --- a/zone/embparser_api.cpp +++ b/zone/embparser_api.cpp @@ -1748,18 +1748,18 @@ XS(XS__clear_zone_flag) XSRETURN_EMPTY; } -XS(XS__summonburriedplayercorpse); -XS(XS__summonburriedplayercorpse) +XS(XS__summonburiedplayercorpse); +XS(XS__summonburiedplayercorpse) { dXSARGS; if (items != 5) - Perl_croak(aTHX_ "Usage: summonburriedplayercorpse(char_id,dest_x,dest_y,dest_z,dest_heading)"); + Perl_croak(aTHX_ "Usage: summonburiedplayercorpse(char_id,dest_x,dest_y,dest_z,dest_heading)"); bool RETVAL; uint32 char_id = (int)SvIV(ST(0)); auto position = glm::vec4((float)SvIV(ST(1)), (float)SvIV(ST(2)), (float)SvIV(ST(3)),(float)SvIV(ST(4))); - RETVAL = quest_manager.summonburriedplayercorpse(char_id, position); + RETVAL = quest_manager.summonburiedplayercorpse(char_id, position); ST(0) = boolSV(RETVAL); sv_2mortal(ST(0)); @@ -1784,19 +1784,19 @@ XS(XS__summonallplayercorpses) XSRETURN(1); } -XS(XS__getplayerburriedcorpsecount); -XS(XS__getplayerburriedcorpsecount) +XS(XS__getplayerburiedcorpsecount); +XS(XS__getplayerburiedcorpsecount) { dXSARGS; if (items != 1) - Perl_croak(aTHX_ "Usage: getplayerburriedcorpsecount(char_id)"); + Perl_croak(aTHX_ "Usage: getplayerburiedcorpsecount(char_id)"); uint32 RETVAL; dXSTARG; uint32 char_id = (int)SvIV(ST(0)); - RETVAL = quest_manager.getplayerburriedcorpsecount(char_id); + RETVAL = quest_manager.getplayerburiedcorpsecount(char_id); XSprePUSH; PUSHu((IV)RETVAL); XSRETURN(1); @@ -3712,7 +3712,7 @@ EXTERN_C XS(boot_quest) newXS(strcpy(buf, "get_spawn_condition"), XS__get_spawn_condition, file); newXS(strcpy(buf, "getguildnamebyid"), XS__getguildnamebyid, file); newXS(strcpy(buf, "getlevel"), XS__getlevel, file); - newXS(strcpy(buf, "getplayerburriedcorpsecount"), XS__getplayerburriedcorpsecount, file); + newXS(strcpy(buf, "getplayerburiedcorpsecount"), XS__getplayerburiedcorpsecount, file); newXS(strcpy(buf, "gettaskactivitydonecount"), XS__gettaskactivitydonecount, file); newXS(strcpy(buf, "givecash"), XS__givecash, file); newXS(strcpy(buf, "gmmove"), XS__gmmove, file); @@ -3802,7 +3802,7 @@ EXTERN_C XS(boot_quest) newXS(strcpy(buf, "stopalltimers"), XS__stopalltimers, file); newXS(strcpy(buf, "stoptimer"), XS__stoptimer, file); newXS(strcpy(buf, "summonallplayercorpses"), XS__summonallplayercorpses, file); - newXS(strcpy(buf, "summonburriedplayercorpse"), XS__summonburriedplayercorpse, file); + newXS(strcpy(buf, "summonburiedplayercorpse"), XS__summonburiedplayercorpse, file); newXS(strcpy(buf, "summonitem"), XS__summonitem, file); newXS(strcpy(buf, "surname"), XS__surname, file); newXS(strcpy(buf, "targlobal"), XS__targlobal, file); diff --git a/zone/lua_general.cpp b/zone/lua_general.cpp index bf65fea7c..483426b2e 100644 --- a/zone/lua_general.cpp +++ b/zone/lua_general.cpp @@ -513,16 +513,16 @@ void lua_toggle_spawn_event(int event_id, bool enable, bool strict, bool reset) quest_manager.toggle_spawn_event(event_id, enable, strict, reset); } -void lua_summon_burried_player_corpse(uint32 char_id, float x, float y, float z, float h) { - quest_manager.summonburriedplayercorpse(char_id, glm::vec4(x, y, z, h)); +void lua_summon_buried_player_corpse(uint32 char_id, float x, float y, float z, float h) { + quest_manager.summonburiedplayercorpse(char_id, glm::vec4(x, y, z, h)); } void lua_summon_all_player_corpses(uint32 char_id, float x, float y, float z, float h) { quest_manager.summonallplayercorpses(char_id, glm::vec4(x, y, z, h)); } -int lua_get_player_burried_corpse_count(uint32 char_id) { - return quest_manager.getplayerburriedcorpsecount(char_id); +int lua_get_player_buried_corpse_count(uint32 char_id) { + return quest_manager.getplayerburiedcorpsecount(char_id); } bool lua_bury_player_corpse(uint32 char_id) { @@ -1524,9 +1524,9 @@ luabind::scope lua_register_general() { luabind::def("spawn_condition", &lua_spawn_condition), luabind::def("get_spawn_condition", &lua_get_spawn_condition), luabind::def("toggle_spawn_event", &lua_toggle_spawn_event), - luabind::def("summon_burried_player_corpse", &lua_summon_burried_player_corpse), + luabind::def("summon_buried_player_corpse", &lua_summon_buried_player_corpse), luabind::def("summon_all_player_corpses", &lua_summon_all_player_corpses), - luabind::def("get_player_burried_corpse_count", &lua_get_player_burried_corpse_count), + luabind::def("get_player_buried_corpse_count", &lua_get_player_buried_corpse_count), luabind::def("bury_player_corpse", &lua_bury_player_corpse), luabind::def("task_selector", &lua_task_selector), luabind::def("task_set_selector", &lua_task_set_selector), diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 71f0de917..b6243091f 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -1774,7 +1774,7 @@ void QuestManager::sethp(int hpperc) { owner->Damage(owner, newhp, SPELL_UNKNOWN, SkillHandtoHand, false, 0, false); } -bool QuestManager::summonburriedplayercorpse(uint32 char_id, const glm::vec4& position) { +bool QuestManager::summonburiedplayercorpse(uint32 char_id, const glm::vec4& position) { bool Result = false; if(char_id <= 0) @@ -1798,7 +1798,7 @@ bool QuestManager::summonallplayercorpses(uint32 char_id, const glm::vec4& posit return true; } -uint32 QuestManager::getplayerburriedcorpsecount(uint32 char_id) { +uint32 QuestManager::getplayerburiedcorpsecount(uint32 char_id) { uint32 Result = 0; if(char_id > 0) { diff --git a/zone/questmgr.h b/zone/questmgr.h index 879407dc6..960a8f1f4 100644 --- a/zone/questmgr.h +++ b/zone/questmgr.h @@ -159,9 +159,9 @@ public: void set_zone_flag(int zone_id); void clear_zone_flag(int zone_id); void sethp(int hpperc); - bool summonburriedplayercorpse(uint32 char_id, const glm::vec4& position); + bool summonburiedplayercorpse(uint32 char_id, const glm::vec4& position); bool summonallplayercorpses(uint32 char_id, const glm::vec4& position); - uint32 getplayerburriedcorpsecount(uint32 char_id); + uint32 getplayerburiedcorpsecount(uint32 char_id); bool buryplayercorpse(uint32 char_id); void forcedooropen(uint32 doorid, bool altmode); void forcedoorclose(uint32 doorid, bool altmode); From 61c9a0759698b0b52c5b9a345bc981d4c33ebc0b Mon Sep 17 00:00:00 2001 From: Kinglykrab Date: Mon, 6 Jul 2015 14:05:09 -0400 Subject: [PATCH 81/90] Fixed guild windows on bot-enabled servers. --- common/guild_base.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/guild_base.cpp b/common/guild_base.cpp index 1416dedf1..bfd9f4126 100644 --- a/common/guild_base.cpp +++ b/common/guild_base.cpp @@ -867,7 +867,7 @@ bool BaseGuildManager::QueryWithLogging(std::string query, const char *errmsg) { //factored out so I dont have to copy this crap. #ifdef BOTS #define GuildMemberBaseQuery \ -"SELECT c.id,c.name,c.class,c.level,c.timelaston,c.zoneid," \ +"SELECT c.id,c.name,c.class,c.level,c.last_login,c.zone_id," \ " g.guild_id,g.rank,g.tribute_enable,g.total_tribute,g.last_tribute," \ " g.banker,g.public_note,g.alt" \ " FROM vwBotCharacterMobs AS c LEFT JOIN vwGuildMembers AS g ON c.id=g.char_id AND c.mobtype = g.mobtype " From 1e75b4ba779635edb4a5162e61461e29eec89ade Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Mon, 6 Jul 2015 16:11:00 -0400 Subject: [PATCH 82/90] Implement Triple Attack as a skill See change log for more details Optional SQL will max toons triple attack skills --- changelog.txt | 7 + common/skills.h | 9 +- .../git/optional/2015_07_06_TripleAttack.sql | 27 ++++ zone/attack.cpp | 75 +++++----- zone/client.h | 3 +- zone/command.cpp | 128 +++++++++--------- zone/mob.cpp | 8 ++ zone/mob.h | 3 +- zone/special_attacks.cpp | 4 +- 9 files changed, 157 insertions(+), 107 deletions(-) create mode 100644 utils/sql/git/optional/2015_07_06_TripleAttack.sql diff --git a/changelog.txt b/changelog.txt index 227058eba..f5d1803d0 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,12 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 07/06/2015 == +mackal: Implement Triple Attack Skill + Parses showed about rand(1000) for the chance, may need more investigating + Corrected Double Attack chances as well + Running optional 2015_07_06_TripleAttack.sql will set current toons to their max skill + This is optional because the admins might want to go a different route. + == 07/05/2015 == mackal: Rewrite NPC combat attack round logic An NPC "quading" is really just an NPC with innate dual wield that doubles on both hands diff --git a/common/skills.h b/common/skills.h index 1fad4de3e..c79a522ee 100644 --- a/common/skills.h +++ b/common/skills.h @@ -108,16 +108,17 @@ enum SkillUseTypes /*13869*/ SkillBerserking, /*13902*/ SkillTaunt, /*05837*/ SkillFrenzy, // This appears to be the only listed one not grouped with the others -/*00000*/ _EmuSkillCount // move to last position of active enumeration labels // SoF+ specific skills -// /*03670*/ SkillRemoveTraps, -// /*13049*/ SkillTripleAttack, +/*03670*/ SkillRemoveTraps, +/*13049*/ SkillTripleAttack, // RoF2+ specific skills // /*00789*/ Skill2HPiercing, // /*01216*/ SkillNone, // This needs to move down as new skills are added +/*00000*/ _EmuSkillCount // move to last position of active enumeration labels + // Skill Counts // /*-----*/ _SkillCount_62 = 75, // use for Ti and earlier max skill checks // /*-----*/ _SkillCount_SoF = 77, // use for SoF thru RoF1 max skill checks @@ -170,7 +171,7 @@ enum SkillUseTypes }; // temporary until it can be sorted out... -#define HIGHEST_SKILL SkillFrenzy +#define HIGHEST_SKILL SkillTripleAttack // Spell Effects use this value to determine if an effect applies to all skills. #define ALL_SKILLS -1 diff --git a/utils/sql/git/optional/2015_07_06_TripleAttack.sql b/utils/sql/git/optional/2015_07_06_TripleAttack.sql new file mode 100644 index 000000000..e5061e108 --- /dev/null +++ b/utils/sql/git/optional/2015_07_06_TripleAttack.sql @@ -0,0 +1,27 @@ +DELIMITER $$ +DROP PROCEDURE IF EXISTS GrantTripleAttack$$ +CREATE PROCEDURE GrantTripleAttack() + BEGIN + DECLARE finished INT; + DECLARE char_id INT; + DECLARE skill_max INT; + DECLARE cur CURSOR FOR SELECT character_data.id, skill_caps.cap FROM `character_data` LEFT JOIN `skill_caps` ON character_data.`level` = skill_caps.`level` AND character_data.class = skill_caps.class AND skill_caps.skillID = 76; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; + + OPEN cur; + + SET finished = 0; + REPEAT + FETCH cur INTO char_id, skill_max; + + IF skill_max IS NOT NULL AND skill_max > 0 THEN + REPLACE INTO `character_skills` (`id`, `skill_id`, `value`) VALUES(char_id, 76, skill_max); + END IF; + UNTIL finished END REPEAT; + + CLOSE cur; + END$$ +DELIMITER ; + +CALL GrantTripleAttack(); +DROP PROCEDURE GrantTripleAttack; diff --git a/zone/attack.cpp b/zone/attack.cpp index 02b16c64e..440e8c59a 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -3406,41 +3406,39 @@ bool Mob::HasRangedProcs() const return false; } -bool Client::CheckDoubleAttack(bool tripleAttack) { - +bool Client::CheckDoubleAttack() +{ + int chance = 0; + int skill = GetSkill(SkillDoubleAttack); //Check for bonuses that give you a double attack chance regardless of skill (ie Bestial Frenzy/Harmonious Attack AA) - uint32 bonusGiveDA = aabonuses.GiveDoubleAttack + spellbonuses.GiveDoubleAttack + itembonuses.GiveDoubleAttack; - - if(!HasSkill(SkillDoubleAttack) && !bonusGiveDA) + int bonusGiveDA = aabonuses.GiveDoubleAttack + spellbonuses.GiveDoubleAttack + itembonuses.GiveDoubleAttack; + if (skill > 0) + chance = skill + GetLevel(); + else if (!bonusGiveDA) return false; - float chance = 0.0f; + if (bonusGiveDA) + chance += bonusGiveDA / 100.0f * 500; // convert to skill value + int per_inc = aabonuses.DoubleAttackChance + spellbonuses.DoubleAttackChance + itembonuses.DoubleAttackChance; + if (per_inc) + chance += chance * per_inc / 100; - uint16 skill = GetSkill(SkillDoubleAttack); + return zone->random.Int(1, 500) <= chance; +} - int32 bonusDA = aabonuses.DoubleAttackChance + spellbonuses.DoubleAttackChance + itembonuses.DoubleAttackChance; +// Admittedly these parses were short, but this check worked for 3 toons across multiple levels +// with varying triple attack skill (1-3% error at least) +bool Client::CheckTripleAttack() +{ + int chance = GetSkill(SkillTripleAttack); + if (chance < 1) + return false; - //Use skill calculations otherwise, if you only have AA applied GiveDoubleAttack chance then use that value as the base. - if (skill) - chance = (float(skill+GetLevel()) * (float(100.0f+bonusDA+bonusGiveDA) /100.0f)) /500.0f; - else - chance = (float(bonusGiveDA) * (float(100.0f+bonusDA)/100.0f) ) /100.0f; + int per_inc = aabonuses.TripleAttackChance + spellbonuses.TripleAttackChance + itembonuses.TripleAttackChance; + if (per_inc) + chance += chance * per_inc / 100; - //Live now uses a static Triple Attack skill (lv 46 = 2% lv 60 = 20%) - We do not have this skill on EMU ATM. - //A reasonable forumla would then be TA = 20% * chance - //AA's can also give triple attack skill over cap. (ie Burst of Power) NOTE: Skill ID in spell data is 76 (Triple Attack) - //Kayen: Need to decide if we can implement triple attack skill before working in over the cap effect. - if(tripleAttack) { - // Only some Double Attack classes get Triple Attack [This is already checked in client_processes.cpp] - int32 triple_bonus = spellbonuses.TripleAttackChance + itembonuses.TripleAttackChance; - chance *= 0.2f; //Baseline chance is 20% of your double attack chance. - chance *= float(100.0f+triple_bonus)/100.0f; //Apply modifiers. - } - - if(zone->random.Roll(chance)) - return true; - - return false; + return zone->random.Int(1, 1000) <= chance; } bool Client::CheckDoubleRangedAttack() { @@ -3452,7 +3450,7 @@ bool Client::CheckDoubleRangedAttack() { return false; } -bool Mob::CheckDoubleAttack(bool tripleAttack) +bool Mob::CheckDoubleAttack() { // Not 100% certain pets follow this or if it's just from pets not always // having the same skills as most mobs @@ -5054,21 +5052,28 @@ void Client::DoAttackRounds(Mob *target, int hand, bool IsFromSpell) if (candouble) { CheckIncreaseSkill(SkillDoubleAttack, target, -10); - if (CheckDoubleAttack()) - Attack(target, hand, false, false, IsFromSpell); - if (hand == MainPrimary && GetLevel() >= 60 && - (GetClass() == MONK || GetClass() == WARRIOR || GetClass() == RANGER || GetClass() == BERSERKER) && - CheckDoubleAttack(true)) + if (CheckDoubleAttack()) { Attack(target, hand, false, false, IsFromSpell); + // you can only triple from the main hand + if (hand == MainPrimary && CanThisClassTripleAttack()) { + CheckIncreaseSkill(SkillTripleAttack, target, -10); + if (CheckTripleAttack()) + Attack(target, hand, false, false, IsFromSpell); + } + } } + if (hand == MainPrimary) { + // According to http://www.monkly-business.net/forums/showpost.php?p=312095&postcount=168 a dev told them flurry isn't dependant on triple attack + // the parses kind of back that up and all of my parses seemed to be 4 or 5 attacks in the round which would work out to be + // doubles or triples with 2 from flurries or triple with 1 or 2 flurries ... Going with the "dev quote" I guess like we've always had it auto flurrychance = aabonuses.FlurryChance + spellbonuses.FlurryChance + itembonuses.FlurryChance; if (flurrychance && zone->random.Roll(flurrychance)) { Attack(target, hand, false, false, IsFromSpell); Attack(target, hand, false, false, IsFromSpell); Message_StringID(MT_NPCFlurry, YOU_FLURRY); } - + // I haven't parsed where this guy happens, but it's not part of the normal chain above so this is fine auto extraattackchance = aabonuses.ExtraAttackChance + spellbonuses.ExtraAttackChance + itembonuses.ExtraAttackChance; if (extraattackchance && HasTwoHanderEquipped() && zone->random.Roll(extraattackchance)) Attack(target, hand, false, false, IsFromSpell); diff --git a/zone/client.h b/zone/client.h index 7558d9bb6..03d09d50c 100644 --- a/zone/client.h +++ b/zone/client.h @@ -888,7 +888,8 @@ public: bool CheckTradeLoreConflict(Client* other); void LinkDead(); void Insight(uint32 t_id); - bool CheckDoubleAttack(bool tripleAttack = false); + bool CheckDoubleAttack(); + bool CheckTripleAttack(); bool CheckDoubleRangedAttack(); bool CheckDualWield(); diff --git a/zone/command.cpp b/zone/command.cpp index 7a846898b..3b8fba3f6 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -146,7 +146,7 @@ Access Levels: */ int command_init(void) { - + if ( @@ -434,7 +434,7 @@ int command_init(void) { command_add("zsave", " - Saves zheader to the database", 80, command_zsave) || command_add("zsky", "[skytype] - Change zone sky type", 80, command_zsky) || command_add("zstats", "- Show info about zone header", 80, command_zstats) || - command_add("zunderworld", "[zcoord] - Sets the underworld using zcoord", 80, command_zunderworld) || + command_add("zunderworld", "[zcoord] - Sets the underworld using zcoord", 80, command_zunderworld) || command_add("zuwcoords", "[z coord] - Set underworld coord", 80, command_zuwcoords) ) { @@ -644,8 +644,8 @@ void command_logcommand(Client *c, const char *message) c->AccountName(), c->AccountID(), admin,c->GetName(), - c->GetTarget()?c->GetTarget()->GetName():"None", - "Command", + c->GetTarget()?c->GetTarget()->GetName():"None", + "Command", message, 1 ); @@ -731,7 +731,7 @@ void command_setfaction(Client *c, const Seperator *sep) auto npcTypeID = c->GetTarget()->CastToNPC()->GetNPCTypeID(); c->Message(15,"Setting NPC %u to faction %i", npcTypeID, atoi(sep->argplus[1])); - std::string query = StringFormat("UPDATE npc_types SET npc_faction_id = %i WHERE id = %i", + std::string query = StringFormat("UPDATE npc_types SET npc_faction_id = %i WHERE id = %i", atoi(sep->argplus[1]), npcTypeID); database.QueryDatabase(query); } @@ -2302,7 +2302,7 @@ void command_setskill(Client *c, const Seperator *sep) Log.Out(Logs::General, Logs::Normal, "Set skill request from %s, target:%s skill_id:%i value:%i", c->GetName(), c->GetTarget()->GetName(), atoi(sep->arg[1]), atoi(sep->arg[2]) ); int skill_num = atoi(sep->arg[1]); uint16 skill_value = atoi(sep->arg[2]); - if(skill_num < HIGHEST_SKILL) + if(skill_num <= HIGHEST_SKILL) c->GetTarget()->CastToClient()->SetSkill((SkillUseTypes)skill_num, skill_value); } } @@ -2573,7 +2573,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message((item_data == nullptr), "WornSlot: %i, Item: %i (%s), Charges: %i", + c->Message((item_data == nullptr), "WornSlot: %i, Item: %i (%s), Charges: %i", indexMain, ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_main == nullptr) ? 0 : inst_main->GetCharges())); } @@ -2584,7 +2584,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message((item_data == nullptr), "WornSlot: %i, Item: %i (%s), Charges: %i", + c->Message((item_data == nullptr), "WornSlot: %i, Item: %i (%s), Charges: %i", MainPowerSource, ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_main == nullptr) ? 0 : inst_main->GetCharges())); } @@ -2596,7 +2596,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message((item_data == nullptr), "InvSlot: %i, Item: %i (%s), Charges: %i", + c->Message((item_data == nullptr), "InvSlot: %i, Item: %i (%s), Charges: %i", indexMain, ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_main == nullptr) ? 0 : inst_main->GetCharges())); for (uint8 indexSub = SUB_BEGIN; inst_main && inst_main->IsType(ItemClassContainer) && (indexSub < EmuConstants::ITEM_CONTAINER_SIZE); ++indexSub) { @@ -2606,7 +2606,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message((item_data == nullptr), " InvBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%s), Charges: %i", + c->Message((item_data == nullptr), " InvBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%s), Charges: %i", Inventory::CalcSlotId(indexMain, indexSub), indexMain, indexSub, ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_sub == nullptr) ? 0 : inst_sub->GetCharges())); } } @@ -2618,7 +2618,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message(1, "CursorSlot: %i, Item: %i (%s), Charges: %i", + c->Message(1, "CursorSlot: %i, Item: %i (%s), Charges: %i", MainCursor, 0, item_link.c_str(), 0); } else { @@ -2630,7 +2630,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message((item_data == nullptr), "CursorSlot: %i, Depth: %i, Item: %i (%s), Charges: %i", + c->Message((item_data == nullptr), "CursorSlot: %i, Depth: %i, Item: %i (%s), Charges: %i", MainCursor, cursorDepth, ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_main == nullptr) ? 0 : inst_main->GetCharges())); for (uint8 indexSub = SUB_BEGIN; (cursorDepth == 0) && inst_main && inst_main->IsType(ItemClassContainer) && (indexSub < EmuConstants::ITEM_CONTAINER_SIZE); ++indexSub) { @@ -2640,7 +2640,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message((item_data == nullptr), " CursorBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%s), Charges: %i", + c->Message((item_data == nullptr), " CursorBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%s), Charges: %i", Inventory::CalcSlotId(MainCursor, indexSub), MainCursor, indexSub, ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_sub == nullptr) ? 0 : inst_sub->GetCharges())); } } @@ -2655,7 +2655,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message((item_data == nullptr), "TributeSlot: %i, Item: %i (%s), Charges: %i", + c->Message((item_data == nullptr), "TributeSlot: %i, Item: %i (%s), Charges: %i", indexMain, ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_main == nullptr) ? 0 : inst_main->GetCharges())); } @@ -2667,7 +2667,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message((item_data == nullptr), "BankSlot: %i, Item: %i (%s), Charges: %i", + c->Message((item_data == nullptr), "BankSlot: %i, Item: %i (%s), Charges: %i", indexMain, ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_main == nullptr) ? 0 : inst_main->GetCharges())); for (uint8 indexSub = SUB_BEGIN; inst_main && inst_main->IsType(ItemClassContainer) && (indexSub < EmuConstants::ITEM_CONTAINER_SIZE); ++indexSub) { @@ -2677,7 +2677,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message((item_data == nullptr), " BankBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%s), Charges: %i", + c->Message((item_data == nullptr), " BankBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%s), Charges: %i", Inventory::CalcSlotId(indexMain, indexSub), indexMain, indexSub, ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_sub == nullptr) ? 0 : inst_sub->GetCharges())); } } @@ -2688,8 +2688,8 @@ void command_peekinv(Client *c, const Seperator *sep) linker.SetItemInst(inst_main); item_link = linker.GenerateLink(); - - c->Message((item_data == nullptr), "SharedBankSlot: %i, Item: %i (%s), Charges: %i", + + c->Message((item_data == nullptr), "SharedBankSlot: %i, Item: %i (%s), Charges: %i", indexMain, ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_main == nullptr) ? 0 : inst_main->GetCharges())); for (uint8 indexSub = SUB_BEGIN; inst_main && inst_main->IsType(ItemClassContainer) && (indexSub < EmuConstants::ITEM_CONTAINER_SIZE); ++indexSub) { @@ -2699,7 +2699,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message((item_data == nullptr), " SharedBankBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%s), Charges: %i", + c->Message((item_data == nullptr), " SharedBankBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%s), Charges: %i", Inventory::CalcSlotId(indexMain, indexSub), indexMain, indexSub, ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_sub == nullptr) ? 0 : inst_sub->GetCharges())); } } @@ -2712,7 +2712,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message((item_data == nullptr), "TradeSlot: %i, Item: %i (%s), Charges: %i", + c->Message((item_data == nullptr), "TradeSlot: %i, Item: %i (%s), Charges: %i", indexMain, ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_main == nullptr) ? 0 : inst_main->GetCharges())); for (uint8 indexSub = SUB_BEGIN; inst_main && inst_main->IsType(ItemClassContainer) && (indexSub < EmuConstants::ITEM_CONTAINER_SIZE); ++indexSub) { @@ -2722,7 +2722,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message((item_data == nullptr), " TradeBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%s), Charges: %i", + c->Message((item_data == nullptr), " TradeBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%s), Charges: %i", Inventory::CalcSlotId(indexMain, indexSub), indexMain, indexSub, ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_sub == nullptr) ? 0 : inst_sub->GetCharges())); } } @@ -2744,7 +2744,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message((item_data == nullptr), "WorldSlot: %i, Item: %i (%s), Charges: %i", + c->Message((item_data == nullptr), "WorldSlot: %i, Item: %i (%s), Charges: %i", (EmuConstants::WORLD_BEGIN + indexMain), ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_main == nullptr) ? 0 : inst_main->GetCharges())); for (uint8 indexSub = SUB_BEGIN; inst_main && inst_main->IsType(ItemClassContainer) && (indexSub < EmuConstants::ITEM_CONTAINER_SIZE); ++indexSub) { @@ -2754,7 +2754,7 @@ void command_peekinv(Client *c, const Seperator *sep) item_link = linker.GenerateLink(); - c->Message((item_data == nullptr), " WorldBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%s), Charges: %i", + c->Message((item_data == nullptr), " WorldBagSlot: %i (Slot #%i, Bag #%i), Item: %i (%s), Charges: %i", INVALID_INDEX, indexMain, indexSub, ((item_data == nullptr) ? 0 : item_data->ID), item_link.c_str(), ((inst_sub == nullptr) ? 0 : inst_sub->GetCharges())); } } @@ -3752,7 +3752,7 @@ void command_spellinfo(Client *c, const Seperator *sep) c->Message(0, " zonetype: %d", s->zonetype); c->Message(0, " EnvironmentType: %d", s->EnvironmentType); c->Message(0, " TimeOfDay: %d", s->TimeOfDay); - c->Message(0, " classes[15]: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d", + c->Message(0, " classes[15]: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d", s->classes[0], s->classes[1], s->classes[2], s->classes[3], s->classes[4], s->classes[5], s->classes[6], s->classes[7], s->classes[8], s->classes[9], s->classes[10], s->classes[11], s->classes[12], s->classes[13], s->classes[14]); @@ -3882,7 +3882,7 @@ void command_repop(Client *c, const Seperator *sep) LinkedListIterator iterator(zone->spawn2_list); iterator.Reset(); while (iterator.MoreElements()) { - std::string query = StringFormat("DELETE FROM respawn_times WHERE id = %lu AND instance_id = %lu", + std::string query = StringFormat("DELETE FROM respawn_times WHERE id = %lu AND instance_id = %lu", (unsigned long)iterator.GetData()->GetID(), (unsigned long)zone->GetInstanceID()); auto results = database.QueryDatabase(query); @@ -4256,7 +4256,7 @@ void command_spawnfix(Client *c, const Seperator *sep) { return; } - std::string query = StringFormat("UPDATE spawn2 SET x = '%f', y = '%f', z = '%f', heading = '%f' WHERE id = '%i'", + std::string query = StringFormat("UPDATE spawn2 SET x = '%f', y = '%f', z = '%f', heading = '%f' WHERE id = '%i'", c->GetX(), c->GetY(), c->GetZ(), c->GetHeading(),s2->GetID()); auto results = database.QueryDatabase(query); if (!results.Success()) { @@ -4399,11 +4399,11 @@ void command_time(Client *c, const Seperator *sep) c->Message(13, "To set the Time: #time HH [MM]"); TimeOfDay_Struct eqTime; zone->zone_time.GetCurrentEQTimeOfDay( time(0), &eqTime); - sprintf(timeMessage,"%02d:%s%d %s (Timezone: %ih %im)", + sprintf(timeMessage,"%02d:%s%d %s (Timezone: %ih %im)", ((eqTime.hour - 1) % 12) == 0 ? 12 : ((eqTime.hour - 1) % 12), - (eqTime.minute < 10) ? "0" : "", + (eqTime.minute < 10) ? "0" : "", eqTime.minute, - (eqTime.hour >= 13) ? "pm" : "am", + (eqTime.hour >= 13) ? "pm" : "am", zone->zone_time.getEQTimeZoneHr(), zone->zone_time.getEQTimeZoneMin() ); @@ -5734,7 +5734,7 @@ void command_suspend(Client *c, const Seperator *sep) } std::string query = StringFormat("UPDATE `account` SET `suspendeduntil` = DATE_ADD(NOW(), INTERVAL %i DAY), " - "suspend_reason = '%s' WHERE `id` = %i", + "suspend_reason = '%s' WHERE `id` = %i", duration, EscapeString(message).c_str(), accountID); auto results = database.QueryDatabase(query); @@ -6206,21 +6206,21 @@ void command_npcedit(Client *c, const Seperator *sep) database.QueryDatabase(query); return; } - + if (strcasecmp(sep->arg[1], "meleetype") == 0) { c->Message(15,"NPCID %u now has a primary melee type of %i and a secondary melee type of %i.", npcTypeID, atoi(sep->arg[2]), atoi(sep->arg[3])); std::string query = StringFormat("UPDATE npc_types SET prim_melee_type = %i, sec_melee_type = %i WHERE id = %i", atoi(sep->arg[2]), atoi(sep->arg[3]), npcTypeID); database.QueryDatabase(query); return; } - + if (strcasecmp(sep->arg[1], "rangedtype") == 0) { c->Message(15,"NPCID %u now has a ranged type of %i.", npcTypeID, atoi(sep->argplus[2])); std::string query = StringFormat("UPDATE npc_types SET rangedtype = %i WHERE id = %i", atoi(sep->argplus[2]), npcTypeID); database.QueryDatabase(query); return; } - + if (strcasecmp(sep->arg[1], "ammoidfile") == 0) { c->Message(15,"NPCID %u's ammo id file is now %i", npcTypeID, atoi(sep->argplus[2])); std::string query = StringFormat("UPDATE npc_types SET ammoidfile = %i WHERE id = %i", atoi(sep->argplus[2]), npcTypeID); @@ -6255,7 +6255,7 @@ void command_npcedit(Client *c, const Seperator *sep) database.QueryDatabase(query); return; } - + if (strcasecmp(sep->arg[1], "walkspeed") == 0) { c->Message(15,"NPCID %u now walks at %f", npcTypeID, atof(sep->argplus[2])); std::string query = StringFormat("UPDATE npc_types SET walkspeed = %f WHERE id = %i", atof(sep->argplus[2]), npcTypeID); @@ -6409,7 +6409,7 @@ void command_npcedit(Client *c, const Seperator *sep) database.QueryDatabase(query); return; } - + if (strcasecmp(sep->arg[1], "Avoidance") == 0) { c->Message(15,"NPCID %u now has %i Avoidance.", npcTypeID, atoi(sep->argplus[2])); std::string query = StringFormat("UPDATE npc_types SET avoidance = %i WHERE id = %i", atoi(sep->argplus[2]), npcTypeID); @@ -6465,7 +6465,7 @@ void command_npcedit(Client *c, const Seperator *sep) database.QueryDatabase(query); return; } - + if (strcasecmp(sep->arg[1], "Attackcount") == 0) { c->Message(15,"NPCID %u now has attack_count set to %i", npcTypeID,atoi(sep->arg[2])); std::string query = StringFormat("UPDATE npc_types SET attack_count = %i WHERE id = %i", atoi(sep->argplus[2]),npcTypeID); @@ -6502,7 +6502,7 @@ void command_npcedit(Client *c, const Seperator *sep) "luclin_hairstyle = %i, luclin_beard = %i, " "face = %i, drakkin_heritage = %i, " "drakkin_tattoo = %i, drakkin_details = %i " - "WHERE id = %i", + "WHERE id = %i", target->GetHairColor(), target->GetBeardColor(), target->GetHairStyle(), target->GetBeard(), target->GetLuclinFace(), target->GetDrakkinHeritage(), @@ -6588,7 +6588,7 @@ void command_npcedit(Client *c, const Seperator *sep) database.QueryDatabase(query); return; } - + if (strcasecmp(sep->arg[1], "slow_mitigation") == 0) { c->Message(15, "NPCID %u's slow mitigation limit is now %i.", npcTypeID, atoi(sep->arg[2])); std::string query = StringFormat("UPDATE npc_types SET slow_mitigation = %i WHERE id = %i", atoi(sep->argplus[2]), npcTypeID); @@ -6643,7 +6643,7 @@ void command_qglobal(Client *c, const Seperator *sep) { } if(!strcasecmp(sep->arg[1], "on")) { - std::string query = StringFormat("UPDATE npc_types SET qglobal = 1 WHERE id = '%i'", + std::string query = StringFormat("UPDATE npc_types SET qglobal = 1 WHERE id = '%i'", target->GetNPCTypeID()); auto results = database.QueryDatabase(query); if(!results.Success()) { @@ -6656,7 +6656,7 @@ void command_qglobal(Client *c, const Seperator *sep) { } if(!strcasecmp(sep->arg[1], "off")) { - std::string query = StringFormat("UPDATE npc_types SET qglobal = 0 WHERE id = '%i'", + std::string query = StringFormat("UPDATE npc_types SET qglobal = 0 WHERE id = '%i'", target->GetNPCTypeID()); auto results = database.QueryDatabase(query); if(!results.Success()) { @@ -7052,13 +7052,13 @@ void command_ginfo(Client *c, const Seperator *sep) if(g->membername[r][0] == '\0') continue; c->Message(0, "...Zoned Member: %s, Roles: %s %s %s", g->membername[r], - (g->MemberRoles[r] & RoleAssist) ? "Assist" : "", - (g->MemberRoles[r] & RoleTank) ? "Tank" : "", + (g->MemberRoles[r] & RoleAssist) ? "Assist" : "", + (g->MemberRoles[r] & RoleTank) ? "Tank" : "", (g->MemberRoles[r] & RolePuller) ? "Puller" : ""); } else { c->Message(0, "...In-Zone Member: %s (0x%x) Roles: %s %s %s", g->membername[r], g->members[r], - (g->MemberRoles[r] & RoleAssist) ? "Assist" : "", - (g->MemberRoles[r] & RoleTank) ? "Tank" : "", + (g->MemberRoles[r] & RoleAssist) ? "Assist" : "", + (g->MemberRoles[r] & RoleTank) ? "Tank" : "", (g->MemberRoles[r] & RolePuller) ? "Puller" : ""); } @@ -7221,7 +7221,7 @@ void command_flagedit(Client *c, const Seperator *sep) { flag_name[127] = '\0'; std::string query = StringFormat("UPDATE zone SET flag_needed = '%s' " - "WHERE zoneidnumber = %d AND version = %d", + "WHERE zoneidnumber = %d AND version = %d", flag_name, zoneid, zone->GetInstanceVersion()); auto results = database.QueryDatabase(query); if(!results.Success()) { @@ -7248,7 +7248,7 @@ void command_flagedit(Client *c, const Seperator *sep) { } std::string query = StringFormat("UPDATE zone SET flag_needed = '' " - "WHERE zoneidnumber = %d AND version = %d", + "WHERE zoneidnumber = %d AND version = %d", zoneid, zone->GetInstanceVersion()); auto results = database.QueryDatabase(query); if(!results.Success()) { @@ -7880,7 +7880,7 @@ void command_advnpcspawn(Client *c, const Seperator *sep) std::string query = StringFormat("INSERT INTO spawngroup " "(name, spawn_limit, dist, max_x, min_x, max_y, min_y, delay) " - "VALUES (\"%s\", %i, %f, %f, %f, %f, %f, %i)", + "VALUES (\"%s\", %i, %f, %f, %f, %f, %f, %i)", sep->arg[2], (sep->arg[3]? atoi(sep->arg[3]): 0), (sep->arg[4]? atof(sep->arg[4]): 0), @@ -7907,7 +7907,7 @@ void command_advnpcspawn(Client *c, const Seperator *sep) } std::string query = StringFormat("INSERT INTO spawnentry (spawngroupID, npcID, chance) " - "VALUES (%i, %i, %i)", + "VALUES (%i, %i, %i)", atoi(sep->arg[2]), atoi(sep->arg[3]), atoi(sep->arg[4])); auto results = database.QueryDatabase(query); if (!results.Success()) { @@ -7928,7 +7928,7 @@ void command_advnpcspawn(Client *c, const Seperator *sep) } std::string query = StringFormat("UPDATE spawngroup SET dist = '%f', max_x = '%f', min_x = '%f', " - "max_y = '%f', min_y = '%f', delay = '%i' WHERE id = '%i'", + "max_y = '%f', min_y = '%f', delay = '%i' WHERE id = '%i'", atof(sep->arg[3]), atof(sep->arg[4]), atof(sep->arg[5]), atof(sep->arg[6]), atof(sep->arg[7]), atoi(sep->arg[8]), atoi(sep->arg[2])); @@ -8013,7 +8013,7 @@ void command_advnpcspawn(Client *c, const Seperator *sep) } std::string query = StringFormat("UPDATE spawn2 SET x = '%f', y = '%f', z = '%f', heading = '%f' " - "WHERE id = '%i'", + "WHERE id = '%i'", c->GetX(), c->GetY(), c->GetZ(), c->GetHeading(),s2->GetID()); auto results = database.QueryDatabase(query); if (!results.Success()) { @@ -8084,7 +8084,7 @@ void command_advnpcspawn(Client *c, const Seperator *sep) int16 version = atoi(sep->arg[2]); std::string query = StringFormat("UPDATE spawn2 SET version = %i " - "WHERE spawngroupID = '%i'", + "WHERE spawngroupID = '%i'", version, c->GetTarget()->CastToNPC()->GetSp2()); auto results = database.QueryDatabase(query); if (!results.Success()) { @@ -10135,7 +10135,7 @@ void command_zopp(Client *c, const Seperator *sep) ItemInst* FakeItemInst = database.CreateItem(FakeItem, charges); c->SendItemPacket(slotid, FakeItemInst, packettype); - c->Message(0, "Sending zephyr op packet to client - [%s] %s (%u) with %i %s to slot %i.", + c->Message(0, "Sending zephyr op packet to client - [%s] %s (%u) with %i %s to slot %i.", packettype == ItemPacketTrade ? "Trade" : "Summon", FakeItem->Name, itemid, charges, std::abs(charges == 1) ? "charge" : "charges", slotid); safe_delete(FakeItemInst); @@ -10354,7 +10354,7 @@ void command_tune(Client *c, const Seperator *sep) ac_override = 0; if (!info_level) info_level = 1; - + if(!strcasecmp(sep->arg[2], "A")) c->Tune_FindATKByPctMitigation(defender, attacker, pct_mitigation, interval, max_loop,ac_override,info_level); else if(!strcasecmp(sep->arg[2], "B")) @@ -10389,7 +10389,7 @@ void command_tune(Client *c, const Seperator *sep) atk_override = 0; if (!info_level) info_level = 1; - + if(!strcasecmp(sep->arg[2], "A")) c->Tune_FindACByPctMitigation(defender, attacker, pct_mitigation, interval, max_loop,atk_override,info_level); else if(!strcasecmp(sep->arg[2], "B")) @@ -10431,7 +10431,7 @@ void command_tune(Client *c, const Seperator *sep) c->Message(10, "#Tune - Error hit chance out of bounds. [Max %.2f Min .2f]", RuleR(Combat,MaxChancetoHit),RuleR(Combat,MinChancetoHit)); return; } - + if(!strcasecmp(sep->arg[2], "A")) c->Tune_FindAccuaryByHitChance(defender, attacker, hit_chance, interval, max_loop,avoid_override,info_level); else if(!strcasecmp(sep->arg[2], "B")) @@ -10473,7 +10473,7 @@ void command_tune(Client *c, const Seperator *sep) c->Message(10, "#Tune - Error hit chance out of bounds. [Max %.2f Min .2f]", RuleR(Combat,MaxChancetoHit),RuleR(Combat,MinChancetoHit)); return; } - + if(!strcasecmp(sep->arg[2], "A")) c->Tune_FindAvoidanceByHitChance(defender, attacker, hit_chance, interval, max_loop,acc_override, info_level); else if(!strcasecmp(sep->arg[2], "B")) @@ -10499,7 +10499,7 @@ void command_logtest(Client *c, const Seperator *sep){ for (i = 0; i < atoi(sep->arg[1]); i++){ Log.Out(Logs::General, Logs::Debug, "[%u] Test #2... Took %f seconds", i, ((float)(std::clock() - t)) / CLOCKS_PER_SEC); } - + } } @@ -10555,7 +10555,7 @@ void command_logs(Client *c, const Seperator *sep){ c->Message(15, "Your Log Settings have been applied"); c->Message(15, "Output Method: %s :: Debug Level: %i - Category: %s", sep->arg[2], atoi(sep->arg[4]), Logs::LogCategoryName[atoi(sep->arg[3])]); } - /* We use a general 'is_category_enabled' now, let's update when we update any output settings + /* We use a general 'is_category_enabled' now, let's update when we update any output settings This is used in hot places of code to check if its enabled in any way before triggering logs */ if (sep->arg[4] > 0){ @@ -10583,9 +10583,9 @@ void command_mysqltest(Client *c, const Seperator *sep) for (i = 0; i < atoi(sep->arg[1]); i++){ std::string query = "SELECT * FROM `zone`"; auto results = database.QueryDatabase(query); - } + } } - Log.Out(Logs::General, Logs::Debug, "MySQL Test... Took %f seconds", ((float)(std::clock() - t)) / CLOCKS_PER_SEC); + Log.Out(Logs::General, Logs::Debug, "MySQL Test... Took %f seconds", ((float)(std::clock() - t)) / CLOCKS_PER_SEC); } void command_resetaa_timer(Client *c, const Seperator *sep) { @@ -10596,18 +10596,18 @@ void command_resetaa_timer(Client *c, const Seperator *sep) { target = c->GetTarget()->CastToClient(); } - if(sep->IsNumber(1)) + if(sep->IsNumber(1)) { int timer_id = atoi(sep->arg[1]); c->Message(0, "Reset of timer %i for %s", timer_id, c->GetName()); c->ResetAlternateAdvancementTimer(timer_id); } - else if(!strcasecmp(sep->arg[1], "all")) + else if(!strcasecmp(sep->arg[1], "all")) { c->Message(0, "Reset all timers for %s", c->GetName()); c->ResetAlternateAdvancementTimers(); - } - else + } + else { c->Message(0, "usage: #resetaa_timer [all | timer_id]"); } diff --git a/zone/mob.cpp b/zone/mob.cpp index ce0a97db9..938a9704b 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -2409,6 +2409,14 @@ bool Mob::CanThisClassDoubleAttack(void) const } } +bool Mob::CanThisClassTripleAttack() const +{ + if (!IsClient()) + return false; // When they added the real triple attack skill, mobs lost the ability to triple + else + return CastToClient()->HasSkill(SkillTripleAttack); +} + bool Mob::IsWarriorClass(void) const { switch(GetClass()) diff --git a/zone/mob.h b/zone/mob.h index 0094b0fbc..fcabf93fd 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -169,7 +169,7 @@ public: virtual bool CheckDualWield(); void DoMainHandAttackRounds(Mob *target, ExtraAttackOptions *opts = nullptr); void DoOffHandAttackRounds(Mob *target, ExtraAttackOptions *opts = nullptr); - virtual bool CheckDoubleAttack(bool tripleAttack = false); // mob version doesn't use this flag + virtual bool CheckDoubleAttack(); // inline process for places where we need to do them outside of the AI_Process void ProcessAttackRounds(Mob *target, ExtraAttackOptions *opts = nullptr) { @@ -750,6 +750,7 @@ public: virtual int GetMonkHandToHandDamage(void); bool CanThisClassDoubleAttack(void) const; + bool CanThisClassTripleAttack() const; bool CanThisClassDualWield(void) const; bool CanThisClassRiposte(void) const; bool CanThisClassDodge(void) const; diff --git a/zone/special_attacks.cpp b/zone/special_attacks.cpp index 1bcccf272..1a134d167 100644 --- a/zone/special_attacks.cpp +++ b/zone/special_attacks.cpp @@ -536,7 +536,7 @@ void Mob::TryBackstab(Mob *other, int ReuseTime) { RogueBackstab(other,false,ReuseTime); if (level > 54) { - if(IsClient() && CastToClient()->CheckDoubleAttack(false)) + if(IsClient() && CastToClient()->CheckDoubleAttack()) { if(other->GetHP() > 0) RogueBackstab(other,false,ReuseTime); @@ -558,7 +558,7 @@ void Mob::TryBackstab(Mob *other, int ReuseTime) { if (level > 54) { // Check for double attack with main hand assuming maxed DA Skill (MS) - if(IsClient() && CastToClient()->CheckDoubleAttack(false)) + if(IsClient() && CastToClient()->CheckDoubleAttack()) if(other->GetHP() > 0) RogueBackstab(other,true, ReuseTime); From 2ca5a4ade6ed13e36ec5cdc99ca7f52d3296dc47 Mon Sep 17 00:00:00 2001 From: Kinglykrab Date: Mon, 6 Jul 2015 15:44:02 -0400 Subject: [PATCH 83/90] Bot command changes. - #bot ai mez is now #bot mez - #bot bindme is now #bot bind - #bot runeme is now #bot rune - #bot augmentitem now has an alias of #bot ai - #bot giveitem now has an alias of #bot gi - Removed unused #bot groupmessages - Removed useless additional parameters (c->GetName()/sep->arg[2]) - Formatted loops and conditionals. --- zone/bot.cpp | 404 +++++++++++++++++++------------------------ zone/bot.h | 3 - zone/botspellsai.cpp | 6 +- 3 files changed, 182 insertions(+), 231 deletions(-) diff --git a/zone/bot.cpp b/zone/bot.cpp index 6e9a1f2fc..94b7d9e90 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -132,7 +132,6 @@ Bot::Bot(uint32 botID, uint32 botOwnerCharacterID, uint32 botSpellsID, double to SetHasBeenSummoned(false); LoadStance(); SetTaunting((GetClass() == WARRIOR || GetClass() == PALADIN || GetClass() == SHADOWKNIGHT) && (GetBotStance() == BotStanceAggressive)); - SetGroupMessagesOn(GetClass() == CLERIC || GetClass() == DRUID || GetClass() == SHAMAN || GetClass() == ENCHANTER); SetInHealRotation(false); SetHealRotationActive(false); SetHasHealedThisCycle(false); @@ -1857,7 +1856,7 @@ void Bot::SavePetItems(uint32* petItems, uint32 botPetSaveId) { if(!petItems || botPetSaveId == 0) return; - for (int itemIndex = 0;itemIndex < EmuConstants::EQUIPMENT_SIZE; itemIndex++) { + for (int itemIndex = 0; itemIndex < EmuConstants::EQUIPMENT_SIZE; itemIndex++) { if(petItems[itemIndex] == 0) continue; @@ -6859,7 +6858,7 @@ bool Bot::SpellEffect(Mob* caster, uint16 spell_id, float partial) { if(g) { EQApplicationPacket hp_app; CreateHPPacket(&hp_app); - for(int i=0; imembers[i] && g->members[i]->IsClient()) g->members[i]->CastToClient()->QueuePacket(&hp_app); } @@ -7188,7 +7187,7 @@ bool Bot::DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, uint16 if(IsGrouped() && (spellTarget->IsBot() || spellTarget->IsClient()) && RuleB(Bots, BotGroupBuffing)) { bool noGroupSpell = false; uint16 thespell = spell_id; - for(int i=0; i < AIspells.size(); i++) { + for(int i = 0; i < AIspells.size(); i++) { int j = BotGetSpells(i); int spelltype = BotGetSpellType(i); bool spellequal = (j == thespell); @@ -7213,7 +7212,7 @@ bool Bot::DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, uint16 if(!noGroupSpell) { Group *g = GetGroup(); if(g) { - for(int i = 0; i < MAX_GROUP_MEMBERS;i++) { + for(int i = 0; i < MAX_GROUP_MEMBERS; i++) { if(g->members[i]) { if((g->members[i]->GetClass() == NECROMANCER) && (IsEffectInSpell(thespell, SE_AbsorbMagicAtt) || IsEffectInSpell(thespell, SE_Rune))) { } @@ -8090,7 +8089,7 @@ void Bot::BotGroupOrderAttack(Group* group, Mob* target, Client* client) { if(group && target) { Mob* groupLeader = group->GetLeader(); if(groupLeader) { - for(int i=0; i < MAX_GROUP_MEMBERS; i++) { + for(int i = 0; i < MAX_GROUP_MEMBERS; i++) { if(group->members[i] && group->members[i]->IsBot()) { Bot* botGroupMember = group->members[i]->CastToBot(); if(botGroupMember->GetBotOwnerCharacterID() == client->CharacterID()) { @@ -8737,10 +8736,10 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(0, "#bot inventory remove [slotid] - remove the item at the given slot in the inventory of the targeted bot."); c->Message(0, "#bot update - you must type that command once you gain a level."); c->Message(0, "#bot summon - It will summon your targeted bot to you."); - c->Message(0, "#bot ai mez - If you're grouped with an Enchanter, he will mesmerize your target."); + c->Message(0, "#bot mez - If you're grouped with an Enchanter, he will mesmerize your target."); c->Message(0, "#bot picklock - You must have a targeted Rogue bot in your group and be right on the door."); c->Message(0, "#bot cure [poison|disease|curse|blindness] Cleric has most options"); - c->Message(0, "#bot bindme - You must have a Cleric in your group to get Bind Affinity cast on you."); + c->Message(0, "#bot bind - You must have a Cleric in your group to get Bind Affinity cast on you."); c->Message(0, "#bot track - look at mobs in the zone (Ranger has options)"); c->Message(0, "#bot target calm - attempts to pacify your target mob."); c->Message(0, "#bot evac - transports your group to safe location in the current zone (bots are lost)"); @@ -8751,7 +8750,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(0, "#bot invis - Bot invisiblity (must have proper class in group)"); c->Message(0, "#bot levitate - Bot levitation (must have proper class in group)"); c->Message(0, "#bot resist - Bot resist buffs (must have proper class in group)"); - c->Message(0, "#bot runeme - Enchanter bot casts Rune spell on you"); + c->Message(0, "#bot rune - Enchanter bot casts Rune spell on you"); c->Message(0, "#bot shrink - Shaman or Beastlord will shrink target"); c->Message(0, "#bot endureb - Bot enduring breath (must have proper class in group)"); c->Message(0, "#bot charm - (must have proper class in group)"); @@ -8760,8 +8759,8 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(0, "#bot gate - Druid or Wizard bot will cast gate."); c->Message(0, "#bot archery - Toggle Archery Skilled bots between using a Bow or using Melee weapons."); c->Message(0, "#bot setpet [earth|water|air|fire|monster] - Select the pet type you want your Magician bot to use."); - c->Message(0, "#bot giveitem - Gives your targeted bot the item you have on your cursor."); - c->Message(0, "#bot augmentitem - Allows you to augment items for other classes. (You MUST have the Augmentation Sealer window filled)"); + c->Message(0, "#bot [giveitem|gi] - Gives your targeted bot the item you have on your cursor."); + c->Message(0, "#bot [augmentitem|ai] - Allows you to augment items for other classes. (You MUST have the Augmentation Sealer window filled)"); c->Message(0, "#bot camp - Tells your bot to camp out of the game."); c->Message(0, "#bot group help - Displays the commands available to manage any bots in your group."); c->Message(0, "#bot botgroup help - Displays the commands available to manage bot ONLY groups."); @@ -8771,11 +8770,10 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(0, "#bot armorcolor - #bot help armorcolor for info"); c->Message(0, "#bot taunt [on|off] - Determines whether or not your targeted bot will taunt."); c->Message(0, "#bot stance [name] [stance (id)|list] - Sets/lists stance for named bot (Passive = 0, Balanced = 1, Efficient = 2, Reactive = 3, Aggressive = 4, Burn = 5, BurnAE = 6)"); - c->Message(0, "#bot groupmessages [on|off] [bot name|all] - Turns group messages on/off for named bot/all bots."); c->Message(0, "#bot defensive [bot name] - Causes Warrior, Shadow Knight, or Paladin bot to use their defensive discipline or buff."); - c->Message(0, "#bot healrotation help - Displays the commands available to manage BOT heal rotations."); - c->Message(0, "#bot pull [] [target] - Bot Pulling Target NPCs"); - c->Message(0, "#bot setinspectmessage - Copies your inspect message to a targeted bot that you own"); + c->Message(0, "#bot healrotation help - Displays the commands available to manage bot heal rotations."); + c->Message(0, "#bot pull [] [target] - Bot will attempt to pull your target NPC."); + c->Message(0, "#bot setinspectmessage - Copies your inspect message to a targeted bot that you own."); c->Message(0, "#bot bardoutofcombat [on|off] - Determines whether Bard bots use out of combat songs."); c->Message(0, "#bot showhelm [on|off] - Determines whether or not your targeted bot's helmet will show. (Requires a respawn to take effect)"); return; @@ -8797,10 +8795,10 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { haspuller = true; Mob *puller = g->members[i]; if (puller->CastToBot()->IsArcheryRange(target)) { - puller->CastToBot()->BotGroupSay(puller->CastToBot(), "Trying to Pull %s \n", target->GetCleanName()); + puller->CastToBot()->BotGroupSay(puller->CastToBot(), "Trying to pull %s.", target->GetCleanName()); puller->CastToBot()->BotRangedAttack(target); } else { - puller->CastToBot()->BotGroupSay(puller->CastToBot(), "Out of Range %s \n", target->GetCleanName()); + puller->CastToBot()->BotGroupSay(puller->CastToBot(), "%s is out of range.", target->GetCleanName()); } } } @@ -8880,7 +8878,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { return; } - if(!strcasecmp(sep->arg[1], "augmentitem")) { + if(!strcasecmp(sep->arg[1], "augmentitem") || !strcasecmp(sep->arg[1], "ai")) { AugmentItem_Struct* in_augment = new AugmentItem_Struct[sizeof(AugmentItem_Struct)]; in_augment->container_slot = 1000; // in_augment->augment_slot = -1; @@ -8888,15 +8886,14 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { return; } - if(!strcasecmp(sep->arg[1], "giveitem")) { + if(!strcasecmp(sep->arg[1], "giveitem") || !strcasecmp(sep->arg[1], "gi")) { if(c->GetTarget() && c->GetTarget()->IsBot() && (c->GetTarget()->CastToBot()->GetBotOwner() == c)) { Bot* targetedBot = c->GetTarget()->CastToBot(); if(targetedBot) targetedBot->FinishTrade(c, BotTradeClientNoDropNoTrade); } - else { + else c->Message(15, "You must target a bot you own to do this."); - } return; } @@ -8909,7 +8906,8 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { Bot* targetedBot = c->GetTarget()->CastToBot(); if(targetedBot) targetedBot->Camp(); - } else + } + else c->Message(15, "You must target a bot you own to do this."); } @@ -8918,16 +8916,16 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(!strcasecmp(sep->arg[1], "create")) { if(sep->arg[2][0] == '\0' || sep->arg[3][0] == '\0' || sep->arg[4][0] == '\0' || sep->arg[5][0] == '\0' || sep->arg[6][0] != '\0') { - c->Message(0, "Usage: #bot create [name] [class(id)] [race(id)] [gender (male/female)]"); + c->Message(0, "Usage: #bot create [name] [class(id)] [race(id)] [gender (male/female|0/1)]"); return; } else if(strcasecmp(sep->arg[3],"1") && strcasecmp(sep->arg[3],"2") && strcasecmp(sep->arg[3],"3") && strcasecmp(sep->arg[3],"4") && strcasecmp(sep->arg[3],"5") && strcasecmp(sep->arg[3],"6") && strcasecmp(sep->arg[3],"7") && strcasecmp(sep->arg[3],"8") && strcasecmp(sep->arg[3],"9") && strcasecmp(sep->arg[3],"10") && strcasecmp(sep->arg[3],"11") && strcasecmp(sep->arg[3],"12") && strcasecmp(sep->arg[3],"13") && strcasecmp(sep->arg[3],"14") && strcasecmp(sep->arg[3],"15") && strcasecmp(sep->arg[3],"16")) { - c->Message(0, "Usage: #bot create [name] [class(id)] [race(id)] [gender (male/female)]"); + c->Message(0, "Usage: #bot create [name] [class(id)] [race(id)] [gender (male/female|0/1)]"); return; } else if(strcasecmp(sep->arg[4],"1") && strcasecmp(sep->arg[4],"2") && strcasecmp(sep->arg[4],"3") && strcasecmp(sep->arg[4],"4") && strcasecmp(sep->arg[4],"5") && strcasecmp(sep->arg[4],"6") && strcasecmp(sep->arg[4],"7") && strcasecmp(sep->arg[4],"8") && strcasecmp(sep->arg[4],"9") && strcasecmp(sep->arg[4],"10") && strcasecmp(sep->arg[4],"11") && strcasecmp(sep->arg[4],"12") && strcasecmp(sep->arg[4],"330") && strcasecmp(sep->arg[4],"128") && strcasecmp(sep->arg[4],"130") && strcasecmp(sep->arg[4],"522")) { - c->Message(0, "Usage: #bot create [name] [class(1-16)] [race(1-12,128,130,330,522)] [gender (male/female)]"); + c->Message(0, "Usage: #bot create [name] [class(1-16)] [race(1-12,128,130,330,522)] [gender (male/female|0/1)]"); return; - } else if(strcasecmp(sep->arg[5],"male") && strcasecmp(sep->arg[5],"female")) { - c->Message(0, "Usage: #bot create [name] [class(1-16)] [race(1-12,128,130,330,522)] [gender (male/female)]"); + } else if(strcasecmp(sep->arg[5],"male") && strcasecmp(sep->arg[5],"0") && strcasecmp(sep->arg[5],"female") && strcasecmp(sep->arg[5],"1")) { + c->Message(0, "Usage: #bot create [name] [class(1-16)] [race(1-12,128,130,330,522)] [gender (male/female|0/1)]"); return; } @@ -8943,7 +8941,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } int gender = 0; - if(!strcasecmp(sep->arg[5], "female")) + if(!strcasecmp(sep->arg[5], "female") || !strcasecmp(sep->arg[5], "1")) gender = 1; if(!IsBotNameAvailable(sep->arg[2],&TempErrorMessage)) { @@ -8975,9 +8973,8 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { else c->Message(0, "%s saved as bot %u.", NewBot->GetCleanName(), NewBot->GetBotID()); } - else { - // TODO: Log error message here - } + else + Log.Out(Logs::General, Logs::Error, "Error in #bot create, cannot find NewBot"); return; } @@ -8992,23 +8989,18 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } if(!strcasecmp(sep->arg[1], "delete") ) { - if((c->GetTarget() == nullptr) || !c->GetTarget()->IsBot()) - { + if((c->GetTarget() == nullptr) || !c->GetTarget()->IsBot()) { c->Message(15, "You must target a bot!"); return; - } - else if(c->GetTarget()->CastToBot()->GetBotOwnerCharacterID() != c->CharacterID()) - { + } else if(c->GetTarget()->CastToBot()->GetBotOwnerCharacterID() != c->CharacterID()) { c->Message(15, "You can't delete a bot that you don't own."); return; } if(c->GetTarget()->IsBot()) { Bot* BotTargeted = c->GetTarget()->CastToBot(); - if(BotTargeted) { BotTargeted->DeleteBot(&TempErrorMessage); - if(!TempErrorMessage.empty()) { c->Message(13, "Database Error: %s", TempErrorMessage.c_str()); return; @@ -9028,7 +9020,6 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { listAll = false; std::list AvailableBots = GetBotList(c->CharacterID(), &TempErrorMessage); - if(!TempErrorMessage.empty()) { c->Message(13, "Database Error: %s", TempErrorMessage.c_str()); return; @@ -9041,9 +9032,9 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(0, "Name: %s -- Class: %s -- Level: %u -- Race: %s", TempAvailableBotsList->BotName, ClassIdToString(TempAvailableBotsList->BotClass).c_str(), TempAvailableBotsList->BotLevel, RaceIdToString(TempAvailableBotsList->BotRace).c_str()); } - } else { - c->Message(0, "You have no bots created. Use the #bot create command to create a bot."); } + else + c->Message(0, "You have no bots created. Use the #bot create command to create a bot."); } if(!strcasecmp(sep->arg[1], "mana")) { @@ -9076,9 +9067,9 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(0, "Name: %s -- Class: %s -- Mana: %3.1f%%", tempBot->GetCleanName(), ClassIdToString(tempBot->GetClass()).c_str(), tempBot->GetManaRatio()); } } - } else { - c->Message(0, "You have no spawned bots in this zone."); } + else + c->Message(0, "You have no spawned bots in this zone."); } return; } @@ -9092,7 +9083,6 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } uint32 botId = GetBotIDByBotName(std::string(sep->arg[2])); - if(GetBotOwnerCharacterID(botId, &TempErrorMessage) != c->CharacterID()) { c->Message(0, "You can't spawn a bot that you don't own."); return; @@ -9110,18 +9100,17 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(c->IsGrouped()) { Group *g = entity_list.GetGroupByClient(c); - for (int i=0; imembers[i] && !g->members[i]->qglobal && (g->members[i]->GetAppearance() != eaDead) && (g->members[i]->IsEngaged() || (g->members[i]->IsClient() && g->members[i]->CastToClient()->GetAggroCount()))) { c->Message(0, "You can't summon bots while you are engaged."); return; } - if(g && g->members[i] && g->members[i]->qglobal) { + + if(g && g->members[i] && g->members[i]->qglobal) return; - } } - } - else { + } else { if(c->GetAggroCount() > 0) { c->Message(0, "You can't spawn bots while you are engaged."); return; @@ -9129,7 +9118,6 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } Mob* TempBotMob = entity_list.GetMobByBotID(botId); - if(TempBotMob) { c->Message(0, "This bot is already in the zone."); return; @@ -9144,7 +9132,6 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(RuleB(Bots, BotQuest) && !c->GetGM()) { const int allowedBots = AllowedBotSpawns(c->CharacterID(), &TempErrorMessage); - if(!TempErrorMessage.empty()) { c->Message(13, "Database Error: %s", TempErrorMessage.c_str()); return; @@ -9177,7 +9164,6 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(TempBot) { TempBot->Spawn(c, &TempErrorMessage); - if(!TempErrorMessage.empty()) { c->Message(13, "Database Error: %s", TempErrorMessage.c_str()); safe_delete(TempBot); @@ -9185,9 +9171,9 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } TempBot->BotGroupSay(TempBot, "I am ready for battle."); - } else { - c->Message(0, "BotID: %i not found", atoi(sep->arg[2])); } + else + c->Message(0, "BotID: %i not found", atoi(sep->arg[2])); return; } @@ -9199,7 +9185,6 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } Bot* archerBot = c->GetTarget()->CastToBot(); - if(archerBot) { if(archerBot->IsBotArcher()) archerBot->SetBotArcher(false); @@ -9207,7 +9192,6 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { archerBot->SetBotArcher(true); archerBot->ChangeBotArcherWeapons(archerBot->IsBotArcher()); - if(archerBot->GetClass() == RANGER && archerBot->GetLevel() >= 61) archerBot->SetRangerAutoWeaponSelect(archerBot->IsBotArcher()); } @@ -9216,30 +9200,25 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } if(!strcasecmp(sep->arg[1], "picklock")) { - if((c->GetTarget() == nullptr) || (c->GetTarget() == c) || !c->GetTarget()->IsBot() || (c->GetTarget()->GetClass() != ROGUE)) { - c->Message(15, "You must target a rogue bot!"); - } - else { + if((c->GetTarget() == nullptr) || (c->GetTarget() == c) || !c->GetTarget()->IsBot() || (c->GetTarget()->GetClass() != ROGUE)) + c->Message(15, "You must target a Rogue bot!"); + else entity_list.BotPickLock(c->GetTarget()->CastToBot()); - } return; } if(!strcasecmp(sep->arg[1], "summon")) { if((c->GetTarget() == nullptr) || (c->GetTarget() == c) || !c->GetTarget()->IsBot() || c->GetTarget()->IsPet()) - { c->Message(15, "You must target a bot!"); - } - else if(c->GetTarget()->IsMob() && !c->GetTarget()->IsPet()) - { + else if(c->GetTarget()->IsMob() && !c->GetTarget()->IsPet()) { Mob *b = c->GetTarget(); if(b) { - if(!b->IsBot()){ + if(!b->IsBot()) c->Message(15, "You must target a bot!"); - } else if((b->CastToBot()->GetBotOwnerCharacterID() != c->CharacterID())) { + else if((b->CastToBot()->GetBotOwnerCharacterID() != c->CharacterID())) b->CastToBot()->BotGroupSay(b->CastToBot(), "You can only summon your own bots."); - } else { + else { b->SetTarget(c->CastToMob()); b->Warp(glm::vec3(c->GetPosition())); } @@ -9254,7 +9233,6 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(c->GetTarget()->IsBot() && c->GetTarget()->CastToBot()->GetBotOwnerCharacterID() == c->CharacterID()) { Mob* b = c->GetTarget(); int x = c->GetTarget()->CastToBot()->GetBotItemsCount(&TempErrorMessage); - if(!TempErrorMessage.empty()) { c->Message(13, "Database Error: %s", TempErrorMessage.c_str()); return; @@ -9273,9 +9251,8 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { linker.SetLinkType(linker.linkItemInst); for(int i = EmuConstants::EQUIPMENT_BEGIN; i <= (EmuConstants::EQUIPMENT_END + 1); ++i) { - if((i == MainSecondary) && is2Hweapon) { + if((i == MainSecondary) && is2Hweapon) continue; - } inst = b->CastToBot()->GetBotItem(i == 22 ? 9999 : i); if (inst) @@ -9287,37 +9264,35 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(13, "Database Error: %s", TempErrorMessage.c_str()); return; } + if(item == nullptr) { c->Message(15, "I need something for my %s (Item %i)", equipped[i], (i == 22 ? 9999 : i)); continue; } + if((i == MainPrimary) && ((item->ItemType == ItemType2HSlash) || (item->ItemType == ItemType2HBlunt) || (item->ItemType == ItemType2HPiercing))) { is2Hweapon = true; } linker.SetItemInst(inst); - item_link = linker.GenerateLink(); - c->Message(15, "Using %s in my %s (Item %i)", item_link.c_str(), equipped[i], (i == 22 ? 9999 : i)); } - } else { - c->Message(15, "You must group your bot first."); } - } else { - c->Message(15, "You must target a bot first."); + else + c->Message(15, "You must group your bot first."); } + else + c->Message(15, "You must target a bot first."); + return; } if(!strcasecmp(sep->arg[1], "inventory") && !strcasecmp(sep->arg[2], "remove")) { - if((c->GetTarget() == nullptr) || (sep->arg[3][0] == '\0') || !c->GetTarget()->IsBot()) - { + if((c->GetTarget() == nullptr) || (sep->arg[3][0] == '\0') || !c->GetTarget()->IsBot()) { c->Message(15, "Usage: #bot inventory remove [slotid] (You must have a bot targeted) "); return; - } - else if(c->GetTarget()->IsBot() && c->GetTarget()->CastToBot()->GetBotOwnerCharacterID() == c->CharacterID()) - { + } else if(c->GetTarget()->IsBot() && c->GetTarget()->CastToBot()->GetBotOwnerCharacterID() == c->CharacterID()) { if(c->GetTradeskillObject() || (c->trade->state == Trading)) return; @@ -9326,6 +9301,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(15, "A bot has 22 slots in its inventory, please choose a slot between 0 and 21 or 9999."); return; } + const char* equipped[EmuConstants::EQUIPMENT_SIZE + 1] = {"Charm", "Left Ear", "Head", "Face", "Right Ear", "Neck", "Shoulders", "Arms", "Back", "Left Wrist", "Right Wrist", "Range", "Hands", "Primary Hand", "Secondary Hand", "Left Finger", "Right Finger", "Chest", "Legs", "Feet", "Waist", "Ammo", "Powersource" }; @@ -9358,9 +9334,9 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(itm) { c->PushItemOnCursor(*itminst, true); Bot *gearbot = c->GetTarget()->CastToBot(); - if((slotId == MainRange)||(slotId == MainAmmo)||(slotId == MainPrimary)||(slotId == MainSecondary)) { + if((slotId == MainRange)||(slotId == MainAmmo)||(slotId == MainPrimary)||(slotId == MainSecondary)) gearbot->SetBotArcher(false); - } + gearbot->RemoveBotItemBySlot(slotId, &TempErrorMessage); if(!TempErrorMessage.empty()) { @@ -9452,7 +9428,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(c->IsGrouped()) { Group *g = entity_list.GetGroupByClient(c); - for (int i=0; imembers[i] && g->members[i]->IsEngaged()) { c->Message(15, "You can't update bots while you are engaged."); return; @@ -9465,21 +9441,20 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { bot->SetPetChooser(false); bot->CalcBotStats(); } else { - if(c->GetFeigned()) { + if(c->GetFeigned()) c->Message(15, "You cannot update bots while feigned."); - } else { - c->Message(15, "You must target your bot first"); - } + else + c->Message(15, "You must target your bot first."); } - } else { - c->Message(15, "You must target a bot first"); } + else + c->Message(15, "You must target a bot first."); return; } //Bind - if(!strcasecmp(sep->arg[1], "bindme")) { + if(!strcasecmp(sep->arg[1], "bind")) { Mob *binder = nullptr; bool hasbinder = false; if(c->IsGrouped()) { @@ -9505,7 +9480,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } // Rune - if(!strcasecmp(sep->arg[1], "runeme")) { + if(!strcasecmp(sep->arg[1], "rune")) { Mob *runeer = nullptr; bool hasruneer = false; if(c->IsGrouped()) { @@ -9524,9 +9499,9 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } if(hasruneer) { - if (c->GetLevel() <= 12) { + if (c->GetLevel() <= 12) runeer->CastToBot()->BotGroupSay(runeer->CastToBot(), "I need to be level 13 or higher for this..."); - } else if ((c->GetLevel() >= 13) && (c->GetLevel() <= 21)) { + else if ((c->GetLevel() >= 13) && (c->GetLevel() <= 21)) { runeer->CastToBot()->BotGroupSay(runeer->CastToBot(), "Casting Rune I..."); runeer->CastSpell(481, c->GetID(), 1, -1, -1); } else if ((c->GetLevel() >= 22) && (c->GetLevel() <= 32)) { @@ -9587,13 +9562,13 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { switch(TrackerClass) { case RANGER: if(!strcasecmp(sep->arg[2], "all")) { - Tracker->CastToBot()->BotGroupSay(Tracker->CastToBot(), "Tracking everything", c->GetName()); + Tracker->CastToBot()->BotGroupSay(Tracker->CastToBot(), "Tracking everything."); entity_list.ShowSpawnWindow(c, RangeR, false); } else if(!strcasecmp(sep->arg[2], "rare")) { - Tracker->CastToBot()->BotGroupSay(Tracker->CastToBot(), "Selective tracking", c->GetName()); + Tracker->CastToBot()->BotGroupSay(Tracker->CastToBot(), "Selective tracking."); entity_list.ShowSpawnWindow(c, RangeR, true); } else if(!strcasecmp(sep->arg[2], "near")) { - Tracker->CastToBot()->BotGroupSay(Tracker->CastToBot(), "Tracking mobs nearby", c->GetName()); + Tracker->CastToBot()->BotGroupSay(Tracker->CastToBot(), "Tracking mobs nearby."); entity_list.ShowSpawnWindow(c, RangeD, false); } else Tracker->CastToBot()->BotGroupSay(Tracker->CastToBot(), "Do you want to %s, %s, or %s?", Tracker->CastToBot()->CreateSayLink(c, "#bot track all", "track all").c_str(), Tracker->CastToBot()->CreateSayLink(c, "#bot track near", "track near").c_str(), Tracker->CastToBot()->CreateSayLink(c, "#bot track rare", "track rare").c_str()); @@ -9601,12 +9576,12 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { break; case BARD: if(TrackerClass != RANGER) - Tracker->CastToBot()->BotGroupSay(Tracker->CastToBot(), "Tracking up", c->GetName()); + Tracker->CastToBot()->BotGroupSay(Tracker->CastToBot(), "Tracking up."); entity_list.ShowSpawnWindow(c, RangeB, false); break; case DRUID: if(TrackerClass = BARD) - Tracker->CastToBot()->BotGroupSay(Tracker->CastToBot(), "Tracking up", c->GetName()); + Tracker->CastToBot()->BotGroupSay(Tracker->CastToBot(), "Tracking up."); entity_list.ShowSpawnWindow(c, RangeD, false); break; default: @@ -9664,7 +9639,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { || !strcasecmp(sep->arg[2], "blindness") && (c->GetLevel() <= 3) || !strcasecmp(sep->arg[2], "disease") && (c->GetLevel() <= 4) || !strcasecmp(sep->arg[2], "poison") && (c->GetLevel() <= 1)) { - Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I don't have the needed level yet", sep->arg[2]); + Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I am not the required level yet."); } else Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "Do you want to cure %s, %s, %s, or %s?", Curer->CastToBot()->CreateSayLink(c, "#bot cure poison", "poison").c_str(), Curer->CastToBot()->CreateSayLink(c, "#bot cure disease", "disease").c_str(), Curer->CastToBot()->CreateSayLink(c, "#bot cure curse", "curse").c_str(), Curer->CastToBot()->CreateSayLink(c, "#bot cure blindness", "blindness").c_str()); @@ -9677,14 +9652,14 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "Trying to cure us of %s.", sep->arg[2]); Curer->CastToBot()->Bot_Command_Cure(2, Curer->GetLevel()); } else if(!strcasecmp(sep->arg[2], "curse")) { - Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I don't have that spell", sep->arg[2]); + Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I don't have that spell."); } else if(!strcasecmp(sep->arg[2], "blindness") && (c->GetLevel() >= 7)) { Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "Trying to cure us of %s.", sep->arg[2]); Curer->CastToBot()->Bot_Command_Cure(4, Curer->GetLevel()); } else if (!strcasecmp(sep->arg[2], "blindness") && (c->GetLevel() <= 7) || !strcasecmp(sep->arg[2], "disease") && (c->GetLevel() <= 1) || !strcasecmp(sep->arg[2], "poison") && (c->GetLevel() <= 2)) { - Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I don't have the needed level yet", sep->arg[2]); + Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I am not the required level yet."); } else Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "Do you want to cure %s, %s, or %s?", Curer->CastToBot()->CreateSayLink(c, "#bot cure poison", "poison").c_str(), Curer->CastToBot()->CreateSayLink(c, "#bot cure disease", "disease").c_str(), Curer->CastToBot()->CreateSayLink(c, "#bot cure blindness", "blindness").c_str()); @@ -9697,12 +9672,12 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "Trying to cure us of %s.", sep->arg[2]); Curer->CastToBot()->Bot_Command_Cure(2, Curer->GetLevel()); } else if(!strcasecmp(sep->arg[2], "curse")) { // Fire level 1 - Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I don't have that spell", sep->arg[2]); + Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I don't have that spell."); } else if(!strcasecmp(sep->arg[2], "blindness") && (c->GetLevel() >= 13)) { - Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I don't have that spell", sep->arg[2]); + Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I don't have that spell."); } else if (!strcasecmp(sep->arg[2], "disease") && (c->GetLevel() <= 4) || !strcasecmp(sep->arg[2], "poison") && (c->GetLevel() <= 5)) { - Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I don't have the needed level yet", sep->arg[2]) ; + Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "I am not the required level yet."); } else Curer->CastToBot()->BotGroupSay(Curer->CastToBot(), "Do you want to cure %s or %s?", Curer->CastToBot()->CreateSayLink(c, "#bot cure poison", "poison").c_str(), Curer->CastToBot()->CreateSayLink(c, "#bot cure disease", "disease").c_str()); break; @@ -9714,7 +9689,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } //Mez - if(!strcasecmp(sep->arg[1], "ai") && !strcasecmp(sep->arg[2], "mez")) { + if(!strcasecmp(sep->arg[1], "mez")) { Mob *target = c->GetTarget(); if(target == nullptr || target == c || target->IsBot() || (target->IsPet() && target->GetOwner() && target->GetOwner()->IsBot())) { c->Message(15, "You must select a monster"); @@ -9932,7 +9907,8 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(0, "I have successfully pacified %s.", target->GetCleanName()); return; - } else + } + else c->Message(0, "I failed to pacify %s.", target->GetCleanName()); } // seperated cleric and chanter so chanter is primary @@ -9945,7 +9921,8 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(0, "I have successfully pacified %s.", target->GetCleanName()); return; - } else + } + else c->Message(0, "I failed to pacify %s.", target->GetCleanName()); } } @@ -9995,30 +9972,33 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { switch(CharmerClass) { case ENCHANTER: if (c->GetLevel() >= 11) { - Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "Trying to charm %s.", target->GetCleanName(), sep->arg[2]); - Charmer->CastToBot()->Bot_Command_CharmTarget (1,target); - } else if (c->GetLevel() <= 10){ - Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "I don't have the required level yet.", sep->arg[2]); - } else - Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "Mob level is too high or can't be charmed.", c->GetName()); + Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "Trying to charm %s.", target->GetCleanName()); + Charmer->CastToBot()->Bot_Command_CharmTarget(1, target); + } + else if (c->GetLevel() <= 10) + Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "I am not the required level yet."); + else + Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "Mob level is too high or can't be charmed."); break; case NECROMANCER: if ((c->GetLevel() >= 18) && (DBtype == 3)) { - Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "Trying to charm %s.", target->GetCleanName(), sep->arg[2]); - Charmer->CastToBot()->Bot_Command_CharmTarget (2,target); - } else if (c->GetLevel() <= 17){ - Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "I don't have the required level yet.", sep->arg[2]); - } else - Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "Mob is not undead.", c->GetName()); + Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "Trying to charm %s.", target->GetCleanName()); + Charmer->CastToBot()->Bot_Command_CharmTarget(2, target); + } + else if (c->GetLevel() <= 17) + Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "I am not the required level yet."); + else + Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "Mob is not undead."); break; case DRUID: if ((c->GetLevel() >= 13) && (DBtype == 21)) { - Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "Trying to charm %s.", target->GetCleanName(), sep->arg[2]); - Charmer->CastToBot()->Bot_Command_CharmTarget (3,target); - } else if (c->GetLevel() <= 12){ - Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "I don't have the required level yet.", sep->arg[2]); - } else - Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "Mob is not an animal.", c->GetName()); + Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "Trying to charm %s.", target->GetCleanName()); + Charmer->CastToBot()->Bot_Command_CharmTarget(3, target); + } + else if (c->GetLevel() <= 12) + Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "I am not the required level yet."); + else + Charmer->CastToBot()->BotGroupSay(Charmer->CastToBot(), "Mob is not an animal."); break; default: c->Message(15, "You must have an Enchanter, Necromancer, or Druid in your group."); @@ -10044,9 +10024,11 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->GetTarget()->CastToBot()->SetBotCharmer(true); c->GetTarget()->CastToBot()->BotGroupSay(c->GetTarget()->CastToBot(), "Available for Dire Charm command."); } - } else + } + else c->Message(15, "You must target your Enchanter, Necromancer, or Druid bot."); - } else + } + else c->Message(15, "You must target an Enchanter, Necromancer, or Druid bot."); return; @@ -10091,30 +10073,33 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { switch(DirerClass) { case ENCHANTER: if (c->GetLevel() >= 55) { - Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "Trying to dire charm %s.", target->GetCleanName(), sep->arg[2]); + Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "Trying to dire charm %s.", target->GetCleanName()); Direr->CastToBot()->Bot_Command_DireTarget (1,target); - } else if (c->GetLevel() <= 55){ - Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "I don't have the required level yet.", sep->arg[2]); - } else - Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "Mob level is too high or can't be charmed.", c->GetName()); + } + else if (c->GetLevel() <= 55) + Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "I am not the required level yet."); + else + Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "Mob level is too high or can't be charmed."); break; case NECROMANCER: if ((c->GetLevel() >= 55) && (DBtype == 3)) { - Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "Trying to dire charm %s.", target->GetCleanName(), sep->arg[2]); + Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "Trying to dire charm %s.", target->GetCleanName()); Direr->CastToBot()->Bot_Command_DireTarget (2,target); - } else if (c->GetLevel() <= 55){ - Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "I don't have the required level yet.", sep->arg[2]); - } else - Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "Mob is not undead.", c->GetName()); + } + else if (c->GetLevel() <= 55) + Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "I am not the required level yet."); + else + Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "Mob is not undead."); break; case DRUID: if ((c->GetLevel() >= 55) && (DBtype == 21)) { - Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "Trying to dire charm %s.", target->GetCleanName(), sep->arg[2]); + Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "Trying to dire charm %s.", target->GetCleanName()); Direr->CastToBot()->Bot_Command_DireTarget (3,target); - } else if (c->GetLevel() <= 55){ - Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "I don't have the required level yet.", sep->arg[2]); - } else - Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "Mob is not an animal.", c->GetName()); + } + else if (c->GetLevel() <= 55) + Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "I am not the required level yet."); + else + Direr->CastToBot()->BotGroupSay(Direr->CastToBot(), "Mob is not an animal."); break; default: c->Message(15, "You must have an Enchanter, Necromancer, or Druid in your group."); @@ -10145,8 +10130,9 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if((hasevac) && (c->GetLevel() >= 18)) { evac->CastToBot()->BotGroupSay(evac->CastToBot(), "Attempting to evacuate you, %s.", c->GetName()); evac->CastToClient()->CastSpell(2183, c->GetID(), 1, -1, -1); - } else if((hasevac) && (c->GetLevel() <= 17)) - evac->CastToBot()->BotGroupSay(evac->CastToBot(), "I'm not level 18 yet.", c->GetName()); + } + else if((hasevac) && (c->GetLevel() <= 17)) + evac->CastToBot()->BotGroupSay(evac->CastToBot(), "I'm not level 18 yet."); return; } @@ -10778,7 +10764,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { || !strcasecmp(sep->arg[2], "fire") && (c->GetLevel() <= 8) || !strcasecmp(sep->arg[2], "disease") && (c->GetLevel() <= 11) || !strcasecmp(sep->arg[2], "poison") && (c->GetLevel() <= 6)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "I don't have the required level yet."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "I am not the required level yet."); } else Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Do you want %s, %s, %s, %s, or %s?", Resister->CastToBot()->CreateSayLink(c, "#bot resist poison", "Resist Poison").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot resist disease", "Resist Disease").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis fire", "Resist Fire").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis cold", "Resist Cold").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis magic", "Resist Magic").c_str()); @@ -10804,7 +10790,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { || !strcasecmp(sep->arg[2], "fire") && (c->GetLevel() <= 5) || !strcasecmp(sep->arg[2], "disease") && (c->GetLevel() <= 8) || !strcasecmp(sep->arg[2], "poison") && (c->GetLevel() <= 20)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "I don't have the needed level yet."); + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "I am not the required level yet."); } else Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Do you want %s, %s, %s, %s, or %s?", Resister->CastToBot()->CreateSayLink(c, "#bot resist poison", "Resist Poison").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot resist disease", "Resist Disease").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis fire", "Resist Fire").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis cold", "Resist Cold").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis magic", "Resist Magic").c_str()); @@ -10829,7 +10815,7 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { || !strcasecmp(sep->arg[2], "cold") && (c->GetLevel() <= 9) || !strcasecmp(sep->arg[2], "disease") && (c->GetLevel() <= 19) || !strcasecmp(sep->arg[2], "poison") && (c->GetLevel() <= 19)) { - Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "I don't have the required level yet.") ; + Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "I am not the required level yet.") ; } else Resister->CastToBot()->BotGroupSay(Resister->CastToBot(), "Do you want %s, %s, %s, %s, or %s?", Resister->CastToBot()->CreateSayLink(c, "#bot resist poison", "Resist Poison").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot resist disease", "Resist Disease").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis fire", "Resist Fire").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis cold", "Resist Cold").c_str(), Resister->CastToBot()->CreateSayLink(c, "#bot invis magic", "Resist Magic").c_str()); break; @@ -11032,7 +11018,8 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { botGroupLeader->BotGroupSay(botGroupLeader, "I have disbanded my group, %s.", c->GetName()); else botGroupLeader->BotGroupSay(botGroupLeader, "I was not able to disband my group, %s.", c->GetName()); - } else + } + else botGroupLeader->BotGroupSay(botGroupLeader, "I can not disband my group, %s, because I am not the leader. %s is the leader of my group.", c->GetName(), g->GetLeaderName()); } else botGroupLeader->BotGroupSay(botGroupLeader, "I am not a group leader, %s.", c->GetName()); @@ -11060,7 +11047,8 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(g->IsLeader(botGroupLeader)) BotGroupSummon(g, c); } - } else if(c->HasGroup()) + } + else if(c->HasGroup()) BotGroupSummon(c->GetGroup(), c); return; @@ -11083,7 +11071,8 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(g->IsLeader(botGroupLeader)) BotGroupOrderFollow(g, c); } - } else if(c->HasGroup()) + } + else if(c->HasGroup()) BotGroupOrderFollow(c->GetGroup(), c); return; @@ -11106,13 +11095,14 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(g->IsLeader(botGroupLeader)) BotGroupOrderGuard(g, c); } - } else if(c->HasGroup()) + } + else if(c->HasGroup()) BotGroupOrderGuard(c->GetGroup(), c); return; } - if(!strcasecmp(sep->arg[1], "botgroup") && !strcasecmp(sep->arg[2], "attack") ) { + if(!strcasecmp(sep->arg[1], "botgroup") && !strcasecmp(sep->arg[2], "attack")) { Mob* targetMob = c->GetTarget(); Bot* botGroupLeader = 0; std::string botGroupLeaderName = std::string(sep->arg[3]); @@ -11131,13 +11121,17 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(g->IsLeader(botGroupLeader)) BotGroupOrderAttack(g, targetMob, c); } - } else if(c->HasGroup()) + } + else if(c->HasGroup()) BotGroupOrderAttack(c->GetGroup(), targetMob, c); - } else + } + else c->Message(13, "You must target a monster."); - } else + } + else c->Message(13, "You must target a monster."); - } else + } + else c->Message(13, "You must target a spawned bot group leader first."); } return; @@ -11153,7 +11147,8 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(!botGroupList.empty()) { for(std::list::iterator botGroupListItr = botGroupList.begin(); botGroupListItr != botGroupList.end(); ++botGroupListItr) c->Message(0, "Bot Group Name: %s -- Bot Group Leader: %s", botGroupListItr->BotGroupName.c_str(), botGroupListItr->BotGroupLeaderName.c_str()); - } else + } + else c->Message(0, "You have no bot groups created. Use the #bot botgroup save command to save bot groups."); return; @@ -11326,11 +11321,14 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(13, "Database Error: %s", TempErrorMessage.c_str()); else c->Message(0, "%s's bot group has been saved as %s.", groupLeader->GetName(), botGroupName.c_str()); - } else + } + else c->Message(0, "You must target a bot group leader only."); - } else + } + else c->Message(0, "You must target a bot that is in the same zone as you."); - } else + } + else c->Message(0, "The bot group name already exists. Please choose another name to save your bot group as."); } return; @@ -11413,11 +11411,14 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { c->Message(13, "%s save failed!", target->GetCleanName()); c->Message(0, "Feature changed."); - } else + } + else c->Message(0, "You must own the bot to make changes."); - } else + } + else c->Message(0, "Requires a value."); - } else + } + else c->Message(0, "A bot needs to be targeted."); return; } @@ -11457,13 +11458,15 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } targetedBot->SetTaunting(taunt); - } else + } + else c->Message(13, "You must select a bot with the taunt skill."); - } else { - c->Message(13, "You must target a spawned bot."); } + else + c->Message(13, "You must target a spawned bot."); } - } else + } + else c->Message(0, "Usage #bot taunt [on|off]"); return; @@ -11538,66 +11541,16 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { } } c->Message(0, "Stance for %s: %s.", tempBot->GetCleanName(), stanceName.c_str()); - } else + } + else c->Message(13, "You must name a valid bot."); - } else + } + else c->Message(0, "Usage #bot stance [name] [stance (id)] (Passive = 0, Balanced = 1, Efficient = 2, Reactive = 3, Aggressive = 4, Burn = 5, BurnAE = 6)"); return; } - if(!strcasecmp(sep->arg[1], "groupmessages")) { - bool groupMessages = false; - if(sep->arg[2] && sep->arg[3]){ - if(!strcasecmp(sep->arg[2], "on")) - groupMessages = true; - else if (!strcasecmp(sep->arg[2], "off")) - groupMessages = false; - else { - c->Message(0, "Usage #bot groupmessages [on|off] [bot name|all]"); - return; - } - - Bot* tempBot; - if(!strcasecmp(sep->arg[3], "all")) { - std::list spawnedBots = entity_list.GetBotsByBotOwnerCharacterID(c->CharacterID()); - if(!spawnedBots.empty()) { - for(std::list::iterator botsListItr = spawnedBots.begin(); botsListItr != spawnedBots.end(); ++botsListItr) { - Bot* tempBot = *botsListItr; - if(tempBot) { - tempBot->SetGroupMessagesOn(groupMessages); - } - } - } else - c->Message(0, "You have no spawned bots in this zone."); - - c->Message(0, "Group messages now %s for all bots.", groupMessages?"on":"off"); - } else { - std::string botName = std::string(sep->arg[3]); - if(!botName.empty()) - tempBot = entity_list.GetBotByBotName(botName); - else { - c->Message(13, "You must name a valid bot."); - return; - } - - if(tempBot) { - if (tempBot->GetBotOwner() != c) { - c->Message(13, "You must target a bot that you own."); - return; - } - tempBot->SetGroupMessagesOn(groupMessages); - c->Message(0, "Group messages now %s.", groupMessages?"on":"off"); - } else { - c->Message(13, "You must name a valid bot."); - } - } - } else - c->Message(0, "Usage #bot groupmessages [on|off] [bot name|all]"); - - return; - } - if(!strcasecmp(sep->arg[1], "defensive")) { Bot* tempBot; std::string botName = std::string(sep->arg[2]); @@ -11660,7 +11613,8 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(defensiveSpellID > 0) tempBot->UseDiscipline(defensiveSpellID, tempBot->GetID()); - } else + } + else c->Message(13, "You must name a valid bot."); return; @@ -12669,7 +12623,7 @@ uint8 Bot::GetNumberNeedingHealedInGroup(uint8 hpr, bool includePets) { if(this->HasGroup()) { g = this->GetGroup(); if(g) { - for( int i = 0; imembers[i] && !g->members[i]->qglobal) { if(g->members[i]->GetHPRatio() <= hpr) needHealed++; diff --git a/zone/bot.h b/zone/bot.h index 2c5e30644..9a2f2a308 100644 --- a/zone/bot.h +++ b/zone/bot.h @@ -450,7 +450,6 @@ public: int GetRawACNoShield(int &shield_ac); bool GetHasBeenSummoned() { return _hasBeenSummoned; } const glm::vec3 GetPreSummonLocation() const { return m_PreSummonLocation; } - bool GetGroupMessagesOn() { return _groupMessagesOn; } bool GetInHealRotation() { return _isInHealRotation; } bool GetHealRotationActive() { return (GetInHealRotation() && _isHealRotationActive); } bool GetHealRotationUseFastHeals() { return _healRotationUseFastHeals; } @@ -536,7 +535,6 @@ public: void SetDisciplineRecastTimer(int timer_index, int32 recast_delay); void SetHasBeenSummoned(bool s); void SetPreSummonLocation(const glm::vec3& location) { m_PreSummonLocation = location; } - void SetGroupMessagesOn(bool groupMessagesOn) { _groupMessagesOn = groupMessagesOn; } void SetInHealRotation( bool inRotation ) { _isInHealRotation = inRotation; } void SetHealRotationActive( bool isActive ) { _isHealRotationActive = isActive; } void SetHealRotationUseFastHeals( bool useFastHeals ) { _healRotationUseFastHeals = useFastHeals; } @@ -607,7 +605,6 @@ private: bool _hasBeenSummoned; glm::vec3 m_PreSummonLocation; uint8 _spellCastingChances[MaxStances][MaxSpellTypes]; - bool _groupMessagesOn; bool _isInHealRotation; bool _isHealRotationActive; bool _healRotationUseFastHeals; diff --git a/zone/botspellsai.cpp b/zone/botspellsai.cpp index fcbb052fe..cd8d28275 100644 --- a/zone/botspellsai.cpp +++ b/zone/botspellsai.cpp @@ -75,7 +75,7 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint16 iSpellTypes) { MakeAnyLenString(&gmsg, "Attempting to mez %s.", addMob->GetCleanName()); - if(gmsg && GetGroupMessagesOn()) + if(gmsg) BotGroupSay(this, gmsg); } } @@ -262,7 +262,7 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint16 iSpellTypes) { } } - if(gmsg && GetGroupMessagesOn()) + if(gmsg) BotGroupSay(this, gmsg); } } @@ -793,7 +793,7 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint16 iSpellTypes) { MakeAnyLenString(&gmsg, "Attempting to slow %s.", tar->GetCleanName()); - if(gmsg && GetGroupMessagesOn()) + if(gmsg) BotGroupSay(this, gmsg); } } From 3455d70ca2e505a266533f5fc51b6f21a5e52d12 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Tue, 7 Jul 2015 17:20:37 -0400 Subject: [PATCH 84/90] Make SPECATK_QUAD uncheesable Live seems to have w kinds of "quads" one is an innate DW but people found out you could cheese them so luclin+ you can't anymore so INNATE_DW you can give the NPC a 2h and they will stop quadding QUAD they will accept the 2h but still quad --- zone/attack.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/zone/attack.cpp b/zone/attack.cpp index 440e8c59a..868c5ff03 100644 --- a/zone/attack.cpp +++ b/zone/attack.cpp @@ -5027,7 +5027,8 @@ void NPC::SetAttackTimer() //special offhand stuff if (i == MainSecondary) { - if(!CanThisClassDualWield() || HasTwoHanderEquipped()) { + // SPECATK_QUAD is uncheesable + if(!CanThisClassDualWield() || (HasTwoHanderEquipped() && !GetSpecialAbility(SPECATK_QUAD))) { attack_dw_timer.Disable(); continue; } From 753f53be1bb9e92559aca1a39c64e442076c22f7 Mon Sep 17 00:00:00 2001 From: KimLS Date: Wed, 8 Jul 2015 17:10:33 -0700 Subject: [PATCH 85/90] Some small tweaks to reduce the amount of SendPosUpdates() are actually getting sent out on the wire. --- zone/mob.cpp | 14 +++++++++----- zone/waypoints.cpp | 28 +++++----------------------- 2 files changed, 14 insertions(+), 28 deletions(-) diff --git a/zone/mob.cpp b/zone/mob.cpp index 938a9704b..0b46c8b12 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -1395,19 +1395,23 @@ void Mob::SendPosUpdate(uint8 iSendToSelf) { MakeSpawnUpdate(spu); if (iSendToSelf == 2) { - if (this->IsClient()) - this->CastToClient()->FastQueuePacket(&app,false); + if (IsClient()) { + CastToClient()->FastQueuePacket(&app,false); + } } else { if(move_tic_count == RuleI(Zone, NPCPositonUpdateTicCount)) { - entity_list.QueueClients(this, app, (iSendToSelf==0), false); + entity_list.QueueClients(this, app, (iSendToSelf == 0), false); move_tic_count = 0; } - else + else if(move_tic_count % 2 == 0) { - entity_list.QueueCloseClients(this, app, (iSendToSelf==0), 800, nullptr, false); + entity_list.QueueCloseClients(this, app, (iSendToSelf == 0), 700, nullptr, false); + move_tic_count++; + } + else { move_tic_count++; } } diff --git a/zone/waypoints.cpp b/zone/waypoints.cpp index 5bf506184..65da797de 100644 --- a/zone/waypoints.cpp +++ b/zone/waypoints.cpp @@ -443,31 +443,10 @@ void NPC::NextGuardPosition() { } } -/* -// we need this for charmed NPCs -void Mob::SaveSpawnSpot() { - spawn_x = x_pos; - spawn_y = y_pos; - spawn_z = z_pos; - spawn_heading = heading; -}*/ - - - - -/*float Mob::CalculateDistanceToNextWaypoint() { - return CalculateDistance(cur_wp_x, cur_wp_y, cur_wp_z); -}*/ - float Mob::CalculateDistance(float x, float y, float z) { return (float)sqrtf( ((m_Position.x-x)*(m_Position.x-x)) + ((m_Position.y-y)*(m_Position.y-y)) + ((m_Position.z-z)*(m_Position.z-z)) ); } -/* -uint8 NPC::CalculateHeadingToNextWaypoint() { - return CalculateHeadingToTarget(cur_wp_x, cur_wp_y); -} -*/ float Mob::CalculateHeadingToTarget(float in_x, float in_y) { float angle; @@ -656,6 +635,11 @@ bool Mob::MakeNewPositionAndSendUpdate(float x, float y, float z, int speed, boo else { tar_vector/=16.0f; + float dur = Timer::SetCurrentTime() - pLastChange; + if(dur < 1.0f) { + dur = 1.0f; + } + tar_vector = (tar_vector * AImovement_duration) / 100.0f; float new_x = m_Position.x + m_TargetV.x*tar_vector; float new_y = m_Position.y + m_TargetV.y*tar_vector; @@ -717,8 +701,6 @@ bool Mob::MakeNewPositionAndSendUpdate(float x, float y, float z, int speed, boo } else { - // force an update now - move_tic_count = RuleI(Zone, NPCPositonUpdateTicCount); SendPosUpdate(); SetAppearance(eaStanding, false); } From a69fbb9e0b17b5cebc8b776b427967469f1bc944 Mon Sep 17 00:00:00 2001 From: KimLS Date: Wed, 8 Jul 2015 18:10:04 -0700 Subject: [PATCH 86/90] Set -> Get Timer --- zone/waypoints.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zone/waypoints.cpp b/zone/waypoints.cpp index 65da797de..e900c6838 100644 --- a/zone/waypoints.cpp +++ b/zone/waypoints.cpp @@ -635,7 +635,7 @@ bool Mob::MakeNewPositionAndSendUpdate(float x, float y, float z, int speed, boo else { tar_vector/=16.0f; - float dur = Timer::SetCurrentTime() - pLastChange; + float dur = Timer::GetCurrentTime() - pLastChange; if(dur < 1.0f) { dur = 1.0f; } From 3c1b499485c373cad422a5015fb99b0b440e8d7f Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Thu, 9 Jul 2015 02:37:43 -0400 Subject: [PATCH 87/90] Fix Expendable AAs Thanks to ASan --- zone/aa.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index d1dad4f40..71274de61 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1234,13 +1234,13 @@ void Mob::ExpendAlternateAdvancementCharge(uint32 aa_id) { iter.second.second -= 1; if(iter.second.second == 0) { - aa_ranks.erase(iter.first); if(IsClient()) { AA::Rank *r = ability->GetRankByPointsSpent(iter.second.first); if(r) { CastToClient()->GetEPP().expended_aa += r->cost; } } + aa_ranks.erase(iter.first); } if(IsClient()) { From 790927052754ec368729212de5893c857fa9fb04 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Thu, 9 Jul 2015 02:44:55 -0400 Subject: [PATCH 88/90] Make sure we actually have the AA they're trying to cast --- zone/aa.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/zone/aa.cpp b/zone/aa.cpp index 71274de61..307eb3ba8 100644 --- a/zone/aa.cpp +++ b/zone/aa.cpp @@ -1146,15 +1146,14 @@ void Client::ActivateAlternateAdvancementAbility(int rank_id, int target_id) { return; } - //if expendable make sure we have charges - if(ability->charges > 0) { - uint32 charges = 0; - GetAA(rank_id, &charges); + uint32 charges = 0; + // We don't have the AA + if (!GetAA(rank_id, &charges)) + return; - if(charges < 0) { - return; - } - } + //if expendable make sure we have charges + if(ability->charges > 0 && charges < 1) + return; //check cooldown if(!p_timers.Expired(&database, rank->spell_type + pTimerAAStart)) { From 8dd362a1014a47346bdacf71381b1fdc6711fb70 Mon Sep 17 00:00:00 2001 From: KimLS Date: Sat, 11 Jul 2015 13:28:09 -0700 Subject: [PATCH 89/90] Fix for launcher not actually sending static ports when set in the db --- common/servertalk.h | 1 + eqlaunch/eqlaunch.cpp | 2 - eqlaunch/worldserver.cpp | 3 +- eqlaunch/zone_launch.cpp | 15 ++++--- eqlaunch/zone_launch.h | 3 +- world/launcher_link.cpp | 51 ++++------------------- world/launcher_link.h | 1 + zone/net.cpp | 88 ++++++++++++++++++++++++++++------------ 8 files changed, 87 insertions(+), 77 deletions(-) diff --git a/common/servertalk.h b/common/servertalk.h index af39bfaa4..6693e86bc 100644 --- a/common/servertalk.h +++ b/common/servertalk.h @@ -760,6 +760,7 @@ typedef enum { struct LauncherZoneRequest { uint8 command; char short_name[33]; + uint16 port; }; struct LauncherZoneStatus { diff --git a/eqlaunch/eqlaunch.cpp b/eqlaunch/eqlaunch.cpp index 76c9b48d1..952b6198b 100644 --- a/eqlaunch/eqlaunch.cpp +++ b/eqlaunch/eqlaunch.cpp @@ -102,8 +102,6 @@ int main(int argc, char *argv[]) { Log.Out(Logs::Detail, Logs::Launcher, "Starting main loop..."); -// zones["test"] = new ZoneLaunch(&world, "./zone", "dynamic_1"); - ProcLauncher *launch = ProcLauncher::get(); RunLoops = true; while(RunLoops) { diff --git a/eqlaunch/worldserver.cpp b/eqlaunch/worldserver.cpp index a4b27a983..c1bc0fc42 100644 --- a/eqlaunch/worldserver.cpp +++ b/eqlaunch/worldserver.cpp @@ -86,14 +86,13 @@ void WorldServer::Process() { } const LauncherZoneRequest *lzr = (const LauncherZoneRequest *) pack->pBuffer; - switch(ZoneRequestCommands(lzr->command)) { case ZR_Start: { if(m_zones.find(lzr->short_name) != m_zones.end()) { Log.Out(Logs::Detail, Logs::Launcher, "World told us to start zone %s, but it is already running.", lzr->short_name); } else { Log.Out(Logs::Detail, Logs::Launcher, "World told us to start zone %s.", lzr->short_name); - ZoneLaunch *l = new ZoneLaunch(this, m_name, lzr->short_name, m_config); + ZoneLaunch *l = new ZoneLaunch(this, m_name, lzr->short_name, lzr->port, m_config); m_zones[lzr->short_name] = l; } break; diff --git a/eqlaunch/zone_launch.cpp b/eqlaunch/zone_launch.cpp index 8c1e62223..974cf5b3d 100644 --- a/eqlaunch/zone_launch.cpp +++ b/eqlaunch/zone_launch.cpp @@ -34,10 +34,11 @@ void ZoneLaunch::InitStartTimer() { } ZoneLaunch::ZoneLaunch(WorldServer *world, const char *launcher_name, -const char *zone_name, const EQEmuConfig *config) +const char *zone_name, uint16 port, const EQEmuConfig *config) : m_state(StateStartPending), m_world(world), m_zone(zone_name), + m_port(port), m_launcherName(launcher_name), m_config(config), m_timer(config->RestartWait), @@ -61,10 +62,14 @@ void ZoneLaunch::SendStatus() const { void ZoneLaunch::Start() { ProcLauncher::Spec *spec = new ProcLauncher::Spec(); spec->program = m_config->ZoneExe; -// if(m_zone.substr(0,7) == "dynamic") -// spec->args.push_back("."); -// else - spec->args.push_back(m_zone); + + if(m_port) { + std::string arg = m_zone + std::string(":") + std::to_string(m_port); + spec->args.push_back(arg); + } else { + spec->args.push_back(m_zone); + } + spec->args.push_back(m_launcherName); spec->handler = this; spec->logFile = m_config->LogPrefix + m_zone + m_config->LogSuffix; diff --git a/eqlaunch/zone_launch.h b/eqlaunch/zone_launch.h index 3dc0fd697..ac48be92c 100644 --- a/eqlaunch/zone_launch.h +++ b/eqlaunch/zone_launch.h @@ -28,7 +28,7 @@ class EQEmuConfig; class ZoneLaunch : protected ProcLauncher::EventHandler { public: ZoneLaunch(WorldServer *world, const char *launcher_name, - const char *zone_name, const EQEmuConfig *config); + const char *zone_name, uint16 port, const EQEmuConfig *config); virtual ~ZoneLaunch(); void Stop(bool graceful = true); @@ -63,6 +63,7 @@ protected: const std::string m_zone; const char *const m_launcherName; const EQEmuConfig *const m_config; + const uint16 m_port; Timer m_timer; ProcLauncher::ProcRef m_ref; diff --git a/world/launcher_link.cpp b/world/launcher_link.cpp index bd8bfdc4b..33adba6a8 100644 --- a/world/launcher_link.cpp +++ b/world/launcher_link.cpp @@ -60,7 +60,7 @@ bool LauncherLink::Process() { end = m_states.end(); for(; cur != end; ++cur) { if(!cur->second.up) { - StartZone(cur->first.c_str()); + StartZone(cur->first.c_str(), cur->second.port); } } m_bootTimer.Disable(); @@ -184,14 +184,6 @@ bool LauncherLink::Process() { bool LauncherLink::ContainsZone(const char *short_name) const { return(m_states.find(short_name) != m_states.end()); - - /* - * std::map::const_iterator cur, end; - cur = m_states.begin(); - end = m_states.end(); - for(; cur != end; cur++) { - if( - }*/ } void LauncherLink::BootZone(const char *short_name, uint16 port) { @@ -202,15 +194,20 @@ void LauncherLink::BootZone(const char *short_name, uint16 port) { Log.Out(Logs::Detail, Logs::World_Server, "%s: Loaded zone '%s' on port %d", m_name.c_str(), short_name, zs.port); m_states[short_name] = zs; - StartZone(short_name); + StartZone(short_name, port); } void LauncherLink::StartZone(const char *short_name) { + StartZone(short_name, 0); +} + +void LauncherLink::StartZone(const char *short_name, uint16 port) { auto pack = new ServerPacket(ServerOP_LauncherZoneRequest, sizeof(LauncherZoneRequest)); LauncherZoneRequest* s = (LauncherZoneRequest *) pack->pBuffer; strn0cpy(s->short_name, short_name, 32); s->command = ZR_Start; + s->port = port; SendPacket(pack); delete pack; @@ -222,6 +219,7 @@ void LauncherLink::RestartZone(const char *short_name) { strn0cpy(s->short_name, short_name, 32); s->command = ZR_Restart; + s->port = 0; SendPacket(pack); delete pack; @@ -233,6 +231,7 @@ void LauncherLink::StopZone(const char *short_name) { strn0cpy(s->short_name, short_name, 32); s->command = ZR_Stop; + s->port = 0; SendPacket(pack); delete pack; @@ -332,35 +331,3 @@ void LauncherLink::Shutdown() { SendPacket(pack); delete pack; } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/world/launcher_link.h b/world/launcher_link.h index d1d8b6d61..35cbbcfea 100644 --- a/world/launcher_link.h +++ b/world/launcher_link.h @@ -50,6 +50,7 @@ public: void Shutdown(); void BootZone(const char *short_name, uint16 port); void StartZone(const char *short_name); + void StartZone(const char *short_name, uint16 port); void RestartZone(const char *short_name); void StopZone(const char *short_name); void BootDynamics(uint8 new_total); diff --git a/zone/net.cpp b/zone/net.cpp index 1bca0571b..ccd371858 100644 --- a/zone/net.cpp +++ b/zone/net.cpp @@ -28,7 +28,6 @@ #include "../common/eq_packet_structs.h" #include "../common/mutex.h" #include "../common/version.h" - #include "../common/packet_dump_file.h" #include "../common/opcodemgr.h" #include "../common/guilds.h" @@ -57,17 +56,14 @@ #include "titles.h" #include "guild_mgr.h" #include "tasks.h" - #include "quest_parser_collection.h" #include "embparser.h" #include "lua_parser.h" - #include "questmgr.h" #include #include #include - #include #include #include @@ -116,28 +112,77 @@ int main(int argc, char** argv) { RegisterExecutablePlatform(ExePlatformZone); Log.LoadLogSettingsDefaults(); set_exception_handler(); - const char *zone_name; QServ = new QueryServ; - if(argc == 3) { + Log.Out(Logs::General, Logs::Zone_Server, "Loading server configuration.."); + if(!ZoneConfig::LoadConfig()) { + Log.Out(Logs::General, Logs::Error, "Loading server configuration failed."); + return 1; + } + const ZoneConfig *Config = ZoneConfig::get(); + + const char *zone_name; + uint32 instance_id = 0; + std::string z_name; + if(argc == 4) { + instance_id = atoi(argv[3]); worldserver.SetLauncherName(argv[2]); - worldserver.SetLaunchedName(argv[1]); - if(strncmp(argv[1], "dynamic_", 8) == 0) { - //dynamic zone with a launcher name correlation + auto zone_port = SplitString(argv[1], ':'); + + if(zone_port.size() > 0) { + z_name = zone_port[0]; + } + + if(zone_port.size() > 1) { + std::string p_name = zone_port[1]; + Config->SetZonePort(atoi(p_name.c_str())); + } + + worldserver.SetLaunchedName(z_name.c_str()); + if(strncmp(z_name.c_str(), "dynamic_", 8) == 0) { + zone_name = "."; + } + else { + zone_name = z_name.c_str(); + } + } else if(argc == 3) { + worldserver.SetLauncherName(argv[2]); + auto zone_port = SplitString(argv[1], ':'); + + if(zone_port.size() > 0) { + z_name = zone_port[0]; + } + + if(zone_port.size() > 1) { + std::string p_name = zone_port[1]; + Config->SetZonePort(atoi(p_name.c_str())); + } + + worldserver.SetLaunchedName(z_name.c_str()); + if(strncmp(z_name.c_str(), "dynamic_", 8) == 0) { zone_name = "."; } else { - zone_name = argv[1]; - worldserver.SetLaunchedName(zone_name); + zone_name = z_name.c_str(); } } else if (argc == 2) { worldserver.SetLauncherName("NONE"); - worldserver.SetLaunchedName(argv[1]); - if(strncmp(argv[1], "dynamic_", 8) == 0) { - //dynamic zone with a launcher name correlation + auto zone_port = SplitString(argv[1], ':'); + + if(zone_port.size() > 0) { + z_name = zone_port[0]; + } + + if(zone_port.size() > 1) { + std::string p_name = zone_port[1]; + Config->SetZonePort(atoi(p_name.c_str())); + } + + worldserver.SetLaunchedName(z_name.c_str()); + if(strncmp(z_name.c_str(), "dynamic_", 8) == 0) { zone_name = "."; - } else { - zone_name = argv[1]; - worldserver.SetLaunchedName(zone_name); + } + else { + zone_name = z_name.c_str(); } } else { zone_name = "."; @@ -145,13 +190,6 @@ int main(int argc, char** argv) { worldserver.SetLauncherName("NONE"); } - Log.Out(Logs::General, Logs::Zone_Server, "Loading server configuration.."); - if (!ZoneConfig::LoadConfig()) { - Log.Out(Logs::General, Logs::Error, "Loading server configuration failed."); - return 1; - } - const ZoneConfig *Config = ZoneConfig::get(); - worldserver.SetPassword(Config->SharedKey.c_str()); Log.Out(Logs::General, Logs::Zone_Server, "Connecting to MySQL..."); @@ -312,7 +350,7 @@ int main(int argc, char** argv) { #endif if (!strlen(zone_name) || !strcmp(zone_name,".")) { Log.Out(Logs::General, Logs::Zone_Server, "Entering sleep mode"); - } else if (!Zone::Bootup(database.GetZoneID(zone_name), 0, true)) { //todo: go above and fix this to allow cmd line instance + } else if (!Zone::Bootup(database.GetZoneID(zone_name), instance_id, true)) { Log.Out(Logs::General, Logs::Error, "Zone Bootup failed :: Zone::Bootup"); zone = 0; } From 3cd474e960ed4166b8c47e73472afb574207b6b8 Mon Sep 17 00:00:00 2001 From: "Michael Cook (mackal)" Date: Sun, 12 Jul 2015 23:37:43 -0400 Subject: [PATCH 90/90] Updated SpecialAbility lua constants --- zone/lua_mob.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/zone/lua_mob.cpp b/zone/lua_mob.cpp index 9662d1931..431f18ffe 100644 --- a/zone/lua_mob.cpp +++ b/zone/lua_mob.cpp @@ -2234,7 +2234,14 @@ luabind::scope lua_register_special_abilities() { luabind::value("destructible_object", static_cast(DESTRUCTIBLE_OBJECT)), luabind::value("no_harm_from_client", static_cast(NO_HARM_FROM_CLIENT)), luabind::value("always_flee", static_cast(ALWAYS_FLEE)), - luabind::value("flee_percent", static_cast(FLEE_PERCENT)) + luabind::value("flee_percent", static_cast(FLEE_PERCENT)), + luabind::value("allow_beneficial", static_cast(ALLOW_BENEFICIAL)), + luabind::value("disable_melee", static_cast(DISABLE_MELEE)), + luabind::value("npc_chase_distance", static_cast(NPC_CHASE_DISTANCE)), + luabind::value("allow_to_tank", static_cast(ALLOW_TO_TANK)), + luabind::value("ignore_root_aggro_rules", static_cast(IGNORE_ROOT_AGGRO_RULES)), + luabind::value("casting_resist_diff", static_cast(CASTING_RESIST_DIFF)), + luabind::value("counter_avoid_damage", static_cast(COUNTER_AVOID_DAMAGE)) ]; }