Skip to content

Commit

Permalink
fix: 修复若干dnd5e检定行为异常,以及pc指令改名异常 (sealdice#891)
Browse files Browse the repository at this point in the history
  • Loading branch information
fy0 authored Jul 11, 2024
1 parent 343a093 commit ed1cb94
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 23 deletions.
18 changes: 13 additions & 5 deletions dice/builtin_commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -1778,6 +1778,11 @@ func (d *Dice) registerCoreCommands() {
return id
}

setCurPlayerName := func(name string) {
ctx.Player.Name = name
ctx.Player.UpdatedAtTime = time.Now().Unix()
}

switch val1 {
case "list", "lst":
list := lo.Must(am.GetCharacterList(ctx.Player.UserID))
Expand Down Expand Up @@ -1819,6 +1824,7 @@ func (d *Dice) registerCoreCommands() {
if !am.CharCheckExists(ctx.Player.UserID, name) {
item := lo.Must(am.CharNew(ctx.Player.UserID, name, ctx.Group.System))
lo.Must0(am.CharBind(item.Id, ctx.Group.GroupID, ctx.Player.UserID))
setCurPlayerName(name) // 修改当前角色名

ReplyToSender(ctx, msg, DiceFormatTmpl(ctx, "核心:角色管理_新建"))
} else {
Expand Down Expand Up @@ -1846,7 +1852,10 @@ func (d *Dice) registerCoreCommands() {
if !am.CharCheckExists(ctx.Player.UserID, b) {
attrs := lo.Must(am.LoadById(charId))
attrs.Name = b
ctx.Player.Name = b
if charId == getBindingId() {
// 如果是当前绑定的ID,连名字一起改
setCurPlayerName(b)
}
attrs.LastModifiedTime = time.Now().Unix()
attrs.SaveToDB(am.db, nil) // 直接保存
ReplyToSender(ctx, msg, "操作完成")
Expand All @@ -1871,6 +1880,7 @@ func (d *Dice) registerCoreCommands() {
ReplyToSender(ctx, msg, DiceFormatTmpl(ctx, "核心:角色管理_绑定_失败"))
} else {
lo.Must0(am.CharBind(charId, ctx.Group.GroupID, ctx.Player.UserID))
setCurPlayerName(name)
ReplyToSender(ctx, msg, DiceFormatTmpl(ctx, "核心:角色管理_绑定_成功"))
}
} else {
Expand All @@ -1879,12 +1889,11 @@ func (d *Dice) registerCoreCommands() {
if charId == "" {
ReplyToSender(ctx, msg, DiceFormatTmpl(ctx, "核心:角色管理_绑定_并未绑定"))
} else {
ctx.Player.Name = name
ctx.Player.UpdatedAtTime = time.Now().Unix()
lo.Must0(am.CharBind("", ctx.Group.GroupID, ctx.Player.UserID))
attrs := lo.Must(am.LoadById(charId))

name := attrs.Name
setCurPlayerName(name)
VarSetValueStr(ctx, "$t角色名", name)
ReplyToSender(ctx, msg, DiceFormatTmpl(ctx, "核心:角色管理_绑定_解除"))
}
Expand Down Expand Up @@ -1912,8 +1921,7 @@ func (d *Dice) registerCoreCommands() {
return true
})

ctx.Player.Name = name
ctx.Player.UpdatedAtTime = time.Now().Unix()
setCurPlayerName(name)

if ctx.Player.AutoSetNameTemplate != "" {
_, _ = SetPlayerGroupCardByTemplate(ctx, ctx.Player.AutoSetNameTemplate)
Expand Down
8 changes: 4 additions & 4 deletions dice/ext_dnd5e.go
Original file line number Diff line number Diff line change
Expand Up @@ -322,12 +322,12 @@ func RegisterBuiltinExtDnd5e(self *Dice) {
restText = strings.TrimSpace(restText[len(m):])
}
expr := fmt.Sprintf("D20%s + %s", m, restText)
ctx.CreateVmIfNotExists()
tmpl := ctx.Group.GetCharTemplate(ctx.Dice)
mctx.CreateVmIfNotExists()
tmpl := mctx.Group.GetCharTemplate(mctx.Dice)
mctx.Eval(tmpl.PreloadCode, nil)
ctx.setDndReadForVM(true)
mctx.setDndReadForVM(true)

r := ctx.Eval(expr, nil)
r := mctx.Eval(expr, nil)
if r.vm.Error != nil {
ReplyToSender(mctx, msg, "无法解析表达式: "+restText)
return CmdExecuteResult{Matched: true, Solved: true}
Expand Down
25 changes: 24 additions & 1 deletion dice/ext_dnd5e_template.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ var _dnd5eTmpl = &GameSystemTemplate{
},

PreloadCode: "func skillShowAs(val) {" +
" return `{val}{&val.base ? `[{&val.base}]`}`" +
" return `{val}[{&val.base}]`" +
"}" +
"func skillShowAsKey(key, val) {" +
" return `{key}{&val.factor ? '*'+ (&val.factor == 1 ? '' : str(&val.factor)) }`" +
Expand Down Expand Up @@ -120,6 +120,29 @@ var _dnd5eTmpl = &GameSystemTemplate{
"智力调整值": "abilityModifier('智力')",
"感知调整值": "abilityModifier('感知')",
"魅力调整值": "abilityModifier('魅力')",

"运动": "力量调整值",

"体操": "敏捷调整值",
"巧手": "敏捷调整值",
"隐匿": "敏捷调整值",

"调查": "智力调整值",
"奥秘": "智力调整值",
"历史": "智力调整值",
"自然": "智力调整值",
"宗教": "智力调整值",

"察觉": "感知调整值",
"洞悉": "感知调整值",
"驯兽": "感知调整值",
"医药": "感知调整值",
"求生": "感知调整值",

"游说": "魅力调整值",
"欺瞒": "魅力调整值",
"威吓": "魅力调整值",
"表演": "魅力调整值",
},

Alias: map[string][]string{
Expand Down
20 changes: 13 additions & 7 deletions dice/ext_exp.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func cmdStGetPickItemAndLimit(tmpl *GameSystemTemplate, cmdArgs *CmdArgs) (pickI
return pickItems, limit
}

func cmdStSortNamesByTmpl(mctx *MsgContext, tmpl *GameSystemTemplate, pickItems map[string]int, _ int64) (topNum int, items []string) {
func cmdStSortNamesByTmpl(mctx *MsgContext, tmpl *GameSystemTemplate, pickItems map[string]int, _ int64, isExport bool) (topNum int, items []string) {
attrs, _ := mctx.Dice.AttrsManager.LoadByCtx(mctx)
// 或者有pickItems,或者当前的变量数量大于0
if len(pickItems) > 0 || attrs.Len() > 0 {
Expand All @@ -66,10 +66,12 @@ func cmdStSortNamesByTmpl(mctx *MsgContext, tmpl *GameSystemTemplate, pickItems
if used[key] {
return true
}
for _, n := range tmpl.AttrConfig.Ignores {
// 跳过忽略项
if n == key {
return true
if !isExport {
for _, n := range tmpl.AttrConfig.Ignores {
// 跳过忽略项
if n == key {
return true
}
}
}
attrKeys2 = append(attrKeys2, key)
Expand Down Expand Up @@ -149,7 +151,7 @@ func cmdStGetItemsForShow(mctx *MsgContext, tmpl *GameSystemTemplate, pickItems
limitSkipCount := 0
items = []string{}

topNum, attrKeys := cmdStSortNamesByTmpl(mctx, tmpl, pickItems, limit)
topNum, attrKeys := cmdStSortNamesByTmpl(mctx, tmpl, pickItems, limit, false)

// 或者有pickItems,或者当前的变量数量大于0
if len(attrKeys) > 0 {
Expand Down Expand Up @@ -201,7 +203,7 @@ func cmdStGetItemsForExport(mctx *MsgContext, tmpl *GameSystemTemplate, stInfo *
// 修改自 cmdStGetItemsForShow
limitSkipCount := 0
items = []string{}
_, attrKeys := cmdStSortNamesByTmpl(mctx, tmpl, map[string]int{}, 0)
_, attrKeys := cmdStSortNamesByTmpl(mctx, tmpl, map[string]int{}, 0, true)

// 或者有pickItems,或者当前的变量数量大于0
if len(attrKeys) > 0 {
Expand Down Expand Up @@ -638,6 +640,10 @@ func getCmdStBase(soi CmdStOverrideInfo) *CmdItemInfo {
curVal := attrs.Load(i.name)
// 如果当前有值
if curVal == nil {
if i.extra != nil {
// 如果与预设相同,但有附加值,不排除有额外用途,因此计数+1
validNum++
}
// 与预设相同,放弃
continue
}
Expand Down
34 changes: 31 additions & 3 deletions dice/rollvm_migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -303,12 +303,27 @@ func (ctx *MsgContext) setDndReadForVM(rcMode bool) {
} else if dndAttrParent[varname] != "" && curVal.TypeId == ds.VMTypeInt {
name := dndAttrParent[varname]
base, err := ctx.SystemTemplate.GetRealValue(ctx, name)
v := curVal.MustReadInt()
if err == nil {
ab := tryLoadByBuff(ctx, name, base)
mod := ab.MustReadInt()/2 - 5

detail.Tag = "dnd-rc"
detail.Text = fmt.Sprintf("%s调整值%d", name, mod)
v -= mod

exprProficiency := fmt.Sprintf("&%s.factor * 熟练", varname)
skip = true
if ret2, _ := ctx.vm.RunExpr(exprProficiency, false); ret2 != nil {
// 注意: 这个值未必总能读到,如果ret2为nil,那么我们可以忽略这个加值的存在
detail.Text += fmt.Sprintf("+熟练%s", ret2.ToString())
if ret2.TypeId == ds.VMTypeInt {
v -= ret2.MustReadInt()
}
}
ctx.vm.Error = nil
skip = false
detail.Text += fmt.Sprintf("+%s%d", varname, v)
}
}
}
Expand All @@ -331,20 +346,33 @@ func (ctx *MsgContext) setDndReadForVM(rcMode bool) {

if detail != nil && detail.Tag != "" {
detail.Ret = ret
if ret2, _ := ctx.vm.RunExpr(stpName+" * (熟练??0)", false); ret2 != nil {

var detailParts []string
checkAndAppend := func(detailName string, ret2 *ds.VMValue) {
if ret2.TypeId == ds.VMTypeInt {
v := ret2.MustReadInt()
if v != 0 {
detail.Text = fmt.Sprintf("熟练+%d", v)
detailParts = append(detailParts, fmt.Sprintf("%s%d", detailName, v))
}
} else if ret2.TypeId == ds.VMTypeFloat {
v := ret2.MustReadFloat()
if v != 0 {
// 这里用toStr的原因是%f会打出末尾一大串0
detail.Text = fmt.Sprintf("熟练+%s", ret2.ToString())
detailParts = append(detailParts, fmt.Sprintf("%s%s", detailName, ret2.ToString()))
}
}
}

if ret2, _ := ctx.vm.RunExpr(fmt.Sprintf("(%s ?? 0 + %s ?? 0)/2-5", vName, "$buff_"+vName), false); ret2 != nil {
checkAndAppend("调整值", ret2)
}
ctx.vm.Error = nil
if ret2, _ := ctx.vm.RunExpr(stpName+" * (熟练??0)", false); ret2 != nil {
checkAndAppend("熟练", ret2)
}

detail.Text = strings.Join(detailParts, "+")
ctx.vm.Error = nil
}
return ret
}
Expand Down
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ require (
github.com/go-creed/sat v1.0.3
github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1
github.com/golang-module/carbon v1.7.3
github.com/gonutz/w32/v2 v2.11.1
github.com/google/uuid v1.6.0
github.com/gorilla/websocket v1.5.1
github.com/grokify/html-strip-tags-go v0.0.1
Expand Down Expand Up @@ -54,7 +55,7 @@ require (
github.com/samber/lo v1.44.0
github.com/schollz/progressbar/v3 v3.14.4
github.com/sealdice/botgo v0.0.0-20240102160217-e61d5bdfe083
github.com/sealdice/dicescript v0.0.0-20240702175100-960b24bd2054
github.com/sealdice/dicescript v0.0.0-20240711030920-345cdd748cf2
github.com/slack-go/slack v0.13.0
github.com/sunshineplan/imgconv v1.1.4
github.com/tailscale/hujson v0.0.0-20221223112325-20486734a56a
Expand Down
6 changes: 4 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,8 @@ github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/gonutz/w32/v2 v2.11.1 h1:plG738ZY7VIkPGf3adZ6lFeAf2evCKrULKyZT5GrPoc=
github.com/gonutz/w32/v2 v2.11.1/go.mod h1:MgtHx0AScDVNKyB+kjyPder4xIi3XAcHS6LDDU2DmdE=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
Expand Down Expand Up @@ -335,8 +337,8 @@ github.com/schollz/progressbar/v3 v3.14.4 h1:W9ZrDSJk7eqmQhd3uxFNNcTr0QL+xuGNI9d
github.com/schollz/progressbar/v3 v3.14.4/go.mod h1:aT3UQ7yGm+2ZjeXPqsjTenwL3ddUiuZ0kfQ/2tHlyNI=
github.com/sealdice/botgo v0.0.0-20240102160217-e61d5bdfe083 h1:s/jzCGYlM/0+TYTXwva5574EFnIv/ggPCoXHFpdbSUw=
github.com/sealdice/botgo v0.0.0-20240102160217-e61d5bdfe083/go.mod h1:MGtR0REQDslBwQE+Rln4P9iDjH/ZInlu5qzOLdvBWJU=
github.com/sealdice/dicescript v0.0.0-20240702175100-960b24bd2054 h1:/x8mmT4MBPS1V32BrVc8yEXSn6XQ6H/4c1qCurN/tjo=
github.com/sealdice/dicescript v0.0.0-20240702175100-960b24bd2054/go.mod h1:uof752qJvEQ4Kze+NVag+RKGgj5C4K3kMHoK3e2vOLg=
github.com/sealdice/dicescript v0.0.0-20240711030920-345cdd748cf2 h1:HxrxpbMuYtCzXh7gYyUPeoqUvraI7cSCdk8aGAcJyUE=
github.com/sealdice/dicescript v0.0.0-20240711030920-345cdd748cf2/go.mod h1:uof752qJvEQ4Kze+NVag+RKGgj5C4K3kMHoK3e2vOLg=
github.com/sealdice/kook v0.0.3 h1:STMtiKRMFjhSFmUxi0BU5ktNkCQ8qi7Y5EEfrmYKvWY=
github.com/sealdice/kook v0.0.3/go.mod h1:WjHC7AmbmNjInT/U/etBVOmAw7T6EqdCwApceRGs1sk=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
Expand Down

0 comments on commit ed1cb94

Please sign in to comment.