Skip to content

Commit e29a931

Browse files
implement authentic taro and fm modfication
1 parent 67c6620 commit e29a931

3 files changed

Lines changed: 70 additions & 28 deletions

File tree

src/Items.cpp

Lines changed: 67 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -870,7 +870,68 @@ static void getMobDrop(sItemBase* reward, const std::vector<int>& weights, const
870870
reward->iID = crateIds[chosenIndex];
871871
}
872872

873-
static void giveSingleDrop(CNSocket *sock, Mob* mob, int mobDropId, const DropRoll& rolled) {
873+
static int getTaroDrop(Player* plr, int baseAmount, int groupSize) {
874+
double bonus = plr->hasBuff(ECSB_REWARD_CASH) ? (Nanos::getNanoBoost(plr) ? 1.23 : 1.2) : 1.0;
875+
double groupEffect = 1.0 / groupSize;
876+
int amount = baseAmount * bonus * groupEffect;
877+
return amount;
878+
}
879+
880+
static int getFMDrop(Player* plr, int baseAmount, int levelDiff, int groupSize) {
881+
double bonus = plr->hasBuff(ECSB_REWARD_BLOB) ? (Nanos::getNanoBoost(plr) ? 1.23 : 1.2) : 1.0;
882+
double boosterEffect = plr->hasHunterBoost() ? (plr->hasQuestBoost() && plr->hasRacerBoost() ? 1.75 : 1.5) : 1.0;
883+
884+
double levelEffect = 1.0;
885+
if (levelDiff >= 6) {
886+
// if player is 6 or more levels above mob, no FM is dropped
887+
levelEffect = 0.0;
888+
} else if (levelDiff <= -3) {
889+
// if player is 3 or more levels below mob, FM is 1.2x
890+
levelEffect = 1.2;
891+
} else {
892+
switch (levelDiff) {
893+
// if player is within 1 level of the mob, FM is untouched
894+
// otherwise, follow the table below
895+
case 5:
896+
levelEffect = 0.25;
897+
break;
898+
case 4:
899+
levelEffect = 0.5;
900+
break;
901+
case 3:
902+
levelEffect = 0.75;
903+
break;
904+
case 2:
905+
// this case is more lenient
906+
levelEffect = 0.899;
907+
break;
908+
case -2:
909+
levelEffect = 1.1;
910+
break;
911+
}
912+
}
913+
914+
double groupEffect = 1.0;
915+
switch (groupSize) {
916+
// if no group, FM is untouched
917+
// otherwise, follow the table below
918+
case 2:
919+
groupEffect = 0.875;
920+
break;
921+
case 3:
922+
groupEffect = 0.75;
923+
break;
924+
case 4:
925+
// this case is more lenient
926+
groupEffect = 0.688;
927+
break;
928+
}
929+
930+
int amount = baseAmount * bonus * boosterEffect * levelEffect * groupEffect;
931+
return amount;
932+
}
933+
934+
static void giveSingleDrop(CNSocket *sock, Mob* mob, int mobDropId, const DropRoll& rolled, int groupSize) {
874935
Player *plr = PlayerManager::getPlayer(sock);
875936

876937
const size_t resplen = sizeof(sP_FE2CL_REP_REWARD_ITEM) + sizeof(sItemReward);
@@ -922,30 +983,11 @@ static void giveSingleDrop(CNSocket *sock, Mob* mob, int mobDropId, const DropRo
922983
MiscDropType& miscDropType = Items::MiscDropTypes[drop.miscDropTypeId];
923984

924985
if (rolled.taros % miscDropChance.taroDropChanceTotal < miscDropChance.taroDropChance) {
925-
plr->money += miscDropType.taroAmount;
926-
// money nano boost
927-
if (plr->hasBuff(ECSB_REWARD_CASH)) {
928-
int boost = 0;
929-
if (Nanos::getNanoBoost(plr)) // for gumballs
930-
boost = 1;
931-
plr->money += miscDropType.taroAmount * (5 + boost) / 25;
932-
}
986+
plr->money += getTaroDrop(plr, miscDropType.taroAmount, groupSize);
933987
}
934988
if (rolled.fm % miscDropChance.fmDropChanceTotal < miscDropChance.fmDropChance) {
935-
// formula for scaling FM with player/mob level difference
936-
// TODO: adjust this better
937989
int levelDifference = plr->level - mob->level;
938-
int fm = miscDropType.fmAmount;
939-
if (levelDifference > 0)
940-
fm = levelDifference < 10 ? fm - (levelDifference * fm / 10) : 0;
941-
// scavenger nano boost
942-
if (plr->hasBuff(ECSB_REWARD_BLOB)) {
943-
int boost = 0;
944-
if (Nanos::getNanoBoost(plr)) // for gumballs
945-
boost = 1;
946-
fm += fm * (5 + boost) / 25;
947-
}
948-
990+
int fm = getFMDrop(plr, miscDropType.fmAmount, levelDifference, groupSize);
949991
Missions::updateFusionMatter(sock, fm);
950992
}
951993

@@ -989,7 +1031,7 @@ static void giveSingleDrop(CNSocket *sock, Mob* mob, int mobDropId, const DropRo
9891031
}
9901032
}
9911033

992-
void Items::giveMobDrop(CNSocket *sock, Mob* mob, const DropRoll& rolled, const DropRoll& eventRolled) {
1034+
void Items::giveMobDrop(CNSocket *sock, Mob* mob, const DropRoll& rolled, const DropRoll& eventRolled, int groupSize) {
9931035
// sanity check
9941036
if (Items::MobToDropMap.find(mob->type) == Items::MobToDropMap.end()) {
9951037
std::cout << "[WARN] Mob ID " << mob->type << " has no drops assigned" << std::endl;
@@ -998,7 +1040,7 @@ void Items::giveMobDrop(CNSocket *sock, Mob* mob, const DropRoll& rolled, const
9981040
// find mob drop id
9991041
int mobDropId = Items::MobToDropMap[mob->type];
10001042

1001-
giveSingleDrop(sock, mob, mobDropId, rolled);
1043+
giveSingleDrop(sock, mob, mobDropId, rolled, groupSize);
10021044

10031045
if (settings::EVENTMODE != 0) {
10041046
// sanity check
@@ -1009,7 +1051,7 @@ void Items::giveMobDrop(CNSocket *sock, Mob* mob, const DropRoll& rolled, const
10091051
// find mob drop id
10101052
int eventMobDropId = Items::EventToDropMap[settings::EVENTMODE];
10111053

1012-
giveSingleDrop(sock, mob, eventMobDropId, eventRolled);
1054+
giveSingleDrop(sock, mob, eventMobDropId, eventRolled, groupSize);
10131055
}
10141056
}
10151057

src/Items.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ namespace Items {
113113
void init();
114114

115115
// mob drops
116-
void giveMobDrop(CNSocket *sock, Mob *mob, const DropRoll& rolled, const DropRoll& eventRolled);
116+
void giveMobDrop(CNSocket *sock, Mob *mob, const DropRoll& rolled, const DropRoll& eventRolled, int groupSize);
117117

118118
int findFreeSlot(Player *plr);
119119
Item* getItemData(int32_t id, int32_t type);

src/MobAI.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -813,7 +813,7 @@ void MobAI::onDeath(CombatNPC* npc, EntityRef src) {
813813
if (plr->group == nullptr) {
814814
playerRefs.push_back(plr);
815815
Combat::genQItemRolls(playerRefs, qitemRolls);
816-
Items::giveMobDrop(src.sock, self, rolled, eventRolled);
816+
Items::giveMobDrop(src.sock, self, rolled, eventRolled, 1);
817817
Missions::mobKilled(src.sock, self->type, qitemRolls);
818818
}
819819
else {
@@ -829,7 +829,7 @@ void MobAI::onDeath(CombatNPC* npc, EntityRef src) {
829829
if (dist > 5000)
830830
continue;
831831

832-
Items::giveMobDrop(sockTo, self, rolled, eventRolled);
832+
Items::giveMobDrop(sockTo, self, rolled, eventRolled, players.size());
833833
Missions::mobKilled(sockTo, self->type, qitemRolls);
834834
}
835835
}

0 commit comments

Comments
 (0)