@@ -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
0 commit comments