{% extends "base.html" %} {% block content %}
{% if player.avatar_url %} {% else %}
{{ player.username[:2] | upper if player.username else '??' }}
{% endif %} {% if session.get('is_admin') %} {% endif %}

{{ player.username }}

{{ player.steam_id_64 }}

{% for tag in metadata.tags %} {{ tag }} {% if session.get('is_admin') %}
{% endif %}
{% endfor %} {% if session.get('is_admin') %}
{% endif %}
{% macro stat_card(label, metric_key, format_str, icon) %} {% set dist = distribution[metric_key] if distribution else None %}
{{ icon }} {{ label }}
{% if dist %} Rank #{{ dist.rank }} {% endif %}
{{ format_str.format(dist.val if dist else 0) }}
{% if dist %}
{% set range = dist.max - dist.min %} {% set percent = ((dist.val - dist.min) / range * 100) if range > 0 else 100 %}
{{ format_str.format(dist.min) }} Avg: {{ format_str.format(dist.avg) }} {{ format_str.format(dist.max) }}
{% else %}
No team data
{% endif %}
{% endmacro %} {{ stat_card('Rating', 'rating', '{:.2f}', '⭐') }} {{ stat_card('K/D Ratio', 'kd', '{:.2f}', '🔫') }} {{ stat_card('ADR', 'adr', '{:.1f}', '🔥') }} {{ stat_card('KAST', 'kast', '{:.1%}', '🛡️') }}

📈 近期表现走势 (Performance Trend)

Carry (>1.5)
Normal (1.0-1.5)
Poor (<0.6)

🕸️ 能力六维图 (Capabilities)

📊 详细数据面板 (Detailed Stats)

{% macro detail_item(label, value, key, format_str='{:.2f}', sublabel=None, count_label=None) %} {% set dist = distribution[key] if distribution else None %}
{{ label }} {% if dist %} #{{ dist.rank }} {% endif %}
{{ format_str.format(value if value is not none else 0) }} {% if sublabel %} {{ sublabel }} {% endif %}
{% if dist %}
{% set range = dist.max - dist.min %} {% set percent = ((dist.val - dist.min) / range * 100) if range > 0 else 100 %}
{% set avg_pct = ((dist.avg - dist.min) / range * 100) if range > 0 else 50 %}
L:{{ format_str.format(dist.min) }} H:{{ format_str.format(dist.max) }}
{% endif %} {% if count_label is not none %}
{{ count_label }}
{% endif %}
{% endmacro %} {{ detail_item('Rating (评分)', features['basic_avg_rating'], 'basic_avg_rating') }} {{ detail_item('KD Ratio (击杀比)', features['basic_avg_kd'], 'basic_avg_kd') }} {{ detail_item('KAST (贡献率)', features['basic_avg_kast'], 'basic_avg_kast', '{:.1%}') }} {{ detail_item('RWS (每局得分)', features['basic_avg_rws'], 'basic_avg_rws') }} {{ detail_item('ADR (场均伤害)', features['basic_avg_adr'], 'basic_avg_adr', '{:.1f}') }} {{ detail_item('Avg HS (场均爆头)', features['basic_avg_headshot_kills'], 'basic_avg_headshot_kills') }} {{ detail_item('HS Rate (爆头率)', features['basic_headshot_rate'], 'basic_headshot_rate', '{:.1%}') }} {{ detail_item('Assists (场均助攻)', features['basic_avg_assisted_kill'], 'basic_avg_assisted_kill') }} {{ detail_item('AWP Kills (狙击击杀)', features['basic_avg_awp_kill'], 'basic_avg_awp_kill') }} {{ detail_item('Jumps (场均跳跃)', features['basic_avg_jump_count'], 'basic_avg_jump_count', '{:.1f}') }} {{ detail_item('MVP (最有价值)', features['basic_avg_mvps'], 'basic_avg_mvps') }} {{ detail_item('Plants (下包)', features['basic_avg_plants'], 'basic_avg_plants') }} {{ detail_item('Defuses (拆包)', features['basic_avg_defuses'], 'basic_avg_defuses') }} {{ detail_item('Flash Assist (闪光助攻)', features['basic_avg_flash_assists'], 'basic_avg_flash_assists') }} {{ detail_item('First Kill (场均首杀)', features['basic_avg_first_kill'], 'basic_avg_first_kill') }} {{ detail_item('First Death (场均首死)', features['basic_avg_first_death'], 'basic_avg_first_death') }} {{ detail_item('FK Rate (首杀率)', features['basic_first_kill_rate'], 'basic_first_kill_rate', '{:.1%}') }} {{ detail_item('FD Rate (首死率)', features['basic_first_death_rate'], 'basic_first_death_rate', '{:.1%}') }} {{ detail_item('2K Rounds (双杀)', features['basic_avg_kill_2'], 'basic_avg_kill_2') }} {{ detail_item('3K Rounds (三杀)', features['basic_avg_kill_3'], 'basic_avg_kill_3') }} {{ detail_item('4K Rounds (四杀)', features['basic_avg_kill_4'], 'basic_avg_kill_4') }} {{ detail_item('5K Rounds (五杀)', features['basic_avg_kill_5'], 'basic_avg_kill_5') }} {{ detail_item('Perfect Kills (无伤杀)', features['basic_avg_perfect_kill'], 'basic_avg_perfect_kill') }} {{ detail_item('Revenge Kills (复仇杀)', features['basic_avg_revenge_kill'], 'basic_avg_revenge_kill') }}

