物物交换系统¶
由 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>
是他们的输入。
开始交易
A> trade B: 嗨,我有把不错的多余剑。你想交易吗?
B 看到: A 说:“嗨,我有把不错的多余剑。你想交易吗?” A 想和你交易。输入 ‘trade A <情感>’ 来接受。
B> trade A: 嗯,我可以用一把好剑…
A 看到: B 说:“嗯,我可以用一把好剑…” B 接受了交易。使用 ‘trade help’ 获取帮助。
B 看到: 你现在正在与 A 交易。使用 ‘trade help’ 获取帮助。
协商
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文件。