Files
cm/game_balance/assets_config.py
2026-02-11 17:44:26 +03:00

252 lines
8.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
НАСТРОЙКИ АКТИВОВ
"""
class AssetsConfig:
# Категории активов
ASSET_CATEGORIES = {
'bonds': {'name': 'Облигации', 'color': '#4CAF50', 'icon': '🏦'},
'stocks': {'name': 'Акции', 'color': '#2196F3', 'icon': '📈'},
'real_estate': {'name': 'Недвижимость', 'color': '#FF9800', 'icon': '🏠'},
'crypto': {'name': 'Криптовалюта', 'color': '#9C27B0', 'icon': '💰'},
'commodities': {'name': 'Сырье', 'color': '#795548', 'icon': ''},
'business': {'name': 'Бизнес', 'color': '#F44336', 'icon': '🏢'},
'unique': {'name': 'Уникальные', 'color': '#FFD700', 'icon': '🏆'},
}
# Список всех активов
ASSETS = {
# ОБЛИГАЦИИ
'gov_bonds': {
'name': 'Государственные облигации',
'category': 'bonds',
'base_price': 10000,
'volatility': 0.05,
'income_per_month': 0.01,
'risk_level': 1,
'liquidity': 10,
'total_quantity': None,
'max_per_player': None,
'min_purchase': 1,
'description': 'Самый надежный актив. Защита от кризисов.'
},
# АКЦИИ
'stock_gazprom': {
'name': 'Акции Газпрома',
'category': 'stocks',
'base_price': 1000,
'volatility': 0.15,
'income_per_month': 0.03,
'risk_level': 3,
'liquidity': 8,
'total_quantity': 10000,
'max_per_player': 2000,
'min_purchase': 10,
'description': 'Голубые фишки. Стабильные дивиденды.'
},
'stock_sberbank': {
'name': 'Акции Сбербанка',
'category': 'stocks',
'base_price': 300,
'volatility': 0.18,
'income_per_month': 0.04,
'risk_level': 4,
'liquidity': 9,
'total_quantity': 15000,
'max_per_player': 3000,
'min_purchase': 10,
'description': 'Крупнейший банк. Высокая ликвидность.'
},
'stock_yandex': {
'name': 'Акции Яндекса',
'category': 'stocks',
'base_price': 3500,
'volatility': 0.25,
'income_per_month': 0.00,
'risk_level': 6,
'liquidity': 7,
'total_quantity': 5000,
'max_per_player': 1000,
'min_purchase': 1,
'description': 'IT-гигант. Высокий рост, высокая волатильность.'
},
# НЕДВИЖИМОСТЬ
'apartment_small': {
'name': 'Небольшая квартира',
'category': 'real_estate',
'base_price': 5000000,
'volatility': 0.10,
'income_per_month': 0.02,
'risk_level': 2,
'liquidity': 4,
'total_quantity': 12,
'max_per_player': 3,
'min_purchase': 1,
'description': 'Стабильный доход от аренды.'
},
'apartment_elite': {
'name': 'Элитная квартира',
'category': 'real_estate',
'base_price': 15000000,
'volatility': 0.08,
'income_per_month': 0.03,
'risk_level': 2,
'liquidity': 2,
'total_quantity': 3,
'max_per_player': 1,
'min_purchase': 1,
'description': 'Статусный актив. Низкая волатильность.'
},
# КРИПТОВАЛЮТА
'bitcoin': {
'name': 'Биткоин',
'category': 'crypto',
'base_price': 2000000,
'volatility': 0.35,
'income_per_month': 0.00,
'risk_level': 9,
'liquidity': 7,
'total_quantity': None,
'max_per_player': None,
'min_purchase': 0.001,
'description': 'Высокорисковый актив. Только спекуляции.'
},
# СЫРЬЕ
'oil': {
'name': 'Нефть Brent',
'category': 'commodities',
'base_price': 5500,
'volatility': 0.25,
'income_per_month': 0.00,
'risk_level': 6,
'liquidity': 6,
'total_quantity': 200,
'max_per_player': 40,
'min_purchase': 10,
'description': 'Зависит от политики. Высокая волатильность.'
},
'natural_gas': {
'name': 'Природный газ',
'category': 'commodities',
'base_price': 3000,
'volatility': 0.20,
'income_per_month': 0.00,
'risk_level': 5,
'liquidity': 5,
'total_quantity': 300,
'max_per_player': 50,
'min_purchase': 100,
'description': 'Сезонный актив. Пик зимой.'
},
# БИЗНЕС
'coffee_shop': {
'name': 'Кофейня',
'category': 'business',
'base_price': 2000000,
'volatility': 0.12,
'income_per_month': 0.05,
'risk_level': 5,
'liquidity': 3,
'total_quantity': 8,
'max_per_player': 2,
'min_purchase': 1,
'description': 'Пассивный бизнес. Средний риск.'
},
'it_startup': {
'name': 'IT-стартап',
'category': 'business',
'base_price': 1000000,
'volatility': 0.40,
'income_per_month': 0.00,
'risk_level': 10,
'liquidity': 1,
'total_quantity': 4,
'max_per_player': 1,
'min_purchase': 1,
'description': 'Венчурные инвестиции. Может взлететь или провалиться.'
},
# УНИКАЛЬНЫЕ
'shopping_mall': {
'name': 'Торговый центр',
'category': 'unique',
'base_price': 50000000,
'volatility': 0.10,
'income_per_month': 0.06,
'risk_level': 4,
'liquidity': 1,
'total_quantity': 1,
'max_per_player': 1,
'min_purchase': 1,
'description': 'Ключевой актив. Контроль над малым бизнесом.',
'special_rules': {
'can_be_fractional': True,
'min_fraction': 0.1,
'control_bonus': 0.1
}
},
'oil_field': {
'name': 'Нефтяное месторождение',
'category': 'unique',
'base_price': 100000000,
'volatility': 0.20,
'income_per_month': 0.08,
'risk_level': 7,
'liquidity': 1,
'total_quantity': 1,
'max_per_player': 1,
'min_purchase': 1,
'description': 'Стратегический актив. Контроль над ценами на нефть.',
'special_rules': {
'affects_other_assets': ['oil'],
'price_influence': 0.15
}
}
}
@staticmethod
def calculate_price(asset_data, demand_factor, month, total_players):
"""Расчет текущей цены актива"""
base_price = asset_data['base_price']
volatility = asset_data['volatility']
# Базовое изменение от спроса
price = base_price * (1 + demand_factor * volatility)
# Инфляция (0.5% в месяц)
price *= (1.005 ** month)
# Ограничения
price = max(price, base_price * 0.1) # Не ниже 10% от базы
price = min(price, base_price * 5) # Не выше 500% от базы
# Округление
if price < 1000:
return round(price, 2)
elif price < 1000000:
return round(price, 0)
else:
return round(price, -3)
@staticmethod
def calculate_income(asset_data, player_share, total_owners):
"""Расчет доходности с учетом баланса"""
base_income = asset_data['income_per_month']
if base_income <= 0:
return 0
# Штраф за концентрацию (если много владельцев у одного игрока)
if total_owners > 0:
concentration_penalty = (player_share ** 2) * 0.2
income = base_income * (1 - concentration_penalty)
else:
income = base_income
return max(income, 0.001) # Минимум 0.1%