diff --git a/conf/battle/feature.conf b/conf/battle/feature.conf index 6565a3f994..aaa8ad68a8 100644 --- a/conf/battle/feature.conf +++ b/conf/battle/feature.conf @@ -67,6 +67,10 @@ feature.bgqueue: on // Requires: 2014-10-22bRagexe or later feature.roulette: on +// Roulette bonus reward +// Multiply amount by 2 if the reward item ID is the same as bonus item ID +feature.roulette_bonus_reward: on + // Achievement (Note 1) // Requires: 2015-05-13aRagexe or later feature.achievement: on diff --git a/src/map/battle.cpp b/src/map/battle.cpp index b12d7b34e2..9629d1f42a 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -10174,6 +10174,7 @@ static const struct _battle_data { { "homunculus_evo_intimacy_reset", &battle_config.homunculus_evo_intimacy_reset, 1000, 0, INT_MAX, }, { "monster_loot_search_type", &battle_config.monster_loot_search_type, 1, 0, 1, }, { "feature.roulette", &battle_config.feature_roulette, 1, 0, 1, }, + { "feature.roulette_bonus_reward", &battle_config.feature_roulette_bonus_reward, 1, 0, 1, }, { "monster_hp_bars_info", &battle_config.monster_hp_bars_info, 1, 0, 1, }, { "min_body_style", &battle_config.min_body_style, 0, 0, SHRT_MAX, }, { "max_body_style", &battle_config.max_body_style, 1, 0, SHRT_MAX, }, diff --git a/src/map/battle.hpp b/src/map/battle.hpp index 33a1243866..18609f4da3 100644 --- a/src/map/battle.hpp +++ b/src/map/battle.hpp @@ -614,6 +614,7 @@ struct Battle_Config int homunculus_evo_intimacy_reset; int monster_loot_search_type; int feature_roulette; + int feature_roulette_bonus_reward; int monster_hp_bars_info; int min_body_style; int max_body_style; diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 6aaa0a42c6..6a0663f48f 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -20345,11 +20345,33 @@ void DumpUnknown(int fd,TBL_PC *sd,int cmd,int packet_len) /// Roulette System /// Author: Yommy +void roulette_generate_bonus( map_session_data& sd ){ + if( battle_config.feature_roulette_bonus_reward && sd.roulette.bonusItemID == 0 ){ + int next_stage = 0; + + if( sd.roulette_point.bronze > 0 ){ + next_stage = 0; + }else if( sd.roulette_point.silver > 9 ){ + next_stage = 2; + }else if( sd.roulette_point.gold > 9 ){ + next_stage = 4; + } + + // Get bonus item stage only from current stage or higher + int reward_stage = rnd_value( next_stage, MAX_ROULETTE_LEVEL - 1 ); + sd.roulette.bonusItemID = rd.nameid[reward_stage][rnd()%rd.items[reward_stage]]; + }else{ + sd.roulette.bonusItemID = 0; + } +} + /// Opens the roulette window /// 0A1A .B .L .B .B .W .L .L .L (ZC_ACK_OPEN_ROULETTE) void clif_roulette_open( map_session_data* sd ){ nullpo_retv( sd ); + roulette_generate_bonus( *sd ); + struct packet_roulette_open_ack p; p.PacketType = 0xa1a; @@ -20357,7 +20379,7 @@ void clif_roulette_open( map_session_data* sd ){ p.Serial = 0; // serial p.Step = (sd->roulette.claimPrize) ? sd->roulette.stage - 1 : 0; p.Idx = (sd->roulette.claimPrize) ? sd->roulette.prizeIdx : -1; - p.AdditionItemID = -1; //! TODO: Display bonus item + p.AdditionItemID = sd->roulette.bonusItemID; p.GoldPoint = sd->roulette_point.gold; p.SilverPoint = sd->roulette_point.silver; p.BronzePoint = sd->roulette_point.bronze; @@ -20444,7 +20466,7 @@ static void clif_roulette_recvitem_ack(map_session_data *sd, enum RECV_ROULETTE_ p.PacketType = roulettercvitemackType; p.Result = type; - p.AdditionItemID = 0; //! TODO: Additional item + p.AdditionItemID = sd->roulette.bonusItemID; clif_send( &p, sizeof( p ), &sd->bl, SELF ); #endif @@ -20458,6 +20480,7 @@ static void clif_roulette_recvitem_ack(map_session_data *sd, enum RECV_ROULETTE_ static uint8 clif_roulette_getitem(map_session_data *sd) { struct item it; uint8 res = 1; + unsigned short factor = 1; nullpo_retr(1, sd); @@ -20469,10 +20492,34 @@ static uint8 clif_roulette_getitem(map_session_data *sd) { it.nameid = rd.nameid[sd->roulette.prizeStage][sd->roulette.prizeIdx]; it.identify = 1; - if ((res = pc_additem(sd, &it, rd.qty[sd->roulette.prizeStage][sd->roulette.prizeIdx], LOG_TYPE_ROULETTE)) == 0) { + if( sd->roulette.bonusItemID != 0 ){ + if( sd->roulette.bonusItemID == it.nameid && battle_config.feature_roulette_bonus_reward && !( rd.flag[sd->roulette.prizeStage][sd->roulette.prizeIdx]&1 ) ){ + factor = 2; + // Reset the Bonus Item to trigger new calculation + sd->roulette.bonusItemID = 0; + }else{ + for( int i = 0; i < MAX_ROULETTE_LEVEL && sd->roulette.bonusItemID != 0; i++ ){ + for( int j = 0; j < MAX_ROULETTE_COLUMNS - i && sd->roulette.bonusItemID != 0; j++ ){ + if( rd.nameid[i][j] == sd->roulette.bonusItemID ){ + // If you reached a equal or higher level than the first level with the bonus item in it, you missed your chance and a new bonus item will be calculated + if( sd->roulette.prizeStage >= i ){ + // Reset the Bonus Item to trigger new calculation and to cancel the loops + sd->roulette.bonusItemID = 0; + } + } + } + } + } + } + + if ((res = pc_additem(sd, &it, rd.qty[sd->roulette.prizeStage][sd->roulette.prizeIdx] * factor, LOG_TYPE_ROULETTE)) == 0) { ; // onSuccess } + if( sd->roulette.bonusItemID == 0 ){ + roulette_generate_bonus( *sd ); + } + sd->roulette.claimPrize = false; sd->roulette.prizeStage = 0; sd->roulette.prizeIdx = -1; @@ -20491,7 +20538,7 @@ void clif_roulette_generate( map_session_data *sd, unsigned char result, short s p.Result = result; p.Step = stage; p.Idx = prizeIdx; - p.AdditionItemID = bonusItemID; + p.AdditionItemID = battle_config.feature_roulette_bonus_reward ? bonusItemID : 0; p.RemainGold = sd->roulette_point.gold; p.RemainSilver = sd->roulette_point.silver; p.RemainBronze = sd->roulette_point.bronze; @@ -20515,7 +20562,13 @@ void clif_parse_roulette_generate( int fd, map_session_data* sd ){ return; } + // Player has not claimed his prize yet + if( sd->roulette.claimPrize ){ + clif_roulette_getitem( sd ); + } + if (sd->roulette.stage >= MAX_ROULETTE_LEVEL){ + // Make sure everything is reset sd->roulette.stage = 0; sd->roulette.claimPrize = false; sd->roulette.prizeStage = 0; @@ -20554,7 +20607,7 @@ void clif_parse_roulette_generate( int fd, map_session_data* sd ){ } } - clif_roulette_generate(sd,result,sd->roulette.prizeStage,(sd->roulette.prizeIdx == -1 ? 0 : sd->roulette.prizeIdx),0); + clif_roulette_generate(sd,result,sd->roulette.prizeStage,(sd->roulette.prizeIdx == -1 ? 0 : sd->roulette.prizeIdx), sd->roulette.bonusItemID); } /// Request to claim a prize diff --git a/src/map/pc.hpp b/src/map/pc.hpp index c62b5dc0ad..72a68b242b 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -905,6 +905,7 @@ public: struct { short stage; int8 prizeIdx; + t_itemid bonusItemID; short prizeStage; bool claimPrize; t_tick tick;