chore: update fight logic and effect implementations
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed

This commit is contained in:
xinian
2026-04-05 02:25:44 +08:00
committed by cnb
parent f473c54880
commit 78a68148ce
80 changed files with 475 additions and 248 deletions

View File

@@ -67,6 +67,7 @@ type Move struct {
SideEffectS []int SideEffectS []int
SideEffectArgS []int SideEffectArgS []int
AtkNum int `xml:"AtkNum,attr,omitempty"` AtkNum int `xml:"AtkNum,attr,omitempty"`
AtkType int `xml:"AtkType,attr,omitempty"` // 0:所有人 1:仅己方 2:仅对方 3:仅自己
Url string `xml:"Url,attr,omitempty"` Url string `xml:"Url,attr,omitempty"`
Info string `xml:"info,attr,omitempty"` Info string `xml:"info,attr,omitempty"`

View File

@@ -355,3 +355,46 @@
- 先完成旧入口 -> 统一入站结构映射 - 先完成旧入口 -> 统一入站结构映射
- 再完成统一出站结构 + phase 广播 - 再完成统一出站结构 + phase 广播
- 最后做前端切换与旧包退场或长期双通道兼容 - 最后做前端切换与旧包退场或长期双通道兼容
---
## AtkType 目标语义补充2026-04-05
来源`flash` `SkillXMLInfo.getGpFtSkillType(skillID)`读取 `movesMap/moveStoneMap` `AtkType`
GBTL 规则已确认
1. `AtkNum`本技能同时攻击数量默认 `1`不能为 `0`
2. `AtkType`目标范围
- `0`所有人
- `1`仅己方
- `2`仅对方
- `3`仅自己
- 默认`2`
前端目标选择行为`SkillMouseController.attack(skillID, attackType)`
1. `attackType=0` -> `allPetWinList`全体可选
2. `attackType=1` -> `membPetWinList`己方可选含自己与队友
3. `attackType=2` -> `oppPetWinList`敌方可选
4. `attackType=3` -> `[playerMode.petWin]`仅自己
后端目标关系判定组队/多战位必须遵循
1. 若协议传 `actor + target(side,pos)`
- `target.side != actor.side` => 对方目标
- `target.side == actor.side && target.pos == actor.pos` => 自身目标
- `target.side == actor.side && target.pos != actor.pos` => 队友目标
2. 若协议未显式传目标 `2405`
- `AtkType` 兜底
- `AtkType=3` => 强制自身
- `AtkType=1` => 默认自身无显式队友位时
- 其他 => 维持旧行为默认对方 `0`
实施要求与现有清单并行
1. `common/data/xmlres/skill.go` `Move` 需包含 `AtkType` 字段解析
2. 动作目标不再依赖默认 Opp 绑定effect 上下文必须使用本次动作的实际目标
3. 需支持区分 `self` `ally`例如同为 `AtkType=1` 不能混用同一默认目标
4. 保持旧协议兼容旧入口不报错但按上述兜底规则执行

View File

@@ -35,6 +35,40 @@ func (h Controller) UseSkill(data *fight.UseSkillInInfo, c *player.Player) (resu
return nil, 0 return nil, 0
} }
// UseSkillAt 组队/多战位技能包cmd=7505
// 目标关系0=对方 1=自己 2=队友。
func (h Controller) UseSkillAt(data *fight.UseSkillAtInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
if err := h.checkFightStatus(c); err != 0 {
return nil, err
}
actorIndex := int(data.ActorIndex)
targetIndex := int(data.TargetIndex)
targetRelation := data.TargetRelation
// 前端未显式给 relation 时,按 AtkType 兜底3=自己1=己方,其他按对方。
if targetRelation > fight.SkillTargetAlly {
switch data.AtkType {
case 3:
targetRelation = fight.SkillTargetSelf
case 1:
targetRelation = fight.SkillTargetAlly
default:
targetRelation = fight.SkillTargetOpponent
}
}
switch targetRelation {
case fight.SkillTargetSelf:
targetIndex = actorIndex
go c.FightC.UseSkillAt(c, data.SkillId, actorIndex, fight.EncodeTargetIndex(targetIndex, false))
case fight.SkillTargetAlly:
go c.FightC.UseSkillAt(c, data.SkillId, actorIndex, fight.EncodeTargetIndex(targetIndex, false))
default:
go c.FightC.UseSkillAt(c, data.SkillId, actorIndex, fight.EncodeTargetIndex(targetIndex, true))
}
return nil, 0
}
// Escape 战斗逃跑 // Escape 战斗逃跑
func (h Controller) Escape(data *fight.EscapeFightInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) { func (h Controller) Escape(data *fight.EscapeFightInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
if err := h.checkFightStatus(c); err != 0 { if err := h.checkFightStatus(c); err != 0 {

View File

@@ -13,6 +13,7 @@ import (
"github.com/gogf/gf/v2/os/gcmd" "github.com/gogf/gf/v2/os/gcmd"
"github.com/gogf/gf/v2/os/gproc" "github.com/gogf/gf/v2/os/gproc"
"blazing/common/data/xmlres"
"blazing/logic/service/player" "blazing/logic/service/player"
"blazing/cool" "blazing/cool"

View File

@@ -199,7 +199,6 @@ func (f *FightC) UseSkillAt(c common.PlayerI, id uint32, actorIndex, targetIndex
BaseAction: action.NewBaseAction(c.GetInfo().UserID), BaseAction: action.NewBaseAction(c.GetInfo().UserID),
} }
ret.ActorIndex = actorIndex ret.ActorIndex = actorIndex
ret.TargetIndex = targetIndex
self := f.getInputByUserID(c.GetInfo().UserID, actorIndex, false) self := f.getInputByUserID(c.GetInfo().UserID, actorIndex, false)
if self == nil { if self == nil {
@@ -225,9 +224,28 @@ func (f *FightC) UseSkillAt(c common.PlayerI, id uint32, actorIndex, targetIndex
} }
} }
ret.TargetIndex = normalizeSkillTargetIndex(actorIndex, targetIndex, ret.SkillEntity)
f.submitAction(ret) f.submitAction(ret)
} }
func normalizeSkillTargetIndex(actorIndex, targetIndex int, skill *info.SkillEntity) int {
if skill == nil {
return targetIndex
}
// 约定:非负目标位表示敌方;负值 -(index+1) 表示同侧(自己/队友)
if _, targetIsOpposite := DecodeTargetIndex(targetIndex); !targetIsOpposite {
return targetIndex
}
// GBTL.AtkType: 0=所有人 1=仅己方 2=仅对方 3=仅自己默认2
switch skill.XML.AtkType {
case 1, 3:
// 旧协议未传目标时,己方类技能默认作用自己;新协议可通过负编码显式指定队友。
return EncodeTargetIndex(actorIndex, false)
default:
return targetIndex
}
}
// 玩家使用技能 // 玩家使用技能
func (f *FightC) Capture(c common.PlayerI, id uint32) { func (f *FightC) Capture(c common.PlayerI, id uint32) {
if f.closefight { if f.closefight {

View File

@@ -101,6 +101,22 @@ type UseSkillInInfo struct {
// 技能id // 技能id
SkillId uint32 SkillId uint32
} }
// UseSkillAtInboundInfo 组队/多战位技能使用包(新增)。
// 目标关系与前端 AtkType 语义对齐:
// 0=对方 1=自己 2=队友AtkType: 0=所有人 1=仅己方 2=仅对方 3=仅自己。
type UseSkillAtInboundInfo struct {
Head common.TomeeHeader `cmd:"7505" struc:"skip"`
SkillId uint32 `json:"skillId"`
// 出手方槽位(我方)
ActorIndex uint8 `json:"actorIndex"`
// 目标槽位(按 TargetRelation 所属阵营解释)
TargetIndex uint8 `json:"targetIndex"`
// 0=对方 1=自己 2=队友
TargetRelation uint8 `json:"targetRelation"`
// 前端技能目标类型(可选兜底),同 GBTL AtkType 定义
AtkType uint8 `json:"atkType"`
}
type ChangePetInboundInfo struct { type ChangePetInboundInfo struct {
Head common.TomeeHeader `cmd:"2407" struc:"skip"` Head common.TomeeHeader `cmd:"2407" struc:"skip"`
// CatchTime 捕捉时间 // CatchTime 捕捉时间

View File

@@ -17,9 +17,9 @@ type Effect1044 struct {
func (e *Effect1044) OnSkill() bool { func (e *Effect1044) OnSkill() bool {
// 检查对手是否有能力提升状态可以吸取 // 检查对手是否有能力提升状态可以吸取
for i, v := range e.OpponentInput().Prop[:] { for i, v := range e.TargetInput().Prop[:] {
if v > 0 { if v > 0 {
if e.OpponentInput().SetProp(e.CarrierInput(), int8(i), 0) { if e.TargetInput().SetProp(e.CarrierInput(), int8(i), 0) {
e.can = true e.can = true
e.CarrierInput().SetProp(e.CarrierInput(), int8(i), v) e.CarrierInput().SetProp(e.CarrierInput(), int8(i), v)
} }

View File

@@ -22,7 +22,7 @@ type Effect1097 struct {
func (e *Effect1097) Skill_Use() bool { func (e *Effect1097) Skill_Use() bool {
source := e.SourceInput() source := e.SourceInput()
target := e.OpponentInput() target := e.TargetInput()
if source == nil || target == nil { if source == nil || target == nil {
return true return true
} }
@@ -175,7 +175,7 @@ func (e *Effect1098) SkillHit() bool {
func (e *Effect1098) Skill_Use() bool { func (e *Effect1098) Skill_Use() bool {
source := e.SourceInput() source := e.SourceInput()
target := e.OpponentInput() target := e.TargetInput()
if source == nil || target == nil { if source == nil || target == nil {
return true return true
} }
@@ -273,7 +273,7 @@ type Effect1099 struct {
func (e *Effect1099) Skill_Use() bool { func (e *Effect1099) Skill_Use() bool {
source := e.SourceInput() source := e.SourceInput()
target := e.OpponentInput() target := e.TargetInput()
if source == nil || target == nil { if source == nil || target == nil {
return true return true
} }
@@ -335,7 +335,7 @@ type Effect1100 struct {
func (e *Effect1100) Skill_Use_ex() bool { func (e *Effect1100) Skill_Use_ex() bool {
source := e.SourceInput() source := e.SourceInput()
target := e.OpponentInput() target := e.TargetInput()
if source == nil || target == nil { if source == nil || target == nil {
return true return true
} }
@@ -423,7 +423,7 @@ func (e *Effect1101) DamageFloor(zone *info.DamageZone) bool {
func (e *Effect1101) Skill_Use() bool { func (e *Effect1101) Skill_Use() bool {
source := e.SourceInput() source := e.SourceInput()
target := e.OpponentInput() target := e.TargetInput()
if source == nil || target == nil { if source == nil || target == nil {
return true return true
} }

View File

@@ -19,7 +19,7 @@ type Effect1146 struct {
func (e *Effect1146) OnSkill() bool { func (e *Effect1146) OnSkill() bool {
// 1. 命中判定失败,不触发 // 1. 命中判定失败,不触发
count := 0 count := 0
for _, v := range e.OpponentInput().Prop[:] { for _, v := range e.TargetInput().Prop[:] {
if v > 0 { if v > 0 {
count++ count++
} }
@@ -29,7 +29,7 @@ func (e *Effect1146) OnSkill() bool {
return true return true
} }
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{ e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{
Type: info.DamageType.Fixed, Type: info.DamageType.Fixed,
Damage: e.Args()[1], Damage: e.Args()[1],
}) })

View File

@@ -72,7 +72,7 @@ func (e *Effect1263) Skill_Use() bool {
return true return true
} }
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: damage}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: damage})
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, damage) e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, damage)
return true return true
} }
@@ -144,7 +144,7 @@ func (e *Effect1266) Skill_Use_ex() bool {
effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1266, int(e.Args()[1].IntPart())) effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1266, int(e.Args()[1].IntPart()))
if effect != nil { if effect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), effect) e.TargetInput().AddEffect(e.CarrierInput(), effect)
} }
return true return true
} }
@@ -191,7 +191,7 @@ func (e *Effect1267) Skill_Use_ex() bool {
} }
e.triggered = true e.triggered = true
applyOneOfStatuses(e.CarrierInput(), e.OpponentInput(), int(e.Args()[1].IntPart())) applyOneOfStatuses(e.CarrierInput(), e.TargetInput(), int(e.Args()[1].IntPart()))
return true return true
} }
@@ -251,7 +251,7 @@ func (e *Effect1269) SkillHit_ex() bool {
return true return true
} }
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, damage) e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, damage)
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: damage}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: damage})
return true return true
} }
@@ -266,12 +266,12 @@ func (e *Effect1270) OnSkill() bool {
} }
success, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100) success, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100)
if success { if success {
applyStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[1].IntPart())) applyStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[1].IntPart()))
return true return true
} }
effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1270, int(e.Args()[2].IntPart())) effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1270, int(e.Args()[2].IntPart()))
if effect != nil { if effect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), effect) e.TargetInput().AddEffect(e.CarrierInput(), effect)
} }
return true return true
} }
@@ -319,7 +319,7 @@ func (e *Effect1271) OnSkill() bool {
success, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100) success, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100)
if success { if success {
applyStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[2].IntPart())) applyStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[2].IntPart()))
e.triggered = true e.triggered = true
return true return true
} }
@@ -351,7 +351,7 @@ func (e *Effect1271Sub) OnSkill() bool {
} }
success, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100) success, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100)
if success { if success {
applyStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[2].IntPart())) applyStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[2].IntPart()))
} }
e.remaining-- e.remaining--
if e.remaining <= 0 { if e.remaining <= 0 {
@@ -370,7 +370,7 @@ func (e *Effect1272) OnSkill() bool {
if shield.Cmp(alpacadecimal.Zero) <= 0 { if shield.Cmp(alpacadecimal.Zero) <= 0 {
return true return true
} }
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: shield}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: shield})
return true return true
} }
@@ -390,7 +390,7 @@ func (e *Effect1273) OnSkill() bool {
if damage.Cmp(alpacadecimal.Zero) <= 0 { if damage.Cmp(alpacadecimal.Zero) <= 0 {
return true return true
} }
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: damage}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: damage})
return true return true
} }
@@ -404,12 +404,12 @@ func (e *Effect1274) OnSkill() bool {
return true return true
} }
chance := int(e.Args()[0].IntPart()) chance := int(e.Args()[0].IntPart())
if e.OpponentInput().HasPropSub() { if e.TargetInput().HasPropSub() {
chance *= 2 chance *= 2
} }
success, _, _ := e.Input.Player.Roll(chance, 100) success, _, _ := e.Input.Player.Roll(chance, 100)
if success { if success {
applyStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[1].IntPart())) applyStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[1].IntPart()))
} }
return true return true
} }
@@ -471,7 +471,7 @@ func (e *Effect1276) Skill_Use() bool {
damage := e.CarrierPet().GetHP().Div(e.Args()[0]) damage := e.CarrierPet().GetHP().Div(e.Args()[0])
e.CarrierInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: e.CarrierPet().GetHP()}) e.CarrierInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: e.CarrierPet().GetHP()})
if damage.Cmp(alpacadecimal.Zero) > 0 { if damage.Cmp(alpacadecimal.Zero) > 0 {
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: damage}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: damage})
} }
return true return true
} }
@@ -487,14 +487,14 @@ func (e *Effect1277) Skill_Use() bool {
if e.CarrierPet().GetHP().Cmp(leave) > 0 { if e.CarrierPet().GetHP().Cmp(leave) > 0 {
e.CarrierInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: e.CarrierPet().GetHP().Sub(leave)}) e.CarrierInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: e.CarrierPet().GetHP().Sub(leave)})
} }
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: alpacadecimal.NewFromInt(int64(grand.N(350, 550)))}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: alpacadecimal.NewFromInt(int64(grand.N(350, 550)))})
return true return true
} }
lost := e.CarrierPet().GetHP() lost := e.CarrierPet().GetHP()
e.CarrierInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: lost}) e.CarrierInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: lost})
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: lost}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: lost})
applyStatusByID(e.CarrierInput(), e.OpponentInput(), int(info.PetStatus.Paralysis)) applyStatusByID(e.CarrierInput(), e.TargetInput(), int(info.PetStatus.Paralysis))
return true return true
} }
@@ -509,7 +509,7 @@ func (e *Effect1278) OnSkill() bool {
} }
success, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100) success, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100)
if success { if success {
applyStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[1].IntPart())) applyStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[1].IntPart()))
return true return true
} }
effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1278, int(e.Args()[2].IntPart())) effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1278, int(e.Args()[2].IntPart()))
@@ -565,7 +565,7 @@ func (e *Effect1279) OnSkill() bool {
} }
effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1279, int(e.Args()[0].IntPart())) effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1279, int(e.Args()[0].IntPart()))
if effect != nil { if effect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), effect) e.TargetInput().AddEffect(e.CarrierInput(), effect)
} }
return true return true
} }
@@ -616,7 +616,7 @@ func (e *Effect1280) OnSkill() bool {
} }
damage := e.CarrierPet().GetHP().Mul(alpacadecimal.NewFromInt(int64(percent))).Div(alpacadecimal.NewFromInt(100)) damage := e.CarrierPet().GetHP().Mul(alpacadecimal.NewFromInt(int64(percent))).Div(alpacadecimal.NewFromInt(100))
if damage.Cmp(alpacadecimal.Zero) > 0 { if damage.Cmp(alpacadecimal.Zero) > 0 {
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: damage}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: damage})
} }
e.bonus += int(e.Args()[1].IntPart()) e.bonus += int(e.Args()[1].IntPart())
return true return true
@@ -632,16 +632,16 @@ func (e *Effect1281) Skill_Use() bool {
if shield.Cmp(alpacadecimal.Zero) <= 0 { if shield.Cmp(alpacadecimal.Zero) <= 0 {
return true return true
} }
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: shield}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: shield})
if shield.Cmp(alpacadecimal.NewFromInt(300)) > 0 { if shield.Cmp(alpacadecimal.NewFromInt(300)) > 0 {
dmg := e.CarrierPet().GetMaxHP().Div(alpacadecimal.NewFromInt(3)) dmg := e.CarrierPet().GetMaxHP().Div(alpacadecimal.NewFromInt(3))
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: dmg}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: dmg})
return true return true
} }
if shield.Cmp(alpacadecimal.NewFromInt(300)) < 0 { if shield.Cmp(alpacadecimal.NewFromInt(300)) < 0 {
val := e.CarrierPet().GetMaxHP().Div(alpacadecimal.NewFromInt(3)) val := e.CarrierPet().GetMaxHP().Div(alpacadecimal.NewFromInt(3))
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, val) e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, val)
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: val}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: val})
} }
return true return true
} }
@@ -655,7 +655,7 @@ func (e *Effect1282) Skill_Use() bool {
if len(e.Args()) == 0 { if len(e.Args()) == 0 {
return true return true
} }
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: e.Args()[0]}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: e.Args()[0]})
return true return true
} }
@@ -689,7 +689,7 @@ func (e *Effect1284) Skill_Use() bool {
} }
effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1284, int(e.Args()[0].IntPart())) effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1284, int(e.Args()[0].IntPart()))
if effect != nil { if effect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), effect) e.TargetInput().AddEffect(e.CarrierInput(), effect)
} }
return true return true
} }
@@ -732,7 +732,7 @@ func (e *Effect1285) Skill_Use() bool {
if len(e.Args()) == 0 || e.OpponentPet().Info.Hp == 0 { if len(e.Args()) == 0 || e.OpponentPet().Info.Hp == 0 {
return true return true
} }
zeroRandomSkillPP(e.OpponentInput(), int(e.Args()[0].IntPart())) zeroRandomSkillPP(e.TargetInput(), int(e.Args()[0].IntPart()))
return true return true
} }
@@ -754,7 +754,7 @@ func (e *Effect1287) OnSkill() bool {
if len(e.Args()) < 2 { if len(e.Args()) < 2 {
return true return true
} }
absorbed := clearPositivePropsTo(e.OpponentInput(), e.CarrierInput()) absorbed := clearPositivePropsTo(e.TargetInput(), e.CarrierInput())
if !absorbed { if !absorbed {
return true return true
} }

View File

@@ -123,7 +123,7 @@ func (e *Effect1289) OnSkill() bool {
if v >= 0 { if v >= 0 {
continue continue
} }
if e.OpponentInput().SetProp(e.CarrierInput(), int8(i), 2*v) { if e.TargetInput().SetProp(e.CarrierInput(), int8(i), 2*v) {
reflected = true reflected = true
} }
} }
@@ -132,7 +132,7 @@ func (e *Effect1289) OnSkill() bool {
} }
effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1289, int(e.Args()[0].IntPart())) effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1289, int(e.Args()[0].IntPart()))
if effect != nil { if effect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), effect) e.TargetInput().AddEffect(e.CarrierInput(), effect)
} }
return true return true
} }
@@ -184,7 +184,7 @@ func (e *Effect1290) Skill_Use() bool {
} }
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, heal) e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, heal)
if low { if low {
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: heal}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: heal})
} }
return true return true
} }
@@ -201,7 +201,7 @@ func (e *Effect1291) Skill_Use() bool {
} }
success, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100) success, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100)
if success { if success {
applyRandomNStatuses(e.CarrierInput(), e.OpponentInput(), int(e.Args()[2].IntPart()), effect1291Statuses) applyRandomNStatuses(e.CarrierInput(), e.TargetInput(), int(e.Args()[2].IntPart()), effect1291Statuses)
} }
return true return true
} }
@@ -271,11 +271,11 @@ func (e *Effect1293Sub) DamageLockEx(zone *info.DamageZone) bool {
type Effect1294 struct{ node.EffectNode } type Effect1294 struct{ node.EffectNode }
func (e *Effect1294) Skill_Use() bool { func (e *Effect1294) Skill_Use() bool {
cleared := clearBothProps(e.CarrierInput(), e.OpponentInput()) cleared := clearBothProps(e.CarrierInput(), e.TargetInput())
if cleared { if cleared {
effect := e.CarrierInput().InitEffect(input.EffectType.Status, 1294) effect := e.CarrierInput().InitEffect(input.EffectType.Status, 1294)
if effect != nil { if effect != nil {
applyRandomNStatuses(e.CarrierInput(), e.OpponentInput(), 2, effect1291Statuses) applyRandomNStatuses(e.CarrierInput(), e.TargetInput(), 2, effect1291Statuses)
} }
return true return true
} }
@@ -341,15 +341,15 @@ func (e *Effect1297) Skill_Use() bool {
if len(e.Args()) < 2 { if len(e.Args()) < 2 {
return true return true
} }
before := activeTurnEffectCount(e.OpponentInput()) before := activeTurnEffectCount(e.TargetInput())
e.OpponentInput().CancelTurn(e.CarrierInput()) e.TargetInput().CancelTurn(e.CarrierInput())
if before > 0 { if before > 0 {
applyAnyStatus(e.CarrierInput(), e.OpponentInput(), int(e.Args()[0].IntPart())) applyAnyStatus(e.CarrierInput(), e.TargetInput(), int(e.Args()[0].IntPart()))
return true return true
} }
damage := e.OpponentInput().CurPet[0].GetMaxHP().Div(e.Args()[1]) damage := e.TargetInput().CurPet[0].GetMaxHP().Div(e.Args()[1])
if damage.Cmp(alpacadecimal.Zero) > 0 { if damage.Cmp(alpacadecimal.Zero) > 0 {
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: damage}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: damage})
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, damage) e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, damage)
} }
return true return true
@@ -359,12 +359,12 @@ func (e *Effect1297) Skill_Use() bool {
type Effect1298 struct{ node.EffectNode } type Effect1298 struct{ node.EffectNode }
func (e *Effect1298) Skill_Use() bool { func (e *Effect1298) Skill_Use() bool {
cleared := clearPositiveProps(e.OpponentInput(), e.CarrierInput()) cleared := clearPositiveProps(e.TargetInput(), e.CarrierInput())
if !cleared { if !cleared {
return true return true
} }
for _, pet := range e.OpponentInput().AllPet { for _, pet := range e.TargetInput().AllPet {
if pet == nil || !pet.Alive() || pet == e.OpponentInput().CurPet[0] { if pet == nil || !pet.Alive() || pet == e.TargetInput().CurPet[0] {
continue continue
} }
damage := pet.GetMaxHP().Div(alpacadecimal.NewFromInt(4)) damage := pet.GetMaxHP().Div(alpacadecimal.NewFromInt(4))
@@ -386,8 +386,8 @@ func (e *Effect1299) SkillHit_ex() bool {
if e.CarrierInput().SumDamage.Cmp(alpacadecimal.NewFromInt(300)) >= 0 { if e.CarrierInput().SumDamage.Cmp(alpacadecimal.NewFromInt(300)) >= 0 {
return true return true
} }
for _, pet := range e.OpponentInput().AllPet { for _, pet := range e.TargetInput().AllPet {
if pet == nil || !pet.Alive() || pet == e.OpponentInput().CurPet[0] { if pet == nil || !pet.Alive() || pet == e.TargetInput().CurPet[0] {
continue continue
} }
pet.Info.ModelHP(-100) pet.Info.ModelHP(-100)
@@ -426,8 +426,8 @@ func (e *Effect1301) Skill_Use() bool {
return true return true
} }
e.CarrierInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: e.CarrierInput().CurPet[0].GetHP()}) e.CarrierInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: e.CarrierInput().CurPet[0].GetHP()})
for _, pet := range e.OpponentInput().AllPet { for _, pet := range e.TargetInput().AllPet {
if pet == nil || !pet.Alive() || pet == e.OpponentInput().CurPet[0] { if pet == nil || !pet.Alive() || pet == e.TargetInput().CurPet[0] {
continue continue
} }
damage := pet.GetMaxHP().Div(alpacadecimal.NewFromInt(2)) damage := pet.GetMaxHP().Div(alpacadecimal.NewFromInt(2))
@@ -454,7 +454,7 @@ func (e *Effect1302) OnSkill() bool {
if success { if success {
return true return true
} }
clearPositiveProps(e.OpponentInput(), e.CarrierInput()) clearPositiveProps(e.TargetInput(), e.CarrierInput())
return true return true
} }
@@ -462,11 +462,11 @@ func (e *Effect1302) OnSkill() bool {
type Effect1303 struct{ RoundEffectArg0Base } type Effect1303 struct{ RoundEffectArg0Base }
func (e *Effect1303) OnSkill() bool { func (e *Effect1303) OnSkill() bool {
base := e.OpponentInput().CurPet[0].GetMaxHP().Div(alpacadecimal.NewFromInt(3)) base := e.TargetInput().CurPet[0].GetMaxHP().Div(alpacadecimal.NewFromInt(3))
if e.CarrierInput().CurPet[0].GetHP().Cmp(e.CarrierInput().CurPet[0].GetMaxHP().Div(alpacadecimal.NewFromInt(2))) < 0 { if e.CarrierInput().CurPet[0].GetHP().Cmp(e.CarrierInput().CurPet[0].GetMaxHP().Div(alpacadecimal.NewFromInt(2))) < 0 {
base = base.Mul(alpacadecimal.NewFromInt(2)) base = base.Mul(alpacadecimal.NewFromInt(2))
} }
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: base}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: base})
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, base) e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, base)
if e.CarrierInput().CurPet[0].GetHP().Cmp(e.CarrierInput().CurPet[0].GetMaxHP()) == 0 { if e.CarrierInput().CurPet[0].GetHP().Cmp(e.CarrierInput().CurPet[0].GetMaxHP()) == 0 {
healBench(e.CarrierInput(), alpacadecimal.NewFromInt(100)) healBench(e.CarrierInput(), alpacadecimal.NewFromInt(100))
@@ -506,7 +506,7 @@ func (e *Effect1305) OnSkill() bool {
} }
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, alpacadecimal.NewFromInt(int64(live)*e.Args()[0].IntPart())) e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, alpacadecimal.NewFromInt(int64(live)*e.Args()[0].IntPart()))
if dead > 0 { if dead > 0 {
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: alpacadecimal.NewFromInt(int64(dead) * e.Args()[1].IntPart())}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: alpacadecimal.NewFromInt(int64(dead) * e.Args()[1].IntPart())})
} }
return true return true
} }
@@ -518,8 +518,8 @@ func (e *Effect1306) Skill_Use() bool {
if e.CarrierInput().SumDamage.Cmp(alpacadecimal.NewFromInt(350)) >= 0 { if e.CarrierInput().SumDamage.Cmp(alpacadecimal.NewFromInt(350)) >= 0 {
return true return true
} }
for _, pet := range e.OpponentInput().AllPet { for _, pet := range e.TargetInput().AllPet {
if pet == nil || !pet.Alive() || pet == e.OpponentInput().CurPet[0] { if pet == nil || !pet.Alive() || pet == e.TargetInput().CurPet[0] {
continue continue
} }
pet.Info.ModelHP(-100) pet.Info.ModelHP(-100)
@@ -531,7 +531,7 @@ func (e *Effect1306) Skill_Use() bool {
type Effect1307 struct{ node.EffectNode } type Effect1307 struct{ node.EffectNode }
func (e *Effect1307) Skill_Use() bool { func (e *Effect1307) Skill_Use() bool {
if e.OpponentInput().CurPet[0].Info.Hp == 0 { if e.TargetInput().CurPet[0].Info.Hp == 0 {
return true return true
} }
healBench(e.CarrierInput(), alpacadecimal.NewFromInt(100)) healBench(e.CarrierInput(), alpacadecimal.NewFromInt(100))
@@ -551,7 +551,7 @@ func (e *Effect1309) OnSkill() bool {
return true return true
} }
damage := e.Args()[0] damage := e.Args()[0]
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: damage}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: damage})
return true return true
} }
@@ -562,7 +562,7 @@ func (e *Effect1310) OnSkill() bool {
if len(e.Args()) == 0 { if len(e.Args()) == 0 {
return true return true
} }
if !clearPositiveProps(e.OpponentInput(), e.CarrierInput()) { if !clearPositiveProps(e.TargetInput(), e.CarrierInput()) {
return true return true
} }
effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1310, int(e.Args()[0].IntPart())) effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1310, int(e.Args()[0].IntPart()))
@@ -609,7 +609,7 @@ func (e *Effect1311) Skill_Use_ex() bool {
return true return true
} }
for i := 0; i < 6; i++ { for i := 0; i < 6; i++ {
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), -int8(e.Args()[1].IntPart())) e.TargetInput().SetProp(e.CarrierInput(), int8(i), -int8(e.Args()[1].IntPart()))
} }
return true return true
} }

