dynilath / qq-dicebot

a qqbot and a dicebot
MIT License
57 stars 12 forks source link

请问骰子有多次骰点的功能吗? #21

Closed AlmostdeadY closed 5 years ago

AlmostdeadY commented 5 years ago

其他的dicebot可以多次骰点,骰3次(1d20+4)就是.r 3#1d20+4 请问这个骰子有这种功能吗?我看了一遍说明似乎没有看到。 如果没有的话能否加进去呢?谢谢!

dynilath commented 5 years ago

目前的设计上,我是希望避免通过短短的骰子指令就能产生冗长的结果,并导致刷屏的。
多次骰的功能来源,是因为在irc时代里,玩家只能输入一行指令,重复输入非常麻烦,结果和输入交错也不直观。
针对于qq的特殊环境,在目前的实现上使用了比较折衷的办法,多行输入。也就是利用qq的多行输入能力。你可以在qq聊天框里输入:
.r4d6k3
.r4d6k3
.r4d6k3
来获得三个4d6k3的结果,并且你可以为它们分别加上描述文字以示区别。
当然,多次骰作为一种快捷的输入方式,其形式是不会被放弃的。当我对多次骰的需求有更为透彻的理解后,我一定会加入该功能。

AlmostdeadY commented 5 years ago

多次骰点并不会冗长吧,比如 投掷 : 3 次 1d20+4 = { 13、24、14 },这样就算是骰50次也只是几行而已。 如果说要故意刷屏的话,不论怎样都能够刷屏的,或者说是否可以设置一个上限这样。 主要是D&D里多次骰点太常用了,比如人物的多重攻击和复数怪物的行动的等等,还是希望作者能加入这个功能。 只是一点建议,谢谢作者的辛劳和回复!

dynilath commented 5 years ago

这样的排版,和算式+详细输出稍微合并一下就会乱套。
4#2d20k1*(4d6+4) = { [(1) + 20] * ([1 + 2 + 3 + 4] + 4) = 280, [(1) + 20] * ([1 + 2 + 3 + 4] + 4) = 280, [(1) + 20] * ([1 + 2 + 3 + 4] + 4) = 280, [(1) + 20] * ([1 + 2 + 3 + 4] + 4) = 280}
emmm,其实就是需要考虑其他的骰子功能在多骰时如何运作的意思吧。
如果把这个功能限定得非常局限,那其实还不如直接用现有的多行输入对付一下(我目前也就见过骰属性和Telekinesis的情况中用这个最合适)。

另外还有在下一个版本就会加入的储存骰子指令/默认骰子的功能,#和这些相互作用时刷骰子又会变得更容易,其交互又是个问题。

这种做的更细致是iterate attack那种实现吧,4#1d20+12能自动骰 1d20+12 1d20+12 1d20+7 1d20+2的,我挺想做到那种效果的(做梦)。

beserah commented 5 years ago

相对的coc这边也有车卡时5#3d6和2#2d6+6的需求

dynilath commented 5 years ago

那应该是.r4#3d6*5吧(别忘了这个骰子可以当计算器玩的

dynilath commented 5 years ago

从{}讲起

这里引入一个新的概念,我暂时叫它dicelet。
一个实际的dicelet看起来可能是这样的:
{4d6+2,1d8,1d20}
它使用逗号分隔多个骰子指令,然后用大括号把它们包括起来。
在开发中的版本里,dicelet将直接可以用于.r指令,例如:

.r{4d6+2,1d8,1d20}

* 掷骰
#1 4d6+2 = [6 + 6 + 6 + 6] + 2 = 26
#2 1d8 = [8] = 8
#3 1d20 = [20] = 20

使用.rs off后会是这样的效果:

* 掷骰 {4d6+2,1d8,1d20} = {26,8,20}

dicelet不能嵌套,也就是说不会出现{{4d6,1d8},1d20}的形式。

#的含义

在这里,#被定义为一种运算符,其优先级高于加减乘除。
4#4d6等效于这样的dicelet:{4d6,4d6,4d6,4d6}
#的左操作数必须是一个正整数,右边可以是任何骰子指令。

dicelet的运算

