Contribution by Griatch, 2012
This implements a full barter system - a way for players to safely
trade items between each other in code rather than simple
commands. This increases both safety (at no time will one player have
both goods and payment in-hand) and speed, since agreed goods will
be moved automatically). By just replacing one side with coin objects,
(or a mix of coins and goods), this also works fine for regular money
Just import the CmdsetTrade command into (for example) the default cmdset. This will make the trade (or barter) command available in-game.
# in 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) # <---
In this module, a “barter” is generally referred to as a “trade”.
Below is an example of a barter sequence. A and B are the parties.
B> are their inputs.
opening a trade
A> trade B: Hi, I have a nice extra sword. You wanna trade?
B sees: A says: “Hi, I have a nice extra sword. You wanna trade?” A wants to trade with you. Enter ‘trade A
’ to accept.
B> trade A: Hm, I could use a good sword …
A sees: B says: “Hm, I could use a good sword … B accepts the trade. Use ‘trade help’ for aid.
B sees: You are now trading with A. Use ‘trade help’ for aid.
A> offer sword: This is a nice sword. I would need some rations in trade.
B sees: A says: “This is a nice sword. I would need some rations in trade.” [A offers Sword of might.]
B> evaluate sword B sees: <Sword’s description and possibly stats>
B> offer ration: This is a prime ration.
A sees: B says: “This is a prime ration.” [B offers iron ration]
A> say Hey, this is a nice sword, I need something more for it.
B sees: A says: “Hey this is a nice sword, I need something more for it.”
B> offer sword,apple: Alright. I will also include a magic apple. That’s my last offer.
A sees: B says: “Alright, I will also include a magic apple. That’s my last offer.” [B offers iron ration and magic apple]
A> accept: You are killing me here, but alright.
B sees: A says: “You are killing me here, but alright.” [A accepts your offer. You must now also accept.]
B> accept: Good, nice making business with you. You accept the deal. Deal is made and goods changed hands.
A sees: B says: “Good, nice making business with you.” B accepts the deal. Deal is made and goods changed hands.
At this point the trading system is exited and the negotiated items are automatically exchanged between the parties. In this example B was the only one changing their offer, but also A could have changed their offer until the two parties found something they could agree on. The emotes are optional but useful for RP-heavy worlds.
The trade is implemented by use of a TradeHandler. This object is a common place for storing the current status of negotiations. It is created on the object initiating the trade, and also stored on the other party once that party agrees to trade. The trade request times out after a certain time - this is handled by a Script. Once trade starts, the CmdsetTrade cmdset is initiated on both parties along with the commands relevant for the trading.
Ideas for NPC bartering¶
This module is primarily intended for trade between two players. But it can also in principle be used for a player negotiating with an AI-controlled NPC. If the NPC uses normal commands they can use it directly – but more efficient is to have the NPC object send its replies directly through the tradehandler to the player. One may want to add some functionality to the decline command, so players can decline specific objects in the NPC offer (decline
This document page is generated from
evennia/contrib/game_systems/barter/README.md. Changes to this
file will be overwritten, so edit that file rather than this one.