View File

@@ -15,9 +15,9 @@ type Effect143 struct {
// ---------------------- // ----------------------
func (e *Effect143) OnSkill() bool { func (e *Effect143) OnSkill() bool {
for i, v := range e.OpponentInput().Prop[:] { for i, v := range e.TargetInput().Prop[:] {
if v > 0 { if v > 0 {
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), -2*v) e.TargetInput().SetProp(e.CarrierInput(), int8(i), -2*v)
} }
} }

View File

@@ -67,7 +67,7 @@ func (e *Effect1449) Skill_Use() bool {
} }
eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1449, e.SideEffectArgs...) eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1449, e.SideEffectArgs...)
if eff != nil { if eff != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), eff) e.TargetInput().AddEffect(e.CarrierInput(), eff)
} }
return true return true
} }
@@ -96,13 +96,13 @@ func (e *Effect1450) Skill_Use() bool {
return true return true
} }
drain := e.Args()[0] drain := e.Args()[0]
for _, s := range e.OpponentInput().CurPet[0].Info.SkillList { for _, s := range e.TargetInput().CurPet[0].Info.SkillList {
if s.PP < uint32(e.Args()[1].IntPart()) { if s.PP < uint32(e.Args()[1].IntPart()) {
drain = drain.Mul(alpacadecimal.NewFromInt(2)) drain = drain.Mul(alpacadecimal.NewFromInt(2))
break break
} }
} }
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: drain}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: drain})
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, drain) e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, drain)
return true return true
} }
@@ -114,7 +114,7 @@ func (e *Effect1451) Skill_Use() bool {
if len(e.Args()) < 2 { if len(e.Args()) < 2 {
return true return true
} }
if e.CarrierInput().CurPet[0].GetHP().Cmp(e.OpponentInput().CurPet[0].GetHP()) > 0 { if e.CarrierInput().CurPet[0].GetHP().Cmp(e.TargetInput().CurPet[0].GetHP()) > 0 {
e.CarrierInput().AddShield(e.Args()[0]) e.CarrierInput().AddShield(e.Args()[0])
return true return true
} }
@@ -210,7 +210,7 @@ func (e *Effect1456) Skill_Use() bool {
} }
maxHP := e.CarrierInput().CurPet[0].GetMaxHP() maxHP := e.CarrierInput().CurPet[0].GetMaxHP()
e.CarrierInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: e.CarrierInput().CurPet[0].GetHP()}) e.CarrierInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: e.CarrierInput().CurPet[0].GetHP()})
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: maxHP.Div(e.Args()[0])}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: maxHP.Div(e.Args()[0])})
eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1456, e.SideEffectArgs...) eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1456, e.SideEffectArgs...)
if eff != nil { if eff != nil {
e.CarrierInput().AddEffect(e.CarrierInput(), eff) e.CarrierInput().AddEffect(e.CarrierInput(), eff)
@@ -236,10 +236,10 @@ func (e *Effect1457) OnSkill() bool {
} }
success, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100) success, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100)
if success { if success {
addStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[2].IntPart())) addStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[2].IntPart()))
return true return true
} }
randomSkillPPZero(e.OpponentInput(), int(e.Args()[3].IntPart())) randomSkillPPZero(e.TargetInput(), int(e.Args()[3].IntPart()))
return true return true
} }
@@ -267,7 +267,7 @@ func (e *Effect1458Sub) SkillHit_ex() bool {
} }
if len(e.Args()) >= 4 { if len(e.Args()) >= 4 {
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[2].IntPart()), 100); ok { if ok, _, _ := e.Input.Player.Roll(int(e.Args()[2].IntPart()), 100); ok {
addStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[3].IntPart())) addStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[3].IntPart()))
} }
} }
return true return true
@@ -281,12 +281,12 @@ func (e *Effect1459) ActionStart(a, b *action.SelectSkillAction) bool {
return true return true
} }
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok { if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok {
addStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[1].IntPart())) addStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[1].IntPart()))
return true return true
} }
eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1459, e.SideEffectArgs...) eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1459, e.SideEffectArgs...)
if eff != nil { if eff != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), eff) e.TargetInput().AddEffect(e.CarrierInput(), eff)
} }
return true return true
} }
@@ -324,8 +324,8 @@ func (e *Effect1461) Skill_Use() bool {
} }
heal := e.CarrierInput().CurPet[0].GetMaxHP().Div(e.Args()[0]) heal := e.CarrierInput().CurPet[0].GetMaxHP().Div(e.Args()[0])
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, heal) e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, heal)
if e.CarrierInput().CurPet[0].GetHP().Cmp(e.OpponentInput().CurPet[0].GetHP()) < 0 { if e.CarrierInput().CurPet[0].GetHP().Cmp(e.TargetInput().CurPet[0].GetHP()) < 0 {
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: heal}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: heal})
} }
return true return true
} }
@@ -394,14 +394,14 @@ func (e *Effect1463Sub) DamageLock(zone *info.DamageZone) bool {
type Effect1464 struct{ node.EffectNode } type Effect1464 struct{ node.EffectNode }
func (e *Effect1464) OnSkill() bool { func (e *Effect1464) OnSkill() bool {
if e.OpponentInput().CurPet[0].Info.Hp > 0 || len(e.Args()) < 3 { if e.TargetInput().CurPet[0].Info.Hp > 0 || len(e.Args()) < 3 {
return true return true
} }
if !e.OpponentInput().StatEffect_Exist(info.EnumPetStatus(e.Args()[0].IntPart())) { if !e.TargetInput().StatEffect_Exist(info.EnumPetStatus(e.Args()[0].IntPart())) {
return true return true
} }
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100); ok { if ok, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100); ok {
addStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[2].IntPart())) addStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[2].IntPart()))
} }
return true return true
} }
@@ -419,8 +419,8 @@ func (e *Effect1465) ActionStart(a, b *action.SelectSkillAction) bool {
} }
return true return true
} }
for i := range e.OpponentInput().Prop[:] { for i := range e.TargetInput().Prop[:] {
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), int8(-e.Args()[0].IntPart())) e.TargetInput().SetProp(e.CarrierInput(), int8(i), int8(-e.Args()[0].IntPart()))
} }
return true return true
} }
@@ -443,7 +443,7 @@ func (e *Effect1466Sub) SkillHit_ex() bool {
return true return true
} }
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100); ok { if ok, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100); ok {
addStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[2].IntPart())) addStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[2].IntPart()))
} }
return true return true
} }
@@ -478,7 +478,7 @@ func (e *Effect1468) Skill_Use() bool {
return true return true
} }
triggered := false triggered := false
for _, target := range []*input.Input{e.CarrierInput(), e.OpponentInput()} { for _, target := range []*input.Input{e.CarrierInput(), e.TargetInput()} {
for _, eff := range target.Effects { for _, eff := range target.Effects {
if eff != nil && eff.Alive() { if eff != nil && eff.Alive() {
eff.Alive(false) eff.Alive(false)
@@ -487,8 +487,8 @@ func (e *Effect1468) Skill_Use() bool {
} }
} }
if triggered { if triggered {
damageByFixed(e.CarrierInput(), e.OpponentInput(), e.Args()[0].IntPart()) damageByFixed(e.CarrierInput(), e.TargetInput(), e.Args()[0].IntPart())
randomSkillPPZero(e.OpponentInput(), int(e.Args()[1].IntPart())) randomSkillPPZero(e.TargetInput(), int(e.Args()[1].IntPart()))
} }
return true return true
} }
@@ -533,7 +533,7 @@ func (e *Effect1471) Skill_Use() bool {
return true return true
} }
removed := false removed := false
for _, eff := range e.OpponentInput().Effects { for _, eff := range e.TargetInput().Effects {
if eff != nil && eff.Alive() { if eff != nil && eff.Alive() {
eff.Alive(false) eff.Alive(false)
removed = true removed = true
@@ -541,7 +541,7 @@ func (e *Effect1471) Skill_Use() bool {
} }
if removed { if removed {
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok { if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok {
addStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[1].IntPart())) addStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[1].IntPart()))
} }
return true return true
} }

