Repository: sealdice/sealdice-core (language: go)

Issue:
[150 Bug/typo]: DnD rc/ra 检定表达式中出现笔误
### 在提问之前...

- [X] 我理解 Issue 是用于反馈和解决问题的，而非吐槽评论区，将尽可能提供更多信息帮助问题解决
- [X] 我填写了简短且清晰明确的标题，以便开发者在翻阅 issue 列表时能快速确定大致问题。而不是“一个建议”、“卡住了”等
- [X] 我已查看master branch或最新测试版的更新内容，并未提及该 bug 已被修复的情况
- [X] 已有issue中并没有看见其他人与我反馈相同的问题

### 问题描述

如图。
在 DnD 的 ra/rc 掷骰检定中，表示基础骰的 `D20` 与表示随机四面骰的 `D4` 的 `D` 出现不一致的情况。应更改为一致以避免用户出现误解。

![Screenshot_2024-10-24-23-20-12-675_com tencent mobileqq-edit](https://github.com/user-attachments/assets/518f41e0-d64f-4122-8585-8799f42a5280)


### 如何复现

对骰子在群聊中发送 `.rd+2+d4 `
骰子返回的输出如图

![Screenshot_2024-10-24-23-20-12-675_com tencent mobileqq-edit](https://github.com/user-attachments/assets/906a2b31-301d-4b68-89fe-3284cd5acc46)


### 你期望发生的

[D20] 与 [d4] 中的 `D` 应统一

### 实际上发生的

[D20] 与 [d4] 中的 `D` 并不统一

### 日志文件

![Screenshot_2024-10-24-23-20-12-675_com tencent mobileqq-edit](https://github.com/user-attachments/assets/01f4cb43-3294-4738-8668-91a3a39bdb96)


### 截图

_No response_

### 海豹核心版本

@PaienNate 编译测试的 `1.5.0` 使用 gorm 驱动的dev 分支海豹，编译日期为 10.23

### 操作系统

Windows Server 2016

### 帐号类型

QQ

### 使用协议

_No response_

### 附加内容

_No response_


Discussion / hints:
cc @fy0 @sealdice/core-team 
我还寻思这个ISSUE怎么还踹我一脚.jpg
之前认为这是一个中间过程输出的bug，但是实际上并非如此，D显示为大写还是小写取决于用户的输入。这里唯一可以操作的方案是将前面的D20调整为d20，这样如何？

![image](https://github.com/user-attachments/assets/25105476-fbb7-4751-a9b9-1b92023dd8be)

> 之前认为这是一个中间过程输出的bug，但是实际上并非如此，D显示为大写还是小写取决于用户的输入。这里唯一可以操作的方案是将前面的D20调整为d20，这样如何？
> 
> ![image](https://github.com/user-attachments/assets/25105476-fbb7-4751-a9b9-1b92023dd8be)
> 

我觉得或许可以。

Fix patch:
diff --git a/dice/ext_dnd5e.go b/dice/ext_dnd5e.go
index e3de2c67..f6dbe512 100644
--- a/dice/ext_dnd5e.go
+++ b/dice/ext_dnd5e.go
@@ -425,7 +425,7 @@ func RegisterBuiltinExtDnd5e(self *Dice) {
 					m = strings.Replace(m, "劣勢", "劣势", 1)
 					restText = strings.TrimSpace(restText[len(m):])
 				}
-				expr := fmt.Sprintf("D20%s + %s", m, restText)
+				expr := fmt.Sprintf("d20%s + %s", m, restText)
 				mctx.CreateVmIfNotExists()
 				tmpl := mctx.Group.GetCharTemplate(mctx.Dice)
 				mctx.Eval(tmpl.PreloadCode, nil)
@@ -1034,7 +1034,7 @@ func RegisterBuiltinExtDnd5e(self *Dice) {
 				if m != "" {
 					restText = strings.TrimSpace(restText[len(m):])
 				}
-				expr := fmt.Sprintf("D20%s%s", m, restText)
+				expr := fmt.Sprintf("d20%s%s", m, restText)
 				mctx.CreateVmIfNotExists()
 				mctx.setDndReadForVM(true)
 				r := mctx.Eval(expr, nil)
@@ -1195,7 +1195,7 @@ func RegisterBuiltinExtDnd5e(self *Dice) {
 
 				if strings.HasPrefix(text, "+") {
 					// 加值情况1，D20+
-					r := ctx.Eval("D20"+text, nil)
+					r := ctx.Eval("d20"+text, nil)
 					if r.vm.Error != nil {
 						// 情况1，加值输入错误
 						return 1, name, val, detail, ""
@@ -1206,7 +1206,7 @@ func RegisterBuiltinExtDnd5e(self *Dice) {
 					exprExists = true
 				} else if strings.HasPrefix(text, "-") {
 					// 加值情况1.1，D20-
-					r := ctx.Eval("D20"+text, nil)
+					r := ctx.Eval("d20"+text, nil)
 					if r.vm.Error != nil {
 						// 情况1，加值输入错误
 						return 1, name, val, detail, ""
@@ -1228,7 +1228,7 @@ func RegisterBuiltinExtDnd5e(self *Dice) {
 					exprExists = true
 				} else if strings.HasPrefix(text, "优势") || strings.HasPrefix(text, "劣势") {
 					// 优势/劣势
-					r := ctx.Eval("D20"+text, nil)
+					r := ctx.Eval("d20"+text, nil)
 					if r.vm.Error != nil {
 						// 优势劣势输入错误
 						return 2, name, val, detail, ""
diff --git a/dice/ext_exp.go b/dice/ext_exp.go
index e407d3e1..b0a01366 100644
--- a/dice/ext_exp.go
+++ b/dice/ext_exp.go
@@ -644,7 +644,7 @@ func getCmdStBase(soi CmdStOverrideInfo) *CmdItemInfo {
 					return CmdExecuteResult{Matched: true, Solved: true, ShowHelp: true}
 				}
 
-				rRestIput := ctx.vm.RestInput
+				rRestIput := mctx.vm.RestInput
 
 				// 处理直接设置属性
 				var text string
diff --git a/dice/rollvm_migrate.go b/dice/rollvm_migrate.go
index f85887ba..e143b97a 100644
--- a/dice/rollvm_migrate.go
+++ b/dice/rollvm_migrate.go
@@ -684,7 +684,8 @@ func (ctx *MsgContext) CreateVmIfNotExists() {
 			detailArr = append(detailArr, d.V())
 		}
 
-		detailStr := string(detailResult)
+		// TODO: 此时加了TrimSpace表现正常，但深层原因是ds在处理"d3 x"这个表达式时多吃了一个空格，修复后取消trim
+		detailStr := strings.TrimSpace(string(detailResult))
 		if detailStr == ctx.Ret.ToString() {
 			detailStr = "" // 如果detail和结果值完全一致，那么将其置空
 		}


Test patch: