赛马进入3.0时代


群员挺期待我搞成赛马娘的… 但是我也不懂那个游戏啊。


QQ截图20231227180056 先做成我感觉的赛马吧…


koishi-plugin-smmcat-saima

3.0 说明

这次加了道具,具体使用可以查看指令说明;应该在指令调用的回复里给足提示了。

使用后,可在评论区给个截图反馈,这次我就不做功能演示了,大家自行使用。

3 个赞

好耶!

2 个赞

好耶!

3 个赞

赛个马(saigma)无端)

3 个赞

saigma

赛个马

1 个赞

喵大人!我举报,有人用赛马刷钱!@smmcat

利用机制,突破封盘惹!!! 版本是 0.3.2 最新版

2 个赞

已修复,更新到 0.3.4 版本即可。顺便修复了之前说的那个 return await 的问题。去除了所有测试的 log。

3 个赞

愿望清单

  1. 可以自定义赛马的赔率,默认1:7。(可能我被群友骗了)
  2. 取消投注上限或者可以自定义。(一群赌怪,钱太多了)
  3. 赛马道具在其他适配器(指red)不可用(不过也可能是我的问题…)。
  4. 有时候马 +2 就像开了挂,飞到终点,这是机制还是?(玩了半天没遇到惹,可能已经不存在问题)

来自群天才的论述


2 个赞

我看看…

3 个赞

我其实刚接触koishi开发不到两个月,很多东西都还没用过2333

3 个赞

只能说是机制吧,首先每一轮都有固定移速,加上 滞留buff 是允许叠加的。而且部分 buff 还挺长…

所以你看到的飞到终点,可能是:

固定移速 + buff + buff + buff + 事件奖励 = 实际本回合移动
3+2+2+2 + 5 = 14

特殊移动事件,也是会相继叠加的。

3 个赞

喵大大好认真的回复!小奶茶明白惹 ~:heart:

2 个赞

这个得实际反馈才知道,因为没有测试环境。你那边是怎么解决的? 看代码你是在指令加了
[text:text]
这个吗?

2 个赞

其实之前就怕有人一夜暴富,这个本来会后期做自定义配置;自己改就行

3 个赞

嗯,改完就可以用惹,其实具体为什么我也不是很清楚的说…

因为之前发送 使用道具 总是检测不到道具名称。

所以我就把 替换‘使用道具’ 那一句代码删掉惹。

就是参考这里的代码改的:指令开发 | Koishi

2 个赞

改成你那个后,我这边就无效了 ( 悲

搞不明白,那就又做个兼容吧…

3 个赞

麻烦惹…等等,我也去 console.log 一下!

2 个赞

由于赛马道具的逻辑是:获得关键字 → 通过关键字去匹配对应的道具信息 → 执行对应道具

这个问题,我还得想想

2 个赞

对不起大大,之前代码给你复制错了…您试试下面这个可不可以 @smmcat

上面那个代码,我刚才去试了一下,使用失败了,才发现复制错了。

下面的刚刚测试过,没问题。

    ctx.command('使用道具 [text:text]', '对🐎宝具').userFields(['id']).action(async ({ session }, text) => {
        const temp = getguildData(session.guild);
        if (!temp.isPlay) {
            await session.send('似乎还没开始赛马...');
            return;
        }
    
        if (!temp.propTime[session.userId]) {
            temp.propTime[session.userId] = 0;
        }
    
        if (+new Date() - temp.propTime[session.userId] < 10000) {
            await session.send('您使用道具太频繁了,请等待一会');
            return;
        }
    
        temp.propTime[session.userId] = +new Date();
    
        const msg = text.replace(/<at id="[^"]+"\/>/, '');
    
        const regex = /(\d+)|(\D+)/g;
        let match;
        let values = [];
        let texts = [];
    
        while ((match = regex.exec(msg)) !== null) {
            if (match[1]) {
                values.push(parseInt(match[1]));
            } else {
                texts.push(match[2].trim());
            }
        }
    
        if (!texts[0]) {
            await session.send('似乎还没有选择道具,目前存在的道具有:\n\n' + propList.map(item => item.name).join('\n'));
            return;
        }
    
        const info = propList.find(item => texts[0].trim() === item.name);
    
        if (!info) {
            await session.send('道具不存在。目前存在的道具有:\n\n' + propList.map(item => item.name).join('\n'));
            return;
        }
    
        try {
            await ctx.monetary.cost(session.user.id, info.money);
            await session.send('您花费了' + info.money);
        } catch (error) {
            await session.send(`下注失败,可能原因:额度不够`);
            return;
        }
    
        const success = Math.random() <= info.prob;
    
        if (!success) {
            await session.send(`您尝试使用了${info.name},似乎失败了...`);
            return;
        }
    
        if (info.trackFun) {
            const index = info.trackFun(temp.track);
            await session.send(`您的${info.name}选中了${index - 1}号🐎;\n${info.msg}`);
            return;
        }
    
        if (info.statusFun) {
            if (values[0] && values[0] > 0 && values[0] <= 6) {
                info.statusFun(temp.strandedState, values[0] - 1);
                await session.send(`您对${values[0]}号🐎使用了道具 ${info.name};\n${info.msg}`);
                return;
            } else {
                await session.send('您对空气使用了道具,似乎没有选中目标,请确认目标!\n格式为:\n\n/使用道具 道具名 目标下标');
                return;
            }
        }
        // 目标数值操作
        if (values[0] && values[0] > 0 && values[0] <= 6) {
            temp.track[values[0] - 1] += info.value;
            await session.send(`你对${values[0]}号马使用了${info.name};\n${msg}`);
        }
    });
2 个赞