物物交换系统

由 Griatch 贡献,2012年

此模块实现了完整的物物交换系统——一个安全地让玩家之间在代码中交易物品的方式,而不是简单的 give/get 命令。这提高了安全性(任何时候一名玩家都不会同时拥有商品和付款)和效率,因为已经达成的交易会自动进行。通过将一方替换为金币对象(或金币与商品的组合),这也适用于常规货币交易。

安装

只需将 CmdsetTrade 命令导入(例如)默认命令集,这将在游戏中使交易(或物物交换)命令可用。

# 在 mygame/commands/default_cmdsets.py 中

from evennia.contrib.game_systems import barter  # <---

# ...
class CharacterCmdSet(default_cmds.CharacterCmdSet):
    # ...
    def at_cmdset_creation(self):
        # ...
        self.add(barter.CmdsetTrade)  # <---

用法

在此模块中,“物物交换” 通常被称为 “交易”。

以下是一个交易示例。A 和 B 是交易方。A>B> 是他们的输入。

  1. 开始交易

    A> trade B: 嗨,我有把不错的多余剑。你想交易吗?

    B 看到: A 说:“嗨,我有把不错的多余剑。你想交易吗?” A 想和你交易。输入 ‘trade A <情感>’ 来接受。

    B> trade A: 嗯,我可以用一把好剑…

    A 看到: B 说:“嗯,我可以用一把好剑…” B 接受了交易。使用 ‘trade help’ 获取帮助。

    B 看到: 你现在正在与 A 交易。使用 ‘trade help’ 获取帮助。

  2. 协商

    A> offer sword: 这是一把不错的剑。我需要一些口粮作为交换。

    B 看到:A 说:“这是一把不错的剑。我需要一些口粮作为交换。” [A 提供 剑之力。]

    B> evaluate sword B 看到: <剑的描述和可能的属性>

    B> offer ration: 这是一个优质口粮。

    A 看到: B 说:“这是一个优质口粮。” [B 提供 铁口粮]

    A> say 嘿,这是一把不错的剑,我需要更多东西来换。

    B 看到: A 说:“嘿,这是一把不错的剑,我需要更多东西来换。”

    B> offer sword,apple: 好吧。我还会包括一个魔法苹果。这是我的最后报价。

    A 看到: B 说:“好吧。我还会包括一个魔法苹果。这是我的最后报价。” [B 提供 铁口粮和魔法苹果]

    A> accept: 你让我很为难,但好吧。

    B 看到:A 说:“你让我很为难,但好吧。” [A 接受了你的报价。你现在也必须接受。]

    B> accept: 好的,愉快的交易。 你接受了交易。交易达成,物品交换。

    A 看到:B 说:“好的,愉快的交易。” B 接受了交易。交易达成,物品交换。

此时,交易系统已退出,协商的物品会在双方之间自动交换。在这个例子中,只有 B 改变了他们的报价,但 A 也可以在双方达成一致之前更改报价。情感表达是可选的,但在角色扮演重的世界中很有用。

技术信息

交易通过使用 TradeHandler 实现。这个对象是存储当前协商状态的公共位置。它在发起交易的对象上创建,并且一旦另一方同意交易,也会存储在对方上。交易请求在一定时间后会超时——这是通过脚本处理的。一旦交易开始,CmdsetTrade 命令集会在双方上启动,并提供与交易相关的命令。

NPC 物物交换的想法

此模块主要用于两个玩家之间的交易。但原则上,它也可以用于玩家与 AI 控制的 NPC 的协商。如果 NPC 使用普通命令,他们可以直接使用,但更有效的是让 NPC 对象通过 tradehandler 直接向玩家发送回复。可以考虑为拒绝命令添加一些功能,以便玩家可以拒绝 NPC 报价中的特定物品(decline <object>),允许 AI 可能提供其他东西,从而进行真正的物物交换。结合一个“需要”东西或在交易中具有某种个性的 AI,可以使与 NPC 的物物交换比单纯的“购买”更有趣。


此文档页面并非由 evennia/contrib/game_systems/barter/README.md自动生成。如想阅读最新文档,请参阅原始README.md文件。