View File

@@ -17,7 +17,7 @@ func (e *Effect146) Skill_Use_ex() bool {
if success { if success {
poisonEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Poisoned)) poisonEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Poisoned))
if poisonEffect != nil { if poisonEffect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), poisonEffect) e.TargetInput().AddEffect(e.CarrierInput(), poisonEffect)
} }
} }
} }

View File

@@ -17,7 +17,7 @@ func (e *Effect1473) Skill_Use() bool {
return true return true
} }
cleared := false cleared := false
for _, eff := range e.OpponentInput().Effects { for _, eff := range e.TargetInput().Effects {
if eff == nil || !eff.Alive() { if eff == nil || !eff.Alive() {
continue continue
} }
@@ -25,7 +25,7 @@ func (e *Effect1473) Skill_Use() bool {
cleared = true cleared = true
} }
if cleared { if cleared {
randomSkillPPZero(e.OpponentInput(), int(e.Args()[0].IntPart())) randomSkillPPZero(e.TargetInput(), int(e.Args()[0].IntPart()))
} }
return true return true
} }
@@ -90,8 +90,8 @@ func (e *Effect1476) Skill_Use() bool {
if e.CarrierInput().CurPet[0].GetHP().Mul(e.Args()[1]).Cmp(e.CarrierInput().CurPet[0].GetMaxHP()) < 0 { if e.CarrierInput().CurPet[0].GetHP().Mul(e.Args()[1]).Cmp(e.CarrierInput().CurPet[0].GetMaxHP()) < 0 {
delta *= 2 delta *= 2
} }
for i := range e.OpponentInput().Prop[:] { for i := range e.TargetInput().Prop[:] {
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), delta) e.TargetInput().SetProp(e.CarrierInput(), int8(i), delta)
} }
return true return true
} }
@@ -104,7 +104,7 @@ func (e *Effect1477) Skill_Use() bool {
return true return true
} }
cleared := false cleared := false
for _, target := range []*input.Input{e.CarrierInput(), e.OpponentInput()} { for _, target := range []*input.Input{e.CarrierInput(), e.TargetInput()} {
for _, eff := range target.Effects { for _, eff := range target.Effects {
if eff == nil || !eff.Alive() { if eff == nil || !eff.Alive() {
continue continue
@@ -114,8 +114,8 @@ func (e *Effect1477) Skill_Use() bool {
} }
} }
if cleared { if cleared {
drain := e.OpponentInput().CurPet[0].GetMaxHP().Div(e.Args()[0]) drain := e.TargetInput().CurPet[0].GetMaxHP().Div(e.Args()[0])
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: drain}) e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: drain})
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, drain) e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, drain)
} }
return true return true
@@ -151,7 +151,7 @@ func (e *Effect1479) Skill_Use() bool {
e.CarrierInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: e.CarrierInput().CurPet[0].GetHP()}) e.CarrierInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: e.CarrierInput().CurPet[0].GetHP()})
eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1479, e.SideEffectArgs...) eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1479, e.SideEffectArgs...)
if eff != nil { if eff != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), eff) e.TargetInput().AddEffect(e.CarrierInput(), eff)
} }
return true return true
} }
@@ -217,10 +217,10 @@ func (e *Effect1482) Skill_Use() bool {
return true return true
} }
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok { if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok {
addStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[1].IntPart())) addStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[1].IntPart()))
return true return true
} }
for _, eff := range e.OpponentInput().Effects { for _, eff := range e.TargetInput().Effects {
if eff != nil && eff.Alive() { if eff != nil && eff.Alive() {
eff.Alive(false) eff.Alive(false)
} }
@@ -245,7 +245,7 @@ func (e *Effect1483Sub) Skill_Use() bool {
if e.Ctx().SkillEntity != nil && e.Ctx().SkillEntity.Crit > 0 { if e.Ctx().SkillEntity != nil && e.Ctx().SkillEntity.Crit > 0 {
eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1483, e.SideEffectArgs...) eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1483, e.SideEffectArgs...)
if eff != nil { if eff != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), eff) e.TargetInput().AddEffect(e.CarrierInput(), eff)
} }
} }
return true return true
@@ -280,7 +280,7 @@ func (e *Effect1485) OnSkill() bool {
return true return true
} }
boosted := false boosted := false
for _, v := range e.OpponentInput().Prop[:] { for _, v := range e.TargetInput().Prop[:] {
if v > 0 { if v > 0 {
boosted = true boosted = true
break break
@@ -290,11 +290,11 @@ func (e *Effect1485) OnSkill() bool {
return true return true
} }
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok { if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok {
addStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[1].IntPart())) addStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[1].IntPart()))
return true return true
} }
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[2].IntPart()), 100); ok { if ok, _, _ := e.Input.Player.Roll(int(e.Args()[2].IntPart()), 100); ok {
addStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[3].IntPart())) addStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[3].IntPart()))
} }
return true return true
} }
@@ -341,7 +341,7 @@ func (e *Effect1488) OnSkill() bool {
return true return true
} }
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok { if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok {
addStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[1].IntPart())) addStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[1].IntPart()))
} }
return true return true
} }
@@ -354,7 +354,7 @@ func (e *Effect1489) OnSkill() bool {
return true return true
} }
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok { if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok {
addStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[1].IntPart())) addStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[1].IntPart()))
return true return true
} }
eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1489, e.SideEffectArgs...) eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1489, e.SideEffectArgs...)
@@ -384,12 +384,12 @@ func (e *Effect1490) OnSkill() bool {
return true return true
} }
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok { if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok {
addStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[1].IntPart())) addStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[1].IntPart()))
return true return true
} }
eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1490, e.SideEffectArgs...) eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1490, e.SideEffectArgs...)
if eff != nil { if eff != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), eff) e.TargetInput().AddEffect(e.CarrierInput(), eff)
} }
return true return true
} }
@@ -425,7 +425,7 @@ func (e *Effect1492) OnSkill() bool {
return true return true
} }
down := false down := false
for _, v := range e.OpponentInput().Prop[:] { for _, v := range e.TargetInput().Prop[:] {
if v < 0 { if v < 0 {
down = true down = true
break break
@@ -434,7 +434,7 @@ func (e *Effect1492) OnSkill() bool {
if !down { if !down {
return true return true
} }
applyRandomStatuses1507(e.CarrierInput(), e.OpponentInput(), int(e.Args()[0].IntPart())) applyRandomStatuses1507(e.CarrierInput(), e.TargetInput(), int(e.Args()[0].IntPart()))
return true return true
} }
@@ -468,7 +468,7 @@ func (e *Effect1494) OnSkill() bool {
return true return true
} }
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok { if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok {
randomSkillPPZero(e.OpponentInput(), int(e.Args()[1].IntPart())) randomSkillPPZero(e.TargetInput(), int(e.Args()[1].IntPart()))
} }
return true return true
} }
@@ -481,7 +481,7 @@ func (e *Effect1495) Skill_Use() bool {
return true return true
} }
swapped := false swapped := false
for _, i := range e.OpponentInput().Prop[:] { for _, i := range e.TargetInput().Prop[:] {
if i > 0 { if i > 0 {
swapped = true swapped = true
break break
@@ -491,7 +491,7 @@ func (e *Effect1495) Skill_Use() bool {
return true return true
} }
if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok { if ok, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100); ok {
randomSkillPPZero(e.OpponentInput(), int(e.Args()[1].IntPart())) randomSkillPPZero(e.TargetInput(), int(e.Args()[1].IntPart()))
} }
return true return true
} }
@@ -525,7 +525,7 @@ func (e *Effect1496Sub) TurnEnd() {
type Effect1497 struct{ node.EffectNode } type Effect1497 struct{ node.EffectNode }
func (e *Effect1497) Skill_Use() bool { func (e *Effect1497) Skill_Use() bool {
heal := e.CarrierInput().CurrentShield().Add(e.OpponentInput().CurrentShield()) heal := e.CarrierInput().CurrentShield().Add(e.TargetInput().CurrentShield())
if heal.Cmp(alpacadecimal.Zero) > 0 { if heal.Cmp(alpacadecimal.Zero) > 0 {
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, heal) e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, heal)
} }

View File

@@ -20,7 +20,7 @@ func (e *Effect149) OnSkill() bool {
statusEffect1 := e.CarrierInput().InitEffect(input.EffectType.Status, effectType1) statusEffect1 := e.CarrierInput().InitEffect(input.EffectType.Status, effectType1)
if statusEffect1 != nil { if statusEffect1 != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect1) e.TargetInput().AddEffect(e.CarrierInput(), statusEffect1)
} }
} }
@@ -32,7 +32,7 @@ func (e *Effect149) OnSkill() bool {
statusEffect2 := e.CarrierInput().InitEffect(input.EffectType.Status, effectType2) statusEffect2 := e.CarrierInput().InitEffect(input.EffectType.Status, effectType2)
if statusEffect2 != nil { if statusEffect2 != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect2) e.TargetInput().AddEffect(e.CarrierInput(), statusEffect2)
} }
} }

