chore: update fight logic and effect implementations
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed
This commit is contained in:
@@ -67,6 +67,7 @@ type Move struct {
|
||||
SideEffectS []int
|
||||
SideEffectArgS []int
|
||||
AtkNum int `xml:"AtkNum,attr,omitempty"`
|
||||
AtkType int `xml:"AtkType,attr,omitempty"` // 0:所有人 1:仅己方 2:仅对方 3:仅自己
|
||||
Url string `xml:"Url,attr,omitempty"`
|
||||
|
||||
Info string `xml:"info,attr,omitempty"`
|
||||
|
||||
@@ -355,3 +355,46 @@
|
||||
- 先完成“旧入口 -> 统一入站结构”映射。
|
||||
- 再完成“统一出站结构 + 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. 保持旧协议兼容:旧入口不报错,但按上述兜底规则执行。
|
||||
|
||||
|
||||
@@ -35,6 +35,40 @@ func (h Controller) UseSkill(data *fight.UseSkillInInfo, c *player.Player) (resu
|
||||
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 战斗逃跑
|
||||
func (h Controller) Escape(data *fight.EscapeFightInboundInfo, c *player.Player) (result *fight.NullOutboundInfo, err errorcode.ErrorCode) {
|
||||
if err := h.checkFightStatus(c); err != 0 {
|
||||
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
"github.com/gogf/gf/v2/os/gcmd"
|
||||
"github.com/gogf/gf/v2/os/gproc"
|
||||
|
||||
"blazing/common/data/xmlres"
|
||||
"blazing/logic/service/player"
|
||||
|
||||
"blazing/cool"
|
||||
|
||||
@@ -199,7 +199,6 @@ func (f *FightC) UseSkillAt(c common.PlayerI, id uint32, actorIndex, targetIndex
|
||||
BaseAction: action.NewBaseAction(c.GetInfo().UserID),
|
||||
}
|
||||
ret.ActorIndex = actorIndex
|
||||
ret.TargetIndex = targetIndex
|
||||
|
||||
self := f.getInputByUserID(c.GetInfo().UserID, actorIndex, false)
|
||||
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)
|
||||
}
|
||||
|
||||
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) {
|
||||
if f.closefight {
|
||||
|
||||
@@ -101,6 +101,22 @@ type UseSkillInInfo struct {
|
||||
// 技能id,
|
||||
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 {
|
||||
Head common.TomeeHeader `cmd:"2407" struc:"skip"`
|
||||
// CatchTime 捕捉时间
|
||||
|
||||
@@ -17,9 +17,9 @@ type Effect1044 struct {
|
||||
func (e *Effect1044) OnSkill() bool {
|
||||
// 检查对手是否有能力提升状态可以吸取
|
||||
|
||||
for i, v := range e.OpponentInput().Prop[:] {
|
||||
for i, v := range e.TargetInput().Prop[:] {
|
||||
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.CarrierInput().SetProp(e.CarrierInput(), int8(i), v)
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ type Effect1097 struct {
|
||||
|
||||
func (e *Effect1097) Skill_Use() bool {
|
||||
source := e.SourceInput()
|
||||
target := e.OpponentInput()
|
||||
target := e.TargetInput()
|
||||
if source == nil || target == nil {
|
||||
return true
|
||||
}
|
||||
@@ -175,7 +175,7 @@ func (e *Effect1098) SkillHit() bool {
|
||||
|
||||
func (e *Effect1098) Skill_Use() bool {
|
||||
source := e.SourceInput()
|
||||
target := e.OpponentInput()
|
||||
target := e.TargetInput()
|
||||
if source == nil || target == nil {
|
||||
return true
|
||||
}
|
||||
@@ -273,7 +273,7 @@ type Effect1099 struct {
|
||||
|
||||
func (e *Effect1099) Skill_Use() bool {
|
||||
source := e.SourceInput()
|
||||
target := e.OpponentInput()
|
||||
target := e.TargetInput()
|
||||
if source == nil || target == nil {
|
||||
return true
|
||||
}
|
||||
@@ -335,7 +335,7 @@ type Effect1100 struct {
|
||||
|
||||
func (e *Effect1100) Skill_Use_ex() bool {
|
||||
source := e.SourceInput()
|
||||
target := e.OpponentInput()
|
||||
target := e.TargetInput()
|
||||
if source == nil || target == nil {
|
||||
return true
|
||||
}
|
||||
@@ -423,7 +423,7 @@ func (e *Effect1101) DamageFloor(zone *info.DamageZone) bool {
|
||||
|
||||
func (e *Effect1101) Skill_Use() bool {
|
||||
source := e.SourceInput()
|
||||
target := e.OpponentInput()
|
||||
target := e.TargetInput()
|
||||
if source == nil || target == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ type Effect1146 struct {
|
||||
func (e *Effect1146) OnSkill() bool {
|
||||
// 1. 命中判定失败,不触发
|
||||
count := 0
|
||||
for _, v := range e.OpponentInput().Prop[:] {
|
||||
for _, v := range e.TargetInput().Prop[:] {
|
||||
if v > 0 {
|
||||
count++
|
||||
}
|
||||
@@ -29,7 +29,7 @@ func (e *Effect1146) OnSkill() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{
|
||||
e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{
|
||||
Type: info.DamageType.Fixed,
|
||||
Damage: e.Args()[1],
|
||||
})
|
||||
|
||||
@@ -72,7 +72,7 @@ func (e *Effect1263) Skill_Use() bool {
|
||||
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)
|
||||
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()))
|
||||
if effect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), effect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), effect)
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -191,7 +191,7 @@ func (e *Effect1267) Skill_Use_ex() bool {
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -251,7 +251,7 @@ func (e *Effect1269) SkillHit_ex() bool {
|
||||
return true
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
@@ -266,12 +266,12 @@ func (e *Effect1270) OnSkill() bool {
|
||||
}
|
||||
success, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100)
|
||||
if success {
|
||||
applyStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[1].IntPart()))
|
||||
applyStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[1].IntPart()))
|
||||
return true
|
||||
}
|
||||
effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1270, int(e.Args()[2].IntPart()))
|
||||
if effect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), effect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), effect)
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -319,7 +319,7 @@ func (e *Effect1271) OnSkill() bool {
|
||||
|
||||
success, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100)
|
||||
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
|
||||
return true
|
||||
}
|
||||
@@ -351,7 +351,7 @@ func (e *Effect1271Sub) OnSkill() bool {
|
||||
}
|
||||
success, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100)
|
||||
if success {
|
||||
applyStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[2].IntPart()))
|
||||
applyStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[2].IntPart()))
|
||||
}
|
||||
e.remaining--
|
||||
if e.remaining <= 0 {
|
||||
@@ -370,7 +370,7 @@ func (e *Effect1272) OnSkill() bool {
|
||||
if shield.Cmp(alpacadecimal.Zero) <= 0 {
|
||||
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
|
||||
}
|
||||
|
||||
@@ -390,7 +390,7 @@ func (e *Effect1273) OnSkill() bool {
|
||||
if damage.Cmp(alpacadecimal.Zero) <= 0 {
|
||||
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
|
||||
}
|
||||
|
||||
@@ -404,12 +404,12 @@ func (e *Effect1274) OnSkill() bool {
|
||||
return true
|
||||
}
|
||||
chance := int(e.Args()[0].IntPart())
|
||||
if e.OpponentInput().HasPropSub() {
|
||||
if e.TargetInput().HasPropSub() {
|
||||
chance *= 2
|
||||
}
|
||||
success, _, _ := e.Input.Player.Roll(chance, 100)
|
||||
if success {
|
||||
applyStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[1].IntPart()))
|
||||
applyStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[1].IntPart()))
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -471,7 +471,7 @@ func (e *Effect1276) Skill_Use() bool {
|
||||
damage := e.CarrierPet().GetHP().Div(e.Args()[0])
|
||||
e.CarrierInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: e.CarrierPet().GetHP()})
|
||||
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
|
||||
}
|
||||
@@ -487,14 +487,14 @@ func (e *Effect1277) Skill_Use() bool {
|
||||
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.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
|
||||
}
|
||||
|
||||
lost := e.CarrierPet().GetHP()
|
||||
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})
|
||||
applyStatusByID(e.CarrierInput(), e.OpponentInput(), int(info.PetStatus.Paralysis))
|
||||
e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: lost})
|
||||
applyStatusByID(e.CarrierInput(), e.TargetInput(), int(info.PetStatus.Paralysis))
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -509,7 +509,7 @@ func (e *Effect1278) OnSkill() bool {
|
||||
}
|
||||
success, _, _ := e.Input.Player.Roll(int(e.Args()[0].IntPart()), 100)
|
||||
if success {
|
||||
applyStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[1].IntPart()))
|
||||
applyStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[1].IntPart()))
|
||||
return true
|
||||
}
|
||||
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()))
|
||||
if effect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), effect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), effect)
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -616,7 +616,7 @@ func (e *Effect1280) OnSkill() bool {
|
||||
}
|
||||
damage := e.CarrierPet().GetHP().Mul(alpacadecimal.NewFromInt(int64(percent))).Div(alpacadecimal.NewFromInt(100))
|
||||
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())
|
||||
return true
|
||||
@@ -632,16 +632,16 @@ func (e *Effect1281) Skill_Use() bool {
|
||||
if shield.Cmp(alpacadecimal.Zero) <= 0 {
|
||||
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 {
|
||||
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
|
||||
}
|
||||
if shield.Cmp(alpacadecimal.NewFromInt(300)) < 0 {
|
||||
val := e.CarrierPet().GetMaxHP().Div(alpacadecimal.NewFromInt(3))
|
||||
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
|
||||
}
|
||||
@@ -655,7 +655,7 @@ func (e *Effect1282) Skill_Use() bool {
|
||||
if len(e.Args()) == 0 {
|
||||
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
|
||||
}
|
||||
|
||||
@@ -689,7 +689,7 @@ func (e *Effect1284) Skill_Use() bool {
|
||||
}
|
||||
effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1284, int(e.Args()[0].IntPart()))
|
||||
if effect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), effect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), effect)
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -732,7 +732,7 @@ func (e *Effect1285) Skill_Use() bool {
|
||||
if len(e.Args()) == 0 || e.OpponentPet().Info.Hp == 0 {
|
||||
return true
|
||||
}
|
||||
zeroRandomSkillPP(e.OpponentInput(), int(e.Args()[0].IntPart()))
|
||||
zeroRandomSkillPP(e.TargetInput(), int(e.Args()[0].IntPart()))
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -754,7 +754,7 @@ func (e *Effect1287) OnSkill() bool {
|
||||
if len(e.Args()) < 2 {
|
||||
return true
|
||||
}
|
||||
absorbed := clearPositivePropsTo(e.OpponentInput(), e.CarrierInput())
|
||||
absorbed := clearPositivePropsTo(e.TargetInput(), e.CarrierInput())
|
||||
if !absorbed {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ func (e *Effect1289) OnSkill() bool {
|
||||
if v >= 0 {
|
||||
continue
|
||||
}
|
||||
if e.OpponentInput().SetProp(e.CarrierInput(), int8(i), 2*v) {
|
||||
if e.TargetInput().SetProp(e.CarrierInput(), int8(i), 2*v) {
|
||||
reflected = true
|
||||
}
|
||||
}
|
||||
@@ -132,7 +132,7 @@ func (e *Effect1289) OnSkill() bool {
|
||||
}
|
||||
effect := e.CarrierInput().InitEffect(input.EffectType.Sub, 1289, int(e.Args()[0].IntPart()))
|
||||
if effect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), effect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), effect)
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -184,7 +184,7 @@ func (e *Effect1290) Skill_Use() bool {
|
||||
}
|
||||
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, heal)
|
||||
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
|
||||
}
|
||||
@@ -201,7 +201,7 @@ func (e *Effect1291) Skill_Use() bool {
|
||||
}
|
||||
success, _, _ := e.Input.Player.Roll(int(e.Args()[1].IntPart()), 100)
|
||||
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
|
||||
}
|
||||
@@ -271,11 +271,11 @@ func (e *Effect1293Sub) DamageLockEx(zone *info.DamageZone) bool {
|
||||
type Effect1294 struct{ node.EffectNode }
|
||||
|
||||
func (e *Effect1294) Skill_Use() bool {
|
||||
cleared := clearBothProps(e.CarrierInput(), e.OpponentInput())
|
||||
cleared := clearBothProps(e.CarrierInput(), e.TargetInput())
|
||||
if cleared {
|
||||
effect := e.CarrierInput().InitEffect(input.EffectType.Status, 1294)
|
||||
if effect != nil {
|
||||
applyRandomNStatuses(e.CarrierInput(), e.OpponentInput(), 2, effect1291Statuses)
|
||||
applyRandomNStatuses(e.CarrierInput(), e.TargetInput(), 2, effect1291Statuses)
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -341,15 +341,15 @@ func (e *Effect1297) Skill_Use() bool {
|
||||
if len(e.Args()) < 2 {
|
||||
return true
|
||||
}
|
||||
before := activeTurnEffectCount(e.OpponentInput())
|
||||
e.OpponentInput().CancelTurn(e.CarrierInput())
|
||||
before := activeTurnEffectCount(e.TargetInput())
|
||||
e.TargetInput().CancelTurn(e.CarrierInput())
|
||||
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
|
||||
}
|
||||
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 {
|
||||
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)
|
||||
}
|
||||
return true
|
||||
@@ -359,12 +359,12 @@ func (e *Effect1297) Skill_Use() bool {
|
||||
type Effect1298 struct{ node.EffectNode }
|
||||
|
||||
func (e *Effect1298) Skill_Use() bool {
|
||||
cleared := clearPositiveProps(e.OpponentInput(), e.CarrierInput())
|
||||
cleared := clearPositiveProps(e.TargetInput(), e.CarrierInput())
|
||||
if !cleared {
|
||||
return true
|
||||
}
|
||||
for _, pet := range e.OpponentInput().AllPet {
|
||||
if pet == nil || !pet.Alive() || pet == e.OpponentInput().CurPet[0] {
|
||||
for _, pet := range e.TargetInput().AllPet {
|
||||
if pet == nil || !pet.Alive() || pet == e.TargetInput().CurPet[0] {
|
||||
continue
|
||||
}
|
||||
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 {
|
||||
return true
|
||||
}
|
||||
for _, pet := range e.OpponentInput().AllPet {
|
||||
if pet == nil || !pet.Alive() || pet == e.OpponentInput().CurPet[0] {
|
||||
for _, pet := range e.TargetInput().AllPet {
|
||||
if pet == nil || !pet.Alive() || pet == e.TargetInput().CurPet[0] {
|
||||
continue
|
||||
}
|
||||
pet.Info.ModelHP(-100)
|
||||
@@ -426,8 +426,8 @@ func (e *Effect1301) Skill_Use() bool {
|
||||
return true
|
||||
}
|
||||
e.CarrierInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Fixed, Damage: e.CarrierInput().CurPet[0].GetHP()})
|
||||
for _, pet := range e.OpponentInput().AllPet {
|
||||
if pet == nil || !pet.Alive() || pet == e.OpponentInput().CurPet[0] {
|
||||
for _, pet := range e.TargetInput().AllPet {
|
||||
if pet == nil || !pet.Alive() || pet == e.TargetInput().CurPet[0] {
|
||||
continue
|
||||
}
|
||||
damage := pet.GetMaxHP().Div(alpacadecimal.NewFromInt(2))
|
||||
@@ -454,7 +454,7 @@ func (e *Effect1302) OnSkill() bool {
|
||||
if success {
|
||||
return true
|
||||
}
|
||||
clearPositiveProps(e.OpponentInput(), e.CarrierInput())
|
||||
clearPositiveProps(e.TargetInput(), e.CarrierInput())
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -462,11 +462,11 @@ func (e *Effect1302) OnSkill() bool {
|
||||
type Effect1303 struct{ RoundEffectArg0Base }
|
||||
|
||||
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 {
|
||||
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)
|
||||
if e.CarrierInput().CurPet[0].GetHP().Cmp(e.CarrierInput().CurPet[0].GetMaxHP()) == 0 {
|
||||
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()))
|
||||
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
|
||||
}
|
||||
@@ -518,8 +518,8 @@ func (e *Effect1306) Skill_Use() bool {
|
||||
if e.CarrierInput().SumDamage.Cmp(alpacadecimal.NewFromInt(350)) >= 0 {
|
||||
return true
|
||||
}
|
||||
for _, pet := range e.OpponentInput().AllPet {
|
||||
if pet == nil || !pet.Alive() || pet == e.OpponentInput().CurPet[0] {
|
||||
for _, pet := range e.TargetInput().AllPet {
|
||||
if pet == nil || !pet.Alive() || pet == e.TargetInput().CurPet[0] {
|
||||
continue
|
||||
}
|
||||
pet.Info.ModelHP(-100)
|
||||
@@ -531,7 +531,7 @@ func (e *Effect1306) Skill_Use() bool {
|
||||
type Effect1307 struct{ node.EffectNode }
|
||||
|
||||
func (e *Effect1307) Skill_Use() bool {
|
||||
if e.OpponentInput().CurPet[0].Info.Hp == 0 {
|
||||
if e.TargetInput().CurPet[0].Info.Hp == 0 {
|
||||
return true
|
||||
}
|
||||
healBench(e.CarrierInput(), alpacadecimal.NewFromInt(100))
|
||||
@@ -551,7 +551,7 @@ func (e *Effect1309) OnSkill() bool {
|
||||
return true
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
@@ -562,7 +562,7 @@ func (e *Effect1310) OnSkill() bool {
|
||||
if len(e.Args()) == 0 {
|
||||
return true
|
||||
}
|
||||
if !clearPositiveProps(e.OpponentInput(), e.CarrierInput()) {
|
||||
if !clearPositiveProps(e.TargetInput(), e.CarrierInput()) {
|
||||
return true
|
||||
}
|
||||
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
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
@@ -15,9 +15,9 @@ type Effect143 struct {
|
||||
// ----------------------
|
||||
func (e *Effect143) OnSkill() bool {
|
||||
|
||||
for i, v := range e.OpponentInput().Prop[:] {
|
||||
for i, v := range e.TargetInput().Prop[:] {
|
||||
if v > 0 {
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), -2*v)
|
||||
e.TargetInput().SetProp(e.CarrierInput(), int8(i), -2*v)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ func (e *Effect1449) Skill_Use() bool {
|
||||
}
|
||||
eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1449, e.SideEffectArgs...)
|
||||
if eff != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), eff)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), eff)
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -96,13 +96,13 @@ func (e *Effect1450) Skill_Use() bool {
|
||||
return true
|
||||
}
|
||||
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()) {
|
||||
drain = drain.Mul(alpacadecimal.NewFromInt(2))
|
||||
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)
|
||||
return true
|
||||
}
|
||||
@@ -114,7 +114,7 @@ func (e *Effect1451) Skill_Use() bool {
|
||||
if len(e.Args()) < 2 {
|
||||
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])
|
||||
return true
|
||||
}
|
||||
@@ -210,7 +210,7 @@ func (e *Effect1456) Skill_Use() bool {
|
||||
}
|
||||
maxHP := e.CarrierInput().CurPet[0].GetMaxHP()
|
||||
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...)
|
||||
if eff != nil {
|
||||
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)
|
||||
if success {
|
||||
addStatusByID(e.CarrierInput(), e.OpponentInput(), int(e.Args()[2].IntPart()))
|
||||
addStatusByID(e.CarrierInput(), e.TargetInput(), int(e.Args()[2].IntPart()))
|
||||
return true
|
||||
}
|
||||
randomSkillPPZero(e.OpponentInput(), int(e.Args()[3].IntPart()))
|
||||
randomSkillPPZero(e.TargetInput(), int(e.Args()[3].IntPart()))
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -267,7 +267,7 @@ func (e *Effect1458Sub) SkillHit_ex() bool {
|
||||
}
|
||||
if len(e.Args()) >= 4 {
|
||||
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
|
||||
@@ -281,12 +281,12 @@ func (e *Effect1459) ActionStart(a, b *action.SelectSkillAction) bool {
|
||||
return true
|
||||
}
|
||||
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
|
||||
}
|
||||
eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1459, e.SideEffectArgs...)
|
||||
if eff != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), eff)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), eff)
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -324,8 +324,8 @@ func (e *Effect1461) Skill_Use() bool {
|
||||
}
|
||||
heal := e.CarrierInput().CurPet[0].GetMaxHP().Div(e.Args()[0])
|
||||
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, heal)
|
||||
if e.CarrierInput().CurPet[0].GetHP().Cmp(e.OpponentInput().CurPet[0].GetHP()) < 0 {
|
||||
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: heal})
|
||||
if e.CarrierInput().CurPet[0].GetHP().Cmp(e.TargetInput().CurPet[0].GetHP()) < 0 {
|
||||
e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: heal})
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -394,14 +394,14 @@ func (e *Effect1463Sub) DamageLock(zone *info.DamageZone) bool {
|
||||
type Effect1464 struct{ node.EffectNode }
|
||||
|
||||
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
|
||||
}
|
||||
if !e.OpponentInput().StatEffect_Exist(info.EnumPetStatus(e.Args()[0].IntPart())) {
|
||||
if !e.TargetInput().StatEffect_Exist(info.EnumPetStatus(e.Args()[0].IntPart())) {
|
||||
return true
|
||||
}
|
||||
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
|
||||
}
|
||||
@@ -419,8 +419,8 @@ func (e *Effect1465) ActionStart(a, b *action.SelectSkillAction) bool {
|
||||
}
|
||||
return true
|
||||
}
|
||||
for i := range e.OpponentInput().Prop[:] {
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), int8(-e.Args()[0].IntPart()))
|
||||
for i := range e.TargetInput().Prop[:] {
|
||||
e.TargetInput().SetProp(e.CarrierInput(), int8(i), int8(-e.Args()[0].IntPart()))
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -443,7 +443,7 @@ func (e *Effect1466Sub) SkillHit_ex() bool {
|
||||
return true
|
||||
}
|
||||
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
|
||||
}
|
||||
@@ -478,7 +478,7 @@ func (e *Effect1468) Skill_Use() bool {
|
||||
return true
|
||||
}
|
||||
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 {
|
||||
if eff != nil && eff.Alive() {
|
||||
eff.Alive(false)
|
||||
@@ -487,8 +487,8 @@ func (e *Effect1468) Skill_Use() bool {
|
||||
}
|
||||
}
|
||||
if triggered {
|
||||
damageByFixed(e.CarrierInput(), e.OpponentInput(), e.Args()[0].IntPart())
|
||||
randomSkillPPZero(e.OpponentInput(), int(e.Args()[1].IntPart()))
|
||||
damageByFixed(e.CarrierInput(), e.TargetInput(), e.Args()[0].IntPart())
|
||||
randomSkillPPZero(e.TargetInput(), int(e.Args()[1].IntPart()))
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -533,7 +533,7 @@ func (e *Effect1471) Skill_Use() bool {
|
||||
return true
|
||||
}
|
||||
removed := false
|
||||
for _, eff := range e.OpponentInput().Effects {
|
||||
for _, eff := range e.TargetInput().Effects {
|
||||
if eff != nil && eff.Alive() {
|
||||
eff.Alive(false)
|
||||
removed = true
|
||||
@@ -541,7 +541,7 @@ func (e *Effect1471) Skill_Use() bool {
|
||||
}
|
||||
if removed {
|
||||
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
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ func (e *Effect146) Skill_Use_ex() bool {
|
||||
if success {
|
||||
poisonEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Poisoned))
|
||||
if poisonEffect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), poisonEffect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), poisonEffect)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ func (e *Effect1473) Skill_Use() bool {
|
||||
return true
|
||||
}
|
||||
cleared := false
|
||||
for _, eff := range e.OpponentInput().Effects {
|
||||
for _, eff := range e.TargetInput().Effects {
|
||||
if eff == nil || !eff.Alive() {
|
||||
continue
|
||||
}
|
||||
@@ -25,7 +25,7 @@ func (e *Effect1473) Skill_Use() bool {
|
||||
cleared = true
|
||||
}
|
||||
if cleared {
|
||||
randomSkillPPZero(e.OpponentInput(), int(e.Args()[0].IntPart()))
|
||||
randomSkillPPZero(e.TargetInput(), int(e.Args()[0].IntPart()))
|
||||
}
|
||||
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 {
|
||||
delta *= 2
|
||||
}
|
||||
for i := range e.OpponentInput().Prop[:] {
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), delta)
|
||||
for i := range e.TargetInput().Prop[:] {
|
||||
e.TargetInput().SetProp(e.CarrierInput(), int8(i), delta)
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -104,7 +104,7 @@ func (e *Effect1477) Skill_Use() bool {
|
||||
return true
|
||||
}
|
||||
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 {
|
||||
if eff == nil || !eff.Alive() {
|
||||
continue
|
||||
@@ -114,8 +114,8 @@ func (e *Effect1477) Skill_Use() bool {
|
||||
}
|
||||
}
|
||||
if cleared {
|
||||
drain := e.OpponentInput().CurPet[0].GetMaxHP().Div(e.Args()[0])
|
||||
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: drain})
|
||||
drain := e.TargetInput().CurPet[0].GetMaxHP().Div(e.Args()[0])
|
||||
e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{Type: info.DamageType.Percent, Damage: drain})
|
||||
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, drain)
|
||||
}
|
||||
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()})
|
||||
eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1479, e.SideEffectArgs...)
|
||||
if eff != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), eff)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), eff)
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -217,10 +217,10 @@ func (e *Effect1482) Skill_Use() bool {
|
||||
return true
|
||||
}
|
||||
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
|
||||
}
|
||||
for _, eff := range e.OpponentInput().Effects {
|
||||
for _, eff := range e.TargetInput().Effects {
|
||||
if eff != nil && eff.Alive() {
|
||||
eff.Alive(false)
|
||||
}
|
||||
@@ -245,7 +245,7 @@ func (e *Effect1483Sub) Skill_Use() bool {
|
||||
if e.Ctx().SkillEntity != nil && e.Ctx().SkillEntity.Crit > 0 {
|
||||
eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1483, e.SideEffectArgs...)
|
||||
if eff != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), eff)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), eff)
|
||||
}
|
||||
}
|
||||
return true
|
||||
@@ -280,7 +280,7 @@ func (e *Effect1485) OnSkill() bool {
|
||||
return true
|
||||
}
|
||||
boosted := false
|
||||
for _, v := range e.OpponentInput().Prop[:] {
|
||||
for _, v := range e.TargetInput().Prop[:] {
|
||||
if v > 0 {
|
||||
boosted = true
|
||||
break
|
||||
@@ -290,11 +290,11 @@ func (e *Effect1485) OnSkill() bool {
|
||||
return true
|
||||
}
|
||||
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
|
||||
}
|
||||
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
|
||||
}
|
||||
@@ -341,7 +341,7 @@ func (e *Effect1488) OnSkill() bool {
|
||||
return true
|
||||
}
|
||||
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
|
||||
}
|
||||
@@ -354,7 +354,7 @@ func (e *Effect1489) OnSkill() bool {
|
||||
return true
|
||||
}
|
||||
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
|
||||
}
|
||||
eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1489, e.SideEffectArgs...)
|
||||
@@ -384,12 +384,12 @@ func (e *Effect1490) OnSkill() bool {
|
||||
return true
|
||||
}
|
||||
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
|
||||
}
|
||||
eff := e.CarrierInput().InitEffect(input.EffectType.Sub, 1490, e.SideEffectArgs...)
|
||||
if eff != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), eff)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), eff)
|
||||
}
|
||||
return true
|
||||
}
|
||||
@@ -425,7 +425,7 @@ func (e *Effect1492) OnSkill() bool {
|
||||
return true
|
||||
}
|
||||
down := false
|
||||
for _, v := range e.OpponentInput().Prop[:] {
|
||||
for _, v := range e.TargetInput().Prop[:] {
|
||||
if v < 0 {
|
||||
down = true
|
||||
break
|
||||
@@ -434,7 +434,7 @@ func (e *Effect1492) OnSkill() bool {
|
||||
if !down {
|
||||
return true
|
||||
}
|
||||
applyRandomStatuses1507(e.CarrierInput(), e.OpponentInput(), int(e.Args()[0].IntPart()))
|
||||
applyRandomStatuses1507(e.CarrierInput(), e.TargetInput(), int(e.Args()[0].IntPart()))
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -468,7 +468,7 @@ func (e *Effect1494) OnSkill() bool {
|
||||
return true
|
||||
}
|
||||
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
|
||||
}
|
||||
@@ -481,7 +481,7 @@ func (e *Effect1495) Skill_Use() bool {
|
||||
return true
|
||||
}
|
||||
swapped := false
|
||||
for _, i := range e.OpponentInput().Prop[:] {
|
||||
for _, i := range e.TargetInput().Prop[:] {
|
||||
if i > 0 {
|
||||
swapped = true
|
||||
break
|
||||
@@ -491,7 +491,7 @@ func (e *Effect1495) Skill_Use() bool {
|
||||
return true
|
||||
}
|
||||
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
|
||||
}
|
||||
@@ -525,7 +525,7 @@ func (e *Effect1496Sub) TurnEnd() {
|
||||
type Effect1497 struct{ node.EffectNode }
|
||||
|
||||
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 {
|
||||
e.CarrierInput().Heal(e.CarrierInput(), &action.SelectSkillAction{}, heal)
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ func (e *Effect149) OnSkill() bool {
|
||||
|
||||
statusEffect1 := e.CarrierInput().InitEffect(input.EffectType.Status, effectType1)
|
||||
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)
|
||||
if statusEffect2 != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect2)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), statusEffect2)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,9 +10,9 @@ type Effect150 struct {
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
func init() {
|
||||
|
||||
@@ -12,15 +12,15 @@ type Effect156 struct {
|
||||
|
||||
func (e *Effect156) Skill_Use() bool {
|
||||
|
||||
for i, v := range e.OpponentInput().Prop[:] {
|
||||
for i, v := range e.TargetInput().Prop[:] {
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@@ -13,9 +13,9 @@ func (e *Effect157) Skill_Use_ex() bool {
|
||||
if e.Ctx().SkillEntity == nil {
|
||||
return true
|
||||
}
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), 1, -1)
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), 3, -1)
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), 5, -1)
|
||||
e.TargetInput().SetProp(e.CarrierInput(), 1, -1)
|
||||
e.TargetInput().SetProp(e.CarrierInput(), 3, -1)
|
||||
e.TargetInput().SetProp(e.CarrierInput(), 5, -1)
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ func (e *Effect166) Skill_Use_ex() bool {
|
||||
if success {
|
||||
effectType := int8(e.Args()[1].IntPart()) // XX类型
|
||||
effectValue := int8(e.Args()[2].IntPart()) // 等级k
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), effectType, effectValue)
|
||||
e.TargetInput().SetProp(e.CarrierInput(), effectType, effectValue)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ func (e *Effect169) OnSkill() bool {
|
||||
// 添加异常状态
|
||||
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(e.Args()[2].IntPart())) // 以麻痹为例
|
||||
if statusEffect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
}
|
||||
}
|
||||
return true
|
||||
|
||||
@@ -18,7 +18,7 @@ func (e *Effect173) OnSkill() bool {
|
||||
if success {
|
||||
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(e.Args()[1].IntPart())) // 以麻痹为例
|
||||
if statusEffect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ type Effect175 struct {
|
||||
}
|
||||
|
||||
func (e *Effect175) OnSkill() bool {
|
||||
if e.OpponentInput().StatEffect_Exist_all() { // 对手处于异常状态
|
||||
if e.TargetInput().StatEffect_Exist_all() { // 对手处于异常状态
|
||||
chance := e.Args()[0].IntPart()
|
||||
success, _, _ := e.Input.Player.Roll(int(chance), 100)
|
||||
if success {
|
||||
|
||||
@@ -32,7 +32,7 @@ func (e *Effect176) OnSkill() bool {
|
||||
|
||||
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, selectedStatus)
|
||||
if statusEffect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ func (e *Effect178) Skill_Use_ex() bool {
|
||||
damageDone := e.CarrierInput().SumDamage
|
||||
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
|
||||
healAmount = damageDone.Div(e.Args()[1])
|
||||
} else {
|
||||
|
||||
@@ -15,7 +15,7 @@ func (e *Effect179) SkillHit() bool {
|
||||
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
|
||||
e.Ctx().SkillEntity.XML.Power += int(e.Args()[0].IntPart())
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ type Effect184 struct {
|
||||
}
|
||||
|
||||
func (e *Effect184) OnSkill() bool {
|
||||
if e.OpponentInput().HasPropADD() { // 对手处于能力提升状态
|
||||
if e.TargetInput().HasPropADD() { // 对手处于能力提升状态
|
||||
chance := e.Args()[0].IntPart()
|
||||
success, _, _ := e.Input.Player.Roll(int(chance), 100)
|
||||
if success {
|
||||
|
||||
@@ -15,12 +15,12 @@ func (e *Effect188) SkillHit() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
if e.OpponentInput().StatEffect_Exist_all() { // 对手处于异常状态
|
||||
if e.TargetInput().StatEffect_Exist_all() { // 对手处于异常状态
|
||||
// 威力翻倍
|
||||
e.Ctx().SkillEntity.XML.Power *= 2
|
||||
|
||||
// 消除对手相应的防御能力提升效果
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), 1, 0)
|
||||
e.TargetInput().SetProp(e.CarrierInput(), 1, 0)
|
||||
}
|
||||
|
||||
return true
|
||||
|
||||
@@ -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 {
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), 0)
|
||||
e.TargetInput().SetProp(e.CarrierInput(), int8(i), 0)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ func (e *Effect193) SkillHit() bool {
|
||||
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
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ func (e *Effect194) Skill_Use() bool {
|
||||
damageDone := e.CarrierInput().SumDamage
|
||||
|
||||
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
|
||||
} else {
|
||||
healAmount = damageDone.Div(e.Args()[0]) // 1/n
|
||||
|
||||
@@ -16,14 +16,14 @@ func (e *Effect196) OnSkill() bool {
|
||||
effectValue := e.Args()[5].IntPart() // 等级-k
|
||||
success, _, _ := e.Input.Player.Roll(int(chance), 100)
|
||||
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 { // 后出手
|
||||
chance := e.Args()[1].IntPart() // j%
|
||||
effectValue := e.Args()[2].IntPart() // 等级-k
|
||||
success, _, _ := e.Input.Player.Roll(int(chance), 100)
|
||||
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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ func (e *Effect198) OnSkill() bool {
|
||||
|
||||
// 随机选择n种能力
|
||||
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
|
||||
|
||||
@@ -11,7 +11,7 @@ type Effect200 struct {
|
||||
}
|
||||
|
||||
func (e *Effect200) OnSkill() bool {
|
||||
if e.OpponentInput().HasPropADD() {
|
||||
if e.TargetInput().HasPropADD() {
|
||||
chance := e.Args()[0].IntPart()
|
||||
success, _, _ := e.Input.Player.Roll(int(chance), 100)
|
||||
if success {
|
||||
@@ -19,7 +19,7 @@ func (e *Effect200) OnSkill() bool {
|
||||
|
||||
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType)
|
||||
if statusEffect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ func (e *Effect400) SkillHit() bool {
|
||||
if e.Ctx().SkillEntity == nil {
|
||||
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
|
||||
}
|
||||
e.Ctx().SkillEntity.XML.Power *= 2
|
||||
@@ -129,7 +129,7 @@ func (e *Effect611) OnSkill() bool {
|
||||
if e.Ctx().SkillEntity.Category() == info.Category.STATUS {
|
||||
return true
|
||||
}
|
||||
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{
|
||||
e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{
|
||||
Type: info.DamageType.Fixed,
|
||||
Damage: e.Args()[1],
|
||||
})
|
||||
|
||||
@@ -17,7 +17,7 @@ func (e *Effect403) OnSkill() bool {
|
||||
if success {
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@@ -11,8 +11,8 @@ type Effect418 struct {
|
||||
}
|
||||
|
||||
func (e *Effect418) OnSkill() bool {
|
||||
if e.OpponentInput().HasPropADD() {
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), int8(e.SideEffectArgs[0]), int8(e.SideEffectArgs[1]))
|
||||
if e.TargetInput().HasPropADD() {
|
||||
e.TargetInput().SetProp(e.CarrierInput(), int8(e.SideEffectArgs[0]), int8(e.SideEffectArgs[1]))
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ func (e *Effect422) Skill_Use() bool {
|
||||
Type: info.DamageType.Fixed,
|
||||
Damage: additionalDamage,
|
||||
}
|
||||
e.OpponentInput().Damage(e.CarrierInput(), damageZone)
|
||||
e.TargetInput().Damage(e.CarrierInput(), damageZone)
|
||||
}
|
||||
|
||||
return true
|
||||
|
||||
@@ -10,7 +10,7 @@ type Effect424 struct {
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ func (e *Effect425) Skill_Use() bool {
|
||||
// 随机选择n项属性
|
||||
for i := 0; i < numStats; i++ {
|
||||
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)
|
||||
}
|
||||
|
||||
|
||||
@@ -16,9 +16,9 @@ func (e *Effect427) Skill_Use() bool {
|
||||
}
|
||||
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
|
||||
|
||||
@@ -21,7 +21,7 @@ func (e *Effect428) Skill_Use() bool {
|
||||
Type: info.DamageType.Fixed,
|
||||
Damage: e.Args()[0],
|
||||
}
|
||||
e.OpponentInput().Damage(e.CarrierInput(), damageZone)
|
||||
e.TargetInput().Damage(e.CarrierInput(), damageZone)
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -13,10 +13,10 @@ type Effect430 struct {
|
||||
func (e *Effect430) Skill_Use() bool {
|
||||
var isadd bool
|
||||
// 检查对手是否有能力强化状态
|
||||
for i, v := range e.OpponentInput().Prop[:] {
|
||||
for i, v := range e.TargetInput().Prop[:] {
|
||||
if v > 0 {
|
||||
|
||||
if e.OpponentInput().SetProp(e.CarrierInput(), int8(i), 0) {
|
||||
if e.TargetInput().SetProp(e.CarrierInput(), int8(i), 0) {
|
||||
isadd = true
|
||||
}
|
||||
return true
|
||||
|
||||
@@ -19,7 +19,7 @@ func (e *Effect434) OnSkill() bool {
|
||||
|
||||
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType)
|
||||
if statusEffect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,8 +12,8 @@ type Effect437 struct {
|
||||
|
||||
func (e *Effect437) OnSkill() bool {
|
||||
|
||||
if e.OpponentInput().HasPropADD() {
|
||||
e.OpponentInput().SetProp(e.OpponentInput(), int8(e.SideEffectArgs[0]), int8(e.SideEffectArgs[1]))
|
||||
if e.TargetInput().HasPropADD() {
|
||||
e.TargetInput().SetProp(e.TargetInput(), int8(e.SideEffectArgs[0]), int8(e.SideEffectArgs[1]))
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ type Effect440 struct {
|
||||
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()),
|
||||
}, int(e.Args()[0].IntPart()))
|
||||
return true
|
||||
|
||||
@@ -18,7 +18,7 @@ func (e *Effect442) OnSkill() bool {
|
||||
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(e.Args()[1].IntPart())) // 以麻痹为例
|
||||
if statusEffect != nil {
|
||||
statusEffect.SetArgs(e.CarrierInput(), 1)
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ func (e *Effect443) Skill_Use_ex() bool {
|
||||
tiredEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Tired))
|
||||
if tiredEffect != nil {
|
||||
tiredEffect.Duration(int(e.Args()[2].IntPart())) // x回合
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), tiredEffect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), tiredEffect)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ type Effect444 struct {
|
||||
|
||||
func (e *Effect444) OnSkill() bool {
|
||||
// 降低对手所有技能PP
|
||||
e.OpponentInput().DelPP(1)
|
||||
e.TargetInput().DelPP(1)
|
||||
|
||||
e.CarrierInput().HealPP(1)
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ type Effect449 struct {
|
||||
}
|
||||
|
||||
func (e *Effect449) OnSkill() bool {
|
||||
if e.OpponentInput().HasPropSub() {
|
||||
if e.TargetInput().HasPropSub() {
|
||||
chance := e.Args()[0].IntPart() // N%
|
||||
success, _, _ := e.Input.Player.Roll(int(chance), 100)
|
||||
if success {
|
||||
@@ -19,7 +19,7 @@ func (e *Effect449) OnSkill() bool {
|
||||
|
||||
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType)
|
||||
if statusEffect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,10 +13,10 @@ type Effect453 struct {
|
||||
func (e *Effect453) Skill_Use() bool {
|
||||
// 检查对手是否有能力强化状态
|
||||
ispwoer := false
|
||||
for i, v := range e.OpponentInput().Prop[:] {
|
||||
for i, v := range e.TargetInput().Prop[:] {
|
||||
if v > 0 {
|
||||
|
||||
if e.OpponentInput().SetProp(e.OpponentInput(), int8(i), 0) {
|
||||
if e.TargetInput().SetProp(e.TargetInput(), int8(i), 0) {
|
||||
ispwoer = true
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ func (e *Effect453) Skill_Use() bool {
|
||||
|
||||
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType)
|
||||
if statusEffect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -12,8 +12,8 @@ type Effect456 struct {
|
||||
}
|
||||
|
||||
func (e *Effect456) OnSkill() bool {
|
||||
if e.OpponentInput().CurPet[0].GetHP().Cmp(e.Args()[0]) > 0 {
|
||||
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{
|
||||
if e.TargetInput().CurPet[0].GetHP().Cmp(e.Args()[0]) > 0 {
|
||||
e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{
|
||||
|
||||
Type: info.DamageType.Fixed,
|
||||
Damage: e.Args()[0],
|
||||
|
||||
@@ -15,7 +15,7 @@ func (e *Effect460) OnSkill() bool {
|
||||
baseChance := e.Args()[0].IntPart() // m%
|
||||
|
||||
totalChance := baseChance
|
||||
if e.OpponentInput().HasPropADD() {
|
||||
if e.TargetInput().HasPropADD() {
|
||||
totalChance += e.Args()[1].IntPart()
|
||||
}
|
||||
success, _, _ := e.Input.Player.Roll(int(totalChance), 100)
|
||||
@@ -23,7 +23,7 @@ func (e *Effect460) OnSkill() bool {
|
||||
if success {
|
||||
fearEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Fear))
|
||||
if fearEffect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), fearEffect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), fearEffect)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,9 +20,9 @@ func (e *Effect462) Skill_Use_ex() bool {
|
||||
|
||||
damageZone := &info.DamageZone{
|
||||
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
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ type Effect464 struct {
|
||||
}
|
||||
|
||||
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 {
|
||||
return true
|
||||
@@ -24,7 +24,7 @@ func (e *Effect464) OnSkill() bool {
|
||||
if success {
|
||||
burnEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Burned))
|
||||
if burnEffect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), burnEffect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), burnEffect)
|
||||
}
|
||||
}
|
||||
return true
|
||||
|
||||
@@ -19,7 +19,7 @@ func (e *Effect469) Skill_Use_ex() bool {
|
||||
|
||||
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType)
|
||||
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 {
|
||||
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,
|
||||
Damage: e.Args()[0],
|
||||
})
|
||||
|
||||
@@ -19,7 +19,7 @@ func (e *Effect470) Skill_Use_ex() bool {
|
||||
|
||||
statusEffect := e.CarrierInput().InitEffect(input.EffectType.Status, effectType)
|
||||
if statusEffect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), statusEffect)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ func (e *Effect477) Skill_Use_ex() bool {
|
||||
if effectId == 0 {
|
||||
continue
|
||||
}
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), int8(effectId))
|
||||
e.TargetInput().SetProp(e.CarrierInput(), int8(i), int8(effectId))
|
||||
}
|
||||
|
||||
return true
|
||||
|
||||
@@ -18,7 +18,7 @@ func (e *Effect483) OnSkill() bool {
|
||||
if v == 0 {
|
||||
continue
|
||||
}
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), int8(v))
|
||||
e.TargetInput().SetProp(e.CarrierInput(), int8(i), int8(v))
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -13,11 +13,11 @@ type Effect485 struct {
|
||||
|
||||
func (e *Effect485) Skill_Use() bool {
|
||||
isfff := false
|
||||
for i, v := range e.OpponentInput().Prop[:] {
|
||||
for i, v := range e.TargetInput().Prop[:] {
|
||||
|
||||
if v > 0 {
|
||||
isfff = true
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), 0)
|
||||
e.TargetInput().SetProp(e.CarrierInput(), int8(i), 0)
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ func (e *Effect486) CalculatePre() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
e.OpponentInput().Prop = [6]int8{}
|
||||
e.TargetInput().Prop = [6]int8{}
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ type Effect494 struct {
|
||||
|
||||
func (e *Effect494) CalculatePre() bool {
|
||||
|
||||
e.OpponentInput().Prop = [6]int8{}
|
||||
e.TargetInput().Prop = [6]int8{}
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
@@ -12,12 +12,12 @@ type Effect495 struct {
|
||||
}
|
||||
|
||||
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%
|
||||
success, _, _ := e.Input.Player.Roll(chance, 100)
|
||||
if success {
|
||||
// 秒杀对手
|
||||
e.OpponentInput().CurPet[0].Info.Hp = 0
|
||||
e.TargetInput().CurPet[0].Info.Hp = 0
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ func (e *Effect498) ActionStart(a, b *action.SelectSkillAction) bool {
|
||||
return true
|
||||
}
|
||||
|
||||
if !e.OpponentInput().StatEffect_Exist(input.StatusSleep) {
|
||||
if !e.TargetInput().StatEffect_Exist(input.StatusSleep) {
|
||||
return true
|
||||
}
|
||||
e.Ctx().SkillEntity.XML.CritRate += int(e.Args()[1].IntPart())
|
||||
|
||||
@@ -16,7 +16,7 @@ func (e *Effect500) SkillHit() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
if e.OpponentInput().StatEffect_Exist(info.PetStatus.Fear) {
|
||||
if e.TargetInput().StatEffect_Exist(info.PetStatus.Fear) {
|
||||
// 伤害翻倍
|
||||
e.Ctx().SkillEntity.XML.Power *= 2
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ func (e *Effect501) Skill_Use_ex() bool {
|
||||
if damageDone.IntPart() < int64(damageThreshold) {
|
||||
effectType := int8(e.Args()[1].IntPart()) // XX类型
|
||||
effectValue := int8(e.Args()[2].IntPart()) // 等级-n
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), effectType, -effectValue)
|
||||
e.TargetInput().SetProp(e.CarrierInput(), effectType, -effectValue)
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ func (e *Effect503) Action_end_ex() bool {
|
||||
Type: info.DamageType.Fixed,
|
||||
Damage: fixedDamage,
|
||||
}
|
||||
e.OpponentInput().Damage(e.CarrierInput(), damageZone)
|
||||
e.TargetInput().Damage(e.CarrierInput(), damageZone)
|
||||
e.triggered = false
|
||||
}
|
||||
return true
|
||||
|
||||
@@ -19,12 +19,12 @@ func (e *Effect504) OnSkill() bool {
|
||||
// 令对手害怕
|
||||
fearEffect := e.CarrierInput().InitEffect(input.EffectType.Status, int(info.PetStatus.Fear))
|
||||
if fearEffect != nil {
|
||||
e.OpponentInput().AddEffect(e.CarrierInput(), fearEffect)
|
||||
e.TargetInput().AddEffect(e.CarrierInput(), fearEffect)
|
||||
}
|
||||
} else {
|
||||
for i, effectId := range e.SideEffectArgs[1:] {
|
||||
if effectId != 0 {
|
||||
e.OpponentInput().SetProp(e.CarrierInput(), int8(i), int8(effectId))
|
||||
e.TargetInput().SetProp(e.CarrierInput(), int8(i), int8(effectId))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ func registerPhysicalAttackAddStatusEffects() {
|
||||
// -----------------------------------------------------------
|
||||
func (e *EffectPhysicalAttackAddStatus) Skill_Use_ex() bool {
|
||||
source := e.SourceInput()
|
||||
target := e.OpponentInput()
|
||||
target := e.TargetInput()
|
||||
if source == nil || target == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ type Effect680 struct {
|
||||
|
||||
func (e *Effect680) Skill_Use() bool {
|
||||
source := e.SourceInput()
|
||||
target := e.OpponentInput()
|
||||
target := e.TargetInput()
|
||||
if source == nil || target == nil {
|
||||
return true
|
||||
}
|
||||
@@ -85,7 +85,7 @@ type Effect683 struct {
|
||||
|
||||
func (e *Effect683) Skill_Use() bool {
|
||||
source := e.SourceInput()
|
||||
target := e.OpponentInput()
|
||||
target := e.TargetInput()
|
||||
if source == nil || target == nil {
|
||||
return true
|
||||
}
|
||||
@@ -106,7 +106,7 @@ type Effect684 struct {
|
||||
|
||||
func (e *Effect684) Skill_Use() bool {
|
||||
source := e.SourceInput()
|
||||
target := e.OpponentInput()
|
||||
target := e.TargetInput()
|
||||
if source == nil || target == nil {
|
||||
return true
|
||||
}
|
||||
@@ -132,7 +132,7 @@ type Effect685 struct {
|
||||
|
||||
func (e *Effect685) Skill_Use() bool {
|
||||
source := e.SourceInput()
|
||||
target := e.OpponentInput()
|
||||
target := e.TargetInput()
|
||||
if source == nil || target == nil {
|
||||
return true
|
||||
}
|
||||
@@ -152,7 +152,7 @@ type Effect686 struct {
|
||||
|
||||
func (e *Effect686) Skill_Use() bool {
|
||||
source := e.SourceInput()
|
||||
target := e.OpponentInput()
|
||||
target := e.TargetInput()
|
||||
if source == nil || target == nil {
|
||||
return true
|
||||
}
|
||||
@@ -189,7 +189,7 @@ type Effect687 struct {
|
||||
|
||||
func (e *Effect687) Skill_Use() bool {
|
||||
source := e.SourceInput()
|
||||
target := e.OpponentInput()
|
||||
target := e.TargetInput()
|
||||
if source == nil || target == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ func (e *EffectConditionalAddDamage) OnSkill() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
e.OpponentInput().Damage(e.CarrierInput(), &info.DamageZone{
|
||||
e.TargetInput().Damage(e.CarrierInput(), &info.DamageZone{
|
||||
Type: info.DamageType.Fixed,
|
||||
Damage: e.Args()[0],
|
||||
})
|
||||
|
||||
@@ -120,7 +120,7 @@ func (e *EffectPropSyncReverse) OnSkill() bool {
|
||||
return true
|
||||
}
|
||||
e.ourpet = e.CarrierInput().CurPet[0]
|
||||
e.opppet = e.OpponentInput().CurPet[0]
|
||||
e.opppet = e.TargetInput().CurPet[0]
|
||||
e.can = true
|
||||
e.active(true)
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ type ContinuousDamage struct {
|
||||
func (e *ContinuousDamage) ActionStart(attacker, defender *action.SelectSkillAction) bool {
|
||||
carrier := e.CarrierInput()
|
||||
source := e.SourceInput()
|
||||
opp := e.OpponentInput()
|
||||
opp := e.TargetInput()
|
||||
if carrier == nil {
|
||||
return true
|
||||
}
|
||||
@@ -135,7 +135,7 @@ func (e *ParasiticSeed) SwitchOut(in *input.Input) bool {
|
||||
func (e *ParasiticSeed) ActionStartEx(attacker, defender *action.SelectSkillAction) bool {
|
||||
carrier := e.CarrierInput()
|
||||
source := e.SourceInput()
|
||||
opp := e.OpponentInput()
|
||||
opp := e.TargetInput()
|
||||
if carrier == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -51,12 +51,38 @@ type Effect201 struct {
|
||||
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 {
|
||||
args := e.Args()
|
||||
if len(args) == 0 {
|
||||
return true
|
||||
}
|
||||
|
||||
carrier := e.CarrierInput()
|
||||
if carrier == nil {
|
||||
carrier = e.Ctx().Our
|
||||
}
|
||||
if carrier == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
divisorIndex := len(args) - 1
|
||||
if len(args) > 1 {
|
||||
divisorIndex = 1
|
||||
@@ -69,31 +95,31 @@ func (e *Effect201) OnSkill() bool {
|
||||
healAll := len(args) > 1 && args[0].IntPart() != 0
|
||||
if !healAll {
|
||||
target := e.TargetInput()
|
||||
if target == nil {
|
||||
target = e.Ctx().Our
|
||||
if !isSameSideTarget(carrier, target) {
|
||||
target = carrier
|
||||
}
|
||||
current := target.CurrentPet()
|
||||
if current == nil {
|
||||
return true
|
||||
}
|
||||
target.Heal(
|
||||
e.CarrierInput(),
|
||||
carrier,
|
||||
&action.SelectSkillAction{},
|
||||
current.GetMaxHP().Div(divisor),
|
||||
)
|
||||
return true
|
||||
}
|
||||
|
||||
team := e.Ctx().Our.Team
|
||||
team := carrier.Team
|
||||
if len(team) == 0 {
|
||||
team = []*input.Input{e.Ctx().Our}
|
||||
team = []*input.Input{carrier}
|
||||
}
|
||||
for _, ally := range team {
|
||||
if ally == nil {
|
||||
continue
|
||||
}
|
||||
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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -22,14 +22,14 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, skill *info
|
||||
skill.AttackTimeC(attacker.Prop[5]) //计算命中
|
||||
|
||||
defender.ExecWithOpponent(attacker, func(effect input.Effect) bool { //计算闪避,然后修改对方命中),同时相当于计算属性无效这种
|
||||
effect.Ctx().SkillEntity = skill
|
||||
f.setEffectSkillContext(effect, skill, defender)
|
||||
effect.SkillHit_ex()
|
||||
return true
|
||||
})
|
||||
|
||||
attacker.ExecWithOpponent(defender, func(effect input.Effect) bool {
|
||||
//计算变威力
|
||||
effect.Ctx().SkillEntity = skill
|
||||
f.setEffectSkillContext(effect, skill, defender)
|
||||
effect.SkillHit() //相当于先调整基础命中,不光调整命中,这里还能调整技能属性,暴击率
|
||||
return true
|
||||
})
|
||||
@@ -45,7 +45,7 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, skill *info
|
||||
originalPetInfo[0], originalPetInfo[1] = attackerPet.Info, defenderPet.Info
|
||||
attacker.ExecWithOpponent(defender, func(effect input.Effect) bool {
|
||||
//计算变威力
|
||||
effect.Ctx().SkillEntity = skill
|
||||
f.setEffectSkillContext(effect, skill, defender)
|
||||
effect.CalculatePre() //相当于先调整基础命中,不光调整命中,这里还能调整技能属性,暴击率
|
||||
return true
|
||||
})
|
||||
@@ -94,7 +94,7 @@ func (f *FightC) processSkillAttack(attacker, defender *input.Input, skill *info
|
||||
|
||||
// 扣减防御方血量
|
||||
attacker.ExecWithOpponent(defender, func(effect input.Effect) bool {
|
||||
effect.Ctx().SkillEntity = skill
|
||||
f.setEffectSkillContext(effect, skill, defender)
|
||||
effect.OnSkill() //调用伤害计算
|
||||
return true
|
||||
})
|
||||
@@ -135,6 +135,47 @@ func (f *FightC) getSkillParticipants(skillAction *action.SelectSkillAction) (*i
|
||||
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 {
|
||||
values := make([]model.AttackValue, 0, len(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.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)
|
||||
return true
|
||||
})
|
||||
@@ -187,7 +230,9 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction)
|
||||
attackerInput.Parseskill(skillAction)
|
||||
}
|
||||
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) //先结算技能的优先级
|
||||
return true
|
||||
})
|
||||
@@ -262,11 +307,11 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction)
|
||||
|
||||
currentSkill = originalSkill
|
||||
defender.ExecWithOpponent(attacker, func(effect input.Effect) bool { //这个是能否使用技能
|
||||
effect.Ctx().SkillEntity = currentSkill
|
||||
f.setEffectSkillContext(effect, currentSkill, defender)
|
||||
return effect.ActionStartEx(firstAttack, secondAttack)
|
||||
})
|
||||
canUseSkill := attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { //这个是能否使用技能
|
||||
effect.Ctx().SkillEntity = currentSkill
|
||||
f.setEffectSkillContext(effect, currentSkill, defender)
|
||||
return effect.ActionStart(firstAttack, secondAttack)
|
||||
})
|
||||
|
||||
@@ -302,7 +347,7 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction)
|
||||
if ok {
|
||||
usecount := 1
|
||||
attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { //技能使用后的我方效果
|
||||
effect.Ctx().SkillEntity = currentSkill
|
||||
f.setEffectSkillContext(effect, currentSkill, defender)
|
||||
effect.HookPP(&usecount)
|
||||
return true
|
||||
})
|
||||
@@ -312,7 +357,7 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction)
|
||||
if defenderPet != nil && defenderPet.Info.Hp > 0 {
|
||||
//技能使用后
|
||||
defender.ExecWithOpponent(attacker, func(effect input.Effect) bool { //技能使用后的我方效果
|
||||
effect.Ctx().SkillEntity = currentSkill
|
||||
f.setEffectSkillContext(effect, currentSkill, defender)
|
||||
effect.Skill_Use_ex()
|
||||
return true
|
||||
})
|
||||
@@ -321,20 +366,20 @@ func (f *FightC) enterturn(firstAttack, secondAttack *action.SelectSkillAction)
|
||||
if attackerPet != nil && attackerPet.Info.Hp > 0 {
|
||||
//技能使用后
|
||||
attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { //技能使用后的我方效果
|
||||
effect.Ctx().SkillEntity = currentSkill
|
||||
f.setEffectSkillContext(effect, currentSkill, defender)
|
||||
effect.Skill_Use()
|
||||
return true
|
||||
})
|
||||
}
|
||||
//技能使用后
|
||||
defender.ExecWithOpponent(attacker, func(effect input.Effect) bool { //技能使用后的我方效果
|
||||
effect.Ctx().SkillEntity = currentSkill
|
||||
f.setEffectSkillContext(effect, currentSkill, defender)
|
||||
effect.Action_end_ex()
|
||||
return true
|
||||
})
|
||||
//技能使用后
|
||||
attacker.ExecWithOpponent(defender, func(effect input.Effect) bool { //技能使用后的我方效果
|
||||
effect.Ctx().SkillEntity = currentSkill
|
||||
f.setEffectSkillContext(effect, currentSkill, defender)
|
||||
effect.Action_end()
|
||||
return true
|
||||
})
|
||||
|
||||
@@ -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)。
|
||||
func (f *FightC) linkTeamViews() {
|
||||
for _, fighter := range f.Our {
|
||||
@@ -263,7 +244,8 @@ func (f *FightC) setActionAttackValue(act action.BattleActionI) {
|
||||
return
|
||||
}
|
||||
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 {
|
||||
@@ -311,10 +293,11 @@ func (f *FightC) GetInputByAction(c action.BattleActionI, isOpposite bool) *inpu
|
||||
return f.primaryOur()
|
||||
}
|
||||
index := c.GetActorIndex()
|
||||
if isOpposite {
|
||||
index = c.GetTargetIndex()
|
||||
if !isOpposite {
|
||||
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)
|
||||
}
|
||||
|
||||
// 玩家使用技能
|
||||
|
||||
@@ -244,15 +244,39 @@ func (our *Input) AddEffect(in *Input, e Effect) Effect {
|
||||
// ForEachEffectBool 遍历所有 Effect,执行“无参数、返回 bool”的方法
|
||||
// 参数 fn:接收单个 Effect,返回 bool(如 func(e Effect) bool { return e.OnBattleStart() })
|
||||
// 返回值:所有 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 {
|
||||
return our.ExecWithOpponent(our.Opp, fn)
|
||||
return our.ExecWithOpponent(nil, fn)
|
||||
}
|
||||
|
||||
func (our *Input) ExecWithOpponent(opponent *Input, fn func(Effect) bool) bool {
|
||||
if opponent == nil {
|
||||
opponent = our.defaultOpponent()
|
||||
}
|
||||
result := true
|
||||
for _, value := range our.Effects {
|
||||
if value.Alive() {
|
||||
ctx := value.Ctx()
|
||||
// 多战位语义:Our=当前持有效果槽位,Opp=本次结算对位/动作目标槽位。
|
||||
ctx.Our = our
|
||||
ctx.Opp = opponent
|
||||
ctx.Carrier = our
|
||||
|
||||
@@ -338,6 +338,9 @@ func (our *Input) Parseskill(skill *action.SelectSkillAction) {
|
||||
args := xmlres.EffectArgs[v]
|
||||
t := our.InitEffect(EffectType.Skill, v, temparg[:args]...)
|
||||
|
||||
|
||||
|
||||
|
||||
//这里是给双方添加buff
|
||||
if t != nil {
|
||||
// t.SetArgs(our, temparg[:args]...) //设置入参,施加方永远是我方
|
||||
|
||||
@@ -141,7 +141,6 @@ func buildFight(opts *fightBuildOptions) (*FightC, errorcode.ErrorCode) {
|
||||
f.bindInputControllers(f.Opp, f.OppPlayers, opts.controllerBinding)
|
||||
f.bindInputFightContext(f.Our, f.Opp)
|
||||
f.linkTeamViews()
|
||||
f.linkOppInputs()
|
||||
|
||||
f.ReadyInfo.OurInfo, f.ReadyInfo.OurPetList = initfightready(f.primaryOur())
|
||||
f.ReadyInfo.OpponentInfo, f.ReadyInfo.OpponentPetList = initfightready(f.primaryOpp())
|
||||
|
||||
34
logic/service/fight/targeting.go
Normal file
34
logic/service/fight/targeting.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user