浏览代码

Roulette: Bonus item reward (#7427)

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
Balfear 2 年之前
父节点
当前提交
817b86d5e1
共有 5 个文件被更改,包括 65 次插入5 次删除
  1. 4 0
      conf/battle/feature.conf
  2. 1 0
      src/map/battle.cpp
  3. 1 0
      src/map/battle.hpp
  4. 58 5
      src/map/clif.cpp
  5. 1 0
      src/map/pc.hpp

+ 4 - 0
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

+ 1 - 0
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,       },

+ 1 - 0
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;

+ 58 - 5
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 <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

+ 1 - 0
src/map/pc.hpp

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