View File

@@ -10,9 +10,9 @@ type Effect150 struct {
} }
func (e *Effect150) Skill_Use() bool { func (e *Effect150) Skill_Use() bool {
e.OpponentInput().SetProp(e.OpponentInput(), 1, int8(e.SideEffectArgs[1])) e.TargetInput().SetProp(e.TargetInput(), 1, int8(e.SideEffectArgs[1]))
e.OpponentInput().SetProp(e.OpponentInput(), 3, int8(e.SideEffectArgs[1])) e.TargetInput().SetProp(e.TargetInput(), 3, int8(e.SideEffectArgs[1]))
return true return true
} }
func init() { func init() {

View File

@@ -12,15 +12,15 @@ type Effect156 struct {
func (e *Effect156) Skill_Use() bool { func (e *Effect156) Skill_Use() bool {
for i, v := range e.OpponentInput().Prop[:] { for i, v := range e.TargetInput().Prop[:] {
if v > 0 { if v > 0 {
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), 0) e.TargetInput().SetProp(e.CarrierInput(), int8(i), 0)
} }
} }
addSubEffect(e.CarrierInput(), e.OpponentInput(), &e.EffectNode, &Effect156_sub{}, e.SideEffectArgs[0]) addSubEffect(e.CarrierInput(), e.TargetInput(), &e.EffectNode, &Effect156_sub{}, e.SideEffectArgs[0])
return true return true
} }

View File

@@ -13,9 +13,9 @@ func (e *Effect157) Skill_Use_ex() bool {
if e.Ctx().SkillEntity == nil { if e.Ctx().SkillEntity == nil {
return true return true
} }
e.OpponentInput().SetProp(e.CarrierInput(), 1, -1) e.TargetInput().SetProp(e.CarrierInput(), 1, -1)
e.OpponentInput().SetProp(e.CarrierInput(), 3, -1) e.TargetInput().SetProp(e.CarrierInput(), 3, -1)
e.OpponentInput().SetProp(e.CarrierInput(), 5, -1) e.TargetInput().SetProp(e.CarrierInput(), 5, -1)
return true return true
} }