🔬 深层能力维度 (Deep Capabilities Breakdown)

STA (Stability) & BAT (Aim/Battle)

{{ detail_item('Last 30 Rating (近30场)', features['sta_last_30_rating'], 'sta_last_30_rating') }} {{ detail_item('Win Rating (胜局)', features['sta_win_rating'], 'sta_win_rating') }} {{ detail_item('Loss Rating (败局)', features['sta_loss_rating'], 'sta_loss_rating') }} {{ detail_item('Volatility (波动)', features['sta_rating_volatility'], 'sta_rating_volatility') }} {{ detail_item('Time Corr (耐力)', features['sta_time_rating_corr'], 'sta_time_rating_corr') }} {{ detail_item('High Elo KD Diff (高分抗压)', features['bat_kd_diff_high_elo'], 'bat_kd_diff_high_elo') }} {{ detail_item('Duel Win% (对枪胜率)', features['bat_avg_duel_win_rate'], 'bat_avg_duel_win_rate', '{:.1%}') }}

HPS (Clutch/Pressure) & PTL (Pistol)

{{ detail_item('1v1 Win% (1v1胜率)', features['hps_clutch_win_rate_1v1'], 'hps_clutch_win_rate_1v1', '{:.1%}') }} {{ detail_item('1v3+ Win% (残局大神)', features['hps_clutch_win_rate_1v3_plus'], 'hps_clutch_win_rate_1v3_plus', '{:.1%}') }} {{ detail_item('Match Pt Win% (赛点胜率)', features['hps_match_point_win_rate'], 'hps_match_point_win_rate', '{:.1%}') }} {{ detail_item('Pressure Entry (逆风首杀)', features['hps_pressure_entry_rate'], 'hps_pressure_entry_rate', '{:.1%}') }} {{ detail_item('Comeback KD (翻盘KD)', features['hps_comeback_kd_diff'], 'hps_comeback_kd_diff') }} {{ detail_item('Loss Streak KD (连败KD)', features['hps_losing_streak_kd_diff'], 'hps_losing_streak_kd_diff') }} {{ detail_item('Pistol Kills (手枪击杀)', features['ptl_pistol_kills'], 'ptl_pistol_kills') }} {{ detail_item('Pistol Win% (手枪胜率)', features['ptl_pistol_win_rate'], 'ptl_pistol_win_rate', '{:.1%}') }} {{ detail_item('Pistol KD (手枪KD)', features['ptl_pistol_kd'], 'ptl_pistol_kd') }} {{ detail_item('Pistol Util Eff (手枪道具)', features['ptl_pistol_util_efficiency'], 'ptl_pistol_util_efficiency', '{:.1%}') }}

UTIL (Utility Usage)

{{ detail_item('Usage Rate (道具频率)', features['util_usage_rate'], 'util_usage_rate') }} {{ detail_item('Nade Dmg (雷火伤)', features['util_avg_nade_dmg'], 'util_avg_nade_dmg', '{:.1f}') }} {{ detail_item('Flash Time (致盲时间)', features['util_avg_flash_time'], 'util_avg_flash_time', '{:.2f}s') }} {{ detail_item('Flash Enemy (致盲人数)', features['util_avg_flash_enemy'], 'util_avg_flash_enemy') }}

SPECIAL (Clutch & Multi)

{% set rounds = l2_stats.get('total_rounds', 0) or 1 %}
{{ detail_item('1v1 Win%', (l2_stats.get('c1', 0) or 0) / rounds, 'l2_c1', '{:.1%}', count_label=l2_stats.get('c1', 0)) }} {{ detail_item('1v2 Win%', (l2_stats.get('c2', 0) or 0) / rounds, 'l2_c2', '{:.1%}', count_label=l2_stats.get('c2', 0)) }} {{ detail_item('1v3 Win%', (l2_stats.get('c3', 0) or 0) / rounds, 'l2_c3', '{:.1%}', count_label=l2_stats.get('c3', 0)) }} {{ detail_item('1v4 Win%', (l2_stats.get('c4', 0) or 0) / rounds, 'l2_c4', '{:.1%}', count_label=l2_stats.get('c4', 0)) }} {{ detail_item('1v5 Win%', (l2_stats.get('c5', 0) or 0) / rounds, 'l2_c5', '{:.1%}', count_label=l2_stats.get('c5', 0)) }} {% set mk_count = (l2_stats.get('k2', 0) or 0) + (l2_stats.get('k3', 0) or 0) + (l2_stats.get('k4', 0) or 0) + (l2_stats.get('k5', 0) or 0) %} {% set ma_count = (l2_stats.get('a2', 0) or 0) + (l2_stats.get('a3', 0) or 0) + (l2_stats.get('a4', 0) or 0) + (l2_stats.get('a5', 0) or 0) %} {{ detail_item('Multi-Kill Rate', mk_count / rounds, 'l2_mk', '{:.1%}', count_label=mk_count) }} {{ detail_item('Multi-Assist Rate', ma_count / rounds, 'l2_ma', '{:.1%}', count_label=ma_count) }}

