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",