View File

@@ -17,7 +17,7 @@ func (e *Effect166) Skill_Use_ex() bool {
if success { if success {
effectType := int8(e.Args()[1].IntPart()) // XX类型 effectType := int8(e.Args()[1].IntPart()) // XX类型
effectValue := int8(e.Args()[2].IntPart()) // 等级k effectValue := int8(e.Args()[2].IntPart()) // 等级k
e.OpponentInput().SetProp(e.CarrierInput(), effectType, effectValue) e.TargetInput().SetProp(e.CarrierInput(), effectType, effectValue)
} }
} }

View File

@@ -17,7 +17,7 @@ func (e *Effect169) OnSkill() bool {
// 添加异常状态 // 添加异常状态
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(e.Args()[2].IntPart())) // 以麻痹为例 statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(e.Args()[2].IntPart())) // 以麻痹为例
if statusEffect != nil { if statusEffect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect) e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
} }
} }
return true return true

View File

@@ -18,7 +18,7 @@ func (e *Effect173) OnSkill() bool {
if success { if success {
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(e.Args()[1].IntPart())) // 以麻痹为例 statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(e.Args()[1].IntPart())) // 以麻痹为例
if statusEffect != nil { if statusEffect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect) e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
} }
} }
} }

View File

@@ -11,7 +11,7 @@ type Effect175 struct {
} }
func (e *Effect175) OnSkill() bool { func (e *Effect175) OnSkill() bool {
if e.OpponentInput().StatEffect_Exist_all() { // 对手处于异常状态 if e.TargetInput().StatEffect_Exist_all() { // 对手处于异常状态
chance := e.Args()[0].IntPart() chance := e.Args()[0].IntPart()
success, _, _ := e.Input.Player.Roll(int(chance), 100) success, _, _ := e.Input.Player.Roll(int(chance), 100)
if success { if success {

View File

@@ -32,7 +32,7 @@ func (e *Effect176) OnSkill() bool {
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, selectedStatus) statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, selectedStatus)
if statusEffect != nil { if statusEffect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect) e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
} }
} }

View File

@@ -17,7 +17,7 @@ func (e *Effect178) Skill_Use_ex() bool {
damageDone := e.CarrierInput().SumDamage damageDone := e.CarrierInput().SumDamage
var healAmount alpacadecimal.Decimal var healAmount alpacadecimal.Decimal
if e.CarrierInput().CurPet[0].Type == e.OpponentInput().CurPet[0].Type { if e.CarrierInput().CurPet[0].Type == e.TargetInput().CurPet[0].Type {
// 属性相同1/m // 属性相同1/m
healAmount = damageDone.Div(e.Args()[1]) healAmount = damageDone.Div(e.Args()[1])
} else { } else {

View File

@@ -15,7 +15,7 @@ func (e *Effect179) SkillHit() bool {
return true return true
} }
if e.CarrierInput().CurPet[0].Type == e.OpponentInput().CurPet[0].Type { if e.CarrierInput().CurPet[0].Type == e.TargetInput().CurPet[0].Type {
// 属性相同技能威力提升n // 属性相同技能威力提升n
e.Ctx().SkillEntity.XML.Power += int(e.Args()[0].IntPart()) e.Ctx().SkillEntity.XML.Power += int(e.Args()[0].IntPart())
} }

View File

@@ -11,7 +11,7 @@ type Effect184 struct {
} }
func (e *Effect184) OnSkill() bool { func (e *Effect184) OnSkill() bool {
if e.OpponentInput().HasPropADD() { // 对手处于能力提升状态 if e.TargetInput().HasPropADD() { // 对手处于能力提升状态
chance := e.Args()[0].IntPart() chance := e.Args()[0].IntPart()
success, _, _ := e.Input.Player.Roll(int(chance), 100) success, _, _ := e.Input.Player.Roll(int(chance), 100)
if success { if success {

View File

@@ -15,12 +15,12 @@ func (e *Effect188) SkillHit() bool {
return true return true
} }
if e.OpponentInput().StatEffect_Exist_all() { // 对手处于异常状态 if e.TargetInput().StatEffect_Exist_all() { // 对手处于异常状态
// 威力翻倍 // 威力翻倍
e.Ctx().SkillEntity.XML.Power *= 2 e.Ctx().SkillEntity.XML.Power *= 2
// 消除对手相应的防御能力提升效果 // 消除对手相应的防御能力提升效果
e.OpponentInput().SetProp(e.CarrierInput(), 1, 0) e.TargetInput().SetProp(e.CarrierInput(), 1, 0)
} }
return true return true

View File

@@ -15,9 +15,9 @@ func (e *Effect190) Skill_Use_ex() bool {
} }
// 消除对手所有能力强化状态 // 消除对手所有能力强化状态
for i, v := range e.OpponentInput().Prop[:] { for i, v := range e.TargetInput().Prop[:] {
if v > 0 { if v > 0 {
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), 0) e.TargetInput().SetProp(e.CarrierInput(), int8(i), 0)
} }
} }

View File

@@ -16,7 +16,7 @@ func (e *Effect193) SkillHit() bool {
return true return true
} }
if e.OpponentInput().StatEffect_Exist(info.EnumPetStatus(e.Args()[0].IntPart())) { // 对手处于异常状态 if e.TargetInput().StatEffect_Exist(info.EnumPetStatus(e.Args()[0].IntPart())) { // 对手处于异常状态
// 设定必定暴击 // 设定必定暴击
e.Ctx().SkillEntity.XML.CritRate = 16 e.Ctx().SkillEntity.XML.CritRate = 16
} }

View File

@@ -18,7 +18,7 @@ func (e *Effect194) Skill_Use() bool {
damageDone := e.CarrierInput().SumDamage damageDone := e.CarrierInput().SumDamage
var healAmount alpacadecimal.Decimal var healAmount alpacadecimal.Decimal
if e.OpponentInput().StatEffect_Exist(info.EnumPetStatus(e.Args()[1].IntPart())) { // 假设有检查异常状态的方法 if e.TargetInput().StatEffect_Exist(info.EnumPetStatus(e.Args()[1].IntPart())) { // 假设有检查异常状态的方法
healAmount = damageDone.Div(e.Args()[2]) // 1/m healAmount = damageDone.Div(e.Args()[2]) // 1/m
} else { } else {
healAmount = damageDone.Div(e.Args()[0]) // 1/n healAmount = damageDone.Div(e.Args()[0]) // 1/n

View File

@@ -16,14 +16,14 @@ func (e *Effect196) OnSkill() bool {
effectValue := e.Args()[5].IntPart() // 等级-k effectValue := e.Args()[5].IntPart() // 等级-k
success, _, _ := e.Input.Player.Roll(int(chance), 100) success, _, _ := e.Input.Player.Roll(int(chance), 100)
if success { if success {
e.OpponentInput().SetProp(e.OpponentInput(), int8(e.Args()[3].IntPart()), int8(effectValue)) e.TargetInput().SetProp(e.TargetInput(), int8(e.Args()[3].IntPart()), int8(effectValue))
} }
} else { // 后出手 } else { // 后出手
chance := e.Args()[1].IntPart() // j% chance := e.Args()[1].IntPart() // j%
effectValue := e.Args()[2].IntPart() // 等级-k effectValue := e.Args()[2].IntPart() // 等级-k
success, _, _ := e.Input.Player.Roll(int(chance), 100) success, _, _ := e.Input.Player.Roll(int(chance), 100)
if success { if success {
e.OpponentInput().SetProp(e.OpponentInput(), int8(e.Args()[0].IntPart()), int8(effectValue)) e.TargetInput().SetProp(e.TargetInput(), int8(e.Args()[0].IntPart()), int8(effectValue))
} }
} }

View File

@@ -18,7 +18,7 @@ func (e *Effect198) OnSkill() bool {
// 随机选择n种能力 // 随机选择n种能力
for i := 0; i < numStats; i++ { for i := 0; i < numStats; i++ {
e.OpponentInput().SetProp(e.CarrierInput(), int8(grand.Intn(5)), reduction) e.TargetInput().SetProp(e.CarrierInput(), int8(grand.Intn(5)), reduction)
} }
return true return true

View File

@@ -11,7 +11,7 @@ type Effect200 struct {
} }
func (e *Effect200) OnSkill() bool { func (e *Effect200) OnSkill() bool {
if e.OpponentInput().HasPropADD() { if e.TargetInput().HasPropADD() {
chance := e.Args()[0].IntPart() chance := e.Args()[0].IntPart()
success, _, _ := e.Input.Player.Roll(int(chance), 100) success, _, _ := e.Input.Player.Roll(int(chance), 100)
if success { if success {
@@ -19,7 +19,7 @@ func (e *Effect200) OnSkill() bool {
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType) statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType)
if statusEffect != nil { if statusEffect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect) e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
} }
} }

View File

@@ -17,7 +17,7 @@ func (e *Effect400) SkillHit() bool {
if e.Ctx().SkillEntity == nil { if e.Ctx().SkillEntity == nil {
return true return true
} }
if e.CarrierInput().CurPet[0].PetInfo.Type != e.OpponentInput().CurPet[0].PetInfo.Type { if e.CarrierInput().CurPet[0].PetInfo.Type != e.TargetInput().CurPet[0].PetInfo.Type {
return true return true
} }
e.Ctx().SkillEntity.XML.Power *= 2 e.Ctx().SkillEntity.XML.Power *= 2
@@ -129,7 +129,7 @@ func (e *Effect611) OnSkill() bool {
if e.Ctx().SkillEntity.Category() == info.Category.STATUS { if e.Ctx().SkillEntity.Category() == info.Category.STATUS {
return true return true
} }
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{ e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{
Type: info.DamageType.Fixed, Type: info.DamageType.Fixed,
Damage: e.Args()[1], Damage: e.Args()[1],
}) })

View File

@@ -17,7 +17,7 @@ func (e *Effect403) OnSkill() bool {
if success { if success {
boostValue := int8(e.Args()[1].IntPart()) boostValue := int8(e.Args()[1].IntPart())
// 检查属性是否相同 // 检查属性是否相同
if e.CarrierInput().CurPet[0].Type == e.OpponentInput().CurPet[0].Type { if e.CarrierInput().CurPet[0].Type == e.TargetInput().CurPet[0].Type {
boostValue *= 2 boostValue *= 2
} }

View File

@@ -11,8 +11,8 @@ type Effect418 struct {
} }
func (e *Effect418) OnSkill() bool { func (e *Effect418) OnSkill() bool {
if e.OpponentInput().HasPropADD() { if e.TargetInput().HasPropADD() {
e.OpponentInput().SetProp(e.CarrierInput(), int8(e.SideEffectArgs[0]), int8(e.SideEffectArgs[1])) e.TargetInput().SetProp(e.CarrierInput(), int8(e.SideEffectArgs[0]), int8(e.SideEffectArgs[1]))
} }

View File

@@ -24,7 +24,7 @@ func (e *Effect422) Skill_Use() bool {
Type: info.DamageType.Fixed, Type: info.DamageType.Fixed,
Damage: additionalDamage, Damage: additionalDamage,
} }
e.OpponentInput().Damage(e.CarrierInput(), damageZone) e.TargetInput().Damage(e.CarrierInput(), damageZone)
} }
return true return true

View File

@@ -10,7 +10,7 @@ type Effect424 struct {
} }
func (e *Effect424) Skill_Use() bool { func (e *Effect424) Skill_Use() bool {
e.OpponentInput().SetProp(e.CarrierInput(), 4, int8(e.Args()[1].IntPart())) e.TargetInput().SetProp(e.CarrierInput(), 4, int8(e.Args()[1].IntPart()))
return true return true
} }

View File

@@ -19,7 +19,7 @@ func (e *Effect425) Skill_Use() bool {
// 随机选择n项属性 // 随机选择n项属性
for i := 0; i < numStats; i++ { for i := 0; i < numStats; i++ {
t := int8(grand.Intn(6)) t := int8(grand.Intn(6))
e.OpponentInput().SetProp(e.CarrierInput(), t, changeValue) e.TargetInput().SetProp(e.CarrierInput(), t, changeValue)
e.CarrierInput().SetProp(e.CarrierInput(), t, -changeValue) e.CarrierInput().SetProp(e.CarrierInput(), t, -changeValue)
} }

View File

@@ -16,9 +16,9 @@ func (e *Effect427) Skill_Use() bool {
} }
if e.Ctx().SkillEntity != nil && e.Ctx().SkillEntity.Category() != info.Category.STATUS { if e.Ctx().SkillEntity != nil && e.Ctx().SkillEntity.Category() != info.Category.STATUS {
// 降低对手防御 // 降低对手防御
e.OpponentInput().SetProp(e.OpponentInput(), 1, int8(e.SideEffectArgs[1])) e.TargetInput().SetProp(e.TargetInput(), 1, int8(e.SideEffectArgs[1]))
e.OpponentInput().SetProp(e.OpponentInput(), 3, int8(e.SideEffectArgs[1])) e.TargetInput().SetProp(e.TargetInput(), 3, int8(e.SideEffectArgs[1]))
} }
return true return true

View File

@@ -21,7 +21,7 @@ func (e *Effect428) Skill_Use() bool {
Type: info.DamageType.Fixed, Type: info.DamageType.Fixed,
Damage: e.Args()[0], Damage: e.Args()[0],
} }
e.OpponentInput().Damage(e.CarrierInput(), damageZone) e.TargetInput().Damage(e.CarrierInput(), damageZone)
return true return true
} }