SIDE (T/CT Preference)

{% macro vs_item_val(label, t_val, ct_val, format_str='{:.2f}') %} {% set diff = ct_val - t_val %} {# Dynamic Sizing #} {% set t_size = 'text-2xl' if t_val > ct_val else 'text-sm text-gray-500 dark:text-gray-400' %} {% set ct_size = 'text-2xl' if ct_val > t_val else 'text-sm text-gray-500 dark:text-gray-400' %} {% if t_val == ct_val %} {% set t_size = 'text-lg' %} {% set ct_size = 'text-lg' %} {% endif %}
{{ label }} {% if diff|abs > 0.001 %} {% if diff > 0 %}CT +{{ format_str.format(diff) }} {% else %}T +{{ format_str.format(diff|abs) }}{% endif %} {% endif %}
T-Side {{ format_str.format(t_val) }}
CT-Side {{ format_str.format(ct_val) }}
{% set total = t_val + ct_val %} {% if total > 0 %} {% set t_pct = (t_val / total) * 100 %}
{% else %}
{% endif %}
{% endmacro %} {% macro vs_item(label, t_key, ct_key, format_str='{:.2f}') %} {{ vs_item_val(label, features[t_key] or 0, features[ct_key] or 0, format_str) }} {% endmacro %}
{{ vs_item('Rating (Rating/KD)', 'side_rating_t', 'side_rating_ct') }} {{ vs_item('KD Ratio', 'side_kd_t', 'side_kd_ct') }} {{ vs_item('Win Rate (胜率)', 'side_win_rate_t', 'side_win_rate_ct', '{:.1%}') }} {{ vs_item('First Kill Rate (首杀率)', 'side_first_kill_rate_t', 'side_first_kill_rate_ct', '{:.1%}') }} {{ vs_item('First Death Rate (首死率)', 'side_first_death_rate_t', 'side_first_death_rate_ct', '{:.1%}') }} {{ vs_item('KAST (贡献率)', 'side_kast_t', 'side_kast_ct', '{:.1%}') }} {{ vs_item('RWS (Round Win Share)', 'side_rws_t', 'side_rws_ct') }} {{ vs_item('Headshot Rate (爆头率)', 'side_headshot_rate_t', 'side_headshot_rate_ct', '{:.1%}') }} {# New Comparisons #} {% set t_rounds = side_stats.get('T', {}).get('rounds', 0) or 1 %} {% set ct_rounds = side_stats.get('CT', {}).get('rounds', 0) or 1 %} {% set t_clutch = (side_stats.get('T', {}).get('total_clutch', 0) or 0) / t_rounds %} {% set ct_clutch = (side_stats.get('CT', {}).get('total_clutch', 0) or 0) / ct_rounds %} {{ vs_item_val('Clutch Win Rate (残局率)', t_clutch, ct_clutch, '{:.1%}') }} {% set t_mk = (side_stats.get('T', {}).get('total_multikill', 0) or 0) / t_rounds %} {% set ct_mk = (side_stats.get('CT', {}).get('total_multikill', 0) or 0) / ct_rounds %} {{ vs_item_val('Multi-Kill Rate (多杀率)', t_mk, ct_mk, '{:.1%}') }} {% set t_ma = (side_stats.get('T', {}).get('total_multiassist', 0) or 0) / t_rounds %} {% set ct_ma = (side_stats.get('CT', {}).get('total_multiassist', 0) or 0) / ct_rounds %} {{ vs_item_val('Multi-Assist Rate (多助攻)', t_ma, ct_ma, '{:.1%}') }}

比赛记录 (Match History)

{{ history|length }} Matches
{% for m in history | reverse %} {% else %} {% endfor %}
Date/Map Result Rating K/D ADR Link
{{ m.map_name }}
{{ 'WIN' if m.is_win else 'LOSS' }} {% if m.party_size and m.party_size > 1 %} 👥 {{ m.party_size }} {% endif %}
{% set r = m.rating or 0 %}
{{ "%.2f"|format(r) }}
{{ "%.2f"|format(m.kd_ratio or 0) }} {{ "%.1f"|format(m.adr or 0) }}
🏜️
No matches recorded yet.

地图数据 (Map Stats)

{% for m in map_stats %}
{{ m.map_name[:3] }}
{{ m.map_name }}
{{ m.matches }} matches
{{ "%.2f"|format(m.rating) }}
{{ "%.0f"|format(m.win_rate * 100) }}% Win {{ "%.1f"|format(m.adr) }} ADR
{% else %}
No map data available.
{% endfor %}

留言板 (Comments)

{% for comment in comments %}
{{ comment.username[:1] | upper }}
{{ comment.username }} {{ comment.created_at }}

{{ comment.content }}

{% else %}
No comments yet.
{% endfor %}
{% endblock %} {% block scripts %} {% endblock %}