Compare commits
179 Commits
b2e6b40e98
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de6c700bb3 | ||
|
|
3232efd05a | ||
|
|
0c79fee8af | ||
|
|
3d77e146e9 | ||
|
|
a43a25c610 | ||
|
|
3cfde577eb | ||
|
|
85f9c02ced | ||
|
|
9f7fd83626 | ||
|
|
ee8b0a2182 | ||
|
|
6e95e014fa | ||
|
|
61a135b3a7 | ||
|
|
5a81534e84 | ||
|
|
523d835ac0 | ||
|
|
5a7e20efec | ||
|
|
5f47bf0589 | ||
|
|
a58ef20fab | ||
|
|
3999f34f77 | ||
|
|
6f51a2e349 | ||
|
|
de755f8fd0 | ||
|
|
803aa71771 | ||
|
|
4a77066d08 | ||
|
|
c9b5f8569f | ||
|
|
ddbfe91d8b | ||
|
|
74ac6ce940 | ||
|
|
43b0bc2dec | ||
|
|
b953e7831a | ||
|
|
62d93f65e7 | ||
|
|
7dfa9c297e | ||
|
|
f95fd49efd | ||
|
|
ce1a2a3588 | ||
|
|
3739c2a6f9 | ||
|
|
eca7dd86e1 | ||
|
|
e161e3626f | ||
|
|
e1a994ba11 | ||
|
|
82bb99d141 | ||
|
|
f9543a5156 | ||
|
|
174830731c | ||
|
|
3a7f593105 | ||
|
|
f6aa0c3339 | ||
|
|
ecc483a11a | ||
|
|
97c8231b44 | ||
|
|
5f5634d999 | ||
|
|
5bfdb5c32b | ||
|
|
90f1447d48 | ||
|
|
ee3f25438f | ||
|
|
2d8969bed2 | ||
|
|
fa5d50955d | ||
|
|
6574450489 | ||
|
|
0daeb70900 | ||
|
|
061e4f0c51 | ||
|
|
5c76aa7079 | ||
|
|
b327398448 | ||
|
|
d0abb08d5b | ||
|
|
d2cd601802 | ||
|
|
487ee0e726 | ||
|
|
3b35789b47 | ||
|
|
28b6386963 | ||
|
|
1ca0ff344e | ||
|
|
9825944efc | ||
|
|
ca96be3905 | ||
|
|
4b89588c22 | ||
|
|
0051ac0be8 | ||
|
|
918cdeac0e | ||
|
|
13244313f1 | ||
|
|
4ea9864833 | ||
|
|
77057e01b6 | ||
|
|
f030b61645 | ||
|
|
5a44154d30 | ||
|
|
a905954b5c | ||
|
|
99748ba41e | ||
|
|
40ec827342 | ||
|
|
a16a06e389 | ||
|
|
5b37d9493b | ||
|
|
f433a26a6d | ||
|
|
141ba67014 | ||
|
|
d83cf365ac | ||
|
|
24b463f0aa | ||
|
|
c021b40fbe | ||
|
|
36dd93b076 | ||
|
|
3ee1283a2c | ||
|
|
c3da3162ee | ||
|
|
37cd641942 | ||
|
|
87145579e6 | ||
|
|
7ec6381cf1 | ||
|
|
2ee0cbc094 | ||
|
|
6510e4e09b | ||
|
|
34bc35a6b2 | ||
|
|
8352d23164 | ||
|
|
e71971d0b4 | ||
|
|
bceb7965f7 | ||
|
|
c3f052ef30 | ||
|
|
7d054bbe91 | ||
|
|
102d87da3e | ||
|
|
78a68148ce | ||
|
|
f473c54880 | ||
|
|
2eba4b7915 | ||
|
|
39e1d4c42f | ||
|
|
7916f90992 | ||
|
|
8ac2833ce2 | ||
|
|
fbc845526b | ||
|
|
257a979f93 | ||
|
|
ce7be73e49 | ||
|
|
28f2199142 | ||
|
|
80cfa0a07e | ||
|
|
c89632b409 | ||
|
|
5a5a1db2a3 | ||
|
|
0ac84a9509 | ||
|
|
3a9932e307 | ||
|
|
28d92c1e18 | ||
|
|
b62b4af628 | ||
|
|
31d274dd9d | ||
|
|
9c6f3988de | ||
|
|
6439995434 | ||
|
|
603c1b5ad3 | ||
|
|
4552af99c7 | ||
|
|
8e904e9068 | ||
|
|
ca7222a6c7 | ||
|
|
dabf43aefb | ||
|
|
0f862453cb | ||
|
|
d8fdc956ef | ||
|
|
6eb1a589b4 | ||
| c378d3d5f7 | |||
|
|
1a0e0b405a | ||
|
|
7405aac82d | ||
|
|
5204615c28 | ||
|
|
3c160ef695 | ||
|
|
c19ee7de03 | ||
|
|
43881fd988 | ||
|
|
d86b75408b | ||
|
|
218e23ff81 | ||
|
|
f221b299cd | ||
|
|
908f9bee98 | ||
|
|
c1b18601f3 | ||
|
|
8c049bcdcd | ||
|
|
2f220bb863 | ||
|
|
6aa601bb06 | ||
|
|
f810a2ae86 | ||
|
|
3a13bcc99c | ||
|
|
5995f0670c | ||
|
|
1b6586aedc | ||
|
|
977fc78cf6 | ||
|
|
2aea283c6b | ||
|
|
f377068f60 | ||
|
|
81c16590d6 | ||
|
|
1724c06eab | ||
|
|
0a016e9e7f | ||
|
|
39e64c0bf5 | ||
|
|
331337fc51 | ||
|
|
acfdf5679d | ||
|
|
5675fff48c | ||
|
|
8ef327cbe0 | ||
|
|
5b346ef505 | ||
|
|
1a5996d902 | ||
|
|
6d547ff656 | ||
|
|
79a3874d13 | ||
|
|
6ac3c1b9b7 | ||
|
|
4d39164c86 | ||
|
|
a198100547 | ||
|
|
3bf07dd5c5 | ||
|
|
f85228e371 | ||
|
|
ccb4ad8fdf | ||
|
|
97b2588339 | ||
|
|
89a67655fc | ||
|
|
35434fd1d8 | ||
|
|
4cf1bcc07f | ||
|
|
f8c301dc51 | ||
|
|
8805e038b6 | ||
|
|
d6d03a576d | ||
|
|
1a804f5e19 | ||
|
|
07758266d5 | ||
|
|
b4a8048b85 | ||
|
|
8552eb61a8 | ||
|
|
b4463c35e0 | ||
|
|
79c014f9cd | ||
|
|
7e3f31e267 | ||
|
|
799fb24f43 | ||
|
|
e440bd7613 | ||
|
|
10f20f453d | ||
|
|
92d3c755a5 |
10
.cnb.yml
10
.cnb.yml
@@ -1,7 +1,15 @@
|
||||
$:
|
||||
vscode:
|
||||
- runner:
|
||||
cpus: 2
|
||||
cpus: 6
|
||||
docker:
|
||||
build: .ide/Dockerfile
|
||||
services:
|
||||
- vscode
|
||||
- docker
|
||||
stages:
|
||||
- name: ls
|
||||
script: ls -al
|
||||
|
||||
main:
|
||||
push:
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -46,4 +46,5 @@ public/login-linux-amd64
|
||||
.cache/gomod/**
|
||||
public/login-login-linux-amd64
|
||||
public/logic_linux-amd64_1
|
||||
.cache/**
|
||||
.cache/**
|
||||
.agents/**
|
||||
|
||||
@@ -18,9 +18,11 @@ ENV GOMODCACHE=/workspace/.cache/gomod
|
||||
# ==========================================
|
||||
# 2. Codex 配置 (更换时修改这里,重新 build)
|
||||
# ==========================================
|
||||
ENV CODEX_BASE_URL="http://43.142.61.67:8098/v1"
|
||||
ENV CODEX_BASE_URL="https://api.jucode.cn/v1"
|
||||
|
||||
ENV CODEX_MODEL="gpt-5.4"
|
||||
ENV OPENAI_API_KEY="sk-e354141068a0a3331c2a59a44b90cf240e9dcd7498796c4f7c801d398658fc14"
|
||||
|
||||
ENV OPENAI_API_KEY="sk-E0ZZIFNnD0RkhMC9pT2AGMutz9vNy2VLNrgyyobT5voa81pQ"
|
||||
|
||||
# ==========================================
|
||||
# 3. 安装系统依赖、Golang、Code-server
|
||||
|
||||
20
.ide/help.md
20
.ide/help.md
@@ -1,12 +1,7 @@
|
||||
青氧,十九禁给
|
||||
https://api.aibh.site/console 张晟 2922919493Zs.
|
||||
RUN curl -fsSL https://oss.itbzzb.cn/setup-codex.sh | \
|
||||
YES=1 bash -s -- --base-url https://api.aibh.site \
|
||||
--api-key sk-foAHgsJtmanACECtBlFYZE2z4LkwBboEOYETO3ZdWvCxdmNr \
|
||||
--mirror auto
|
||||
|
||||
|
||||
|
||||
https://api.gemai.cc/console/token 免费给部分额度 ,还有100块
|
||||
https://api.jucode.cn/
|
||||
fastai.fast 使用谷歌邮箱https://linshiguge.com/白嫖
|
||||
https://zread.ai/tawer-blog/lmarena-2api/1-overview GLM web2 pai
|
||||
|
||||
https://crazyrouter.com/console 模型最便宜,看看能不能1:10
|
||||
@@ -14,7 +9,7 @@ https://crazyrouter.com/console 模型最便宜,看看能不能1:10
|
||||
https://agentrouter.org/pricing 签到给,有175
|
||||
|
||||
|
||||
kuaipao.ai 充了十块 cjf19970621 cjf19970621
|
||||
|
||||
|
||||
充了十块
|
||||
使用网址:https://www.jnm.lol
|
||||
@@ -26,3 +21,10 @@ kuaipao.ai 充了十块 cjf19970621 cjf19970621
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
fastai.fast 575560454@qq.com 575560454
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
2
.vscode/launch.json
vendored
2
.vscode/launch.json
vendored
@@ -29,7 +29,7 @@
|
||||
"request": "launch",
|
||||
"mode": "auto",
|
||||
"cwd": "${workspaceFolder}",
|
||||
"args": ["-id=2"],
|
||||
"args": ["-id=99"],
|
||||
|
||||
"program": "${workspaceFolder}/logic"
|
||||
}
|
||||
|
||||
@@ -144,14 +144,14 @@ steps:
|
||||
scp-exe-to-servers: # 与fetch-deploy-config同级,缩进2个空格
|
||||
image: appleboy/drone-scp:1.6.2 # 子元素,缩进4个空格
|
||||
settings: # 子元素,缩进4个空格
|
||||
host: &ssh_host 2697v22.mc5173.cn
|
||||
port: &ssh_port 16493
|
||||
host: &ssh_host 43.248.3.21
|
||||
port: &ssh_port 22
|
||||
username: &ssh_user root
|
||||
password: &ssh_pass xIy9PQcBF96C
|
||||
password: &ssh_pass KQv7yzna7BDukK
|
||||
|
||||
source:
|
||||
- blazing/build/**
|
||||
target: /opt/blazing/
|
||||
target: /ext/blazing/
|
||||
strip_components: 1 # 统一缩进6个空格
|
||||
skip_verify: true # 统一缩进6个空格
|
||||
timeout: 30s # 统一缩进6个空格
|
||||
@@ -167,7 +167,7 @@ steps:
|
||||
password: *ssh_pass
|
||||
script:
|
||||
- |
|
||||
cd /opt/blazing/build
|
||||
cd /ext/blazing/build
|
||||
ls -t login_* 2>/dev/null | head -1
|
||||
BIN_NAME=$(ls -t login_* 2>/dev/null | head -1)
|
||||
echo "BIN_NAME: $BIN_NAME"
|
||||
@@ -201,9 +201,9 @@ steps:
|
||||
# 移动logic产物到public目录
|
||||
LOGIC_BIN=$(ls -t logic_* 2>/dev/null | head -1)
|
||||
if [ -n "$LOGIC_BIN" ]; then
|
||||
mkdir -p /opt/blazing/build/public
|
||||
mv $LOGIC_BIN /opt/blazing/build/public/
|
||||
echo "✅ Logic产物已移动到 /opt/blazing/build/public/ | 文件: $(basename $LOGIC_BIN)"
|
||||
mkdir -p /ext/blazing/build/public
|
||||
mv $LOGIC_BIN /ext/blazing/build/public/
|
||||
echo "✅ Logic产物已移动到 /ext/blazing/build/public/ | 文件: $(basename $LOGIC_BIN)"
|
||||
else
|
||||
echo "⚠️ 未找到Logic产物"
|
||||
fi
|
||||
|
||||
56
common/contrib/drivers/pgsql/cmd/codexcheck/main.go
Normal file
56
common/contrib/drivers/pgsql/cmd/codexcheck/main.go
Normal file
@@ -0,0 +1,56 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
_ "github.com/lib/pq"
|
||||
)
|
||||
|
||||
func main() {
|
||||
const dsn = "user=user_YrK4j7 password=password_jSDm76 host=43.248.3.21 port=5432 dbname=bl sslmode=disable timezone=Asia/Shanghai"
|
||||
|
||||
db, err := sql.Open("postgres", dsn)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
var (
|
||||
id int64
|
||||
cdkCode string
|
||||
cdkType int64
|
||||
exchangeRemainCount int64
|
||||
bindUserID int64
|
||||
validEndTime sql.NullTime
|
||||
remark sql.NullString
|
||||
)
|
||||
|
||||
err = db.QueryRow(`
|
||||
select id, cdk_code, type, exchange_remain_count, bind_user_id, valid_end_time, remark
|
||||
from config_gift_cdk
|
||||
where cdk_code = $1
|
||||
`, "nrTbdXFBhKkaTdDk").Scan(
|
||||
&id,
|
||||
&cdkCode,
|
||||
&cdkType,
|
||||
&exchangeRemainCount,
|
||||
&bindUserID,
|
||||
&validEndTime,
|
||||
&remark,
|
||||
)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
fmt.Printf("id=%d\ncdk_code=%s\ntype=%d\nexchange_remain_count=%d\nbind_user_id=%d\nvalid_end_time=%v\nremark=%q\n",
|
||||
id,
|
||||
cdkCode,
|
||||
cdkType,
|
||||
exchangeRemainCount,
|
||||
bindUserID,
|
||||
validEndTime.Time,
|
||||
remark.String,
|
||||
)
|
||||
}
|
||||
@@ -1,121 +1,121 @@
|
||||
package coolconfig
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
// cool config
|
||||
type sConfig struct {
|
||||
AutoMigrate bool `json:"auto_migrate,omitempty"` // 是否自动创建表
|
||||
Eps bool `json:"eps,omitempty"` // 是否开启eps
|
||||
File *file `json:"file,omitempty"` // 文件上传配置
|
||||
Name string `json:"name"` // 项目名称
|
||||
// LoginPort string `json:"port"`
|
||||
GameOnlineID uint32 `json:"port_bl"` //这个是命令行输入的参数
|
||||
ServerInfo ServerList
|
||||
|
||||
Address string //rpc端口
|
||||
|
||||
}
|
||||
type ServerList struct {
|
||||
OnlineID uint32 `gorm:"column:online_id;comment:'在线ID';uniqueIndex" json:"online_id"`
|
||||
//服务器名称Desc
|
||||
Name string `gorm:"comment:'服务器名称'" json:"name"`
|
||||
IP string `gorm:"type:string;comment:'服务器IP'" json:"ip"`
|
||||
Port uint32 `gorm:"comment:'端口号,通常是小整数'" json:"port"`
|
||||
IsOpen uint8 `gorm:"default:0;not null;comment:'是否开启'" json:"is_open"`
|
||||
//登录地址
|
||||
LoginAddr string `gorm:"type:string;comment:'登录地址'" json:"login_addr"`
|
||||
//账号
|
||||
Account string `gorm:"type:string;comment:'账号'" json:"account"`
|
||||
//密码
|
||||
Password string `gorm:"type:string;comment:'密码'" json:"password"`
|
||||
CanPort []uint32 `gorm:"type:jsonb;comment:'可连接端口'" json:"can_port"`
|
||||
//是否测试服
|
||||
IsVip uint32 `gorm:"default:0;not null;comment:'是否为VIP服务器'" json:"is_vip"`
|
||||
//isdebug 是否本地服
|
||||
IsDebug uint8 `gorm:"default:0;comment:'是否为调试模式'" json:"is_debug"`
|
||||
|
||||
//服务器属主Desc
|
||||
Owner uint32 `gorm:"comment:'服务器属主'" json:"owner"`
|
||||
Desc string `gorm:"comment:'服务器描述'" json:"desc"`
|
||||
OldScreen string `gorm:"comment:'服务器screen参数'" json:"old_screen"`
|
||||
//到期时间ServerList
|
||||
ExpireTime time.Time `gorm:"default:0;comment:'到期时间'" json:"expire_time"`
|
||||
}
|
||||
|
||||
func (s *ServerList) GetID() string {
|
||||
return gconv.String(100000*s.OnlineID + s.Port)
|
||||
}
|
||||
|
||||
// OSS相关配置
|
||||
type oss struct {
|
||||
Endpoint string `json:"endpoint"`
|
||||
AccessKeyID string `json:"accessKeyID"`
|
||||
SecretAccessKey string `json:"secretAccessKey"`
|
||||
UseSSL bool `json:"useSSL"`
|
||||
BucketName string `json:"bucketName"`
|
||||
Location string `json:"location"`
|
||||
}
|
||||
|
||||
// 文件上传配置
|
||||
type file struct {
|
||||
Mode string `json:"mode"` // 模式 local oss
|
||||
Domain string `json:"domain"` // 域名 http://
|
||||
Oss *oss `json:"oss,omitempty"`
|
||||
}
|
||||
|
||||
// NewConfig new config
|
||||
func newConfig() *sConfig {
|
||||
var ctx g.Ctx
|
||||
config := &sConfig{
|
||||
AutoMigrate: GetCfgWithDefault(ctx, "blazing.autoMigrate", g.NewVar(false)).Bool(),
|
||||
Name: GetCfgWithDefault(ctx, "server.name", g.NewVar("")).String(),
|
||||
|
||||
Eps: GetCfgWithDefault(ctx, "blazing.eps", g.NewVar(false)).Bool(),
|
||||
// LoginPort: string(GetCfgWithDefault(ctx, "server.port", g.NewVar("8080")).String()),
|
||||
Address: GetCfgWithDefault(ctx, "server.address", g.NewVar("8080")).String(),
|
||||
//GamePort: GetCfgWithDefault(ctx, "server.game", g.NewVar("8080")).Uint64s(),
|
||||
|
||||
File: &file{
|
||||
Mode: GetCfgWithDefault(ctx, "blazing.file.mode", g.NewVar("none")).String(),
|
||||
Domain: GetCfgWithDefault(ctx, "blazing.file.domain", g.NewVar("http://127.0.0.1:8300")).String(),
|
||||
Oss: &oss{
|
||||
Endpoint: GetCfgWithDefault(ctx, "blazing.file.oss.endpoint", g.NewVar("127.0.0.1:9000")).String(),
|
||||
AccessKeyID: GetCfgWithDefault(ctx, "blazing.file.oss.accessKeyID", g.NewVar("")).String(),
|
||||
SecretAccessKey: GetCfgWithDefault(ctx, "blazing.file.oss.secretAccessKey", g.NewVar("")).String(),
|
||||
UseSSL: GetCfgWithDefault(ctx, "blazing.file.oss.useSSL", g.NewVar(false)).Bool(),
|
||||
BucketName: GetCfgWithDefault(ctx, "blazing.file.oss.bucketName", g.NewVar("blazing")).String(),
|
||||
Location: GetCfgWithDefault(ctx, "blazing.file.oss.location", g.NewVar("us-east-1")).String(),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
return config
|
||||
}
|
||||
|
||||
// qiniu 七牛云配置
|
||||
type qiniu struct {
|
||||
AccessKey string `json:"ak"`
|
||||
SecretKey string `json:"sk"`
|
||||
Bucket string `json:"bucket"`
|
||||
CDN string `json:"cdn"`
|
||||
}
|
||||
|
||||
// Config config
|
||||
var Config = newConfig()
|
||||
|
||||
// GetCfgWithDefault get config with default value
|
||||
func GetCfgWithDefault(ctx g.Ctx, key string, defaultValue *g.Var) *g.Var {
|
||||
value, err := g.Cfg().GetWithEnv(ctx, key)
|
||||
if err != nil {
|
||||
return defaultValue
|
||||
}
|
||||
if value.IsEmpty() || value.IsNil() {
|
||||
return defaultValue
|
||||
}
|
||||
return value
|
||||
}
|
||||
package coolconfig
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
// cool config
|
||||
type sConfig struct {
|
||||
AutoMigrate bool `json:"auto_migrate,omitempty"` // 是否自动创建表
|
||||
Eps bool `json:"eps,omitempty"` // 是否开启eps
|
||||
File *file `json:"file,omitempty"` // 文件上传配置
|
||||
Name string `json:"name"` // 项目名称
|
||||
// LoginPort string `json:"port"`
|
||||
GameOnlineID uint32 `json:"port_bl"` //这个是命令行输入的参数
|
||||
ServerInfo ServerList
|
||||
|
||||
Address string //rpc端口
|
||||
|
||||
}
|
||||
type ServerList struct {
|
||||
OnlineID uint32 `gorm:"column:online_id;comment:'在线ID';uniqueIndex" json:"online_id"`
|
||||
//服务器名称Desc
|
||||
Name string `gorm:"comment:'服务器名称'" json:"name"`
|
||||
IP string `gorm:"type:string;comment:'服务器IP'" json:"ip"`
|
||||
Port uint32 `gorm:"comment:'端口号,通常是小整数'" json:"port"`
|
||||
IsOpen uint8 `gorm:"default:0;not null;comment:'是否开启'" json:"is_open"`
|
||||
//登录地址
|
||||
LoginAddr string `gorm:"type:string;comment:'登录地址'" json:"login_addr"`
|
||||
//账号
|
||||
Account string `gorm:"type:string;comment:'账号'" json:"account"`
|
||||
//密码
|
||||
Password string `gorm:"type:string;comment:'密码'" json:"password"`
|
||||
CanPort []uint32 `gorm:"type:jsonb;comment:'可连接端口'" json:"can_port"`
|
||||
//是否测试服
|
||||
IsVip uint32 `gorm:"default:0;not null;comment:'是否为VIP服务器'" json:"is_vip"`
|
||||
//isdebug 是否本地服
|
||||
IsDebug uint8 `gorm:"default:0;comment:'是否为调试模式'" json:"is_debug"`
|
||||
|
||||
//服务器属主Desc
|
||||
Owner uint32 `gorm:"comment:'服务器属主'" json:"owner"`
|
||||
Desc string `gorm:"comment:'服务器描述'" json:"desc"`
|
||||
OldScreen string `gorm:"comment:'服务器screen参数'" json:"old_screen"`
|
||||
//到期时间ServerList
|
||||
ExpireTime time.Time `gorm:"default:0;comment:'到期时间'" json:"expire_time"`
|
||||
}
|
||||
|
||||
func (s *ServerList) GetID() string {
|
||||
return gconv.String(100000*s.OnlineID + s.Port)
|
||||
}
|
||||
|
||||
// OSS相关配置
|
||||
type oss struct {
|
||||
Endpoint string `json:"endpoint"`
|
||||
AccessKeyID string `json:"accessKeyID"`
|
||||
SecretAccessKey string `json:"secretAccessKey"`
|
||||
UseSSL bool `json:"useSSL"`
|
||||
BucketName string `json:"bucketName"`
|
||||
Location string `json:"location"`
|
||||
}
|
||||
|
||||
// 文件上传配置
|
||||
type file struct {
|
||||
Mode string `json:"mode"` // 模式 local oss
|
||||
Domain string `json:"domain"` // 域名 http://
|
||||
Oss *oss `json:"oss,omitempty"`
|
||||
}
|
||||
|
||||
// NewConfig new config
|
||||
func newConfig() *sConfig {
|
||||
var ctx g.Ctx
|
||||
config := &sConfig{
|
||||
AutoMigrate: GetCfgWithDefault(ctx, "blazing.autoMigrate", g.NewVar(false)).Bool(),
|
||||
Name: GetCfgWithDefault(ctx, "server.name", g.NewVar("")).String(),
|
||||
|
||||
Eps: GetCfgWithDefault(ctx, "blazing.eps", g.NewVar(false)).Bool(),
|
||||
// LoginPort: string(GetCfgWithDefault(ctx, "server.port", g.NewVar("8080")).String()),
|
||||
Address: GetCfgWithDefault(ctx, "server.address", g.NewVar("8080")).String(),
|
||||
//GamePort: GetCfgWithDefault(ctx, "server.game", g.NewVar("8080")).Uint64s(),
|
||||
|
||||
File: &file{
|
||||
Mode: GetCfgWithDefault(ctx, "blazing.file.mode", g.NewVar("none")).String(),
|
||||
Domain: GetCfgWithDefault(ctx, "blazing.file.domain", g.NewVar("http://127.0.0.1:8300")).String(),
|
||||
Oss: &oss{
|
||||
Endpoint: GetCfgWithDefault(ctx, "blazing.file.oss.endpoint", g.NewVar("127.0.0.1:9000")).String(),
|
||||
AccessKeyID: GetCfgWithDefault(ctx, "blazing.file.oss.accessKeyID", g.NewVar("")).String(),
|
||||
SecretAccessKey: GetCfgWithDefault(ctx, "blazing.file.oss.secretAccessKey", g.NewVar("")).String(),
|
||||
UseSSL: GetCfgWithDefault(ctx, "blazing.file.oss.useSSL", g.NewVar(false)).Bool(),
|
||||
BucketName: GetCfgWithDefault(ctx, "blazing.file.oss.bucketName", g.NewVar("blazing")).String(),
|
||||
Location: GetCfgWithDefault(ctx, "blazing.file.oss.location", g.NewVar("us-east-1")).String(),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
return config
|
||||
}
|
||||
|
||||
// qiniu 七牛云配置
|
||||
type qiniu struct {
|
||||
AccessKey string `json:"ak"`
|
||||
SecretKey string `json:"sk"`
|
||||
Bucket string `json:"bucket"`
|
||||
CDN string `json:"cdn"`
|
||||
}
|
||||
|
||||
// Config config
|
||||
var Config = newConfig()
|
||||
|
||||
// GetCfgWithDefault get config with default value
|
||||
func GetCfgWithDefault(ctx g.Ctx, key string, defaultValue *g.Var) *g.Var {
|
||||
value, err := g.Cfg().GetWithEnv(ctx, key)
|
||||
if err != nil {
|
||||
return defaultValue
|
||||
}
|
||||
if value.IsEmpty() || value.IsNil() {
|
||||
return defaultValue
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
@@ -22,8 +22,14 @@ var ctx = context.TODO()
|
||||
type Cmd struct {
|
||||
Func reflect.Value //方法函数
|
||||
Req reflect.Type //请求体
|
||||
// HeaderFieldIndex 是请求结构体中 TomeeHeader 字段的索引路径。
|
||||
HeaderFieldIndex []int
|
||||
// UseConn 标记第二个参数是否为 gnet.Conn。
|
||||
UseConn bool
|
||||
// 新增:预缓存的req创建函数(返回结构体指针)
|
||||
NewReqFunc func() interface{}
|
||||
// NewReqValue 返回请求结构体指针的 reflect.Value,避免重复构造类型信息。
|
||||
NewReqValue func() reflect.Value
|
||||
//Res reflect.Value //返回体
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package cool
|
||||
import (
|
||||
_ "blazing/contrib/drivers/pgsql"
|
||||
"blazing/cool/cooldb"
|
||||
"sync"
|
||||
|
||||
"github.com/gogf/gf/v2/encoding/gjson"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
@@ -10,6 +11,11 @@ import (
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
var (
|
||||
autoMigrateMu sync.Mutex
|
||||
autoMigrateModels []IModel
|
||||
)
|
||||
|
||||
// 初始化数据库连接供gorm使用
|
||||
func InitDB(group string) (*gorm.DB, error) {
|
||||
// var ctx context.Context
|
||||
@@ -54,9 +60,33 @@ func getDBbyModel(model IModel) *gorm.DB {
|
||||
|
||||
// 根据entity结构体创建表
|
||||
func CreateTable(model IModel) error {
|
||||
if Config.AutoMigrate {
|
||||
autoMigrateMu.Lock()
|
||||
autoMigrateModels = append(autoMigrateModels, model)
|
||||
autoMigrateMu.Unlock()
|
||||
return nil
|
||||
}
|
||||
|
||||
// RunAutoMigrate 显式执行已注册模型的建表/迁移。
|
||||
func RunAutoMigrate() error {
|
||||
if !Config.AutoMigrate {
|
||||
return nil
|
||||
}
|
||||
autoMigrateMu.Lock()
|
||||
models := append([]IModel(nil), autoMigrateModels...)
|
||||
autoMigrateMu.Unlock()
|
||||
|
||||
seen := make(map[string]struct{}, len(models))
|
||||
for _, model := range models {
|
||||
key := model.GroupName() + ":" + model.TableName()
|
||||
if _, ok := seen[key]; ok {
|
||||
continue
|
||||
}
|
||||
seen[key] = struct{}{}
|
||||
|
||||
db := getDBbyModel(model)
|
||||
return db.AutoMigrate(model)
|
||||
if err := db.AutoMigrate(model); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -6,6 +6,16 @@ func AddClient(id uint32, client *ClientHandler) {
|
||||
Clientmap.Store(id, client) // sync.Map存值
|
||||
}
|
||||
|
||||
// 清理指定client(uid=100000*onlineID+port)
|
||||
func DeleteClientOnly(uid uint32) {
|
||||
Clientmap.Delete(uid)
|
||||
}
|
||||
|
||||
// 清理指定client(onlineID+port)
|
||||
func DeleteClient(id, port uint32) {
|
||||
Clientmap.Delete(100000*id + port)
|
||||
}
|
||||
|
||||
// 取值示例
|
||||
func GetClient(id, port uint32) (*ClientHandler, bool) {
|
||||
// 普通map:client, ok := Clientmap[id]
|
||||
|
||||
@@ -42,15 +42,15 @@ const (
|
||||
maxMatrixSize = 227 // 矩阵维度(覆盖最大属性ID 226)
|
||||
)
|
||||
|
||||
// 合法单属性ID集合(快速校验)
|
||||
var validSingleElementIDs = map[int]bool{
|
||||
// 合法单属性ID集合(按ID直接索引,避免运行时 map 查找)
|
||||
var validSingleElementIDs = [maxMatrixSize]bool{
|
||||
1: true, 2: true, 3: true, 4: true, 5: true, 6: true, 7: true, 8: true, 9: true, 10: true,
|
||||
11: true, 12: true, 13: true, 14: true, 15: true, 16: true, 17: true, 18: true, 19: true, 20: true,
|
||||
221: true, 222: true, 223: true, 224: true, 225: true, 226: true,
|
||||
}
|
||||
|
||||
// 元素名称映射(全属性对应,便于日志输出)
|
||||
var elementNameMap = map[ElementType]string{
|
||||
// 元素名称映射(按ID直接索引,便于日志输出)
|
||||
var elementNameMap = [maxMatrixSize]string{
|
||||
ElementTypeGrass: "GRASS",
|
||||
ElementTypeWater: "WATER",
|
||||
ElementTypeFire: "FIRE",
|
||||
@@ -198,46 +198,55 @@ type ElementCombination struct {
|
||||
ID int // 组合唯一ID
|
||||
}
|
||||
|
||||
// 全局预加载资源(程序启动时init初始化,运行时直接使用)
|
||||
// 全局预加载资源(程序启动时初始化,运行时只读)
|
||||
var (
|
||||
// 元素组合池:key=组合ID,value=组合实例(预加载所有合法组合)
|
||||
elementCombinationPool = make(map[int]*ElementCombination, 150) // 128双+26单=154,预分配足够容量
|
||||
// 单属性克制矩阵(预初始化所有特殊克制关系,默认1.0)
|
||||
matrix [maxMatrixSize][maxMatrixSize]float64
|
||||
validCombinationIDs [maxMatrixSize]bool
|
||||
elementCombinationPool [maxMatrixSize]ElementCombination
|
||||
dualElementSecondaryPool [maxMatrixSize]ElementType
|
||||
matrix [maxMatrixSize][maxMatrixSize]float64
|
||||
Calculator *ElementCalculator
|
||||
)
|
||||
|
||||
// init 预加载所有资源(程序启动时执行一次,无并发问题)
|
||||
func init() {
|
||||
// 1. 初始化单属性克制矩阵
|
||||
initFullTableMatrix()
|
||||
initElementCombinationPool()
|
||||
Calculator = NewElementCalculator()
|
||||
}
|
||||
|
||||
// 2. 预加载所有单属性组合
|
||||
for id := range validSingleElementIDs {
|
||||
combo := &ElementCombination{
|
||||
Primary: ElementType(id),
|
||||
Secondary: nil,
|
||||
ID: id,
|
||||
func initElementCombinationPool() {
|
||||
for id, valid := range validSingleElementIDs {
|
||||
if !valid {
|
||||
continue
|
||||
}
|
||||
validCombinationIDs[id] = true
|
||||
elementCombinationPool[id] = ElementCombination{
|
||||
Primary: ElementType(id),
|
||||
ID: id,
|
||||
}
|
||||
elementCombinationPool[id] = combo
|
||||
}
|
||||
|
||||
// 3. 预加载所有双属性组合
|
||||
for dualID, atts := range dualElementMap {
|
||||
primaryID, secondaryID := atts[0], atts[1]
|
||||
// 按ID升序排序,保证组合一致性
|
||||
primary, secondary := ElementType(primaryID), ElementType(secondaryID)
|
||||
if primary > secondary {
|
||||
primary, secondary = secondary, primary
|
||||
}
|
||||
combo := &ElementCombination{
|
||||
|
||||
dualElementSecondaryPool[dualID] = secondary
|
||||
validCombinationIDs[dualID] = true
|
||||
elementCombinationPool[dualID] = ElementCombination{
|
||||
Primary: primary,
|
||||
Secondary: &secondary,
|
||||
Secondary: &dualElementSecondaryPool[dualID],
|
||||
ID: dualID,
|
||||
}
|
||||
elementCombinationPool[dualID] = combo
|
||||
}
|
||||
}
|
||||
|
||||
func isValidCombinationID(id int) bool {
|
||||
return id > 0 && id < maxMatrixSize && validCombinationIDs[id]
|
||||
}
|
||||
|
||||
// IsDual 判断是否为双属性
|
||||
func (ec *ElementCombination) IsDual() bool {
|
||||
return ec.Secondary != nil
|
||||
@@ -245,84 +254,82 @@ func (ec *ElementCombination) IsDual() bool {
|
||||
|
||||
// Elements 获取所有属性列表
|
||||
func (ec *ElementCombination) Elements() []ElementType {
|
||||
if ec.IsDual() {
|
||||
return []ElementType{ec.Primary, *ec.Secondary}
|
||||
if secondary := ec.Secondary; secondary != nil {
|
||||
return []ElementType{ec.Primary, *secondary}
|
||||
}
|
||||
return []ElementType{ec.Primary}
|
||||
}
|
||||
|
||||
// String 友好格式化输出
|
||||
func (ec *ElementCombination) String() string {
|
||||
primaryName := elementNameMap[ec.Primary]
|
||||
if !ec.IsDual() {
|
||||
return fmt.Sprintf("(%s)", primaryName)
|
||||
if secondary := ec.Secondary; secondary != nil {
|
||||
return fmt.Sprintf("(%s, %s)", elementNameMap[ec.Primary], elementNameMap[*secondary])
|
||||
}
|
||||
return fmt.Sprintf("(%s, %s)", primaryName, elementNameMap[*ec.Secondary])
|
||||
return fmt.Sprintf("(%s)", elementNameMap[ec.Primary])
|
||||
}
|
||||
|
||||
// ElementCalculator 无锁元素克制计算器(依赖预加载资源)
|
||||
// ElementCalculator 无锁元素克制计算器(所有倍数在初始化阶段预计算)
|
||||
type ElementCalculator struct {
|
||||
offensiveCache map[string]float64 // 攻击克制缓存(运行时填充,无并发写)
|
||||
offensiveTable [maxMatrixSize][maxMatrixSize]float64
|
||||
}
|
||||
|
||||
// NewElementCalculator 创建计算器实例(仅初始化缓存)
|
||||
// NewElementCalculator 创建计算器实例(构建只读查表缓存)
|
||||
func NewElementCalculator() *ElementCalculator {
|
||||
return &ElementCalculator{
|
||||
offensiveCache: make(map[string]float64, 4096), // 预分配大容量缓存
|
||||
c := &ElementCalculator{}
|
||||
c.initOffensiveTable()
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *ElementCalculator) initOffensiveTable() {
|
||||
for attackerID, valid := range validCombinationIDs {
|
||||
if !valid {
|
||||
continue
|
||||
}
|
||||
attacker := &elementCombinationPool[attackerID]
|
||||
for defenderID, valid := range validCombinationIDs {
|
||||
if !valid {
|
||||
continue
|
||||
}
|
||||
defender := &elementCombinationPool[defenderID]
|
||||
c.offensiveTable[attackerID][defenderID] = c.calculateMultiplier(attacker, defender)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// getMatrixValue 直接返回矩阵值(修复核心问题:不再将0转换为1)
|
||||
func (c *ElementCalculator) getMatrixValue(attacker, defender ElementType) float64 {
|
||||
return matrix[attacker][defender] // 矩阵默认已初始化1.0,特殊值直接返回
|
||||
return matrix[attacker][defender]
|
||||
}
|
||||
|
||||
// GetCombination 获取元素组合(直接从预加载池读取)
|
||||
// GetCombination 获取元素组合(直接按ID索引)
|
||||
func (c *ElementCalculator) GetCombination(id int) (*ElementCombination, error) {
|
||||
combo, exists := elementCombinationPool[id]
|
||||
if !exists {
|
||||
if !isValidCombinationID(id) {
|
||||
return nil, fmt.Errorf("invalid element combination ID: %d", id)
|
||||
}
|
||||
return combo, nil
|
||||
return &elementCombinationPool[id], nil
|
||||
}
|
||||
|
||||
// GetOffensiveMultiplier 计算攻击方→防御方的克制倍数(缓存优先)
|
||||
// GetOffensiveMultiplier 计算攻击方→防御方的克制倍数(只读查表)
|
||||
func (c *ElementCalculator) GetOffensiveMultiplier(attackerID, defenderID int) (float64, error) {
|
||||
// 1. 获取预加载的组合实例
|
||||
attacker, err := c.GetCombination(attackerID)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("attacker invalid: %w", err)
|
||||
if !isValidCombinationID(attackerID) {
|
||||
return 0, fmt.Errorf("attacker invalid: invalid element combination ID: %d", attackerID)
|
||||
}
|
||||
defender, err := c.GetCombination(defenderID)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("defender invalid: %w", err)
|
||||
if !isValidCombinationID(defenderID) {
|
||||
return 0, fmt.Errorf("defender invalid: invalid element combination ID: %d", defenderID)
|
||||
}
|
||||
|
||||
// 2. 缓存键(全局唯一)
|
||||
cacheKey := fmt.Sprintf("a%d_d%d", attackerID, defenderID)
|
||||
if val, exists := c.offensiveCache[cacheKey]; exists {
|
||||
return val, nil
|
||||
}
|
||||
|
||||
// 3. 核心计算+缓存
|
||||
val := c.calculateMultiplier(attacker, defender)
|
||||
c.offensiveCache[cacheKey] = val
|
||||
return val, nil
|
||||
return c.offensiveTable[attackerID][defenderID], nil
|
||||
}
|
||||
|
||||
// calculateMultiplier 核心克制计算逻辑
|
||||
func (c *ElementCalculator) calculateMultiplier(attacker, defender *ElementCombination) float64 {
|
||||
// 场景1:单→单
|
||||
if !attacker.IsDual() && !defender.IsDual() {
|
||||
return c.getMatrixValue(attacker.Primary, defender.Primary)
|
||||
}
|
||||
|
||||
// 场景2:单→双
|
||||
if !attacker.IsDual() {
|
||||
y1, y2 := defender.Primary, *defender.Secondary
|
||||
m1 := c.getMatrixValue(attacker.Primary, y1)
|
||||
m2 := c.getMatrixValue(attacker.Primary, y2)
|
||||
|
||||
switch {
|
||||
case m1 == 2 && m2 == 2:
|
||||
return 4.0
|
||||
@@ -333,12 +340,10 @@ func (c *ElementCalculator) calculateMultiplier(attacker, defender *ElementCombi
|
||||
}
|
||||
}
|
||||
|
||||
// 场景3:双→单
|
||||
if !defender.IsDual() {
|
||||
return c.calculateDualToSingle(attacker.Primary, *attacker.Secondary, defender.Primary)
|
||||
}
|
||||
|
||||
// 场景4:双→双
|
||||
x1, x2 := attacker.Primary, *attacker.Secondary
|
||||
y1, y2 := defender.Primary, *defender.Secondary
|
||||
coeffY1 := c.calculateDualToSingle(x1, x2, y1)
|
||||
@@ -350,7 +355,6 @@ func (c *ElementCalculator) calculateMultiplier(attacker, defender *ElementCombi
|
||||
func (c *ElementCalculator) calculateDualToSingle(attacker1, attacker2, defender ElementType) float64 {
|
||||
k1 := c.getMatrixValue(attacker1, defender)
|
||||
k2 := c.getMatrixValue(attacker2, defender)
|
||||
|
||||
switch {
|
||||
case k1 == 2 && k2 == 2:
|
||||
return 4.0
|
||||
@@ -361,60 +365,49 @@ func (c *ElementCalculator) calculateDualToSingle(attacker1, attacker2, defender
|
||||
}
|
||||
}
|
||||
|
||||
var Calculator = NewElementCalculator()
|
||||
|
||||
// TestAllScenarios 全场景测试(验证预加载和计算逻辑)
|
||||
func TestAllScenarios() {
|
||||
|
||||
// 测试1:单→单(草→水)
|
||||
m1, _ := Calculator.GetOffensiveMultiplier(1, 2)
|
||||
fmt.Println("草→水: %.2f(预期2.0)", m1)
|
||||
if math.Abs(m1-2.0) > 0.001 {
|
||||
fmt.Println("测试1失败:实际%.2f", m1)
|
||||
}
|
||||
|
||||
// 测试2:特殊单→单(混沌→虚空)
|
||||
m2, _ := Calculator.GetOffensiveMultiplier(222, 226)
|
||||
fmt.Println("混沌→虚空: %.2f(预期0.0)", m2)
|
||||
if math.Abs(m2-0.0) > 0.001 {
|
||||
fmt.Println("测试2失败:实际%.2f", m2)
|
||||
}
|
||||
|
||||
// 测试3:单→双(火→冰龙(43))
|
||||
m3, _ := Calculator.GetOffensiveMultiplier(3, 43)
|
||||
fmt.Println("火→冰龙: %.2f(预期1.5)", m3)
|
||||
if math.Abs(m3-1.5) > 0.001 {
|
||||
fmt.Println("测试3失败:实际%.2f", m3)
|
||||
}
|
||||
|
||||
// 测试4:双→特殊单(混沌暗影(92)→神灵(223))
|
||||
m4, _ := Calculator.GetOffensiveMultiplier(92, 223)
|
||||
fmt.Println("混沌暗影→神灵: %.2f(预期1.25)", m4)
|
||||
if math.Abs(m4-1.25) > 0.001 {
|
||||
fmt.Println("测试4失败:实际%.2f", m4)
|
||||
}
|
||||
|
||||
// 测试5:双→双(虚空邪灵(113)→混沌远古(98))
|
||||
m5, _ := Calculator.GetOffensiveMultiplier(113, 98)
|
||||
fmt.Println("虚空邪灵→混沌远古: %.2f(预期0.875", m5)
|
||||
if math.Abs(m5-0.875) > 0.001 {
|
||||
fmt.Println("测试5失败:实际%.2f", m5)
|
||||
}
|
||||
|
||||
// 测试6:缓存命中
|
||||
m6, _ := Calculator.GetOffensiveMultiplier(113, 98)
|
||||
if math.Abs(m6-m5) > 0.001 {
|
||||
fmt.Println("测试6失败:缓存未命中")
|
||||
}
|
||||
|
||||
// 测试7:含无效组合(电→地面)
|
||||
m7, _ := Calculator.GetOffensiveMultiplier(5, 7)
|
||||
fmt.Println("电→地面: %.2f(预期0.0)", m7)
|
||||
if math.Abs(m7-0.0) > 0.001 {
|
||||
fmt.Println("测试7失败:实际%.2f", m7)
|
||||
}
|
||||
|
||||
// 测试8:双属性含无效(电战斗→地面)
|
||||
m8, _ := Calculator.GetOffensiveMultiplier(35, 7)
|
||||
fmt.Println("电战斗→地面: %.2f(预期0.25)", m8)
|
||||
if math.Abs(m8-0.25) > 0.001 {
|
||||
|
||||
@@ -5,7 +5,7 @@ type EffectArg struct {
|
||||
SideEffect []struct {
|
||||
ID int `json:"ID"`
|
||||
SideEffectArgcount int `json:"SideEffectArgcount"`
|
||||
SideEffectArg string `json:"SideEffectArg,omitempty"`
|
||||
SideEffectArg rawFlexibleString `json:"SideEffectArg,omitempty"`
|
||||
} `json:"SideEffect"`
|
||||
} `json:"SideEffects"`
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
|
||||
_ "blazing/common/data/xmlres/packed"
|
||||
"encoding/json"
|
||||
"os"
|
||||
"fmt"
|
||||
|
||||
"github.com/ECUST-XX/xml"
|
||||
"github.com/gogf/gf/v2/os/gres"
|
||||
@@ -14,22 +14,36 @@ import (
|
||||
|
||||
var path string
|
||||
|
||||
func readConfigContent(path string) []byte {
|
||||
return gres.GetContent(path)
|
||||
}
|
||||
|
||||
func getXml[T any](path string) T {
|
||||
|
||||
// 解析XML到结构体
|
||||
var xmls T
|
||||
|
||||
t1 := gres.GetContent(path)
|
||||
t1 := readConfigContent(path)
|
||||
xml.Unmarshal(t1, &xmls)
|
||||
|
||||
return xmls
|
||||
}
|
||||
func getJson[T any](path string) T {
|
||||
|
||||
// 解析XML到结构体
|
||||
// 解析JSON到结构体
|
||||
var xmls T
|
||||
t1 := gres.GetContent(path)
|
||||
json.Unmarshal(t1, &xmls)
|
||||
t1 := readConfigContent(path)
|
||||
if len(t1) == 0 {
|
||||
fmt.Printf("[xmlres] getJson empty content: path=%s\n", path)
|
||||
return xmls
|
||||
}
|
||||
if err := json.Unmarshal(t1, &xmls); err != nil {
|
||||
head := string(t1)
|
||||
if len(head) > 300 {
|
||||
head = head[:300]
|
||||
}
|
||||
fmt.Printf("[xmlres] getJson unmarshal failed: path=%s len=%d err=%v head=%q\n", path, len(t1), err, head)
|
||||
}
|
||||
|
||||
return xmls
|
||||
}
|
||||
@@ -58,8 +72,6 @@ var (
|
||||
|
||||
func Initfile() {
|
||||
//gres.Dump()
|
||||
path1, _ := os.Getwd()
|
||||
path = path1 + "/public/config/"
|
||||
path = "config/"
|
||||
MapConfig = getXml[Maps](path + "210.xml")
|
||||
|
||||
@@ -87,10 +99,10 @@ func Initfile() {
|
||||
return gconv.Int(m.ProductID)
|
||||
|
||||
})
|
||||
Skill := getXml[MovesTbl](path + "227.xml")
|
||||
skillConfig := getJson[MovesJSON](path + "moves_flash.json")
|
||||
|
||||
SkillMap = make(map[int]Move, len(Skill.Moves))
|
||||
for _, v := range Skill.Moves {
|
||||
SkillMap = make(map[int]Move, len(skillConfig.MovesTbl.Moves.Move))
|
||||
for _, v := range skillConfig.MovesTbl.Moves.Move {
|
||||
v.SideEffectS = ParseSideEffectArgs(v.SideEffect)
|
||||
v.SideEffectArgS = ParseSideEffectArgs(v.SideEffectArg)
|
||||
SkillMap[v.ID] = v
|
||||
@@ -101,7 +113,11 @@ func Initfile() {
|
||||
|
||||
})
|
||||
|
||||
PetMAP = utils.ToMap[PetInfo, int](getXml[Monsters](path+"226.xml").Monsters, func(m PetInfo) int {
|
||||
pets := getXml[Monsters](path + "226.xml").Monsters
|
||||
for i := range pets {
|
||||
pets[i].YieldingEVValues = parseYieldingEV(pets[i].YieldingEV)
|
||||
}
|
||||
PetMAP = utils.ToMap[PetInfo, int](pets, func(m PetInfo) int {
|
||||
return m.ID
|
||||
|
||||
})
|
||||
|
||||
26
common/data/xmlres/json_compat_test.go
Normal file
26
common/data/xmlres/json_compat_test.go
Normal file
@@ -0,0 +1,26 @@
|
||||
package xmlres
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestMoveUnmarshalJSONAcceptsNumericName(t *testing.T) {
|
||||
var move Move
|
||||
if err := json.Unmarshal([]byte(`{"ID":10001,"Name":1,"Category":1,"Type":8,"Power":35,"MaxPP":35,"Accuracy":95}`), &move); err != nil {
|
||||
t.Fatalf("unmarshal move failed: %v", err)
|
||||
}
|
||||
if move.Name != "1" {
|
||||
t.Fatalf("expected numeric name to convert to string, got %q", move.Name)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEffectArgUnmarshalJSONAcceptsNumericSideEffectArg(t *testing.T) {
|
||||
var cfg EffectArg
|
||||
if err := json.Unmarshal([]byte(`{"SideEffects":{"SideEffect":[{"ID":1,"SideEffectArgcount":1,"SideEffectArg":3}]}}`), &cfg); err != nil {
|
||||
t.Fatalf("unmarshal effect arg failed: %v", err)
|
||||
}
|
||||
if got := string(cfg.SideEffects.SideEffect[0].SideEffectArg); got != "3" {
|
||||
t.Fatalf("expected numeric side effect arg to convert to string, got %q", got)
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -1,6 +1,11 @@
|
||||
package xmlres
|
||||
|
||||
import "github.com/ECUST-XX/xml"
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/ECUST-XX/xml"
|
||||
)
|
||||
|
||||
// Move 表示怪物可学习的技能
|
||||
type PetMoves struct {
|
||||
@@ -45,6 +50,7 @@ type PetInfo struct {
|
||||
Recycle int `xml:"Recycle,attr"` // 是否可回收
|
||||
LearnableMoves LearnableMoves `xml:"LearnableMoves"` // 可学习的技能
|
||||
NaturalEnemy string `xml:"NaturalEnemy,attr"` //天敌
|
||||
YieldingEVValues []int64 `xml:"-"` // 预解析后的努力值奖励
|
||||
}
|
||||
|
||||
func (basic *PetInfo) GetBasic() uint32 {
|
||||
@@ -61,3 +67,16 @@ type Monsters struct {
|
||||
XMLName xml.Name `xml:"Monsters"`
|
||||
Monsters []PetInfo `xml:"Monster"`
|
||||
}
|
||||
|
||||
func parseYieldingEV(raw string) []int64 {
|
||||
values := make([]int64, 6)
|
||||
parts := strings.Fields(raw)
|
||||
for i := 0; i < len(parts) && i < len(values); i++ {
|
||||
value, err := strconv.ParseInt(parts[i], 10, 64)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
values[i] = value
|
||||
}
|
||||
return values
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package xmlres
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
"io"
|
||||
@@ -33,51 +34,156 @@ type MovesTbl struct {
|
||||
Moves []Move `xml:"Moves>Move"`
|
||||
EFF []SideEffect `xml:"SideEffects>SideEffect"`
|
||||
}
|
||||
|
||||
type MovesJSON struct {
|
||||
MovesTbl MovesJSONRoot `json:"MovesTbl"`
|
||||
}
|
||||
|
||||
type MovesJSONRoot struct {
|
||||
Moves struct {
|
||||
Move []Move `json:"Move"`
|
||||
} `json:"Moves"`
|
||||
SideEffects struct {
|
||||
SideEffect []SideEffect `json:"SideEffect"`
|
||||
} `json:"SideEffects"`
|
||||
}
|
||||
|
||||
type MovesMap struct {
|
||||
XMLName xml.Name `xml:"MovesTbl"`
|
||||
Moves map[int]Move
|
||||
EFF []SideEffect `xml:"SideEffects>SideEffect"`
|
||||
}
|
||||
|
||||
type rawFlexibleString string
|
||||
|
||||
func (s *rawFlexibleString) UnmarshalJSON(data []byte) error {
|
||||
text := strings.TrimSpace(string(data))
|
||||
if text == "" || text == "null" {
|
||||
*s = ""
|
||||
return nil
|
||||
}
|
||||
|
||||
if len(text) >= 2 && text[0] == '"' && text[len(text)-1] == '"' {
|
||||
var decoded string
|
||||
if err := json.Unmarshal(data, &decoded); err != nil {
|
||||
return err
|
||||
}
|
||||
*s = rawFlexibleString(decoded)
|
||||
return nil
|
||||
}
|
||||
|
||||
*s = rawFlexibleString(text)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Move 定义单个技能的结构
|
||||
type Move struct {
|
||||
ID int `xml:"ID,attr"`
|
||||
Name string `xml:"Name,attr"`
|
||||
ID int `xml:"ID,attr" json:"ID"`
|
||||
Name string `xml:"Name,attr" json:"Name"`
|
||||
|
||||
Category int `xml:"Category,attr"` //属性
|
||||
Type int `xml:"Type,attr"` //类型
|
||||
Power int `xml:"Power,attr"` //威力
|
||||
MaxPP int `xml:"MaxPP,attr"` //最大PP
|
||||
Accuracy int `xml:"Accuracy,attr"` //命中率
|
||||
CritRate int `xml:"CritRate,attr,omitempty"` //暴击率
|
||||
Priority int `xml:"Priority,attr,omitempty"` //优先级
|
||||
MustHit int `xml:"MustHit,attr,omitempty"` //是否必中
|
||||
SwapElemType int `xml:"SwapElemType,attr,omitempty"` //技能交换属性
|
||||
CopyElemType int `xml:"CopyElemType,attr,omitempty"` // 技能复制属性
|
||||
CritAtkFirst int `xml:"CritAtkFirst,attr,omitempty"` // 先出手时必定致命一击
|
||||
CritAtkSecond int `xml:"CritAtkSecond,attr,omitempty"` //后出手时必定致命一击
|
||||
CritSelfHalfHp int `xml:"CritSelfHalfHp,attr,omitempty"` //自身体力低于一半时必定致命一击
|
||||
CritFoeHalfHp int `xml:"CritFoeHalfHp,attr,omitempty"` //对方体力低于一半时必定致命一击
|
||||
DmgBindLv int `xml:"DmgBindLv,attr,omitempty"` //使对方受到的伤害值等于自身的等级
|
||||
PwrBindDv int `xml:"PwrBindDv,attr,omitempty"` //威力(power)取决于自身的潜力(个体值)
|
||||
PwrDouble int `xml:"PwrDouble,attr,omitempty"` //攻击时,若对方处于异常状态, 则威力翻倍;
|
||||
DmgBindHpDv int `xml:"DmgBindHpDv,attr,omitempty"` //使对方受到的伤害值等于自身的体力值
|
||||
SideEffect string `xml:"SideEffect,attr,omitempty"`
|
||||
SideEffectArg string `xml:"SideEffectArg,attr,omitempty"`
|
||||
Category int `xml:"Category,attr" json:"Category"` //属性
|
||||
Type int `xml:"Type,attr" json:"Type"` //类型
|
||||
Power int `xml:"Power,attr" json:"Power"` //威力
|
||||
MaxPP int `xml:"MaxPP,attr" json:"MaxPP"` //最大PP
|
||||
Accuracy int `xml:"Accuracy,attr" json:"Accuracy"` //命中率
|
||||
CritRate int `xml:"CritRate,attr,omitempty" json:"CritRate,omitempty"` //暴击率
|
||||
Priority int `xml:"Priority,attr,omitempty" json:"Priority,omitempty"` //优先级
|
||||
MustHit int `xml:"MustHit,attr,omitempty" json:"MustHit,omitempty"` //是否必中
|
||||
SwapElemType int `xml:"SwapElemType,attr,omitempty" json:"SwapElemType,omitempty"` //技能交换属性
|
||||
CopyElemType int `xml:"CopyElemType,attr,omitempty" json:"CopyElemType,omitempty"` // 技能复制属性
|
||||
CritAtkFirst int `xml:"CritAtkFirst,attr,omitempty" json:"CritAtkFirst,omitempty"` // 先出手时必定致命一击
|
||||
CritAtkSecond int `xml:"CritAtkSecond,attr,omitempty" json:"CritAtkSecond,omitempty"` //后出手时必定致命一击
|
||||
CritSelfHalfHp int `xml:"CritSelfHalfHp,attr,omitempty" json:"CritSelfHalfHp,omitempty"` //自身体力低于一半时必定致命一击
|
||||
CritFoeHalfHp int `xml:"CritFoeHalfHp,attr,omitempty" json:"CritFoeHalfHp,omitempty"` //对方体力低于一半时必定致命一击
|
||||
DmgBindLv int `xml:"DmgBindLv,attr,omitempty" json:"DmgBindLv,omitempty"` //使对方受到的伤害值等于自身的等级
|
||||
PwrBindDv int `xml:"PwrBindDv,attr,omitempty" json:"PwrBindDv,omitempty"` //威力(power)取决于自身的潜力(个体值)
|
||||
PwrDouble int `xml:"PwrDouble,attr,omitempty" json:"PwrDouble,omitempty"` //攻击时,若对方处于异常状态, 则威力翻倍;
|
||||
DmgBindHpDv int `xml:"DmgBindHpDv,attr,omitempty" json:"DmgBindHpDv,omitempty"` //使对方受到的伤害值等于自身的体力值
|
||||
SideEffect string `xml:"SideEffect,attr,omitempty" json:"SideEffect,omitempty"`
|
||||
SideEffectArg string `xml:"SideEffectArg,attr,omitempty" json:"SideEffectArg,omitempty"`
|
||||
SideEffectS []int
|
||||
SideEffectArgS []int
|
||||
AtkNum int `xml:"AtkNum,attr,omitempty"`
|
||||
Url string `xml:"Url,attr,omitempty"`
|
||||
AtkNum int `xml:"AtkNum,attr,omitempty" json:"AtkNum,omitempty"`
|
||||
AtkType int `xml:"AtkType,attr,omitempty" json:"AtkType,omitempty"` // 0:所有人 1:仅己方 2:仅对方 3:仅自己
|
||||
Url string `xml:"Url,attr,omitempty" json:"Url,omitempty"`
|
||||
|
||||
Info string `xml:"info,attr,omitempty"`
|
||||
Info string `xml:"info,attr,omitempty" json:"info,omitempty"`
|
||||
|
||||
CD *int `xml:"CD,attr"`
|
||||
CD *int `xml:"CD,attr" json:"CD"`
|
||||
}
|
||||
|
||||
func (m *Move) UnmarshalJSON(data []byte) error {
|
||||
type moveAlias struct {
|
||||
ID int `json:"ID"`
|
||||
Name rawFlexibleString `json:"Name"`
|
||||
Category int `json:"Category"`
|
||||
Type int `json:"Type"`
|
||||
Power int `json:"Power"`
|
||||
MaxPP int `json:"MaxPP"`
|
||||
Accuracy int `json:"Accuracy"`
|
||||
CritRate int `json:"CritRate,omitempty"`
|
||||
Priority int `json:"Priority,omitempty"`
|
||||
MustHit int `json:"MustHit,omitempty"`
|
||||
SwapElemType int `json:"SwapElemType,omitempty"`
|
||||
CopyElemType int `json:"CopyElemType,omitempty"`
|
||||
CritAtkFirst int `json:"CritAtkFirst,omitempty"`
|
||||
CritAtkSecond int `json:"CritAtkSecond,omitempty"`
|
||||
CritSelfHalfHp int `json:"CritSelfHalfHp,omitempty"`
|
||||
CritFoeHalfHp int `json:"CritFoeHalfHp,omitempty"`
|
||||
DmgBindLv int `json:"DmgBindLv,omitempty"`
|
||||
PwrBindDv int `json:"PwrBindDv,omitempty"`
|
||||
PwrDouble int `json:"PwrDouble,omitempty"`
|
||||
DmgBindHpDv int `json:"DmgBindHpDv,omitempty"`
|
||||
SideEffect rawFlexibleString `json:"SideEffect,omitempty"`
|
||||
SideEffectArg rawFlexibleString `json:"SideEffectArg,omitempty"`
|
||||
AtkNum int `json:"AtkNum,omitempty"`
|
||||
AtkType int `json:"AtkType,omitempty"`
|
||||
Url string `json:"Url,omitempty"`
|
||||
Info string `json:"info,omitempty"`
|
||||
CD *int `json:"CD"`
|
||||
}
|
||||
|
||||
var aux moveAlias
|
||||
if err := json.Unmarshal(data, &aux); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
*m = Move{
|
||||
ID: aux.ID,
|
||||
Name: string(aux.Name),
|
||||
Category: aux.Category,
|
||||
Type: aux.Type,
|
||||
Power: aux.Power,
|
||||
MaxPP: aux.MaxPP,
|
||||
Accuracy: aux.Accuracy,
|
||||
CritRate: aux.CritRate,
|
||||
Priority: aux.Priority,
|
||||
MustHit: aux.MustHit,
|
||||
SwapElemType: aux.SwapElemType,
|
||||
CopyElemType: aux.CopyElemType,
|
||||
CritAtkFirst: aux.CritAtkFirst,
|
||||
CritAtkSecond: aux.CritAtkSecond,
|
||||
CritSelfHalfHp: aux.CritSelfHalfHp,
|
||||
CritFoeHalfHp: aux.CritFoeHalfHp,
|
||||
DmgBindLv: aux.DmgBindLv,
|
||||
PwrBindDv: aux.PwrBindDv,
|
||||
PwrDouble: aux.PwrDouble,
|
||||
DmgBindHpDv: aux.DmgBindHpDv,
|
||||
SideEffect: string(aux.SideEffect),
|
||||
SideEffectArg: string(aux.SideEffectArg),
|
||||
AtkNum: aux.AtkNum,
|
||||
AtkType: aux.AtkType,
|
||||
Url: aux.Url,
|
||||
Info: aux.Info,
|
||||
CD: aux.CD,
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type SideEffect struct {
|
||||
ID int `xml:"ID,attr"`
|
||||
Help string `xml:"help,attr"`
|
||||
Des string `xml:"des,attr"`
|
||||
ID int `xml:"ID,attr" json:"ID"`
|
||||
Help string `xml:"help,attr" json:"help"`
|
||||
Des string `xml:"des,attr" json:"des"`
|
||||
}
|
||||
|
||||
// ReadHTTPFile 通过HTTP GET请求获取远程文件内容
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
module blazing/common
|
||||
|
||||
go 1.23.0
|
||||
go 1.23
|
||||
|
||||
require (
|
||||
github.com/panjf2000/gnet v1.6.7
|
||||
|
||||
@@ -2,17 +2,21 @@ package rpc
|
||||
|
||||
import (
|
||||
"blazing/cool"
|
||||
"context"
|
||||
"blazing/logic/service/fight/pvp"
|
||||
"blazing/logic/service/fight/pvpwire"
|
||||
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/gogf/gf/v2/database/gredis"
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
// ListenFunc 监听函数
|
||||
// ListenFunc 改造后的 Redis PubSub 监听函数,支持自动重连和心跳保活
|
||||
// ListenFunc 改造后的 Redis PubSub 监听函数,支持自动重连。
|
||||
// 注意:PubSub 连接只负责订阅和接收,避免在同一连接上并发 PING。
|
||||
func ListenFunc(ctx g.Ctx) {
|
||||
if !cool.IsRedisMode {
|
||||
panic(gerror.New("集群模式下, 请使用Redis作为缓存"))
|
||||
@@ -20,9 +24,8 @@ func ListenFunc(ctx g.Ctx) {
|
||||
|
||||
// 定义常量配置
|
||||
const (
|
||||
subscribeTopic = "cool:func" // 订阅的主题
|
||||
retryDelay = 10 * time.Second // 连接失败重试间隔
|
||||
heartbeatInterval = 30 * time.Second // 心跳保活间隔
|
||||
subscribeTopic = "cool:func" // 订阅的主题
|
||||
retryDelay = 10 * time.Second // 连接失败重试间隔
|
||||
)
|
||||
|
||||
// 外层循环:负责连接断开后的整体重连
|
||||
@@ -43,47 +46,25 @@ func ListenFunc(ctx g.Ctx) {
|
||||
continue
|
||||
}
|
||||
|
||||
// 2. 启动心跳保活协程,防止连接因空闲被断开
|
||||
heartbeatCtx, heartbeatCancel := context.WithCancel(context.Background())
|
||||
go func() {
|
||||
ticker := time.NewTicker(heartbeatInterval)
|
||||
defer func() {
|
||||
ticker.Stop()
|
||||
heartbeatCancel()
|
||||
}()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-heartbeatCtx.Done():
|
||||
cool.Logger.Info(ctx, "心跳协程退出")
|
||||
return
|
||||
case <-ticker.C:
|
||||
// 发送 PING 心跳,保持连接活跃
|
||||
_, pingErr := conn.Do(ctx, "PING")
|
||||
if pingErr != nil {
|
||||
cool.Logger.Error(ctx, "Redis 心跳失败,触发重连", "error", pingErr)
|
||||
// 心跳失败时主动关闭连接,触发外层重连
|
||||
_ = conn.Close(ctx)
|
||||
return
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
// 3. 订阅主题
|
||||
// 2. 订阅主题
|
||||
_, err = conn.Do(ctx, "subscribe", subscribeTopic)
|
||||
if err != nil {
|
||||
cool.Logger.Error(ctx, "订阅 Redis 主题失败", "topic", subscribeTopic, "error", err)
|
||||
heartbeatCancel() // 关闭心跳协程
|
||||
_ = conn.Close(ctx)
|
||||
time.Sleep(retryDelay)
|
||||
continue
|
||||
}
|
||||
cool.Logger.Info(ctx, "成功订阅 Redis 主题", "topic", subscribeTopic)
|
||||
_, err = conn.Do(ctx, "subscribe", "sun:join") //加入队列
|
||||
if err != nil {
|
||||
cool.Logger.Error(ctx, "订阅 Redis 主题失败", "topic", "sun:join", "error", err)
|
||||
_ = conn.Close(ctx)
|
||||
time.Sleep(retryDelay)
|
||||
continue
|
||||
}
|
||||
cool.Logger.Info(ctx, "成功订阅 Redis 主题", "topic", "sun:join")
|
||||
|
||||
// 4. 循环接收消息
|
||||
// 3. 循环接收消息
|
||||
connError := false
|
||||
for !connError {
|
||||
select {
|
||||
@@ -126,15 +107,15 @@ func ListenFunc(ctx g.Ctx) {
|
||||
}
|
||||
}
|
||||
|
||||
// 5. 清理资源,准备重连
|
||||
heartbeatCancel() // 关闭心跳协程
|
||||
// 4. 清理资源,准备重连
|
||||
_ = conn.Close(ctx) // 关闭当前连接
|
||||
// Logger.Warn(ctx, "Redis 连接异常,准备重连", "retry_after", retryDelay)
|
||||
cool.Logger.Info(ctx, "Redis 订阅连接异常,准备重连", "retry_after", retryDelay)
|
||||
time.Sleep(retryDelay)
|
||||
}
|
||||
}
|
||||
|
||||
// ListenFight 完全对齐 ListenFunc 写法,修复收不到消息问题
|
||||
// ListenFight 完全对齐 ListenFunc 写法,修复收不到消息问题。
|
||||
// 注意:PubSub 连接只负责订阅和接收,避免在同一连接上并发 PING。
|
||||
func ListenFight(ctx g.Ctx) {
|
||||
if !cool.IsRedisMode {
|
||||
panic(gerror.New("集群模式下, 请使用Redis作为缓存"))
|
||||
@@ -142,14 +123,15 @@ func ListenFight(ctx g.Ctx) {
|
||||
|
||||
// 定义常量配置(对齐 ListenFunc 风格)
|
||||
const (
|
||||
retryDelay = 10 * time.Second // 连接失败重试间隔
|
||||
heartbeatInterval = 30 * time.Second // 心跳保活间隔
|
||||
retryDelay = 10 * time.Second // 连接失败重试间隔
|
||||
)
|
||||
|
||||
// 提前拼接订阅主题(避免重复拼接,便于日志打印)
|
||||
serverID := cool.Config.ServerInfo.GetID()
|
||||
startTopic := "sun:start:" + serverID
|
||||
sendPackTopic := "sendpack:" + serverID
|
||||
pvpServerTopic := pvpwire.ServerTopic(gconv.Uint32(serverID))
|
||||
pvpCoordinatorTopic := pvpwire.CoordinatorTopicPrefix
|
||||
|
||||
// 外层循环:负责连接断开后的整体重连
|
||||
for {
|
||||
@@ -170,45 +152,26 @@ func ListenFight(ctx g.Ctx) {
|
||||
continue
|
||||
}
|
||||
|
||||
// 2. 启动心跳保活协程(完全对齐 ListenFunc 逻辑)
|
||||
heartbeatCtx, heartbeatCancel := context.WithCancel(context.Background())
|
||||
go func() {
|
||||
ticker := time.NewTicker(heartbeatInterval)
|
||||
defer func() {
|
||||
ticker.Stop()
|
||||
heartbeatCancel()
|
||||
}()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-heartbeatCtx.Done():
|
||||
cool.Logger.Info(ctx, "心跳协程退出")
|
||||
return
|
||||
case <-ticker.C:
|
||||
// 发送 PING 心跳,保持连接活跃
|
||||
_, pingErr := conn.Do(ctx, "PING")
|
||||
if pingErr != nil {
|
||||
cool.Logger.Error(ctx, "Redis 心跳失败,触发重连", "error", pingErr)
|
||||
// 心跳失败时主动关闭连接,触发外层重连
|
||||
_ = conn.Close(ctx)
|
||||
return
|
||||
}
|
||||
cool.Logger.Debug(ctx, "Redis 心跳发送成功,连接正常")
|
||||
}
|
||||
// 2. 订阅主题(对齐 ListenFunc 的错误处理,替换 panic 为优雅重连)
|
||||
subscribeTopics := []string{startTopic, pvpServerTopic}
|
||||
if cool.Config.GameOnlineID == pvp.CoordinatorOnlineID {
|
||||
subscribeTopics = append(subscribeTopics, pvpCoordinatorTopic)
|
||||
}
|
||||
subscribeFailed := false
|
||||
for _, topic := range subscribeTopics {
|
||||
_, err = conn.Do(ctx, "subscribe", topic)
|
||||
if err != nil {
|
||||
cool.Logger.Error(ctx, "订阅 Redis 主题失败", "topic", topic, "error", err)
|
||||
_ = conn.Close(ctx)
|
||||
time.Sleep(retryDelay)
|
||||
subscribeFailed = true
|
||||
break
|
||||
}
|
||||
}()
|
||||
|
||||
// 3. 订阅主题(对齐 ListenFunc 的错误处理,替换 panic 为优雅重连)
|
||||
// 订阅 sun:start:服务器ID
|
||||
_, err = conn.Do(ctx, "subscribe", startTopic)
|
||||
if err != nil {
|
||||
cool.Logger.Error(ctx, "订阅 Redis 主题失败", "topic", startTopic, "error", err)
|
||||
heartbeatCancel() // 关闭心跳协程
|
||||
_ = conn.Close(ctx)
|
||||
time.Sleep(retryDelay)
|
||||
cool.Logger.Info(ctx, "成功订阅 Redis 主题", "topic", topic)
|
||||
}
|
||||
if subscribeFailed {
|
||||
continue
|
||||
}
|
||||
cool.Logger.Info(ctx, "成功订阅 Redis 主题", "topic", startTopic)
|
||||
|
||||
// // 订阅 sun:sendpack:服务器ID
|
||||
// _, err = conn.Do(ctx, "subscribe", sendPackTopic)
|
||||
@@ -224,7 +187,7 @@ func ListenFight(ctx g.Ctx) {
|
||||
// 打印监听提示(保留原有日志)
|
||||
fmt.Println("监听战斗", startTopic)
|
||||
|
||||
// 4. 循环接收消息(完全对齐 ListenFunc 逻辑)
|
||||
// 3. 循环接收消息(完全对齐 ListenFunc 逻辑)
|
||||
connError := false
|
||||
for !connError {
|
||||
select {
|
||||
@@ -255,6 +218,10 @@ func ListenFight(ctx g.Ctx) {
|
||||
// universalClient, _ := g.Redis("cool").Client().(goredis.UniversalClient)
|
||||
}
|
||||
|
||||
if dataMap.Channel == pvpServerTopic || dataMap.Channel == pvpCoordinatorTopic {
|
||||
pvp.HandleRedisMessage(dataMap.Channel, dataMap.Payload)
|
||||
}
|
||||
|
||||
// 【可选】处理 sun:sendpack:服务器ID 消息(如果需要)
|
||||
if dataMap.Channel == sendPackTopic {
|
||||
fmt.Println("收到战斗包", dataMap.Payload)
|
||||
@@ -262,9 +229,9 @@ func ListenFight(ctx g.Ctx) {
|
||||
}
|
||||
}
|
||||
|
||||
// 5. 清理资源,准备重连(完全对齐 ListenFunc)
|
||||
heartbeatCancel() // 关闭心跳协程
|
||||
// 4. 清理资源,准备重连(完全对齐 ListenFunc)
|
||||
_ = conn.Close(ctx) // 关闭当前连接
|
||||
cool.Logger.Info(ctx, "Redis 战斗订阅连接异常,准备重连", "retry_after", retryDelay)
|
||||
time.Sleep(retryDelay)
|
||||
}
|
||||
}
|
||||
|
||||
163
common/rpc/pvp_match.go
Normal file
163
common/rpc/pvp_match.go
Normal file
@@ -0,0 +1,163 @@
|
||||
package rpc
|
||||
|
||||
import (
|
||||
"blazing/cool"
|
||||
"blazing/logic/service/fight/pvpwire"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
pvpMatchQueueTTL = 12 * time.Second
|
||||
pvpMatchBanPickSecond = 45
|
||||
)
|
||||
|
||||
type PVPMatchJoinPayload struct {
|
||||
RuntimeServerID uint32 `json:"runtimeServerId"`
|
||||
UserID uint32 `json:"userId"`
|
||||
Nick string `json:"nick"`
|
||||
FightMode uint32 `json:"fightMode"`
|
||||
Status uint32 `json:"status"`
|
||||
CatchTimes []uint32 `json:"catchTimes"`
|
||||
}
|
||||
|
||||
type pvpMatchCoordinator struct {
|
||||
mu sync.Mutex
|
||||
queues map[uint32][]pvpwire.QueuePlayerSnapshot
|
||||
lastSeen map[uint32]time.Time
|
||||
}
|
||||
|
||||
var defaultPVPMatchCoordinator = &pvpMatchCoordinator{
|
||||
queues: make(map[uint32][]pvpwire.QueuePlayerSnapshot),
|
||||
lastSeen: make(map[uint32]time.Time),
|
||||
}
|
||||
|
||||
func DefaultPVPMatchCoordinator() *pvpMatchCoordinator {
|
||||
return defaultPVPMatchCoordinator
|
||||
}
|
||||
|
||||
func (m *pvpMatchCoordinator) JoinOrUpdate(payload PVPMatchJoinPayload) error {
|
||||
if payload.UserID == 0 || payload.RuntimeServerID == 0 || payload.FightMode == 0 {
|
||||
return fmt.Errorf("invalid pvp match payload: uid=%d server=%d mode=%d", payload.UserID, payload.RuntimeServerID, payload.FightMode)
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
player := pvpwire.QueuePlayerSnapshot{
|
||||
RuntimeServerID: payload.RuntimeServerID,
|
||||
UserID: payload.UserID,
|
||||
Nick: payload.Nick,
|
||||
FightMode: payload.FightMode,
|
||||
Status: payload.Status,
|
||||
JoinedAtUnix: now.Unix(),
|
||||
CatchTimes: append([]uint32(nil), payload.CatchTimes...),
|
||||
}
|
||||
|
||||
var match *pvpwire.MatchFoundPayload
|
||||
|
||||
m.mu.Lock()
|
||||
m.pruneExpiredLocked(now)
|
||||
m.removeUserLocked(payload.UserID)
|
||||
m.lastSeen[payload.UserID] = now
|
||||
|
||||
queue := m.queues[payload.FightMode]
|
||||
if len(queue) > 0 {
|
||||
host := queue[0]
|
||||
queue = queue[1:]
|
||||
m.queues[payload.FightMode] = queue
|
||||
delete(m.lastSeen, host.UserID)
|
||||
delete(m.lastSeen, payload.UserID)
|
||||
|
||||
result := pvpwire.MatchFoundPayload{
|
||||
SessionID: buildPVPMatchSessionID(host.UserID, payload.UserID),
|
||||
Stage: pvpwire.StageBanPick,
|
||||
Host: host,
|
||||
Guest: player,
|
||||
BanPickTimeout: pvpMatchBanPickSecond,
|
||||
}
|
||||
match = &result
|
||||
} else {
|
||||
m.queues[payload.FightMode] = append(queue, player)
|
||||
}
|
||||
m.mu.Unlock()
|
||||
|
||||
if match == nil {
|
||||
return nil
|
||||
}
|
||||
if err := publishPVPMatchMessage(pvpwire.ServerTopic(match.Host.RuntimeServerID), pvpwire.MessageTypeMatchFound, *match); err != nil {
|
||||
return err
|
||||
}
|
||||
if match.Guest.RuntimeServerID != match.Host.RuntimeServerID {
|
||||
if err := publishPVPMatchMessage(pvpwire.ServerTopic(match.Guest.RuntimeServerID), pvpwire.MessageTypeMatchFound, *match); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *pvpMatchCoordinator) Cancel(userID uint32) {
|
||||
if userID == 0 {
|
||||
return
|
||||
}
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
|
||||
delete(m.lastSeen, userID)
|
||||
m.removeUserLocked(userID)
|
||||
}
|
||||
|
||||
func (m *pvpMatchCoordinator) pruneExpiredLocked(now time.Time) {
|
||||
for mode, queue := range m.queues {
|
||||
next := make([]pvpwire.QueuePlayerSnapshot, 0, len(queue))
|
||||
for _, queued := range queue {
|
||||
last := m.lastSeen[queued.UserID]
|
||||
if last.IsZero() || now.Sub(last) > pvpMatchQueueTTL {
|
||||
delete(m.lastSeen, queued.UserID)
|
||||
continue
|
||||
}
|
||||
next = append(next, queued)
|
||||
}
|
||||
m.queues[mode] = next
|
||||
}
|
||||
}
|
||||
|
||||
func (m *pvpMatchCoordinator) removeUserLocked(userID uint32) {
|
||||
for mode, queue := range m.queues {
|
||||
next := make([]pvpwire.QueuePlayerSnapshot, 0, len(queue))
|
||||
for _, queued := range queue {
|
||||
if queued.UserID == userID {
|
||||
continue
|
||||
}
|
||||
next = append(next, queued)
|
||||
}
|
||||
m.queues[mode] = next
|
||||
}
|
||||
}
|
||||
|
||||
func publishPVPMatchMessage(topic, msgType string, body any) error {
|
||||
payload, err := json.Marshal(body)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
envelope, err := json.Marshal(pvpwire.Envelope{
|
||||
Type: msgType,
|
||||
Body: payload,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
conn, err := cool.Redis.Conn(context.Background())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer conn.Close(context.Background())
|
||||
|
||||
_, err = conn.Do(context.Background(), "publish", topic, envelope)
|
||||
return err
|
||||
}
|
||||
|
||||
func buildPVPMatchSessionID(hostUserID, guestUserID uint32) string {
|
||||
return fmt.Sprintf("xsvr-%d-%d-%d", hostUserID, guestUserID, time.Now().UnixNano())
|
||||
}
|
||||
@@ -1,106 +1,166 @@
|
||||
package rpc
|
||||
|
||||
import (
|
||||
"blazing/common/data/share"
|
||||
"blazing/cool"
|
||||
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
config "blazing/modules/config/service"
|
||||
|
||||
"github.com/filecoin-project/go-jsonrpc"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
// Define the server handler
|
||||
type ServerHandler struct{}
|
||||
|
||||
// 实现踢人
|
||||
func (*ServerHandler) Kick(_ context.Context, userid uint32) error {
|
||||
|
||||
useid1, _ := share.ShareManager.GetUserOnline(userid)
|
||||
if useid1 == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
cl, ok := cool.GetClientOnly(useid1)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
cl.KickPerson(userid) //实现指定服务器踢人
|
||||
return nil
|
||||
}
|
||||
|
||||
// 注册logic服务器
|
||||
func (*ServerHandler) RegisterLogic(ctx context.Context, id, port uint32) error {
|
||||
fmt.Println("注册logic服务器", id, port)
|
||||
|
||||
//TODO 待修复滚动更新可能导致的玩家可以同时在旧服务器和新服务器同时在线的bug
|
||||
revClient, ok := jsonrpc.ExtractReverseClient[cool.ClientHandler](ctx)
|
||||
if !ok {
|
||||
return fmt.Errorf("no reverse client")
|
||||
}
|
||||
t := config.NewServerService().GetServerID((id))
|
||||
|
||||
aa, ok := cool.GetClient(t.OnlineID, t.Port)
|
||||
if ok && aa != nil { //如果已经存在且这个端口已经被存过
|
||||
aa.QuitSelf(0)
|
||||
}
|
||||
cool.AddClient(100000*id+port, &revClient)
|
||||
|
||||
//Refurh()
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func CServer() *jsonrpc.RPCServer {
|
||||
// create a new server instance
|
||||
rpcServer := jsonrpc.NewServer(jsonrpc.WithReverseClient[cool.ClientHandler](""))
|
||||
|
||||
rpcServer.Register("", &ServerHandler{})
|
||||
|
||||
return rpcServer
|
||||
|
||||
}
|
||||
|
||||
var closer jsonrpc.ClientCloser
|
||||
|
||||
func StartClient(id, port uint32, callback any) *struct {
|
||||
Kick func(uint32) error
|
||||
|
||||
RegisterLogic func(uint32, uint32) error
|
||||
} {
|
||||
//cool.Config.File.Domain = "127.0.0.1"
|
||||
var rpcaddr = "ws://" + cool.Config.File.Domain + gconv.String(cool.Config.Address) + "/rpc"
|
||||
|
||||
closer1, err := jsonrpc.NewMergeClient(context.Background(),
|
||||
rpcaddr, "", []interface{}{
|
||||
&RPCClient,
|
||||
}, nil, jsonrpc.WithClientHandler("", callback),
|
||||
jsonrpc.WithReconnFun(func() { RPCClient.RegisterLogic(id, port) }),
|
||||
)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to create client: %v", err)
|
||||
}
|
||||
|
||||
//if port != 0 { //注册logic
|
||||
defer RPCClient.RegisterLogic(id, port)
|
||||
|
||||
//}
|
||||
|
||||
closer = closer1
|
||||
|
||||
return &RPCClient
|
||||
}
|
||||
|
||||
// Setup RPCClient with reverse call handler
|
||||
var RPCClient struct {
|
||||
Kick func(uint32) error //踢人
|
||||
|
||||
RegisterLogic func(uint32, uint32) error
|
||||
|
||||
// UserLogin func(int32, int32) error //用户登录事件
|
||||
// UserLogout func(int32, int32) error //用户登出事件
|
||||
}
|
||||
package rpc
|
||||
|
||||
import (
|
||||
"blazing/common/data/share"
|
||||
"blazing/cool"
|
||||
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
config "blazing/modules/config/service"
|
||||
|
||||
"github.com/filecoin-project/go-jsonrpc"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
// Define the server handler
|
||||
type ServerHandler struct{}
|
||||
|
||||
const kickForwardTimeout = 3 * time.Second
|
||||
|
||||
// 实现踢人
|
||||
func (*ServerHandler) Kick(_ context.Context, userid uint32) error {
|
||||
useid1, err := share.ShareManager.GetUserOnline(userid)
|
||||
if err != nil || useid1 == 0 {
|
||||
// 请求到达时用户已离线,直接视为成功
|
||||
return nil
|
||||
}
|
||||
|
||||
cl, ok := cool.GetClientOnly(useid1)
|
||||
if !ok || cl == nil {
|
||||
// 目标服务器不在线,清理僵尸在线标记并视为成功
|
||||
_ = share.ShareManager.DeleteUserOnline(userid)
|
||||
cool.DeleteClientOnly(useid1)
|
||||
return nil
|
||||
}
|
||||
|
||||
resultCh := make(chan error, 1)
|
||||
go func() {
|
||||
resultCh <- cl.KickPerson(userid) // 实现指定服务器踢人
|
||||
}()
|
||||
|
||||
select {
|
||||
case callErr := <-resultCh:
|
||||
if callErr == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 调用失败后兜底:用户若已离线/切服/目标服不在线都算成功
|
||||
useid2, err2 := share.ShareManager.GetUserOnline(userid)
|
||||
if err2 != nil || useid2 == 0 || useid2 != useid1 {
|
||||
return nil
|
||||
}
|
||||
if cl2, ok2 := cool.GetClientOnly(useid2); !ok2 || cl2 == nil {
|
||||
_ = share.ShareManager.DeleteUserOnline(userid)
|
||||
cool.DeleteClientOnly(useid2)
|
||||
return nil
|
||||
}
|
||||
|
||||
// 仍在线则返回失败,不按成功处理
|
||||
return callErr
|
||||
case <-time.After(kickForwardTimeout):
|
||||
// 仅防止无限等待;超时不算成功
|
||||
useid2, err2 := share.ShareManager.GetUserOnline(userid)
|
||||
if err2 != nil || useid2 == 0 || useid2 != useid1 {
|
||||
return nil
|
||||
}
|
||||
if cl2, ok2 := cool.GetClientOnly(useid2); !ok2 || cl2 == nil {
|
||||
_ = share.ShareManager.DeleteUserOnline(userid)
|
||||
cool.DeleteClientOnly(useid2)
|
||||
return nil
|
||||
}
|
||||
|
||||
return fmt.Errorf("kick timeout, user still online: uid=%d server=%d", userid, useid2)
|
||||
}
|
||||
}
|
||||
|
||||
// 注册logic服务器
|
||||
func (*ServerHandler) RegisterLogic(ctx context.Context, id, port uint32) error {
|
||||
fmt.Println("注册logic服务器", id, port)
|
||||
|
||||
//TODO 待修复滚动更新可能导致的玩家可以同时在旧服务器和新服务器同时在线的bug
|
||||
revClient, ok := jsonrpc.ExtractReverseClient[cool.ClientHandler](ctx)
|
||||
if !ok {
|
||||
return fmt.Errorf("no reverse client")
|
||||
}
|
||||
t := config.NewServerService().GetServerID((id))
|
||||
|
||||
aa, ok := cool.GetClient(t.OnlineID, t.Port)
|
||||
if ok && aa != nil { //如果已经存在且这个端口已经被存过
|
||||
aa.QuitSelf(0)
|
||||
}
|
||||
cool.AddClient(100000*id+port, &revClient)
|
||||
|
||||
//Refurh()
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func (*ServerHandler) MatchJoinOrUpdate(_ context.Context, payload PVPMatchJoinPayload) error {
|
||||
return DefaultPVPMatchCoordinator().JoinOrUpdate(payload)
|
||||
}
|
||||
|
||||
func (*ServerHandler) MatchCancel(_ context.Context, userID uint32) error {
|
||||
DefaultPVPMatchCoordinator().Cancel(userID)
|
||||
return nil
|
||||
}
|
||||
|
||||
func CServer() *jsonrpc.RPCServer {
|
||||
// create a new server instance
|
||||
rpcServer := jsonrpc.NewServer(jsonrpc.WithReverseClient[cool.ClientHandler](""))
|
||||
|
||||
rpcServer.Register("", &ServerHandler{})
|
||||
|
||||
return rpcServer
|
||||
|
||||
}
|
||||
|
||||
var closer jsonrpc.ClientCloser
|
||||
|
||||
func StartClient(id, port uint32, callback any) *struct {
|
||||
Kick func(uint32) error
|
||||
|
||||
RegisterLogic func(uint32, uint32) error
|
||||
|
||||
MatchJoinOrUpdate func(PVPMatchJoinPayload) error
|
||||
|
||||
MatchCancel func(uint32) error
|
||||
} {
|
||||
//cool.Config.File.Domain = "127.0.0.1"
|
||||
var rpcaddr = "ws://" + cool.Config.File.Domain + gconv.String(cool.Config.Address) + "/rpc"
|
||||
|
||||
closer1, err := jsonrpc.NewMergeClient(context.Background(),
|
||||
rpcaddr, "", []interface{}{
|
||||
&RPCClient,
|
||||
}, nil, jsonrpc.WithClientHandler("", callback),
|
||||
jsonrpc.WithReconnFun(func() { RPCClient.RegisterLogic(id, port) }),
|
||||
)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to create client: %v", err)
|
||||
}
|
||||
|
||||
//if port != 0 { //注册logic
|
||||
defer RPCClient.RegisterLogic(id, port)
|
||||
|
||||
//}
|
||||
|
||||
closer = closer1
|
||||
|
||||
return &RPCClient
|
||||
}
|
||||
|
||||
// Setup RPCClient with reverse call handler
|
||||
var RPCClient struct {
|
||||
Kick func(uint32) error //踢人
|
||||
|
||||
RegisterLogic func(uint32, uint32) error
|
||||
|
||||
MatchJoinOrUpdate func(PVPMatchJoinPayload) error
|
||||
|
||||
MatchCancel func(uint32) error
|
||||
|
||||
// UserLogin func(int32, int32) error //用户登录事件
|
||||
// UserLogout func(int32, int32) error //用户登出事件
|
||||
}
|
||||
|
||||
@@ -1,295 +1,266 @@
|
||||
package socket
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"blazing/cool"
|
||||
"blazing/logic/service/common"
|
||||
"blazing/logic/service/player"
|
||||
"blazing/modules/config/service"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/gtime"
|
||||
"github.com/panjf2000/gnet/v2"
|
||||
"github.com/valyala/bytebufferpool"
|
||||
)
|
||||
|
||||
func (s *Server) Boot(serverid, port uint32) error {
|
||||
// go s.bootws()
|
||||
s.serverid = serverid
|
||||
s.port = port
|
||||
|
||||
err := gnet.Run(s, s.network+"://"+s.addr,
|
||||
gnet.WithMulticore(true),
|
||||
gnet.WithTicker(true),
|
||||
|
||||
// 其他调优配置↓
|
||||
gnet.WithTCPNoDelay(gnet.TCPNoDelay), // 禁用Nagle算法(降低延迟,适合小数据包场景)
|
||||
//gnet.WithReusePort(true), // 开启SO_REUSEPORT(多核下提升并发)
|
||||
//gnet.WithReadBufferCap(1024*64), // 读缓冲区64KB(根据业务调整,默认太小)
|
||||
// gnet.WithWriteBufferCap(1024*64), // 写缓冲区64KB
|
||||
|
||||
//gnet.WithLockOSThread(true), // 绑定goroutine到OS线程(减少上下文切换)
|
||||
)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) Stop() error {
|
||||
_ = s.eng.Stop(context.Background())
|
||||
s.workerPool.Release()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) OnClose(c gnet.Conn, err error) (action gnet.Action) {
|
||||
defer func() {
|
||||
if err := recover(); err != nil { // 恢复 panic,err 为 panic 错误值
|
||||
// 1. 打印错误信息
|
||||
if t, ok := c.Context().(*player.ClientData); ok {
|
||||
if t.Player != nil {
|
||||
if t.Player.Info != nil {
|
||||
cool.Logger.Error(context.TODO(), "OnClose 错误:", cool.Config.ServerInfo.OnlineID, t.Player.Info.UserID, err)
|
||||
t.Player.Service.Info.Save(*t.Player.Info)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
cool.Logger.Error(context.TODO(), "OnClose 错误:", cool.Config.ServerInfo.OnlineID, err)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}()
|
||||
// 识别 RST 导致的连接中断(错误信息含 "connection reset")
|
||||
// if err != nil && (strings.Contains(err.Error(), "connection reset") || strings.Contains(err.Error(), "reset by peer")) {
|
||||
// remoteIP := c.RemoteAddr().(*net.TCPAddr).IP.String()
|
||||
|
||||
// log.Printf("RST 攻击检测: 来源 %s, 累计攻击次数 %d", remoteIP)
|
||||
|
||||
// // 防护逻辑:临时封禁异常 IP(可扩展为 IP 黑名单)
|
||||
// // go s.tempBlockIP(remoteIP, 5*time.Minute)
|
||||
// }
|
||||
//fmt.Println(err, c.RemoteAddr().String(), "断开连接")
|
||||
atomic.AddInt64(&cool.Connected, -1)
|
||||
|
||||
//logging.Infof("conn[%v] disconnected", c.RemoteAddr().String())
|
||||
v, _ := c.Context().(*player.ClientData)
|
||||
|
||||
v.LF.Close()
|
||||
// v.LF.Close()
|
||||
//close(v.MsgChan)
|
||||
if v.Player != nil {
|
||||
v.Player.Save() //保存玩家数据
|
||||
|
||||
}
|
||||
|
||||
//}
|
||||
//关闭连接
|
||||
return
|
||||
}
|
||||
func (s *Server) OnTick() (delay time.Duration, action gnet.Action) {
|
||||
g.Log().Async().Info(context.Background(), gtime.Now().ISO8601(), "服务器ID", cool.Config.ServerInfo.OnlineID, "链接数", atomic.LoadInt64(&cool.Connected))
|
||||
if s.quit && atomic.LoadInt64(&cool.Connected) == 0 {
|
||||
//执行正常退出逻辑
|
||||
os.Exit(0)
|
||||
}
|
||||
return 30 * time.Second, gnet.None
|
||||
}
|
||||
func (s *Server) OnBoot(eng gnet.Engine) gnet.Action {
|
||||
s.eng = eng
|
||||
|
||||
service.NewServerService().SetServerID(s.serverid, s.port) //设置当前服务器端口
|
||||
return gnet.None
|
||||
}
|
||||
|
||||
func (s *Server) OnOpen(conn gnet.Conn) (out []byte, action gnet.Action) {
|
||||
if s.network != "tcp" {
|
||||
return nil, gnet.Close
|
||||
}
|
||||
|
||||
if conn.Context() == nil {
|
||||
conn.SetContext(player.NewClientData(conn)) //注入data
|
||||
}
|
||||
|
||||
atomic.AddInt64(&cool.Connected, 1)
|
||||
|
||||
return nil, gnet.None
|
||||
}
|
||||
|
||||
func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) {
|
||||
defer func() {
|
||||
if err := recover(); err != nil { // 恢复 panic,err 为 panic 错误值
|
||||
// 1. 打印错误信息
|
||||
if t, ok := c.Context().(*player.ClientData); ok {
|
||||
if t.Player != nil {
|
||||
if t.Player.Info != nil {
|
||||
cool.Logger.Error(context.TODO(), "OnTraffic 错误:", cool.Config.ServerInfo.OnlineID, t.Player.Info.UserID, err)
|
||||
t.Player.Service.Info.Save(*t.Player.Info)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}()
|
||||
|
||||
ws := c.Context().(*player.ClientData).Wsmsg
|
||||
if ws.Tcp { //升级失败时候防止缓冲区溢出
|
||||
return s.handleTCP(c)
|
||||
|
||||
}
|
||||
|
||||
tt, len1 := ws.ReadBufferBytes(c)
|
||||
if tt == gnet.Close {
|
||||
|
||||
return gnet.Close
|
||||
}
|
||||
|
||||
ok, action := ws.Upgrade(c)
|
||||
if action != gnet.None { //连接断开
|
||||
return action
|
||||
}
|
||||
if !ok { //升级失败,说明是tcp连接
|
||||
ws.Tcp = true
|
||||
|
||||
return s.handleTCP(c)
|
||||
|
||||
}
|
||||
// fmt.Println(ws.Buf.Bytes())
|
||||
c.Discard(len1)
|
||||
|
||||
messages, err := ws.Decode(c)
|
||||
if err != nil {
|
||||
return gnet.Close
|
||||
}
|
||||
if messages == nil {
|
||||
return
|
||||
}
|
||||
|
||||
for _, msg := range messages {
|
||||
|
||||
s.onevent(c, msg.Payload)
|
||||
//t.OnEvent(msg.Payload)
|
||||
}
|
||||
|
||||
return gnet.None
|
||||
}
|
||||
|
||||
const maxBodyLen = 10 * 1024 // 业务最大包体长度,按需调整
|
||||
func (s *Server) handleTCP(conn gnet.Conn) (action gnet.Action) {
|
||||
|
||||
conn.Context().(*player.ClientData).IsCrossDomain.Do(func() { //跨域检测
|
||||
handle(conn)
|
||||
})
|
||||
|
||||
// handle(c)
|
||||
// 先读取4字节的包长度
|
||||
lenBuf, err := conn.Peek(4)
|
||||
|
||||
if err != nil {
|
||||
if errors.Is(err, io.ErrShortBuffer) {
|
||||
return
|
||||
}
|
||||
return gnet.Close
|
||||
}
|
||||
|
||||
bodyLen := binary.BigEndian.Uint32(lenBuf)
|
||||
|
||||
if bodyLen > maxBodyLen {
|
||||
return gnet.Close
|
||||
}
|
||||
|
||||
if conn.InboundBuffered() < int(bodyLen) {
|
||||
return
|
||||
}
|
||||
// 提取包体
|
||||
body, err := conn.Next(int(bodyLen))
|
||||
if err != nil {
|
||||
if errors.Is(err, io.ErrShortBuffer) {
|
||||
return
|
||||
}
|
||||
return gnet.Close
|
||||
}
|
||||
|
||||
s.onevent(conn, body)
|
||||
|
||||
if conn.InboundBuffered() > 0 {
|
||||
if err := conn.Wake(nil); err != nil { // wake up the connection manually to avoid missing the leftover data
|
||||
|
||||
return gnet.Close
|
||||
}
|
||||
}
|
||||
return action
|
||||
|
||||
}
|
||||
|
||||
// CROSS_DOMAIN 定义跨域策略文件内容
|
||||
const CROSS_DOMAIN = "<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\x00"
|
||||
|
||||
// TEXT 定义跨域请求的文本格式
|
||||
const TEXT = "<policy-file-request/>\x00"
|
||||
|
||||
func handle(c gnet.Conn) {
|
||||
|
||||
// 读取数据并检查是否为跨域请求
|
||||
data, err := c.Peek(len(TEXT))
|
||||
if err != nil {
|
||||
log.Printf("Error reading cross-domain request: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
if string(data) == TEXT { //判断是否是跨域请求
|
||||
//log.Printf("Received cross-domain request from %s", c.RemoteAddr())
|
||||
// 处理跨域请求
|
||||
c.Write([]byte(CROSS_DOMAIN))
|
||||
c.Discard(len(TEXT))
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
//return
|
||||
}
|
||||
|
||||
func (s *Server) onevent(c gnet.Conn, v []byte) {
|
||||
if t, ok := c.Context().(*player.ClientData); ok {
|
||||
var header common.TomeeHeader
|
||||
// 解析Len(0-3字节)
|
||||
header.Len = binary.BigEndian.Uint32(v[0:4])
|
||||
// 解析Version(第4字节)
|
||||
//header.Version = v[4]
|
||||
// 解析CMD(5-8字节)
|
||||
header.CMD = binary.BigEndian.Uint32(v[5:9])
|
||||
// 解析UserID(9-12字节)
|
||||
header.UserID = binary.BigEndian.Uint32(v[9:13])
|
||||
// 解析Result(13-16字节)
|
||||
//header.Result = binary.BigEndian.Uint32(v[13:17])
|
||||
// 解析数据部分(17字节之后)
|
||||
// 数据部分:直接引用切片,避免 make
|
||||
if len(v) > 17 {
|
||||
header.Data = bytebufferpool.Get()
|
||||
header.Data.Write(v[17:])
|
||||
//copy(header.Data, v[17:]) // 核心修改:拷贝数据
|
||||
}
|
||||
//t.OnEvent(header)
|
||||
// t.LF.Push(header)
|
||||
s.workerPool.Submit(func() {
|
||||
t.LF.Producer().Write(header)
|
||||
// t.LF.Producer().Write(header)
|
||||
})
|
||||
|
||||
}
|
||||
}
|
||||
package socket
|
||||
|
||||
import (
|
||||
"blazing/common/socket/codec"
|
||||
"blazing/cool"
|
||||
"blazing/logic/service/player"
|
||||
"blazing/modules/config/service"
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"log"
|
||||
"os"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/os/gtime"
|
||||
"github.com/panjf2000/gnet/v2"
|
||||
)
|
||||
|
||||
const (
|
||||
minPacketLen = 17
|
||||
maxPacketLen = 10 * 1024
|
||||
)
|
||||
|
||||
func (s *Server) Boot(serverid, port uint32) error {
|
||||
// go s.bootws()
|
||||
s.serverid = serverid
|
||||
s.port = port
|
||||
|
||||
err := gnet.Run(s, s.network+"://"+s.addr,
|
||||
gnet.WithMulticore(true),
|
||||
gnet.WithTicker(true),
|
||||
|
||||
// 其他调优配置↓
|
||||
gnet.WithTCPNoDelay(gnet.TCPNoDelay), // 禁用Nagle算法(降低延迟,适合小数据包场景)
|
||||
//gnet.WithReusePort(true), // 开启SO_REUSEPORT(多核下提升并发)
|
||||
//gnet.WithReadBufferCap(1024*64), // 读缓冲区64KB(根据业务调整,默认太小)
|
||||
// gnet.WithWriteBufferCap(1024*64), // 写缓冲区64KB
|
||||
|
||||
//gnet.WithLockOSThread(true), // 绑定goroutine到OS线程(减少上下文切换)
|
||||
)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) Stop() error {
|
||||
_ = s.eng.Stop(context.Background())
|
||||
s.workerPool.Release()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) OnClose(c gnet.Conn, err error) (action gnet.Action) {
|
||||
defer func() {
|
||||
if err := recover(); err != nil { // 恢复 panic,err 为 panic 错误值
|
||||
if t, ok := c.Context().(*player.ClientData); ok {
|
||||
if t.Player != nil {
|
||||
if t.Player.Info != nil {
|
||||
cool.Logger.Error(context.TODO(), "OnClose 错误:", cool.Config.ServerInfo.OnlineID, t.Player.Info.UserID, err)
|
||||
go t.Player.SaveOnDisconnect()
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
cool.Logger.Error(context.TODO(), "OnClose 错误:", cool.Config.ServerInfo.OnlineID, err)
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
atomic.AddInt64(&cool.Connected, -1)
|
||||
|
||||
v, _ := c.Context().(*player.ClientData)
|
||||
if v != nil {
|
||||
v.Close()
|
||||
if v.Player != nil {
|
||||
v.Player.Save() //保存玩家数据
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (s *Server) OnTick() (delay time.Duration, action gnet.Action) {
|
||||
g.Log().Async().Info(context.Background(), gtime.Now().ISO8601(), "服务器ID", cool.Config.ServerInfo.OnlineID, "链接数", atomic.LoadInt64(&cool.Connected))
|
||||
if s.quit && atomic.LoadInt64(&cool.Connected) == 0 {
|
||||
os.Exit(0)
|
||||
}
|
||||
return 30 * time.Second, gnet.None
|
||||
}
|
||||
|
||||
func (s *Server) OnBoot(eng gnet.Engine) gnet.Action {
|
||||
s.eng = eng
|
||||
service.NewServerService().SetServerID(s.serverid, s.port)
|
||||
return gnet.None
|
||||
}
|
||||
|
||||
func (s *Server) OnOpen(conn gnet.Conn) (out []byte, action gnet.Action) {
|
||||
if s.network != "tcp" {
|
||||
return nil, gnet.Close
|
||||
}
|
||||
if conn.Context() == nil {
|
||||
conn.SetContext(player.NewClientData(conn))
|
||||
}
|
||||
atomic.AddInt64(&cool.Connected, 1)
|
||||
return nil, gnet.None
|
||||
}
|
||||
|
||||
func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) {
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
if t, ok := c.Context().(*player.ClientData); ok {
|
||||
if t.Player != nil && t.Player.Info != nil {
|
||||
cool.Logger.Error(context.TODO(), "OnTraffic 错误:", cool.Config.ServerInfo.OnlineID, t.Player.Info.UserID, err)
|
||||
t.Player.Service.Info.Save(*t.Player.Info)
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
client := c.Context().(*player.ClientData)
|
||||
if s.discorse && !client.IsCrossDomainChecked() {
|
||||
handled, ready, action := handle(c)
|
||||
if action != gnet.None {
|
||||
return action
|
||||
}
|
||||
if handled {
|
||||
client.MarkCrossDomainChecked()
|
||||
return gnet.None
|
||||
}
|
||||
if !ready {
|
||||
return gnet.None
|
||||
}
|
||||
client.MarkCrossDomainChecked()
|
||||
}
|
||||
|
||||
ws := client.Wsmsg
|
||||
if ws.Tcp {
|
||||
return s.handleTCP(c)
|
||||
}
|
||||
|
||||
readAction, inboundLen := ws.ReadBufferBytes(c)
|
||||
if readAction == gnet.Close {
|
||||
return gnet.Close
|
||||
}
|
||||
|
||||
state, action := ws.Upgrade(c)
|
||||
if action != gnet.None {
|
||||
return action
|
||||
}
|
||||
if state == player.UpgradeNeedMoreData {
|
||||
return gnet.None
|
||||
}
|
||||
if state == player.UpgradeUseTCP {
|
||||
return s.handleTCP(c)
|
||||
}
|
||||
|
||||
if inboundLen > 0 {
|
||||
if _, err := c.Discard(inboundLen); err != nil {
|
||||
return gnet.Close
|
||||
}
|
||||
ws.ResetInboundMirror()
|
||||
}
|
||||
|
||||
messages, err := ws.Decode(c)
|
||||
if err != nil {
|
||||
return gnet.Close
|
||||
}
|
||||
if messages == nil {
|
||||
return
|
||||
}
|
||||
|
||||
for _, msg := range messages {
|
||||
if !s.onevent(c, msg.Payload) {
|
||||
return gnet.Close
|
||||
}
|
||||
}
|
||||
return gnet.None
|
||||
}
|
||||
|
||||
func (s *Server) handleTCP(conn gnet.Conn) (action gnet.Action) {
|
||||
client := conn.Context().(*player.ClientData)
|
||||
if s.discorse && !client.IsCrossDomainChecked() {
|
||||
handled, ready, action := handle(conn)
|
||||
if action != gnet.None {
|
||||
return action
|
||||
}
|
||||
if !ready {
|
||||
return gnet.None
|
||||
}
|
||||
if handled {
|
||||
client.MarkCrossDomainChecked()
|
||||
return gnet.None
|
||||
}
|
||||
client.MarkCrossDomainChecked()
|
||||
}
|
||||
|
||||
body, err := s.codec.Decode(conn)
|
||||
if err != nil {
|
||||
if errors.Is(err, codec.ErrIncompletePacket) {
|
||||
return gnet.None
|
||||
}
|
||||
return gnet.Close
|
||||
}
|
||||
if !s.onevent(conn, body) {
|
||||
return gnet.Close
|
||||
}
|
||||
if conn.InboundBuffered() > 0 {
|
||||
if err := conn.Wake(nil); err != nil {
|
||||
return gnet.Close
|
||||
}
|
||||
}
|
||||
return action
|
||||
}
|
||||
|
||||
const CROSS_DOMAIN = "<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\x00"
|
||||
const TEXT = "<policy-file-request/>\x00"
|
||||
|
||||
func handle(c gnet.Conn) (handled bool, ready bool, action gnet.Action) {
|
||||
probeLen := c.InboundBuffered()
|
||||
if probeLen == 0 {
|
||||
return false, false, gnet.None
|
||||
}
|
||||
if probeLen > len(TEXT) {
|
||||
probeLen = len(TEXT)
|
||||
}
|
||||
|
||||
data, err := c.Peek(probeLen)
|
||||
if err != nil {
|
||||
log.Printf("Error reading cross-domain request: %v", err)
|
||||
return false, false, gnet.Close
|
||||
}
|
||||
if !bytes.Equal(data, []byte(TEXT[:probeLen])) {
|
||||
return false, true, gnet.None
|
||||
}
|
||||
if probeLen < len(TEXT) {
|
||||
return false, false, gnet.None
|
||||
}
|
||||
if _, err := c.Write([]byte(CROSS_DOMAIN)); err != nil {
|
||||
return false, true, gnet.Close
|
||||
}
|
||||
if _, err := c.Discard(len(TEXT)); err != nil {
|
||||
return false, true, gnet.Close
|
||||
}
|
||||
return true, true, gnet.None
|
||||
}
|
||||
|
||||
func (s *Server) onevent(c gnet.Conn, v []byte) bool {
|
||||
if !isValidPacket(v) {
|
||||
return false
|
||||
}
|
||||
if t, ok := c.Context().(*player.ClientData); ok {
|
||||
t.PushEvent(v, s.workerPool.Submit)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func isValidPacket(v []byte) bool {
|
||||
if len(v) < minPacketLen || len(v) > maxPacketLen {
|
||||
return false
|
||||
}
|
||||
return binary.BigEndian.Uint32(v[0:4]) == uint32(len(v))
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ func NewServer(options ...Option) *Server {
|
||||
// handler: handler.NewTomeeHandler(), //请求返回
|
||||
codec: codec.NewTomeeSocketCodec(), //默认解码器 len+pack
|
||||
workerPool: goroutine.Default(),
|
||||
bufferSize: 40960, //默认缓冲区大小
|
||||
bufferSize: 40960, //默认缓冲区大小
|
||||
multicore: true,
|
||||
//batchRead: 8,
|
||||
//discorse: true,
|
||||
|
||||
@@ -2,33 +2,4 @@ module github.com/zmexing/go-sensitive-word
|
||||
|
||||
go 1.20
|
||||
|
||||
require (
|
||||
|
||||
github.com/orcaman/concurrent-map/v2 v2.0.1
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/andybalholm/brotli v1.1.0 // indirect
|
||||
github.com/cloudflare/circl v1.3.7 // indirect
|
||||
github.com/go-logr/logr v1.4.2 // indirect
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
||||
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 // indirect
|
||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||
github.com/klauspost/compress v1.17.9 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.16.0 // indirect
|
||||
github.com/quic-go/qpack v0.4.0 // indirect
|
||||
github.com/quic-go/qtls-go1-20 v0.4.1 // indirect
|
||||
github.com/quic-go/quic-go v0.40.1 // indirect
|
||||
github.com/refraction-networking/utls v1.6.3 // indirect
|
||||
github.com/stretchr/testify v1.11.1 // indirect
|
||||
go.uber.org/mock v0.4.0 // indirect
|
||||
golang.org/x/crypto v0.31.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect
|
||||
golang.org/x/mod v0.17.0 // indirect
|
||||
golang.org/x/net v0.33.0 // indirect
|
||||
golang.org/x/sys v0.30.0 // indirect
|
||||
golang.org/x/text v0.22.0 // indirect
|
||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
|
||||
google.golang.org/protobuf v1.31.0 // indirect
|
||||
)
|
||||
require github.com/orcaman/concurrent-map/v2 v2.0.1
|
||||
|
||||
@@ -1,55 +1,2 @@
|
||||
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
|
||||
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
|
||||
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
|
||||
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
|
||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q=
|
||||
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
|
||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
|
||||
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
|
||||
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
||||
github.com/imroc/req/v3 v3.42.3 h1:ryPG2AiwouutAopwPxKpWKyxgvO8fB3hts4JXlh3PaE=
|
||||
github.com/imroc/req/v3 v3.42.3/go.mod h1:Axz9Y/a2b++w5/Jht3IhQsdBzrG1ftJd1OJhu21bB2Q=
|
||||
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
||||
github.com/onsi/ginkgo/v2 v2.16.0 h1:7q1w9frJDzninhXxjZd+Y/x54XNjG/UlRLIYPZafsPM=
|
||||
github.com/onsi/ginkgo/v2 v2.16.0/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs=
|
||||
github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
|
||||
github.com/orcaman/concurrent-map/v2 v2.0.1 h1:jOJ5Pg2w1oeB6PeDurIYf6k9PQ+aTITr/6lP/L/zp6c=
|
||||
github.com/orcaman/concurrent-map/v2 v2.0.1/go.mod h1:9Eq3TG2oBe5FirmYWQfYO5iH1q0Jv47PLaNK++uCdOM=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
||||
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
|
||||
github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs=
|
||||
github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
|
||||
github.com/quic-go/quic-go v0.40.1 h1:X3AGzUNFs0jVuO3esAGnTfvdgvL4fq655WaOi1snv1Q=
|
||||
github.com/quic-go/quic-go v0.40.1/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c=
|
||||
github.com/refraction-networking/utls v1.6.3 h1:MFOfRN35sSx6K5AZNIoESsBuBxS2LCgRilRIdHb6fDc=
|
||||
github.com/refraction-networking/utls v1.6.3/go.mod h1:yil9+7qSl+gBwJqztoQseO6Pr3h62pQoY1lXiNR/FPs=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
|
||||
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
|
||||
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
|
||||
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ=
|
||||
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=
|
||||
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
|
||||
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
|
||||
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
|
||||
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
|
||||
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
|
||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
|
||||
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
|
||||
183
docs/boss-script-hookaction-guide-2026-04-05.md
Normal file
183
docs/boss-script-hookaction-guide-2026-04-05.md
Normal file
@@ -0,0 +1,183 @@
|
||||
# Boss Script(HookAction)接入说明
|
||||
|
||||
日期:2026-04-05
|
||||
|
||||
## 1. 执行流程
|
||||
|
||||
1. 先执行战斗效果链 `HookAction()`
|
||||
2. 执行脚本 `hookAction(hookaction)`
|
||||
3. 用脚本返回值决定是否继续出手
|
||||
4. 脚本可直接调用 Go 绑定函数:`useSkill()`、`switchPet()`
|
||||
|
||||
## 2. JS 可调用的 Go 函数
|
||||
|
||||
1. `useSkill(skillId: number)`
|
||||
2. `switchPet(catchTime: number)`
|
||||
|
||||
## 3. `hookaction` 参数字段
|
||||
|
||||
基础字段:
|
||||
|
||||
1. `hookaction.hookaction: boolean`
|
||||
2. `hookaction.round: number`
|
||||
3. `hookaction.is_first: boolean`
|
||||
4. `hookaction.our: { pet_id, catch_time, hp, max_hp } | null`
|
||||
5. `hookaction.opp: { pet_id, catch_time, hp, max_hp } | null`
|
||||
6. `hookaction.skills: Array<{ skill_id, pp, can_use }>`
|
||||
|
||||
AttackValue 映射字段(重点):
|
||||
|
||||
1. `hookaction.our_attack`
|
||||
2. `hookaction.opp_attack`
|
||||
|
||||
结构:
|
||||
|
||||
```ts
|
||||
{
|
||||
skill_id: number;
|
||||
attack_time: number;
|
||||
is_critical: number;
|
||||
lost_hp: number;
|
||||
gain_hp: number;
|
||||
remain_hp: number;
|
||||
max_hp: number;
|
||||
state: number;
|
||||
offensive: number;
|
||||
status: number[]; // 对应 AttackValue.Status[20]
|
||||
prop: number[]; // 对应 AttackValue.Prop[6]
|
||||
}
|
||||
```
|
||||
|
||||
其中:
|
||||
|
||||
- `prop` 索引:`[攻, 防, 特攻, 特防, 速度, 命中]`
|
||||
- 对应值 `> 0` 代表强化,`< 0` 代表下降,`0` 代表无变化
|
||||
|
||||
返回值:
|
||||
|
||||
- `true`:继续行动
|
||||
- `false`:阻止行动
|
||||
- 不返回:默认回退到 `hookaction.hookaction`
|
||||
|
||||
## 4. 脚本示例
|
||||
|
||||
### 4.1 判断对方是否存在强化(你问的这个)
|
||||
|
||||
```js
|
||||
function hookAction(hookaction) {
|
||||
if (!hookaction.hookaction) return false;
|
||||
|
||||
var oppAtk = hookaction.opp_attack;
|
||||
var oppHasBuff = false;
|
||||
if (oppAtk && oppAtk.prop) {
|
||||
for (var i = 0; i < oppAtk.prop.length; i++) {
|
||||
if (oppAtk.prop[i] > 0) {
|
||||
oppHasBuff = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (oppHasBuff) {
|
||||
// 对方有强化时,放一个针对技能
|
||||
useSkill(5001);
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
### 4.2 判断对方是否有异常状态
|
||||
|
||||
```js
|
||||
function hookAction(hookaction) {
|
||||
if (!hookaction.hookaction) return false;
|
||||
|
||||
var oppAtk = hookaction.opp_attack;
|
||||
var hasStatus = false;
|
||||
if (oppAtk && oppAtk.status) {
|
||||
for (var i = 0; i < oppAtk.status.length; i++) {
|
||||
if (oppAtk.status[i] > 0) {
|
||||
hasStatus = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasStatus) {
|
||||
// 没有异常时尝试上异常
|
||||
useSkill(6002);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
## 5. Monaco 类型提示
|
||||
|
||||
```ts
|
||||
import * as monaco from "monaco-editor";
|
||||
|
||||
monaco.languages.typescript.javascriptDefaults.setCompilerOptions({
|
||||
allowNonTsExtensions: true,
|
||||
checkJs: true,
|
||||
target: monaco.languages.typescript.ScriptTarget.ES2020,
|
||||
});
|
||||
|
||||
monaco.languages.typescript.javascriptDefaults.addExtraLib(
|
||||
`
|
||||
interface BossHookPetContext {
|
||||
pet_id: number;
|
||||
catch_time: number;
|
||||
hp: number;
|
||||
max_hp: number;
|
||||
}
|
||||
|
||||
interface BossHookSkillContext {
|
||||
skill_id: number;
|
||||
pp: number;
|
||||
can_use: boolean;
|
||||
}
|
||||
|
||||
interface BossHookAttackContext {
|
||||
skill_id: number;
|
||||
attack_time: number;
|
||||
is_critical: number;
|
||||
lost_hp: number;
|
||||
gain_hp: number;
|
||||
remain_hp: number;
|
||||
max_hp: number;
|
||||
state: number;
|
||||
offensive: number;
|
||||
status: number[];
|
||||
prop: number[];
|
||||
}
|
||||
|
||||
interface BossHookActionContext {
|
||||
hookaction: boolean;
|
||||
round: number;
|
||||
is_first: boolean;
|
||||
our: BossHookPetContext | null;
|
||||
opp: BossHookPetContext | null;
|
||||
skills: BossHookSkillContext[];
|
||||
our_attack: BossHookAttackContext | null;
|
||||
opp_attack: BossHookAttackContext | null;
|
||||
}
|
||||
|
||||
declare function hookAction(hookaction: BossHookActionContext): boolean;
|
||||
declare function HookAction(hookaction: BossHookActionContext): boolean;
|
||||
declare function hookaction(hookaction: BossHookActionContext): boolean;
|
||||
|
||||
declare function useSkill(skillId: number): void;
|
||||
declare function switchPet(catchTime: number): void;
|
||||
`,
|
||||
"ts:boss-script.d.ts"
|
||||
);
|
||||
```
|
||||
|
||||
## 6. 后端代码
|
||||
|
||||
- 脚本执行器与函数绑定:`modules/config/model/boss_pet.go`
|
||||
- AI 出手转发与上下文构建:`logic/service/fight/input/ai.go`
|
||||
|
||||
@@ -1,450 +0,0 @@
|
||||
# Effect 重构会话总结(2026-03-28)
|
||||
|
||||
## 1. 本次会话完成内容
|
||||
|
||||
### 1.1 注释与说明统一
|
||||
- 已将 `logic/service/fight/effect` 下效果注释统一为:
|
||||
- `// Effect <id>: <desc>`
|
||||
- 说明来源:
|
||||
- `public/config/effectInfo.json`
|
||||
|
||||
### 1.2 结构整理与公共能力抽取
|
||||
- 新增并使用了子效果统一挂载 helper:
|
||||
- `addSubEffect(...)`
|
||||
- 已清理 `effect` 目录中的 `GenSub(...)` 直接调用残留,统一走 helper。
|
||||
|
||||
### 1.3 回合类基类(组合继承)已落地
|
||||
- 当前已引入的 base(位于 `logic/service/fight/effect/sub_effect_helper.go`):
|
||||
- `RoundEffectArg0Base`
|
||||
- `RoundEffectSideArg0Base`
|
||||
- `FixedDuration1Base`
|
||||
- `FixedDurationNeg1Base`
|
||||
- `FixedDuration2Base`
|
||||
- `RoundEffectArg1Base`
|
||||
- `RoundEffectSideArg1Base`
|
||||
- `RoundEffectSideArg0Minus1Base`
|
||||
- `RoundEffectSideArg0Minus1CanStackBase`
|
||||
|
||||
- 已有大量效果结构体改为嵌入上述 base,删除重复 `SetArgs` 模板代码。
|
||||
|
||||
### 1.4 编译状态
|
||||
- 已多轮执行并通过:
|
||||
- `go test ./logic/service/fight/effect`
|
||||
|
||||
### 1.5 本轮新增 effect 实现
|
||||
- 新增缺失效果实现:
|
||||
- `400` 若和对手属性相同,则技能威力翻倍
|
||||
- `480` `{0}`回合内自身所有攻击威力为两倍
|
||||
- `586` `{0}`回合内自己的属性攻击必中
|
||||
- `599` `{0}`回合内受到`{1}`伤害减少`{2}%`
|
||||
- `610` 遇到天敌时先制+`{0}`
|
||||
- `611` 下`{0}`回合自身使用攻击技能则附加`{1}`点固定伤害
|
||||
- `613` `{0}`回合内自身令对手使用的`{1}`系攻击技能无效
|
||||
- `573` `{0}`回合内若自身能力提升状态被消除或吸取则`{1}`%使对手`{2}``{3}`回合
|
||||
- `587` `{0}`回合内若被对手击败则对手损失`{1}`点体力,造成致命伤害时,对手剩余1点体力
|
||||
- `591` 造成伤害大于`{0}`,则下`{1}`回合自己所有直接攻击先制+`{2}`
|
||||
- `592` 下`{0}`回合每回合使用攻击技能`{1}`%令对手`{2}`
|
||||
- `594` 造成的伤害低于`{0}`时`{1}`%令对手`{2}`
|
||||
- `596` 技能使用成功时,`{0}`%给予对手冻伤、中毒、烧伤中任意一种异常状态
|
||||
- `597` `{0}`回合内每回合使用技能吸取对手最大体力的1/`{1}`
|
||||
- `598` `{0}`%恢复自己所有技能PP值`{1}`点
|
||||
- `627` 对手处于能力提升状态时附加其`{0}`值`{1}`%的百分比伤害
|
||||
- `628` 若对手处于能力下降状态则造成伤害的`{0}`%恢复体力
|
||||
- `629` 消除`{0}`状态,消除成功下回合自身先制+`{1}`
|
||||
- `630` `{0}`回合内`{1}`状态被消除,则有`{2}`%概率使对手`{3}`
|
||||
- `631` 消除`{0}`状态,消除成功下回合造成伤害提升`{1}`%
|
||||
- `632` 造成伤害`{0}``{1}`,则下`{2}`回合必定暴击
|
||||
- `633` 造成伤害`{0}``{1}`,则造成伤害的`{2}`%恢复体力
|
||||
- `634` 若当前体力`{0}`对手,则造成伤害的`{1}`%恢复体力
|
||||
- `635` 吸收对手能力上升状态,吸收成功,下回合先制+`{0}`
|
||||
- `636` 消除`{0}`状态,消除成功则令对手`{1}`
|
||||
- `637` 若对手处于异常状态,则对手`{0}``{1}`
|
||||
- `638` 若对手`{0}`,技能威力提升`{1}`%
|
||||
- `639` 造成伤害`{0}``{1}`,则下`{2}`回合所有技能附带`{3}`点固定伤害
|
||||
- `640` 命中后`{0}`%使对手`{1}``{2}`回合,遇到天敌概率翻倍
|
||||
- `641` 命中后`{0}`%使对手进入流血状态
|
||||
- `401` 若和对手属性相同,则技能威力翻倍
|
||||
- `585` 技能使用成功时,`{0}`
|
||||
- `589` 复制对手`{0}`的能力提升状态
|
||||
- `590` 使对手`{0}`,`{6}`%弱化效果翻倍
|
||||
- `593` 附加`{0}`的`{1}`值的`{2}`%的百分比伤害
|
||||
- `595` 技能使用成功时,`{0}`%使对手`{1}`,若没有触发,则对手`{2}`
|
||||
|
||||
- 已同步更新:
|
||||
- `logic/service/fight/effect/effect_info_map.go`
|
||||
|
||||
### 1.6 本轮新增文件
|
||||
- `logic/service/fight/effect/400_480_586_599_610_611_613.go`
|
||||
- `logic/service/fight/effect/573_587_591_592_594_596_597_598.go`
|
||||
- `logic/service/fight/effect/627_631.go`
|
||||
- `logic/service/fight/effect/632_636.go`
|
||||
- `logic/service/fight/effect/637_641.go`
|
||||
- `logic/service/fight/effect/effect_info_map.go`
|
||||
|
||||
### 1.7 本轮验证
|
||||
- 已执行:
|
||||
- `go test ./service/fight/effect`
|
||||
- 结果:
|
||||
- 通过
|
||||
|
||||
### 1.8 本轮结论
|
||||
- 当前这轮更适合按“低风险、可复用现有模式”的 effect 小批次推进,而不是一次性追求 `effectInfo.json` 全量覆盖。
|
||||
- 现有 `effect` 目录里已经有不少“共享实现 + 批量注册”的写法,后续判断缺失项时不能只靠 grep `InitEffect(...)`。
|
||||
- 文档第 3 节里的“未实现”列表目前仍是历史扫描快照,只能作为候选列表,不能直接当最终事实使用。
|
||||
|
||||
---
|
||||
|
||||
## 2. 当前仍保留自定义 `SetArgs` 的效果(建议下一轮重点)
|
||||
|
||||
以下属于“非纯模板”或“仍待抽象”的 SetArgs:
|
||||
|
||||
- `Effect570`(`570.go`)
|
||||
- `Effect123`(`effect_119_123.go`)
|
||||
- `Effect41`(`effect_41.go`)
|
||||
- `Effect42`(`effect_42.go`)
|
||||
- `Effect46`(`effect_46.go`)
|
||||
- `Effect47`(`effect_47.go`)
|
||||
- `Effect48`(`effect_48.go`)
|
||||
- `Effect60`(`effect_60.go`)
|
||||
- `EffectPropSyncReverse`(`effect_attr.go`)
|
||||
- `SelfKill`(`selfkill.go`)
|
||||
|
||||
建议分三类继续抽 base:
|
||||
- 随机回合/随机次数类(如 41、42)
|
||||
- 次数型常驻类(如 46、47、48、SelfKill、570)
|
||||
- “SetArgs + 额外上下文初始化”类(如 Effect123、EffectPropSyncReverse)
|
||||
|
||||
---
|
||||
|
||||
## 3. 未实现(或疑似未实现)效果清单
|
||||
|
||||
### 3.0 从 `effectInfo.json` 提取的“未实现”总览(自动扫描)
|
||||
- JSON 配置总效果数:`2112`
|
||||
- 代码已注册效果数(Skill):`338`
|
||||
- JSON 中存在但代码未注册:`1779`
|
||||
- 代码中注册但 JSON 无对应条目:`5`(`21, 31, 41, 42, 174`)
|
||||
|
||||
说明:
|
||||
- 这个口径是“配置覆盖率”,不是“bug 数量”。
|
||||
- 其中大量属于未来版本/未迁移内容,不建议一次性全补;建议按战斗系统实际启用范围分批实现。
|
||||
- 以下列表为上一轮扫描快照,未随本轮新增实现实时回算。
|
||||
- 此外,扫描脚本若未把“共享实现中的批量注册”统计进去,也会把已实现效果误判成缺失。
|
||||
|
||||
JSON 中存在但代码未注册(示例前 60 项):
|
||||
- 2, 10, 11, 12, 14, 15, 16, 17, 22, 30
|
||||
- 38, 40, 45, 51, 55, 56, 61, 64, 66, 67
|
||||
- 70, 78, 84, 86, 92, 94, 96, 97, 99, 102
|
||||
- 103, 104, 106, 108, 109, 114, 118, 132, 133, 139
|
||||
- 141, 158, 162, 167, 168, 185, 401, 421, 431, 529
|
||||
- 543, 554, 569, 573, 581, 582, 583, 584, 585, 586
|
||||
|
||||
### 3.1 明确标记未实装
|
||||
- 文件存在明确标记:
|
||||
- `logic/service/fight/effect/529.go未实装`
|
||||
|
||||
### 3.2 已注册但缺少同名 `Effect{id}` 结构体(需人工确认是否由合并实现覆盖)
|
||||
- `53`
|
||||
- `74`
|
||||
- `75`
|
||||
- `186`
|
||||
- `402`
|
||||
- `433`
|
||||
- `446`
|
||||
- `451`
|
||||
- `463`
|
||||
- `497`
|
||||
- `564`
|
||||
- `588`
|
||||
|
||||
说明:
|
||||
- 这类通常可能是“多个 id 共用一个结构体实现”或“命名与 id 不一致”,需要逐个确认是否真正缺失行为。
|
||||
|
||||
### 3.3 疑似未实现(扫描规则:存在 `Effect{id}` 类型,但没有核心战斗 Hook)
|
||||
- `519`(`effect_519.go`)
|
||||
- `532`(`532.go`)
|
||||
- `552`(`552.go`)
|
||||
- `560`(`560.go`)
|
||||
- `576`(`576.go`)
|
||||
|
||||
说明:
|
||||
- 这批是“高优先级人工复查项”,不一定真的没实现,可能通过组合/间接机制生效。
|
||||
|
||||
### 3.4 当前更可信的“下一批候选”
|
||||
这一组是结合本轮人工核对后,仍然值得优先继续补的缺失 effect 候选:
|
||||
|
||||
- 当前文档 3.4 中这批候选已在本轮补齐。
|
||||
|
||||
说明:
|
||||
- 这批大多是 58x/59x 段的新效果,和当前目录中已有实现重叠较少。
|
||||
- 相比继续深挖旧扫描误差,这批更适合直接新增文件推进。
|
||||
|
||||
---
|
||||
|
||||
## 4. 下次继续的建议顺序
|
||||
|
||||
建议严格按下面顺序继续,不要重新从全量扫描开始:
|
||||
|
||||
1. 先复核文档 3.4 里的候选项是否仍未实现。
|
||||
2. 优先补“单次触发、命中附加、固定伤害、恢复、概率状态”这类低风险逻辑。
|
||||
3. 再处理“复制对手状态 / 多分支条件 / 触发链式子效果”的 58x/59x 复杂效果。
|
||||
4. 最后再回头处理文档 2 中那些仍保留自定义 `SetArgs` 的结构整理。
|
||||
|
||||
本轮更推荐的下一批实现顺序:
|
||||
|
||||
- 第一组:`529 / 552 / 560 / 576`
|
||||
- 第二组:`10 / 11 / 12 / 14 / 15 / 16`
|
||||
- 第三组:`94 / 99 / 103 / 114`
|
||||
|
||||
---
|
||||
|
||||
## 5. 下一次继续让我实现时可直接复制的指令
|
||||
|
||||
可直接用下面这句发起:
|
||||
|
||||
`继续处理 effect,按 docs/effect-refactor-summary-2026-03-28.md 的 3.3 和 4 执行:先复核 529/552/560/576,再补低风险状态附加类 10/11/12/14/15/16,每实现一批就更新同一文档和 effect_info_map.go,并跑 go test ./service/fight/effect。`
|
||||
|
||||
如果你希望按 JSON 覆盖率推进,可用这句:
|
||||
|
||||
`继续处理 effect,按 docs/effect-refactor-summary-2026-03-28.md 的 3.0 从低风险效果开始补实现:先补状态附加类(10/11/12/14/15/16/94/99/103/114),每实现一批就更新文档中的“已实现列表”和“剩余列表”。`
|
||||
|
||||
---
|
||||
|
||||
## 6. 扫描口径说明(供后续排查)
|
||||
|
||||
- 已注册效果 ID 扫描来源:
|
||||
- `InitEffect(input.EffectType.Skill, <id>, ...)`
|
||||
- `initskill(<id>, ...)`
|
||||
- 但这还不够,后续扫描必须额外统计这些“共享实现/批量注册”文件:
|
||||
- `sterStatusEffects.go`
|
||||
- `effect_power_doblue.go`
|
||||
- `EffectAttackMiss.go`
|
||||
- `EffectPhysicalAttackAddStatus.go`
|
||||
- `EffectDefeatTrigger.go`
|
||||
- `effect_attr.go`
|
||||
- `effect_EffectConditionalAddDamage.go`
|
||||
- `effect_74_75.go`
|
||||
- `effect_104_109.go`
|
||||
- `Effect{id}` 结构体与方法扫描来源:
|
||||
- `logic/service/fight/effect/*.go`
|
||||
- “疑似未实现”判断是启发式,不是最终结论,仍需代码级确认。
|
||||
|
||||
---
|
||||
|
||||
## 7. 这次改动涉及的关键文件
|
||||
|
||||
- `public/config/effectInfo.json`
|
||||
- `logic/service/fight/effect/400_480_586_599_610_611_613.go`
|
||||
- `logic/service/fight/effect/573_587_591_592_594_596_597_598.go`
|
||||
- `logic/service/fight/effect/effect_info_map.go`
|
||||
- `logic/service/fight/effect/sub_effect_helper.go`
|
||||
- `docs/effect-refactor-summary-2026-03-28.md`
|
||||
|
||||
---
|
||||
|
||||
## 8. 2026-03-29 增量记录
|
||||
|
||||
### 8.1 本轮补齐的 effect
|
||||
- `663` `{0}回合内若对手使用攻击技能则{1}%使对手{2}`
|
||||
- `664` 若先出手则当回合对手无法造成攻击伤害
|
||||
- `665` 造成的伤害低于`{0}`则`{1}`回合内自身受到的伤害减少`{2}`
|
||||
- `666` 使自身下回合攻击必定先手、必定暴击
|
||||
- `667` 自身为满体力时`{0}{1}`
|
||||
|
||||
### 8.2 实现口径
|
||||
- `663` 复用与 `614` 同类的“对手使用攻击技能时触发”路径,在 `Skill_Use_ex()` 中按概率给对手附加状态。
|
||||
- `664` 复用 `170` 的先手免伤模式,在 `DamageLockEx()` 中将当回合受到的攻击伤害归零。
|
||||
- `665` 按技能实参 `250 3 100` 的实际使用方式,落为“低于阈值则给自己挂 3 回合 100 点固定减伤子效果”,不是百分比减伤。
|
||||
- `666` 落为仅对下回合攻击技能生效的先手与暴击保证:`ComparePre()` 强制先手,`ActionStart()` 强制暴击。
|
||||
- `667` 按配置说明“自身攻击+a、防御+b、特攻+c、特防+d、速度+e、命中+f”处理,仅在满体力时给自己附加前 6 项能力等级。
|
||||
|
||||
### 8.3 本轮新增文件
|
||||
- `logic/service/fight/effect/663_667.go`
|
||||
|
||||
### 8.4 本轮同步更新
|
||||
- `logic/service/fight/effect/effect_info_map.go`
|
||||
- `docs/effect-unimplemented-tasks/task-013-effects-663-667.md` 已完成,可从任务目录移除
|
||||
|
||||
### 8.5 本轮验证
|
||||
- `cd /workspace/logic && go test ./service/fight/effect`
|
||||
- `cd /workspace/logic && go build ./...`
|
||||
|
||||
---
|
||||
|
||||
## 9. 2026-03-29 增量记录(二)
|
||||
|
||||
### 9.1 本轮补齐的 effect
|
||||
- `668` 若对手处于能力提升状态则先制额外+1
|
||||
- `669` 当回合击败对手则下回合自身攻击先制+1
|
||||
- `670` `{0}`回合,每回合附加`{1}`的`{2}`值的`{3}%`的百分比伤害
|
||||
- `671` 若对手处于异常状态则恢复造成伤害的`{0}%`的体力
|
||||
- `672` 当回合击败对手则恢复自身全部体力
|
||||
|
||||
### 9.2 实现口径
|
||||
- `668` 复用 `539` 的条件先制模式,在 `ComparePre()` 中于对手存在能力提升状态时直接给当前技能先制+1。
|
||||
- `669` 按“当回合击败后,为下回合攻击技能生效”处理:在 `SwitchOut()` 中标记击败成立,下一回合 `ComparePre()` 仅对攻击技能追加先制+1。
|
||||
- `670` 参照 `419` 与 `593` 的组合语义,实现为回合类附加伤害:效果持续期间每次使用技能时,附加一次基于指定目标属性值的固定伤害。
|
||||
- `671` 复用 `687` 的伤害回血模式,但条件改为“对手处于任意异常状态”。
|
||||
- `672` 按击败即时触发处理:在对手因本次攻击退场时,立刻将自身体力回复至满值。
|
||||
|
||||
### 9.3 本轮新增文件
|
||||
- `logic/service/fight/effect/668_672.go`
|
||||
|
||||
### 9.4 本轮同步更新
|
||||
- `logic/service/fight/effect/effect_info_map.go`
|
||||
- `docs/effect-unimplemented-tasks/task-014-effects-668-672.md` 已完成,可从任务目录移除
|
||||
|
||||
### 9.5 本轮验证
|
||||
- `cd /workspace/logic && go test ./service/fight/effect`
|
||||
- `cd /workspace/logic && go build ./...`
|
||||
|
||||
---
|
||||
|
||||
## 10. 2026-03-29 增量记录(三)
|
||||
|
||||
### 10.1 本轮补齐的 effect
|
||||
- `642` `{0}回合内若对手攻击技能命中则己方在场精灵{1}%做出{2}`
|
||||
- `643` `{0}%概率使对手{1}回合内{2}能力每回合变化{3}`
|
||||
- `644` 当回合未击败对手,则减少对手当前体力`1/{0}`
|
||||
- `645` 体力低于`1/{0}`时威力`{1}`倍
|
||||
- `646` 体力高于对手时,此技能命中后 100% 使对手能力下降
|
||||
|
||||
### 10.2 实现口径
|
||||
- `642` 按 `moves.json` 中 `1000642` 的说明实现反击档位映射:`0-5` 分别对应 `50/100/150/200/250/300` 点固定伤害;挂在 defender 侧 `Skill_Use_ex()`,仅对命中的攻击技能生效。
|
||||
- `643` 按真实技能实参 `55 2 1 -1` 这类布局处理为“命中后按概率给对手挂回合子效果”,子效果在 `TurnEnd()` 对指定能力执行一次 `SetProp`。
|
||||
- `644` 复用 `579` 的“未击败对手”判定时机,落在 `Action_end()`,按对手当前体力结算 `1/n` 的百分比伤害。
|
||||
- `645` 复用 `37` 的低血线威力倍率模式,在 `SkillHit()` 中按当前体力是否低于最大体力 `1/n` 改写技能威力。
|
||||
- `646` 未按任务文档里的占位 `param` 硬编码;改按实际技能配置的 6 段能力变化参数通用处理,仅在自身体力高于对手且本次技能命中后生效。
|
||||
|
||||
### 10.3 本轮新增文件
|
||||
- `logic/service/fight/effect/642_646.go`
|
||||
|
||||
### 10.4 本轮同步更新
|
||||
- `logic/service/fight/effect/effect_info_map.go`
|
||||
- `docs/effect-unimplemented-tasks/task-009-effects-642-646.md` 已完成,可从任务目录移除
|
||||
|
||||
---
|
||||
|
||||
## 11. 2026-03-29 增量记录(四)
|
||||
|
||||
### 11.1 本轮补齐的 effect
|
||||
- `769` 若对手不处于异常状态则造成的攻击伤害额外提升`{0}%`
|
||||
- `770` 若对手处于异常状态,则恢复自身全部体力
|
||||
- `771` `{0}`回合内每次使用攻击技能都有`{1}%`概率使对手进入任意一种异常状态
|
||||
- `772` `{0}`回合内若对手使用攻击技能则有`{1}%`概率随机进入烧伤、冻伤、中毒、麻痹、害怕、睡眠中的一种异常状态
|
||||
- `773` 若自身体力低于对手则与对手互换体力
|
||||
|
||||
### 11.2 实现口径
|
||||
- `769` 复用 `1103` 的条件增伤写法,在 `SkillHit()` 中仅对攻击技能生效,并在对手不存在任意异常状态时追加威力百分比。
|
||||
- `770` 按技能结算后触发处理,落在 `Skill_Use()`,满足“对手处于异常状态”时直接回复自身满体力。
|
||||
- `771` 作为回合类自身增益实现,持续期间在 `OnSkill()` 针对每次攻击技能按概率给对手附加一项随机异常状态。
|
||||
- `772` 参照 `559` 的 defender 侧监听时机,落在 `Skill_Use_ex()`;对手使用攻击技能时按概率附加六选一异常状态。
|
||||
- `773` 复用 `529` 的直接改写当前体力思路,在满足“自身体力低于对手”时交换双方当前体力,并分别按各自最大体力上限截断。
|
||||
|
||||
### 11.3 本轮新增文件
|
||||
- `logic/service/fight/effect/769_773.go`
|
||||
|
||||
### 11.4 本轮同步更新
|
||||
- `logic/service/fight/effect/effect_info_map.go`
|
||||
- `docs/effect-unimplemented-tasks/task-032-effects-769-773.md` 已完成,可从任务目录移除
|
||||
|
||||
---
|
||||
|
||||
## 12. 2026-03-29 增量记录(五)
|
||||
|
||||
### 12.1 本轮补齐的 effect
|
||||
- `1498` 随机附加烧伤、冻伤、失明、失神中的 `{0}` 种异常状态,未触发则自身下 `{1}` 回合造成的伤害提升 `{2}%`
|
||||
- `1499` 体力低于最大体力的 `1/3` 时先制 `+3`
|
||||
- `1500` 1 回合做 `{0}-{1}` 次攻击,自身处于护盾状态下连击上限为 `{2}`
|
||||
- `1501` 命中后为对手种下一颗黑暗之种
|
||||
- `1502` 对手身上存在黑暗之种时先制 `+1`
|
||||
|
||||
### 12.2 实现口径
|
||||
- `1498` 复用 `1111` 的“未触发则挂自身增伤子效果”模式;随机状态池按任务文案落为烧伤、冻伤、失明、失神,若本次一个状态都未成功挂上,则给自身添加持续 `{1}` 回合的增伤子效果。
|
||||
- `1499` 复用现有条件先制写法,在 `ComparePre()` 中按当前体力是否低于最大体力 `1/3` 直接修改当前技能优先级。
|
||||
- `1500` 参照仓库现有多段技能处理口径,不做逐段攻击,而是在 `Damage_Mul()` 中按随机连击次数折算红伤倍率;若自身当前存在护盾,则用 `{2}` 约束连击上限。
|
||||
- `1501` 作为挂在 defender 身上的持久子效果实现:命中后附加“黑暗之种”,前 4 次 `TurnEnd()` 随机扣 1 个技能 PP,成熟后每回合所有技能 PP `-1`;下场后清除。
|
||||
- `1502` 在 `ComparePre()` 中检查对手是否持有 `1501` 的子效果,存在时当前技能先制 `+1`。
|
||||
|
||||
### 12.3 模型假设
|
||||
- 仓库当前未注册“失神”状态,本轮按状态 ID `29` 追加了一个最小可用实现,行为复用 `StatusCannotAct`。
|
||||
- `1500` 仍受当前战斗模型限制,只能按总连击数折算伤害,不能表现逐段命中、逐段触发的细粒度行为。
|
||||
|
||||
### 12.4 本轮新增文件
|
||||
- `logic/service/fight/effect/1498_1502.go`
|
||||
|
||||
### 12.5 本轮同步更新
|
||||
- `logic/service/fight/effect/effect_info_map.go`
|
||||
- `docs/effect-unimplemented-tasks/README.md`
|
||||
- `docs/effect-unimplemented-tasks/task-177-effects-1498-1502.md` 已完成,可从任务目录移除
|
||||
|
||||
### 12.6 本轮验证
|
||||
- `cd /workspace/logic && go test ./service/fight/effect`
|
||||
- `cd /workspace/logic && go build ./...`
|
||||
|
||||
---
|
||||
|
||||
## 13. 2026-03-29 增量记录(六)
|
||||
|
||||
### 13.1 本轮补齐的 effect
|
||||
- `1503` 清除对手身上的黑暗之种,清除成功则令对手随机受到 `1-500` 点固定伤害
|
||||
- `1504` `40%` 令对手诅咒,若对手身上存在黑暗之种则概率翻倍
|
||||
- `1505` 黑暗之种成长期时附加 `200` 点固定伤害,黑暗之种长大后固定伤害翻倍
|
||||
- `1506` 若对手不是龙系精灵则恢复自身 `{0}` 点体力
|
||||
- `1507` `{0}` 回合内自身受到攻击则令对手随机进入 `{1}` 种异常状态,未触发则消除对手回合类效果
|
||||
|
||||
### 13.2 实现口径
|
||||
- `1503` 复用本轮新增的黑暗之种清理 helper,在 `Skill_Use()` 中清除对手持有的 `1501` 子效果;仅当成功清除时追加一次 `1-500` 的随机固定伤害。
|
||||
- `1504` 按任务文案直接实现为基础 `40%` 概率,若对手当前仍持有黑暗之种则翻倍到 `80%`;仓库尚无诅咒状态注册,本轮补了一个最小可用的状态壳以承接后续联动。
|
||||
- `1505` 读取 `1501` 子效果当前成长阶段:成长期附加 `200` 固定伤害,成熟后附加 `400` 固定伤害;若对手不存在黑暗之种则不触发。
|
||||
- `1506` 使用宠物当前系别组合判断是否包含龙系;仅在对手主属性、副属性均不为龙系时恢复自身体力。
|
||||
- `1507` 复用 `1228` 的 defender 侧监听模式,落在 `Skill_Use_ex()`:对手使用攻击技能命中本体时,随机附加若干异常状态;若整段持续时间内一次都未成功触发,则在最后一回合结束时清除对手回合类效果。
|
||||
|
||||
### 13.3 模型假设
|
||||
- 仓库当前缺少“诅咒”状态实现,本轮按状态 ID `23` 注册了一个最小 `BaseStatus` 版本,只提供状态存在性与常规下场清理,不额外附带持续结算逻辑。
|
||||
- `1505` 的“黑暗之种成长期/长大后”判断直接复用 `1501` 子效果内部阶段计数:前 4 次回合结束视为成长期,第 5 次起视为成熟。
|
||||
|
||||
### 13.4 本轮新增文件
|
||||
- `logic/service/fight/effect/1503_1507.go`
|
||||
|
||||
### 13.5 本轮同步更新
|
||||
- `logic/service/fight/effect/effect_info_map.go`
|
||||
- `docs/effect-unimplemented-tasks/README.md`
|
||||
- `docs/effect-unimplemented-tasks/task-178-effects-1503-1507.md` 已完成,可从任务目录移除
|
||||
|
||||
### 13.6 本轮验证
|
||||
- `cd /workspace/logic && go test ./service/fight/effect`
|
||||
- `cd /workspace/logic && go build ./...`
|
||||
|
||||
---
|
||||
|
||||
## 14. 2026-03-30 增量记录(一)
|
||||
|
||||
### 14.1 本轮补齐的 effect
|
||||
- `1508` 先出手时无视攻击免疫效果
|
||||
- `1509` 令对手全属性-`{0}` 且随机 `{1}` 个技能 PP 值归零,技能无效时消耗自身全部体力并令对手全属性-1,然后对手下 3 次使用技能消耗的 PP 值为 3 倍
|
||||
- `1510` `{0}` 回合内对手主动切换精灵则登场精灵 `{1}%` 随机进入 `{2}` 种异常状态
|
||||
- `1511` 先出手时免疫当回合受到的攻击伤害,若对手为自身天敌则免疫并反弹给对手造成伤害值 `{0}%` 的百分比伤害
|
||||
- `1512` 集结天幕四龙之神力,使自身下 2 回合先制+3且攻击必定命中、必定致命
|
||||
|
||||
### 14.2 实现口径
|
||||
- `1508` 采用仓库现有模型下的局部支持方案:若自身本次先出手且使用攻击技能,则在伤害结算前临时屏蔽若干常见“攻击伤害清零类” immunity effect,并在技能结算结束后恢复。
|
||||
- `1509` 正常命中时直接令对手全属性下降并随机清空若干技能 PP;若本次技能实体存在但 `AttackTime == 0`,则按“技能无效”分支处理:自损全部体力、令对手全属性-1,并给对手挂 3 次 PP 三倍消耗子效果。
|
||||
- `1510` 复用 `1562` 的“主动切换后对登场精灵生效”模式:效果挂在对手侧,仅在对手主动切换下场时置 pending,登场后按概率随机附加若干异常状态。
|
||||
- `1511` 复用 `170/1011` 的免疫伤害写法,落在 `DamageLockEx()`;若自身先出手则直接免疫本回合受到的红伤,若对手同时为自身天敌,则按原伤害值 `{0}%` 追加一次百分比伤害反弹。
|
||||
- `1512` 作为持续 2 回合的自身子效果实现,在 `ComparePre()` 中固定追加先制 `+3`,并在 `ActionStart()` 中对攻击技能同时赋予必中与必定致命。
|
||||
|
||||
### 14.3 模型假设
|
||||
- `1508` 当前没有通用“无视攻击免疫”标记位,本轮仅覆盖仓库内已识别的常见攻击免疫 effect:`170/525/570/850/1011/1511`。对其他未来新增或语义不同的 defender 侧免疫实现,不保证自动生效。
|
||||
- `1509` 的“技能无效时”按仓库现有口径解释为“技能实体存在,但本次结算后 `AttackTime == 0`”,不把被控未出手、无 PP 无法释放这类情况算作技能无效。
|
||||
|
||||
### 14.4 本轮新增文件
|
||||
- `logic/service/fight/effect/1508_1512.go`
|
||||
|
||||
### 14.5 本轮同步更新
|
||||
- `logic/service/fight/effect/effect_info_map.go`
|
||||
- `docs/effect-unimplemented-tasks/README.md`
|
||||
- `docs/effect-unimplemented-tasks/task-179-effects-1508-1512.md` 已完成,可从任务目录移除
|
||||
|
||||
### 14.6 本轮验证
|
||||
- `cd /workspace/logic && go test ./service/fight/effect`
|
||||
- `cd /workspace/logic && go build ./...`
|
||||
@@ -1,348 +0,0 @@
|
||||
# effectInfo.json 未实现 effect 任务拆分
|
||||
|
||||
## 口径
|
||||
|
||||
- 来源配置:`/workspace/public/config/effectInfo.json` 的 `root.Effect`。
|
||||
- 已实现判定:静态扫描 `logic/service/fight/effect` 中已注册的技能 effect ID,覆盖直接注册和已确认的共享/批量注册。
|
||||
- 额外计入未实现:`201`、`445` 这类已注册但当前仅占位、未落核心逻辑的 effect。
|
||||
- 本次生成时间:2026-03-28 UTC。
|
||||
|
||||
## 统计
|
||||
|
||||
- effectInfo.json effect 总数:`2112`
|
||||
- 当前判定已实现:`411`
|
||||
- 当前判定未实现:`1706`
|
||||
- 任务文档数:`342`(每 5 个 effect 一组,最后一组不足 5 个)
|
||||
|
||||
## 任务清单
|
||||
|
||||
- `001`: `17-600` -> `task-001-effects-17-600.md`
|
||||
- `002`: `601-605` -> `task-002-effects-601-605.md`
|
||||
- `003`: `606-614` -> `task-003-effects-606-614.md`
|
||||
- `004`: `615-619` -> `task-004-effects-615-619.md`
|
||||
- `005`: `621-625` -> `task-005-effects-621-625.md`
|
||||
- `006`: `627-631` -> `task-006-effects-627-631.md`
|
||||
- `007`: `632-636` -> `task-007-effects-632-636.md`
|
||||
- `008`: `637-641` -> `task-008-effects-637-641.md`
|
||||
- `009`: `642-646` -> `task-009-effects-642-646.md`
|
||||
- `010`: `648-652` -> `task-010-effects-648-652.md`
|
||||
- `011`: `653-657` -> `task-011-effects-653-657.md`
|
||||
- `012`: `658-662` -> `task-012-effects-658-662.md`
|
||||
- `013`: `663-667` -> `task-013-effects-663-667.md`
|
||||
- `014`: `668-672` -> `task-014-effects-668-672.md`
|
||||
- `015`: `673-677` -> `task-015-effects-673-677.md`
|
||||
- `016`: `678-693` -> `task-016-effects-678-693.md`
|
||||
- `017`: `694-698` -> `task-017-effects-694-698.md`
|
||||
- `018`: `699-703` -> `task-018-effects-699-703.md`
|
||||
- `019`: `704-708` -> `task-019-effects-704-708.md`
|
||||
- `020`: `709-713` -> `task-020-effects-709-713.md`
|
||||
- `021`: `714-718` -> `task-021-effects-714-718.md`
|
||||
- `022`: `719-723` -> `task-022-effects-719-723.md`
|
||||
- `023`: `724-728` -> `task-023-effects-724-728.md`
|
||||
- `024`: `729-733` -> `task-024-effects-729-733.md`
|
||||
- `025`: `734-738` -> `task-025-effects-734-738.md`
|
||||
- `026`: `739-743` -> `task-026-effects-739-743.md`
|
||||
- `027`: `744-748` -> `task-027-effects-744-748.md`
|
||||
- `028`: `749-753` -> `task-028-effects-749-753.md`
|
||||
- `029`: `754-758` -> `task-029-effects-754-758.md`
|
||||
- `030`: `759-763` -> `task-030-effects-759-763.md`
|
||||
- `031`: `764-768` -> `task-031-effects-764-768.md`
|
||||
- `032`: `769-773` -> `task-032-effects-769-773.md`
|
||||
- `033`: `774-779` -> `task-033-effects-774-779.md`
|
||||
- `034`: `780-784` -> `task-034-effects-780-784.md`
|
||||
- `035`: `785-789` -> `task-035-effects-785-789.md`
|
||||
- `036`: `790-794` -> `task-036-effects-790-794.md`
|
||||
- `037`: `795-799` -> `task-037-effects-795-799.md`
|
||||
- `038`: `800-804` -> `task-038-effects-800-804.md`
|
||||
- `039`: `805-809` -> `task-039-effects-805-809.md`
|
||||
- `040`: `810-814` -> `task-040-effects-810-814.md`
|
||||
- `041`: `815-819` -> `task-041-effects-815-819.md`
|
||||
- `042`: `820-824` -> `task-042-effects-820-824.md`
|
||||
- `043`: `825-829` -> `task-043-effects-825-829.md`
|
||||
- `044`: `830-835` -> `task-044-effects-830-835.md`
|
||||
- `045`: `836-840` -> `task-045-effects-836-840.md`
|
||||
- `046`: `841-845` -> `task-046-effects-841-845.md`
|
||||
- `047`: `846-850` -> `task-047-effects-846-850.md`
|
||||
- `048`: `851-855` -> `task-048-effects-851-855.md`
|
||||
- `049`: `856-860` -> `task-049-effects-856-860.md`
|
||||
- `050`: `861-865` -> `task-050-effects-861-865.md`
|
||||
- `051`: `866-870` -> `task-051-effects-866-870.md`
|
||||
- `052`: `871-875` -> `task-052-effects-871-875.md`
|
||||
- `053`: `876-880` -> `task-053-effects-876-880.md`
|
||||
- `054`: `881-885` -> `task-054-effects-881-885.md`
|
||||
- `055`: `886-890` -> `task-055-effects-886-890.md`
|
||||
- `056`: `891-895` -> `task-056-effects-891-895.md`
|
||||
- `057`: `896-900` -> `task-057-effects-896-900.md`
|
||||
- `058`: `901-905` -> `task-058-effects-901-905.md`
|
||||
- `059`: `906-910` -> `task-059-effects-906-910.md`
|
||||
- `060`: `911-915` -> `task-060-effects-911-915.md`
|
||||
- `061`: `916-920` -> `task-061-effects-916-920.md`
|
||||
- `062`: `921-925` -> `task-062-effects-921-925.md`
|
||||
- `063`: `926-930` -> `task-063-effects-926-930.md`
|
||||
- `064`: `931-935` -> `task-064-effects-931-935.md`
|
||||
- `065`: `936-940` -> `task-065-effects-936-940.md`
|
||||
- `066`: `941-945` -> `task-066-effects-941-945.md`
|
||||
- `067`: `946-950` -> `task-067-effects-946-950.md`
|
||||
- `068`: `951-955` -> `task-068-effects-951-955.md`
|
||||
- `069`: `956-960` -> `task-069-effects-956-960.md`
|
||||
- `070`: `961-965` -> `task-070-effects-961-965.md`
|
||||
- `071`: `966-970` -> `task-071-effects-966-970.md`
|
||||
- `072`: `971-975` -> `task-072-effects-971-975.md`
|
||||
- `073`: `976-980` -> `task-073-effects-976-980.md`
|
||||
- `074`: `981-985` -> `task-074-effects-981-985.md`
|
||||
- `075`: `986-990` -> `task-075-effects-986-990.md`
|
||||
- `076`: `991-995` -> `task-076-effects-991-995.md`
|
||||
- `077`: `996-1000` -> `task-077-effects-996-1000.md`
|
||||
- `078`: `1001-1005` -> `task-078-effects-1001-1005.md`
|
||||
- `079`: `1006-1010` -> `task-079-effects-1006-1010.md`
|
||||
- `080`: `1011-1015` -> `task-080-effects-1011-1015.md`
|
||||
- `081`: `1016-1020` -> `task-081-effects-1016-1020.md`
|
||||
- `082`: `1021-1025` -> `task-082-effects-1021-1025.md`
|
||||
- `083`: `1026-1030` -> `task-083-effects-1026-1030.md`
|
||||
- `084`: `1031-1035` -> `task-084-effects-1031-1035.md`
|
||||
- `085`: `1036-1040` -> `task-085-effects-1036-1040.md`
|
||||
- `086`: `1041-1046` -> `task-086-effects-1041-1046.md`
|
||||
- `087`: `1047-1051` -> `task-087-effects-1047-1051.md`
|
||||
- `088`: `1052-1056` -> `task-088-effects-1052-1056.md`
|
||||
- `089`: `1057-1061` -> `task-089-effects-1057-1061.md`
|
||||
- `090`: `1062-1066` -> `task-090-effects-1062-1066.md`
|
||||
- `091`: `1067-1071` -> `task-091-effects-1067-1071.md`
|
||||
- `092`: `1072-1076` -> `task-092-effects-1072-1076.md`
|
||||
- `093`: `1077-1081` -> `task-093-effects-1077-1081.md`
|
||||
- `094`: `1082-1086` -> `task-094-effects-1082-1086.md`
|
||||
- `095`: `1087-1091` -> `task-095-effects-1087-1091.md`
|
||||
- `096`: `1092-1096` -> `task-096-effects-1092-1096.md`
|
||||
- `097`: `1097-1101` -> `task-097-effects-1097-1101.md`
|
||||
- `098`: `1102-1106` -> `task-098-effects-1102-1106.md`
|
||||
- `099`: `1107-1111` -> `task-099-effects-1107-1111.md`
|
||||
- `100`: `1112-1116` -> `task-100-effects-1112-1116.md`
|
||||
- `101`: `1117-1121` -> `task-101-effects-1117-1121.md`
|
||||
- `102`: `1122-1126` -> `task-102-effects-1122-1126.md`
|
||||
- `103`: `1127-1131` -> `task-103-effects-1127-1131.md`
|
||||
- `104`: `1132-1136` -> `task-104-effects-1132-1136.md`
|
||||
- `105`: `1137-1141` -> `task-105-effects-1137-1141.md`
|
||||
- `106`: `1142-1147` -> `task-106-effects-1142-1147.md`
|
||||
- `107`: `1148-1152` -> `task-107-effects-1148-1152.md`
|
||||
- `108`: `1153-1157` -> `task-108-effects-1153-1157.md`
|
||||
- `109`: `1158-1162` -> `task-109-effects-1158-1162.md`
|
||||
- `110`: `1163-1167` -> `task-110-effects-1163-1167.md`
|
||||
- `111`: `1168-1172` -> `task-111-effects-1168-1172.md`
|
||||
- `112`: `1173-1177` -> `task-112-effects-1173-1177.md`
|
||||
- `113`: `1178-1182` -> `task-113-effects-1178-1182.md`
|
||||
- `114`: `1183-1187` -> `task-114-effects-1183-1187.md`
|
||||
- `115`: `1188-1192` -> `task-115-effects-1188-1192.md`
|
||||
- `116`: `1193-1197` -> `task-116-effects-1193-1197.md`
|
||||
- `117`: `1198-1202` -> `task-117-effects-1198-1202.md`
|
||||
- `118`: `1203-1207` -> `task-118-effects-1203-1207.md`
|
||||
- `119`: `1208-1212` -> `task-119-effects-1208-1212.md`
|
||||
- `120`: `1213-1217` -> `task-120-effects-1213-1217.md`
|
||||
- `121`: `1218-1222` -> `task-121-effects-1218-1222.md`
|
||||
- `122`: `1223-1227` -> `task-122-effects-1223-1227.md`
|
||||
- `123`: `1228-1232` -> `task-123-effects-1228-1232.md`
|
||||
- `124`: `1233-1237` -> `task-124-effects-1233-1237.md`
|
||||
- `125`: `1238-1242` -> `task-125-effects-1238-1242.md`
|
||||
- `126`: `1243-1247` -> `task-126-effects-1243-1247.md`
|
||||
- `127`: `1248-1252` -> `task-127-effects-1248-1252.md`
|
||||
- `128`: `1253-1257` -> `task-128-effects-1253-1257.md`
|
||||
- `129`: `1258-1262` -> `task-129-effects-1258-1262.md`
|
||||
- `130`: `1263-1267` -> `task-130-effects-1263-1267.md`
|
||||
- `131`: `1268-1272` -> `task-131-effects-1268-1272.md`
|
||||
- `132`: `1273-1277` -> `task-132-effects-1273-1277.md`
|
||||
- `133`: `1278-1282` -> `task-133-effects-1278-1282.md`
|
||||
- `134`: `1283-1287` -> `task-134-effects-1283-1287.md`
|
||||
- `135`: `1288-1292` -> `task-135-effects-1288-1292.md`
|
||||
- `136`: `1293-1297` -> `task-136-effects-1293-1297.md`
|
||||
- `137`: `1298-1302` -> `task-137-effects-1298-1302.md`
|
||||
- `138`: `1303-1307` -> `task-138-effects-1303-1307.md`
|
||||
- `139`: `1308-1312` -> `task-139-effects-1308-1312.md`
|
||||
- `140`: `1313-1317` -> `task-140-effects-1313-1317.md`
|
||||
- `141`: `1318-1322` -> `task-141-effects-1318-1322.md`
|
||||
- `142`: `1323-1327` -> `task-142-effects-1323-1327.md`
|
||||
- `143`: `1328-1332` -> `task-143-effects-1328-1332.md`
|
||||
- `144`: `1333-1337` -> `task-144-effects-1333-1337.md`
|
||||
- `145`: `1338-1342` -> `task-145-effects-1338-1342.md`
|
||||
- `146`: `1343-1347` -> `task-146-effects-1343-1347.md`
|
||||
- `147`: `1348-1352` -> `task-147-effects-1348-1352.md`
|
||||
- `148`: `1353-1357` -> `task-148-effects-1353-1357.md`
|
||||
- `149`: `1358-1362` -> `task-149-effects-1358-1362.md`
|
||||
- `150`: `1363-1367` -> `task-150-effects-1363-1367.md`
|
||||
- `151`: `1368-1372` -> `task-151-effects-1368-1372.md`
|
||||
- `152`: `1373-1377` -> `task-152-effects-1373-1377.md`
|
||||
- `153`: `1378-1382` -> `task-153-effects-1378-1382.md`
|
||||
- `154`: `1383-1387` -> `task-154-effects-1383-1387.md`
|
||||
- `155`: `1388-1392` -> `task-155-effects-1388-1392.md`
|
||||
- `160`: `1413-1417` -> `task-160-effects-1413-1417.md`
|
||||
- `161`: `1418-1422` -> `task-161-effects-1418-1422.md`
|
||||
- `162`: `1423-1427` -> `task-162-effects-1423-1427.md`
|
||||
- `163`: `1428-1432` -> `task-163-effects-1428-1432.md`
|
||||
- `164`: `1433-1437` -> `task-164-effects-1433-1437.md`
|
||||
- `165`: `1438-1442` -> `task-165-effects-1438-1442.md`
|
||||
- `166`: `1443-1447` -> `task-166-effects-1443-1447.md`
|
||||
- `167`: `1448-1452` -> `task-167-effects-1448-1452.md`
|
||||
- `168`: `1453-1457` -> `task-168-effects-1453-1457.md`
|
||||
- `169`: `1458-1462` -> `task-169-effects-1458-1462.md`
|
||||
- `170`: `1463-1467` -> `task-170-effects-1463-1467.md`
|
||||
- `171`: `1468-1472` -> `task-171-effects-1468-1472.md`
|
||||
- `172`: `1473-1477` -> `task-172-effects-1473-1477.md`
|
||||
- `173`: `1478-1482` -> `task-173-effects-1478-1482.md`
|
||||
- `174`: `1483-1487` -> `task-174-effects-1483-1487.md`
|
||||
- `175`: `1488-1492` -> `task-175-effects-1488-1492.md`
|
||||
- `176`: `1493-1497` -> `task-176-effects-1493-1497.md`
|
||||
- `180`: `1513-1517` -> `task-180-effects-1513-1517.md`
|
||||
- `181`: `1518-1522` -> `task-181-effects-1518-1522.md`
|
||||
- `182`: `1523-1527` -> `task-182-effects-1523-1527.md`
|
||||
- `183`: `1528-1532` -> `task-183-effects-1528-1532.md`
|
||||
- `184`: `1533-1537` -> `task-184-effects-1533-1537.md`
|
||||
- `185`: `1538-1542` -> `task-185-effects-1538-1542.md`
|
||||
- `186`: `1543-1547` -> `task-186-effects-1543-1547.md`
|
||||
- `187`: `1548-1552` -> `task-187-effects-1548-1552.md`
|
||||
- `188`: `1553-1557` -> `task-188-effects-1553-1557.md`
|
||||
- `189`: `1558-1562` -> `task-189-effects-1558-1562.md`
|
||||
- `190`: `1563-1567` -> `task-190-effects-1563-1567.md`
|
||||
- `191`: `1568-1572` -> `task-191-effects-1568-1572.md`
|
||||
- `192`: `1573-1577` -> `task-192-effects-1573-1577.md`
|
||||
- `193`: `1578-1582` -> `task-193-effects-1578-1582.md`
|
||||
- `194`: `1583-1587` -> `task-194-effects-1583-1587.md`
|
||||
- `195`: `1588-1592` -> `task-195-effects-1588-1592.md`
|
||||
- `196`: `1593-1597` -> `task-196-effects-1593-1597.md`
|
||||
- `197`: `1598-1602` -> `task-197-effects-1598-1602.md`
|
||||
- `198`: `1603-1608` -> `task-198-effects-1603-1608.md`
|
||||
- `199`: `1609-1613` -> `task-199-effects-1609-1613.md`
|
||||
- `200`: `1614-1619` -> `task-200-effects-1614-1619.md`
|
||||
- `201`: `1620-1624` -> `task-201-effects-1620-1624.md`
|
||||
- `202`: `1625-1629` -> `task-202-effects-1625-1629.md`
|
||||
- `203`: `1630-1634` -> `task-203-effects-1630-1634.md`
|
||||
- `204`: `1635-1639` -> `task-204-effects-1635-1639.md`
|
||||
- `205`: `1640-1644` -> `task-205-effects-1640-1644.md`
|
||||
- `206`: `1645-1649` -> `task-206-effects-1645-1649.md`
|
||||
- `207`: `1650-1654` -> `task-207-effects-1650-1654.md`
|
||||
- `208`: `1655-1659` -> `task-208-effects-1655-1659.md`
|
||||
- `209`: `1660-1664` -> `task-209-effects-1660-1664.md`
|
||||
- `210`: `1665-1669` -> `task-210-effects-1665-1669.md`
|
||||
- `216`: `1695-1699` -> `task-216-effects-1695-1699.md`
|
||||
- `217`: `1700-1704` -> `task-217-effects-1700-1704.md`
|
||||
- `218`: `1705-1709` -> `task-218-effects-1705-1709.md`
|
||||
- `219`: `1710-1714` -> `task-219-effects-1710-1714.md`
|
||||
- `220`: `1715-1719` -> `task-220-effects-1715-1719.md`
|
||||
- `221`: `1720-1724` -> `task-221-effects-1720-1724.md`
|
||||
- `222`: `1725-1729` -> `task-222-effects-1725-1729.md`
|
||||
- `223`: `1730-1734` -> `task-223-effects-1730-1734.md`
|
||||
- `224`: `1735-1739` -> `task-224-effects-1735-1739.md`
|
||||
- `225`: `1740-1744` -> `task-225-effects-1740-1744.md`
|
||||
- `226`: `1745-1749` -> `task-226-effects-1745-1749.md`
|
||||
- `227`: `1750-1754` -> `task-227-effects-1750-1754.md`
|
||||
- `228`: `1755-1759` -> `task-228-effects-1755-1759.md`
|
||||
- `229`: `1760-1764` -> `task-229-effects-1760-1764.md`
|
||||
- `230`: `1765-1769` -> `task-230-effects-1765-1769.md`
|
||||
- `231`: `1770-1774` -> `task-231-effects-1770-1774.md`
|
||||
- `232`: `1775-1779` -> `task-232-effects-1775-1779.md`
|
||||
- `233`: `1780-1784` -> `task-233-effects-1780-1784.md`
|
||||
- `234`: `1785-1789` -> `task-234-effects-1785-1789.md`
|
||||
- `235`: `1790-1794` -> `task-235-effects-1790-1794.md`
|
||||
- `236`: `1795-1799` -> `task-236-effects-1795-1799.md`
|
||||
- `237`: `1800-1804` -> `task-237-effects-1800-1804.md`
|
||||
- `238`: `1805-1809` -> `task-238-effects-1805-1809.md`
|
||||
- `239`: `1810-1814` -> `task-239-effects-1810-1814.md`
|
||||
- `240`: `1815-1819` -> `task-240-effects-1815-1819.md`
|
||||
- `241`: `1820-1824` -> `task-241-effects-1820-1824.md`
|
||||
- `242`: `1825-1829` -> `task-242-effects-1825-1829.md`
|
||||
- `243`: `1830-1834` -> `task-243-effects-1830-1834.md`
|
||||
- `244`: `1835-1839` -> `task-244-effects-1835-1839.md`
|
||||
- `245`: `1840-1844` -> `task-245-effects-1840-1844.md`
|
||||
- `246`: `1845-1849` -> `task-246-effects-1845-1849.md`
|
||||
- `247`: `1850-1854` -> `task-247-effects-1850-1854.md`
|
||||
- `248`: `1855-1859` -> `task-248-effects-1855-1859.md`
|
||||
- `249`: `1860-1864` -> `task-249-effects-1860-1864.md`
|
||||
- `250`: `1865-1869` -> `task-250-effects-1865-1869.md`
|
||||
- `251`: `1870-1874` -> `task-251-effects-1870-1874.md`
|
||||
- `252`: `1875-1879` -> `task-252-effects-1875-1879.md`
|
||||
- `253`: `1880-1884` -> `task-253-effects-1880-1884.md`
|
||||
- `254`: `1885-1889` -> `task-254-effects-1885-1889.md`
|
||||
- `255`: `1890-1894` -> `task-255-effects-1890-1894.md`
|
||||
- `256`: `1895-1899` -> `task-256-effects-1895-1899.md`
|
||||
- `257`: `1900-1904` -> `task-257-effects-1900-1904.md`
|
||||
- `258`: `1905-1909` -> `task-258-effects-1905-1909.md`
|
||||
- `259`: `1910-1914` -> `task-259-effects-1910-1914.md`
|
||||
- `260`: `1915-1919` -> `task-260-effects-1915-1919.md`
|
||||
- `261`: `1920-1924` -> `task-261-effects-1920-1924.md`
|
||||
- `262`: `1925-1929` -> `task-262-effects-1925-1929.md`
|
||||
- `263`: `1930-1934` -> `task-263-effects-1930-1934.md`
|
||||
- `264`: `1935-1939` -> `task-264-effects-1935-1939.md`
|
||||
- `265`: `1940-1944` -> `task-265-effects-1940-1944.md`
|
||||
- `266`: `1945-1949` -> `task-266-effects-1945-1949.md`
|
||||
- `267`: `1950-1954` -> `task-267-effects-1950-1954.md`
|
||||
- `268`: `1955-1959` -> `task-268-effects-1955-1959.md`
|
||||
- `269`: `1960-1964` -> `task-269-effects-1960-1964.md`
|
||||
- `270`: `1965-1969` -> `task-270-effects-1965-1969.md`
|
||||
- `271`: `1970-1974` -> `task-271-effects-1970-1974.md`
|
||||
- `272`: `1975-1979` -> `task-272-effects-1975-1979.md`
|
||||
- `273`: `1980-1984` -> `task-273-effects-1980-1984.md`
|
||||
- `274`: `1985-1989` -> `task-274-effects-1985-1989.md`
|
||||
- `275`: `1990-1994` -> `task-275-effects-1990-1994.md`
|
||||
- `276`: `1995-1999` -> `task-276-effects-1995-1999.md`
|
||||
- `277`: `2000-2004` -> `task-277-effects-2000-2004.md`
|
||||
- `278`: `2005-2009` -> `task-278-effects-2005-2009.md`
|
||||
- `279`: `2010-2014` -> `task-279-effects-2010-2014.md`
|
||||
- `280`: `2015-2019` -> `task-280-effects-2015-2019.md`
|
||||
- `281`: `2020-2024` -> `task-281-effects-2020-2024.md`
|
||||
- `282`: `2025-2029` -> `task-282-effects-2025-2029.md`
|
||||
- `283`: `2030-2034` -> `task-283-effects-2030-2034.md`
|
||||
- `284`: `2035-2039` -> `task-284-effects-2035-2039.md`
|
||||
- `285`: `2040-2044` -> `task-285-effects-2040-2044.md`
|
||||
- `286`: `2045-2049` -> `task-286-effects-2045-2049.md`
|
||||
- `287`: `2050-2054` -> `task-287-effects-2050-2054.md`
|
||||
- `288`: `2055-2059` -> `task-288-effects-2055-2059.md`
|
||||
- `289`: `2060-2064` -> `task-289-effects-2060-2064.md`
|
||||
- `290`: `2065-2069` -> `task-290-effects-2065-2069.md`
|
||||
- `291`: `2070-2074` -> `task-291-effects-2070-2074.md`
|
||||
- `292`: `2075-2079` -> `task-292-effects-2075-2079.md`
|
||||
- `293`: `2080-2084` -> `task-293-effects-2080-2084.md`
|
||||
- `294`: `2085-2089` -> `task-294-effects-2085-2089.md`
|
||||
- `295`: `2090-2094` -> `task-295-effects-2090-2094.md`
|
||||
- `296`: `2095-2099` -> `task-296-effects-2095-2099.md`
|
||||
- `297`: `2100-2104` -> `task-297-effects-2100-2104.md`
|
||||
- `298`: `2105-2109` -> `task-298-effects-2105-2109.md`
|
||||
- `299`: `2110-2114` -> `task-299-effects-2110-2114.md`
|
||||
- `300`: `2115-2119` -> `task-300-effects-2115-2119.md`
|
||||
- `301`: `2120-2124` -> `task-301-effects-2120-2124.md`
|
||||
- `302`: `2125-2129` -> `task-302-effects-2125-2129.md`
|
||||
- `303`: `2130-2134` -> `task-303-effects-2130-2134.md`
|
||||
- `304`: `2135-2139` -> `task-304-effects-2135-2139.md`
|
||||
- `305`: `2140-2144` -> `task-305-effects-2140-2144.md`
|
||||
- `306`: `2145-2149` -> `task-306-effects-2145-2149.md`
|
||||
- `307`: `2150-2154` -> `task-307-effects-2150-2154.md`
|
||||
- `308`: `2155-2159` -> `task-308-effects-2155-2159.md`
|
||||
- `309`: `2160-2164` -> `task-309-effects-2160-2164.md`
|
||||
- `310`: `2165-2169` -> `task-310-effects-2165-2169.md`
|
||||
- `311`: `2170-2174` -> `task-311-effects-2170-2174.md`
|
||||
- `312`: `2175-2179` -> `task-312-effects-2175-2179.md`
|
||||
- `313`: `2180-2184` -> `task-313-effects-2180-2184.md`
|
||||
- `314`: `2185-2189` -> `task-314-effects-2185-2189.md`
|
||||
- `315`: `2190-2194` -> `task-315-effects-2190-2194.md`
|
||||
- `316`: `2195-2199` -> `task-316-effects-2195-2199.md`
|
||||
- `317`: `2200-2204` -> `task-317-effects-2200-2204.md`
|
||||
- `318`: `2205-2209` -> `task-318-effects-2205-2209.md`
|
||||
- `319`: `2210-2214` -> `task-319-effects-2210-2214.md`
|
||||
- `320`: `2215-2219` -> `task-320-effects-2215-2219.md`
|
||||
- `321`: `2220-2224` -> `task-321-effects-2220-2224.md`
|
||||
- `322`: `2225-2229` -> `task-322-effects-2225-2229.md`
|
||||
- `323`: `2230-2234` -> `task-323-effects-2230-2234.md`
|
||||
- `324`: `2235-2239` -> `task-324-effects-2235-2239.md`
|
||||
- `325`: `2240-2244` -> `task-325-effects-2240-2244.md`
|
||||
- `326`: `2245-2249` -> `task-326-effects-2245-2249.md`
|
||||
- `327`: `2250-2254` -> `task-327-effects-2250-2254.md`
|
||||
- `328`: `2255-2259` -> `task-328-effects-2255-2259.md`
|
||||
- `329`: `2260-2264` -> `task-329-effects-2260-2264.md`
|
||||
- `330`: `2265-2269` -> `task-330-effects-2265-2269.md`
|
||||
- `331`: `2270-2274` -> `task-331-effects-2270-2274.md`
|
||||
- `332`: `2275-2279` -> `task-332-effects-2275-2279.md`
|
||||
- `333`: `2280-2284` -> `task-333-effects-2280-2284.md`
|
||||
- `334`: `2285-2289` -> `task-334-effects-2285-2289.md`
|
||||
- `335`: `2290-2294` -> `task-335-effects-2290-2294.md`
|
||||
- `336`: `2295-2299` -> `task-336-effects-2295-2299.md`
|
||||
- `337`: `2300-2304` -> `task-337-effects-2300-2304.md`
|
||||
- `338`: `2305-2309` -> `task-338-effects-2305-2309.md`
|
||||
- `339`: `2310-2314` -> `task-339-effects-2310-2314.md`
|
||||
- `340`: `2315-2319` -> `task-340-effects-2315-2319.md`
|
||||
- `341`: `2320-2324` -> `task-341-effects-2320-2324.md`
|
||||
- `342`: `2325-2325` -> `task-342-effects-2325-2325.md`
|
||||
@@ -1,46 +0,0 @@
|
||||
# Task 008: Effects 637-641
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 637
|
||||
- `argsNum`: `2`
|
||||
- `info`: `若对手处于异常状态,则对手{0}{1}`
|
||||
- `param`: `2,0,0`
|
||||
|
||||
### Effect 638
|
||||
- `argsNum`: `2`
|
||||
- `info`: `若对手{0},技能威力提升{1}%`
|
||||
- `param`: `1,0,0`
|
||||
|
||||
### Effect 639
|
||||
- `argsNum`: `4`
|
||||
- `info`: `造成伤害{0}{1},则下{2}回合所有技能附带{3}点固定伤害`
|
||||
- `param`: `12,0,0`
|
||||
|
||||
### Effect 640
|
||||
- `argsNum`: `3`
|
||||
- `info`: `命中后{0}%使对手{1}{2}回合,遇到天敌概率翻倍`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 641
|
||||
- `argsNum`: `1`
|
||||
- `info`: `命中后{0}%使对手进入流血状态`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
|
||||
## 完成记录
|
||||
|
||||
- 2026-03-29:已在 `logic/service/fight/effect/637_641.go` 补齐 `637-641`。
|
||||
- 同步更新了 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 额外补上了 `Bleeding(16)` 状态的基础注册,使 `641` 能挂载流血状态。
|
||||
- 验证命令:`cd /workspace/logic && go test ./service/fight/effect`
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 031: Effects 764-768
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 764
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内若对手使用攻击技能降低对手最大体力的1/{1}`
|
||||
|
||||
### Effect 765
|
||||
- `argsNum`: `1`
|
||||
- `info`: `{0}回合对手无法使自身能力出现提升状态`
|
||||
|
||||
### Effect 766
|
||||
- `argsNum`: `2`
|
||||
- `info`: `消除对手能力提升状态,消除成功则{0}回合内对手造成的攻击伤害不超过{1}点`
|
||||
|
||||
### Effect 767
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内每回合使用技能且出手流程结束后若对手处于能力下降状态则附加给对手{1}点固定伤害`
|
||||
|
||||
### Effect 768
|
||||
- `argsNum`: `1`
|
||||
- `info`: `对手每处于一种异常状态则附加{0}点固定伤害`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 033: Effects 774-779
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 774
|
||||
- `argsNum`: `1`
|
||||
- `info`: `若自身当前体力高于对手则附加对手最大体力1/{0}的百分比伤害`
|
||||
|
||||
### Effect 775
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内若受到的伤害大于{1},则恢复自身所有体力`
|
||||
|
||||
### Effect 777
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手能力上升状态,消除成功下{0}回合必定先出手`
|
||||
|
||||
### Effect 778
|
||||
- `argsNum`: `0`
|
||||
- `info`: `反转对手的能力提升状态,反转成功则恢复自身所有体力`
|
||||
|
||||
### Effect 779
|
||||
- `argsNum`: `0`
|
||||
- `info`: `若对手处于能力提升状态则先制+2`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 034: Effects 780-784
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 780
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}回合内受到攻击则{1}%令对手随机{2}个技能PP值归零`
|
||||
|
||||
### Effect 781
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手回合类效果,消除成功则{0}回合内令对手使用的属性技能无效`
|
||||
|
||||
### Effect 782
|
||||
- `argsNum`: `4`
|
||||
- `info`: `{0}%令对手{1},每次使用概率增加{2}%,最高概率{3}%`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 783
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内自身能力提升状态被消除或吸取时附加对手最大体力1/{1}的百分比伤害`
|
||||
|
||||
### Effect 784
|
||||
- `argsNum`: `0`
|
||||
- `info`: `若本回合击败对手则将对手的能力提升效果转移到自己身上`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 035: Effects 785-789
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 785
|
||||
- `argsNum`: `0`
|
||||
- `info`: `若自身攻击对手时克制关系为微弱则先制+2`
|
||||
|
||||
### Effect 786
|
||||
- `argsNum`: `1`
|
||||
- `info`: `令对手随机进入{0}种异常状态`
|
||||
|
||||
### Effect 787
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内使用技能后若对手处于能力提升状态则附加对手最大体力1/{1}的百分比伤害`
|
||||
|
||||
### Effect 788
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手能力提升,消除成功{0}回合内免疫异常状态`
|
||||
|
||||
### Effect 789
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手回合类效果,消除成功对手下{0}回合受到的伤害翻倍`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 036: Effects 790-794
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 790
|
||||
- `argsNum`: `1`
|
||||
- `info`: `{0}回合内自身所有攻击无视伤害限制效果`
|
||||
|
||||
### Effect 791
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内每回合使用技能恢复自身最大体力的1/{1},恢复体力时若自身当前体力低于对手则恢复效果翻倍`
|
||||
|
||||
### Effect 792
|
||||
- `argsNum`: `0`
|
||||
- `info`: `先出手时对手当回合攻击技能无效`
|
||||
|
||||
### Effect 793
|
||||
- `argsNum`: `3`
|
||||
- `info`: `若造成的伤害低于{0},则下{1}回合每回合造成{2}点固定伤害`
|
||||
|
||||
### Effect 794
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手能力提升,消除成功可以抵挡{0}回合内对手的攻击伤害`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 037: Effects 795-799
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 795
|
||||
- `argsNum`: `2`
|
||||
- `info`: `每次使用则当回合造成的攻击伤害额外提升{0}%,最高额外提升{1}%`
|
||||
|
||||
### Effect 796
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内每回合吸取对手当前体力的1/{1}`
|
||||
|
||||
### Effect 797
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手回合类效果,消除成功{0}回合内对手无法通过自身技能恢复体力`
|
||||
|
||||
### Effect 798
|
||||
- `argsNum`: `2`
|
||||
- `info`: `若对手处于能力提升状态,则对手{0}回合内造成的伤害不超过{1}`
|
||||
|
||||
### Effect 799
|
||||
- `argsNum`: `2`
|
||||
- `info`: `恢复自身最大体力的1/{0}并给对手造成等量百分比伤害,自身体力低于1/{1}时效果翻倍`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 038: Effects 800-804
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 800
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}回合内若对手使用属性技能,则下{1}回合自身受到的伤害不超过{2}`
|
||||
|
||||
### Effect 801
|
||||
- `argsNum`: `2`
|
||||
- `info`: `消除对手能力提升,消除成功则下{0}回合必定先出手、下{1}回合造成的伤害恢复自身体力`
|
||||
|
||||
### Effect 802
|
||||
- `argsNum`: `1`
|
||||
- `info`: `{0}回合内免疫控制类异常状态`
|
||||
|
||||
### Effect 803
|
||||
- `argsNum`: `5`
|
||||
- `info`: `命中后{0}%令对手{1},未触发则恢复自身最大体力的1/{2}体力且{3}回合内自身受到的伤害不超过{4}`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 804
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内自身能力提升状态被消除或吸取时,令对手全属性-{1}`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 039: Effects 805-809
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 805
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手能力提升状态,消除成功则令对手随机{0}项技能PP值归零`
|
||||
|
||||
### Effect 806
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内若对手使用攻击技能则使用后令自身全属性+{1}`
|
||||
|
||||
### Effect 807
|
||||
- `argsNum`: `0`
|
||||
- `info`: `附加对手上次造成伤害数值的固定伤害`
|
||||
|
||||
### Effect 808
|
||||
- `argsNum`: `1`
|
||||
- `info`: `自身每处于一种能力提升状态则附加{0}点固定伤害`
|
||||
|
||||
### Effect 809
|
||||
- `argsNum`: `0`
|
||||
- `info`: `使对手下次使用的攻击技能失效`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 040: Effects 810-814
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 810
|
||||
- `argsNum`: `1`
|
||||
- `info`: `每次命中对手后此技能威力下降{0}点`
|
||||
|
||||
### Effect 811
|
||||
- `argsNum`: `0`
|
||||
- `info`: `使自身下次受到的伤害减少n点,n等于本回合自身造成的伤害`
|
||||
|
||||
### Effect 812
|
||||
- `argsNum`: `1`
|
||||
- `info`: `自身速度能力每提升1段,则回合结束时减少对手1/{0}最大体力`
|
||||
|
||||
### Effect 813
|
||||
- `argsNum`: `0`
|
||||
- `info`: `将自身的能力下降状态双倍反馈给对手`
|
||||
|
||||
### Effect 814
|
||||
- `argsNum`: `1`
|
||||
- `info`: `先出手时附加自身双防值总和{0}%的百分比伤害`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 041: Effects 815-819
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 815
|
||||
- `argsNum`: `1`
|
||||
- `info`: `后出手时附加自身当前体力{0}%的百分比伤害`
|
||||
|
||||
### Effect 816
|
||||
- `argsNum`: `0`
|
||||
- `info`: `免疫对手下次攻击技能造成的伤害并直接扣除对手等量体力`
|
||||
|
||||
### Effect 817
|
||||
- `argsNum`: `1`
|
||||
- `info`: `{0}回合内受到攻击则对手下回合受到的伤害翻倍`
|
||||
|
||||
### Effect 818
|
||||
- `argsNum`: `0`
|
||||
- `info`: `出手时本回合若受到伤害,则将伤害反馈给对手`
|
||||
|
||||
### Effect 819
|
||||
- `argsNum`: `2`
|
||||
- `info`: `出手时本回合若未受到攻击伤害,则附加自身{0}值{1}%的百分比伤害,并恢复等量体力`
|
||||
- `param`: `2,0,0`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 042: Effects 820-824
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 820
|
||||
- `argsNum`: `2`
|
||||
- `info`: `未击败对手下{0}回合自身攻击先制+{1}`
|
||||
|
||||
### Effect 821
|
||||
- `argsNum`: `1`
|
||||
- `info`: `{0}回合内自身的回合类效果无法被消除,后出手时回合数+1`
|
||||
|
||||
### Effect 822
|
||||
- `argsNum`: `0`
|
||||
- `info`: `吸收对手的能力提升同时反转对手的能力提升`
|
||||
|
||||
### Effect 823
|
||||
- `argsNum`: `1`
|
||||
- `info`: `当回合未击败对手,则下{0}回合必定先出手`
|
||||
|
||||
### Effect 824
|
||||
- `argsNum`: `2`
|
||||
- `info`: `若对手不处于{0}状态则吸取对手1/{1}最大体力`
|
||||
- `param`: `1,0,0`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 043: Effects 825-829
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 825
|
||||
- `argsNum`: `1`
|
||||
- `info`: `若对手处于能力提升状态则附加对手最大体力1/{0}的百分比伤害`
|
||||
|
||||
### Effect 826
|
||||
- `argsNum`: `1`
|
||||
- `info`: `当回合击败对手则对手下只出场精灵随机进入{0}种异常状态`
|
||||
|
||||
### Effect 827
|
||||
- `argsNum`: `2`
|
||||
- `info`: `消除对手能力提升状态,消除成功则令自身下{0}回合必定先出手且下{1}回合造成的攻击伤害翻倍`
|
||||
|
||||
### Effect 828
|
||||
- `argsNum`: `0`
|
||||
- `info`: `若自身处于能力提升状态则先制+1`
|
||||
|
||||
### Effect 829
|
||||
- `argsNum`: `2`
|
||||
- `info`: `下{0}回合对手每回合受到相当于本次伤害的1/{1}的百分比伤害(可以叠加)`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 044: Effects 830-835
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 830
|
||||
- `argsNum`: `0`
|
||||
- `info`: `若后出手,则免疫本回合受到的伤害`
|
||||
|
||||
### Effect 831
|
||||
- `argsNum`: `1`
|
||||
- `info`: `附加自身最大体力{0}%的百分比伤害`
|
||||
|
||||
### Effect 833
|
||||
- `argsNum`: `1`
|
||||
- `info`: `当回合若未击败对手则吸取对手最大体力的1/{0}`
|
||||
|
||||
### Effect 834
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内自身能力提升状态被消除或吸取时,{1}回合内对手属性技能无效`
|
||||
|
||||
### Effect 835
|
||||
- `argsNum`: `0`
|
||||
- `info`: `反转自身能力下降状态,反转成功则恢复自身全部体力`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 045: Effects 836-840
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 836
|
||||
- `argsNum`: `1`
|
||||
- `info`: `自身体力高于对手时先制+{0}`
|
||||
|
||||
### Effect 837
|
||||
- `argsNum`: `3`
|
||||
- `info`: `吸取对手{0}点固定体力,每次使用额外附加{1}点,最高{2}点`
|
||||
|
||||
### Effect 838
|
||||
- `argsNum`: `1`
|
||||
- `info`: `若当回合未击败对手,则下回合附加{0}点固定伤害`
|
||||
|
||||
### Effect 839
|
||||
- `argsNum`: `1`
|
||||
- `info`: `附加自身最大体力{0}%的百分比伤害并恢复等量体力`
|
||||
|
||||
### Effect 840
|
||||
- `argsNum`: `1`
|
||||
- `info`: `击败对手则对方下只精灵出战时己方在场精灵吸取其最大体力的1/{0}`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 052: Effects 871-875
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 871
|
||||
- `argsNum`: `2`
|
||||
- `info`: `下{0}回合,每回合攻击技能造成的伤害不少于{1}`
|
||||
|
||||
### Effect 872
|
||||
- `argsNum`: `1`
|
||||
- `info`: `吸取对手能力提升状态,吸取成功则{0}回合内令对手使用的属性技能无效`
|
||||
|
||||
### Effect 873
|
||||
- `argsNum`: `0`
|
||||
- `info`: `消耗自身全部体力,消除对手能力提升状态和回合类效果,使己方下只出场精灵下次攻击必定先手、必定命中且造成的伤害翻倍`
|
||||
|
||||
### Effect 874
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内若对手造成的伤害低于{1}则免疫该伤害`
|
||||
|
||||
### Effect 875
|
||||
- `argsNum`: `0`
|
||||
- `info`: `消耗自身全部体力,对手所有技能PP值归零,全属性-1`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 053: Effects 876-880
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 876
|
||||
- `argsNum`: `1`
|
||||
- `info`: `附加自身防御、特防和速度总和{0}%的百分比伤害`
|
||||
|
||||
### Effect 877
|
||||
- `argsNum`: `1`
|
||||
- `info`: `先出手时全属性+{0}`
|
||||
|
||||
### Effect 878
|
||||
- `argsNum`: `2`
|
||||
- `info`: `下{0}回合先出手则对手{1}`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 879
|
||||
- `argsNum`: `0`
|
||||
- `info`: `消除对手回合类效果,消除成功则恢复自身全部体力`
|
||||
|
||||
### Effect 880
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手回合类效果,消除成功则令自身下回合所有技能先制+{0}`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 054: Effects 881-885
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 881
|
||||
- `argsNum`: `0`
|
||||
- `info`: `若自身处于能力下降状态则先制+3`
|
||||
|
||||
### Effect 882
|
||||
- `argsNum`: `1`
|
||||
- `info`: `自身每处于一种能力提升状态,此技能威力提升{0}`
|
||||
|
||||
### Effect 883
|
||||
- `argsNum`: `2`
|
||||
- `info`: `每次命中对手会降低对手下只出战精灵最大体力的{0}%,最多降低{1}%`
|
||||
|
||||
### Effect 884
|
||||
- `argsNum`: `0`
|
||||
- `info`: `令对手下次使用的技能无效`
|
||||
|
||||
### Effect 885
|
||||
- `argsNum`: `1`
|
||||
- `info`: `全属性+{0},自身当前体力高于对手时强化效果翻倍`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 055: Effects 886-890
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 886
|
||||
- `argsNum`: `1`
|
||||
- `info`: `下次攻击忽略对手双防值的{0}%`
|
||||
|
||||
### Effect 887
|
||||
- `argsNum`: `1`
|
||||
- `info`: `吸收对手能力提升,吸收成功恢复自身所有体力并且下回合先制+{0}`
|
||||
|
||||
### Effect 888
|
||||
- `argsNum`: `1`
|
||||
- `info`: `自己出手时若自身体力低于对手则回合结束时减少对手1/{0}最大体力`
|
||||
|
||||
### Effect 889
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手回合类效果,消除成功则令对手{0}`
|
||||
- `param`: `1,0,0`
|
||||
|
||||
### Effect 890
|
||||
- `argsNum`: `0`
|
||||
- `info`: `自身处于能力提升状态时造成的伤害翻倍`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 056: Effects 891-895
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 891
|
||||
- `argsNum`: `1`
|
||||
- `info`: `吸收对手能力提升状态,吸收成功则下{0}回合造成的伤害翻倍`
|
||||
|
||||
### Effect 892
|
||||
- `argsNum`: `1`
|
||||
- `info`: `每使用此技能击败一只精灵则减少对手下只出场精灵{0}%最大体力`
|
||||
|
||||
### Effect 893
|
||||
- `argsNum`: `1`
|
||||
- `info`: `全属性+{0},自身满体力时强化效果翻倍`
|
||||
|
||||
### Effect 894
|
||||
- `argsNum`: `1`
|
||||
- `info`: `吸取对手{0}点体力,体力低于对手时吸取效果翻倍`
|
||||
|
||||
### Effect 895
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内受到的所有类型伤害的1/{1}转化为自身体力`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 057: Effects 896-900
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 896
|
||||
- `argsNum`: `0`
|
||||
- `info`: `双倍反转自身的能力下降`
|
||||
|
||||
### Effect 897
|
||||
- `argsNum`: `2`
|
||||
- `info`: `未击败对手则令自身下{0}次受到的攻击伤害额外减少{1}%`
|
||||
|
||||
### Effect 898
|
||||
- `argsNum`: `1`
|
||||
- `info`: `若对手不是雄性精灵,则恢复{0}点体力`
|
||||
|
||||
### Effect 899
|
||||
- `argsNum`: `0`
|
||||
- `info`: `若自身先出手,则本回合对手释放的属性技能失效`
|
||||
|
||||
### Effect 900
|
||||
- `argsNum`: `2`
|
||||
- `info`: `恢复自身最大体力的1/{0},体力少于1/{1}时恢复效果翻倍`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 058: Effects 901-905
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 901
|
||||
- `argsNum`: `6`
|
||||
- `info`: `消除对手回合类效果,消除成功则{0}`
|
||||
- `param`: `0,0,0`
|
||||
|
||||
### Effect 902
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消耗自身全部体力,消除对手能力提升状态和回合类效果并使对手{0}回合内所有技能失效`
|
||||
|
||||
### Effect 903
|
||||
- `argsNum`: `1`
|
||||
- `info`: `自身体力高于对手时附加自身最大体力值{0}%的百分比伤害`
|
||||
|
||||
### Effect 904
|
||||
- `argsNum`: `3`
|
||||
- `info`: `消耗自身全部体力,消除对手回合类效果且令己方免疫下{0}次受到的异常状态,同时己方下只精灵出战时获得{1}点护盾且{2}回合内令对手使用的属性技能无效`
|
||||
|
||||
### Effect 905
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手能力提升,消除成功{0}回合内对手无法通过自身技能恢复体力`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 059: Effects 906-910
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 906
|
||||
- `argsNum`: `3`
|
||||
- `info`: `附加对手最大体力值{0}%的百分比伤害,每次使用增加{1}%,最高{2}%`
|
||||
|
||||
### Effect 907
|
||||
- `argsNum`: `1`
|
||||
- `info`: `反转自身能力下降状态,反转成功则使对手随机{0}个技能PP归零`
|
||||
|
||||
### Effect 908
|
||||
- `argsNum`: `1`
|
||||
- `info`: `吸收对手能力提升状态,吸收成功则对手下{0}回合所有技能失效`
|
||||
|
||||
### Effect 909
|
||||
- `argsNum`: `3`
|
||||
- `info`: `先出手时{0}%使对手{1},未触发则附加{2}点固定伤害`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 910
|
||||
- `argsNum`: `1`
|
||||
- `info`: `当回合击败对手则令对手{0}回合内属性技能无效`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,37 +0,0 @@
|
||||
# Task 061: Effects 916-920
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 916
|
||||
- `argsNum`: `2`
|
||||
- `info`: `命中后{0}%使对手{1},若未触发则恢复自身全部体力`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 917
|
||||
- `argsNum`: `3`
|
||||
- `info`: `命中后{0}%使对手{1},未触发则附加自身最大体力值1/{2}的百分比伤害`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 918
|
||||
- `argsNum`: `3`
|
||||
- `info`: `造成的伤害不足{0}则自身下{1}次造成的伤害提升{2}%`
|
||||
|
||||
### Effect 919
|
||||
- `argsNum`: `0`
|
||||
- `info`: `后出手时使对手下回合属性技能失效`
|
||||
|
||||
### Effect 920
|
||||
- `argsNum`: `1`
|
||||
- `info`: `未击败对手则下回合造成的伤害提升{0}%`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 062: Effects 921-925
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 921
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}%概率造成的攻击伤害为{1}倍,未触发则{2}回合内令对手使用的属性技能无效`
|
||||
|
||||
### Effect 922
|
||||
- `argsNum`: `1`
|
||||
- `info`: `{0}回合内每回合结束后解除并反馈自身能力下降状态`
|
||||
|
||||
### Effect 923
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内每回合若先出手则吸取对手{1}点体力`
|
||||
|
||||
### Effect 924
|
||||
- `argsNum`: `2`
|
||||
- `info`: `下{0}回合攻击技能吸取对手1/{1}最大体力值`
|
||||
|
||||
### Effect 925
|
||||
- `argsNum`: `1`
|
||||
- `info`: `若自身为满体力则技能威力提升{0}%`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 063: Effects 926-930
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 926
|
||||
- `argsNum`: `2`
|
||||
- `info`: `反转自身能力下降状态,反转成功则下{0}回合先制+{1}`
|
||||
|
||||
### Effect 927
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}回合内每回合使用技能则出手流程结束后恢复自身最大体力的1/{1},恢复体力时若自身体力低于最大体力的1/{2}则附加给对手等量百分比伤害`
|
||||
|
||||
### Effect 928
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手回合类效果,消除成功则己方免疫下{0}次受到的异常状态`
|
||||
|
||||
### Effect 929
|
||||
- `argsNum`: `1`
|
||||
- `info`: `反弹{0}倍的伤害给对手并使自身恢复等量体力`
|
||||
|
||||
### Effect 930
|
||||
- `argsNum`: `4`
|
||||
- `info`: `获得{0}点护盾,护盾消失时对对手造成{1}点固定伤害且有{2}%的概率使对手{3}`
|
||||
- `param`: `1,3,3`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,37 +0,0 @@
|
||||
# Task 064: Effects 931-935
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 931
|
||||
- `argsNum`: `1`
|
||||
- `info`: `吸取对手能力提升状态,吸取成功则对手{0}技能PP值归零`
|
||||
- `param`: `27,0,0`
|
||||
|
||||
### Effect 932
|
||||
- `argsNum`: `1`
|
||||
- `info`: `先出手时附加自身攻击{0}%的百分比伤害`
|
||||
|
||||
### Effect 933
|
||||
- `argsNum`: `1`
|
||||
- `info`: `未击败对手则己方下{0}次攻击技能必定打出致命一击`
|
||||
|
||||
### Effect 934
|
||||
- `argsNum`: `2`
|
||||
- `info`: `击败对手则对手下只出场精灵{0}回合内先制-{1}`
|
||||
|
||||
### Effect 935
|
||||
- `argsNum`: `1`
|
||||
- `info`: `若自身体力高于对手则使对手{0}`
|
||||
- `param`: `1,0,0`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,37 +0,0 @@
|
||||
# Task 065: Effects 936-940
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 936
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}%令对手{1},未触发则令对手{2}回合内使用的属性技能无效`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 937
|
||||
- `argsNum`: `4`
|
||||
- `info`: `命中后{0}%使对手{1},未触发则对手下{2}回合先制-{3}`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 938
|
||||
- `argsNum`: `1`
|
||||
- `info`: `使对手全属性-{0},先出手时效果翻倍`
|
||||
|
||||
### Effect 939
|
||||
- `argsNum`: `1`
|
||||
- `info`: `若后出手则附加自身最大体力1/{0}的百分比伤害并恢复等量体力`
|
||||
|
||||
### Effect 940
|
||||
- `argsNum`: `2`
|
||||
- `info`: `全属性+{0},若对手处于封印属性技能状态则攻击额外+{1}`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 066: Effects 941-945
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 941
|
||||
- `argsNum`: `1`
|
||||
- `info`: `出手时有概率使对手{0},概率等同于出手时自身当前体力百分比`
|
||||
- `param`: `1,0,0`
|
||||
|
||||
### Effect 942
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手回合类效果,消除成功则吸取对手最大体力的1/{0}`
|
||||
|
||||
### Effect 943
|
||||
- `argsNum`: `1`
|
||||
- `info`: `附加自身防御、特防总和{0}%的百分比伤害`
|
||||
|
||||
### Effect 944
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内对手使用攻击技能时受到自身防御、特防总和{1}%的百分比伤害`
|
||||
|
||||
### Effect 945
|
||||
- `argsNum`: `0`
|
||||
- `info`: `消除对手回合类效果,消除成功则恢复自身全部体力`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 067: Effects 946-950
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 946
|
||||
- `argsNum`: `1`
|
||||
- `info`: `全属性+{0},若自身当前体力低于对手则强化效果翻倍`
|
||||
|
||||
### Effect 947
|
||||
- `argsNum`: `2`
|
||||
- `info`: `造成的伤害不足{0}则吸取对手最大体力的1/{1}`
|
||||
|
||||
### Effect 948
|
||||
- `argsNum`: `1`
|
||||
- `info`: `吸取对手能力提升状态,吸取成功则对手{0} `
|
||||
- `param`: `1,0,0`
|
||||
|
||||
### Effect 949
|
||||
- `argsNum`: `1`
|
||||
- `info`: `造成伤害不足{0}则恢复自身全部体力`
|
||||
|
||||
### Effect 950
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手回合类效果,消除成功则对手{0}回合内攻击技能MISS`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 068: Effects 951-955
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 951
|
||||
- `argsNum`: `1`
|
||||
- `info`: `反转对手能力提升状态,反转成功则己方免疫下{0}次受到的异常状态`
|
||||
|
||||
### Effect 952
|
||||
- `argsNum`: `1`
|
||||
- `info`: `全属性+{0},若对手处于能力下降状态则效果翻倍`
|
||||
|
||||
### Effect 953
|
||||
- `argsNum`: `4`
|
||||
- `info`: `{0}回合恢复最大体力的1/{1},体力低于{2}%时先制+{3}`
|
||||
|
||||
### Effect 954
|
||||
- `argsNum`: `0`
|
||||
- `info`: `若当前体力低于对手则先制+1`
|
||||
|
||||
### Effect 955
|
||||
- `argsNum`: `1`
|
||||
- `info`: `反转自身能力下降状态,反转成功则吸取对手{0}点体力`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 070: Effects 961-965
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 961
|
||||
- `argsNum`: `1`
|
||||
- `info`: `反转自身能力下降,反转成功则自身下{0}回合免疫攻击伤害`
|
||||
|
||||
### Effect 962
|
||||
- `argsNum`: `1`
|
||||
- `info`: `全属性+{0},自身不处于能力提升状态时强化效果翻倍`
|
||||
|
||||
### Effect 963
|
||||
- `argsNum`: `1`
|
||||
- `info`: `若自身处于能力提升状态则吸取对手最大体力的1/{0}`
|
||||
|
||||
### Effect 964
|
||||
- `argsNum`: `0`
|
||||
- `info`: `未击败对手则自身能力提升状态翻倍`
|
||||
|
||||
### Effect 965
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内自身攻击技能命中则对手全属性-{1}`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,37 +0,0 @@
|
||||
# Task 071: Effects 966-970
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 966
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}%的概率使对手{1},未触发则自身全属性+{2}`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 967
|
||||
- `argsNum`: `1`
|
||||
- `info`: `攻击结束时附加对手双防之和{0}%的百分比伤害`
|
||||
|
||||
### Effect 968
|
||||
- `argsNum`: `2`
|
||||
- `info`: `命中对手后有{0}%使对手{1},先出手时概率翻倍`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 969
|
||||
- `argsNum`: `1`
|
||||
- `info`: `后出手时下回合受到的伤害降低{0}点`
|
||||
|
||||
### Effect 970
|
||||
- `argsNum`: `1`
|
||||
- `info`: `双倍反转对手能力提升状态,反转成功则下回合自身所有技能先制+{0},反转失败则消除对手能力提升状态`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,37 +0,0 @@
|
||||
# Task 072: Effects 971-975
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 971
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}回合内每回合使用技能吸取对手最大体力的1/{1},吸取体力时若自身体力低于最大体力的1/{2}则吸取效果翻倍`
|
||||
|
||||
### Effect 972
|
||||
- `argsNum`: `1`
|
||||
- `info`: `出手时若自身体力低于对手,则免疫下{0}次受到的攻击伤害`
|
||||
|
||||
### Effect 973
|
||||
- `argsNum`: `2`
|
||||
- `info`: `消除对手回合类效果,消除成功则{0}%令对手{1}`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 974
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}%使对手{1},若未触发则使对手受到相当于自身当前体力1/{2}的百分比伤害`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 975
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}%的概率威力{1}倍,若未触发则下回合自身先制+{2}`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 073: Effects 976-980
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 976
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手回合类效果,若消除成功则使对手下{0}次使用的属性技能失效`
|
||||
|
||||
### Effect 977
|
||||
- `argsNum`: `2`
|
||||
- `info`: `吸取对手最大体力的1/{0},自身体力低于1/{1}时吸取效果翻倍`
|
||||
|
||||
### Effect 978
|
||||
- `argsNum`: `0`
|
||||
- `info`: `吸取并反转对手能力提升状态`
|
||||
|
||||
### Effect 979
|
||||
- `argsNum`: `2`
|
||||
- `info`: `消除对手回合类效果,消除成功则自身下{0}回合所有技能先制+{1}`
|
||||
|
||||
### Effect 980
|
||||
- `argsNum`: `0`
|
||||
- `info`: `先出手时对手当回合属性技能无效`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 079: Effects 1006-1010
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1006
|
||||
- `argsNum`: `2`
|
||||
- `info`: `造成的伤害超过{0}则下{1}回合免疫异常状态`
|
||||
|
||||
### Effect 1007
|
||||
- `argsNum`: `4`
|
||||
- `info`: `{0}回合内每次攻击都有{1}%概率令对手{2},未触发则对手全属性-{3}`
|
||||
- `param`: `1,2,2`
|
||||
|
||||
### Effect 1008
|
||||
- `argsNum`: `2`
|
||||
- `info`: `造成的伤害高于{0}则获得{1}点护盾`
|
||||
|
||||
### Effect 1009
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手能力提升状态,消除成功则对手全属性-{0}`
|
||||
|
||||
### Effect 1010
|
||||
- `argsNum`: `2`
|
||||
- `info`: `消除对手能力提升状态,消除成功则下{0}回合造成的伤害提高{1}%`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,37 +0,0 @@
|
||||
# Task 084: Effects 1031-1035
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1031
|
||||
- `argsNum`: `1`
|
||||
- `info`: `出手时本回合若未受到伤害则对手下{0}回合属性技能无效`
|
||||
|
||||
### Effect 1032
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手回合类效果,消除成功则下{0}回合令对手使用的攻击技能无效`
|
||||
|
||||
### Effect 1033
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}%使对手{1},未触发则自身下{2}回合攻击必定致命一击`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 1034
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手回合类效果,消除成功则免疫下{0}回合受到的攻击伤害`
|
||||
|
||||
### Effect 1035
|
||||
- `argsNum`: `5`
|
||||
- `info`: `命中后{0}%使对手{1},未触发则下{2}回合攻击有{3}%概率使对手{4}`
|
||||
- `param`: `1,1,1|1,4,4`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 085: Effects 1036-1040
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1036
|
||||
- `argsNum`: `2`
|
||||
- `info`: `消除对手回合类效果,消除成功则下{0}次攻击附加{1}点固定伤害`
|
||||
|
||||
### Effect 1037
|
||||
- `argsNum`: `2`
|
||||
- `info`: `消除对手能力提升状态,消除成功则自身下{0}次攻击技能造成的伤害额外提升{1}%`
|
||||
|
||||
### Effect 1038
|
||||
- `argsNum`: `1`
|
||||
- `info`: `双倍反转自身能力下降状态,反转成功则获得{0}点护盾`
|
||||
|
||||
### Effect 1039
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}回合内每回合使用技能恢复自身最大体力的1/{1},恢复体力时若自身体力低于最大体力的1/{2}则直接回满`
|
||||
|
||||
### Effect 1040
|
||||
- `argsNum`: `3`
|
||||
- `info`: `当回合若未击败对手则{0}%令对手{1},未触发则令自身全属性+{2}`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 086: Effects 1041-1046
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1041
|
||||
- `argsNum`: `2`
|
||||
- `info`: `造成的攻击伤害若低于{0}则令对手下{1}次使用的攻击技能无效`
|
||||
|
||||
### Effect 1042
|
||||
- `argsNum`: `1`
|
||||
- `info`: `{0}回合内每回合自身技能消除对手能力提升状态`
|
||||
|
||||
### Effect 1043
|
||||
- `argsNum`: `1`
|
||||
- `info`: `反转自身能力下降状态,反转成功则{0}回合受到的伤害转化为自身体力`
|
||||
|
||||
### Effect 1045
|
||||
- `argsNum`: `1`
|
||||
- `info`: `未击败对手则附加自身最大体力1/{0}的百分比伤害`
|
||||
|
||||
### Effect 1046
|
||||
- `argsNum`: `1`
|
||||
- `info`: `若对手不处于异常状态则附加对手最大体力1/{0}的百分比伤害`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,37 +0,0 @@
|
||||
# Task 088: Effects 1052-1056
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1052
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手能力提升状态,消除成功则令自身全属性+{0}`
|
||||
|
||||
### Effect 1053
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}回合内对手使用攻击技能后使对手{1},未触发则自身恢复最大体力的1/{2}`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 1054
|
||||
- `argsNum`: `1`
|
||||
- `info`: `反转自身能力下降状态,反转成功则对手{0}`
|
||||
- `param`: `1,0,0`
|
||||
|
||||
### Effect 1055
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手能力提升状态,消除成功则下{0}回合令对手使用的攻击技能无效`
|
||||
|
||||
### Effect 1056
|
||||
- `argsNum`: `1`
|
||||
- `info`: `反转自身能力下降状态,反转成功则{0}回合内令对手使用的属性技能无效`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 089: Effects 1057-1061
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1057
|
||||
- `argsNum`: `1`
|
||||
- `info`: `{0}回合内若自身能力提升状态消失,则消除对手回合类效果`
|
||||
|
||||
### Effect 1058
|
||||
- `argsNum`: `3`
|
||||
- `info`: `命中则{0}%概率使对手{1},未触发则对手{2}回合内攻击技能无效`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 1059
|
||||
- `argsNum`: `5`
|
||||
- `info`: `牺牲自身全部体力,{0}%令对方进入{1}种控制类异常状态,令自身下只出场精灵{2}回合内攻击伤害提升{3}%且先制+{4}`
|
||||
|
||||
### Effect 1060
|
||||
- `argsNum`: `1`
|
||||
- `info`: `吸取对手能力提升状态,吸取成功则下{0}回合对手攻击技能无效`
|
||||
|
||||
### Effect 1061
|
||||
- `argsNum`: `0`
|
||||
- `info`: `反转对手能力提升状态,反转成功则自身附加相同的能力提升,反转失败则消除对手能力提升状态`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 090: Effects 1062-1066
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1062
|
||||
- `argsNum`: `1`
|
||||
- `info`: `吸取对手能力提升状态,吸取成功则吸取对手最大体力的1/{0}`
|
||||
|
||||
### Effect 1063
|
||||
- `argsNum`: `1`
|
||||
- `info`: `对王·战联造成的伤害提高{0}%`
|
||||
|
||||
### Effect 1064
|
||||
- `argsNum`: `1`
|
||||
- `info`: `对大暗黑天长老造成的伤害提高{0}%`
|
||||
|
||||
### Effect 1065
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}回合内每回合使用技能恢复自身最大体力的1/{1}并造成等量百分比伤害,恢复体力时若自身体力低于最大体力的1/{2}则恢复效果和百分比伤害翻倍`
|
||||
|
||||
### Effect 1066
|
||||
- `argsNum`: `3`
|
||||
- `info`: `造成的伤害低于{0}则附加{1}点固定伤害,若先出手则固定伤害提高{2}点`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 091: Effects 1067-1071
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1067
|
||||
- `argsNum`: `4`
|
||||
- `info`: `{0}回合内每回合使用技能恢复自身最大体力的1/{1},恢复体力时若自身体力低于最大体力的1/{2}则恢复效果转变为吸取对手最大体力的1/{3}`
|
||||
|
||||
### Effect 1068
|
||||
- `argsNum`: `2`
|
||||
- `info`: `下{0}回合受到致命伤害时残留{1}点体力`
|
||||
|
||||
### Effect 1069
|
||||
- `argsNum`: `1`
|
||||
- `info`: `反转自身能力下降状态,反转成功则{0}回合内躲避所有攻击`
|
||||
|
||||
### Effect 1070
|
||||
- `argsNum`: `0`
|
||||
- `info`: `对手处于能力下降状态时自身先制+1`
|
||||
|
||||
### Effect 1071
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}回合内若对手恢复体力(药剂恢复除外),则{1}回合内自身攻击附加{2}点固定伤害`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 092: Effects 1072-1076
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1072
|
||||
- `argsNum`: `3`
|
||||
- `info`: `附加自身当前体力{0}%的百分比伤害,连续使用每次增加{1}%,最高{2}%`
|
||||
|
||||
### Effect 1073
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内受到的伤害大于{1}则主动恢复自身全部体力并造成等同于恢复量的固定伤害`
|
||||
|
||||
### Effect 1074
|
||||
- `argsNum`: `6`
|
||||
- `info`: `造成的伤害大于{0}则对手{1}%{2},未触发则自身下{3}回合攻击有{4}%的概率使对手{5}`
|
||||
- `param`: `1,2,2|1,5,5`
|
||||
|
||||
### Effect 1075
|
||||
- `argsNum`: `2`
|
||||
- `info`: `恢复自身最大体力的1/{0},自身体力低于1/{1}时回满`
|
||||
|
||||
### Effect 1076
|
||||
- `argsNum`: `0`
|
||||
- `info`: `对手不处于能力提升状态时先制+2`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,37 +0,0 @@
|
||||
# Task 093: Effects 1077-1081
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1077
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}回合内对手使用攻击技能后使对手{1},未触发则对手下{2}回合属性技能命中效果失效`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 1078
|
||||
- `argsNum`: `3`
|
||||
- `info`: `使对手随机进入{0}种异常状态,未触发则下{1}回合自身属性技能先制+{2}`
|
||||
|
||||
### Effect 1079
|
||||
- `argsNum`: `4`
|
||||
- `info`: `命中后{0}%令对手{1},未触发则下{2}回合自身攻击技能先制+{3}`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 1080
|
||||
- `argsNum`: `0`
|
||||
- `info`: `连续使用时先制+1`
|
||||
|
||||
### Effect 1081
|
||||
- `argsNum`: `0`
|
||||
- `info`: `若对手处于能力提升状态则先制+1`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 094: Effects 1082-1086
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1082
|
||||
- `argsNum`: `2`
|
||||
- `info`: `造成的伤害低于{0}则附加自身最大体力{1}%的百分比伤害`
|
||||
|
||||
### Effect 1083
|
||||
- `argsNum`: `0`
|
||||
- `info`: `若后出手则消除对手回合类效果`
|
||||
|
||||
### Effect 1084
|
||||
- `argsNum`: `1`
|
||||
- `info`: `附加{0}点固定伤害,对手处于异常状态时固定伤害翻倍`
|
||||
|
||||
### Effect 1085
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}回合内受到的伤害低于{1}则附加{2}点固定伤害`
|
||||
|
||||
### Effect 1086
|
||||
- `argsNum`: `1`
|
||||
- `info`: `自身体力低于对手时造成的伤害提高{0}%`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 095: Effects 1087-1091
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1087
|
||||
- `argsNum`: `1`
|
||||
- `info`: `反转自身能力下降状态,反转成功则对手下{0}回合技能无效`
|
||||
|
||||
### Effect 1088
|
||||
- `argsNum`: `2`
|
||||
- `info`: `造成的攻击伤害高于{0}则吸取对手最大体力的1/{1}`
|
||||
|
||||
### Effect 1089
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内对手使用攻击技能后随机附加给对手{1}种异常状态`
|
||||
|
||||
### Effect 1090
|
||||
- `argsNum`: `1`
|
||||
- `info`: `击败对手则{0}回合内令对手攻击技能无法造成伤害且命中效果失效`
|
||||
|
||||
### Effect 1091
|
||||
- `argsNum`: `1`
|
||||
- `info`: `未击败对手则自身下{0}回合免疫并反弹异常状态`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 096: Effects 1092-1096
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1092
|
||||
- `argsNum`: `2`
|
||||
- `info`: `后出手时使对手{0},未触发则附加自身当前体力1/{1}的百分比伤害`
|
||||
- `param`: `1,0,0`
|
||||
|
||||
### Effect 1093
|
||||
- `argsNum`: `1`
|
||||
- `info`: `出手时若自身体力低于对手则恢复自身最大体力的1/{0}`
|
||||
|
||||
### Effect 1094
|
||||
- `argsNum`: `0`
|
||||
- `info`: `消除对手回合类效果,消除成功则令对手随机2项技能PP值归零;消除对手能力提升状态,消除成功则令自身下2回合使用技能触发星皇之怒的概率提升20%;技能结束后对手体力值高于0,则50%进行一次额外行动以触发星皇之怒(星皇之怒:若对手不处于能力提升状态则附加对手最大体力1/3的百分比伤害)`
|
||||
|
||||
### Effect 1095
|
||||
- `argsNum`: `0`
|
||||
- `info`: `3回合内若对手使用属性技能则命中前令对手所有技能随机降低1-3点PP值;3回合内若对手使用攻击技能则使用后受到对手最大体力1/3的百分比伤害;己方免疫下2次受到的异常状态;技能结束后对手体力值高于0,则50%进行一次额外行动以触发星皇之怒(星皇之怒:令自身2回合内回合类效果无法被消除(后出手则延续至下2回合);下2回合自身所有技能先制+2)`
|
||||
|
||||
### Effect 1096
|
||||
- `argsNum`: `0`
|
||||
- `info`: `全属性+1,自身当前体力低于最大体力的1/2时强化效果翻倍;4回合内每回合使用技能吸取对手最大体力的1/3,吸取体力时若自身体力低于最大体力的1/2则吸取效果翻倍;自身下2次使用技能触发星皇之怒的概率翻倍;技能结束后对手体力值高于0,则50%进行一次额外行动以触发星皇之怒(星皇之怒:下2回合自身造成的攻击伤害翻倍;下2次自身受到的攻击伤害额外减少50%)`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 100: Effects 1112-1116
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1112
|
||||
- `argsNum`: `1`
|
||||
- `info`: `先出手时随机附加{0}种控制类异常状态`
|
||||
|
||||
### Effect 1113
|
||||
- `argsNum`: `0`
|
||||
- `info`: `技能命中后消除自身能力提升状态`
|
||||
|
||||
### Effect 1114
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手回合类效果,消除成功则令对手随机{0}项技能PP值归零`
|
||||
|
||||
### Effect 1115
|
||||
- `argsNum`: `1`
|
||||
- `info`: `解除自身能力下降状态,解除成功则令对手下{0}次使用的攻击技能无效`
|
||||
|
||||
### Effect 1116
|
||||
- `argsNum`: `1`
|
||||
- `info`: `随机附加{0}种异常状态,未触发则消除对手回合类效果`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 101: Effects 1117-1121
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1117
|
||||
- `argsNum`: `0`
|
||||
- `info`: `若自身体力低于最大体力的1/2则先制+2`
|
||||
|
||||
### Effect 1118
|
||||
- `argsNum`: `4`
|
||||
- `info`: `{0}回合内对手若使用攻击技能则{1}%{2},若使用属性技能则全属性-{3}`
|
||||
- `param`: `1,2,2`
|
||||
|
||||
### Effect 1119
|
||||
- `argsNum`: `2`
|
||||
- `info`: `消除双方能力提升状态,消除任意一方成功则使自身下{0}回合先制+{1}`
|
||||
|
||||
### Effect 1120
|
||||
- `argsNum`: `2`
|
||||
- `info`: `造成的伤害低于{0}则为自身附加{1}点护盾`
|
||||
|
||||
### Effect 1121
|
||||
- `argsNum`: `2`
|
||||
- `info`: `下{0}次受到的固定伤害和百分比伤害减少{1}%`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 102: Effects 1122-1126
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1122
|
||||
- `argsNum`: `2`
|
||||
- `info`: `使对手全属性-{0},未触发则对手{1}`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 1123
|
||||
- `argsNum`: `2`
|
||||
- `info`: `吸取对手能力提升状态,吸取成功则下{0}回合自身所有技能先制+{1}`
|
||||
|
||||
### Effect 1124
|
||||
- `argsNum`: `2`
|
||||
- `info`: `消除对手回合类效果,消除成功则自身下{0}回合造成的攻击伤害额外提升{1}%`
|
||||
|
||||
### Effect 1125
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内对手所有攻击必定Miss,若对手命中则下{1}回合对手使用属性技能无效`
|
||||
|
||||
### Effect 1126
|
||||
- `argsNum`: `2`
|
||||
- `info`: `使对手随机{0}项技能PP值归零,若当回合受到攻击则额外使对手随机{1}项技能PP值归零`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 103: Effects 1127-1131
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1127
|
||||
- `argsNum`: `1`
|
||||
- `info`: `吸取对手能力提升状态,若对手不处于能力提升状态则使对手全属性-{0}`
|
||||
|
||||
### Effect 1128
|
||||
- `argsNum`: `1`
|
||||
- `info`: `击败对手则令对手下{0}次使用的攻击技能无效`
|
||||
|
||||
### Effect 1129
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}%概率伤害为{1}倍,自身处于能力提升状态时概率翻倍`
|
||||
|
||||
### Effect 1130
|
||||
- `argsNum`: `1`
|
||||
- `info`: `使对手全属性-{0},自身体力低于对手时弱化效果翻倍`
|
||||
|
||||
### Effect 1131
|
||||
- `argsNum`: `4`
|
||||
- `info`: `随机附加{0}-{1}点固定伤害,自身处于能力提升状态时变为{2}-{3}点固定伤害`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 104: Effects 1132-1136
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1132
|
||||
- `argsNum`: `4`
|
||||
- `info`: `随机恢复自身{0}-{1}点体力,自身不处于能力提升状态时变为{2}-{3}点体力`
|
||||
|
||||
### Effect 1133
|
||||
- `argsNum`: `2`
|
||||
- `info`: `对手每有{0}项能力等级与自身相同则附加{1}点固定伤害`
|
||||
|
||||
### Effect 1134
|
||||
- `argsNum`: `1`
|
||||
- `info`: `将自身能力下降状态反馈给对手,反馈失败则令自身全属性+{0}`
|
||||
|
||||
### Effect 1135
|
||||
- `argsNum`: `1`
|
||||
- `info`: `若自身当前体力低于最大体力的1/{0}则恢复自身全部体力并造成等量固定伤害`
|
||||
|
||||
### Effect 1136
|
||||
- `argsNum`: `2`
|
||||
- `info`: `自身体力高于1/{0}时附加自身当前体力1/{1}的百分比伤害`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,39 +0,0 @@
|
||||
# Task 105: Effects 1137-1141
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1137
|
||||
- `argsNum`: `2`
|
||||
- `info`: `自身体力低于1/{0}时吸取对手最大体力的1/{1}`
|
||||
|
||||
### Effect 1138
|
||||
- `argsNum`: `4`
|
||||
- `info`: `消除对手回合类效果,消除成功则{0}%令对手{1},未触发则{2}%令对手{3}`
|
||||
- `param`: `1,1,1|1,3,3`
|
||||
|
||||
### Effect 1139
|
||||
- `argsNum`: `3`
|
||||
- `info`: `消除敌我双方回合类效果并同时进入{0}回合{1},自身{2}状态解除后则恢复自身所有体力`
|
||||
- `param`: `1,1,1|1,2,2`
|
||||
|
||||
### Effect 1140
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内对手使用攻击技能则{1}`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 1141
|
||||
- `argsNum`: `7`
|
||||
- `info`: `1回合做{0}~{1}次攻击,每次攻击{2}%令对手{3},攻击低于{4}次则每次攻击{5}%令对手{6}`
|
||||
- `param`: `1,3,3|1,6,6`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 106: Effects 1142-1147
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1142
|
||||
- `argsNum`: `2`
|
||||
- `info`: `回合结束时将自身当前体力降低为{0},并附加本次降低体力值{1}%的百分比伤害`
|
||||
|
||||
### Effect 1143
|
||||
- `argsNum`: `3`
|
||||
- `info`: `对手处于异常状态时附加{0}点固定伤害,不处于异常状态则下{1}回合使对手随机进入烧伤、冻伤、冰封、焚烬中的{2}种异常状态`
|
||||
|
||||
### Effect 1144
|
||||
- `argsNum`: `2`
|
||||
- `info`: `附加{0}~{1}点固定伤害并恢复等量体力`
|
||||
|
||||
### Effect 1145
|
||||
- `argsNum`: `1`
|
||||
- `info`: `令双方全属性+{0}`
|
||||
|
||||
### Effect 1147
|
||||
- `argsNum`: `0`
|
||||
- `info`: `未击败对手则消除对手能力提升状态`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 107: Effects 1148-1152
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1148
|
||||
- `argsNum`: `2`
|
||||
- `info`: `随机吸取对手{0}-{1}点体力`
|
||||
|
||||
### Effect 1149
|
||||
- `argsNum`: `1`
|
||||
- `info`: `若先出手则将本回合受到的攻击伤害{0}%反馈给对手(双方同时死亡时对手残留1点体力)`
|
||||
|
||||
### Effect 1150
|
||||
- `argsNum`: `6`
|
||||
- `info`: `消除对手能力上升状态,消除成功对手{0}`
|
||||
- `param`: `0,0,0`
|
||||
|
||||
### Effect 1151
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内若对手使用攻击技能则自身全属性+{1}`
|
||||
|
||||
### Effect 1152
|
||||
- `argsNum`: `1`
|
||||
- `info`: `自身不处于能力提升状态则造成的伤害提升{0}%`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 108: Effects 1153-1157
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1153
|
||||
- `argsNum`: `2`
|
||||
- `info`: `解除自身能力下降状态,解除成功则自身下{0}回合受到的伤害减少{1}点`
|
||||
|
||||
### Effect 1154
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内使用技能附加{1}点固定伤害,若自身体力低于对手则效果翻倍`
|
||||
|
||||
### Effect 1155
|
||||
- `argsNum`: `3`
|
||||
- `info`: `附加自身最大体力值{0}%的百分比伤害,连续使用每次增加{1}%,最高{2}%`
|
||||
|
||||
### Effect 1156
|
||||
- `argsNum`: `0`
|
||||
- `info`: `击败对手则恢复自身全部体力和所有技能PP值`
|
||||
|
||||
### Effect 1157
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除双方能力提升、下降状态,消除任意一方成功则使对手下{0}次施放的技能无效(包括必中技能)`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 109: Effects 1158-1162
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1158
|
||||
- `argsNum`: `2`
|
||||
- `info`: `自身每处于{0}种能力提升状态则附加{1}点固定伤害,遇到天敌时效果翻倍`
|
||||
|
||||
### Effect 1159
|
||||
- `argsNum`: `1`
|
||||
- `info`: `吸取对手能力提升状态,吸取成功则自身免疫下{0}次受到的异常状态`
|
||||
|
||||
### Effect 1160
|
||||
- `argsNum`: `3`
|
||||
- `info`: `获得{0}点护盾,护盾消失时吸取对手{1}点体力且令对手随机{2}个技能的PP值归零`
|
||||
|
||||
### Effect 1161
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内若对手恢复体力则自身恢复等量体力的{1}%`
|
||||
|
||||
### Effect 1162
|
||||
- `argsNum`: `6`
|
||||
- `info`: `{0}回合内每回合都有{1}%概率令对手{2},未触发{3}则下{4}次受到的伤害减少{5}点`
|
||||
- `param`: `1,2,2|1,3,3`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 110: Effects 1163-1167
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1163
|
||||
- `argsNum`: `3`
|
||||
- `info`: `附加自身特攻值与速度值总和{0}%的百分比伤害,每次使用增加{1}%,最高{2}%`
|
||||
|
||||
### Effect 1164
|
||||
- `argsNum`: `0`
|
||||
- `info`: `反转对手能力提升状态,若该效果未满足条件或反转失败则消除对手能力提升状态和回合类效果`
|
||||
|
||||
### Effect 1165
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内若对手使用攻击技能,则使用攻击技能后的下{1}回合属性技能命中效果失效`
|
||||
|
||||
### Effect 1166
|
||||
- `argsNum`: `2`
|
||||
- `info`: `解除自身能力下降效果,解除成功则下{0}回合先制+{1}`
|
||||
|
||||
### Effect 1167
|
||||
- `argsNum`: `0`
|
||||
- `info`: `解除自身能力下降状态,解除成功则恢复自身所有体力`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 111: Effects 1168-1172
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1168
|
||||
- `argsNum`: `1`
|
||||
- `info`: `全属性+{0},双方任意一方处于异常状态则强化效果翻倍`
|
||||
|
||||
### Effect 1169
|
||||
- `argsNum`: `1`
|
||||
- `info`: `若自身处于异常状态则造成的攻击伤害额外提升{0}%且回合结束后解除自身所有异常状态`
|
||||
|
||||
### Effect 1170
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除对手能力提升状态,消除成功则附加{0}点固定伤害`
|
||||
|
||||
### Effect 1171
|
||||
- `argsNum`: `2`
|
||||
- `info`: `未击败对手则使自身下{0}回合受到的伤害减少{1}点`
|
||||
|
||||
### Effect 1172
|
||||
- `argsNum`: `10`
|
||||
- `info`: `{0}回合做{1}~{2}次攻击,每次攻击都有{3}%的概率令自身{4}`
|
||||
- `param`: `0,4,4`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 112: Effects 1173-1177
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1173
|
||||
- `argsNum`: `1`
|
||||
- `info`: `未击败对手则回合结束后附加对手最大体力1/{0}的百分比伤害(自身体力为0时也可触发)`
|
||||
|
||||
### Effect 1174
|
||||
- `argsNum`: `0`
|
||||
- `info`: `若自身处于能力提升状态则先制+2`
|
||||
|
||||
### Effect 1175
|
||||
- `argsNum`: `2`
|
||||
- `info`: `获得{0}点护盾,护盾消失时恢复自身最大体力的1/{1}`
|
||||
|
||||
### Effect 1176
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}%概率伤害为{1}倍,未触发则附加{2}点固定伤害`
|
||||
|
||||
### Effect 1177
|
||||
- `argsNum`: `0`
|
||||
- `info`: `自身处于能力提升状态则使自身能力提升状态翻倍`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 113: Effects 1178-1182
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1178
|
||||
- `argsNum`: `0`
|
||||
- `info`: `自身不处于能力提升状态则造成的伤害翻倍`
|
||||
|
||||
### Effect 1179
|
||||
- `argsNum`: `2`
|
||||
- `info`: `消除对手回合类效果,消除成功则自身下{0}次攻击技能造成的伤害额外提升{1}%`
|
||||
|
||||
### Effect 1180
|
||||
- `argsNum`: `1`
|
||||
- `info`: `吸取对手能力提升状态,吸取成功则自身下{0}回合必定致命一击`
|
||||
|
||||
### Effect 1181
|
||||
- `argsNum`: `4`
|
||||
- `info`: `{0}回合内每回合使用技能{1}%令对手{2},未触发则令对手全属性-{3}`
|
||||
- `param`: `1,2,2`
|
||||
|
||||
### Effect 1182
|
||||
- `argsNum`: `2`
|
||||
- `info`: `牺牲自己进行自爆,将对手体力降为{0}点,令我方下一只出场精灵获得{1}次奇迹之力效果`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 114: Effects 1183-1187
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1183
|
||||
- `argsNum`: `2`
|
||||
- `info`: `解除自身能力下降状态,解除成功则自身{0}回合内造成的伤害提高{1}%`
|
||||
|
||||
### Effect 1184
|
||||
- `argsNum`: `1`
|
||||
- `info`: `激发自身潜能,使用后下{0}回合自身获得奇迹之力效果`
|
||||
|
||||
### Effect 1185
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消耗自身当前最大体力的1/{0}并使对手受到等量百分比伤害`
|
||||
|
||||
### Effect 1186
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内每回合攻击附加自身双防值总和{1}%的百分比伤害`
|
||||
|
||||
### Effect 1187
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}%令对手{1},未触发则消除对手回合类效果`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,37 +0,0 @@
|
||||
# Task 115: Effects 1188-1192
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1188
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}回合内自身受到攻击则使对手{1},未触发则吸取对手最大体力的1/{2}`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 1189
|
||||
- `argsNum`: `1`
|
||||
- `info`: `后出手时吸取对手{0}点体力`
|
||||
|
||||
### Effect 1190
|
||||
- `argsNum`: `6`
|
||||
- `info`: `消除对手回合类效果,消除成功对手{0}`
|
||||
- `param`: `0,0,0`
|
||||
|
||||
### Effect 1191
|
||||
- `argsNum`: `1`
|
||||
- `info`: `100%令自身全属性-{0}`
|
||||
|
||||
### Effect 1192
|
||||
- `argsNum`: `0`
|
||||
- `info`: `将自身能力下降状态反馈给对手,反馈失败则解除自身能力下降状态`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 116: Effects 1193-1197
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1193
|
||||
- `argsNum`: `2`
|
||||
- `info`: `当自身血量少于1/2时先制+2`
|
||||
|
||||
### Effect 1194
|
||||
- `argsNum`: `1`
|
||||
- `info`: `反转自身能力下降状态,反转成功则自身{0}回合内免疫能力下降状态`
|
||||
|
||||
### Effect 1195
|
||||
- `argsNum`: `4`
|
||||
- `info`: `{0}回合内自身受到攻击{1}%使对手{2},若未触发则对手受到{3}点固定伤害`
|
||||
- `param`: `1,2,2`
|
||||
|
||||
### Effect 1196
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}回合内每回合{1}%令对手使用的攻击技能无效,未触发则令对手下{2}次使用的属性技能无效`
|
||||
|
||||
### Effect 1197
|
||||
- `argsNum`: `3`
|
||||
- `info`: `获得{0}点护盾,护盾消失时附加{1}点固定伤害同时使自身下{2}次攻击造成的伤害翻倍`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,37 +0,0 @@
|
||||
# Task 117: Effects 1198-1202
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1198
|
||||
- `argsNum`: `1`
|
||||
- `info`: `对手不处于能力下降状态则造成的伤害提高{0}%`
|
||||
|
||||
### Effect 1199
|
||||
- `argsNum`: `1`
|
||||
- `info`: `吸取对手能力提升状态,吸取成功则对手{0}回合内无法通过自身技能恢复体力`
|
||||
|
||||
### Effect 1200
|
||||
- `argsNum`: `3`
|
||||
- `info`: `{0}回合内受到攻击则{1}%对手{2},未触发则消除对手回合类效果`
|
||||
- `param`: `1,2,2`
|
||||
|
||||
### Effect 1201
|
||||
- `argsNum`: `4`
|
||||
- `info`: `先出手时{0}%使对手{1},未触发则下{2}回合自身先制+{3}`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 1202
|
||||
- `argsNum`: `3`
|
||||
- `info`: `造成的伤害低于{0}则自身下{1}次受到的伤害降低{2}点`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 118: Effects 1203-1207
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1203
|
||||
- `argsNum`: `3`
|
||||
- `info`: `造成的伤害低于{0}则自身下{1}次技能先制+{2}`
|
||||
|
||||
### Effect 1204
|
||||
- `argsNum`: `1`
|
||||
- `info`: `自身下{0}次攻击必定致命一击`
|
||||
|
||||
### Effect 1205
|
||||
- `argsNum`: `1`
|
||||
- `info`: `后出手时自身全属性+{0}`
|
||||
|
||||
### Effect 1206
|
||||
- `argsNum`: `3`
|
||||
- `info`: `附加自身最大体力{0}%的百分比伤害,每次使用增加{1}%,最高{2}%`
|
||||
|
||||
### Effect 1207
|
||||
- `argsNum`: `2`
|
||||
- `info`: `双倍吸取对手能力提升状态,吸取成功则使对手下{0}回合先制-{1}`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,36 +0,0 @@
|
||||
# Task 119: Effects 1208-1212
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1208
|
||||
- `argsNum`: `1`
|
||||
- `info`: `反转自身能力下降状态,反转成功则令对手下{0}次使用的攻击技能无效`
|
||||
|
||||
### Effect 1209
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除双方能力上升、下降状态,消除成功则附加消除总段数乘以{0}的固定伤害`
|
||||
|
||||
### Effect 1210
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}%使对手{1},自身体力低于对手时概率翻倍`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 1211
|
||||
- `argsNum`: `1`
|
||||
- `info`: `消除双方能力提升状态及能力下降状态,消除任意一方成功则为自身附加{0}点护盾`
|
||||
|
||||
### Effect 1212
|
||||
- `argsNum`: `3`
|
||||
- `info`: `消耗自身全部体力,使己方下只出战精灵令对手下{0}次使用的攻击技能无效且{1}回合内造成的攻击伤害额外提升{2}%`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,35 +0,0 @@
|
||||
# Task 140: Effects 1313-1317
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1313
|
||||
- `argsNum`: `1`
|
||||
- `info`: `命中后使对手受到{0}点固定伤害,未命中则自身死亡,同时使对手下次施放的技能无效(包括必中技能)`
|
||||
|
||||
### Effect 1314
|
||||
- `argsNum`: `1`
|
||||
- `info`: `令自身下{0}次受到的攻击伤害转化为体力`
|
||||
|
||||
### Effect 1315
|
||||
- `argsNum`: `1`
|
||||
- `info`: `{0}%的概率打出致命一击`
|
||||
|
||||
### Effect 1316
|
||||
- `argsNum`: `2`
|
||||
- `info`: `先出手时令自身随机{0}项属性+{1}`
|
||||
|
||||
### Effect 1317
|
||||
- `argsNum`: `1`
|
||||
- `info`: `后出手时恢复自身最大体力的1/{0}`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
@@ -1,38 +0,0 @@
|
||||
# Task 141: Effects 1318-1322
|
||||
|
||||
## 目标
|
||||
|
||||
- 补齐以下 5 个(或最后一组不足 5 个)当前判定未实现的 skill effect。
|
||||
- 实现位置优先放在 `logic/service/fight/effect/`。
|
||||
- 如 effect 需要展示说明,同步更新 `logic/service/fight/effect/effect_info_map.go`。
|
||||
- 完成后至少执行:`cd /workspace/logic && go test ./service/fight/effect`。
|
||||
|
||||
## Effect 列表
|
||||
|
||||
### Effect 1318
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}%的概率秒杀对手,未触发则令对手全属性-{1}`
|
||||
|
||||
### Effect 1319
|
||||
- `argsNum`: `6`
|
||||
- `info`: `自身下次被击败后下一只出场的精灵{0}`
|
||||
- `param`: `0,0,0`
|
||||
|
||||
### Effect 1320
|
||||
- `argsNum`: `2`
|
||||
- `info`: `{0}回合内若对手攻击MISS则回合结束时吸取对手最大体力的1/{1}`
|
||||
|
||||
### Effect 1321
|
||||
- `argsNum`: `2`
|
||||
- `info`: `解除自身能力下降状态并消除对手提升状态,消除任意一项成功则{0}%对手{1}`
|
||||
- `param`: `1,1,1`
|
||||
|
||||
### Effect 1322
|
||||
- `argsNum`: `4`
|
||||
- `info`: `{0}回合内受到攻击则{1}%使对手进入{2},未触发则使对手全属性-{3}`
|
||||
- `param`: `1,2,2`
|
||||
|
||||
## 备注
|
||||
|
||||
- 该清单按当前仓库静态注册结果生成;如果某个 effect 实际通过其他模块或运行时路径实现,需要先复核后再落代码。
|
||||
- 对 `201`、`445` 这类占位 effect,优先补核心逻辑或补充明确的不可实现说明。
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user