View File

@@ -13,10 +13,10 @@ type Effect430 struct {
func (e *Effect430) Skill_Use() bool { func (e *Effect430) Skill_Use() bool {
var isadd bool var isadd bool
// 检查对手是否有能力强化状态 // 检查对手是否有能力强化状态
for i, v := range e.OpponentInput().Prop[:] { for i, v := range e.TargetInput().Prop[:] {
if v > 0 { if v > 0 {
if e.OpponentInput().SetProp(e.CarrierInput(), int8(i), 0) { if e.TargetInput().SetProp(e.CarrierInput(), int8(i), 0) {
isadd = true isadd = true
} }
return true return true

View File

@@ -19,7 +19,7 @@ func (e *Effect434) OnSkill() bool {
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType) statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType)
if statusEffect != nil { if statusEffect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect) e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
} }
} }
} }

View File

@@ -12,8 +12,8 @@ type Effect437 struct {
func (e *Effect437) OnSkill() bool { func (e *Effect437) OnSkill() bool {
if e.OpponentInput().HasPropADD() { if e.TargetInput().HasPropADD() {
e.OpponentInput().SetProp(e.OpponentInput(), int8(e.SideEffectArgs[0]), int8(e.SideEffectArgs[1])) e.TargetInput().SetProp(e.TargetInput(), int8(e.SideEffectArgs[0]), int8(e.SideEffectArgs[1]))
} }

View File

@@ -13,7 +13,7 @@ type Effect440 struct {
func (e *Effect440) Skill_Use() bool { func (e *Effect440) Skill_Use() bool {
// 创建一个延迟生效的效果,在下一回合开始生效 // 创建一个延迟生效的效果,在下一回合开始生效
addSubEffect(e.CarrierInput(), e.OpponentInput(), &e.EffectNode, &Effect440_sub{ addSubEffect(e.CarrierInput(), e.TargetInput(), &e.EffectNode, &Effect440_sub{
m: int(e.Args()[1].IntPart()), m: int(e.Args()[1].IntPart()),
}, int(e.Args()[0].IntPart())) }, int(e.Args()[0].IntPart()))
return true return true

View File

@@ -18,7 +18,7 @@ func (e *Effect442) OnSkill() bool {
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(e.Args()[1].IntPart())) // 以麻痹为例 statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(e.Args()[1].IntPart())) // 以麻痹为例
if statusEffect != nil { if statusEffect != nil {
statusEffect.SetArgs(e.CarrierInput(), 1) statusEffect.SetArgs(e.CarrierInput(), 1)
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect) e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
} }
} }

View File

@@ -20,7 +20,7 @@ func (e *Effect443) Skill_Use_ex() bool {
tiredEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Tired)) tiredEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Tired))
if tiredEffect != nil { if tiredEffect != nil {
tiredEffect.Duration(int(e.Args()[2].IntPart())) // x回合 tiredEffect.Duration(int(e.Args()[2].IntPart())) // x回合
e.OpponentInput().AddEffect(e.CarrierInput(), tiredEffect) e.TargetInput().AddEffect(e.CarrierInput(), tiredEffect)
} }
} }

View File

@@ -12,7 +12,7 @@ type Effect444 struct {
func (e *Effect444) OnSkill() bool { func (e *Effect444) OnSkill() bool {
// 降低对手所有技能PP // 降低对手所有技能PP
e.OpponentInput().DelPP(1) e.TargetInput().DelPP(1)
e.CarrierInput().HealPP(1) e.CarrierInput().HealPP(1)

View File

@@ -11,7 +11,7 @@ type Effect449 struct {
} }
func (e *Effect449) OnSkill() bool { func (e *Effect449) OnSkill() bool {
if e.OpponentInput().HasPropSub() { if e.TargetInput().HasPropSub() {
chance := e.Args()[0].IntPart() // N% chance := e.Args()[0].IntPart() // N%
success, _, _ := e.Input.Player.Roll(int(chance), 100) success, _, _ := e.Input.Player.Roll(int(chance), 100)
if success { if success {
@@ -19,7 +19,7 @@ func (e *Effect449) OnSkill() bool {
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType) statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType)
if statusEffect != nil { if statusEffect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect) e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
} }
} }

View File

@@ -13,10 +13,10 @@ type Effect453 struct {
func (e *Effect453) Skill_Use() bool { func (e *Effect453) Skill_Use() bool {
// 检查对手是否有能力强化状态 // 检查对手是否有能力强化状态
ispwoer := false ispwoer := false
for i, v := range e.OpponentInput().Prop[:] { for i, v := range e.TargetInput().Prop[:] {
if v > 0 { if v > 0 {
if e.OpponentInput().SetProp(e.OpponentInput(), int8(i), 0) { if e.TargetInput().SetProp(e.TargetInput(), int8(i), 0) {
ispwoer = true ispwoer = true
} }
@@ -30,7 +30,7 @@ func (e *Effect453) Skill_Use() bool {
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType) statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType)
if statusEffect != nil { if statusEffect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect) e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
} }
} }

View File

@@ -12,8 +12,8 @@ type Effect456 struct {
} }
func (e *Effect456) OnSkill() bool { func (e *Effect456) OnSkill() bool {
if e.OpponentInput().CurPet[0].GetHP().Cmp(e.Args()[0]) > 0 { if e.TargetInput().CurPet[0].GetHP().Cmp(e.Args()[0]) > 0 {
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{ e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{
Type: info.DamageType.Fixed, Type: info.DamageType.Fixed,
Damage: e.Args()[0], Damage: e.Args()[0],

View File

@@ -15,7 +15,7 @@ func (e *Effect460) OnSkill() bool {
baseChance := e.Args()[0].IntPart() // m% baseChance := e.Args()[0].IntPart() // m%
totalChance := baseChance totalChance := baseChance
if e.OpponentInput().HasPropADD() { if e.TargetInput().HasPropADD() {
totalChance += e.Args()[1].IntPart() totalChance += e.Args()[1].IntPart()
} }
success, _, _ := e.Input.Player.Roll(int(totalChance), 100) success, _, _ := e.Input.Player.Roll(int(totalChance), 100)
@@ -23,7 +23,7 @@ func (e *Effect460) OnSkill() bool {
if success { if success {
fearEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Fear)) fearEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Fear))
if fearEffect != nil { if fearEffect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), fearEffect) e.TargetInput().AddEffect(e.CarrierInput(), fearEffect)
} }
} }

View File

@@ -20,9 +20,9 @@ func (e *Effect462) Skill_Use_ex() bool {
damageZone := &info.DamageZone{ damageZone := &info.DamageZone{
Type: info.DamageType.Fixed, Type: info.DamageType.Fixed,
Damage: alpacadecimal.Min(e.OpponentInput().SumDamage, bounceDamage), Damage: alpacadecimal.Min(e.TargetInput().SumDamage, bounceDamage),
} }
e.OpponentInput().Damage(e.CarrierInput(), damageZone) e.TargetInput().Damage(e.CarrierInput(), damageZone)
return true return true
} }

View File

@@ -13,7 +13,7 @@ type Effect464 struct {
} }
func (e *Effect464) OnSkill() bool { func (e *Effect464) OnSkill() bool {
t, _ := element.Calculator.GetOffensiveMultiplier(e.OpponentInput().CurPet[0].Type, e.CarrierInput().CurPet[0].Type) t, _ := element.Calculator.GetOffensiveMultiplier(e.TargetInput().CurPet[0].Type, e.CarrierInput().CurPet[0].Type)
if t <= 1 { if t <= 1 {
return true return true
@@ -24,7 +24,7 @@ func (e *Effect464) OnSkill() bool {
if success { if success {
burnEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Burned)) burnEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Burned))
if burnEffect != nil { if burnEffect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), burnEffect) e.TargetInput().AddEffect(e.CarrierInput(), burnEffect)
} }
} }
return true return true

View File

@@ -19,7 +19,7 @@ func (e *Effect469) Skill_Use_ex() bool {
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType) statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType)
if statusEffect != nil { if statusEffect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect) e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
} }
} }
} }
@@ -40,7 +40,7 @@ type Effect526 struct {
func (e *Effect526) Skill_Use_ex() bool { func (e *Effect526) Skill_Use_ex() bool {
if e.Ctx().SkillEntity != nil && e.Ctx().SkillEntity.Category() == info.Category.STATUS { if e.Ctx().SkillEntity != nil && e.Ctx().SkillEntity.Category() == info.Category.STATUS {
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{ e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{
Type: info.DamageType.Fixed, Type: info.DamageType.Fixed,
Damage: e.Args()[0], Damage: e.Args()[0],
}) })

View File

@@ -19,7 +19,7 @@ func (e *Effect470) Skill_Use_ex() bool {
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType) statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType)
if statusEffect != nil { if statusEffect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect) e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
} }
} }
} }

View File

@@ -18,7 +18,7 @@ func (e *Effect477) Skill_Use_ex() bool {
if effectId == 0 { if effectId == 0 {
continue continue
} }
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), int8(effectId)) e.TargetInput().SetProp(e.CarrierInput(), int8(i), int8(effectId))
} }
return true return true

View File

@@ -18,7 +18,7 @@ func (e *Effect483) OnSkill() bool {
if v == 0 { if v == 0 {
continue continue
} }
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), int8(v)) e.TargetInput().SetProp(e.CarrierInput(), int8(i), int8(v))
} }

View File

@@ -13,11 +13,11 @@ type Effect485 struct {
func (e *Effect485) Skill_Use() bool { func (e *Effect485) Skill_Use() bool {
isfff := false isfff := false
for i, v := range e.OpponentInput().Prop[:] { for i, v := range e.TargetInput().Prop[:] {
if v > 0 { if v > 0 {
isfff = true isfff = true
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), 0) e.TargetInput().SetProp(e.CarrierInput(), int8(i), 0)
} }

View File

@@ -21,7 +21,7 @@ func (e *Effect486) CalculatePre() bool {
return true return true
} }
e.OpponentInput().Prop = [6]int8{} e.TargetInput().Prop = [6]int8{}
return true return true
} }

View File

@@ -12,7 +12,7 @@ type Effect494 struct {
func (e *Effect494) CalculatePre() bool { func (e *Effect494) CalculatePre() bool {
e.OpponentInput().Prop = [6]int8{} e.TargetInput().Prop = [6]int8{}
return true return true
} }

View File

@@ -12,12 +12,12 @@ type Effect495 struct {
} }
func (e *Effect495) OnSkill() bool { func (e *Effect495) OnSkill() bool {
if e.OpponentInput().StatEffect_Exist(info.EnumPetStatus(e.Args()[0].IntPart())) { // 对手处于异常状态 if e.TargetInput().StatEffect_Exist(info.EnumPetStatus(e.Args()[0].IntPart())) { // 对手处于异常状态
chance := 30 // 固定30% chance := 30 // 固定30%
success, _, _ := e.Input.Player.Roll(chance, 100) success, _, _ := e.Input.Player.Roll(chance, 100)
if success { if success {
// 秒杀对手 // 秒杀对手
e.OpponentInput().CurPet[0].Info.Hp = 0 e.TargetInput().CurPet[0].Info.Hp = 0
} }
} }

View File

@@ -21,7 +21,7 @@ func (e *Effect498) ActionStart(a, b *action.SelectSkillAction) bool {
return true return true
} }
if !e.OpponentInput().StatEffect_Exist(input.StatusSleep) { if !e.TargetInput().StatEffect_Exist(input.StatusSleep) {
return true return true
} }
e.Ctx().SkillEntity.XML.CritRate += int(e.Args()[1].IntPart()) e.Ctx().SkillEntity.XML.CritRate += int(e.Args()[1].IntPart())

