diff --git a/internal/artifacts/aubade/aubade.go b/internal/artifacts/aubade/aubade.go new file mode 100644 index 000000000..c627ffb88 --- /dev/null +++ b/internal/artifacts/aubade/aubade.go @@ -0,0 +1,110 @@ +package aubade + +import ( + "fmt" + + "github.com/genshinsim/gcsim/pkg/core" + "github.com/genshinsim/gcsim/pkg/core/attacks" + "github.com/genshinsim/gcsim/pkg/core/attributes" + "github.com/genshinsim/gcsim/pkg/core/event" + "github.com/genshinsim/gcsim/pkg/core/glog" + "github.com/genshinsim/gcsim/pkg/core/info" + "github.com/genshinsim/gcsim/pkg/core/keys" + "github.com/genshinsim/gcsim/pkg/core/player/character" + "github.com/genshinsim/gcsim/pkg/modifier" +) + +func init() { + core.RegisterSetFunc(keys.AubadeOfMorningstarAndMoon, NewSet) +} + +type Set struct { + lastSwap int + core *core.Core + char *character.CharWrapper + buff float64 + Index int + Count int +} + +func (s *Set) SetIndex(idx int) { s.Index = idx } +func (s *Set) GetCount() int { return s.Count } +func (s *Set) Init() error { + m := 0.2 + if s.core.Player.GetMoonsignLevel() >= 2 { + m += 0.4 + } + if s.Count >= 4 && s.core.Player.Active() != s.char.Index() { + s.gainBuff(m) + } + return nil +} + +func NewSet(core *core.Core, char *character.CharWrapper, count int, param map[string]int) (info.Set, error) { + s := Set{ + core: core, + char: char, + lastSwap: -1, + Count: count, + } + if count >= 2 { + m := make([]float64, attributes.EndStatType) + m[attributes.EM] = 80 + char.AddStatMod(character.StatMod{ + Base: modifier.NewBase("aubade-2pc", -1), + AffectedStat: attributes.EM, + Amount: func() []float64 { + return m + }, + }) + } + if count >= 4 { + m := 0.2 + if core.Player.GetMoonsignLevel() >= 2 { + m += 0.4 + } + + core.Events.Subscribe(event.OnCharacterSwap, func(args ...any) { + prev := args[0].(int) + next := args[1].(int) + if prev == char.Index() { + s.lastSwap = -1 + s.gainBuff(m) + } else if next == char.Index() { + s.lastSwap = core.F + core.Tasks.Add(s.clearBuff(core.F), 3*60) + } + }, fmt.Sprintf("aubade-4pc-%v", char.Base.Key.String())) + + char.AddReactBonusMod(character.ReactBonusMod{ + Base: modifier.NewBase("aubade-4pc", -1), + Amount: func(ai info.AttackInfo) float64 { + if ai.AttackTag > attacks.LunarReactionStartDelim && ai.AttackTag < attacks.DirectLunarReactionEndDelim { + return s.buff + } + return 0 + }, + }) + } + + return &s, nil +} + +func (s *Set) gainBuff(m float64) { + s.buff = m + s.core.Log.NewEvent("aubade of morningstar and moon 4pc proc'd", glog.LogArtifactEvent, s.char.Index()) +} + +func (s *Set) clearBuff(src int) func() { + return func() { + if s.lastSwap != src { + return + } + if s.core.Player.Active() != s.char.Index() { + return + } + + s.buff = 0 + s.core.Log.NewEvent("aubade of morningstar and moon 4pc lost", glog.LogArtifactEvent, s.char.Index()) + } +} diff --git a/internal/artifacts/aubade/config.yml b/internal/artifacts/aubade/config.yml new file mode 100644 index 000000000..e08ea127d --- /dev/null +++ b/internal/artifacts/aubade/config.yml @@ -0,0 +1,2 @@ +key: aubade +set_id: 15043 diff --git a/internal/services/assets/artifacts_gen.go b/internal/services/assets/artifacts_gen.go index 5bfee63e2..8fbbd3b00 100644 --- a/internal/services/assets/artifacts_gen.go +++ b/internal/services/assets/artifacts_gen.go @@ -7,6 +7,11 @@ var artfactMap = map[string]string{ "archaicpetra_goblet": "UI_RelicIcon_15014_1", "archaicpetra_plume": "UI_RelicIcon_15014_2", "archaicpetra_sands": "UI_RelicIcon_15014_5", + "aubade_circlet": "UI_RelicIcon_15043_3", + "aubade_flower": "UI_RelicIcon_15043_4", + "aubade_goblet": "UI_RelicIcon_15043_1", + "aubade_plume": "UI_RelicIcon_15043_2", + "aubade_sands": "UI_RelicIcon_15043_5", "berserker_circlet": "UI_RelicIcon_10005_3", "berserker_flower": "UI_RelicIcon_10005_4", "berserker_goblet": "UI_RelicIcon_10005_1", diff --git a/pkg/core/keys/sets.go b/pkg/core/keys/sets.go index aa812d6ec..e8640b041 100644 --- a/pkg/core/keys/sets.go +++ b/pkg/core/keys/sets.go @@ -35,6 +35,7 @@ var setNames = []string{ "", "adventurer", "archaicpetra", + "aubadeofmorningstarandmoon", "berserker", "blizzardstrayer", "bloodstainedchivalry", @@ -96,6 +97,7 @@ const ( NoSet Set = iota Adventurer ArchaicPetra + AubadeOfMorningstarAndMoon Berserker BlizzardStrayer BloodstainedChivalry diff --git a/pkg/shortcut/artifacts.go b/pkg/shortcut/artifacts.go index ca48d535c..7bca6f610 100644 --- a/pkg/shortcut/artifacts.go +++ b/pkg/shortcut/artifacts.go @@ -6,6 +6,9 @@ var SetNameToKey = map[string]keys.Set{ "adventurer": keys.Adventurer, "archaicpetra": keys.ArchaicPetra, "ap": keys.ArchaicPetra, + "aubadeofmorningstarandmoon": keys.AubadeOfMorningstarAndMoon, + "aubadeofmorningstar": keys.AubadeOfMorningstarAndMoon, + "aubade": keys.AubadeOfMorningstarAndMoon, "berserker": keys.Berserker, "blizzardstrayer": keys.BlizzardStrayer, "blizzard": keys.BlizzardStrayer, diff --git a/pkg/simulation/imports.go b/pkg/simulation/imports.go index 93fffc8b5..0e9e0cf97 100644 --- a/pkg/simulation/imports.go +++ b/pkg/simulation/imports.go @@ -15,6 +15,7 @@ import ( // artifacts _ "github.com/genshinsim/gcsim/internal/artifacts/archaic" + _ "github.com/genshinsim/gcsim/internal/artifacts/aubade" _ "github.com/genshinsim/gcsim/internal/artifacts/berserker" _ "github.com/genshinsim/gcsim/internal/artifacts/blizzard" _ "github.com/genshinsim/gcsim/internal/artifacts/bloodstained" diff --git a/ui/packages/docs/docs/reference/artifacts/aubade.md b/ui/packages/docs/docs/reference/artifacts/aubade.md new file mode 100644 index 000000000..cb622b7c6 --- /dev/null +++ b/ui/packages/docs/docs/reference/artifacts/aubade.md @@ -0,0 +1,30 @@ +--- +title: > + Aubade of Morningstar and Moon +--- + +import AoETable from "@site/src/components/AoE/AoETable"; +import IssuesTable from "@site/src/components/Issues/IssuesTable"; +import NamesList from "@site/src/components/Names/NamesList"; +import ParamsTable from "@site/src/components/Params/ParamsTable"; +import FieldsTable from "@site/src/components/Fields/FieldsTable"; + +## AoE Data + + + +## Known issues + + + +## Names + + + +## Params + + + +## Fields + + diff --git a/ui/packages/docs/src/components/Names/artifact_data.json b/ui/packages/docs/src/components/Names/artifact_data.json index c803d26fa..8dd81eff2 100644 --- a/ui/packages/docs/src/components/Names/artifact_data.json +++ b/ui/packages/docs/src/components/Names/artifact_data.json @@ -2,6 +2,10 @@ "archaicpetra": [ "ap" ], + "aubadeofmorningstarandmoon": [ + "aubadeofmorningstar", + "aubade" + ], "berserker": [], "blizzardstrayer": [ "blizzard", diff --git a/ui/packages/localization/src/locales/names.generated.json b/ui/packages/localization/src/locales/names.generated.json index 78c0d23da..9de255c16 100644 --- a/ui/packages/localization/src/locales/names.generated.json +++ b/ui/packages/localization/src/locales/names.generated.json @@ -334,6 +334,7 @@ }, "artifact_names": { "archaicpetra": "悠古的磐岩", + "aubade": "晨星与月的晓歌", "berserker": "战狂", "blizzardstrayer": "冰风迷途的勇士", "bloodstainedchivalry": "染血的骑士道", @@ -1130,6 +1131,7 @@ }, "artifact_names": { "archaicpetra": "Archaic Petra", + "aubade": "Aubade of Morningstar and Moon", "berserker": "Berserker", "blizzardstrayer": "Blizzard Strayer", "bloodstainedchivalry": "Bloodstained Chivalry", @@ -1926,6 +1928,7 @@ }, "artifact_names": { "archaicpetra": "Archaischer Fels", + "aubade": "Gesang von Stern und Mond", "berserker": "Berserker", "blizzardstrayer": "Im Schnee irrender Recke", "bloodstainedchivalry": "Blutiger Weg eines Ritters", @@ -2722,6 +2725,7 @@ }, "artifact_names": { "archaicpetra": "悠久の磐岩", + "aubade": "暁の星と月の歌", "berserker": "狂戦士", "blizzardstrayer": "氷風を彷徨う勇士", "bloodstainedchivalry": "血染めの騎士道", @@ -3518,6 +3522,7 @@ }, "artifact_names": { "archaicpetra": "유구한 반암", + "aubade": "샛별과 달의 여명", "berserker": "전투광", "blizzardstrayer": "얼음바람 속에서 길잃은 용사", "bloodstainedchivalry": "피에 물든 기사도", @@ -4314,6 +4319,7 @@ }, "artifact_names": { "archaicpetra": "Архаичный камень", + "aubade": "Рассветная песнь звезды и луны", "berserker": "Берсерк", "blizzardstrayer": "Заблудший в метели", "bloodstainedchivalry": "Рыцарь крови", @@ -5110,6 +5116,7 @@ }, "artifact_names": { "archaicpetra": "Petra Arcaica", + "aubade": "Alborada de la Estrella del Alba y la Luna", "berserker": "Berserker", "blizzardstrayer": "Nómada del Invierno", "bloodstainedchivalry": "Caballería Sanguinaria", diff --git a/ui/packages/ui/src/Data/artifact_data.generated.json b/ui/packages/ui/src/Data/artifact_data.generated.json index 57d052383..082b384c7 100644 --- a/ui/packages/ui/src/Data/artifact_data.generated.json +++ b/ui/packages/ui/src/Data/artifact_data.generated.json @@ -5,6 +5,11 @@ "text_map_id": "2040573235", "key": "archaicpetra" }, + "aubade": { + "id": "15043", + "text_map_id": "894629371", + "key": "aubade" + }, "berserker": { "id": "10005", "text_map_id": "855894507",