Skip to content

Commit 49edd3c

Browse files
author
Heron
committed
Space rare loot system functioning. Pending testing.
1 parent d550f14 commit 49edd3c

4 files changed

Lines changed: 575 additions & 28 deletions

File tree

sku.0/sys.server/compiled/game/script/space/rare_loot/space_rare_loot.java

Lines changed: 53 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package script.space.rare_loot;
22

3+
import script.library.luck;
34
import script.library.static_item;
45
import script.library.space_flags;
56
import 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

Comments
 (0)