View File

@@ -16,7 +16,7 @@ func (e *Effect500) SkillHit() bool {
return true return true
} }
if e.OpponentInput().StatEffect_Exist(info.PetStatus.Fear) { if e.TargetInput().StatEffect_Exist(info.PetStatus.Fear) {
// 伤害翻倍 // 伤害翻倍
e.Ctx().SkillEntity.XML.Power *= 2 e.Ctx().SkillEntity.XML.Power *= 2
} }

View File

@@ -17,7 +17,7 @@ func (e *Effect501) Skill_Use_ex() bool {
if damageDone.IntPart() < int64(damageThreshold) { if damageDone.IntPart() < int64(damageThreshold) {
effectType := int8(e.Args()[1].IntPart()) // XX类型 effectType := int8(e.Args()[1].IntPart()) // XX类型
effectValue := int8(e.Args()[2].IntPart()) // 等级-n effectValue := int8(e.Args()[2].IntPart()) // 等级-n
e.OpponentInput().SetProp(e.CarrierInput(), effectType, -effectValue) e.TargetInput().SetProp(e.CarrierInput(), effectType, -effectValue)
} }

View File

@@ -32,7 +32,7 @@ func (e *Effect503) Action_end_ex() bool {
Type: info.DamageType.Fixed, Type: info.DamageType.Fixed,
Damage: fixedDamage, Damage: fixedDamage,
} }
e.OpponentInput().Damage(e.CarrierInput(), damageZone) e.TargetInput().Damage(e.CarrierInput(), damageZone)
e.triggered = false e.triggered = false
} }
return true return true

View File

@@ -19,12 +19,12 @@ func (e *Effect504) OnSkill() bool {
// 令对手害怕 // 令对手害怕
fearEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Fear)) fearEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Fear))
if fearEffect != nil { if fearEffect != nil {
e.OpponentInput().AddEffect(e.CarrierInput(), fearEffect) e.TargetInput().AddEffect(e.CarrierInput(), fearEffect)
} }
} else { } else {
for i, effectId := range e.SideEffectArgs[1:] { for i, effectId := range e.SideEffectArgs[1:] {
if effectId != 0 { if effectId != 0 {
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), int8(effectId)) e.TargetInput().SetProp(e.CarrierInput(), int8(i), int8(effectId))
} }
} }

View File

