Skip to content

Commit

Permalink
Cultist circle improvements (#973)
Browse files Browse the repository at this point in the history
Brings Cultist Cicle rewards closer to live behavior.

---------

Co-authored-by: Bob S <[email protected]>
Co-authored-by: Chomp <[email protected]>
  • Loading branch information
3 people authored Dec 6, 2024
1 parent d34eca3 commit d2b7baa
Show file tree
Hide file tree
Showing 6 changed files with 421 additions and 209 deletions.
110 changes: 56 additions & 54 deletions project/assets/configs/hideout.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,68 +16,70 @@
"min": 0.7,
"max": 1.4
},
"bonusChanceMultiplier": 0.25,
"bonusAmountMultiplier": 0.43,
"highValueThresholdRub": 70000,
"hideoutTaskRewardTimeSeconds": 21600,
"hideoutCraftSacrificeThresholdRub": 400000,
"craftTimeThreshholds": [
{
"min": 1,
"max": 25000,
"timeSeconds": 21600
"max": 350000,
"craftTimeSeconds": 43200
},
{
"min": 25001,
"min": 350001,
"max": 399999,
"craftTimeSeconds": 50400
},
{
"min": 400000,
"max": 99999999,
"timeSeconds": 43200
"craftTimeSeconds": 50400
}
],
"craftTimeOverride": 40,
"directRewards": {
"66572c82ad599021091c6118": { "rewardTpls": ["5c0e874186f7745dc7616606"], "craftTimeSeconds": 3960 },
"5aa2b986e5b5b00014028f4c": { "rewardTpls": ["62a091170b9d3c46de5b6cf2"], "craftTimeSeconds": 3960 },
"655c663a6689c676ce57af85": { "rewardTpls": ["5c0e655586f774045612eeb2"], "craftTimeSeconds": 3960 },
"655c652d60d0ac437100fed7": { "rewardTpls": ["590c657e86f77412b013051d"], "craftTimeSeconds": 3960 },
"655c67782a1356436041c9c5": {
"rewardTpls": ["59e3577886f774176a362503", "5ed5166ad380ab312177c100"],
"craftTimeSeconds": 3960
},
"655c673673a43e23e857aebd": {
"rewardTpls": ["572b7adb24597762ae139821", "56e335e4d2720b6c058b456d"],
"craftTimeSeconds": 3960
},
"655c66e40b2de553b618d4b8": {
"rewardTpls": ["5d40407c86f774318526545a", "5d40407c86f774318526545a", "5d40407c86f774318526545a"],
"craftTimeSeconds": 3960
},
"6582dbf0b8d7830efc45016f": { "rewardTpls": ["5d1b376e86f774252519444e"], "craftTimeSeconds": 3960 },
"66572be36a723f7f005a066e": { "rewardTpls": ["5b3b713c5acfc4330140bd8d"], "craftTimeSeconds": 3960 },
"655c669103999d3c810c025b": {
"rewardTpls": ["635267ab3c89e2112001f826", "5fc64ea372b0dd78d51159dc"],
"craftTimeSeconds": 3960
},
"66572cbdad599021091c611a": { "rewardTpls": ["60a7ad2a2198820d95707a2e"], "craftTimeSeconds": 3960 },
"5c0530ee86f774697952d952": { "rewardTpls": ["6389c8c5dbfd5e4b95197e6b"], "craftTimeSeconds": 43260 },
"66572b8d80b1cd4b6a67847f": {
"rewardTpls": ["5bc9b9ecd4351e3bac122519", "62a09dd4621468534a797ac7"],
"craftTimeSeconds": 3960
},
"5c093ca986f7740a1867ab12": { "rewardTpls": ["5732ee6a24597719ae0c0281"], "craftTimeSeconds": 3960 },
"665ee77ccf2d642e98220bca": { "rewardTpls": ["5857a8bc2459772bad15db29"], "craftTimeSeconds": 360 },
"59faff1d86f7746c51718c9c": {
"rewardTpls": [
"5c12620d86f7743f8b198b72",
"5c12620d86f7743f8b198b72",
"5e2aedd986f7746d404f3aa4",
"5e2aedd986f7746d404f3aa4"
],
"craftTimeSeconds": 43260
},
"655c663a6689c676ce57af85": { "rewardTpls": ["5c0e655586f774045612eeb2"], "craftTimeSeconds": 3960 },
"5aa2b986e5b5b00014028f4c": { "rewardTpls": ["62a091170b9d3c46de5b6cf2"], "craftTimeSeconds": 3960 },
"5c13cd2486f774072c757944": { "rewardTpls": ["62a0a098de7ac8199358053b"], "craftTimeSeconds": 3960 },
"5a0c27731526d80618476ac4": {
"rewardTpls": ["5d1b392c86f77425243e98fe", "5d1b392c86f77425243e98fe"],
"craftTimeSeconds": 3960
},
"5c0530ee86f774697952d952": { "rewardTpls": ["6389c8c5dbfd5e4b95197e6b"], "craftTimeSeconds": 39960 }
},
"craftTimeOverride": -1,
"directRewards": [
{"reward": ["5857a8bc2459772bad15db29"], "requiredItems": ["665ee77ccf2d642e98220bca"], "craftTimeSeconds": 360,
"repeatable": false },
{"reward": ["5c093ca986f7740a1867ab12"], "requiredItems": ["5732ee6a24597719ae0c0281"], "craftTimeSeconds": 3960,
"repeatable": false },
{"reward": ["655c669103999d3c810c025b"], "requiredItems": ["635267ab3c89e2112001f826"], "craftTimeSeconds": 3960,
"repeatable": false },
{"reward": ["5fc64ea372b0dd78d51159dc"], "requiredItems": ["635267ab3c89e2112001f826", "635267ab3c89e2112001f826",
"635267ab3c89e2112001f826", "635267ab3c89e2112001f826", "635267ab3c89e2112001f826"], "craftTimeSeconds": 3960,
"repeatable": false },
{"reward": ["5c0e874186f7745dc7616606", "5c0e842486f77443a74d2976"], "requiredItems": ["66572c82ad599021091c6118"],
"craftTimeSeconds": 3960, "repeatable": false },
{"reward": ["60a7ad3a0c5cb24b0134664a", "60a7ad2a2198820d95707a2e"], "requiredItems": ["66572cbdad599021091c611a"],
"craftTimeSeconds": 3960, "repeatable": false },
{"reward": ["5b3b713c5acfc4330140bd8d"], "requiredItems": ["66572be36a723f7f005a066e"], "craftTimeSeconds": 3960,
"repeatable": false },
{"reward": ["62a09dd4621468534a797ac7", "5bc9b9ecd4351e3bac122519"], "requiredItems": ["66572b8d80b1cd4b6a67847f"],
"craftTimeSeconds": 3960, "repeatable": false },
{"reward": ["5d40407c86f774318526545a", "5d40407c86f774318526545a", "5d40407c86f774318526545a"], "requiredItems": ["655c66e40b2de553b618d4b8"],
"craftTimeSeconds": 3960, "repeatable": false },
{"reward": ["572b7adb24597762ae139821", "56e335e4d2720b6c058b456d"], "requiredItems": ["655c673673a43e23e857aebd"],
"craftTimeSeconds": 3960, "repeatable": false },
{"reward": ["637b60c3b7afa97bfc3d7001", "59e3577886f774176a362503"], "requiredItems": ["655c67782a1356436041c9c5"],
"craftTimeSeconds": 3960, "repeatable": false },
{"reward": ["590c657e86f77412b013051d"], "requiredItems": ["655c652d60d0ac437100fed7"], "craftTimeSeconds": 3960,
"repeatable": false },
{"reward": ["5c0e655586f774045612eeb2"], "requiredItems": ["655c663a6689c676ce57af85"], "craftTimeSeconds": 3960,
"repeatable": false },
{"reward": ["5d1b376e86f774252519444e"], "requiredItems": ["6582dbf0b8d7830efc45016f"], "craftTimeSeconds": 3960,
"repeatable": true },
{"reward": ["62a091170b9d3c46de5b6cf2"], "requiredItems": ["5aa2b986e5b5b00014028f4c"], "craftTimeSeconds": 3960,
"repeatable": true },
{"reward": ["62a0a098de7ac8199358053b"], "requiredItems": ["5c13cd2486f774072c757944"], "craftTimeSeconds": 3960,
"repeatable": true },
{"reward": ["5d1b392c86f77425243e98fe", "5d1b392c86f77425243e98fe"], "requiredItems": ["5a0c27731526d80618476ac4"],
"craftTimeSeconds": 3960, "repeatable": true },
{"reward": ["5e2aedd986f7746d404f3aa4", "5e2aedd986f7746d404f3aa4", "5c12620d86f7743f8b198b72", "5c12620d86f7743f8b198b72"],
"requiredItems": ["59faff1d86f7746c51718c9c"], "craftTimeSeconds": 39960, "repeatable": true },
{"reward": ["6389c8c5dbfd5e4b95197e6b"], "requiredItems": ["5c0530ee86f774697952d952"], "craftTimeSeconds": 39960,
"repeatable": true }
],
"directRewardStackSize": {
"exampleParentId": { "min": 1000, "max": 50000 }
},
Expand Down
5 changes: 5 additions & 0 deletions project/src/controllers/GameController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,11 @@ export class GameController {
fullProfile.spt.migrations = {};
}

