Skip to content

Commit

Permalink
chore: 钩子接口现在有ctx参数
Browse files Browse the repository at this point in the history
  • Loading branch information
fy0 committed Jul 2, 2024
1 parent 36f357b commit 960b24b
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 9 deletions.
2 changes: 1 addition & 1 deletion builtin_functions.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ func funcLoad(ctx *Context, this *VMValue, params []*VMValue) *VMValue {
}

if ctx.Config.HookFuncValueLoadOverwrite != nil {
val = ctx.Config.HookFuncValueLoadOverwrite(name, val, nil)
val = ctx.Config.HookFuncValueLoadOverwrite(ctx, name, val, nil)
}

return val.Clone()
Expand Down
2 changes: 1 addition & 1 deletion cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ func main() {
vm.Config.DefaultDiceSideExpr = "面数 ?? 50"
vm.Config.OpCountLimit = 30000

vm.Config.HookFuncValueLoad = func(name string) (string, *ds.VMValue) {
vm.Config.HookFuncValueLoad = func(ctx *ds.Context, name string) (string, *ds.VMValue) {
re := regexp.MustCompile(`^(困难|极难|大成功|常规|失败|困難|極難|常規|失敗)?([^\d]+)(\d+)?$`)
m := re.FindStringSubmatch(name)
var cocFlagVarPrefix string
Expand Down
7 changes: 4 additions & 3 deletions rollvm.go
Original file line number Diff line number Diff line change
Expand Up @@ -258,8 +258,9 @@ func (ctx *Context) makeDetailStr(details []BufferSpan) string {
}

exprText := last.Expr
baseExprText := string(detailResult[item.begin:item.end])
if last.Expr == "" {
exprText = string(detailResult[item.begin:item.end])
exprText = baseExprText
}

writeBuf(detailResult[:item.begin])
Expand All @@ -278,7 +279,7 @@ func (ctx *Context) makeDetailStr(details []BufferSpan) string {
}

detail += subDetailsText + "]"
if len(m) == 1 && detail == "["+exprText+"]" {
if len(m) == 1 && detail == "["+baseExprText+"]" {
detail = "" // 规则1.3
}
if len(detail) > 400 {
Expand Down Expand Up @@ -729,7 +730,7 @@ func (ctx *Context) evaluate() {

if ctx.Config.HookFuncValueLoadOverwrite != nil {
oldRet := details[len(details)-1].Ret
val = ctx.Config.HookFuncValueLoadOverwrite(name, val, &details[len(details)-1])
val = ctx.Config.HookFuncValueLoadOverwrite(ctx, name, val, &details[len(details)-1])
if oldRet == details[len(details)-1].Ret {
details[len(details)-1].Ret = val
}
Expand Down
18 changes: 18 additions & 0 deletions rollvm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1799,6 +1799,24 @@ func TestDetailText5(t *testing.T) {
}
}

func TestDetailText6(t *testing.T) {
vm := NewVM()
vm.Config.DiceMaxMode = true
err := vm.Run("d + 1")
if assert.NoError(t, err) {
assert.Equal(t, "100[D100] + 1", vm.GetDetailText())
}
}

func TestDetailText7(t *testing.T) {
vm := NewVM()
vm.Config.DiceMaxMode = true
err := vm.Run("d")
if assert.NoError(t, err) {
assert.Equal(t, "100[D100]", vm.GetDetailText())
}
}

func TestDiceAdvantage(t *testing.T) {
vm := NewVM()
vm.Config.DefaultDiceSideExpr = "1"
Expand Down
9 changes: 5 additions & 4 deletions types.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,13 @@ type RollConfig struct {
DisableStmts bool // 禁用语句语法(如if while等),仅允许表达式
DisableNDice bool // 禁用Nd语法,即只能2d6这样写,不能写2d

// 如果返回值为true,那么跳过剩下的储存流程。如果overwrite不为nil,对v进行覆盖
// 如果返回值为true,那么跳过剩下的储存流程。如果overwrite不为nil,对v进行覆盖。
// 另注: 钩子函数中含有ctx的原因是可能在函数中进行调用,此时ctx会发生变化
HookFuncValueStore func(ctx *Context, name string, v *VMValue) (overwrite *VMValue, solved bool)
// 如果overwrite不为nil,将结束值加载并使用overwrite值。如果为nil,将以newName为key进行加载
HookFuncValueLoad func(name string) (newName string, overwrite *VMValue)
HookFuncValueLoad func(ctx *Context, name string) (newName string, overwrite *VMValue)
// 读取后回调(返回值将覆盖之前读到的值。如果之前未读取到值curVal将为nil)
HookFuncValueLoadOverwrite func(name string, curVal *VMValue, detail *BufferSpan) *VMValue
HookFuncValueLoadOverwrite func(ctx *Context, name string, curVal *VMValue, detail *BufferSpan) *VMValue

// st回调,注意val和extra都经过clone,可以放心储存
CallbackSt func(_type string, name string, val *VMValue, extra *VMValue, op string, detail string) // st回调
Expand Down Expand Up @@ -291,7 +292,7 @@ func (ctx *Context) LoadNameLocal(name string, isRaw bool) *VMValue {
func (ctx *Context) LoadNameWithDetail(name string, isRaw bool, useHook bool, detail *BufferSpan) *VMValue {
if useHook && ctx.Config.HookFuncValueLoad != nil {
var overwrite *VMValue
name, overwrite = ctx.Config.HookFuncValueLoad(name)
name, overwrite = ctx.Config.HookFuncValueLoad(ctx, name)

if overwrite != nil {
// 使用弄进来的替代值进行计算
Expand Down

0 comments on commit 960b24b

Please sign in to comment.