Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add missing weapons #762

Merged
merged 21 commits into from
Aug 17, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion internal/weapons/bow/huntersbow/hunter.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,4 @@ import (

func init() {
core.RegisterWeaponFunc(keys.HuntersBow, common.NewNoEffect)
core.RegisterWeaponFunc(keys.SeasonedHuntersBow, common.NewNoEffect)
}
75 changes: 75 additions & 0 deletions internal/weapons/bow/messenger/messenger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package messenger

import (
"fmt"

"github.com/genshinsim/gcsim/pkg/core"
"github.com/genshinsim/gcsim/pkg/core/attributes"
"github.com/genshinsim/gcsim/pkg/core/combat"
"github.com/genshinsim/gcsim/pkg/core/event"
"github.com/genshinsim/gcsim/pkg/core/keys"
"github.com/genshinsim/gcsim/pkg/core/player/character"
"github.com/genshinsim/gcsim/pkg/core/player/weapon"
)

func init() {
core.RegisterWeaponFunc(keys.Messenger, NewWeapon)
}

type Weapon struct {
Index int
}

func (w *Weapon) SetIndex(idx int) { w.Index = idx }
func (w *Weapon) Init() error { return nil }

// Charged Attack hits on weak spots deal an additional 100/125/150/175/200% ATK DMG as CRIT DMG.
// Can only occur once every 10s.
func NewWeapon(c *core.Core, char *character.CharWrapper, p weapon.WeaponProfile) (weapon.Weapon, error) {
w := &Weapon{}
r := p.Refine

dmg := 0.75 + float64(r)*0.25
const icdKey = "messenger-icd"

c.Events.Subscribe(event.OnDamage, func(args ...interface{}) bool {
atk := args[1].(*combat.AttackEvent)
trg := args[0].(combat.Target)
// don't proc if dmg not from weapon holder
if atk.Info.ActorIndex != char.Index {
return false
}
// don't proc if off-field
if c.Player.Active() != char.Index {
return false
}
// don't proc if not hitting weakspot
if !atk.Info.HitWeakPoint {
return false
}
// don't proc if on icd
if char.StatusIsActive(icdKey) {
return false
}
// set icd
char.AddStatus(icdKey, 10*60, true) // 10s icd

// queue single target proc
ai := combat.AttackInfo{
ActorIndex: char.Index,
Abil: "Messenger Proc",
AttackTag: combat.AttackTagNone,
ICDTag: combat.ICDTagNone,
ICDGroup: combat.ICDGroupDefault,
Element: attributes.Physical,
Durability: 100,
Mult: dmg,
HitWeakPoint: true, // ensure crit by marking it as hitting weakspot
}
c.QueueAttack(ai, combat.NewDefSingleTarget(trg.Index(), combat.TargettableEnemy), 0, 1)

return false
}, fmt.Sprintf("messenger-%v", char.Base.Key.String()))

return w, nil
}
48 changes: 48 additions & 0 deletions internal/weapons/bow/raven/raven.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package raven

import (
"github.com/genshinsim/gcsim/pkg/core"
"github.com/genshinsim/gcsim/pkg/core/attributes"
"github.com/genshinsim/gcsim/pkg/core/combat"
"github.com/genshinsim/gcsim/pkg/core/keys"
"github.com/genshinsim/gcsim/pkg/core/player/character"
"github.com/genshinsim/gcsim/pkg/core/player/weapon"
"github.com/genshinsim/gcsim/pkg/enemy"
"github.com/genshinsim/gcsim/pkg/modifier"
)

func init() {
core.RegisterWeaponFunc(keys.RavenBow, NewWeapon)
}

type Weapon struct {
Index int
}

func (w *Weapon) SetIndex(idx int) { w.Index = idx }
func (w *Weapon) Init() error { return nil }

// Increases DMG against opponents affected by Hydro or Pyro by 12/15/18/21/24%.
func NewWeapon(c *core.Core, char *character.CharWrapper, p weapon.WeaponProfile) (weapon.Weapon, error) {
w := &Weapon{}
r := p.Refine

dmg := 0.09 + float64(r)*0.03
m := make([]float64, attributes.EndStatType)
m[attributes.DmgP] = dmg
char.AddAttackMod(character.AttackMod{
Base: modifier.NewBase("ravenbow", -1),
Amount: func(atk *combat.AttackEvent, t combat.Target) ([]float64, bool) {
x, ok := t.(*enemy.Enemy)
if !ok {
return nil, false
}
if x.AuraContains(attributes.Hydro, attributes.Pyro) {
return m, true
}
return nil, false
},
})

return w, nil
}
11 changes: 11 additions & 0 deletions internal/weapons/bow/seasonedhuntersbow/seaonedhuntersbow.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package seasonedhuntersbow

import (
"github.com/genshinsim/gcsim/internal/weapons/common"
"github.com/genshinsim/gcsim/pkg/core"
"github.com/genshinsim/gcsim/pkg/core/keys"
)

func init() {
core.RegisterWeaponFunc(keys.SeasonedHuntersBow, common.NewNoEffect)
}
62 changes: 62 additions & 0 deletions internal/weapons/catalyst/emeraldorb/emeraldorb.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package emeraldorb

import (
"github.com/genshinsim/gcsim/pkg/core"
"github.com/genshinsim/gcsim/pkg/core/attributes"
"github.com/genshinsim/gcsim/pkg/core/combat"
"github.com/genshinsim/gcsim/pkg/core/event"
"github.com/genshinsim/gcsim/pkg/core/keys"
"github.com/genshinsim/gcsim/pkg/core/player/character"
"github.com/genshinsim/gcsim/pkg/core/player/weapon"
"github.com/genshinsim/gcsim/pkg/modifier"
)

func init() {
core.RegisterWeaponFunc(keys.EmeraldOrb, NewWeapon)
}

type Weapon struct {
Index int
}

func (w *Weapon) SetIndex(idx int) { w.Index = idx }
func (w *Weapon) Init() error { return nil }

//Upon causing a Vaporize, Electro-Charged, Frozen, or a Hydro-infused Swirl reaction, increases ATK by 20/25/30/35/40% for 12s.
func NewWeapon(c *core.Core, char *character.CharWrapper, p weapon.WeaponProfile) (weapon.Weapon, error) {
w := &Weapon{}
r := p.Refine

m := make([]float64, attributes.EndStatType)
m[attributes.ATKP] = 0.15 + float64(r)*0.05

addBuff := func(args ...interface{}) bool {
atk := args[1].(*combat.AttackEvent)
// don't proc if dmg not from weapon holder
if atk.Info.ActorIndex != char.Index {
return false
}
// don't proc if off-field
if c.Player.Active() != char.Index {
return false
}

// add buff
char.AddStatMod(character.StatMod{
Base: modifier.NewBaseWithHitlag("emeraldorb", 720),
AffectedStat: attributes.NoStat,
Amount: func() ([]float64, bool) {
return m, true
},
})

return false
}

c.Events.Subscribe(event.OnVaporize, addBuff, "emeraldorb-"+char.Base.Key.String())
c.Events.Subscribe(event.OnElectroCharged, addBuff, "emeraldorb-"+char.Base.Key.String())
c.Events.Subscribe(event.OnFrozen, addBuff, "emeraldorb-"+char.Base.Key.String())
c.Events.Subscribe(event.OnSwirlHydro, addBuff, "emeraldorb-"+char.Base.Key.String())

return w, nil
}
45 changes: 45 additions & 0 deletions internal/weapons/catalyst/otherworldly/otherworldly.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package otherworldly

import (
"fmt"

"github.com/genshinsim/gcsim/pkg/core"
"github.com/genshinsim/gcsim/pkg/core/event"
"github.com/genshinsim/gcsim/pkg/core/keys"
"github.com/genshinsim/gcsim/pkg/core/player"
"github.com/genshinsim/gcsim/pkg/core/player/character"
"github.com/genshinsim/gcsim/pkg/core/player/weapon"
)

func init() {
core.RegisterWeaponFunc(keys.OtherworldlyStory, NewWeapon)
}

type Weapon struct {
Index int
}

func (w *Weapon) SetIndex(idx int) { w.Index = idx }
func (w *Weapon) Init() error { return nil }

// Each Elemental Orb or Particle collected restores 1/1.25/1.5/1.75/2% HP.
func NewWeapon(c *core.Core, char *character.CharWrapper, p weapon.WeaponProfile) (weapon.Weapon, error) {
w := &Weapon{}
r := p.Refine

c.Events.Subscribe(event.OnParticleReceived, func(args ...interface{}) bool {
// ignore if character not on field
if c.Player.Active() != char.Index {
return false
}
c.Player.Heal(player.HealInfo{
Type: player.HealTypePercent,
Message: "Otherworldly Story (Proc)",
Src: 0.0075 + float64(r)*0.0025,
})

return false
}, fmt.Sprintf("otherworldlystory-%v", char.Base.Key.String()))

return w, nil
}
11 changes: 11 additions & 0 deletions internal/weapons/catalyst/pocket/pocket.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package pocket

import (
"github.com/genshinsim/gcsim/internal/weapons/common"
"github.com/genshinsim/gcsim/pkg/core"
"github.com/genshinsim/gcsim/pkg/core/keys"
)

func init() {
core.RegisterWeaponFunc(keys.PocketGrimoire, common.NewNoEffect)
}
63 changes: 63 additions & 0 deletions internal/weapons/catalyst/twin/twin.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package twin

import (
"fmt"

"github.com/genshinsim/gcsim/pkg/core"
"github.com/genshinsim/gcsim/pkg/core/attributes"
"github.com/genshinsim/gcsim/pkg/core/combat"
"github.com/genshinsim/gcsim/pkg/core/event"
"github.com/genshinsim/gcsim/pkg/core/keys"
"github.com/genshinsim/gcsim/pkg/core/player/character"
"github.com/genshinsim/gcsim/pkg/core/player/weapon"
"github.com/genshinsim/gcsim/pkg/enemy"
"github.com/genshinsim/gcsim/pkg/modifier"
)

func init() {
core.RegisterWeaponFunc(keys.TwinNephrite, NewWeapon)
}

type Weapon struct {
Index int
}

func (w *Weapon) SetIndex(idx int) { w.Index = idx }
func (w *Weapon) Init() error { return nil }

// Defeating an opponent increases Movement SPD and ATK by 12/14/16/18/20% for 15s.
func NewWeapon(c *core.Core, char *character.CharWrapper, p weapon.WeaponProfile) (weapon.Weapon, error) {
w := &Weapon{}
r := p.Refine

m := make([]float64, attributes.EndStatType)
m[attributes.ATKP] = 0.10 + float64(r)*0.02

c.Events.Subscribe(event.OnTargetDied, func(args ...interface{}) bool {
_, ok := args[0].(*enemy.Enemy)
// ignore if not an enemy
if !ok {
return false
}
atk := args[1].(*combat.AttackEvent)
// don't proc if someone else defeated the enemy
if atk.Info.ActorIndex != char.Index {
return false
}
// don't proc if off-field
if c.Player.Active() != char.Index {
return false
}
// add buff
char.AddStatMod(character.StatMod{
Base: modifier.NewBaseWithHitlag("twinnephrite", 900), // 15s
AffectedStat: attributes.ATKP,
Amount: func() ([]float64, bool) {
return m, true
},
})
return false
}, fmt.Sprintf("twinnephrite-%v", char.Base.Key.String()))

return w, nil
}
48 changes: 48 additions & 0 deletions internal/weapons/claymore/bloodtainted/bloodtainted.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package bloodtainted

import (
"github.com/genshinsim/gcsim/pkg/core"
"github.com/genshinsim/gcsim/pkg/core/attributes"
"github.com/genshinsim/gcsim/pkg/core/combat"
"github.com/genshinsim/gcsim/pkg/core/keys"
"github.com/genshinsim/gcsim/pkg/core/player/character"
"github.com/genshinsim/gcsim/pkg/core/player/weapon"
"github.com/genshinsim/gcsim/pkg/enemy"
"github.com/genshinsim/gcsim/pkg/modifier"
)

func init() {
core.RegisterWeaponFunc(keys.BloodtaintedGreatsword, NewWeapon)
}

type Weapon struct {
Index int
}

func (w *Weapon) SetIndex(idx int) { w.Index = idx }
func (w *Weapon) Init() error { return nil }

// Increases DMG against opponents affected by Pyro or Electro by 12/15/18/21/24%.
func NewWeapon(c *core.Core, char *character.CharWrapper, p weapon.WeaponProfile) (weapon.Weapon, error) {
w := &Weapon{}
r := p.Refine

dmg := 0.09 + float64(r)*0.03
m := make([]float64, attributes.EndStatType)
m[attributes.DmgP] = dmg
char.AddAttackMod(character.AttackMod{
Base: modifier.NewBase("bloodtaintedgreatsword", -1),
Amount: func(atk *combat.AttackEvent, t combat.Target) ([]float64, bool) {
x, ok := t.(*enemy.Enemy)
if !ok {
return nil, false
}
if x.AuraContains(attributes.Pyro, attributes.Electro) {
return m, true
}
return nil, false
},
})

return w, nil
}
Loading