From 83f6a4e28ae92db3d615470e9d7600c5b2631540 Mon Sep 17 00:00:00 2001 From: Joseph Fortman Date: Wed, 12 Aug 2020 21:36:19 -0500 Subject: [PATCH 1/3] Basic randomizing functionality for Gems.txt. Gems shuffle their color properties while maintaining their tier (chipped, flawed, etc) --- internal/d2mod/randomizer/randomizer.go | 77 ++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/internal/d2mod/randomizer/randomizer.go b/internal/d2mod/randomizer/randomizer.go index 31a294f..1cca8bb 100644 --- a/internal/d2mod/randomizer/randomizer.go +++ b/internal/d2mod/randomizer/randomizer.go @@ -58,6 +58,7 @@ func Run(cfg *config.Data, d2files d2fs.Files) { randomizeSetProps(s) randomizeSetItemsProps(s) randomizeRWProps(s) + randomizeGemAndRuneProps(s) } func getRandomOptions(cfg *config.Data) config.RandomOptions { @@ -78,6 +79,8 @@ func getRandomOptions(cfg *config.Data) config.RandomOptions { } defaultCfg.PerfectProps = cfg.RandomOptions.PerfectProps defaultCfg.UseOSkills = cfg.RandomOptions.UseOSkills + // TODO: add configuration for Gems and Runes + //defaultCfg.RandomizeRunes = cfg.RandomOptions.RandomizeRunes cfg.RandomOptions.Seed = defaultCfg.Seed return defaultCfg @@ -109,9 +112,10 @@ func getAllProps(opts config.RandomOptions, d2files d2fs.Files) (Props, Items) { props = append(props, runeWordProps...) items = append(items, runewords...) - // gemProps, gems = getAllGemsProps(d2files); - // props = append(props, gemProps...) - // items = append(items, gems...) + // do not add gem & rune properties to global shuffle + // gemProps, gems := getAllGemsAndRunes(p) + // props = append(props, gemProps...) + // items = append(items, gems...) return props, items } @@ -265,6 +269,73 @@ func getRunewordLevel(row []string, miscLevels map[string]int) int { return getMaxInt(runeLevels) } +func getAllGemsAndRunes(p propGetter) (Props, Items) { + p.fileName = gems.FileName + p.propOffset = gems.WeaponMod1Code + p.levelOffset = -1 + p.nameOffset = gems.Name + return getProps(p) +} + +func randomizeGemAndRuneProps(s scrambler) { + s.fileName = gems.FileName + s.propOffset = gems.NumMods + + // do gem shuffle by category/color + shuffleGemsByColor(s) + + // shuffle rune properties + shuffleRuneProperties(s) +} + +func shuffleGemsByColor(s scrambler) { + f := s.d2files.Get(s.fileName) + origRows := f.Rows + + // 5 rows = 1 color + // 7 colors total + order := makeRange(0, 6) + rand.Shuffle(len(order), func(i, j int) { order[i], order[j] = order[j], order[i] }) + + for i, o := range order { + for j := 0; j < 5; j++ { + swapGemPropertiesFromCache(s, f, origRows, (i*5)+j, (o*5)+j) + } + } +} + +func shuffleRuneProperties(s scrambler) { + f := s.d2files.Get(s.fileName) + origRows := f.Rows + + const firstRuneRow = 36 + const lastRuneRow = 68 + order := makeRange(firstRuneRow, lastRuneRow) + rand.Shuffle(len(order), func(i, j int) { order[i], order[j] = order[j], order[i] }) + + for i := firstRuneRow; i <= lastRuneRow; i++ { + swapGemPropertiesFromCache(s, f, origRows, i, order[i-firstRuneRow]) + } +} + +func swapGemPropertiesFromCache(s scrambler, f *d2fs.File, origRows [][]string, destRow int, sourceRow int) { + //fmt.Printf("Swapping\n%+v\nWith\n%+v\n", f.Rows[destRow], origRows[sourceRow]) + for i := range f.Rows[destRow] { + if i < s.propOffset { + continue + } + f.Rows[destRow][i] = origRows[sourceRow][i] + } +} + +func makeRange(min, max int) []int { + a := make([]int, max-min+1) + for i := range a { + a[i] = min + i + } + return a +} + // Get Gem Props func getAllGemsProps(d2files d2fs.Files) Props { f := d2files.Get(gems.FileName) From ee4d5871d61ec49bdd77f86e83ade1a61c72edf7 Mon Sep 17 00:00:00 2001 From: Joseph Fortman Date: Wed, 12 Aug 2020 22:50:01 -0500 Subject: [PATCH 2/3] Gems shuffling wihtin tier, separate from the color (eg, chip topaz diff norm topaz) --- internal/d2mod/randomizer/randomizer.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/internal/d2mod/randomizer/randomizer.go b/internal/d2mod/randomizer/randomizer.go index 1cca8bb..6c19e3c 100644 --- a/internal/d2mod/randomizer/randomizer.go +++ b/internal/d2mod/randomizer/randomizer.go @@ -282,7 +282,8 @@ func randomizeGemAndRuneProps(s scrambler) { s.propOffset = gems.NumMods // do gem shuffle by category/color - shuffleGemsByColor(s) + //shuffleGemsByColor(s) + shuffleGemsByTier(s) // shuffle rune properties shuffleRuneProperties(s) @@ -304,6 +305,27 @@ func shuffleGemsByColor(s scrambler) { } } +func shuffleGemsByTier(s scrambler) { + f := s.d2files.Get(s.fileName) + origRows := f.Rows + + // 5 rows = 1 color + // 7 colors total + order := [][]int{makeRange(0, 6), makeRange(0, 6), makeRange(0, 6), makeRange(0, 6), makeRange(0, 6)} + + // each tier has their own order + for tier := 0; tier < len(order); tier++ { + rand.Shuffle(len(order[tier]), func(i, j int) { order[tier][i], order[tier][j] = order[tier][j], order[tier][i] }) + } + + // progresses sequentially through 7 chips, then 7 flawed, etc. + for i, o := range order { + for j := 0; j < 7; j++ { + swapGemPropertiesFromCache(s, f, origRows, (j*5)+i, (o[j]*5)+i) + } + } +} + func shuffleRuneProperties(s scrambler) { f := s.d2files.Get(s.fileName) origRows := f.Rows From 4a6814e0f2a3858627c21c8edf4d56a1a33fe5c4 Mon Sep 17 00:00:00 2001 From: Joseph Fortman Date: Thu, 13 Aug 2020 09:13:28 -0500 Subject: [PATCH 3/3] Implement deep copy of f.Rows --- internal/d2mod/randomizer/randomizer.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/internal/d2mod/randomizer/randomizer.go b/internal/d2mod/randomizer/randomizer.go index 6c19e3c..498376a 100644 --- a/internal/d2mod/randomizer/randomizer.go +++ b/internal/d2mod/randomizer/randomizer.go @@ -291,7 +291,11 @@ func randomizeGemAndRuneProps(s scrambler) { func shuffleGemsByColor(s scrambler) { f := s.d2files.Get(s.fileName) - origRows := f.Rows + origRows := make([][]string, len(f.Rows)) + for i := range origRows { + origRows[i] = make([]string, len(f.Rows[i])) + copy(origRows[i], f.Rows[i]) + } // 5 rows = 1 color // 7 colors total @@ -307,7 +311,11 @@ func shuffleGemsByColor(s scrambler) { func shuffleGemsByTier(s scrambler) { f := s.d2files.Get(s.fileName) - origRows := f.Rows + origRows := make([][]string, len(f.Rows)) + for i := range origRows { + origRows[i] = make([]string, len(f.Rows[i])) + copy(origRows[i], f.Rows[i]) + } // 5 rows = 1 color // 7 colors total @@ -328,7 +336,11 @@ func shuffleGemsByTier(s scrambler) { func shuffleRuneProperties(s scrambler) { f := s.d2files.Get(s.fileName) - origRows := f.Rows + origRows := make([][]string, len(f.Rows)) + for i := range origRows { + origRows[i] = make([]string, len(f.Rows[i])) + copy(origRows[i], f.Rows[i]) + } const firstRuneRow = 36 const lastRuneRow = 68