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:
parent
0e948b5f9a
commit
817b86d5e1
@ -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
|
||||
|
@ -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, },
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -905,6 +905,7 @@ public:
|
||||
struct {
|
||||
short stage;
|
||||
int8 prizeIdx;
|
||||
t_itemid bonusItemID;
|
||||
short prizeStage;
|
||||
bool claimPrize;
|
||||
t_tick tick;
|
||||
|
Loading…
x
Reference in New Issue
Block a user