Buy Sell
This commit is contained in:
124
game_balance/validator.py
Normal file
124
game_balance/validator.py
Normal file
@@ -0,0 +1,124 @@
|
||||
"""
|
||||
ВАЛИДАТОР БАЛАНСА
|
||||
Проверяет корректность настроек
|
||||
"""
|
||||
|
||||
class BalanceValidator:
|
||||
@staticmethod
|
||||
def validate_assets(assets):
|
||||
"""Проверка конфигурации активов"""
|
||||
errors = []
|
||||
|
||||
if not isinstance(assets, dict):
|
||||
errors.append("Assets config must be a dictionary")
|
||||
return errors
|
||||
|
||||
for asset_id, asset_data in assets.items():
|
||||
if not isinstance(asset_data, dict):
|
||||
errors.append(f"Asset {asset_id}: data must be a dictionary")
|
||||
continue
|
||||
|
||||
# Проверка обязательных полей
|
||||
required_fields = ['name', 'category', 'base_price', 'volatility']
|
||||
for field in required_fields:
|
||||
if field not in asset_data:
|
||||
errors.append(f"Asset {asset_id}: missing required field '{field}'")
|
||||
|
||||
# Проверка цены
|
||||
price = asset_data.get('base_price', 0)
|
||||
if not isinstance(price, (int, float)) or price <= 0:
|
||||
errors.append(f"Asset {asset_id}: base_price must be positive number")
|
||||
|
||||
# Проверка волатильности
|
||||
volatility = asset_data.get('volatility', 0)
|
||||
if not isinstance(volatility, (int, float)) or volatility < 0 or volatility > 1:
|
||||
errors.append(f"Asset {asset_id}: volatility must be between 0 and 1")
|
||||
|
||||
# Проверка доходности
|
||||
income = asset_data.get('income_per_month', 0)
|
||||
if not isinstance(income, (int, float)) or income < 0 or income > 0.5:
|
||||
errors.append(f"Asset {asset_id}: income_per_month must be between 0 and 0.5")
|
||||
|
||||
# Проверка количества
|
||||
total = asset_data.get('total_quantity')
|
||||
if total is not None:
|
||||
if not isinstance(total, (int, float)) or total <= 0:
|
||||
errors.append(f"Asset {asset_id}: total_quantity must be positive or None")
|
||||
|
||||
return errors
|
||||
|
||||
@staticmethod
|
||||
def validate_economy(economy_config):
|
||||
"""Проверка экономической конфигурации"""
|
||||
errors = []
|
||||
|
||||
if not isinstance(economy_config, dict):
|
||||
errors.append("Economy config must be a dictionary")
|
||||
return errors
|
||||
|
||||
# Проверка налогов
|
||||
tax_system = economy_config.get('TAX_SYSTEM', {})
|
||||
income_tax = tax_system.get('income_tax', [])
|
||||
|
||||
if not isinstance(income_tax, list):
|
||||
errors.append("income_tax must be a list")
|
||||
else:
|
||||
last_threshold = -1
|
||||
for i, bracket in enumerate(income_tax):
|
||||
if not isinstance(bracket, dict):
|
||||
errors.append(f"Tax bracket {i}: must be a dictionary")
|
||||
continue
|
||||
threshold = bracket.get('threshold', 0)
|
||||
if threshold <= last_threshold:
|
||||
errors.append(f"Tax brackets must be in ascending order at index {i}")
|
||||
last_threshold = threshold
|
||||
|
||||
# Проверка кредитов
|
||||
loan_system = economy_config.get('LOAN_SYSTEM', {})
|
||||
max_multiplier = loan_system.get('max_loan_multiplier', 0)
|
||||
if not isinstance(max_multiplier, (int, float)) or max_multiplier <= 0:
|
||||
errors.append("max_loan_multiplier must be positive")
|
||||
|
||||
# Проверка корреляций
|
||||
correlations = economy_config.get('ASSET_CORRELATIONS', {})
|
||||
if not isinstance(correlations, dict):
|
||||
errors.append("ASSET_CORRELATIONS must be a dictionary")
|
||||
else:
|
||||
for key, value in correlations.items():
|
||||
if not isinstance(key, str):
|
||||
errors.append(f"Correlation key must be string, got {type(key)}")
|
||||
if not isinstance(value, (int, float)) or value < -1 or value > 1:
|
||||
errors.append(f"Correlation value must be between -1 and 1, got {value}")
|
||||
|
||||
return errors
|
||||
|
||||
@staticmethod
|
||||
def validate_balance_mode(balance):
|
||||
"""Полная проверка режима баланса"""
|
||||
all_errors = []
|
||||
|
||||
# Проверяем наличие необходимых методов
|
||||
required_methods = ['get_assets_config', 'get_players_config', 'get_economy_config']
|
||||
for method in required_methods:
|
||||
if not hasattr(balance, method):
|
||||
all_errors.append(f"Balance mode missing required method: {method}")
|
||||
return all_errors
|
||||
|
||||
try:
|
||||
# Проверка активов
|
||||
assets = balance.get_assets_config()
|
||||
all_errors.extend(BalanceValidator.validate_assets(assets))
|
||||
|
||||
# Проверка экономики
|
||||
economy = balance.get_economy_config()
|
||||
all_errors.extend(BalanceValidator.validate_economy(economy))
|
||||
|
||||
# Проверка конфигурации игроков
|
||||
players = balance.get_players_config()
|
||||
if not isinstance(players, dict):
|
||||
all_errors.append("Players config must be a dictionary")
|
||||
|
||||
except Exception as e:
|
||||
all_errors.append(f"Error validating balance: {str(e)}")
|
||||
|
||||
return all_errors
|
||||
Reference in New Issue
Block a user