chore: initial commit — CS2 Simulator

This commit is contained in:
2026-07-05 10:40:00 +00:00
commit c268557997
40 changed files with 824236 additions and 0 deletions
+91
View File
@@ -0,0 +1,91 @@
import random
import math
from datetime import datetime
from sqlalchemy.orm import Session
from database import User, UpgradeRPU, Upgrade
def get_upgrade_rpu(db: Session, user_id: int) -> UpgradeRPU:
"""Получает или создает настройки РПУ апгрейдов"""
rpu = db.query(UpgradeRPU).filter(UpgradeRPU.user_id == user_id).first()
if not rpu:
rpu = UpgradeRPU(user_id=user_id)
db.add(rpu)
db.commit()
db.refresh(rpu)
return rpu
def calculate_upgrade_probability(input_price: float, target_price: float) -> float:
if input_price <= 0 or target_price <= 0:
return 50.0
if target_price <= input_price:
return -1.0
probability = (input_price / target_price) * 100
return max(1.0, min(75.0, probability))
def get_adjusted_upgrade_probability(db: Session, user_id: int, base_probability: float) -> float:
if base_probability < 0:
return -1.0
rpu = get_upgrade_rpu(db, user_id)
adjusted = base_probability * rpu.upgrade_multiplier
return max(1.0, min(75.0, adjusted))
def spin_upgrade_wheel(success_probability: float) -> tuple[bool, float, int, float]:
raw_angle = random.uniform(0, 360)
half_green = (success_probability / 100) * 180
# Green zone: [180 - half_green, 180 + half_green] — centered at 180° (bottom)
# Матчим CSS конусный градиент: from calc(180deg - prob * 3.6deg / 2)
success = 180 - half_green <= raw_angle <= 180 + half_green
margin = max(3, half_green * 0.12)
if success:
rotations = random.randint(7, 9)
lo = max(0, 180 - half_green + margin)
hi = min(360, 180 + half_green - margin)
if lo < hi:
target_angle = random.uniform(lo, hi)
else:
target_angle = random.uniform(max(0, 180 - half_green + 1), min(360, 180 + half_green - 1))
else:
rotations = random.randint(6, 8)
left_size = max(0, 180 - half_green - 3)
right_start = min(360, 180 + half_green + 3)
right_size = max(0, 360 - right_start)
if left_size >= right_size:
lo = 0
hi = max(0, 180 - half_green - 3)
else:
lo = min(360, 180 + half_green + 3)
hi = 360
if lo < hi:
target_angle = random.uniform(lo, hi)
else:
target_angle = random.uniform(0, 360)
final_angle = target_angle + rotations * 360
return success, final_angle, rotations, raw_angle
def update_upgrade_stats(db: Session, user_id: int, success: bool, input_price: float):
rpu = get_upgrade_rpu(db, user_id)
rpu.total_attempts += 1
if success:
rpu.total_success += 1
else:
rpu.total_spent_value += input_price
if rpu.auto_adjust and rpu.total_attempts >= 15:
rate = rpu.total_success / rpu.total_attempts
if rate < 0.2:
rpu.upgrade_multiplier = min(2.0, rpu.upgrade_multiplier + 0.1)
elif rate > 0.6:
rpu.upgrade_multiplier = max(0.5, rpu.upgrade_multiplier - 0.1)
db.commit()