diff --git a/internal/characters/albedo/albedo.go b/internal/characters/albedo/albedo.go index ec1609771..4a8ecdc46 100644 --- a/internal/characters/albedo/albedo.go +++ b/internal/characters/albedo/albedo.go @@ -25,7 +25,7 @@ type char struct { c2stacks int } -func NewChar(s *core.Core, w *character.CharWrapper, _ info.CharacterProfile) error { +func NewChar(s *core.Core, w *character.CharWrapper, p info.CharacterProfile) error { c := char{} c.Character = tmpl.NewWithWrapper(s, w) @@ -34,6 +34,11 @@ func NewChar(s *core.Core, w *character.CharWrapper, _ info.CharacterProfile) er c.SkillCon = 3 c.BurstCon = 5 + isHexerei, ok := p.Params["is_hexerei"] + if ok && isHexerei != 0 { + c.Hexerei = 1 + } + w.Character = &c return nil diff --git a/internal/characters/fischl/fischl.go b/internal/characters/fischl/fischl.go index 3dd87239d..cbd340f72 100644 --- a/internal/characters/fischl/fischl.go +++ b/internal/characters/fischl/fischl.go @@ -46,6 +46,11 @@ func NewChar(s *core.Core, w *character.CharWrapper, p info.CharacterProfile) er c.ozTravel = travel } + isHexerei, ok := p.Params["is_hexerei"] + if ok && isHexerei != 0 { + c.Hexerei = 1 + } + w.Character = &c return nil diff --git a/internal/characters/klee/klee.go b/internal/characters/klee/klee.go index 97847b60a..1b5cc3199 100644 --- a/internal/characters/klee/klee.go +++ b/internal/characters/klee/klee.go @@ -18,7 +18,7 @@ type char struct { c1Chance float64 } -func NewChar(s *core.Core, w *character.CharWrapper, _ info.CharacterProfile) error { +func NewChar(s *core.Core, w *character.CharWrapper, p info.CharacterProfile) error { c := char{} c.Character = tmpl.NewWithWrapper(s, w) @@ -29,6 +29,11 @@ func NewChar(s *core.Core, w *character.CharWrapper, _ info.CharacterProfile) er c.SetNumCharges(action.ActionSkill, 2) + isHexerei, ok := p.Params["is_hexerei"] + if ok && isHexerei != 0 { + c.Hexerei = 1 + } + w.Character = &c return nil diff --git a/internal/characters/mona/mona.go b/internal/characters/mona/mona.go index 70e6075be..7a1a418c0 100644 --- a/internal/characters/mona/mona.go +++ b/internal/characters/mona/mona.go @@ -24,7 +24,7 @@ type char struct { c6Stacks int } -func NewChar(s *core.Core, w *character.CharWrapper, _ info.CharacterProfile) error { +func NewChar(s *core.Core, w *character.CharWrapper, p info.CharacterProfile) error { c := char{} c.Character = tmpl.NewWithWrapper(s, w) @@ -33,6 +33,11 @@ func NewChar(s *core.Core, w *character.CharWrapper, _ info.CharacterProfile) er c.BurstCon = 3 c.SkillCon = 5 + isHexerei, ok := p.Params["is_hexerei"] + if ok && isHexerei != 0 { + c.Hexerei = 1 + } + w.Character = &c return nil diff --git a/internal/characters/razor/razor.go b/internal/characters/razor/razor.go index 118de892a..70783c2b9 100644 --- a/internal/characters/razor/razor.go +++ b/internal/characters/razor/razor.go @@ -21,7 +21,7 @@ type char struct { c2bonus []float64 } -func NewChar(s *core.Core, w *character.CharWrapper, _ info.CharacterProfile) error { +func NewChar(s *core.Core, w *character.CharWrapper, p info.CharacterProfile) error { c := char{} c.Character = tmpl.NewWithWrapper(s, w) @@ -30,6 +30,11 @@ func NewChar(s *core.Core, w *character.CharWrapper, _ info.CharacterProfile) er c.SkillCon = 5 c.NormalHitNum = normalHitNum + isHexerei, ok := p.Params["is_hexerei"] + if ok && isHexerei != 0 { + c.Hexerei = 1 + } + w.Character = &c return nil diff --git a/internal/characters/sucrose/burst.go b/internal/characters/sucrose/burst.go index 7161053a0..56591f2a0 100644 --- a/internal/characters/sucrose/burst.go +++ b/internal/characters/sucrose/burst.go @@ -7,10 +7,14 @@ import ( "github.com/genshinsim/gcsim/pkg/core/attributes" "github.com/genshinsim/gcsim/pkg/core/combat" "github.com/genshinsim/gcsim/pkg/core/info" + "github.com/genshinsim/gcsim/pkg/core/player/character" + "github.com/genshinsim/gcsim/pkg/modifier" ) var burstFrames []int +const burstHexBuffKey = "sucrose-hex-burst" + func init() { burstFrames = frames.InitAbilSlice(65) // walk burstFrames[action.ActionAttack] = 49 @@ -90,6 +94,7 @@ func (c *char) Burst(p map[string]int) (action.Info, error) { c.SetCDWithDelay(action.ActionBurst, 1200, 18) c.ConsumeEnergy(21) + c.witchesEveRiteBurst() return action.Info{ Frames: frames.NewAbilFunc(burstFrames), @@ -116,3 +121,36 @@ func (c *char) absorbCheck(src, count, maxcount int) func() { c.Core.Tasks.Add(c.absorbCheck(src, count+1, maxcount), 18) } } + +func (c *char) witchesEveRiteBurst() { + if c.Hexerei != 1 { + return + } + + if c.Core.Player.GetHexereiCount() < 2 { + return + } + + m := make([]float64, attributes.EndStatType) + m[attributes.DmgP] = 0.5 / 7 + + for _, char := range c.Core.Player.Chars() { + char.AddAttackMod(character.AttackMod{ + Base: modifier.NewBaseWithHitlag(burstHexBuffKey, 60*10), + Amount: func(atk *info.AttackEvent, t info.Target) []float64 { + switch atk.Info.AttackTag { + case attacks.AttackTagNormal: + case attacks.AttackTagExtra: + case attacks.AttackTagPlunge: + case attacks.AttackTagElementalArt: + case attacks.AttackTagElementalArtHold: + case attacks.AttackTagElementalBurst: + default: + return nil + } + + return m + }, + }) + } +} diff --git a/internal/characters/sucrose/cons.go b/internal/characters/sucrose/cons.go index 0c2edfe70..f2028c64d 100644 --- a/internal/characters/sucrose/cons.go +++ b/internal/characters/sucrose/cons.go @@ -44,14 +44,19 @@ func (c *char) makeC4Callback() func(info.AttackCB) { func (c *char) c6() { stat := attributes.EleToDmgP(c.qAbsorb) - c.c6buff[stat] = .20 - for _, char := range c.Core.Player.Chars() { + m := make([]float64, attributes.EndStatType) + if c.Hexerei == 1 && char.Hexerei == 1 { + m[stat] = .20 + .6/7 + } else { + m[stat] = .20 + } + char.AddStatMod(character.StatMod{ Base: modifier.NewBaseWithHitlag("sucrose-c6", 60*10), AffectedStat: stat, Amount: func() []float64 { - return c.c6buff + return m }, }) } diff --git a/internal/characters/sucrose/skill.go b/internal/characters/sucrose/skill.go index 7003d0c72..96410040b 100644 --- a/internal/characters/sucrose/skill.go +++ b/internal/characters/sucrose/skill.go @@ -7,12 +7,16 @@ import ( "github.com/genshinsim/gcsim/pkg/core/attributes" "github.com/genshinsim/gcsim/pkg/core/combat" "github.com/genshinsim/gcsim/pkg/core/info" + "github.com/genshinsim/gcsim/pkg/core/player/character" + "github.com/genshinsim/gcsim/pkg/modifier" ) var skillFrames []int const particleICDKey = "sucrose-particle-icd" +const skillHexBuffKey = "sucrose-hex-skill" + func init() { skillFrames = frames.InitAbilSlice(68) // walk skillFrames[action.ActionAttack] = 57 @@ -60,6 +64,7 @@ func (c *char) Skill(p map[string]int) (action.Info, error) { // reduce charge by 1 c.SetCDWithDelay(action.ActionSkill, 900, 9) + c.witchesEveRiteSkill() return action.Info{ Frames: frames.NewAbilFunc(skillFrames), @@ -79,3 +84,36 @@ func (c *char) particleCB(a info.AttackCB) { c.AddStatus(particleICDKey, 0.4*60, false) c.Core.QueueParticle(c.Base.Key.String(), 4, attributes.Anemo, c.ParticleDelay) } + +func (c *char) witchesEveRiteSkill() { + if c.Hexerei != 1 { + return + } + + if c.Core.Player.GetHexereiCount() < 2 { + return + } + + m := make([]float64, attributes.EndStatType) + m[attributes.DmgP] = 0.4 / 7 + + for _, char := range c.Core.Player.Chars() { + char.AddAttackMod(character.AttackMod{ + Base: modifier.NewBaseWithHitlag(skillHexBuffKey, 60*10), + Amount: func(atk *info.AttackEvent, t info.Target) []float64 { + switch atk.Info.AttackTag { + case attacks.AttackTagNormal: + case attacks.AttackTagExtra: + case attacks.AttackTagPlunge: + case attacks.AttackTagElementalArt: + case attacks.AttackTagElementalArtHold: + case attacks.AttackTagElementalBurst: + default: + return nil + } + + return m + }, + }) + } +} diff --git a/internal/characters/sucrose/sucrose.go b/internal/characters/sucrose/sucrose.go index fec788a0d..d1e4f479f 100644 --- a/internal/characters/sucrose/sucrose.go +++ b/internal/characters/sucrose/sucrose.go @@ -21,10 +21,9 @@ type char struct { a1Buff []float64 a4Buff []float64 c4Count int - c6buff []float64 } -func NewChar(s *core.Core, w *character.CharWrapper, _ info.CharacterProfile) error { +func NewChar(s *core.Core, w *character.CharWrapper, p info.CharacterProfile) error { c := char{} c.Character = tmpl.NewWithWrapper(s, w) @@ -37,6 +36,11 @@ func NewChar(s *core.Core, w *character.CharWrapper, _ info.CharacterProfile) er c.SetNumCharges(action.ActionSkill, 2) } + isHexerei, ok := p.Params["is_hexerei"] + if ok && isHexerei != 0 { + c.Hexerei = 1 + } + w.Character = &c return nil @@ -44,8 +48,5 @@ func NewChar(s *core.Core, w *character.CharWrapper, _ info.CharacterProfile) er func (c *char) Init() error { c.a1() - if c.Base.Cons >= 6 { - c.c6buff = make([]float64, attributes.EndStatType) - } return nil } diff --git a/internal/characters/venti/venti.go b/internal/characters/venti/venti.go index 6e7b7ffbc..8bc86b10b 100644 --- a/internal/characters/venti/venti.go +++ b/internal/characters/venti/venti.go @@ -23,7 +23,7 @@ type char struct { c4bonus []float64 } -func NewChar(s *core.Core, w *character.CharWrapper, _ info.CharacterProfile) error { +func NewChar(s *core.Core, w *character.CharWrapper, p info.CharacterProfile) error { c := char{} c.Character = tmpl.NewWithWrapper(s, w) @@ -32,6 +32,11 @@ func NewChar(s *core.Core, w *character.CharWrapper, _ info.CharacterProfile) er c.BurstCon = 3 c.SkillCon = 5 + isHexerei, ok := p.Params["is_hexerei"] + if ok && isHexerei != 0 { + c.Hexerei = 1 + } + w.Character = &c return nil diff --git a/pkg/core/player/character/character.go b/pkg/core/player/character/character.go index b227a92c0..1763c04a0 100644 --- a/pkg/core/player/character/character.go +++ b/pkg/core/player/character/character.go @@ -100,6 +100,7 @@ type CharWrapper struct { BurstCon int HasArkhe bool Moonsign int + Hexerei int Equip struct { Weapon info.Weapon diff --git a/pkg/core/player/player.go b/pkg/core/player/player.go index bc5b9e3b4..38e41626f 100644 --- a/pkg/core/player/player.go +++ b/pkg/core/player/player.go @@ -406,3 +406,14 @@ func (h *Handler) GetMoonsignLevel() int { } return count } + +func (h *Handler) GetHexereiCount() int { + count := 0 + for _, char := range h.chars { + if char.Hexerei > 0 { + count++ + } + } + + return count +}