Skip to content

Commit f616800

Browse files
dudantasvllsystems
authored andcommitted
improve: boosted boss selection (opentibiabr#3208)
1 parent d893cfb commit f616800

File tree

1 file changed

+51
-67
lines changed

1 file changed

+51
-67
lines changed

src/io/io_bosstiary.cpp

Lines changed: 51 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -20,46 +20,46 @@ IOBosstiary &IOBosstiary::getInstance() {
2020
}
2121

2222
void IOBosstiary::loadBoostedBoss() {
23-
Database &database = Database::getInstance();
24-
std::ostringstream query;
25-
query << "SELECT * FROM `boosted_boss`";
26-
DBResult_ptr result = database.storeQuery(query.str());
27-
if (!result) {
28-
g_logger().error("[{}] Failed to detect boosted boss database. (CODE 01)", __FUNCTION__);
29-
return;
30-
}
31-
32-
auto date = result->getNumber<uint16_t>("date");
23+
std::string query = R"SQL(
24+
SELECT `date`, `boostname`, `raceid`, `looktypeEx`, `looktype`,
25+
`lookfeet`, `looklegs`, `lookhead`, `lookbody`,
26+
`lookaddons`, `lookmount`
27+
FROM `boosted_boss`
28+
)SQL";
29+
30+
DBResult_ptr result = g_database().storeQuery(query);
3331
auto timeNow = getTimeNow();
3432
auto time = localtime(&timeNow);
3533
auto today = time->tm_mday;
3634

37-
auto bossMap = getBosstiaryMap();
35+
const auto &bossMap = getBosstiaryMap();
3836
if (bossMap.size() <= 1) {
3937
g_logger().error("[{}] It is not possible to create a boosted boss with only one registered boss. (CODE 02)", __FUNCTION__);
4038
return;
4139
}
4240

43-
std::string bossName;
44-
uint16_t bossId = 0;
45-
if (date == today) {
46-
bossName = result->getString("boostname");
47-
bossId = result->getNumber<uint16_t>("raceid");
48-
setBossBoostedName(bossName);
49-
setBossBoostedId(bossId);
50-
g_logger().info("Boosted boss: {}", bossName);
51-
return;
41+
if (!result) {
42+
g_logger().warn("[{}] No boosted boss found in g_database(). A new one will be selected.", __FUNCTION__);
43+
} else {
44+
auto date = result->getNumber<uint16_t>("date");
45+
if (date == today) {
46+
std::string bossName = result->getString("boostname");
47+
uint16_t bossId = result->getNumber<uint16_t>("raceid");
48+
setBossBoostedName(bossName);
49+
setBossBoostedId(bossId);
50+
g_logger().info("Boosted boss: {}", bossName);
51+
return;
52+
}
5253
}
5354

5455
// Filter only archfoe bosses
55-
std::map<uint16_t, std::string> bossInfo;
56-
for (auto [infoBossRaceId, infoBossName] : bossMap) {
57-
const auto mType = getMonsterTypeByBossRaceId(infoBossRaceId);
56+
std::vector<std::pair<uint16_t, std::string>> bossInfo;
57+
for (const auto &[infoBossRaceId, infoBossName] : bossMap) {
58+
const auto &mType = getMonsterTypeByBossRaceId(infoBossRaceId);
5859
if (!mType || mType->info.bosstiaryRace != BosstiaryRarity_t::RARITY_ARCHFOE) {
5960
continue;
6061
}
61-
62-
bossInfo.try_emplace(infoBossRaceId, infoBossName);
62+
bossInfo.emplace_back(infoBossRaceId, infoBossName);
6363
}
6464

6565
// Check if not have archfoe registered boss
@@ -68,55 +68,39 @@ void IOBosstiary::loadBoostedBoss() {
6868
return;
6969
}
7070

71-
auto oldBossRace = result->getNumber<uint16_t>("raceid");
72-
while (true) {
73-
uint32_t randomIndex = uniform_random(0, static_cast<int32_t>(bossInfo.size()));
74-
auto it = std::next(bossInfo.begin(), randomIndex);
75-
if (it == bossInfo.end()) {
76-
break;
77-
}
78-
79-
const auto &[randomBossId, randomBossName] = *it;
80-
if (randomBossId == oldBossRace) {
81-
continue;
82-
}
83-
84-
bossName = randomBossName;
85-
bossId = randomBossId;
86-
break;
71+
const auto &[randomBossId, randomBossName] = bossInfo[uniform_random(0, static_cast<int32_t>(bossInfo.size() - 1))];
72+
std::string bossName = randomBossName;
73+
uint16_t bossId = randomBossId;
74+
75+
query = fmt::format(
76+
"UPDATE `boosted_boss` SET `date` = '{}', `boostname` = {}, ",
77+
today, g_database().escapeString(bossName)
78+
);
79+
if (const auto &bossType = getMonsterTypeByBossRaceId(bossId); bossType) {
80+
query += fmt::format(
81+
"`looktypeEx` = {}, `looktype` = {}, `lookfeet` = {}, `looklegs` = {}, "
82+
"`lookhead` = {}, `lookbody` = {}, `lookaddons` = {}, `lookmount` = {}, ",
83+
bossType->info.outfit.lookTypeEx, bossType->info.outfit.lookType,
84+
bossType->info.outfit.lookFeet, bossType->info.outfit.lookLegs,
85+
bossType->info.outfit.lookHead, bossType->info.outfit.lookBody,
86+
bossType->info.outfit.lookAddons, bossType->info.outfit.lookMount
87+
);
8788
}
89+
query += fmt::format("`raceid` = {}", bossId);
8890

89-
query.str(std::string());
90-
query << "UPDATE `boosted_boss` SET ";
91-
query << "`date` = '" << today << "',";
92-
query << "`boostname` = " << database.escapeString(bossName) << ",";
93-
if (const auto bossType = getMonsterTypeByBossRaceId(bossId);
94-
bossType) {
95-
query << "`looktypeEx` = " << static_cast<int>(bossType->info.outfit.lookTypeEx) << ",";
96-
query << "`looktype` = " << static_cast<int>(bossType->info.outfit.lookType) << ",";
97-
query << "`lookfeet` = " << static_cast<int>(bossType->info.outfit.lookFeet) << ",";
98-
query << "`looklegs` = " << static_cast<int>(bossType->info.outfit.lookLegs) << ",";
99-
query << "`lookhead` = " << static_cast<int>(bossType->info.outfit.lookHead) << ",";
100-
query << "`lookbody` = " << static_cast<int>(bossType->info.outfit.lookBody) << ",";
101-
query << "`lookaddons` = " << static_cast<int>(bossType->info.outfit.lookAddons) << ",";
102-
query << "`lookmount` = " << static_cast<int>(bossType->info.outfit.lookMount) << ",";
103-
}
104-
query << "`raceid` = '" << bossId << "'";
105-
if (!database.executeQuery(query.str())) {
106-
g_logger().error("[{}] Failed to detect boosted boss database. (CODE 03)", __FUNCTION__);
91+
if (!g_database().executeQuery(query)) {
92+
g_logger().error("[{}] Failed to update boosted boss in g_database(). (CODE 03)", __FUNCTION__);
10793
return;
10894
}
10995

110-
query.str(std::string());
111-
query << "UPDATE `player_bosstiary` SET `bossIdSlotOne` = 0 WHERE `bossIdSlotOne` = " << bossId;
112-
if (!database.executeQuery(query.str())) {
113-
g_logger().error("[{}] Failed to reset players selected boss slot 1. (CODE 03)", __FUNCTION__);
96+
query = fmt::format("UPDATE `player_bosstiary` SET `bossIdSlotOne` = 0 WHERE `bossIdSlotOne` = {}", bossId);
97+
if (!g_database().executeQuery(query)) {
98+
g_logger().error("[{}] Failed to reset players' selected boss slot 1. (CODE 03)", __FUNCTION__);
11499
}
115100

116-
query.str(std::string());
117-
query << "UPDATE `player_bosstiary` SET `bossIdSlotTwo` = 0 WHERE `bossIdSlotTwo` = " << bossId;
118-
if (!database.executeQuery(query.str())) {
119-
g_logger().error("[{}] Failed to reset players selected boss slot 1. (CODE 03)", __FUNCTION__);
101+
query = fmt::format("UPDATE `player_bosstiary` SET `bossIdSlotTwo` = 0 WHERE `bossIdSlotTwo` = {}", bossId);
102+
if (!g_database().executeQuery(query)) {
103+
g_logger().error("[{}] Failed to reset players' selected boss slot 2. (CODE 03)", __FUNCTION__);
120104
}
121105

122106
setBossBoostedName(bossName);

0 commit comments

Comments
 (0)