From c09f12cc21c8ae42ec175d58f0135d80e10d8d3e Mon Sep 17 00:00:00 2001 From: ducc Date: Thu, 9 Jan 2025 22:11:17 -0500 Subject: [PATCH 01/25] Skeleton --- internal/character/sparkle/data.go | 164 +++++++++++++++++ internal/character/sparkle/sparkle.go | 54 ++++++ internal/character/sparkle/stats.go | 225 ++++++++++++++++++++++++ internal/character/sparkle/talent.go | 5 + internal/character/sparkle/technique.go | 10 ++ internal/character/sparkle/traces.go | 5 + pkg/key/character.go | 1 + pkg/simulation/imports.go | 1 + 8 files changed, 465 insertions(+) create mode 100644 internal/character/sparkle/data.go create mode 100644 internal/character/sparkle/sparkle.go create mode 100644 internal/character/sparkle/stats.go create mode 100644 internal/character/sparkle/talent.go create mode 100644 internal/character/sparkle/technique.go create mode 100644 internal/character/sparkle/traces.go diff --git a/internal/character/sparkle/data.go b/internal/character/sparkle/data.go new file mode 100644 index 00000000..b0d0e4ea --- /dev/null +++ b/internal/character/sparkle/data.go @@ -0,0 +1,164 @@ +// Code generated by "charstat"; DO NOT EDIT. + +package sparkle + +import ( + "github.com/simimpact/srsim/pkg/engine/prop" + "github.com/simimpact/srsim/pkg/engine/target/character" +) + +var promotions = []character.PromotionData{ + { + MaxLevel: 20, + ATKBase: 71.28, + ATKAdd: 3.564, + DEFBase: 66, + DEFAdd: 3.3, + HPBase: 190.08, + HPAdd: 9.504, + SPD: 101, + CritChance: 0.05, + CritDMG: 0.5, + Aggro: 100, + }, + { + MaxLevel: 30, + ATKBase: 99.792, + ATKAdd: 3.564, + DEFBase: 92.4, + DEFAdd: 3.3, + HPBase: 266.112, + HPAdd: 9.504, + SPD: 101, + CritChance: 0.05, + CritDMG: 0.5, + Aggro: 100, + }, + { + MaxLevel: 40, + ATKBase: 128.304, + ATKAdd: 3.564, + DEFBase: 118.8, + DEFAdd: 3.3, + HPBase: 342.144, + HPAdd: 9.504, + SPD: 101, + CritChance: 0.05, + CritDMG: 0.5, + Aggro: 100, + }, + { + MaxLevel: 50, + ATKBase: 156.816, + ATKAdd: 3.564, + DEFBase: 145.2, + DEFAdd: 3.3, + HPBase: 418.176, + HPAdd: 9.504, + SPD: 101, + CritChance: 0.05, + CritDMG: 0.5, + Aggro: 100, + }, + { + MaxLevel: 60, + ATKBase: 185.328, + ATKAdd: 3.564, + DEFBase: 171.6, + DEFAdd: 3.3, + HPBase: 494.208, + HPAdd: 9.504, + SPD: 101, + CritChance: 0.05, + CritDMG: 0.5, + Aggro: 100, + }, + { + MaxLevel: 70, + ATKBase: 213.84, + ATKAdd: 3.564, + DEFBase: 198, + DEFAdd: 3.3, + HPBase: 570.24, + HPAdd: 9.504, + SPD: 101, + CritChance: 0.05, + CritDMG: 0.5, + Aggro: 100, + }, + { + MaxLevel: 80, + ATKBase: 242.352, + ATKAdd: 3.564, + DEFBase: 224.4, + DEFAdd: 3.3, + HPBase: 646.272, + HPAdd: 9.504, + SPD: 101, + CritChance: 0.05, + CritDMG: 0.5, + Aggro: 100, + }, +} + +var traces = character.TraceMap{ + "101": { + Ascension: 2, + }, + "102": { + Ascension: 4, + }, + "103": { + Ascension: 6, + }, + "201": { + Stat: prop.HPPercent, + Amount: 0.04, + Level: 1, + }, + "202": { + Stat: prop.CritDMG, + Amount: 0.053, + Ascension: 2, + }, + "203": { + Stat: prop.HPPercent, + Amount: 0.04, + Ascension: 3, + }, + "204": { + Stat: prop.EffectRES, + Amount: 0.04, + Ascension: 3, + }, + "205": { + Stat: prop.HPPercent, + Amount: 0.06, + Ascension: 4, + }, + "206": { + Stat: prop.CritDMG, + Amount: 0.08, + Ascension: 5, + }, + "207": { + Stat: prop.HPPercent, + Amount: 0.06, + Ascension: 5, + }, + "208": { + Stat: prop.EffectRES, + Amount: 0.06, + Ascension: 6, + }, + "209": { + Stat: prop.CritDMG, + Amount: 0.107, + Level: 75, + }, + "210": { + Stat: prop.HPPercent, + Amount: 0.08, + Level: 80, + }, +} \ No newline at end of file diff --git a/internal/character/sparkle/sparkle.go b/internal/character/sparkle/sparkle.go new file mode 100644 index 00000000..a17b709d --- /dev/null +++ b/internal/character/sparkle/sparkle.go @@ -0,0 +1,54 @@ +package sparkle + +import ( + "github.com/simimpact/srsim/pkg/engine" + "github.com/simimpact/srsim/pkg/engine/info" + "github.com/simimpact/srsim/pkg/engine/target/character" + "github.com/simimpact/srsim/pkg/key" + "github.com/simimpact/srsim/pkg/model" +) + +func init() { + character.Register(key.Sparkle, character.Config{ + Create: NewInstance, + Rarity: 5, + Element: model.DamageType_QUANTUM, + Path: model.Path_HARMONY, + MaxEnergy: 110, + Promotions: promotions, + Traces: traces, + SkillInfo: character.SkillInfo{ + Attack: character.Attack{ + SPAdd: 1, + TargetType: model.TargetType_ENEMIES, + }, + Skill: character.Skill{ + SPNeed: 1, + TargetType: model.TargetType_ALLIES, + }, + Ult: character.Ult{ + TargetType: model.TargetType_ALLIES, + }, + Technique: character.Technique{ + TargetType: model.TargetType_SELF, + IsAttack: false, + }, + }, + }) +} + +type char struct { + engine engine.Engine + id key.TargetID + info info.Character +} + +func NewInstance(engine engine.Engine, id key.TargetID, charInfo info.Character) info.CharInstance { + c := &char{ + engine: engine, + id: id, + info: charInfo, + } + + return c +} diff --git a/internal/character/sparkle/stats.go b/internal/character/sparkle/stats.go new file mode 100644 index 00000000..84fa1ca4 --- /dev/null +++ b/internal/character/sparkle/stats.go @@ -0,0 +1,225 @@ +package sparkle + +var ( + Basic_ATK_0 = []float64{ + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1, + 1.1, + 1.2, + 1.3, + } + Skill_0 = []float64{ + 0.12, + 0.132, + 0.144, + 0.156, + 0.168, + 0.18, + 0.195, + 0.21, + 0.225, + 0.24, + 0.252, + 0.264, + 0.276, + 0.288, + 0.3, + } + Skill_1 = []float64{ + 0.27, + 0.288, + 0.306, + 0.324, + 0.342, + 0.36, + 0.3825, + 0.405, + 0.4275, + 0.45, + 0.468, + 0.486, + 0.504, + 0.522, + 0.54, + } + Skill_2 = []float64{ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + } + Skill_3 = []float64{ + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + } + Ultimate_0 = []float64{ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + } + Ultimate_1 = []float64{ + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + } + Ultimate_2 = []float64{ + 0.06, + 0.064, + 0.068, + 0.072, + 0.076, + 0.08, + 0.085, + 0.09, + 0.095, + 0.1, + 0.104, + 0.108, + 0.112, + 0.116, + 0.12, + } + Ultimate_3 = []float64{ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + } + Talent_0 = []float64{ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + } + Talent_1 = []float64{ + 0.03, + 0.033, + 0.036, + 0.039, + 0.042, + 0.045, + 0.04875, + 0.0525, + 0.05625, + 0.06, + 0.063, + 0.066, + 0.069, + 0.072, + 0.075, + } + Talent_2 = []float64{ + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + } + Talent_3 = []float64{ + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + } + Technique_0 = []float64{ + 3, + } + Technique_1 = []float64{ + 20, + } +) diff --git a/internal/character/sparkle/talent.go b/internal/character/sparkle/talent.go new file mode 100644 index 00000000..21788cc8 --- /dev/null +++ b/internal/character/sparkle/talent.go @@ -0,0 +1,5 @@ +package sparkle + +func (c *char) initTalent() { + +} diff --git a/internal/character/sparkle/technique.go b/internal/character/sparkle/technique.go new file mode 100644 index 00000000..5635b0e1 --- /dev/null +++ b/internal/character/sparkle/technique.go @@ -0,0 +1,10 @@ +package sparkle + +import ( + "github.com/simimpact/srsim/pkg/engine/info" + "github.com/simimpact/srsim/pkg/key" +) + +func (c *char) Technique(target key.TargetID, state info.ActionState) { + +} diff --git a/internal/character/sparkle/traces.go b/internal/character/sparkle/traces.go new file mode 100644 index 00000000..f5ccc2cd --- /dev/null +++ b/internal/character/sparkle/traces.go @@ -0,0 +1,5 @@ +package sparkle + +const ( + A2 = "sparkle-a2" +) diff --git a/pkg/key/character.go b/pkg/key/character.go index e8c74ecb..10d63f9c 100644 --- a/pkg/key/character.go +++ b/pkg/key/character.go @@ -25,6 +25,7 @@ const ( DummyCharacter Character = "dummy_character" Sampo Character = "sampo" Serval Character = "serval" + Sparkle Character = "sparkle" Sushang Character = "sushang" Natasha Character = "natasha" March7th Character = "march7th" diff --git a/pkg/simulation/imports.go b/pkg/simulation/imports.go index 78e8c59e..21c15806 100644 --- a/pkg/simulation/imports.go +++ b/pkg/simulation/imports.go @@ -27,6 +27,7 @@ import ( _ "github.com/simimpact/srsim/internal/character/seele" _ "github.com/simimpact/srsim/internal/character/serval" _ "github.com/simimpact/srsim/internal/character/silverwolf" + _ "github.com/simimpact/srsim/internal/character/sparkle" _ "github.com/simimpact/srsim/internal/character/sushang" _ "github.com/simimpact/srsim/internal/character/xueyi" _ "github.com/simimpact/srsim/internal/enemy/dummy" From bf1341e5b7abb8ae82252ecbb9c31d03b28ca711 Mon Sep 17 00:00:00 2001 From: ducc Date: Thu, 9 Jan 2025 22:11:26 -0500 Subject: [PATCH 02/25] Basic atk impl --- internal/character/sparkle/attack.go | 38 ++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 internal/character/sparkle/attack.go diff --git a/internal/character/sparkle/attack.go b/internal/character/sparkle/attack.go new file mode 100644 index 00000000..ffd4d511 --- /dev/null +++ b/internal/character/sparkle/attack.go @@ -0,0 +1,38 @@ +package sparkle + +import ( + "github.com/simimpact/srsim/pkg/engine/info" + "github.com/simimpact/srsim/pkg/key" + "github.com/simimpact/srsim/pkg/model" +) + +const ( + SparkleBasic key.Attack = "sparkle-basic" +) + +func (c *char) Attack(target key.TargetID, state info.ActionState) { + // A2 + if c.info.Traces["101"] { + c.engine.ModifyEnergy(info.ModifyAttribute{ + Key: A2, + Amount: 10, + Target: c.id, + Source: c.id, + }) + } + + c.engine.Attack(info.Attack{ + Key: SparkleBasic, + Source: c.id, + Targets: []key.TargetID{target}, + DamageType: model.DamageType_QUANTUM, + AttackType: model.AttackType_NORMAL, + BaseDamage: info.DamageMap{ + model.DamageFormula_BY_ATK: Basic_ATK_0[c.info.AttackLevelIndex()], + }, + EnergyGain: 20, + StanceDamage: 30, + }) + + state.EndAttack() +} From 5fdaff81ea6477673b6dec6b98cb06ad5e5e6710 Mon Sep 17 00:00:00 2001 From: ducc Date: Thu, 9 Jan 2025 22:11:32 -0500 Subject: [PATCH 03/25] Skill impl --- internal/character/sparkle/skill.go | 101 ++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 internal/character/sparkle/skill.go diff --git a/internal/character/sparkle/skill.go b/internal/character/sparkle/skill.go new file mode 100644 index 00000000..e80457bd --- /dev/null +++ b/internal/character/sparkle/skill.go @@ -0,0 +1,101 @@ +package sparkle + +import ( + "github.com/simimpact/srsim/pkg/engine/info" + "github.com/simimpact/srsim/pkg/engine/modifier" + "github.com/simimpact/srsim/pkg/engine/prop" + "github.com/simimpact/srsim/pkg/key" + "github.com/simimpact/srsim/pkg/model" +) + +const ( + SparkleSkillBuff = "SparkleSkillBuff" + Dreamdiver = "dreamdiver" +) + +func init() { + modifier.Register(SparkleSkillBuff, modifier.Config{ + Stacking: modifier.ReplaceBySource, + CanDispel: true, + StatusType: model.StatusType_STATUS_BUFF, + Listeners: modifier.Listeners{ + OnAdd: addActualBuff, + OnRemove: A4Extend, + }, + TickMoment: modifier.ModifierPhase1End, + Duration: 1, + }) + + modifier.Register(Dreamdiver, modifier.Config{ + Stacking: modifier.Replace, + CanDispel: true, + StatusType: model.StatusType_STATUS_BUFF, + Duration: 1, + }) +} + +type SparkleBuffState struct { + cdmgBuff float64 +} + +func (c *char) Skill(target key.TargetID, state info.ActionState) { + sparkle := c.engine.Stats(c.id) + sparkleCdmg := sparkle.GetProperty(prop.CritDMG) + proportion := Skill_0[c.info.SkillLevelIndex()] + if c.info.Eidolon >= 6 { + proportion += 0.3 + } + c.engine.AddModifier(target, info.Modifier{ + Name: SparkleSkillBuff, + Source: c.id, + Duration: 1, + State: SparkleBuffState{ + cdmgBuff: proportion*sparkleCdmg + Skill_1[c.info.SkillLevelIndex()], + }, + }) + + // At e6, when using skill sparkle should add skill buff to all teammates with cipher + if c.info.Eidolon >= 6 { + targets := make([]key.TargetID, 4) + for _, char := range c.engine.Characters() { + if c.engine.HasModifier(char, Cipher) { + targets = append(targets, char) + } + } + + for _, char := range targets { + c.engine.AddModifier(char, info.Modifier{ + Name: SparkleSkillBuff, + Source: c.id, + Duration: 1, + State: SparkleBuffState{ + cdmgBuff: proportion*sparkleCdmg + Skill_1[c.info.SkillLevelIndex()], + }, + }) + } + } +} + +func addActualBuff(mod *modifier.Instance) { + mod.Engine().RemoveModifier(mod.Owner(), Dreamdiver) + mod.Engine().AddModifier(mod.Owner(), info.Modifier{ + Name: Dreamdiver, + Source: mod.Source(), + Stats: info.PropMap{ + prop.CritDMG: mod.State().(SparkleBuffState).cdmgBuff, + }, + }) +} + +func A4Extend(mod *modifier.Instance) { + sparkleinfo, _ := mod.Engine().CharacterInfo(mod.Source()) + if sparkleinfo.Traces["102"] { + mod.Engine().AddModifier(mod.Owner(), info.Modifier{ + Name: Dreamdiver, + Source: mod.Source(), + Stats: info.PropMap{ + prop.CritDMG: mod.State().(SparkleBuffState).cdmgBuff, + }, + }) + } +} From 1c6bd1eba115d30cc91724db6b900669a9343851 Mon Sep 17 00:00:00 2001 From: ducc Date: Thu, 9 Jan 2025 22:11:45 -0500 Subject: [PATCH 04/25] Ult impl start --- internal/character/sparkle/ult.go | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 internal/character/sparkle/ult.go diff --git a/internal/character/sparkle/ult.go b/internal/character/sparkle/ult.go new file mode 100644 index 00000000..b4637d66 --- /dev/null +++ b/internal/character/sparkle/ult.go @@ -0,0 +1,32 @@ +package sparkle + +import ( + "github.com/simimpact/srsim/pkg/engine/info" + "github.com/simimpact/srsim/pkg/engine/modifier" + "github.com/simimpact/srsim/pkg/key" +) + +const ( + Cipher = "sparkle-cipher" +) + +func init() { + modifier.Register(Cipher, modifier.Config{ + Stacking: modifier.ReplaceBySource, + CanDispel: false, + Listeners: modifier.Listeners{}, + }) +} + +func (c *char) Ult(target key.TargetID, state info.ActionState) { + spRecover := 4 + if c.info.Eidolon >= 4 { + spRecover += 1 + } + + for _, char := range c.engine.Characters() { + c.engine.AddModifier(char, info.Modifier{ + Name: Cipher, + }) + } +} From d2ffa72cc7e78ccec3c55c57d6ed71410b52fcf2 Mon Sep 17 00:00:00 2001 From: ducc Date: Sat, 11 Jan 2025 17:54:18 -0500 Subject: [PATCH 05/25] E2 implementation --- internal/character/sparkle/eidolon.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 internal/character/sparkle/eidolon.go diff --git a/internal/character/sparkle/eidolon.go b/internal/character/sparkle/eidolon.go new file mode 100644 index 00000000..2ed79f70 --- /dev/null +++ b/internal/character/sparkle/eidolon.go @@ -0,0 +1,24 @@ +package sparkle + +import ( + "github.com/simimpact/srsim/pkg/engine/event" + "github.com/simimpact/srsim/pkg/engine/modifier" + "github.com/simimpact/srsim/pkg/engine/prop" +) + +const ( + E2 = "sparkle-e2" +) + +func init() { + modifier.Register(E2, modifier.Config{ + Stacking: modifier.ReplaceBySource, + Listeners: modifier.Listeners{ + OnBeforeHitAll: E2Callback, + }, + }) +} + +func E2Callback(mod *modifier.Instance, e event.HitStart) { + e.Hit.Defender.AddProperty(E2, prop.DEFPercent, -0.08) +} From 3ded8a7d0cd62934ef5eb2d554cc11d8b08eae50 Mon Sep 17 00:00:00 2001 From: ducc Date: Sat, 11 Jan 2025 17:54:29 -0500 Subject: [PATCH 06/25] Talent implementation --- internal/character/sparkle/talent.go | 58 ++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/internal/character/sparkle/talent.go b/internal/character/sparkle/talent.go index 21788cc8..915dd88d 100644 --- a/internal/character/sparkle/talent.go +++ b/internal/character/sparkle/talent.go @@ -1,5 +1,63 @@ package sparkle +import ( + "github.com/simimpact/srsim/pkg/engine/event" + "github.com/simimpact/srsim/pkg/engine/info" + "github.com/simimpact/srsim/pkg/engine/modifier" + "github.com/simimpact/srsim/pkg/engine/prop" +) + +const ( + SparkleTalent = "red-herring" +) + +func init() { + modifier.Register(SparkleTalent, modifier.Config{ + Stacking: modifier.ReplaceBySource, + MaxCount: 3, + Listeners: modifier.Listeners{ + OnAdd: adjustBuff, + }, + }) +} + +type talentState struct { + DmgPercentPerStack float64 + isE2 bool +} + func (c *char) initTalent() { + c.engine.Events().SPChange.Subscribe(c.talent) + //TODO: Modify maximum sp count once the api for doing so is defined. +} + +func (c *char) talent(e event.SPChange) { + spChange := e.OldSP - e.NewSP + if spChange > 0 && c.engine.IsCharacter(e.Source) { + for _, teammate := range c.engine.Characters() { + c.engine.AddModifier(teammate, info.Modifier{ + Name: SparkleTalent, + Source: c.id, + Duration: 2, + Count: float64(spChange), + State: talentState{ + DmgPercentPerStack: Talent_1[c.info.TalentLevelIndex()], + isE2: c.info.Eidolon >= 2, + }, + }) + } + } +} +func adjustBuff(mod *modifier.Instance) { + curstate := mod.State().(talentState) + // TODO: Maybe refactor the two buffs to be tied to the same modifier like in dm? end res is same but might be more readable + mod.SetProperty(prop.AllDamagePercent, curstate.DmgPercentPerStack*mod.Count()) + if curstate.isE2 { + mod.Engine().AddModifier(mod.Owner(), info.Modifier{ + Name: E2, + Source: mod.Source(), + CanDispel: false, + }) + } } From 6528be45d88afc8bfa86f86858412b8ae607ab5d Mon Sep 17 00:00:00 2001 From: ducc Date: Sat, 11 Jan 2025 17:54:39 -0500 Subject: [PATCH 07/25] trace impl skeleton --- internal/character/sparkle/traces.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/internal/character/sparkle/traces.go b/internal/character/sparkle/traces.go index f5ccc2cd..58a72a67 100644 --- a/internal/character/sparkle/traces.go +++ b/internal/character/sparkle/traces.go @@ -2,4 +2,11 @@ package sparkle const ( A2 = "sparkle-a2" + A6 = "sparkle-a6" ) + +func (c *char) initTraces() { + if c.info.Traces["103"] { + + } +} From 65626d2087735eae22a87ef1bcd8bf7c7950b894 Mon Sep 17 00:00:00 2001 From: ducc Date: Sat, 11 Jan 2025 17:54:55 -0500 Subject: [PATCH 08/25] Most of Ult implementation --- internal/character/sparkle/ult.go | 53 ++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/internal/character/sparkle/ult.go b/internal/character/sparkle/ult.go index b4637d66..35fac83a 100644 --- a/internal/character/sparkle/ult.go +++ b/internal/character/sparkle/ult.go @@ -3,7 +3,9 @@ package sparkle import ( "github.com/simimpact/srsim/pkg/engine/info" "github.com/simimpact/srsim/pkg/engine/modifier" + "github.com/simimpact/srsim/pkg/engine/prop" "github.com/simimpact/srsim/pkg/key" + "github.com/simimpact/srsim/pkg/model" ) const ( @@ -12,9 +14,10 @@ const ( func init() { modifier.Register(Cipher, modifier.Config{ - Stacking: modifier.ReplaceBySource, - CanDispel: false, - Listeners: modifier.Listeners{}, + Stacking: modifier.ReplaceBySource, + CanDispel: false, + Duration: 2, + StatusType: model.StatusType_STATUS_BUFF, }) } @@ -23,10 +26,50 @@ func (c *char) Ult(target key.TargetID, state info.ActionState) { if c.info.Eidolon >= 4 { spRecover += 1 } - + buffdur := 2 + atkBuff := 0.0 + if c.info.Eidolon >= 1 { + buffdur += 1 + atkBuff = 0.4 + } for _, char := range c.engine.Characters() { c.engine.AddModifier(char, info.Modifier{ - Name: Cipher, + Name: Cipher, + Source: c.id, + Duration: buffdur, + Stats: info.PropMap{ + prop.ATKPercent: atkBuff, + }, + }) + } + + if c.info.Eidolon >= 6 { + alliesWithCritBuff := c.engine.Retarget(info.Retarget{ + Targets: c.engine.Characters(), + Filter: func(target key.TargetID) bool { + return c.engine.HasModifier(target, SparkleSkillBuff) || c.engine.HasModifier(target, Dreamdiver) + }, + Max: 1, + IncludeLimbo: false, }) + if len(alliesWithCritBuff) >= 0 { + sparkle := c.engine.Stats(c.id) + sparkleCdmg := sparkle.GetProperty(prop.CritDMG) + proportion := Skill_0[c.info.SkillLevelIndex()] + if c.info.Eidolon >= 6 { + proportion += 0.3 + } + + for _, char := range c.engine.Characters() { + c.engine.AddModifier(char, info.Modifier{ + Name: Dreamdiver, + Source: c.id, + Duration: 1, + Stats: info.PropMap{ + prop.CritDMG: sparkleCdmg * proportion, + }, + }) + } + } } } From f9dd26645b95495bb8761f0cccd29259fbe61323 Mon Sep 17 00:00:00 2001 From: ducc Date: Sat, 11 Jan 2025 18:52:03 -0500 Subject: [PATCH 09/25] a6 implementation --- internal/character/sparkle/traces.go | 45 ++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/internal/character/sparkle/traces.go b/internal/character/sparkle/traces.go index 58a72a67..e2a1f896 100644 --- a/internal/character/sparkle/traces.go +++ b/internal/character/sparkle/traces.go @@ -1,12 +1,57 @@ package sparkle +import ( + "github.com/simimpact/srsim/pkg/engine/event" + "github.com/simimpact/srsim/pkg/engine/info" + "github.com/simimpact/srsim/pkg/engine/prop" + "github.com/simimpact/srsim/pkg/key" + "github.com/simimpact/srsim/pkg/model" +) + const ( A2 = "sparkle-a2" A6 = "sparkle-a6" ) +var ( + buffMap = map[int]float64{1: 0.05, 2: 0.15, 3: 0.3, 0: 0.0} +) + func (c *char) initTraces() { + c.engine.Events().BattleStart.Subscribe(c.initA6) +} + +func (c *char) initA6(e event.BattleStart) { if c.info.Traces["103"] { + qua := c.engine.Retarget(info.Retarget{ + Targets: c.engine.Characters(), + Filter: func(target key.TargetID) bool { + charinfo, _ := c.engine.CharacterInfo(target) + return charinfo.Element == model.DamageType_QUANTUM + }, + IncludeLimbo: false, + }) + + quacount := len(qua) + if quacount < 0 { + quacount = 0 + } else if quacount > 3 { + quacount = 3 + } + for _, char := range c.engine.Characters() { + charinfo, _ := c.engine.CharacterInfo(char) + atkBuff := 0.15 + if charinfo.Element == model.DamageType_QUANTUM { + atkBuff += buffMap[quacount] + } + c.engine.AddModifier(char, info.Modifier{ + Name: A6, + Source: c.id, + Stats: info.PropMap{ + prop.ATKPercent: atkBuff, + }, + }) + } } } From cc1a35d67ddc4bb0409852f3d51020c2c7562a8c Mon Sep 17 00:00:00 2001 From: ducc Date: Sat, 11 Jan 2025 18:58:27 -0500 Subject: [PATCH 10/25] technique impl --- internal/character/sparkle/technique.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/internal/character/sparkle/technique.go b/internal/character/sparkle/technique.go index 5635b0e1..66f8b4ba 100644 --- a/internal/character/sparkle/technique.go +++ b/internal/character/sparkle/technique.go @@ -5,6 +5,14 @@ import ( "github.com/simimpact/srsim/pkg/key" ) +const ( + technique = "sparkle-technique" +) + func (c *char) Technique(target key.TargetID, state info.ActionState) { - + c.engine.ModifySP(info.ModifySP{ + Source: c.id, + Key: technique, + Amount: 3, + }) } From 92827bc69217eff974c221b59123bd4ceb6a0622 Mon Sep 17 00:00:00 2001 From: ducc Date: Sat, 11 Jan 2025 19:02:24 -0500 Subject: [PATCH 11/25] added action advance to sparkle skill --- internal/character/sparkle/skill.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/internal/character/sparkle/skill.go b/internal/character/sparkle/skill.go index e80457bd..78537b74 100644 --- a/internal/character/sparkle/skill.go +++ b/internal/character/sparkle/skill.go @@ -11,6 +11,7 @@ import ( const ( SparkleSkillBuff = "SparkleSkillBuff" Dreamdiver = "dreamdiver" + SparkleSkill = "sparkle-skill" ) func init() { @@ -39,6 +40,13 @@ type SparkleBuffState struct { } func (c *char) Skill(target key.TargetID, state info.ActionState) { + c.engine.ModifyGaugeNormalized(info.ModifyAttribute{ + Key: SparkleSkill, + Target: target, + Source: c.id, + Amount: -0.5, + }) + sparkle := c.engine.Stats(c.id) sparkleCdmg := sparkle.GetProperty(prop.CritDMG) proportion := Skill_0[c.info.SkillLevelIndex()] From 5acaa823b21f3bd532c012c14b8e6fb627e12709 Mon Sep 17 00:00:00 2001 From: ducc Date: Sat, 11 Jan 2025 23:01:47 -0500 Subject: [PATCH 12/25] linting --- internal/character/sparkle/attack.go | 2 +- internal/character/sparkle/skill.go | 15 ++- internal/character/sparkle/stats.go | 154 ++------------------------- 3 files changed, 19 insertions(+), 152 deletions(-) diff --git a/internal/character/sparkle/attack.go b/internal/character/sparkle/attack.go index ffd4d511..95679019 100644 --- a/internal/character/sparkle/attack.go +++ b/internal/character/sparkle/attack.go @@ -28,7 +28,7 @@ func (c *char) Attack(target key.TargetID, state info.ActionState) { DamageType: model.DamageType_QUANTUM, AttackType: model.AttackType_NORMAL, BaseDamage: info.DamageMap{ - model.DamageFormula_BY_ATK: Basic_ATK_0[c.info.AttackLevelIndex()], + model.DamageFormula_BY_ATK: basic[c.info.AttackLevelIndex()], }, EnergyGain: 20, StanceDamage: 30, diff --git a/internal/character/sparkle/skill.go b/internal/character/sparkle/skill.go index 78537b74..edf231db 100644 --- a/internal/character/sparkle/skill.go +++ b/internal/character/sparkle/skill.go @@ -49,7 +49,7 @@ func (c *char) Skill(target key.TargetID, state info.ActionState) { sparkle := c.engine.Stats(c.id) sparkleCdmg := sparkle.GetProperty(prop.CritDMG) - proportion := Skill_0[c.info.SkillLevelIndex()] + proportion := skillCdmgScaling[c.info.SkillLevelIndex()] if c.info.Eidolon >= 6 { proportion += 0.3 } @@ -58,13 +58,13 @@ func (c *char) Skill(target key.TargetID, state info.ActionState) { Source: c.id, Duration: 1, State: SparkleBuffState{ - cdmgBuff: proportion*sparkleCdmg + Skill_1[c.info.SkillLevelIndex()], + cdmgBuff: proportion*sparkleCdmg + skillFlatCdmg[c.info.SkillLevelIndex()], }, }) // At e6, when using skill sparkle should add skill buff to all teammates with cipher if c.info.Eidolon >= 6 { - targets := make([]key.TargetID, 4) + targets := make([]key.TargetID, 0, 4) for _, char := range c.engine.Characters() { if c.engine.HasModifier(char, Cipher) { targets = append(targets, char) @@ -77,11 +77,18 @@ func (c *char) Skill(target key.TargetID, state info.ActionState) { Source: c.id, Duration: 1, State: SparkleBuffState{ - cdmgBuff: proportion*sparkleCdmg + Skill_1[c.info.SkillLevelIndex()], + cdmgBuff: proportion*sparkleCdmg + skillFlatCdmg[c.info.SkillLevelIndex()], }, }) } } + + c.engine.ModifyEnergy(info.ModifyAttribute{ + Key: SparkleSkill, + Source: c.id, + Target: c.id, + Amount: 30, + }) } func addActualBuff(mod *modifier.Instance) { diff --git a/internal/character/sparkle/stats.go b/internal/character/sparkle/stats.go index 84fa1ca4..99173e37 100644 --- a/internal/character/sparkle/stats.go +++ b/internal/character/sparkle/stats.go @@ -1,7 +1,7 @@ package sparkle var ( - Basic_ATK_0 = []float64{ + basic = []float64{ 0.5, 0.6, 0.7, @@ -12,7 +12,7 @@ var ( 1.2, 1.3, } - Skill_0 = []float64{ + skillCdmgScaling = []float64{ 0.12, 0.132, 0.144, @@ -29,7 +29,7 @@ var ( 0.288, 0.3, } - Skill_1 = []float64{ + skillFlatCdmg = []float64{ 0.27, 0.288, 0.306, @@ -46,75 +46,8 @@ var ( 0.522, 0.54, } - Skill_2 = []float64{ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - } - Skill_3 = []float64{ - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - } - Ultimate_0 = []float64{ - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - } - Ultimate_1 = []float64{ - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - 4, - } - Ultimate_2 = []float64{ + + ultimate = []float64{ 0.06, 0.064, 0.068, @@ -131,41 +64,8 @@ var ( 0.116, 0.12, } - Ultimate_3 = []float64{ - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - } - Talent_0 = []float64{ - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - } - Talent_1 = []float64{ + + talent = []float64{ 0.03, 0.033, 0.036, @@ -182,44 +82,4 @@ var ( 0.072, 0.075, } - Talent_2 = []float64{ - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - 2, - } - Talent_3 = []float64{ - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - 3, - } - Technique_0 = []float64{ - 3, - } - Technique_1 = []float64{ - 20, - } ) From 2fc898e32cc7d8d67914f4f4fe1c97e1a93ebab4 Mon Sep 17 00:00:00 2001 From: ducc Date: Sat, 11 Jan 2025 23:01:55 -0500 Subject: [PATCH 13/25] Fixed e2 impl --- internal/character/sparkle/eidolon.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/character/sparkle/eidolon.go b/internal/character/sparkle/eidolon.go index 2ed79f70..ae36df68 100644 --- a/internal/character/sparkle/eidolon.go +++ b/internal/character/sparkle/eidolon.go @@ -16,9 +16,10 @@ func init() { Listeners: modifier.Listeners{ OnBeforeHitAll: E2Callback, }, + MaxCount: 3, }) } func E2Callback(mod *modifier.Instance, e event.HitStart) { - e.Hit.Defender.AddProperty(E2, prop.DEFPercent, -0.08) + e.Hit.Defender.AddProperty(E2, prop.DEFPercent, -0.08*mod.Count()) } From aaa699dc02926d1fa2a10c9022a2ead1e49c8db0 Mon Sep 17 00:00:00 2001 From: ducc Date: Sat, 11 Jan 2025 23:02:05 -0500 Subject: [PATCH 14/25] added trace/talent init --- internal/character/sparkle/sparkle.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/character/sparkle/sparkle.go b/internal/character/sparkle/sparkle.go index a17b709d..6b133e67 100644 --- a/internal/character/sparkle/sparkle.go +++ b/internal/character/sparkle/sparkle.go @@ -49,6 +49,7 @@ func NewInstance(engine engine.Engine, id key.TargetID, charInfo info.Character) id: id, info: charInfo, } - + c.initTraces() + c.initTalent() return c } From f92d1d3655e205e0f06194ff7e74abcf5d9b9762 Mon Sep 17 00:00:00 2001 From: ducc Date: Sat, 11 Jan 2025 23:02:32 -0500 Subject: [PATCH 15/25] added ult interaction with talent --- internal/character/sparkle/talent.go | 50 ++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/internal/character/sparkle/talent.go b/internal/character/sparkle/talent.go index 915dd88d..28004352 100644 --- a/internal/character/sparkle/talent.go +++ b/internal/character/sparkle/talent.go @@ -16,7 +16,8 @@ func init() { Stacking: modifier.ReplaceBySource, MaxCount: 3, Listeners: modifier.Listeners{ - OnAdd: adjustBuff, + OnAdd: adjustBuff, + OnRemove: removeE2, }, }) } @@ -28,6 +29,8 @@ type talentState struct { func (c *char) initTalent() { c.engine.Events().SPChange.Subscribe(c.talent) + c.engine.Events().ModifierAdded.Subscribe(c.adjustTalentBuff) + c.engine.Events().ModifierRemoved.Subscribe(c.revertTalentBuff) //TODO: Modify maximum sp count once the api for doing so is defined. } @@ -41,7 +44,7 @@ func (c *char) talent(e event.SPChange) { Duration: 2, Count: float64(spChange), State: talentState{ - DmgPercentPerStack: Talent_1[c.info.TalentLevelIndex()], + DmgPercentPerStack: talent[c.info.TalentLevelIndex()], isE2: c.info.Eidolon >= 2, }, }) @@ -58,6 +61,49 @@ func adjustBuff(mod *modifier.Instance) { Name: E2, Source: mod.Source(), CanDispel: false, + Count: mod.Count(), }) } } + +func (c *char) adjustTalentBuff(e event.ModifierAdded) { + if e.Modifier.Name == Cipher && e.Modifier.Source == c.id { + for _, char := range c.engine.Characters() { + curstacks := c.engine.ModifierStackCount(char, c.id, SparkleTalent) + c.engine.AddModifier(char, info.Modifier{ + Name: SparkleTalent, + Source: c.id, + Duration: 2, + Count: curstacks, + State: talentState{ + DmgPercentPerStack: talent[c.info.TalentLevelIndex()] + ultimate[c.info.UltLevelIndex()], + isE2: c.info.Eidolon >= 2, + }, + }) + } + } +} + +func (c *char) revertTalentBuff(e event.ModifierRemoved) { + if e.Modifier.Name == Cipher && e.Modifier.Source == c.id { + for _, char := range c.engine.Characters() { + curstacks := c.engine.ModifierStackCount(char, c.id, SparkleTalent) + c.engine.AddModifier(char, info.Modifier{ + Name: SparkleTalent, + Source: c.id, + Duration: 2, + Count: curstacks, + State: talentState{ + DmgPercentPerStack: talent[c.info.TalentLevelIndex()], + isE2: c.info.Eidolon >= 2, + }, + }) + } + } +} + +func removeE2(mod *modifier.Instance) { + for _, char := range mod.Engine().Characters() { + mod.Engine().RemoveModifier(char, E2) + } +} From 11f9a957b4eb4216e4618b16cdea9c3bf0a5fad5 Mon Sep 17 00:00:00 2001 From: ducc Date: Sat, 11 Jan 2025 23:02:53 -0500 Subject: [PATCH 16/25] added sp recover and energy recover on ult --- internal/character/sparkle/ult.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/internal/character/sparkle/ult.go b/internal/character/sparkle/ult.go index 35fac83a..df7cae0a 100644 --- a/internal/character/sparkle/ult.go +++ b/internal/character/sparkle/ult.go @@ -10,6 +10,7 @@ import ( const ( Cipher = "sparkle-cipher" + Ult = "sparkle-ult" ) func init() { @@ -26,6 +27,13 @@ func (c *char) Ult(target key.TargetID, state info.ActionState) { if c.info.Eidolon >= 4 { spRecover += 1 } + + c.engine.ModifySP(info.ModifySP{ + Source: c.id, + Key: Ult, + Amount: spRecover, + }) + buffdur := 2 atkBuff := 0.0 if c.info.Eidolon >= 1 { @@ -55,7 +63,7 @@ func (c *char) Ult(target key.TargetID, state info.ActionState) { if len(alliesWithCritBuff) >= 0 { sparkle := c.engine.Stats(c.id) sparkleCdmg := sparkle.GetProperty(prop.CritDMG) - proportion := Skill_0[c.info.SkillLevelIndex()] + proportion := skillCdmgScaling[c.info.SkillLevelIndex()] if c.info.Eidolon >= 6 { proportion += 0.3 } @@ -72,4 +80,11 @@ func (c *char) Ult(target key.TargetID, state info.ActionState) { } } } + + c.engine.ModifyEnergy(info.ModifyAttribute{ + Key: Ult, + Source: c.id, + Target: c.id, + Amount: 5, + }) } From 53b807fcae7836529cae6fa40e1febc7583a46b0 Mon Sep 17 00:00:00 2001 From: ducc Date: Sat, 11 Jan 2025 23:06:46 -0500 Subject: [PATCH 17/25] fixed bad length check --- internal/character/sparkle/ult.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/character/sparkle/ult.go b/internal/character/sparkle/ult.go index df7cae0a..d15f6ede 100644 --- a/internal/character/sparkle/ult.go +++ b/internal/character/sparkle/ult.go @@ -60,7 +60,7 @@ func (c *char) Ult(target key.TargetID, state info.ActionState) { Max: 1, IncludeLimbo: false, }) - if len(alliesWithCritBuff) >= 0 { + if len(alliesWithCritBuff) > 0 { sparkle := c.engine.Stats(c.id) sparkleCdmg := sparkle.GetProperty(prop.CritDMG) proportion := skillCdmgScaling[c.info.SkillLevelIndex()] From 77345ed44dfd283a6389373738640ea89e53fe54 Mon Sep 17 00:00:00 2001 From: ducc Date: Sat, 11 Jan 2025 23:13:12 -0500 Subject: [PATCH 18/25] linting --- internal/character/sparkle/data.go | 42 ++++++++++++++--------------- internal/character/sparkle/skill.go | 10 +++---- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/internal/character/sparkle/data.go b/internal/character/sparkle/data.go index b0d0e4ea..a6f4aa42 100644 --- a/internal/character/sparkle/data.go +++ b/internal/character/sparkle/data.go @@ -112,53 +112,53 @@ var traces = character.TraceMap{ Ascension: 6, }, "201": { - Stat: prop.HPPercent, + Stat: prop.HPPercent, Amount: 0.04, - Level: 1, + Level: 1, }, "202": { - Stat: prop.CritDMG, - Amount: 0.053, + Stat: prop.CritDMG, + Amount: 0.053, Ascension: 2, }, "203": { - Stat: prop.HPPercent, - Amount: 0.04, + Stat: prop.HPPercent, + Amount: 0.04, Ascension: 3, }, "204": { - Stat: prop.EffectRES, - Amount: 0.04, + Stat: prop.EffectRES, + Amount: 0.04, Ascension: 3, }, "205": { - Stat: prop.HPPercent, - Amount: 0.06, + Stat: prop.HPPercent, + Amount: 0.06, Ascension: 4, }, "206": { - Stat: prop.CritDMG, - Amount: 0.08, + Stat: prop.CritDMG, + Amount: 0.08, Ascension: 5, }, "207": { - Stat: prop.HPPercent, - Amount: 0.06, + Stat: prop.HPPercent, + Amount: 0.06, Ascension: 5, }, "208": { - Stat: prop.EffectRES, - Amount: 0.06, + Stat: prop.EffectRES, + Amount: 0.06, Ascension: 6, }, "209": { - Stat: prop.CritDMG, + Stat: prop.CritDMG, Amount: 0.107, - Level: 75, + Level: 75, }, "210": { - Stat: prop.HPPercent, + Stat: prop.HPPercent, Amount: 0.08, - Level: 80, + Level: 80, }, -} \ No newline at end of file +} diff --git a/internal/character/sparkle/skill.go b/internal/character/sparkle/skill.go index edf231db..d9d9e449 100644 --- a/internal/character/sparkle/skill.go +++ b/internal/character/sparkle/skill.go @@ -35,7 +35,7 @@ func init() { }) } -type SparkleBuffState struct { +type SkillBuffState struct { cdmgBuff float64 } @@ -57,7 +57,7 @@ func (c *char) Skill(target key.TargetID, state info.ActionState) { Name: SparkleSkillBuff, Source: c.id, Duration: 1, - State: SparkleBuffState{ + State: SkillBuffState{ cdmgBuff: proportion*sparkleCdmg + skillFlatCdmg[c.info.SkillLevelIndex()], }, }) @@ -76,7 +76,7 @@ func (c *char) Skill(target key.TargetID, state info.ActionState) { Name: SparkleSkillBuff, Source: c.id, Duration: 1, - State: SparkleBuffState{ + State: SkillBuffState{ cdmgBuff: proportion*sparkleCdmg + skillFlatCdmg[c.info.SkillLevelIndex()], }, }) @@ -97,7 +97,7 @@ func addActualBuff(mod *modifier.Instance) { Name: Dreamdiver, Source: mod.Source(), Stats: info.PropMap{ - prop.CritDMG: mod.State().(SparkleBuffState).cdmgBuff, + prop.CritDMG: mod.State().(SkillBuffState).cdmgBuff, }, }) } @@ -109,7 +109,7 @@ func A4Extend(mod *modifier.Instance) { Name: Dreamdiver, Source: mod.Source(), Stats: info.PropMap{ - prop.CritDMG: mod.State().(SparkleBuffState).cdmgBuff, + prop.CritDMG: mod.State().(SkillBuffState).cdmgBuff, }, }) } From 47a72a121f0f53daa17ddffc61aadcf6bd5321c7 Mon Sep 17 00:00:00 2001 From: ducc Date: Wed, 15 Jan 2025 23:20:12 -0500 Subject: [PATCH 19/25] Fixed tickmoments being swapped --- internal/character/sparkle/skill.go | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/internal/character/sparkle/skill.go b/internal/character/sparkle/skill.go index d9d9e449..0f4f92a5 100644 --- a/internal/character/sparkle/skill.go +++ b/internal/character/sparkle/skill.go @@ -23,8 +23,7 @@ func init() { OnAdd: addActualBuff, OnRemove: A4Extend, }, - TickMoment: modifier.ModifierPhase1End, - Duration: 1, + Duration: 1, }) modifier.Register(Dreamdiver, modifier.Config{ @@ -32,6 +31,7 @@ func init() { CanDispel: true, StatusType: model.StatusType_STATUS_BUFF, Duration: 1, + TickMoment: modifier.ModifierPhase1End, }) } @@ -39,13 +39,16 @@ type SkillBuffState struct { cdmgBuff float64 } +// TODO: Adjust skill crit scaling to use Base/Convert versions of crit buffs when appropriate. (once implemented) func (c *char) Skill(target key.TargetID, state info.ActionState) { - c.engine.ModifyGaugeNormalized(info.ModifyAttribute{ - Key: SparkleSkill, - Target: target, - Source: c.id, - Amount: -0.5, - }) + if target != c.id { + c.engine.ModifyGaugeNormalized(info.ModifyAttribute{ + Key: SparkleSkill, + Target: target, + Source: c.id, + Amount: -0.5, + }) + } sparkle := c.engine.Stats(c.id) sparkleCdmg := sparkle.GetProperty(prop.CritDMG) From c194d8c4dd22c4090d10db23b4ab4d4b3fe34e16 Mon Sep 17 00:00:00 2001 From: ducc Date: Wed, 15 Jan 2025 23:20:36 -0500 Subject: [PATCH 20/25] added candispel and statustype to talent buff --- internal/character/sparkle/talent.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/character/sparkle/talent.go b/internal/character/sparkle/talent.go index 28004352..10b51ad5 100644 --- a/internal/character/sparkle/talent.go +++ b/internal/character/sparkle/talent.go @@ -5,6 +5,7 @@ import ( "github.com/simimpact/srsim/pkg/engine/info" "github.com/simimpact/srsim/pkg/engine/modifier" "github.com/simimpact/srsim/pkg/engine/prop" + "github.com/simimpact/srsim/pkg/model" ) const ( @@ -19,6 +20,8 @@ func init() { OnAdd: adjustBuff, OnRemove: removeE2, }, + CanDispel: true, + StatusType: model.StatusType_STATUS_BUFF, }) } From 5462f0073766455d89e42f084d69a67364aea588 Mon Sep 17 00:00:00 2001 From: ducc Date: Wed, 15 Jan 2025 23:20:57 -0500 Subject: [PATCH 21/25] a6 register --- internal/character/sparkle/traces.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/internal/character/sparkle/traces.go b/internal/character/sparkle/traces.go index e2a1f896..5b5a5bfe 100644 --- a/internal/character/sparkle/traces.go +++ b/internal/character/sparkle/traces.go @@ -3,6 +3,7 @@ package sparkle import ( "github.com/simimpact/srsim/pkg/engine/event" "github.com/simimpact/srsim/pkg/engine/info" + "github.com/simimpact/srsim/pkg/engine/modifier" "github.com/simimpact/srsim/pkg/engine/prop" "github.com/simimpact/srsim/pkg/key" "github.com/simimpact/srsim/pkg/model" @@ -17,6 +18,13 @@ var ( buffMap = map[int]float64{1: 0.05, 2: 0.15, 3: 0.3, 0: 0.0} ) +func init() { + modifier.Register(A6, modifier.Config{ + CanDispel: true, + StatusType: model.StatusType_STATUS_BUFF, + }) +} + func (c *char) initTraces() { c.engine.Events().BattleStart.Subscribe(c.initA6) } From 8325a25297fa7a52f58b96811ae0117604fbdb7f Mon Sep 17 00:00:00 2001 From: ducc Date: Wed, 15 Jan 2025 23:23:03 -0500 Subject: [PATCH 22/25] unnecessary candispel: false --- internal/character/sparkle/ult.go | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/internal/character/sparkle/ult.go b/internal/character/sparkle/ult.go index d15f6ede..74075ee1 100644 --- a/internal/character/sparkle/ult.go +++ b/internal/character/sparkle/ult.go @@ -16,7 +16,6 @@ const ( func init() { modifier.Register(Cipher, modifier.Config{ Stacking: modifier.ReplaceBySource, - CanDispel: false, Duration: 2, StatusType: model.StatusType_STATUS_BUFF, }) @@ -69,14 +68,22 @@ func (c *char) Ult(target key.TargetID, state info.ActionState) { } for _, char := range c.engine.Characters() { - c.engine.AddModifier(char, info.Modifier{ - Name: Dreamdiver, - Source: c.id, - Duration: 1, - Stats: info.PropMap{ - prop.CritDMG: sparkleCdmg * proportion, - }, - }) + if c.engine.HasModifier(char, SparkleSkillBuff) { + c.engine.AddModifier(char, info.Modifier{ + Name: SparkleSkillBuff, + Source: c.id, + Duration: 1, + }) + } else if c.engine.HasModifier(char, Dreamdiver) { + c.engine.AddModifier(char, info.Modifier{ + Name: Dreamdiver, + Source: c.id, + Duration: 1, + Stats: info.PropMap{ + prop.CritDMG: sparkleCdmg * proportion, + }, + }) + } } } } From e985992fd10ae589637777f8ad5fe7f6eadbaa36 Mon Sep 17 00:00:00 2001 From: ducc Date: Wed, 15 Jan 2025 23:41:23 -0500 Subject: [PATCH 23/25] modifiers renamed --- internal/character/sparkle/skill.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/internal/character/sparkle/skill.go b/internal/character/sparkle/skill.go index 0f4f92a5..c6fc5826 100644 --- a/internal/character/sparkle/skill.go +++ b/internal/character/sparkle/skill.go @@ -9,13 +9,13 @@ import ( ) const ( - SparkleSkillBuff = "SparkleSkillBuff" - Dreamdiver = "dreamdiver" - SparkleSkill = "sparkle-skill" + Dreamdiver = "dreamdiver" + DreamdiverExtension = "dreamdiver-extension" + SparkleSkill = "sparkle-skill" ) func init() { - modifier.Register(SparkleSkillBuff, modifier.Config{ + modifier.Register(Dreamdiver, modifier.Config{ Stacking: modifier.ReplaceBySource, CanDispel: true, StatusType: model.StatusType_STATUS_BUFF, @@ -26,7 +26,7 @@ func init() { Duration: 1, }) - modifier.Register(Dreamdiver, modifier.Config{ + modifier.Register(DreamdiverExtension, modifier.Config{ Stacking: modifier.Replace, CanDispel: true, StatusType: model.StatusType_STATUS_BUFF, @@ -57,7 +57,7 @@ func (c *char) Skill(target key.TargetID, state info.ActionState) { proportion += 0.3 } c.engine.AddModifier(target, info.Modifier{ - Name: SparkleSkillBuff, + Name: Dreamdiver, Source: c.id, Duration: 1, State: SkillBuffState{ @@ -76,7 +76,7 @@ func (c *char) Skill(target key.TargetID, state info.ActionState) { for _, char := range targets { c.engine.AddModifier(char, info.Modifier{ - Name: SparkleSkillBuff, + Name: Dreamdiver, Source: c.id, Duration: 1, State: SkillBuffState{ @@ -95,9 +95,9 @@ func (c *char) Skill(target key.TargetID, state info.ActionState) { } func addActualBuff(mod *modifier.Instance) { - mod.Engine().RemoveModifier(mod.Owner(), Dreamdiver) + mod.Engine().RemoveModifier(mod.Owner(), DreamdiverExtension) mod.Engine().AddModifier(mod.Owner(), info.Modifier{ - Name: Dreamdiver, + Name: DreamdiverExtension, Source: mod.Source(), Stats: info.PropMap{ prop.CritDMG: mod.State().(SkillBuffState).cdmgBuff, @@ -109,7 +109,7 @@ func A4Extend(mod *modifier.Instance) { sparkleinfo, _ := mod.Engine().CharacterInfo(mod.Source()) if sparkleinfo.Traces["102"] { mod.Engine().AddModifier(mod.Owner(), info.Modifier{ - Name: Dreamdiver, + Name: DreamdiverExtension, Source: mod.Source(), Stats: info.PropMap{ prop.CritDMG: mod.State().(SkillBuffState).cdmgBuff, From 67caa76f68407745c695f5fed9218425140714e2 Mon Sep 17 00:00:00 2001 From: ducc Date: Wed, 15 Jan 2025 23:41:33 -0500 Subject: [PATCH 24/25] modifier renaming --- internal/character/sparkle/ult.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/character/sparkle/ult.go b/internal/character/sparkle/ult.go index 74075ee1..22a7b1c7 100644 --- a/internal/character/sparkle/ult.go +++ b/internal/character/sparkle/ult.go @@ -54,7 +54,7 @@ func (c *char) Ult(target key.TargetID, state info.ActionState) { alliesWithCritBuff := c.engine.Retarget(info.Retarget{ Targets: c.engine.Characters(), Filter: func(target key.TargetID) bool { - return c.engine.HasModifier(target, SparkleSkillBuff) || c.engine.HasModifier(target, Dreamdiver) + return c.engine.HasModifier(target, Dreamdiver) || c.engine.HasModifier(target, DreamdiverExtension) }, Max: 1, IncludeLimbo: false, @@ -68,15 +68,15 @@ func (c *char) Ult(target key.TargetID, state info.ActionState) { } for _, char := range c.engine.Characters() { - if c.engine.HasModifier(char, SparkleSkillBuff) { + if c.engine.HasModifier(char, Dreamdiver) { c.engine.AddModifier(char, info.Modifier{ - Name: SparkleSkillBuff, + Name: Dreamdiver, Source: c.id, Duration: 1, }) - } else if c.engine.HasModifier(char, Dreamdiver) { + } else if c.engine.HasModifier(char, DreamdiverExtension) { c.engine.AddModifier(char, info.Modifier{ - Name: Dreamdiver, + Name: DreamdiverExtension, Source: c.id, Duration: 1, Stats: info.PropMap{ From 7d8ff4b1e2633d2deffa6a408c5a1c989a7423e9 Mon Sep 17 00:00:00 2001 From: ducc Date: Wed, 15 Jan 2025 23:52:45 -0500 Subject: [PATCH 25/25] linter complaining about nesting --- internal/character/sparkle/ult.go | 52 ++++++++++++++++--------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/internal/character/sparkle/ult.go b/internal/character/sparkle/ult.go index 22a7b1c7..8b0064fc 100644 --- a/internal/character/sparkle/ult.go +++ b/internal/character/sparkle/ult.go @@ -60,31 +60,7 @@ func (c *char) Ult(target key.TargetID, state info.ActionState) { IncludeLimbo: false, }) if len(alliesWithCritBuff) > 0 { - sparkle := c.engine.Stats(c.id) - sparkleCdmg := sparkle.GetProperty(prop.CritDMG) - proportion := skillCdmgScaling[c.info.SkillLevelIndex()] - if c.info.Eidolon >= 6 { - proportion += 0.3 - } - - for _, char := range c.engine.Characters() { - if c.engine.HasModifier(char, Dreamdiver) { - c.engine.AddModifier(char, info.Modifier{ - Name: Dreamdiver, - Source: c.id, - Duration: 1, - }) - } else if c.engine.HasModifier(char, DreamdiverExtension) { - c.engine.AddModifier(char, info.Modifier{ - Name: DreamdiverExtension, - Source: c.id, - Duration: 1, - Stats: info.PropMap{ - prop.CritDMG: sparkleCdmg * proportion, - }, - }) - } - } + c.spreadBuff() } } @@ -95,3 +71,29 @@ func (c *char) Ult(target key.TargetID, state info.ActionState) { Amount: 5, }) } + +func (c *char) spreadBuff() { + sparkle := c.engine.Stats(c.id) + sparkleCdmg := sparkle.GetProperty(prop.CritDMG) + // We check for e6 above + proportion := skillCdmgScaling[c.info.SkillLevelIndex()] + 0.3 + + for _, char := range c.engine.Characters() { + if c.engine.HasModifier(char, Dreamdiver) { + c.engine.AddModifier(char, info.Modifier{ + Name: Dreamdiver, + Source: c.id, + Duration: 1, + }) + } else if c.engine.HasModifier(char, DreamdiverExtension) { + c.engine.AddModifier(char, info.Modifier{ + Name: DreamdiverExtension, + Source: c.id, + Duration: 1, + Stats: info.PropMap{ + prop.CritDMG: sparkleCdmg * proportion, + }, + }) + } + } +}