crafting fixed

This commit is contained in:
Isaak Buslovich 2023-11-18 18:02:01 +01:00
parent 1cf021d46d
commit 02b9ce142a
Signed by: Isaak
GPG Key ID: EEC31D6437FBCC63

102
main.py
View File

@ -29,7 +29,6 @@ from rich.console import Console
from rich.table import Table from rich.table import Table
from rich.prompt import Prompt from rich.prompt import Prompt
from rich import box from rich import box
from rich.panel import Panel from rich.panel import Panel
from rich.text import Text from rich.text import Text
@ -51,7 +50,6 @@ def load_json(filename):
class Market: class Market:
"""Manages market dynamics, including companies, products, stock transactions, and economic indicators.""" """Manages market dynamics, including companies, products, stock transactions, and economic indicators."""
def __init__(self): def __init__(self):
self.current_turn = 0 self.current_turn = 0
self.companies = {} self.companies = {}
@ -175,10 +173,7 @@ class Company:
self.inventory = {'A': 0, 'B': 0, 'C': 0} self.inventory = {'A': 0, 'B': 0, 'C': 0}
self.crafting_queue = [] self.crafting_queue = []
self.own_stock_ownership = {cid: 51 if cid == player_id else 0 for cid in [player_id] + competitors_ids} self.own_stock_ownership = {cid: 51 if cid == player_id else 0 for cid in [player_id] + competitors_ids}
self.stock_holdings = {cid: 0 for cid in set([player_id] + competitors_ids + ["RationalAI", "RiskTakingAI"])}
all_company_ids = set([player_id] + competitors_ids + ["RationalAI", "RiskTakingAI"])
self.other_stock_holdings = {cid: 0 for cid in all_company_ids}
self.total_shares = 100 self.total_shares = 100
self._market = market self._market = market
@ -187,15 +182,44 @@ class Company:
"""Calculates the total value of the company, combining cash and the market value of its inventory.""" """Calculates the total value of the company, combining cash and the market value of its inventory."""
return self.cash + sum(self.inventory[product] * price for product, price in self._market.products.items()) return self.cash + sum(self.inventory[product] * price for product, price in self._market.products.items())
def crafting_decision(self): def craft_product(self, recipe_key):
"""Displays crafting options and handles the user's crafting choice.""" """Processes crafting of a product based on the chosen recipe."""
print("\nCrafting Decision") print(f"Inventory before crafting: {self.inventory}")
recipe_keys = list(crafting_recipes.keys()) recipe = crafting_recipes[recipe_key]
print("\nAvailable Recipes:") if all(self.inventory[product] >= quantity for product, quantity in recipe['input'].items()):
for idx, recipe in enumerate(recipe_keys, 1): self.crafting_queue.append({'recipe': recipe, 'turns_remaining': recipe['turns']})
print(f" {idx}: {recipe}") self._update_inventory(recipe['input'], decrease=True)
recipe_choice = self.get_user_choice(len(recipe_keys), "Choose a recipe to craft: ") print("Crafting order placed.")
self.craft_product(recipe_keys[recipe_choice - 1]) else:
print("Not enough resources to craft.")
print(f"Inventory after crafting: {self.inventory}")
def _update_inventory(self, items, decrease=False):
"""Updates the inventory based on the given items."""
print(f"Inventory before update: {self.inventory}")
for product, quantity in items.items():
if decrease:
self.inventory[product] -= quantity
else:
self.inventory[product] += quantity
print(f"Inventory after update: {self.inventory}")
def update_crafting(self):
"""Updates the crafting queue, completing orders as their turns conclude."""
print(f"Crafting queue before update: {self.crafting_queue}")
completed_orders = []
for order in self.crafting_queue:
print(f"Processing order: {order}")
order['turns_remaining'] -= 1
if order['turns_remaining'] == 0:
print(f"Completing order: {order}")
self._update_inventory(order['recipe']['output'], decrease=False)
print(f"Inventory after completing order: {self.inventory}")
completed_orders.append(order)
for order in completed_orders:
self.crafting_queue.remove(order)
print(f"Crafting queue after update: {self.crafting_queue}")
def trade_product(self, market, product, quantity, buying=True): def trade_product(self, market, product, quantity, buying=True):
"""Executes a product trade transaction based on the specified parameters.""" """Executes a product trade transaction based on the specified parameters."""
@ -207,25 +231,15 @@ class Company:
self.cash += total_cost self.cash += total_cost
self.inventory[product] -= quantity self.inventory[product] -= quantity
def craft_product(self, recipe_key): def crafting_decision(self):
"""Processes crafting of a product based on the chosen recipe.""" """Displays crafting options and handles the user's crafting choice."""
recipe = crafting_recipes[recipe_key] print("\nCrafting Decision")
if all(self.inventory[product] >= quantity for product, quantity in recipe['input'].items()): recipe_keys = list(crafting_recipes.keys())
self.crafting_queue.append({'recipe': recipe, 'turns_remaining': recipe['turns']}) print("\nAvailable Recipes:")
for product, quantity in recipe['input'].items(): for idx, recipe in enumerate(recipe_keys, 1):
self.inventory[product] -= quantity print(f" {idx}: {recipe}")
print("Crafting order placed.") recipe_choice = self.get_user_choice(len(recipe_keys), "Choose a recipe to craft: ")
else: self.craft_product(recipe_keys[recipe_choice - 1])
print("Not enough resources to craft.")
def update_crafting(self):
"""Updates the crafting queue, completing orders as their turns conclude."""
for order in self.crafting_queue[:]:
order['turns_remaining'] -= 1
if order['turns_remaining'] == 0:
for product, quantity in order['recipe']['output'].items():
self.inventory[product] += quantity
self.crafting_queue.remove(order)
def trade_stock(self, action, market, company_id, amount, is_ai=False): def trade_stock(self, action, market, company_id, amount, is_ai=False):
"""Executes a stock trade action, buying or selling as specified.""" """Executes a stock trade action, buying or selling as specified."""
@ -277,13 +291,13 @@ class Company:
if company_id == self.player_id: if company_id == self.player_id:
return self.total_shares - sum(self.own_stock_ownership.values()) + self.own_stock_ownership[self.player_id] return self.total_shares - sum(self.own_stock_ownership.values()) + self.own_stock_ownership[self.player_id]
else: else:
return self.total_shares - self.other_stock_holdings.get(company_id, 0) return self.total_shares - self.stock_holdings.get(company_id, 0)
def _get_stock_ownership(self, company_id): def _get_stock_ownership(self, company_id):
"""Retrieves the stock ownership amount for a given company.""" """Retrieves the stock ownership amount for a given company."""
if company_id == self.player_id: if company_id == self.player_id:
return self.own_stock_ownership[self.player_id] return self.own_stock_ownership[self.player_id]
return self.other_stock_holdings.get(company_id, 0) return self.stock_holdings.get(company_id, 0)
def _update_stock_ownership(self, company_id, amount, total_value, buying): def _update_stock_ownership(self, company_id, amount, total_value, buying):
"""Updates the stock ownership details after a buy or sell action.""" """Updates the stock ownership details after a buy or sell action."""
@ -294,9 +308,9 @@ class Company:
self.own_stock_ownership[self.player_id] -= amount self.own_stock_ownership[self.player_id] -= amount
else: else:
if buying: if buying:
self.other_stock_holdings[company_id] += amount self.stock_holdings[company_id] += amount
else: else:
self.other_stock_holdings[company_id] -= amount self.stock_holdings[company_id] -= amount
self.cash += -total_value if buying else total_value self.cash += -total_value if buying else total_value
def make_decision(self, market, competitors): def make_decision(self, market, competitors):
@ -314,7 +328,7 @@ class Company:
[f"[bold]{company}[/]: {ownership} shares" for company, ownership in self.own_stock_ownership.items()]) [f"[bold]{company}[/]: {ownership} shares" for company, ownership in self.own_stock_ownership.items()])
status_table.add_row("Your Shareholders", shareholders) status_table.add_row("Your Shareholders", shareholders)
investments = ', '.join( investments = ', '.join(
[f"[bold]{company}[/]: {holding} shares" for company, holding in self.other_stock_holdings.items() if [f"[bold]{company}[/]: {holding} shares" for company, holding in self.stock_holdings.items() if
holding > 0]) holding > 0])
status_table.add_row("Your Investments", investments) status_table.add_row("Your Investments", investments)
console.print(status_table) console.print(status_table)
@ -349,7 +363,7 @@ class Company:
products = list(market.products.keys()) products = list(market.products.keys())
print("\nAvailable Products:") print("\nAvailable Products:")
for idx, product in enumerate(products, 1): for idx, product in enumerate(products, 1):
print(f" {idx}: {product} - Price: {market.products[product]},00") print(f" {idx}: {product} - Price: {market.products[product]:.2f}")
product_choice = self.get_user_choice(len(products), "Choose a product to trade: ") product_choice = self.get_user_choice(len(products), "Choose a product to trade: ")
product = products[product_choice - 1] product = products[product_choice - 1]
@ -372,8 +386,8 @@ class Company:
for idx, company in enumerate(companies, 1): for idx, company in enumerate(companies, 1):
company_id = company.player_id company_id = company.player_id
stock_info = f" {idx}: {company_id} - Current stock price: {market.get_stock_price(company_id)}" stock_info = f" {idx}: {company_id} - Current stock price: {market.get_stock_price(company_id)}"
if action == 'sell' and self.other_stock_holdings.get(company_id, 0) > 0: if action == 'sell' and self.stock_holdings.get(company_id, 0) > 0:
stock_info += f", Owned: {self.other_stock_holdings[company_id]}" stock_info += f", Owned: {self.stock_holdings[company_id]}"
print(stock_info) print(stock_info)
company_choice = self.get_user_choice(len(companies), "Enter the company number to trade stocks: ") company_choice = self.get_user_choice(len(companies), "Enter the company number to trade stocks: ")
@ -478,10 +492,10 @@ class AICompany(Company):
def select_stock_to_sell(self): def select_stock_to_sell(self):
"""Chooses a company's stock to sell from the AI's holdings.""" """Chooses a company's stock to sell from the AI's holdings."""
owned_stocks = [(comp_id, amount) for comp_id, amount in self.other_stock_holdings.items() if amount > 0] owned_stocks = [(comp_id, amount) for comp_id, amount in self.stock_holdings.items() if amount > 0]
if owned_stocks: if owned_stocks:
company_id, _ = random.choice(owned_stocks) company_id, _ = random.choice(owned_stocks)
amount = random.randint(1, self.other_stock_holdings[company_id]) amount = random.randint(1, self.stock_holdings[company_id])
return company_id, amount return company_id, amount
return None, 0 return None, 0