@@ -47,7 +47,7 @@ func registerPhysicalAttackAddStatusEffects() {
// ----------------------------------------------------------- // -----------------------------------------------------------
func (e *EffectPhysicalAttackAddStatus) Skill_Use_ex() bool { func (e *EffectPhysicalAttackAddStatus) Skill_Use_ex() bool {
source := e.SourceInput() source := e.SourceInput()
target := e.OpponentInput() target := e.TargetInput()
if source == nil || target == nil { if source == nil || target == nil {
return true return true
} }

View File

@@ -17,7 +17,7 @@ type Effect680 struct {
func (e *Effect680) Skill_Use() bool { func (e *Effect680) Skill_Use() bool {
source := e.SourceInput() source := e.SourceInput()
target := e.OpponentInput() target := e.TargetInput()
if source == nil || target == nil { if source == nil || target == nil {
return true return true
} }
@@ -85,7 +85,7 @@ type Effect683 struct {
func (e *Effect683) Skill_Use() bool { func (e *Effect683) Skill_Use() bool {
source := e.SourceInput() source := e.SourceInput()
target := e.OpponentInput() target := e.TargetInput()
if source == nil || target == nil { if source == nil || target == nil {
return true return true
} }
@@ -106,7 +106,7 @@ type Effect684 struct {
func (e *Effect684) Skill_Use() bool { func (e *Effect684) Skill_Use() bool {
source := e.SourceInput() source := e.SourceInput()
target := e.OpponentInput() target := e.TargetInput()
if source == nil || target == nil { if source == nil || target == nil {
return true return true
} }
@@ -132,7 +132,7 @@ type Effect685 struct {
func (e *Effect685) Skill_Use() bool { func (e *Effect685) Skill_Use() bool {
source := e.SourceInput() source := e.SourceInput()
target := e.OpponentInput() target := e.TargetInput()
if source == nil || target == nil { if source == nil || target == nil {
return true return true
} }
@@ -152,7 +152,7 @@ type Effect686 struct {
func (e *Effect686) Skill_Use() bool { func (e *Effect686) Skill_Use() bool {
source := e.SourceInput() source := e.SourceInput()
target := e.OpponentInput() target := e.TargetInput()
if source == nil || target == nil { if source == nil || target == nil {
return true return true
} }
@@ -189,7 +189,7 @@ type Effect687 struct {
func (e *Effect687) Skill_Use() bool { func (e *Effect687) Skill_Use() bool {
source := e.SourceInput() source := e.SourceInput()
target := e.OpponentInput() target := e.TargetInput()
if source == nil || target == nil { if source == nil || target == nil {
return true return true
} }

View File

@@ -66,7 +66,7 @@ func (e *EffectConditionalAddDamage) OnSkill() bool {
return true return true
} }
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{ e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{
Type: info.DamageType.Fixed, Type: info.DamageType.Fixed,
Damage: e.Args()[0], Damage: e.Args()[0],
}) })

View File

@@ -120,7 +120,7 @@ func (e *EffectPropSyncReverse) OnSkill() bool {
return true return true
} }
e.ourpet = e.CarrierInput().CurPet[0] e.ourpet = e.CarrierInput().CurPet[0]
e.opppet = e.OpponentInput().CurPet[0] e.opppet = e.TargetInput().CurPet[0]
e.can = true e.can = true
e.active(true) e.active(true)

View File

@@ -70,7 +70,7 @@ type ContinuousDamage struct {
func (e *ContinuousDamage) ActionStart(attacker, defender *action.SelectSkillAction) bool { func (e *ContinuousDamage) ActionStart(attacker, defender *action.SelectSkillAction) bool {
carrier := e.CarrierInput() carrier := e.CarrierInput()
source := e.SourceInput() source := e.SourceInput()
opp := e.OpponentInput() opp := e.TargetInput()
if carrier == nil { if carrier == nil {
return true return true
} }
@@ -135,7 +135,7 @@ func (e *ParasiticSeed) SwitchOut(in *input.Input) bool {
func (e *ParasiticSeed) ActionStartEx(attacker, defender *action.SelectSkillAction) bool { func (e *ParasiticSeed) ActionStartEx(attacker, defender *action.SelectSkillAction) bool {
carrier := e.CarrierInput() carrier := e.CarrierInput()
source := e.SourceInput() source := e.SourceInput()
opp := e.OpponentInput() opp := e.TargetInput()
if carrier == nil { if carrier == nil {
return true return true
} }

View File

@@ -51,12 +51,38 @@ type Effect201 struct {
node.EffectNode node.EffectNode
} }
func isSameSideTarget(carrier, target *input.Input) bool {
if carrier == nil || target == nil {
return false
}
if carrier == target {
return true
}
for _, ally := range carrier.Team {
if ally == target {
return true
}
}
if carrier.Player != nil && target.Player != nil {
return carrier.Player.GetInfo().UserID == target.Player.GetInfo().UserID
}
return false
}
func (e *Effect201) OnSkill() bool { func (e *Effect201) OnSkill() bool {
args := e.Args() args := e.Args()
if len(args) == 0 { if len(args) == 0 {
return true return true
} }
carrier := e.CarrierInput()
if carrier == nil {
carrier = e.Ctx().Our
}
if carrier == nil {
return true
}
divisorIndex := len(args) - 1 divisorIndex := len(args) - 1
if len(args) > 1 { if len(args) > 1 {
divisorIndex = 1 divisorIndex = 1
@@ -69,31 +95,31 @@ func (e *Effect201) OnSkill() bool {
healAll := len(args) > 1 && args[0].IntPart() != 0 healAll := len(args) > 1 && args[0].IntPart() != 0
if !healAll { if !healAll {
target := e.TargetInput() target := e.TargetInput()
if target == nil { if !isSameSideTarget(carrier, target) {
target = e.Ctx().Our target = carrier
} }
current := target.CurrentPet() current := target.CurrentPet()
if current == nil { if current == nil {
return true return true
} }
target.Heal( target.Heal(
e.CarrierInput(), carrier,
&action.SelectSkillAction{}, &action.SelectSkillAction{},
current.GetMaxHP().Div(divisor), current.GetMaxHP().Div(divisor),
) )
return true return true
} }
team := e.Ctx().Our.Team team := carrier.Team
if len(team) == 0 { if len(team) == 0 {
team = []*input.Input{e.Ctx().Our} team = []*input.Input{carrier}
} }
for _, ally := range team { for _, ally := range team {
if ally == nil { if ally == nil {
continue continue
} }
if current := ally.CurrentPet(); current != nil && current.Alive() { if current := ally.CurrentPet(); current != nil && current.Alive() {
ally.Heal(e.CarrierInput(), &action.SelectSkillAction{}, current.GetMaxHP().Div(divisor)) ally.Heal(carrier, &action.SelectSkillAction{}, current.GetMaxHP().Div(divisor))
} }
} }

View File

@@ -22,14 +22,14 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, skill *info
skill.AttackTimeC(attacker.Prop[5]) //计算命中 skill.AttackTimeC(attacker.Prop[5]) //计算命中
defender.ExecWithOpponent(attacker, func(effect input.Effect) bool { //计算闪避,然后修改对方命中),同时相当于计算属性无效这种 defender.ExecWithOpponent(attacker, func(effect input.Effect) bool { //计算闪避,然后修改对方命中),同时相当于计算属性无效这种
effect.Ctx().SkillEntity = skill f.setEffectSkillContext(effect, skill, defender)
effect.SkillHit_ex() effect.SkillHit_ex()
return true return true
}) })
attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { attacker.ExecWithOpponent(defender, func(effect input.Effect) bool {
//计算变威力 //计算变威力
effect.Ctx().SkillEntity = skill f.setEffectSkillContext(effect, skill, defender)
effect.SkillHit() //相当于先调整基础命中,不光调整命中,这里还能调整技能属性,暴击率 effect.SkillHit() //相当于先调整基础命中,不光调整命中,这里还能调整技能属性,暴击率
return true return true
}) })
@@ -45,7 +45,7 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, skill *info
originalPetInfo[0], originalPetInfo[1] = attackerPet.Info, defenderPet.Info originalPetInfo[0], originalPetInfo[1] = attackerPet.Info, defenderPet.Info
attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { attacker.ExecWithOpponent(defender, func(effect input.Effect) bool {
//计算变威力 //计算变威力
effect.Ctx().SkillEntity = skill f.setEffectSkillContext(effect, skill, defender)
effect.CalculatePre() //相当于先调整基础命中,不光调整命中,这里还能调整技能属性,暴击率 effect.CalculatePre() //相当于先调整基础命中,不光调整命中,这里还能调整技能属性,暴击率
return true return true
}) })
@@ -94,7 +94,7 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, skill *info
// 扣减防御方血量 // 扣减防御方血量
attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { attacker.ExecWithOpponent(defender, func(effect input.Effect) bool {
effect.Ctx().SkillEntity = skill f.setEffectSkillContext(effect, skill, defender)
effect.OnSkill() //调用伤害计算 effect.OnSkill() //调用伤害计算
return true return true
}) })
@@ -135,6 +135,47 @@ func (f *FightC) getSkillParticipants(skillAction *action.SelectSkillAction) (*i
return f.GetInputByAction(skillAction, false), f.GetInputByAction(skillAction, true) return f.GetInputByAction(skillAction, false), f.GetInputByAction(skillAction, true)
} }
// setEffectSkillContext 统一设置技能阶段 effect 上下文。
// 规则:
// 1) Our/Opp 由 ExecWithOpponent 负责写入carrier / 对位)。
// 2) Target 统一表示“本次动作被选中的目标位”,在攻防双方 hook 中保持一致。
func (f *FightC) setEffectSkillContext(effect input.Effect, skill *info.SkillEntity, target *input.Input) {
if effect == nil {
return
}
ctx := effect.Ctx()
ctx.SkillEntity = skill
if target != nil {
ctx.Target = target
}
}
func (f *FightC) setEffectTarget(effect input.Effect, target *input.Input) {
if effect == nil || target == nil {
return
}
effect.Ctx().Target = target
}
// plannedOpponentForCarrier 为旧 effect 提供“当前动作对应目标”上下文:
// 1) 若 carrier 是本回合出手方,返回其动作目标。
// 2) 若无匹配动作,返回 nil交给 Input 默认 OppTeam 回退。
func (f *FightC) plannedOpponentForCarrier(carrier *input.Input, acts ...*action.SelectSkillAction) *input.Input {
if carrier == nil {
return nil
}
for _, act := range acts {
if act == nil {
continue
}
attacker, defender := f.getSkillParticipants(act)
if attacker == carrier {
return defender
}
}
return nil
}
func (f *FightC) collectAttackValues(inputs []*input.Input) []model.AttackValue { func (f *FightC) collectAttackValues(inputs []*input.Input) []model.AttackValue {
values := make([]model.AttackValue, 0, len(inputs)) values := make([]model.AttackValue, 0, len(inputs))
for actorIndex, fighter := range inputs { for actorIndex, fighter := range inputs {
@@ -172,7 +213,9 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction)
ff.EffectCache = make([]input.Effect, 0) //先把上一回合数据清空,但是应该把本身延续类效果集成过来 ff.EffectCache = make([]input.Effect, 0) //先把上一回合数据清空,但是应该把本身延续类效果集成过来
ff.EffectLost = make([]input.Effect, 0) ff.EffectLost = make([]input.Effect, 0)
ff.Exec(func(effect input.Effect) bool { //回合开始前 opponent := f.plannedOpponentForCarrier(ff, firstAttack, secondAttack)
ff.ExecWithOpponent(opponent, func(effect input.Effect) bool { //回合开始前
f.setEffectTarget(effect, opponent)
effect.TurnStart(firstAttack, secondAttack) effect.TurnStart(firstAttack, secondAttack)
return true return true
}) })
@@ -187,7 +230,9 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction)
attackerInput.Parseskill(skillAction) attackerInput.Parseskill(skillAction)
} }
f.Broadcast(func(fighter *input.Input) { f.Broadcast(func(fighter *input.Input) {
fighter.Exec(func(effect input.Effect) bool { //回合开始前 opponent := f.plannedOpponentForCarrier(fighter, firstAttack, secondAttack)
fighter.ExecWithOpponent(opponent, func(effect input.Effect) bool { //回合开始前
f.setEffectTarget(effect, opponent)
effect.ComparePre(firstAttack, secondAttack) //先结算技能的优先级 effect.ComparePre(firstAttack, secondAttack) //先结算技能的优先级
return true return true
}) })
@@ -262,11 +307,11 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction)
currentSkill = originalSkill currentSkill = originalSkill
defender.ExecWithOpponent(attacker, func(effect input.Effect) bool { //这个是能否使用技能 defender.ExecWithOpponent(attacker, func(effect input.Effect) bool { //这个是能否使用技能
effect.Ctx().SkillEntity = currentSkill f.setEffectSkillContext(effect, currentSkill, defender)
return effect.ActionStartEx(firstAttack, secondAttack) return effect.ActionStartEx(firstAttack, secondAttack)
}) })
canUseSkill := attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { //这个是能否使用技能 canUseSkill := attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { //这个是能否使用技能
effect.Ctx().SkillEntity = currentSkill f.setEffectSkillContext(effect, currentSkill, defender)
return effect.ActionStart(firstAttack, secondAttack) return effect.ActionStart(firstAttack, secondAttack)
}) })
@@ -302,7 +347,7 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction)
if ok { if ok {
usecount := 1 usecount := 1
attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { //技能使用后的我方效果 attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { //技能使用后的我方效果
effect.Ctx().SkillEntity = currentSkill f.setEffectSkillContext(effect, currentSkill, defender)
effect.HookPP(&usecount) effect.HookPP(&usecount)
return true return true
}) })
@@ -312,7 +357,7 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction)
if defenderPet != nil && defenderPet.Info.Hp > 0 { if defenderPet != nil && defenderPet.Info.Hp > 0 {
//技能使用后 //技能使用后
defender.ExecWithOpponent(attacker, func(effect input.Effect) bool { //技能使用后的我方效果 defender.ExecWithOpponent(attacker, func(effect input.Effect) bool { //技能使用后的我方效果
effect.Ctx().SkillEntity = currentSkill f.setEffectSkillContext(effect, currentSkill, defender)
effect.Skill_Use_ex() effect.Skill_Use_ex()
return true return true
}) })
@@ -321,20 +366,20 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction)
if attackerPet != nil && attackerPet.Info.Hp > 0 { if attackerPet != nil && attackerPet.Info.Hp > 0 {
//技能使用后 //技能使用后
attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { //技能使用后的我方效果 attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { //技能使用后的我方效果
effect.Ctx().SkillEntity = currentSkill f.setEffectSkillContext(effect, currentSkill, defender)
effect.Skill_Use() effect.Skill_Use()
return true return true
}) })
} }
//技能使用后 //技能使用后
defender.ExecWithOpponent(attacker, func(effect input.Effect) bool { //技能使用后的我方效果 defender.ExecWithOpponent(attacker, func(effect input.Effect) bool { //技能使用后的我方效果
effect.Ctx().SkillEntity = currentSkill f.setEffectSkillContext(effect, currentSkill, defender)
effect.Action_end_ex() effect.Action_end_ex()
return true return true
}) })
//技能使用后 //技能使用后
attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { //技能使用后的我方效果 attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { //技能使用后的我方效果
effect.Ctx().SkillEntity = currentSkill f.setEffectSkillContext(effect, currentSkill, defender)
effect.Action_end() effect.Action_end()
return true return true
}) })

View File

@@ -151,25 +151,6 @@ func (f *FightC) bindInputFightContext(inputGroups ...[]*input.Input) {
} }
} }
// linkOppInputs 仅建立“默认对手回退”关系,不参与真实目标选择。
// 真实目标应由 action.targetIndex 决定;这里仅为旧 effect/无动作上下文链路提供默认 Opp。
func (f *FightC) linkOppInputs() {
defaultOpp := f.selectInput(f.Opp, 0)
for _, fighter := range f.Our {
if fighter == nil {
continue
}
fighter.SetOPP(defaultOpp)
}
defaultOur := f.selectInput(f.Our, 0)
for _, fighter := range f.Opp {
if fighter == nil {
continue
}
fighter.SetOPP(defaultOur)
}
}
// linkTeamViews 建立每个输入的同阵营/对阵营视图Team/OppTeam // linkTeamViews 建立每个输入的同阵营/对阵营视图Team/OppTeam
func (f *FightC) linkTeamViews() { func (f *FightC) linkTeamViews() {
for _, fighter := range f.Our { for _, fighter := range f.Our {
@@ -263,7 +244,8 @@ func (f *FightC) setActionAttackValue(act action.BattleActionI) {
return return
} }
attacker.AttackValue.ActorIndex = uint32(act.GetActorIndex()) attacker.AttackValue.ActorIndex = uint32(act.GetActorIndex())
attacker.AttackValue.TargetIndex = uint32(act.GetTargetIndex()) targetIndex, _ := DecodeTargetIndex(act.GetTargetIndex())
attacker.AttackValue.TargetIndex = uint32(targetIndex)
} }
func (f *FightC) Ownerid() uint32 { func (f *FightC) Ownerid() uint32 {
@@ -311,10 +293,11 @@ func (f *FightC) GetInputByAction(c action.BattleActionI, isOpposite bool) *inpu
return f.primaryOur() return f.primaryOur()
} }
index := c.GetActorIndex() index := c.GetActorIndex()
if isOpposite { if !isOpposite {
index = c.GetTargetIndex() return f.getInputByUserID(c.GetPlayerID(), index, false)
} }
return f.getInputByUserID(c.GetPlayerID(), index, isOpposite) targetIndex, targetIsOpposite := DecodeTargetIndex(c.GetTargetIndex())
return f.getInputByUserID(c.GetPlayerID(), targetIndex, targetIsOpposite)
} }
// 玩家使用技能 // 玩家使用技能

View File

@@ -244,15 +244,39 @@ func (our *Input) AddEffect(in *Input, e Effect) Effect {
// ForEachEffectBool 遍历所有 Effect执行“无参数、返回 bool”的方法 // ForEachEffectBool 遍历所有 Effect执行“无参数、返回 bool”的方法
// 参数 fn接收单个 Effect返回 bool如 func(e Effect) bool { return e.OnBattleStart() } // 参数 fn接收单个 Effect返回 bool如 func(e Effect) bool { return e.OnBattleStart() }
// 返回值:所有 Effect 的方法返回值列表 // 返回值:所有 Effect 的方法返回值列表
func (our *Input) defaultOpponent() *Input {
if our == nil {
return nil
}
for _, in := range our.OppTeam {
if in == nil {
continue
}
if pet := in.CurrentPet(); pet != nil && pet.Info.Hp > 0 {
return in
}
}
for _, in := range our.OppTeam {
if in != nil {
return in
}
}
return our.Opp
}
func (our *Input) Exec(fn func(Effect) bool) bool { func (our *Input) Exec(fn func(Effect) bool) bool {
return our.ExecWithOpponent(our.Opp, fn) return our.ExecWithOpponent(nil, fn)
} }
func (our *Input) ExecWithOpponent(opponent *Input, fn func(Effect) bool) bool { func (our *Input) ExecWithOpponent(opponent *Input, fn func(Effect) bool) bool {
if opponent == nil {
opponent = our.defaultOpponent()
}
result := true result := true
for _, value := range our.Effects { for _, value := range our.Effects {
if value.Alive() { if value.Alive() {
ctx := value.Ctx() ctx := value.Ctx()
// 多战位语义Our=当前持有效果槽位Opp=本次结算对位/动作目标槽位。
ctx.Our = our ctx.Our = our
ctx.Opp = opponent ctx.Opp = opponent
ctx.Carrier = our ctx.Carrier = our

View File

@@ -338,6 +338,9 @@ func (our *Input) Parseskill(skill *action.SelectSkillAction) {
args := xmlres.EffectArgs[v] args := xmlres.EffectArgs[v]
t := our.InitEffect(EffectType.Skill, v, temparg[:args]...) t := our.InitEffect(EffectType.Skill, v, temparg[:args]...)
//这里是给双方添加buff //这里是给双方添加buff
if t != nil { if t != nil {
// t.SetArgs(our, temparg[:args]...) //设置入参,施加方永远是我方 // t.SetArgs(our, temparg[:args]...) //设置入参,施加方永远是我方

View File

@@ -141,7 +141,6 @@ func buildFight(opts *fightBuildOptions) (*FightC, errorcode.ErrorCode) {
f.bindInputControllers(f.Opp, f.OppPlayers, opts.controllerBinding) f.bindInputControllers(f.Opp, f.OppPlayers, opts.controllerBinding)
f.bindInputFightContext(f.Our, f.Opp) f.bindInputFightContext(f.Our, f.Opp)
f.linkTeamViews() f.linkTeamViews()
f.linkOppInputs()
f.ReadyInfo.OurInfo, f.ReadyInfo.OurPetList = initfightready(f.primaryOur()) f.ReadyInfo.OurInfo, f.ReadyInfo.OurPetList = initfightready(f.primaryOur())
f.ReadyInfo.OpponentInfo, f.ReadyInfo.OpponentPetList = initfightready(f.primaryOpp()) f.ReadyInfo.OpponentInfo, f.ReadyInfo.OpponentPetList = initfightready(f.primaryOpp())

View File

@@ -0,0 +1,34 @@
package fight
// 技能目标关系(与前端可选目标范围对齐):
// 0: 对手enemy
// 1: 自己self
// 2: 队友ally
const (
SkillTargetOpponent uint8 = 0
SkillTargetSelf uint8 = 1
SkillTargetAlly uint8 = 2
)
// EncodeTargetIndex 对目标下标进行编码,兼容旧 UseSkillAt(actorIndex,targetIndex) 接口:
// 1) 敌方目标直接使用非负下标0,1,2...
// 2) 同侧目标(自己/队友):编码为负数 -(index+1)
func EncodeTargetIndex(targetIndex int, targetIsOpposite bool) int {
if targetIndex < 0 {
targetIndex = 0
}
if targetIsOpposite {
return targetIndex
}
return -(targetIndex + 1)
}
// DecodeTargetIndex 解析目标下标编码,返回:
// 1) 目标位下标
// 2) 是否为敌方目标
func DecodeTargetIndex(encoded int) (targetIndex int, targetIsOpposite bool) {
if encoded < 0 {
return -encoded - 1, false
}
return encoded, true
}