// Track one time use cultist rewards
if (typeof fullProfile.spt.cultistRewards === "undefined") {
fullProfile.spt.cultistRewards = new Map();
}

//3.9 migrations
if (fullProfile.spt.version.includes("3.9.") && !fullProfile.spt.migrations["39x"]) {
// Check every item has a valid mongoid
Expand Down
3 changes: 3 additions & 0 deletions project/src/generators/LocationLootGenerator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -847,6 +847,9 @@ export class LocationLootGenerator {
throw new Error(`Item for tpl ${chosenComposedKey} was not found in the spawn point`);
}
const itemTemplate = this.itemHelper.getItem(chosenTpl)[1];
if (!itemTemplate) {
this.logger.error(`Item tpl: ${chosenTpl} cannot be found in database`);
}

// Item array to return
const itemWithMods: IItem[] = [];
Expand Down
8 changes: 8 additions & 0 deletions project/src/models/eft/profile/ISptProfile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,14 @@ export interface ISpt {
freeRepeatableRefreshUsedCount?: Record<string, number>;
/** When was a profile migrated, value is timestamp */
migrations?: Record<string, number>;
/** Cultist circle rewards received that are one time use, key (md5) is a combination of sacrificed + reward items */
cultistRewards?: Map<string, IAcceptedCultistReward>;
}

export interface IAcceptedCultistReward {
timestamp: number;
sacrificeItems: string[];
rewardItems: string[];
}

export interface IModDetails {
Expand Down
21 changes: 17 additions & 4 deletions project/src/models/spt/config/IHideoutConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,21 @@ export interface ICultistCircleSettings {
maxRewardItemCount: number;
maxAttemptsToPickRewardsWithinBudget: number;
rewardPriceMultiplerMinMax: MinMax;
/** The odds that meeting the highest threshold gives you a bonus to crafting time */
bonusAmountMultiplier: number;
bonusChanceMultiplier: number;
/** What is considered a "high-value" item */
highValueThresholdRub: number;
/** Hideout/task reward crafts have a unique craft time */
hideoutTaskRewardTimeSeconds: number;
/** Rouble amount player needs to sacrifice to get chance of hideout/task rewards */
hideoutCraftSacrificeThresholdRub: number;
craftTimeThreshholds: ICraftTimeThreshhold[];
/** -1 means no override */
/** -1 means no override, value in seconds */
craftTimeOverride: number;
/** Specific reward pool when player sacrificed one specific item */
directRewards: Record<string, IDirectRewardSettings>;
/** Specific reward pool when player sacrifice specific item(s) */
directRewards: IDirectRewardSettings[];
/** Overrides for reward stack sizes, keyed by item tpl */
directRewardStackSize: Record<string, MinMax>;
/** Item tpls to exclude from the reward pool */
rewardItemBlacklist: string[];
Expand All @@ -38,6 +48,9 @@ export interface ICraftTimeThreshhold extends MinMax {
}

export interface IDirectRewardSettings {
rewardTpls: string[];
reward: string[];
requiredItems: string[];
craftTimeSeconds: number;
/** Is the reward a one time reward or can it be given multiple times */
repeatable: boolean;
}
Loading

0 comments on commit d2b7baa

Please sign in to comment.