重新定义了#之后,接下来就是dicelet怎么参与运算的问题。
当两个dicelet大小相同时,其四则运算结果就是一个相同大小的dicelet,其各项结果为参与运算的两个dicelet对应项的运算结果,举例而言:
{a,b,c}+{d,e,f}={a+d,b+e,c+f}

当两个dicelet大小不同时,结果的dicelet长度等于两个参与运算的dicelet中较长的那个。
长度较短的那个dicelet会被循环地补全到长度相等的状态,举例而言:
{a,b,c,d}+{e,f}={a,b,c,d}+{e,f,e,f}={a+e,b+f,c+e,d+f}
{a,b,c}+{e,f}={a,b,c}+{e,f,e}={a+e,b+f,c+e}

当dicelet和单独的骰子指令计算时,该骰子指令视为长度为1的dicelet。举例而言:
{a,b,c,d}+e={a,b,c,d}+{e}={a+e,b+e,c+e,d+e}

beserah commented 5 years ago

兄啊你这是发错地了吧

dynilath commented 5 years ago

是多次骰的实现方式( 我觉得不用发个新Issue就发这里了

beserah commented 5 years ago

等等,我发现一个很大的问题,没有暗骰可还行?!

beserah commented 5 years ago

还有.r4#4d6会变成r4=4

beserah commented 5 years ago

以及为什么我骰得出其他人就骰不出,奇了怪0.0

beserah commented 5 years ago

还有就是设置d为1d100,骰2d仍然会是投掷2

dynilath commented 5 years ago

讲道理你私聊不就是暗骰了(难道你暗骰还发群里告诉大家“我暗骰了一个1d100”) 除此之外,这个你可以开个新Issue,毕竟和本条不相关

dynilath commented 5 years ago

现在还没#功能,上文是“正在开发版本”。

默认骰指令骰属于各个用户自己的内容,互相数据独立。

这里实现.r是用的文本指令,而不是省略d20后面的20文字,.r2d的用法是不合理的。 未来会有.rd+2,.rd*2,.rd+d之类的,但是在这个设计里,2d20k1这个称为一个dice,文本上是不能拆分的。

beserah commented 5 years ago

r2个设定好的东西很合理呀orz,还有就是别人用不了是什么情况,以及暗骰好像真的没有?!

dynilath commented 5 years ago

刚才我的意思是.r2d这种形式不合理,未来你或许可以.R d+d或者.r{d,d}或者.r2#d

刚才讲了设定骰是为qq号自己设定

(明明Issue是留言板形式为啥我会在重复发过的东西

介绍一下想要什么样的暗骰吧

beserah commented 5 years ago

r2d感觉还算蛮普遍也方便的功能,或者直接r2? 设定骰独立的话感觉rd党还是很麻烦233333,每个人都得去设置一次的样子(?),能不能做多一个设置成每个人通用的设置呢 暗骰的话我们一般用就指令是.rhd和rhd几这样,总的来说指令尽可能贴近使用习惯,能够骰出来后以私聊之类的形式把暗骰结果给出来就没问题 最后就是有些人win10电脑按.也会出来句号,如果能多这个前缀支持就好了,感觉比起功能的多面性,更重要的还是上手的方便易用性,大部分人目前都是用的风羽家或者溯洄家,感觉日常习惯指令都别扭的话就很难受233333,希望还是能做更多这方面的改进 (ง ˙ω˙)ว 不过功能多样性方面还是很强很棒! 啊对了最后想说k指令比如说我要两次1d6+1d4可能还会加入一些固定数值这样的话,能怎么骰出来两次这个然后取大小这样吗?

beserah commented 5 years ago

哦对了对了还有,默认的rs功能能不能多一条当只有一个骰子的时候不出现分别显示?1d100=30=30这样的感觉好蠢(。) 而且看起来也很不方便

dynilath commented 5 years ago
beserah commented 5 years ago

暗骰实际上很多时候发到群里都有一层“我暗骰了”以增加游戏紧张感的作用,所以比起纯粹的私聊,有一个指令会更好,更何况不是私聊也不支持么(´◑д◐`) 俺寻思别光群吧,我们经常用讨论组的说 自己的村规而已,只是在想既然有这个功能能不能顺便加入