# Property Tycoon Property.py
# Contains the classes for the properties, such as the rent, the house costs, and the hotel costs.
[docs]
class Property:
def __init__(self, data):
self.name = data["name"]
self.group = data["group"]
self.price = data.get("price", 0)
self.base_rent = data.get("rent", 0)
self.owner = None
self.houses = 0
self.has_hotel = False
self.house_costs = data.get("house_costs", [])
self.is_station = data.get("is_station", False)
self.is_utility = data.get("is_utility", False)
self.mortgaged = False
# rent calculation logic
[docs]
def calculate_rent(self, dice_roll=None, properties=None):
if self.mortgaged:
return 0
if self.is_station:
if not properties:
return self.base_rent
station_count = sum(
1 for p in properties if p.is_station and p.owner == self.owner
)
return self.base_rent * (2 ** (station_count - 1))
elif self.is_utility:
if not properties or not dice_roll:
return 0
utility_count = sum(
1 for p in properties if p.is_utility and p.owner == self.owner
)
multiplier = 10 if utility_count > 1 else 4
return dice_roll * multiplier
else:
if self.has_hotel:
return self.house_costs[-1] if self.house_costs else self.base_rent * 5
elif self.houses > 0:
house_index = min(self.houses - 1, len(self.house_costs) - 1)
return (
self.house_costs[house_index]
if self.house_costs
else self.base_rent * (self.houses + 1)
)
elif self.has_monopoly(properties):
return self.base_rent * 2
return self.base_rent
# monopoly check
[docs]
def has_monopoly(self, properties):
if not self.group or not properties:
return False
group_properties = [p for p in properties if p.group == self.group]
return all(p.owner == self.owner for p in group_properties)
# house build check
[docs]
def can_build_house(self, properties):
if self.is_station or self.is_utility or self.mortgaged or self.has_hotel:
return False
if not self.has_monopoly(properties):
return False
if not properties:
return False
group_properties = [p for p in properties if p.group == self.group]
min_houses = min(p.houses for p in group_properties)
return self.houses <= min_houses
# hotel build check
[docs]
def can_build_hotel(self, properties):
if self.is_station or self.is_utility or self.mortgaged or self.has_hotel:
return False
if not self.has_monopoly(properties):
return False
if self.houses < 5:
return False
if not properties:
return False
group_properties = [p for p in properties if p.group == self.group]
return all(p.houses >= 5 for p in group_properties)
# build house logic
[docs]
def build_house(self):
if not self.has_hotel:
self.houses += 1
return True
return False
# build hotel logic
[docs]
def build_hotel(self):
if self.houses >= 5 and not self.has_hotel:
self.houses = 0
self.has_hotel = True
return True
return False
# sell house logic
[docs]
def sell_house(self):
if self.houses > 0:
self.houses -= 1
return True
return False
# sell hotel logic
[docs]
def sell_hotel(self):
if self.has_hotel:
self.has_hotel = False
self.houses = 5
return True
return False
# mortgage logic
[docs]
def mortgage(self):
if not self.mortgaged and self.houses == 0 and not self.has_hotel:
self.mortgaged = True
return True
return False
[docs]
def unmortgage(self):
if self.mortgaged:
self.mortgaged = False
return True
return False
[docs]
def get_mortgage_value(self):
return self.price // 2
[docs]
def get_unmortgage_cost(self):
return int(self.get_mortgage_value() * 1.1)
[docs]
def get_house_sale_value(self):
if not self.house_costs:
return 0
house_cost = self.house_costs[0]
return house_cost // 2
[docs]
def get_hotel_sale_value(self):
if not self.house_costs:
return 0
hotel_purchase_price = self.house_costs[0] * 5 if self.house_costs else 0
return hotel_purchase_price // 2
[docs]
def charge_rent(self, player, dice_roll=None):
if self.owner and self.owner != player:
rent = self.calculate_rent(dice_roll, self.owner.properties)
print(
f"{player.name} landed on {self.name}, paying £{rent} rent to {self.owner.name}"
)
player.pay(rent)
self.owner.receive(rent)
return rent
return 0