11package script .space .rare_loot ;
22
3+ import script .library .luck ;
34import script .library .static_item ;
45import script .library .space_flags ;
56import script .library .space_utils ;
@@ -16,6 +17,10 @@ public space_rare_loot()
1617 public static final String VAR_LAST_CHEST_AWARD_TIME = "loot.space_rare.lastChestAwardTime" ;
1718 public static final String VAR_CHEST_REWARD_QUALITY = "loot.space_rare.rewardQuality" ;
1819 public static final String VAR_CHEST_REWARD_TIER = "loot.space_rare.rewardTier" ;
20+ public static final String VAR_ITEM_IS_RARE_SPACE_LOOT = "loot.space_rare.item.isRareSpaceLoot" ;
21+ public static final String VAR_ITEM_REWARD_QUALITY = "loot.space_rare.item.rewardQuality" ;
22+ public static final String VAR_ITEM_REWARD_QUALITY_NAME = "loot.space_rare.item.rewardQualityName" ;
23+ public static final String VAR_ITEM_REWARD_TIER = "loot.space_rare.item.rewardTier" ;
1924 public static final String SPACE_RLS_TABLE_LOCATION = "datatables/space_loot/space_rls" ;
2025 public static final String REWARD_TABLE_BASE = SPACE_RLS_TABLE_LOCATION + "/rewards_tier_" ;
2126 public static final String REWARD_TABLE_SUFFIX = ".iff" ;
@@ -29,6 +34,7 @@ public space_rare_loot()
2934 public static final String SCRIPT_SPACE_RARE_LOOT_CHEST = "space.rare_loot.space_rare_loot_chest" ;
3035 public static final int MIN_REWARD_TIER = 1 ;
3136 public static final int MAX_REWARD_TIER = 5 ;
37+ public static final float LUCK_QUALITY_UPGRADE_MODIFIER = 0.10f ;
3238
3339 public static boolean checkAwardEligibility (obj_id playerShip , obj_id targetShip ) throws InterruptedException
3440 {
@@ -107,9 +113,15 @@ public static boolean checkAwardEligibility(obj_id playerShip, obj_id targetShip
107113 double rewardChanceTotal = adjustedRareChance + adjustedExceptionalChance + adjustedLegendaryChance ;
108114 double rewardRoll = rewardChanceTotal > 0.0d ? Math .random () * rewardChanceTotal : 0.0d ;
109115 int rewardQuality = determineRewardQuality (rewardRoll , adjustedRareChance , adjustedExceptionalChance , adjustedLegendaryChance );
116+ int originalRewardQuality = rewardQuality ;
117+ boolean luckyQualityUpgrade = luck .isLucky (player , LUCK_QUALITY_UPGRADE_MODIFIER );
118+ if (luckyQualityUpgrade )
119+ {
120+ rewardQuality = upgradeRewardQuality (rewardQuality );
121+ }
110122 String rewardQualityName = getRewardQualityName (rewardQuality );
111123 float rewardQualityModifier = getRewardQualityModifier (rewardQuality );
112- int rewardTier = getRewardTier (effectivePlayerTier , targetTier );
124+ int rewardTier = getRewardTier (targetTier );
113125 obj_id lootContainer = getLootContainer (playerShip , player );
114126 if (!isIdValid (lootContainer ))
115127 {
@@ -125,10 +137,23 @@ public static boolean checkAwardEligibility(obj_id playerShip, obj_id targetShip
125137 }
126138 setObjVar (player , VAR_LAST_CHEST_AWARD_TIME , getGameTime ());
127139 debug (player , "eligible, roll " + roll + " <= chance " + adjustedChance + " succeeded. Created " + rewardQualityName + " chest " + chest + "." );
128- CustomerServiceLog (LOG_CHANNEL , "Space rare loot award success. Player=" + player + " playerTier=" + playerTier + " effectivePlayerTier=" + effectivePlayerTier + " playerShip=" + playerShip + " targetShip=" + targetShip + " targetTier=" + targetTier + " lootContainer=" + lootContainer + " chest=" + chest + " rewardTier=" + rewardTier + " higherTierDelta=" + higherTierDelta + " chance=" + adjustedChance + " roll=" + roll + " rewardQuality=" + rewardQualityName + "(" + rewardQuality + ")" + " rewardQualityModifier=" + rewardQualityModifier + " rewardRoll=" + rewardRoll + " rewardChanceTotal=" + rewardChanceTotal + " baseRareChance=" + rareChance + " baseExceptionalChance=" + exceptionalChance + " baseLegendaryChance=" + legendaryChance + " adjustedRareChance=" + adjustedRareChance + " adjustedExceptionalChance=" + adjustedExceptionalChance + " adjustedLegendaryChance=" + adjustedLegendaryChance + " shiftedChance=" + shiftedChance );
140+ CustomerServiceLog (LOG_CHANNEL , "Space rare loot award success. Player=" + player + " playerTier=" + playerTier + " effectivePlayerTier=" + effectivePlayerTier + " playerShip=" + playerShip + " targetShip=" + targetShip + " targetTier=" + targetTier + " lootContainer=" + lootContainer + " chest=" + chest + " rewardTier=" + rewardTier + " higherTierDelta=" + higherTierDelta + " chance=" + adjustedChance + " roll=" + roll + " rewardQuality=" + rewardQualityName + "(" + rewardQuality + ")" + " originalRewardQuality=" + getRewardQualityName (originalRewardQuality ) + "(" + originalRewardQuality + ")" + " luckyQualityUpgrade=" + luckyQualityUpgrade + " rewardQualityModifier=" + rewardQualityModifier + " rewardRoll=" + rewardRoll + " rewardChanceTotal=" + rewardChanceTotal + " baseRareChance=" + rareChance + " baseExceptionalChance=" + exceptionalChance + " baseLegendaryChance=" + legendaryChance + " adjustedRareChance=" + adjustedRareChance + " adjustedExceptionalChance=" + adjustedExceptionalChance + " adjustedLegendaryChance=" + adjustedLegendaryChance + " shiftedChance=" + shiftedChance );
129141 return true ;
130142 }
131143
144+ public static int upgradeRewardQuality (int rewardQuality )
145+ {
146+ if (rewardQuality == space_rare_loot_config .QUALITY_RARE )
147+ {
148+ return space_rare_loot_config .QUALITY_EXCEPTIONAL ;
149+ }
150+ if (rewardQuality == space_rare_loot_config .QUALITY_EXCEPTIONAL )
151+ {
152+ return space_rare_loot_config .QUALITY_LEGENDARY ;
153+ }
154+ return rewardQuality ;
155+ }
156+
132157 public static int getEffectivePilotTier (int playerTier , int targetTier )
133158 {
134159 if (targetTier > 0 && targetTier < playerTier )
@@ -230,22 +255,39 @@ public static int getTargetTier(obj_id targetShip) throws InterruptedException
230255 return parseTier (difficulty );
231256 }
232257
233- public static int getRewardTier (int playerTier , int targetTier )
258+ public static int getRewardTier (int targetTier ) throws InterruptedException
234259 {
235- int rewardTier = playerTier ;
236- if (targetTier < rewardTier )
260+ int maxRewardTier = getClampedRewardTier (targetTier );
261+ if (maxRewardTier <= MIN_REWARD_TIER )
262+ {
263+ return MIN_REWARD_TIER ;
264+ }
265+ int totalWeight = 0 ;
266+ int overCapTierCount = targetTier - MAX_REWARD_TIER ;
267+ if (overCapTierCount < 0 )
237268 {
238- rewardTier = targetTier ;
269+ overCapTierCount = 0 ;
239270 }
240- if ( rewardTier < MIN_REWARD_TIER )
271+ for ( int rewardTier = MIN_REWARD_TIER ; rewardTier <= maxRewardTier ; rewardTier ++ )
241272 {
242- return MIN_REWARD_TIER ;
273+ totalWeight += getRewardTierWeight ( rewardTier , overCapTierCount ) ;
243274 }
244- if (rewardTier > MAX_REWARD_TIER )
275+ int roll = rand (1 , totalWeight );
276+ int currentWeight = 0 ;
277+ for (int rewardTier = MIN_REWARD_TIER ; rewardTier <= maxRewardTier ; rewardTier ++)
245278 {
246- return MAX_REWARD_TIER ;
279+ currentWeight += getRewardTierWeight (rewardTier , overCapTierCount );
280+ if (roll <= currentWeight )
281+ {
282+ return rewardTier ;
283+ }
247284 }
248- return rewardTier ;
285+ return maxRewardTier ;
286+ }
287+
288+ public static int getRewardTierWeight (int rewardTier , int overCapTierCount )
289+ {
290+ return rewardTier + (overCapTierCount * rewardTier * rewardTier );
249291 }
250292
251293 public static String getRewardTable (int rewardTier )
0 commit comments