farming-weight 0.2.13 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/classes/farmingaccessory.d.ts +15 -0
- package/dist/classes/farmingaccessory.js +42 -0
- package/dist/classes/farmingaccessory.js.map +1 -0
- package/dist/classes/farmingarmor.d.ts +6 -5
- package/dist/classes/farmingarmor.js +38 -36
- package/dist/classes/farmingarmor.js.map +1 -1
- package/dist/classes/farmingpet.d.ts +18 -3
- package/dist/classes/farmingpet.js +75 -9
- package/dist/classes/farmingpet.js.map +1 -1
- package/dist/classes/farmingtool.d.ts +13 -9
- package/dist/classes/farmingtool.js +51 -35
- package/dist/classes/farmingtool.js.map +1 -1
- package/dist/classes/item.d.ts +1 -1
- package/dist/classes/item.js +1 -2
- package/dist/classes/lotusgear.d.ts +5 -5
- package/dist/classes/lotusgear.js +19 -21
- package/dist/classes/lotusgear.js.map +1 -1
- package/dist/classes/player.d.ts +33 -9
- package/dist/classes/player.js +140 -28
- package/dist/classes/player.js.map +1 -1
- package/dist/classes/weightcalc.d.ts +1 -1
- package/dist/classes/weightcalc.js +27 -31
- package/dist/classes/weightcalc.js.map +1 -1
- package/dist/constants/accessories.d.ts +14 -0
- package/dist/constants/accessories.js +36 -0
- package/dist/constants/accessories.js.map +1 -0
- package/dist/constants/armor.js +125 -128
- package/dist/constants/armor.js.map +1 -1
- package/dist/constants/crops.d.ts +2 -0
- package/dist/constants/crops.js +20 -7
- package/dist/constants/crops.js.map +1 -1
- package/dist/constants/enchants.js +67 -70
- package/dist/constants/enchants.js.map +1 -1
- package/dist/constants/lotus.js +26 -29
- package/dist/constants/lotus.js.map +1 -1
- package/dist/constants/personalbests.d.ts +1 -1
- package/dist/constants/personalbests.js +17 -21
- package/dist/constants/personalbests.js.map +1 -1
- package/dist/constants/pests.d.ts +2 -2
- package/dist/constants/pests.js +10 -15
- package/dist/constants/pests.js.map +1 -1
- package/dist/constants/pets.d.ts +21 -3
- package/dist/constants/pets.js +37 -23
- package/dist/constants/pets.js.map +1 -1
- package/dist/constants/reforges.js +8 -11
- package/dist/constants/reforges.js.map +1 -1
- package/dist/constants/skills.js +2 -5
- package/dist/constants/skills.js.map +1 -1
- package/dist/constants/specialcrops.js +16 -19
- package/dist/constants/specialcrops.js.map +1 -1
- package/dist/constants/specific.d.ts +3 -0
- package/dist/constants/specific.js +5 -5
- package/dist/constants/specific.js.map +1 -1
- package/dist/constants/tools.js +121 -124
- package/dist/constants/tools.js.map +1 -1
- package/dist/constants/weight.js +15 -18
- package/dist/constants/weight.js.map +1 -1
- package/dist/crops/melon.d.ts +1 -1
- package/dist/crops/melon.js +3 -7
- package/dist/crops/melon.js.map +1 -1
- package/dist/crops/pumpkin.d.ts +1 -1
- package/dist/crops/pumpkin.js +3 -7
- package/dist/crops/pumpkin.js.map +1 -1
- package/dist/crops/special.d.ts +1 -1
- package/dist/crops/special.js +6 -10
- package/dist/crops/special.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +25 -38
- package/dist/index.js.map +1 -1
- package/dist/util/itemstats.d.ts +3 -3
- package/dist/util/itemstats.js +48 -53
- package/dist/util/itemstats.js.map +1 -1
- package/dist/util/jacob.d.ts +2 -2
- package/dist/util/jacob.js +3 -8
- package/dist/util/jacob.js.map +1 -1
- package/dist/util/lore.d.ts +1 -1
- package/dist/util/lore.js +1 -5
- package/dist/util/lore.js.map +1 -1
- package/dist/util/names.d.ts +5 -4
- package/dist/util/names.js +102 -78
- package/dist/util/names.js.map +1 -1
- package/dist/util/ratecalc.d.ts +7 -7
- package/dist/util/ratecalc.js +65 -75
- package/dist/util/ratecalc.js.map +1 -1
- package/dist/util/skyblocktime.d.ts +1 -0
- package/dist/util/skyblocktime.js +8 -5
- package/dist/util/skyblocktime.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { FarmingAccessoryInfo } from '../constants/accessories';
|
|
2
|
+
import { Rarity } from '../constants/reforges';
|
|
3
|
+
import { EliteItemDto } from './item';
|
|
4
|
+
export declare class FarmingAccessory {
|
|
5
|
+
readonly item: EliteItemDto;
|
|
6
|
+
readonly info: FarmingAccessoryInfo;
|
|
7
|
+
readonly rarity: Rarity;
|
|
8
|
+
readonly recombobulated: boolean;
|
|
9
|
+
fortune: number;
|
|
10
|
+
fortuneBreakdown: Record<string, number>;
|
|
11
|
+
constructor(item: EliteItemDto);
|
|
12
|
+
private sumFortune;
|
|
13
|
+
static isValid(item: EliteItemDto): boolean;
|
|
14
|
+
static fromArray(items: EliteItemDto[]): FarmingAccessory[];
|
|
15
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { FARMING_ACCESSORIES_INFO } from '../constants/accessories';
|
|
2
|
+
import { Stat } from '../constants/reforges';
|
|
3
|
+
import { getRarityFromLore } from '../util/itemstats';
|
|
4
|
+
export class FarmingAccessory {
|
|
5
|
+
item;
|
|
6
|
+
info;
|
|
7
|
+
constructor(item) {
|
|
8
|
+
this.item = item;
|
|
9
|
+
const info = FARMING_ACCESSORIES_INFO[item.skyblockId];
|
|
10
|
+
if (!info) {
|
|
11
|
+
throw new Error(`Unknown lotus gear: ${item.name} (${item.skyblockId})`);
|
|
12
|
+
}
|
|
13
|
+
this.info = info;
|
|
14
|
+
if (item.lore) {
|
|
15
|
+
this.rarity = getRarityFromLore(item.lore);
|
|
16
|
+
}
|
|
17
|
+
this.recombobulated = this.item.attributes?.rarity_upgrades === '1';
|
|
18
|
+
this.sumFortune();
|
|
19
|
+
}
|
|
20
|
+
sumFortune() {
|
|
21
|
+
this.fortuneBreakdown = {};
|
|
22
|
+
let sum = 0;
|
|
23
|
+
// Base fortune
|
|
24
|
+
const base = this.info.stats?.[Stat.FarmingFortune] ?? 0;
|
|
25
|
+
if (base > 0) {
|
|
26
|
+
this.fortuneBreakdown['Base Stats'] = base;
|
|
27
|
+
sum += base;
|
|
28
|
+
}
|
|
29
|
+
this.fortune = sum;
|
|
30
|
+
return sum;
|
|
31
|
+
}
|
|
32
|
+
static isValid(item) {
|
|
33
|
+
return FARMING_ACCESSORIES_INFO[item.skyblockId] !== undefined;
|
|
34
|
+
}
|
|
35
|
+
static fromArray(items) {
|
|
36
|
+
return items
|
|
37
|
+
.filter((item) => FarmingAccessory.isValid(item))
|
|
38
|
+
.map((item) => new FarmingAccessory(item))
|
|
39
|
+
.sort((a, b) => b.fortune - a.fortune);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=farmingaccessory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"farmingaccessory.js","sourceRoot":"","sources":["../../src/classes/farmingaccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAwB,MAAM,0BAA0B,CAAC;AAC1F,OAAO,EAAU,IAAI,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtD,MAAM,OAAO,gBAAgB;IACZ,IAAI,CAAe;IACnB,IAAI,CAAuB;IAQ3C,YAAY,IAAkB;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,UAAmD,CAAC,CAAC;QAChG,IAAI,CAAC,IAAI,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;SACzE;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,IAAI,CAAC,IAAI,EAAE;YACd,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC3C;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,KAAK,GAAG,CAAC;QAEpE,IAAI,CAAC,UAAU,EAAE,CAAC;IACnB,CAAC;IAEO,UAAU;QACjB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,eAAe;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,IAAI,GAAG,CAAC,EAAE;YACb,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;YAC3C,GAAG,IAAI,IAAI,CAAC;SACZ;QAED,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,IAAkB;QAChC,OAAO,wBAAwB,CAAC,IAAI,CAAC,UAAmD,CAAC,KAAK,SAAS,CAAC;IACzG,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,KAAqB;QACrC,OAAO,KAAK;aACV,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aAChD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;aACzC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;CACD"}
|
|
@@ -2,7 +2,7 @@ import { ArmorSetBonus, FarmingArmorInfo, GearSlot } from '../constants/armor';
|
|
|
2
2
|
import { Crop } from '../constants/crops';
|
|
3
3
|
import { Rarity, Reforge, ReforgeTier } from '../constants/reforges';
|
|
4
4
|
import { SpecialCrop } from '../constants/specialcrops';
|
|
5
|
-
import {
|
|
5
|
+
import { EliteItemDto } from './item';
|
|
6
6
|
import { PlayerOptions } from './player';
|
|
7
7
|
export interface ActiveArmorSetBonus {
|
|
8
8
|
count: number;
|
|
@@ -15,6 +15,7 @@ export declare class ArmorSet {
|
|
|
15
15
|
readonly chestplate?: FarmingArmor;
|
|
16
16
|
readonly leggings?: FarmingArmor;
|
|
17
17
|
readonly boots?: FarmingArmor;
|
|
18
|
+
fortune: number;
|
|
18
19
|
setBonuses: ActiveArmorSetBonus[];
|
|
19
20
|
constructor(armor: FarmingArmor[]);
|
|
20
21
|
private recalculateFamilies;
|
|
@@ -27,7 +28,7 @@ export declare class ArmorSet {
|
|
|
27
28
|
get armor(): (FarmingArmor | null)[];
|
|
28
29
|
}
|
|
29
30
|
export declare class FarmingArmor {
|
|
30
|
-
readonly item:
|
|
31
|
+
readonly item: EliteItemDto;
|
|
31
32
|
readonly armor: FarmingArmorInfo;
|
|
32
33
|
get slot(): GearSlot;
|
|
33
34
|
readonly rarity: Rarity;
|
|
@@ -37,8 +38,8 @@ export declare class FarmingArmor {
|
|
|
37
38
|
fortune: number;
|
|
38
39
|
fortuneBreakdown: Record<string, number>;
|
|
39
40
|
private options?;
|
|
40
|
-
constructor(item:
|
|
41
|
+
constructor(item: EliteItemDto, options?: PlayerOptions);
|
|
41
42
|
private sumFortune;
|
|
42
|
-
static isValid(item:
|
|
43
|
+
static isValid(item: EliteItemDto): boolean;
|
|
44
|
+
static fromArray(items: EliteItemDto[], options?: PlayerOptions): FarmingArmor[];
|
|
43
45
|
}
|
|
44
|
-
export declare function IsValidFarmingArmor(item: Item): boolean;
|
|
@@ -1,19 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const special_1 = require("../crops/special");
|
|
10
|
-
const itemstats_1 = require("../util/itemstats");
|
|
11
|
-
class ArmorSet {
|
|
1
|
+
import { ARMOR_INFO, ARMOR_SET_BONUS, GearSlot } from '../constants/armor';
|
|
2
|
+
import { FARMING_ARMOR_ENCHANTS } from '../constants/enchants';
|
|
3
|
+
import { REFORGES, Stat } from '../constants/reforges';
|
|
4
|
+
import { Skill } from '../constants/skills';
|
|
5
|
+
import { MATCHING_SPECIAL_CROP } from '../constants/specialcrops';
|
|
6
|
+
import { calculateAverageSpecialCrops } from '../crops/special';
|
|
7
|
+
import { getRarityFromLore } from '../util/itemstats';
|
|
8
|
+
export class ArmorSet {
|
|
12
9
|
constructor(armor) {
|
|
13
|
-
this.helmet = armor.find((a) => a.slot ===
|
|
14
|
-
this.chestplate = armor.find((a) => a.slot ===
|
|
15
|
-
this.leggings = armor.find((a) => a.slot ===
|
|
16
|
-
this.boots = armor.find((a) => a.slot ===
|
|
10
|
+
this.helmet = armor.find((a) => a.slot === GearSlot.Helmet);
|
|
11
|
+
this.chestplate = armor.find((a) => a.slot === GearSlot.Chestplate);
|
|
12
|
+
this.leggings = armor.find((a) => a.slot === GearSlot.Leggings);
|
|
13
|
+
this.boots = armor.find((a) => a.slot === GearSlot.Boots);
|
|
17
14
|
this.recalculateFamilies();
|
|
18
15
|
}
|
|
19
16
|
recalculateFamilies() {
|
|
@@ -28,7 +25,7 @@ class ArmorSet {
|
|
|
28
25
|
for (const [family, count] of families.entries()) {
|
|
29
26
|
if (count < 2)
|
|
30
27
|
continue;
|
|
31
|
-
const bonus =
|
|
28
|
+
const bonus = ARMOR_SET_BONUS[family];
|
|
32
29
|
if (!bonus)
|
|
33
30
|
continue;
|
|
34
31
|
this.setBonuses.push({
|
|
@@ -38,8 +35,10 @@ class ArmorSet {
|
|
|
38
35
|
special: bonus.special,
|
|
39
36
|
});
|
|
40
37
|
}
|
|
38
|
+
this.getFortuneBreakdown();
|
|
41
39
|
}
|
|
42
40
|
getFortuneBreakdown() {
|
|
41
|
+
let sum = 0;
|
|
43
42
|
const breakdown = {};
|
|
44
43
|
for (const piece of this.armor) {
|
|
45
44
|
if (!piece)
|
|
@@ -47,20 +46,23 @@ class ArmorSet {
|
|
|
47
46
|
const fortune = piece.fortune;
|
|
48
47
|
if (fortune > 0) {
|
|
49
48
|
breakdown[piece.item.name ?? ''] = fortune;
|
|
49
|
+
sum += fortune;
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
for (const { bonus, count } of this.setBonuses) {
|
|
53
53
|
if (count < 2 || count > 4)
|
|
54
54
|
continue;
|
|
55
|
-
const fortune = bonus.stats?.[count]?.[
|
|
55
|
+
const fortune = bonus.stats?.[count]?.[Stat.FarmingFortune] ?? 0;
|
|
56
56
|
if (fortune > 0) {
|
|
57
57
|
breakdown[bonus.name] = fortune;
|
|
58
|
+
sum += fortune;
|
|
58
59
|
}
|
|
59
60
|
}
|
|
61
|
+
this.fortune = sum;
|
|
60
62
|
return breakdown;
|
|
61
63
|
}
|
|
62
64
|
specialDropsCalc(blocksBroken, crop) {
|
|
63
|
-
const special =
|
|
65
|
+
const special = MATCHING_SPECIAL_CROP[crop];
|
|
64
66
|
const applicableBonuses = this.setBonuses.filter((b) => b.special?.includes(special));
|
|
65
67
|
if (applicableBonuses.length === 0)
|
|
66
68
|
return null;
|
|
@@ -72,29 +74,28 @@ class ArmorSet {
|
|
|
72
74
|
for (const bonus of applicableBonuses) {
|
|
73
75
|
count += bonus.count;
|
|
74
76
|
}
|
|
75
|
-
return (
|
|
77
|
+
return calculateAverageSpecialCrops(blocksBroken, crop, count);
|
|
76
78
|
}
|
|
77
79
|
get armor() {
|
|
78
80
|
return [this.helmet ?? null, this.chestplate ?? null, this.leggings ?? null, this.boots ?? null];
|
|
79
81
|
}
|
|
80
82
|
}
|
|
81
|
-
|
|
82
|
-
class FarmingArmor {
|
|
83
|
+
export class FarmingArmor {
|
|
83
84
|
get slot() {
|
|
84
85
|
return this.armor.slot;
|
|
85
86
|
}
|
|
86
87
|
constructor(item, options) {
|
|
87
88
|
this.options = options;
|
|
88
89
|
this.item = item;
|
|
89
|
-
const armor =
|
|
90
|
+
const armor = ARMOR_INFO[item.skyblockId];
|
|
90
91
|
if (!armor) {
|
|
91
92
|
throw new Error(`Unknown farming armor: ${item.name} (${item.skyblockId})`);
|
|
92
93
|
}
|
|
93
94
|
this.armor = armor;
|
|
94
95
|
if (item.lore) {
|
|
95
|
-
this.rarity = (
|
|
96
|
+
this.rarity = getRarityFromLore(item.lore);
|
|
96
97
|
}
|
|
97
|
-
this.reforge =
|
|
98
|
+
this.reforge = REFORGES[item.attributes?.modifier ?? ''] ?? undefined;
|
|
98
99
|
this.reforgeStats = this.reforge?.tiers?.[this.rarity];
|
|
99
100
|
this.recombobulated = this.item.attributes?.rarity_upgrades === '1';
|
|
100
101
|
this.sumFortune();
|
|
@@ -103,21 +104,21 @@ class FarmingArmor {
|
|
|
103
104
|
this.fortuneBreakdown = {};
|
|
104
105
|
let sum = 0;
|
|
105
106
|
// Base fortune
|
|
106
|
-
const base = this.armor.stats?.[
|
|
107
|
+
const base = this.armor.stats?.[Stat.FarmingFortune] ?? 0;
|
|
107
108
|
if (base > 0) {
|
|
108
109
|
this.fortuneBreakdown['Base Stats'] = base;
|
|
109
110
|
sum += base;
|
|
110
111
|
}
|
|
111
112
|
// Per farming level stats like Rancher's Boots
|
|
112
|
-
if (this.armor.perLevelStats?.skill ===
|
|
113
|
-
const perLevel = this.armor.perLevelStats?.stats[
|
|
113
|
+
if (this.armor.perLevelStats?.skill === Skill.Farming && this.options?.farmingLevel) {
|
|
114
|
+
const perLevel = this.armor.perLevelStats?.stats[Stat.FarmingFortune] ?? 0;
|
|
114
115
|
if (perLevel > 0) {
|
|
115
116
|
this.fortuneBreakdown['Farming Level'] = perLevel * this.options.farmingLevel;
|
|
116
117
|
sum += perLevel * this.options.farmingLevel;
|
|
117
118
|
}
|
|
118
119
|
}
|
|
119
120
|
// Reforge stats
|
|
120
|
-
const reforge = this.reforgeStats?.stats?.[
|
|
121
|
+
const reforge = this.reforgeStats?.stats?.[Stat.FarmingFortune] ?? 0;
|
|
121
122
|
if (reforge > 0) {
|
|
122
123
|
this.fortuneBreakdown[this.reforge?.name ?? 'Reforge'] = reforge;
|
|
123
124
|
sum += reforge;
|
|
@@ -127,10 +128,10 @@ class FarmingArmor {
|
|
|
127
128
|
for (const [enchant, level] of enchantments) {
|
|
128
129
|
if (!level)
|
|
129
130
|
continue;
|
|
130
|
-
const enchantment =
|
|
131
|
+
const enchantment = FARMING_ARMOR_ENCHANTS[enchant];
|
|
131
132
|
if (!enchantment || !level)
|
|
132
133
|
continue;
|
|
133
|
-
const fortune = enchantment.levels?.[level]?.[
|
|
134
|
+
const fortune = enchantment.levels?.[level]?.[Stat.FarmingFortune] ?? 0;
|
|
134
135
|
if (fortune > 0) {
|
|
135
136
|
this.fortuneBreakdown[enchantment.name] = fortune;
|
|
136
137
|
sum += fortune;
|
|
@@ -140,12 +141,13 @@ class FarmingArmor {
|
|
|
140
141
|
return sum;
|
|
141
142
|
}
|
|
142
143
|
static isValid(item) {
|
|
143
|
-
return
|
|
144
|
+
return ARMOR_INFO[item.skyblockId] !== undefined;
|
|
145
|
+
}
|
|
146
|
+
static fromArray(items, options) {
|
|
147
|
+
return items
|
|
148
|
+
.filter((item) => FarmingArmor.isValid(item))
|
|
149
|
+
.map((item) => new FarmingArmor(item, options))
|
|
150
|
+
.sort((a, b) => b.fortune - a.fortune);
|
|
144
151
|
}
|
|
145
152
|
}
|
|
146
|
-
exports.FarmingArmor = FarmingArmor;
|
|
147
|
-
function IsValidFarmingArmor(item) {
|
|
148
|
-
return armor_1.ARMOR_INFO[item.skyblockId] !== undefined;
|
|
149
|
-
}
|
|
150
|
-
exports.IsValidFarmingArmor = IsValidFarmingArmor;
|
|
151
153
|
//# sourceMappingURL=farmingarmor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"farmingarmor.js","sourceRoot":"","sources":["../../src/classes/farmingarmor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"farmingarmor.js","sourceRoot":"","sources":["../../src/classes/farmingarmor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
|
-
import { FarmingPetType } from '../constants/pets';
|
|
2
|
-
|
|
1
|
+
import { FarmingPetInfo, FarmingPetItemInfo, FarmingPetType, FarmingPets } from '../constants/pets';
|
|
2
|
+
import { Rarity } from '../constants/reforges';
|
|
3
|
+
import { EliteItemDto } from './item';
|
|
4
|
+
import { PlayerOptions } from './player';
|
|
5
|
+
export declare function createFarmingPet(pet: FarmingPetType): FarmingPet;
|
|
3
6
|
export declare class FarmingPet {
|
|
4
7
|
readonly pet: FarmingPetType;
|
|
5
|
-
|
|
8
|
+
readonly type: FarmingPets;
|
|
9
|
+
readonly info: FarmingPetInfo;
|
|
10
|
+
readonly rarity: Rarity;
|
|
11
|
+
readonly level: number;
|
|
12
|
+
readonly item: FarmingPetItemInfo | undefined;
|
|
13
|
+
fortune: number;
|
|
14
|
+
breakdown: Record<string, number>;
|
|
15
|
+
private readonly options?;
|
|
16
|
+
constructor(pet: FarmingPetType, options?: PlayerOptions);
|
|
17
|
+
getFortune(): number;
|
|
18
|
+
static isValid(pet: FarmingPetType): boolean | "" | undefined;
|
|
19
|
+
static fromArray(items: EliteItemDto[], options?: PlayerOptions): FarmingPet[];
|
|
6
20
|
}
|
|
21
|
+
export declare function getPetLevel(pet: FarmingPetType, max?: number): number;
|
|
@@ -1,15 +1,81 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
function
|
|
1
|
+
import { FARMING_PETS, FARMING_PET_ITEMS, FarmingPets, PET_LEVELS, } from '../constants/pets';
|
|
2
|
+
import { Rarity, Stat } from '../constants/reforges';
|
|
3
|
+
import { Skill } from '../constants/skills';
|
|
4
|
+
export function createFarmingPet(pet) {
|
|
5
5
|
return new FarmingPet(pet);
|
|
6
6
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
constructor(pet) {
|
|
7
|
+
export class FarmingPet {
|
|
8
|
+
constructor(pet, options) {
|
|
9
|
+
this.options = options;
|
|
11
10
|
this.pet = pet;
|
|
11
|
+
this.info = FARMING_PETS[pet.type];
|
|
12
|
+
if (!this.info) {
|
|
13
|
+
throw new Error(`Invalid farming pet type: ${pet.type}`);
|
|
14
|
+
}
|
|
15
|
+
this.type = pet.type;
|
|
16
|
+
this.rarity = pet.tier ?? Rarity.Common;
|
|
17
|
+
this.level = getPetLevel(pet);
|
|
18
|
+
this.item = pet.heldItem ? FARMING_PET_ITEMS[pet.heldItem] : undefined;
|
|
19
|
+
this.fortune = this.getFortune();
|
|
12
20
|
}
|
|
21
|
+
getFortune() {
|
|
22
|
+
let fortune = 0;
|
|
23
|
+
const breakdown = {};
|
|
24
|
+
// Base stats
|
|
25
|
+
const stats = this.info.stats?.[Stat.FarmingFortune];
|
|
26
|
+
if (stats) {
|
|
27
|
+
fortune += stats;
|
|
28
|
+
breakdown['Base Stats'] = stats;
|
|
29
|
+
}
|
|
30
|
+
// Per level/ability stats
|
|
31
|
+
const perLevelStats = this.info.perLevelStats?.[Stat.FarmingFortune];
|
|
32
|
+
if (perLevelStats) {
|
|
33
|
+
const amount = perLevelStats.multiplier * this.level;
|
|
34
|
+
fortune += amount;
|
|
35
|
+
breakdown[perLevelStats.name] = amount;
|
|
36
|
+
}
|
|
37
|
+
// Mooshroom Cow Perk
|
|
38
|
+
if (this.type === FarmingPets.MooshroomCow && this.options?.strength) {
|
|
39
|
+
const strengthPer = 40 - this.level * 0.2;
|
|
40
|
+
const strength = this.options.strength;
|
|
41
|
+
const amount = Math.floor((strength / strengthPer) * 0.7);
|
|
42
|
+
fortune += amount;
|
|
43
|
+
breakdown['Farming Strength'] = amount;
|
|
44
|
+
}
|
|
45
|
+
// Pet item stats
|
|
46
|
+
if (this.item) {
|
|
47
|
+
const stats = this.item.stats?.[Stat.FarmingFortune];
|
|
48
|
+
const perLevelStats = this.item.perLevelStats;
|
|
49
|
+
if (stats) {
|
|
50
|
+
fortune += stats;
|
|
51
|
+
breakdown[this.item.name] = stats;
|
|
52
|
+
}
|
|
53
|
+
else if (perLevelStats && perLevelStats.skill === Skill.Garden) {
|
|
54
|
+
const amount = (perLevelStats?.stats?.[Stat.FarmingFortune] ?? 0) * (this.options?.gardenLevel ?? 0);
|
|
55
|
+
fortune += amount;
|
|
56
|
+
breakdown[this.item.name] = amount;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
this.breakdown = breakdown;
|
|
60
|
+
return fortune;
|
|
61
|
+
}
|
|
62
|
+
static isValid(pet) {
|
|
63
|
+
return pet.type && pet.type in FARMING_PETS;
|
|
64
|
+
}
|
|
65
|
+
static fromArray(items, options) {
|
|
66
|
+
return items
|
|
67
|
+
.filter((item) => FarmingPet.isValid(item))
|
|
68
|
+
.map((item) => new FarmingPet(item, options))
|
|
69
|
+
.sort((a, b) => b.fortune - a.fortune);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export function getPetLevel(pet, max = 100) {
|
|
73
|
+
const levels = PET_LEVELS;
|
|
74
|
+
const xp = pet.exp ?? 0;
|
|
75
|
+
const levelIndex = levels.findIndex((level) => level > xp);
|
|
76
|
+
if (levelIndex === -1 || levelIndex >= max) {
|
|
77
|
+
return max;
|
|
78
|
+
}
|
|
79
|
+
return levelIndex + 1;
|
|
13
80
|
}
|
|
14
|
-
exports.FarmingPet = FarmingPet;
|
|
15
81
|
//# sourceMappingURL=farmingpet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"farmingpet.js","sourceRoot":"","sources":["../../src/classes/farmingpet.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"farmingpet.js","sourceRoot":"","sources":["../../src/classes/farmingpet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { Crop } from '../constants/crops';
|
|
2
2
|
import { Rarity, Reforge, ReforgeTier } from '../constants/reforges';
|
|
3
3
|
import { FarmingToolInfo } from '../constants/tools';
|
|
4
|
-
import {
|
|
4
|
+
import { EliteItemDto } from './item';
|
|
5
5
|
import { PlayerOptions } from './player';
|
|
6
6
|
export declare class FarmingTool {
|
|
7
|
-
item:
|
|
7
|
+
item: EliteItemDto;
|
|
8
8
|
crop: Crop;
|
|
9
9
|
tool: FarmingToolInfo;
|
|
10
|
+
itemname: string;
|
|
11
|
+
private colorPrefix;
|
|
12
|
+
get name(): string;
|
|
10
13
|
rarity: Rarity;
|
|
11
14
|
counter: number | undefined;
|
|
12
15
|
cultivating: number;
|
|
@@ -17,16 +20,17 @@ export declare class FarmingTool {
|
|
|
17
20
|
fortune: number;
|
|
18
21
|
fortuneBreakdown: Record<string, number>;
|
|
19
22
|
private options?;
|
|
20
|
-
constructor(item:
|
|
21
|
-
rebuildTool(item:
|
|
22
|
-
setReforge
|
|
23
|
-
|
|
23
|
+
constructor(item: EliteItemDto, options?: PlayerOptions);
|
|
24
|
+
rebuildTool(item: EliteItemDto, options?: PlayerOptions): void;
|
|
25
|
+
private setReforge;
|
|
26
|
+
changeReforgeTo(reforgeId: string): void;
|
|
27
|
+
getFortune(): number;
|
|
24
28
|
private getCounter;
|
|
25
29
|
private getCultivating;
|
|
26
30
|
getCultivatingLevel(): number;
|
|
27
31
|
get farmed(): number;
|
|
28
|
-
|
|
32
|
+
isMissingDedication(): boolean | 0 | null | undefined;
|
|
29
33
|
private getFarmingAbilityFortune;
|
|
30
|
-
static isValid(item:
|
|
34
|
+
static isValid(item: EliteItemDto | FarmingTool): boolean;
|
|
35
|
+
static fromArray(items: EliteItemDto[], options?: PlayerOptions): FarmingTool[];
|
|
31
36
|
}
|
|
32
|
-
export declare function IsValidFarmingTool(item: Item): boolean;
|
|
@@ -1,56 +1,69 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { FARMING_ENCHANTS, TURBO_ENCHANTS, TURBO_ENCHANT_FORTUNE } from '../constants/enchants';
|
|
2
|
+
import { REFORGES, Stat } from '../constants/reforges';
|
|
3
|
+
import { FARMING_TOOLS, FarmingToolType } from '../constants/tools';
|
|
4
|
+
import { getRarityFromLore, previousRarity } from '../util/itemstats';
|
|
5
|
+
import { extractNumberFromLine } from '../util/lore';
|
|
6
|
+
export class FarmingTool {
|
|
7
|
+
get name() {
|
|
8
|
+
return this.colorPrefix + (this.reforge?.name ?? '') + ' ' + this.itemname;
|
|
9
|
+
}
|
|
10
10
|
constructor(item, options) {
|
|
11
11
|
this.rebuildTool(item, options);
|
|
12
12
|
}
|
|
13
13
|
rebuildTool(item, options) {
|
|
14
14
|
this.options = options;
|
|
15
15
|
this.item = item;
|
|
16
|
-
const tool =
|
|
16
|
+
const tool = FARMING_TOOLS[item.skyblockId];
|
|
17
17
|
if (!tool) {
|
|
18
18
|
throw new Error(`Unknown farming tool: ${item.name} (${item.skyblockId})`);
|
|
19
19
|
}
|
|
20
20
|
this.tool = tool;
|
|
21
21
|
this.crop = tool.crop;
|
|
22
22
|
if (item.lore) {
|
|
23
|
-
this.rarity = (
|
|
23
|
+
this.rarity = getRarityFromLore(item.lore);
|
|
24
24
|
}
|
|
25
25
|
this.counter = this.getCounter();
|
|
26
26
|
this.cultivating = this.getCultivating() ?? 0;
|
|
27
27
|
this.setReforge(item.attributes?.modifier ?? '');
|
|
28
28
|
this.farmingForDummies = +(this.item.attributes?.farming_for_dummies_count ?? 0);
|
|
29
29
|
this.recombobulated = this.item.attributes?.rarity_upgrades === '1';
|
|
30
|
-
this.fortune = this.
|
|
30
|
+
this.fortune = this.getFortune();
|
|
31
|
+
if (this.reforge?.name && item.name) {
|
|
32
|
+
const [prefix, name] = item.name.split(this.reforge.name);
|
|
33
|
+
this.colorPrefix = prefix ?? '';
|
|
34
|
+
this.itemname = name?.trim() ?? '';
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
this.colorPrefix = '';
|
|
38
|
+
this.itemname = item.name ?? '';
|
|
39
|
+
}
|
|
31
40
|
}
|
|
32
41
|
setReforge(reforgeId) {
|
|
33
|
-
this.reforge =
|
|
42
|
+
this.reforge = REFORGES[reforgeId] ?? undefined;
|
|
34
43
|
this.reforgeStats = this.reforge?.tiers?.[this.rarity];
|
|
35
44
|
}
|
|
36
|
-
|
|
45
|
+
changeReforgeTo(reforgeId) {
|
|
46
|
+
this.setReforge(reforgeId);
|
|
47
|
+
this.fortune = this.getFortune();
|
|
48
|
+
}
|
|
49
|
+
getFortune() {
|
|
37
50
|
this.fortuneBreakdown = {};
|
|
38
51
|
let sum = 0;
|
|
39
52
|
// Base fortune
|
|
40
|
-
const base = this.tool.baseStats?.[
|
|
53
|
+
const base = this.tool.baseStats?.[Stat.FarmingFortune] ?? 0;
|
|
41
54
|
if (base > 0) {
|
|
42
55
|
this.fortuneBreakdown['Tool Bonus'] = base;
|
|
43
56
|
sum += base;
|
|
44
57
|
}
|
|
45
58
|
// Tool rarity stats
|
|
46
|
-
const baseRarity = this.recombobulated ? (
|
|
47
|
-
const rarityStats = this.tool.stats?.[baseRarity]?.[
|
|
59
|
+
const baseRarity = this.recombobulated ? previousRarity(this.rarity) : this.rarity;
|
|
60
|
+
const rarityStats = this.tool.stats?.[baseRarity]?.[Stat.FarmingFortune] ?? 0;
|
|
48
61
|
if (rarityStats > 0) {
|
|
49
62
|
this.fortuneBreakdown['Tool Stats'] = rarityStats;
|
|
50
63
|
sum += rarityStats;
|
|
51
64
|
}
|
|
52
65
|
// Reforge stats
|
|
53
|
-
const reforge = this.reforgeStats?.stats?.[
|
|
66
|
+
const reforge = this.reforgeStats?.stats?.[Stat.FarmingFortune] ?? 0;
|
|
54
67
|
if (reforge > 0) {
|
|
55
68
|
this.fortuneBreakdown[this.reforge?.name ?? 'Reforge'] = reforge;
|
|
56
69
|
sum += reforge;
|
|
@@ -61,7 +74,7 @@ class FarmingTool {
|
|
|
61
74
|
sum += this.farmingForDummies;
|
|
62
75
|
}
|
|
63
76
|
// Collection analysis and digit bonuses
|
|
64
|
-
if (this.tool.type ===
|
|
77
|
+
if (this.tool.type === FarmingToolType.MathematicalHoe) {
|
|
65
78
|
const ability = this.getFarmingAbilityFortune(this);
|
|
66
79
|
if (ability > 0) {
|
|
67
80
|
this.fortuneBreakdown['Tool Ability'] = ability;
|
|
@@ -73,19 +86,19 @@ class FarmingTool {
|
|
|
73
86
|
for (const [enchant, level] of enchantments) {
|
|
74
87
|
if (!level)
|
|
75
88
|
continue;
|
|
76
|
-
if (enchant in
|
|
77
|
-
const matchingCrop =
|
|
89
|
+
if (enchant in TURBO_ENCHANTS) {
|
|
90
|
+
const matchingCrop = TURBO_ENCHANTS[enchant];
|
|
78
91
|
if (!matchingCrop || matchingCrop !== this.crop)
|
|
79
92
|
continue;
|
|
80
|
-
const gain =
|
|
93
|
+
const gain = TURBO_ENCHANT_FORTUNE * level;
|
|
81
94
|
this.fortuneBreakdown['Turbo'] = gain;
|
|
82
95
|
sum += gain;
|
|
83
96
|
continue;
|
|
84
97
|
}
|
|
85
|
-
const enchantment =
|
|
98
|
+
const enchantment = FARMING_ENCHANTS[enchant];
|
|
86
99
|
if (!enchantment || !level)
|
|
87
100
|
continue;
|
|
88
|
-
const fortune = enchantment.levels?.[level]?.[
|
|
101
|
+
const fortune = enchantment.levels?.[level]?.[Stat.FarmingFortune] ?? 0;
|
|
89
102
|
if (fortune > 0) {
|
|
90
103
|
this.fortuneBreakdown[enchantment.name] = fortune;
|
|
91
104
|
sum += fortune;
|
|
@@ -94,9 +107,9 @@ class FarmingTool {
|
|
|
94
107
|
const milestone = this.options?.milestones?.[this.crop] ?? 0;
|
|
95
108
|
if (milestone && 'dedication' in (this.item.enchantments ?? {})) {
|
|
96
109
|
const level = this.item.enchantments?.dedication;
|
|
97
|
-
const enchantment =
|
|
110
|
+
const enchantment = FARMING_ENCHANTS.dedication;
|
|
98
111
|
if (level && enchantment) {
|
|
99
|
-
const multiplier = enchantment.multipliedLevels?.[level]?.[
|
|
112
|
+
const multiplier = enchantment.multipliedLevels?.[level]?.[Stat.FarmingFortune] ?? 0;
|
|
100
113
|
if (multiplier > 0 && !isNaN(milestone)) {
|
|
101
114
|
this.fortuneBreakdown[enchantment.name] = multiplier * milestone;
|
|
102
115
|
sum += multiplier * milestone;
|
|
@@ -120,24 +133,27 @@ class FarmingTool {
|
|
|
120
133
|
get farmed() {
|
|
121
134
|
return this.counter ?? this.cultivating ?? 0;
|
|
122
135
|
}
|
|
123
|
-
|
|
136
|
+
isMissingDedication() {
|
|
124
137
|
return this.item?.enchantments?.dedication && (this.options?.milestones?.[this.crop] ?? 0) > 0;
|
|
125
138
|
}
|
|
126
139
|
getFarmingAbilityFortune(tool) {
|
|
127
140
|
let fortune = 0;
|
|
128
|
-
const regex = /§7You have §6\+(\d+)
|
|
141
|
+
const regex = /§7You have §6\+(\d+)☘/g;
|
|
129
142
|
for (const line of tool.item.lore ?? []) {
|
|
130
|
-
fortune += (
|
|
143
|
+
fortune += extractNumberFromLine(line, regex) ?? 0;
|
|
131
144
|
}
|
|
132
145
|
return fortune;
|
|
133
146
|
}
|
|
134
147
|
static isValid(item) {
|
|
135
|
-
|
|
148
|
+
if (item instanceof FarmingTool)
|
|
149
|
+
return true;
|
|
150
|
+
return FARMING_TOOLS[item.skyblockId] !== undefined;
|
|
151
|
+
}
|
|
152
|
+
static fromArray(items, options) {
|
|
153
|
+
return items
|
|
154
|
+
.filter((item) => FarmingTool.isValid(item))
|
|
155
|
+
.map((item) => new FarmingTool(item, options))
|
|
156
|
+
.sort((a, b) => b.fortune - a.fortune);
|
|
136
157
|
}
|
|
137
158
|
}
|
|
138
|
-
exports.FarmingTool = FarmingTool;
|
|
139
|
-
function IsValidFarmingTool(item) {
|
|
140
|
-
return tools_1.FARMING_TOOLS[item.skyblockId] !== undefined;
|
|
141
|
-
}
|
|
142
|
-
exports.IsValidFarmingTool = IsValidFarmingTool;
|
|
143
159
|
//# sourceMappingURL=farmingtool.js.map
|