Work orders: crafting orders claimed by one crafter, open materials requests, escrow, refunds

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
rope 2026-10-20 18:01:02 +01:00
parent 89fd9b3c40
commit d03f0035eb
7 changed files with 538 additions and 8 deletions

View file

@ -1518,3 +1518,65 @@ class CombatReworkMigrationTest(unittest.TestCase):
def test_homesteaders_tailor(self):
self.assertIn("tailoring", game.CLASSES["homesteader"]["fast"])
self.assertIn("tailoring", game.CLASSES["homesteader"]["craft"])
class WorkOrderTest(unittest.TestCase):
def setUp(self):
self.world = world_with(("mike", "ranger"), ("fred", "miner"), ("dave", "builder"))
self.mike, self.fred, self.dave = (self.world["players"][uid] for uid in ("mike", "fred", "dave"))
self.fred["xp"]["smithing"] = game.XP_TABLE[25]
self.dave["xp"]["smithing"] = game.XP_TABLE[25]
self.world["city"]["buildings"]["smithy"]["level"] = 1
def post_hammer(self):
self.mike["gold"] = 200
self.mike["bank"] = {"iron_bar": 3, "clay_core": 3}
return game.post_order(self.world, self.mike, "craft", "iron_warhammer", 1, ["iron_bar", "clay_core"], 140, T0)
def test_posting_holds_the_reagents_and_reward(self):
self.assertIsNone(self.post_hammer())
order = self.world["orders"][0]
self.assertEqual(order["provided"], {"iron_bar": 3, "clay_core": 3})
self.assertEqual(self.mike["bank"], {})
self.assertEqual(self.mike["gold"], 60)
def test_a_claimed_order_is_crafted_and_sent_to_the_requester(self):
self.post_hammer()
order = self.world["orders"][0]
self.fred["bank"] = {"oak_plank": 1}
self.assertIsNone(game.work_order(self.world, self.fred, order["id"], T0))
self.assertEqual(game.claim_order(self.world, self.dave, order["id"]), "Someone else has it")
game.process_player(self.world, self.fred, T0 + 600, random.Random(1))
self.assertEqual(self.mike["bank"].get("iron_warhammer"), 1)
self.assertEqual(self.fred["gold"], 140)
self.assertEqual(order["status"], "done")
self.assertNotIn("oak_plank", self.fred["bank"]) # the crafter brings what wasn't provided
self.assertIsNone(self.fred["action"])
def test_cancelling_refunds_what_is_left(self):
self.post_hammer()
order = self.world["orders"][0]
self.assertEqual(game.claim_order(self.world, self.mike, order["id"]), "That's your own order")
self.assertIsNone(game.cancel_order(self.world, self.mike, order["id"], T0))
self.assertEqual(self.mike["bank"], {"iron_bar": 3, "clay_core": 3})
self.assertEqual(self.mike["gold"], 200)
def test_materials_requests_are_open_and_pay_per_item(self):
self.mike["gold"] = 400
self.assertIsNone(game.post_order(self.world, self.mike, "gather", "oak_logs", 200, None, 2, T0))
order = self.world["orders"][0]
self.fred["bank"] = {"oak_logs": 40}
self.dave["bank"] = {"oak_logs": 500}
self.assertIsNone(game.deliver_order(self.world, self.fred, order["id"], T0))
self.assertIsNone(game.deliver_order(self.world, self.dave, order["id"], T0))
self.assertEqual(self.fred["gold"], 80)
self.assertEqual(self.dave["gold"], 320)
self.assertEqual(self.dave["bank"]["oak_logs"], 340)
self.assertEqual(self.mike["bank"]["oak_logs"], 200)
self.assertEqual(order["status"], "done")
def test_orders_expire_and_refund(self):
self.post_hammer()
game.expire_orders(self.world, T0 + 4 * game.DAY)
self.assertEqual(self.mike["gold"], 200)
self.assertEqual(self.mike["bank"]["iron_bar"], 3)