From 3032ec320ade11a6e468d241e548a013a3482207 Mon Sep 17 00:00:00 2001 From: Jeremy Saklad Date: Wed, 16 Jun 2021 15:30:48 -0500 Subject: [PATCH] Add command-line parameter for occasional buyers Some buyers are only available based on a world quality. The solver now skips buyers if they are not available. This is specified using a new parameter, which is mutually-exclusive with specifying a specific buyer. If no buyer is specified, this world quality must be specified instead to tell the solver who is around. --- Bone Market Solver.py | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/Bone Market Solver.py b/Bone Market Solver.py index ba05d40..8dd854e 100644 --- a/Bone Market Solver.py +++ b/Bone Market Solver.py @@ -1145,8 +1145,20 @@ class Fluctuation(enum.Enum): ANTIQUITY = 1 AMALGAMY = 2 +# Which of several unusual buyers are available. +class OccasionalBuyer(enum.Enum): + AN_ENTHUSIAST_IN_SKULLS = [Buyer.AN_ENTHUSIAST_IN_SKULLS] -def Solve(bone_market_fluctuations, zoological_mania, desired_buyer = None, maximum_cost = cp_model.INT32_MAX, maximum_exhaustion = cp_model.INT32_MAX, time_limit = float('inf'), stdscr = None): + A_DREARY_MIDNIGHTER = [Buyer.A_DREARY_MIDNIGHTER] + + A_COLOURFUL_PHANTASIST = [ + Buyer.A_COLOURFUL_PHANTASIST_BAZAARINE, + Buyer.A_COLOURFUL_PHANTASIST_NOCTURNAL, + Buyer.A_COLOURFUL_PHANTASIST_CELESTIAL, + ] + + +def Solve(bone_market_fluctuations, zoological_mania, occasional_buyer = None, desired_buyer = None, maximum_cost = cp_model.INT32_MAX, maximum_exhaustion = cp_model.INT32_MAX, time_limit = float('inf'), stdscr = None): model = cp_model.CpModel() actions = {} @@ -1182,10 +1194,19 @@ def Solve(bone_market_fluctuations, zoological_mania, desired_buyer = None, maxi for embellishment in Embellishment: actions[embellishment] = model.NewIntVar(0, cp_model.INT32_MAX, embellishment.value.name) + # Buyer for buyer in Buyer: actions[buyer] = model.NewBoolVar(buyer.value.name) + # Mark unavailable buyers + model.AddAssumptions([ + actions[buyer].Not() + for unavailable_buyer in OccasionalBuyer if unavailable_buyer != occasional_buyer + for buyer in unavailable_buyer.value if buyer != desired_buyer + ]) + + # One torso model.Add(cp_model.LinearExpr.Sum([value for (key, value) in actions.items() if isinstance(key, Torso)]) == 1) @@ -2124,6 +2145,7 @@ class EnumAction(argparse.Action): def main(): parser = argparse.ArgumentParser(prog='Bone Market Solver', description='Devise the optimal skeleton at the Bone Market in Fallen London.') + parser.add_argument( '-f', '--bone-market-fluctuations', action=EnumAction, @@ -2132,6 +2154,7 @@ def main(): help='current value of Bone Market Fluctuations, which grants various bonuses to certain buyers', dest='bone_market_fluctuations' ) + parser.add_argument( '-m', '--zoological-mania', action=EnumAction, @@ -2140,13 +2163,23 @@ def main(): help='current value of Zoological Mania, which grants a 10%% bonus to value for a certain declaration', dest='zoological_mania' ) - parser.add_argument( + + buyer = parser.add_mutually_exclusive_group(required=True) + buyer.add_argument( + '-o', '--occasional-buyer', + action=EnumAction, + type=OccasionalBuyer, + help='current value of Occasional Buyer, which allows access to a buyer that is not otherwise available', + dest='occasional_buyer' + ) + buyer.add_argument( '-b','--buyer', '--desired-buyer', action=EnumAction, type=Buyer, help='specific buyer that skeleton should be designed for', dest='desired_buyer' ) + parser.add_argument( '-c', '--cost', '--maximum-cost', default=cp_model.INT32_MAX, @@ -2180,7 +2213,7 @@ def main(): args = parser.parse_args() - arguments = (args.bone_market_fluctuations, args.zoological_mania, args.desired_buyer, args.maximum_cost, args.maximum_exhaustion, args.time_limit) + arguments = (args.bone_market_fluctuations, args.zoological_mania, args.occasional_buyer, args.desired_buyer, args.maximum_cost, args.maximum_exhaustion, args.time_limit) if not args.verbose: def WrappedSolve(stdscr, arguments):