Roulette: Bonus item reward (#7427)

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
This commit is contained in:
Balfear 2022-12-19 02:14:38 +03:00 committed by GitHub
parent 0e948b5f9a
commit 817b86d5e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 65 additions and 5 deletions

View File

@ -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

View File

@ -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, },

View File

@ -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;

View File

@ -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 <result>.B <serial>.L <stage>.B <price index>.B <additional item id>.W <gold>.L <silver>.L <bronze>.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

View File

@ -905,6 +905,7 @@ public:
struct {
short stage;
int8 prizeIdx;
t_itemid bonusItemID;
short prizeStage;
bool claimPrize;
t_tick tick;