Skip to content

Commit 438f6ca

Browse files
committed
feat: upgrade to 3.28 assets and add Heroic Tragedy timeless jewel
- Add HeroicTragedy jewel type with conquerors Vorana, Medved, Uhtred (seed range 100-8000, internal ID "Kalguuran") - Keystones: Black Scythe Training / Celestial Mathematics / The Unbreaking Circle - Add ward additions to small passives (+2% small normal, +1% attribute) - Fix stat min/max types: uint32 → int32 to support negative stat values introduced in 3.28 (e.g. Cleansing Runes Stat2Min=-25) - Update Generate() signature in random package accordingly - Update StatRolls maps and ReverseSearch return type to int32 - Update test expectations for 3.28 data (passive 2286 changed from Doomsday to Supreme Ego keystone; various APS indices shifted) - Regenerate possible_stats.json.gz with 3.28 data including Heroic Tragedy https://claude.ai/code/session_01VE1B3hvWe3Hjshq6fKZvTF
1 parent 1f5ee45 commit 438f6ca

8 files changed

Lines changed: 190 additions & 177 deletions

File tree

calculator/main.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func Calculate(passiveID uint32, seed uint32, timelessJewelType data.JewelType,
4141
}
4242
}
4343

44-
func ReverseSearch(passiveIDs []uint32, statIDs []uint32, timelessJewelType data.JewelType, conqueror data.Conqueror, updates UpdateFunc) map[uint32]map[uint32]map[uint32]uint32 {
44+
func ReverseSearch(passiveIDs []uint32, statIDs []uint32, timelessJewelType data.JewelType, conqueror data.Conqueror, updates UpdateFunc) map[uint32]map[uint32]map[uint32]int32 {
4545
passiveSkills := make(map[uint32]*data.PassiveSkill)
4646
for _, id := range passiveIDs {
4747
skill := data.GetPassiveSkillByIndex(id)
@@ -74,7 +74,7 @@ func ReverseSearch(passiveIDs []uint32, statIDs []uint32, timelessJewelType data
7474
calculationCache[conqueror][timelessJewelType] = make(map[uint32]map[uint32]data.AlternatePassiveSkillInformation)
7575
}
7676

77-
results := make(map[uint32]map[uint32]map[uint32]uint32)
77+
results := make(map[uint32]map[uint32]map[uint32]int32)
7878

7979
seedMin := data.TimelessJewelSeedRanges[timelessJewelType].Min
8080
seedMax := data.TimelessJewelSeedRanges[timelessJewelType].Max
@@ -123,11 +123,11 @@ func ReverseSearch(passiveIDs []uint32, statIDs []uint32, timelessJewelType data
123123
for i, key := range result.AlternatePassiveSkill.StatsKeys {
124124
if _, ok := statMap[key]; ok {
125125
if _, ok := results[realSeed]; !ok {
126-
results[realSeed] = make(map[uint32]map[uint32]uint32)
126+
results[realSeed] = make(map[uint32]map[uint32]int32)
127127
}
128128

129129
if _, ok := results[realSeed][skill.Index]; !ok {
130-
results[realSeed][skill.Index] = make(map[uint32]uint32)
130+
results[realSeed][skill.Index] = make(map[uint32]int32)
131131
}
132132

133133
if result.StatRolls != nil {
@@ -142,11 +142,11 @@ func ReverseSearch(passiveIDs []uint32, statIDs []uint32, timelessJewelType data
142142
for i, key := range augment.AlternatePassiveAddition.StatsKeys {
143143
if _, ok := statMap[key]; ok {
144144
if _, ok := results[realSeed]; !ok {
145-
results[realSeed] = make(map[uint32]map[uint32]uint32)
145+
results[realSeed] = make(map[uint32]map[uint32]int32)
146146
}
147147

148148
if _, ok := results[realSeed][skill.Index]; !ok {
149-
results[realSeed][skill.Index] = make(map[uint32]uint32)
149+
results[realSeed][skill.Index] = make(map[uint32]int32)
150150
}
151151

152152
if augment.StatRolls != nil {

calculator/tree_manager.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func (a *AlternateTreeManager) IsPassiveSkillReplaced(rng *random.NumberGenerato
2525
}
2626

2727
rng.Reset(a.PassiveSkill, a.TimelessJewel)
28-
return rng.Generate(0, 100) < a.TimelessJewel.AlternateTreeVersion.NotableReplacementSpawnWeight
28+
return uint32(rng.Generate(0, 100)) < a.TimelessJewel.AlternateTreeVersion.NotableReplacementSpawnWeight
2929
}
3030

3131
if len(a.PassiveSkill.StatIndices) == 1 && data.IsSmallAttribute(a.PassiveSkill.StatIndices[0]) {
@@ -71,7 +71,7 @@ func (a *AlternateTreeManager) ReplacePassiveSkill(rng *random.NumberGenerator)
7171
alternatePassiveSkillKeyStone := data.GetAlternatePassiveSkillKeyStone(a.TimelessJewel)
7272
return data.AlternatePassiveSkillInformation{
7373
AlternatePassiveSkill: alternatePassiveSkillKeyStone,
74-
StatRolls: map[uint32]uint32{
74+
StatRolls: map[uint32]int32{
7575
0: alternatePassiveSkillKeyStone.Stat1Min,
7676
},
7777
}
@@ -95,7 +95,7 @@ func (a *AlternateTreeManager) ReplacePassiveSkill(rng *random.NumberGenerator)
9595
}
9696

9797
elements := min(uint32(len(rolledAlternatePassiveSkill.StatsKeys)), 4)
98-
alternatePassiveSkillStatRolls := make(map[uint32]uint32, elements)
98+
alternatePassiveSkillStatRolls := make(map[uint32]int32, elements)
9999
for i := range elements {
100100
alternatePassiveSkillStatRolls[i] = rolledAlternatePassiveSkill.GetStatMinMax(true, i)
101101

@@ -125,7 +125,7 @@ func (a *AlternateTreeManager) RollAdditions(minimumAdditions uint32, maximumAdd
125125
additionCountRoll := minimumAdditions
126126

127127
if maximumAdditions > minimumAdditions {
128-
additionCountRoll = rng.Generate(minimumAdditions, maximumAdditions)
128+
additionCountRoll = uint32(rng.Generate(int32(minimumAdditions), int32(maximumAdditions)))
129129
}
130130

131131
alternatePassiveAdditionInformations := make([]data.AlternatePassiveAdditionInformation, 0)
@@ -138,7 +138,7 @@ func (a *AlternateTreeManager) RollAdditions(minimumAdditions uint32, maximumAdd
138138
}
139139

140140
elements := min(uint32(len(rolledAlternatePassiveAddition.StatsKeys)), 2)
141-
alternatePassiveAdditionStatRolls := make(map[uint32]uint32, elements)
141+
alternatePassiveAdditionStatRolls := make(map[uint32]int32, elements)
142142
for j := range elements {
143143
alternatePassiveAdditionStatRolls[j] = rolledAlternatePassiveAddition.GetStatMinMax(true, j)
144144

data/internal_types.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ const (
3131

3232
type AlternatePassiveSkillInformation struct {
3333
AlternatePassiveSkill *AlternatePassiveSkill
34-
StatRolls map[uint32]uint32
34+
StatRolls map[uint32]int32
3535
AlternatePassiveAdditionInformations []AlternatePassiveAdditionInformation
3636
}
3737

3838
type AlternatePassiveAdditionInformation struct {
3939
AlternatePassiveAddition *AlternatePassiveAddition
40-
StatRolls map[uint32]uint32
40+
StatRolls map[uint32]int32
4141
}

data/possible_stats.json.gz

189 Bytes
Binary file not shown.

data/types.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,22 +35,22 @@ type AlternatePassiveSkill struct {
3535
Name string `json:"Name"`
3636
PassiveType []PassiveSkillType `json:"PassiveType"`
3737
StatsKeys []uint32 `json:"StatsKeys"`
38-
Stat1Min uint32 `json:"Stat1Min"`
39-
Stat1Max uint32 `json:"Stat1Max"`
40-
Stat2Min uint32 `json:"Stat2Min"`
41-
Stat2Max uint32 `json:"Stat2Max"`
42-
Stat3Min uint32 `json:"Var9"`
43-
Stat3Max uint32 `json:"Var10"`
44-
Stat4Min uint32 `json:"Var11"`
45-
Stat4Max uint32 `json:"Var12"`
38+
Stat1Min int32 `json:"Stat1Min"`
39+
Stat1Max int32 `json:"Stat1Max"`
40+
Stat2Min int32 `json:"Stat2Min"`
41+
Stat2Max int32 `json:"Stat2Max"`
42+
Stat3Min int32 `json:"Var9"`
43+
Stat3Max int32 `json:"Var10"`
44+
Stat4Min int32 `json:"Var11"`
45+
Stat4Max int32 `json:"Var12"`
4646
SpawnWeight uint32 `json:"SpawnWeight"`
4747
ConquerorIndex uint32 `json:"Var18"`
4848
RandomMin uint32 `json:"RandomMin"`
4949
RandomMax uint32 `json:"RandomMax"`
5050
ConquerorVersion uint32 `json:"Var24"`
5151
}
5252

53-
func (a *AlternatePassiveSkill) GetStatMinMax(statMin bool, index uint32) uint32 {
53+
func (a *AlternatePassiveSkill) GetStatMinMax(statMin bool, index uint32) int32 {
5454
switch statMin {
5555
case true:
5656
switch index {
@@ -84,14 +84,14 @@ type AlternatePassiveAddition struct {
8484
AlternateTreeVersionsKey uint32 `json:"AlternateTreeVersionsKey"`
8585
SpawnWeight uint32 `json:"SpawnWeight"`
8686
StatsKeys []uint32 `json:"StatsKeys"`
87-
Stat1Min uint32 `json:"Stat1Min"`
88-
Stat1Max uint32 `json:"Stat1Max"`
89-
Stat2Min uint32 `json:"Var6"`
90-
Stat2Max uint32 `json:"Var7"`
87+
Stat1Min int32 `json:"Stat1Min"`
88+
Stat1Max int32 `json:"Stat1Max"`
89+
Stat2Min int32 `json:"Var6"`
90+
Stat2Max int32 `json:"Var7"`
9191
PassiveType []PassiveSkillType `json:"PassiveType"`
9292
}
9393

94-
func (a *AlternatePassiveAddition) GetStatMinMax(statMin bool, index uint32) uint32 {
94+
func (a *AlternatePassiveAddition) GetStatMinMax(statMin bool, index uint32) int32 {
9595
switch statMin {
9696
case true:
9797
switch index {

0 commit comments

Comments
 (0)