2289 lines
172 KiB
HTML
2289 lines
172 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="es-AR">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
|
||
<meta name="description" content="1v9: Convertite en Leyenda — simulador de carrera de pro player de League of Legends. Elegí tu región, farmeá el sueño, ganá Worlds. Todo en 2 minutos.">
|
||
<meta name="theme-color" content="#0a0a0c">
|
||
<title>1v9: Convertite en Leyenda — Simulador de carrera LoL</title>
|
||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Crect width='100' height='100' rx='16' fill='%230a0a0c'/%3E%3Ctext x='50' y='66' font-size='46' text-anchor='middle' fill='%23d9730a' font-family='sans-serif' font-weight='bold'%3E1v9%3C/text%3E%3C/svg%3E">
|
||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap" rel="stylesheet">
|
||
<style>
|
||
:root{
|
||
--bg-base:#0a0a0c; --bg-card:#18181b; --bg-card-alt:#1f1f23; --bg-row-active:#0e3a3f;
|
||
--accent-ovr:#d9730a; --accent-role:#7c3aed;
|
||
--text-primary:#f4f4f5; --text-secondary:#a1a1aa; --text-muted:#52525b;
|
||
--success:#22c55e; --danger:#ef4444; --border-subtle:#27272a;
|
||
--radius-card:12px; --radius-badge:6px; --radius-pill:999px;
|
||
}
|
||
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
|
||
html,body{height:100%}
|
||
body{background:var(--bg-base); color:var(--text-primary); font-family:'Inter',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif; display:flex; justify-content:center; min-height:100vh; overflow-x:hidden}
|
||
#app{width:100%; max-width:1100px; min-height:100dvh; display:flex; flex-direction:column; position:relative; margin:0 auto}
|
||
.screen{display:none; flex-direction:column; padding:20px 20px calc(24px + env(safe-area-inset-bottom)); flex:1; animation:fadeIn .3s ease}
|
||
.screen.active{display:flex}
|
||
@keyframes fadeIn{from{opacity:0; transform:translateY(6px)}to{opacity:1; transform:none}}
|
||
button{font-family:inherit; cursor:pointer; border:none; background:none; color:inherit}
|
||
h1,h2,h3{font-weight:800; letter-spacing:.01em}
|
||
.btn{display:inline-flex; align-items:center; justify-content:center; gap:8px; padding:13px 22px; border-radius:var(--radius-pill); background:var(--accent-ovr); color:#1a1a1a; font-weight:800; font-size:15px; transition:transform .12s ease}
|
||
.btn:active{transform:scale(.97)}
|
||
.btn.secondary{background:var(--bg-card-alt); color:var(--text-primary); border:1px solid var(--border-subtle)}
|
||
.btn.ghost{background:transparent; border:1px solid var(--border-subtle); color:var(--text-secondary)}
|
||
.btn:disabled{opacity:.45; pointer-events:none}
|
||
.badge{display:inline-flex; align-items:center; gap:5px; padding:3px 8px; border-radius:var(--radius-badge); font-size:11px; font-weight:700; letter-spacing:.03em}
|
||
.badge-dim{background:var(--bg-card-alt); color:var(--text-secondary); border:1px solid var(--border-subtle)}
|
||
.badge-role{background:var(--accent-role); color:#fff}
|
||
.badge-ovr{background:var(--accent-ovr); color:#1a1a1a}
|
||
.pill{display:inline-flex; align-items:center; gap:4px; padding:3px 10px; border-radius:var(--radius-pill); font-size:11px; font-weight:800}
|
||
.pill.success{background:rgba(34,197,94,.14); color:var(--success); border:1px solid rgba(34,197,94,.35)}
|
||
.pill.danger{background:rgba(239,68,68,.14); color:var(--danger); border:1px solid rgba(239,68,68,.35)}
|
||
.pill.neutral{background:var(--bg-card-alt); color:var(--text-secondary); border:1px solid var(--border-subtle)}
|
||
.stat-num{font-size:24px; font-weight:800; line-height:1; color:var(--text-primary)}
|
||
.stat-lbl{font-size:9px; font-weight:700; letter-spacing:.08em; text-transform:uppercase; color:var(--text-muted); margin-top:4px}
|
||
.smallprint{font-size:10.5px; color:var(--text-muted); text-align:center; line-height:1.5; margin-top:10px}
|
||
.fallback{display:flex; align-items:center; justify-content:center; font-weight:800; color:var(--text-muted); background:var(--bg-card-alt); border:1px solid var(--border-subtle); border-radius:var(--radius-badge); overflow:hidden}
|
||
img.logo{object-fit:contain; background:var(--bg-card-alt); border:1px solid var(--border-subtle); border-radius:var(--radius-badge)}
|
||
#landing{justify-content:center; text-align:center; gap:14px}
|
||
.logo-big{font-weight:800; font-size:76px; line-height:.9; letter-spacing:-.02em; background:linear-gradient(180deg,#fff,var(--accent-ovr)); -webkit-background-clip:text; background-clip:text; color:transparent}
|
||
.logo-sub{font-size:20px; color:var(--text-secondary); letter-spacing:.14em; text-transform:uppercase; font-weight:700}
|
||
.tagline{color:var(--text-secondary); font-size:14.5px; line-height:1.55; max-width:420px; margin:0 auto}
|
||
.land-tags{display:flex; gap:8px; justify-content:center; flex-wrap:wrap; margin-top:6px}
|
||
.land-tags span{font-size:11px; color:var(--text-secondary); border:1px solid var(--border-subtle); border-radius:var(--radius-pill); padding:5px 12px; background:var(--bg-card)}
|
||
.logo-strip{display:flex; gap:10px; justify-content:center; flex-wrap:wrap; margin:18px 0 6px; opacity:.9}
|
||
.logo-strip img, .logo-strip .fallback{width:40px; height:40px; border-radius:var(--radius-badge); border:1px solid var(--border-subtle); padding:3px}
|
||
.hall{width:100%; max-width:480px; background:var(--bg-card); border:1px solid var(--border-subtle); border-radius:var(--radius-card); padding:14px 16px; margin:14px auto 0; text-align:left}
|
||
.hall h3{color:var(--accent-ovr); font-size:15px; letter-spacing:.05em}
|
||
.hall ol{list-style:none; margin-top:8px}
|
||
.hall li{display:flex; align-items:center; gap:10px; padding:7px 0; border-bottom:1px dashed var(--border-subtle); font-size:13.5px}
|
||
.hall li:last-child{border-bottom:none}
|
||
.hall .medal{width:26px; height:26px; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:12px; font-weight:800; color:#1a1a1a; flex:none}
|
||
.hall li:first-child .medal{background:var(--accent-ovr)}
|
||
.hall li:nth-child(2) .medal{background:#b8bfcc}
|
||
.hall li:nth-child(3) .medal{background:#b07d4f}
|
||
.hall .rval{margin-left:auto; color:var(--text-primary); font-weight:800; font-size:14px}
|
||
.hall .empty{color:var(--text-muted); font-size:13px}
|
||
#create{justify-content:flex-start; gap:18px; max-width:560px; margin:0 auto; width:100%}
|
||
.create-head h2{font-size:28px}
|
||
.create-head p{color:var(--text-muted); font-size:13.5px; margin-top:2px}
|
||
.field label{display:block; font-size:11px; font-weight:700; letter-spacing:.08em; color:var(--text-secondary); text-transform:uppercase; margin-bottom:8px}
|
||
.input{width:100%; padding:13px 16px; border-radius:var(--radius-card); border:1px solid var(--border-subtle); background:var(--bg-card); color:var(--text-primary); font-size:15px; outline:none}
|
||
.input:focus{border-color:var(--accent-ovr)}
|
||
.row2{display:grid; grid-template-columns:1fr 1fr; gap:12px}
|
||
.seg{display:grid; grid-auto-flow:column; grid-auto-columns:1fr; gap:8px}
|
||
.seg .opt{padding:12px 6px; border-radius:var(--radius-card); border:1px solid var(--border-subtle); background:var(--bg-card); text-align:center; font-size:13px; font-weight:700; color:var(--text-secondary)}
|
||
.seg .opt small{display:block; font-size:10.5px; color:var(--text-muted); font-weight:600; margin-top:2px}
|
||
.seg .opt.on{border-color:var(--accent-ovr); color:var(--text-primary); background:var(--bg-card-alt)}
|
||
.grid2{display:grid; grid-template-columns:1fr 1fr; gap:10px}
|
||
.region-card{padding:13px; border-radius:var(--radius-card); border:1px solid var(--border-subtle); background:var(--bg-card); transition:all .15s; text-align:left}
|
||
.region-card h3{font-size:17px}
|
||
.region-card p{font-size:11px; color:var(--text-muted); line-height:1.45; margin-top:4px}
|
||
.region-card.on{border-color:var(--accent-ovr); background:var(--bg-card-alt); transform:translateY(-1px)}
|
||
.role-grid{display:grid; grid-template-columns:repeat(5,1fr); gap:8px}
|
||
.role-card{padding:12px 6px; border-radius:var(--radius-card); border:1px solid var(--border-subtle); background:var(--bg-card); text-align:center}
|
||
.role-card .em{font-size:24px}
|
||
.role-card .nm{font-weight:800; font-size:12px; margin-top:4px}
|
||
.role-card .st{font-size:9.5px; color:var(--text-muted); margin-top:2px; line-height:1.3}
|
||
.role-card.on{border-color:var(--accent-role); background:var(--bg-card-alt)}
|
||
.hint{font-size:11.5px; color:var(--text-muted); line-height:1.5}
|
||
#career{justify-content:flex-start; gap:16px}
|
||
.career-grid{display:grid; grid-template-columns:3fr 2fr; gap:18px; align-items:start}
|
||
.career-left{display:flex; flex-direction:column; gap:14px; min-width:0}
|
||
.player-card{display:flex; gap:14px; background:var(--bg-card); border:1px solid var(--border-subtle); border-radius:var(--radius-card); padding:16px}
|
||
.elo-badge{width:74px; height:74px; border-radius:var(--radius-card); background:var(--accent-ovr); display:flex; flex-direction:column; align-items:center; justify-content:center; flex:none; color:#1a1a1a}
|
||
.elo-badge .lbl{font-size:9px; font-weight:800; letter-spacing:.1em}
|
||
.elo-badge .num{font-size:34px; font-weight:800; line-height:1; margin-top:2px}
|
||
.player-meta{flex:1; min-width:0; display:flex; flex-direction:column; gap:6px}
|
||
.player-meta .meta-top{display:flex; align-items:center; gap:6px; flex-wrap:wrap}
|
||
.player-meta .meta-top .right{margin-left:auto; display:flex; align-items:center; gap:8px; font-size:11px; color:var(--text-secondary); font-weight:700}
|
||
.player-meta .org-line{display:flex; align-items:center; gap:8px; margin-top:2px}
|
||
.player-meta .org-line img, .player-meta .org-line .fallback{width:30px; height:30px; border-radius:var(--radius-badge); padding:2px}
|
||
.player-meta .org-line .org-name{font-size:17px; font-weight:800; white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
|
||
.player-meta .value-line{font-size:12px; color:var(--text-secondary)}
|
||
.player-meta .value-line b{color:var(--text-primary); font-weight:800}
|
||
.stats-row3{display:grid; grid-template-columns:repeat(3,1fr); gap:8px}
|
||
.stat3{background:var(--bg-card); border:1px solid var(--border-subtle); border-radius:var(--radius-card); padding:12px 8px; text-align:center}
|
||
.stat3 .ic{font-size:16px; margin-bottom:3px}
|
||
.stat3 .stat-num{font-size:26px}
|
||
.stat3 .stat-lbl{font-size:10px}
|
||
.achievements{background:var(--bg-card); border:1px solid var(--border-subtle); border-radius:var(--radius-card); padding:16px; text-align:center; min-height:66px}
|
||
.achievements .empty-ach{color:var(--text-muted); font-size:13px; font-weight:700; letter-spacing:.06em; text-transform:uppercase}
|
||
.achievements .ach-trophy{font-size:30px; opacity:.4; margin-bottom:6px}
|
||
.achievements .ach-list{display:flex; flex-wrap:wrap; gap:6px; justify-content:center}
|
||
.achievements .ach-chip{display:inline-flex; align-items:center; gap:5px; font-size:11px; font-weight:700; padding:4px 10px; border-radius:var(--radius-pill); background:var(--bg-card-alt); border:1px solid var(--border-subtle)}
|
||
.decision-card{background:var(--bg-card); border:1px solid var(--border-subtle); border-radius:var(--radius-card); padding:18px; animation:fadeIn .3s ease}
|
||
.decision-card .dc-cat{font-size:10px; font-weight:800; letter-spacing:.12em; color:var(--text-secondary); text-transform:uppercase; margin-bottom:6px}
|
||
.decision-card h2{font-size:20px; line-height:1.15}
|
||
.decision-card .dc-ctx{font-size:13px; color:var(--text-secondary); line-height:1.5; margin:8px 0 14px}
|
||
.opt-grid{display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:10px}
|
||
.opt-card{position:relative; display:flex; flex-direction:column; align-items:center; gap:8px; padding:14px 10px; border-radius:var(--radius-card); border:1px solid var(--border-subtle); background:var(--bg-card-alt); transition:all .15s; text-align:center}
|
||
.opt-card:active{transform:scale(.97)}
|
||
.opt-card:hover{border-color:var(--text-secondary)}
|
||
.opt-card .oc-label{font-size:9px; font-weight:700; letter-spacing:.06em; text-transform:uppercase; color:var(--text-muted)}
|
||
.opt-card .oc-emblem,.opt-card .oc-emblem-fb{width:64px; height:64px; border-radius:var(--radius-card); padding:4px}
|
||
.opt-card .oc-emblem-fb{display:flex; align-items:center; justify-content:center; font-size:18px; font-weight:800; color:var(--text-secondary); background:var(--bg-card); border:1px solid var(--border-subtle)}
|
||
.opt-card .oc-title{font-size:14px; font-weight:800; line-height:1.2}
|
||
.opt-card .oc-desc{font-size:10.5px; color:var(--text-muted); line-height:1.35}
|
||
.opt-card .oc-tag{font-size:10px; font-weight:700; color:var(--text-secondary); padding:3px 9px; border-radius:var(--radius-badge); background:var(--bg-card); border:1px solid var(--border-subtle)}
|
||
.opt-card .oc-pills{display:flex; gap:6px; justify-content:center; flex-wrap:wrap}
|
||
.opt-card.wide{grid-column:1/-1}
|
||
.timeline{background:var(--bg-card); border:1px solid var(--border-subtle); border-radius:var(--radius-card); overflow:hidden}
|
||
.timeline .tl-head{display:flex; align-items:center; gap:8px; padding:10px 14px; font-size:9px; font-weight:800; letter-spacing:.08em; color:var(--text-muted); text-transform:uppercase; border-bottom:1px solid var(--border-subtle)}
|
||
.tl-head .c-idx{width:38px; flex:none}
|
||
.tl-head .c-org{flex:1}
|
||
.tl-head .c-num{width:40px; text-align:right; flex:none}
|
||
.tl-row{display:flex; align-items:center; gap:8px; padding:9px 14px; border-bottom:1px solid var(--border-subtle); font-size:12px}
|
||
.tl-row:last-of-type{border-bottom:none}
|
||
.tl-row .c-idx{width:38px; flex:none; display:flex; align-items:center; gap:5px}
|
||
.tl-row .c-org{flex:1; display:flex; align-items:center; gap:7px; min-width:0}
|
||
.tl-row .c-org img,.tl-row .c-org .fallback{width:22px; height:22px; border-radius:5px; padding:1px; flex:none}
|
||
.tl-row .c-org .em{font-size:11px; font-weight:700; color:var(--text-secondary); white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
|
||
.tl-row .c-num{width:40px; text-align:right; flex:none; font-weight:700; color:var(--text-secondary)}
|
||
.tl-row .c-elo{width:40px; text-align:center; flex:none; font-weight:800; color:var(--accent-ovr)}
|
||
.tl-row .c-arr{font-size:11px; color:var(--accent-ovr); flex:none}
|
||
.tl-row.active{background:var(--bg-row-active); border-left:3px solid var(--success)}
|
||
.tl-row.active .c-org .em{color:var(--text-primary); font-weight:800}
|
||
.tl-row.future .c-org .em{color:var(--text-muted)}
|
||
.tl-row.future .c-num{color:var(--text-muted)}
|
||
.split-badge{width:26px; height:26px; border-radius:var(--radius-badge); display:inline-flex; align-items:center; justify-content:center; font-size:11px; font-weight:800; flex:none}
|
||
.split-badge.early{background:rgba(56,189,248,.18); color:#7dd3fc}
|
||
.split-badge.mid{background:rgba(59,130,246,.2); color:#93c5fd}
|
||
.split-badge.late{background:rgba(34,197,94,.2); color:#86efac}
|
||
.tl-final{display:flex; align-items:center; gap:8px; padding:10px 14px; border-top:2px solid var(--border-subtle); background:var(--bg-card-alt); font-size:12px}
|
||
.tl-final .f-flag{font-size:16px; flex:none}
|
||
.tl-final .f-name{flex:1; font-weight:800}
|
||
.tl-final .c-num{width:40px; text-align:right; flex:none; font-weight:700; color:var(--text-secondary)}
|
||
#resultOverlay{position:fixed; inset:0; background:rgba(4,5,8,.74); backdrop-filter:blur(5px); z-index:50; display:none; align-items:center; justify-content:center; padding:24px}
|
||
#resultOverlay.show{display:flex}
|
||
.result-card{width:100%; max-width:440px; background:var(--bg-card); border:1px solid var(--border-subtle); border-radius:var(--radius-card); padding:24px 22px; text-align:center; animation:pop .3s cubic-bezier(.2,1.4,.4,1)}
|
||
@keyframes pop{from{transform:scale(.85); opacity:0}to{transform:scale(1); opacity:1}}
|
||
.result-card .verdict{font-size:30px; letter-spacing:.02em; font-weight:800}
|
||
.result-card .verdict.bad{color:var(--danger)}
|
||
.result-card .verdict.great{color:var(--success)}
|
||
.result-card .rtext{font-size:14px; line-height:1.6; color:var(--text-secondary); margin:10px 0 6px}
|
||
.result-card .deltas{display:flex; flex-wrap:wrap; gap:6px; justify-content:center; margin:12px 0 18px}
|
||
.result-card .delta{font-size:11px; font-weight:800; padding:4px 9px; border-radius:var(--radius-badge); background:var(--bg-card-alt); border:1px solid var(--border-subtle)}
|
||
.result-card .delta.up{color:var(--success); border-color:rgba(34,197,94,.4)}
|
||
.result-card .delta.down{color:var(--danger); border-color:rgba(239,68,68,.4)}
|
||
.result-card .delta.money{color:var(--accent-ovr); border-color:rgba(217,115,10,.4)}
|
||
.team-change{display:flex; align-items:center; justify-content:center; gap:12px; margin:14px 0 4px}
|
||
.team-change .tc-logo{width:56px; height:56px; border-radius:var(--radius-card); padding:5px}
|
||
.team-change .tc-fb{width:56px; height:56px; border-radius:var(--radius-card); display:flex; align-items:center; justify-content:center; font-size:14px; font-weight:800; color:var(--text-secondary); background:var(--bg-card-alt); border:1px solid var(--border-subtle)}
|
||
.team-change .arrow{color:var(--accent-ovr); font-size:20px; font-weight:800}
|
||
#summary{justify-content:flex-start; gap:16px}
|
||
.sum-head{text-align:center}
|
||
.sum-head h2{font-size:34px; letter-spacing:.02em; line-height:1}
|
||
.sum-head .sub{font-size:13px; color:var(--text-muted); margin-top:6px}
|
||
.sum-top{display:grid; grid-template-columns:repeat(3,1fr); gap:12px}
|
||
.sum-panel{background:var(--bg-card); border:1px solid var(--border-subtle); border-radius:var(--radius-card); padding:16px}
|
||
.sum-panel .sp-label{font-size:9px; font-weight:800; letter-spacing:.1em; color:var(--text-muted); text-transform:uppercase; margin-bottom:8px}
|
||
.sum-panel .sp-nick{font-size:22px; font-weight:800; word-break:break-word}
|
||
.sum-panel .sp-row{display:flex; align-items:center; gap:6px; flex-wrap:wrap; margin-top:6px}
|
||
.sum-panel .sp-value{font-size:12px; color:var(--text-secondary); margin-top:6px}
|
||
.sum-panel .sp-value b{color:var(--text-primary); font-weight:800}
|
||
.sum-panel .big-elo{width:64px; height:64px; border-radius:var(--radius-card); background:var(--accent-ovr); display:flex; flex-direction:column; align-items:center; justify-content:center; color:#1a1a1a; margin-left:auto}
|
||
.sum-panel .big-elo .lbl{font-size:8px; font-weight:800; letter-spacing:.1em}
|
||
.sum-panel .big-elo .num{font-size:28px; font-weight:800; line-height:1}
|
||
.sum-panel .sp-stats{display:grid; grid-template-columns:repeat(3,1fr); gap:8px; margin-top:12px}
|
||
.sum-panel .sp-stats .stat3{background:var(--bg-card-alt); border-color:var(--border-subtle)}
|
||
.sum-panel .sp-flag{font-size:34px; text-align:center; margin:6px 0 2px}
|
||
.sum-panel .sp-region{font-size:16px; font-weight:800; text-align:center}
|
||
.sum-panel .sp-region-sub{font-size:11px; color:var(--text-muted); text-align:center; margin-bottom:10px}
|
||
.ach-grid{display:flex; flex-wrap:wrap; gap:6px; justify-content:center; margin-top:10px}
|
||
.ach-grid .ach-chip{font-size:11px; font-weight:700; padding:5px 11px; border-radius:var(--radius-pill); background:var(--bg-card-alt); border:1px solid var(--border-subtle)}
|
||
.ach-empty{color:var(--text-muted); font-size:12px; text-align:center; padding:14px 0; font-weight:700; letter-spacing:.05em; text-transform:uppercase}
|
||
.ach-empty .ic{display:block; font-size:22px; margin-bottom:5px; opacity:.4}
|
||
.orgs-grid{display:grid; grid-template-columns:repeat(4,1fr); gap:12px}
|
||
.org-card{position:relative; border-radius:var(--radius-card); padding:16px 12px; text-align:center; overflow:hidden; border:1px solid var(--border-subtle)}
|
||
.org-card .og-bg{position:absolute; inset:0; opacity:.18; z-index:0; background:radial-gradient(circle at 50% 0, var(--og-color,#7c3aed), transparent 70%)}
|
||
.org-card > *{position:relative; z-index:1}
|
||
.org-card .og-logo{width:56px; height:56px; border-radius:var(--radius-card); padding:4px; margin:0 auto 8px; background:var(--bg-card); border:1px solid var(--border-subtle)}
|
||
.org-card .og-fb{width:56px; height:56px; border-radius:var(--radius-card); display:flex; align-items:center; justify-content:center; font-size:16px; font-weight:800; color:var(--text-primary); background:var(--bg-card); border:1px solid var(--border-subtle); margin:0 auto 8px}
|
||
.org-card .og-name{font-size:13px; font-weight:800; line-height:1.2}
|
||
.org-card .og-div{font-size:9px; font-weight:700; color:var(--text-secondary); margin-top:2px}
|
||
.org-card .og-stats{display:flex; justify-content:center; gap:14px; margin-top:10px; font-size:11px; color:var(--text-secondary)}
|
||
.org-card .og-stats b{color:var(--text-primary)}
|
||
.sum-quote{font-size:13px; color:var(--text-muted); font-style:italic; text-align:center; line-height:1.5}
|
||
.sumbtns{display:flex; justify-content:flex-end; gap:10px; margin-top:4px}
|
||
#toast{position:fixed; bottom:24px; left:50%; transform:translateX(-50%) translateY(80px); z-index:99; background:var(--bg-card-alt); border:1px solid var(--accent-ovr); color:var(--text-primary); padding:12px 20px; border-radius:var(--radius-pill); font-size:13px; font-weight:700; transition:transform .3s ease; box-shadow:0 8px 30px rgba(0,0,0,.4); max-width:88vw; text-align:center}
|
||
#toast.show{transform:translateX(-50%) translateY(0)}
|
||
@media (max-width:768px){
|
||
.career-grid{grid-template-columns:1fr; gap:14px}
|
||
.timeline{order:2}
|
||
.sum-top{grid-template-columns:1fr}
|
||
.orgs-grid{grid-template-columns:repeat(2,1fr)}
|
||
.role-grid{grid-template-columns:repeat(3,1fr)}
|
||
.sumbtns{flex-direction:column}
|
||
.sumbtns .btn{width:100%}
|
||
}
|
||
.tl-collapse{display:none}
|
||
@media (max-width:768px){
|
||
.timeline .tl-collapse{display:flex; align-items:center; justify-content:space-between; padding:11px 14px; cursor:pointer; font-size:11px; font-weight:800; color:var(--text-secondary); letter-spacing:.08em; text-transform:uppercase; border-bottom:1px solid var(--border-subtle)}
|
||
.timeline .tl-body.closed{display:none}
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div id="app">
|
||
<section id="landing" class="screen active">
|
||
<div class="logo-big">1v9</div>
|
||
<div class="logo-sub">Convertite en leyenda</div>
|
||
<p class="tagline">Simulá tu carrera completa de pro player de <b>League of Legends</b>: de la challenger a los playoffs, del tilt al Worlds. Cada carrera dura 2 minutos, cada carrera es distinta.</p>
|
||
<div class="land-tags"><span>⚔️ 5 roles</span><span>🌎 6 regiones</span><span>🏆 Worlds</span><span>🥶 < 2 min</span></div>
|
||
<div class="logo-strip" id="stripLogos"></div>
|
||
<button class="btn" id="btnStart" style="margin:6px auto 0">Convertite en leyenda</button>
|
||
<div class="hall" id="hall" style="display:none">
|
||
<h3>🏆 Salón de la fama</h3>
|
||
<div id="hallBody"></div>
|
||
</div>
|
||
<p class="smallprint" style="margin-top:14px">Parodia fan-made sin fines de lucro. Logos de sus respectivos dueños.</p>
|
||
</section>
|
||
<section id="create" class="screen">
|
||
<div class="create-head">
|
||
<h2>Armá tu player</h2>
|
||
<p>Todo empieza con un nick de mierda y cero miedo.</p>
|
||
</div>
|
||
<div class="field"><label>Nick / gamertag</label>
|
||
<input class="input" id="inpNick" type="text" maxlength="18" placeholder="xXFeederXx" autocomplete="off" spellcheck="false">
|
||
</div>
|
||
<div class="row2">
|
||
<div class="field"><label>N° de invocador</label>
|
||
<input class="input" id="inpNum" type="number" min="0" max="99" value="13">
|
||
</div>
|
||
<div class="field"><label>Mano del mouse</label>
|
||
<div class="seg" id="segHand">
|
||
<button class="opt" data-v="diestro"><b>Diestro</b><small>el 99% de la gente</small></button>
|
||
<button class="opt" data-v="zurdo"><b>Zurdo</b><small>main Zed legendario</small></button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="field"><label>Región de servidor</label>
|
||
<div class="grid2" id="regionGrid"></div>
|
||
</div>
|
||
<div class="field"><label>Rol</label>
|
||
<div class="role-grid" id="roleGrid"></div>
|
||
</div>
|
||
<p class="hint" id="createHint">En tu región te van a tirar <b>ofertas de equipos</b> para arrancar la carrera. La rompés, te venden, subís. Eso o volvés a la academia, no hay punto medio.</p>
|
||
<button class="btn" id="btnBegin" style="margin-top:6px">Firme para el draft</button>
|
||
</section>
|
||
<section id="career" class="screen">
|
||
<div class="career-grid">
|
||
<div class="career-left">
|
||
<div class="player-card" id="playerCard"></div>
|
||
<div class="stats-row3" id="statsRow3"></div>
|
||
<div class="achievements" id="achievementsBox"></div>
|
||
<div class="decision-card" id="decisionBox"></div>
|
||
</div>
|
||
<div class="timeline" id="timelineBox"></div>
|
||
</div>
|
||
</section>
|
||
<section id="summary" class="screen">
|
||
<div class="sum-head">
|
||
<h2>Carrera terminada</h2>
|
||
<div class="sub" id="sumSub"></div>
|
||
</div>
|
||
<div class="sum-top" id="sumTop"></div>
|
||
<div class="orgs-grid" id="orgsGrid"></div>
|
||
<div class="sum-quote" id="sumQuote"></div>
|
||
<div class="sumbtns">
|
||
<button class="btn" id="btnExport">⬇ Descargar imagen</button>
|
||
<button class="btn secondary" id="btnAgain">↻ Jugar de nuevo</button>
|
||
</div>
|
||
<p class="smallprint">Compartila con el que te dijo que el LoL era una perdida de tiempo.<br>Jugá tu carrera en <b>lolero.cbcren.online</b></p>
|
||
</section>
|
||
</div>
|
||
<div id="resultOverlay"><div id="resultCard"></div></div>
|
||
<div id="toast"></div>
|
||
<script>
|
||
'use strict';
|
||
/* 1v9: CONVERTITE EN LEYENDA — simulador de carrera LoL. Ui estilo Copero. */
|
||
/* ---------- REGIONES ---------- */
|
||
const REGIONS = {
|
||
LCK: { name: 'LCK', code: 'KR', country: 'Corea del Sur', flag: '🇰🇷', flavor: 'Disciplina brutal, bootcamps interminables y el estándar de oro del mundo.', threshold: 68, accent: '#e2574c' },
|
||
LPL: { name: 'LPL', code: 'CN', country: 'China', flag: '🇨🇳', flavor: 'Presupuesto infinito, scrims contra 30 equipos y fanáticos extremos.', threshold: 66, accent: '#e2574c' },
|
||
LEC: { name: 'LEC', code: 'EU', country: 'Europa', flag: '🇪🇺', flavor: 'Memes, huevos con panceta y la ilusión renovada cada año.', threshold: 61, accent: '#3a6df0' },
|
||
LCS: { name: 'LCS', code: 'NA', country: 'Norteamérica', flag: '🇺🇸', flavor: 'Sponsors raros, contenido de streaming y la eterna promesa del año del cambio.', threshold: 56, accent: '#3a6df0' },
|
||
LTA: { name: 'LTA', code: 'AM', country: 'Latinoamérica + Brasil', flag: '🇧🇷', flavor: 'Pasión, presupuesto ajustado y la afición más ruidosa del planeta.', threshold: 51, accent: '#4ecb71' },
|
||
VCS: { name: 'VCS', code: 'VN', country: 'Vietnam', flag: '🇻🇳', flavor: 'Agresividad total: 5v5 a los 3 minutos, cero miedo, cero farmeo.', threshold: 50, accent: '#4ecb71' },
|
||
};
|
||
const LOGO_EXT = {"100T":"png","6K":"webp","AllKnights":"webp","BDS":"webp","BLG":"png","BRION":"webp","C9":"png","Cerberus":"webp","DRX":"png","Dignitas":"svg","DplusKIA":"png","EDG":"png","EVOS":"webp","Estral":"webp","FPX":"svg","FURIA":"webp","FURIAAcad":"webp","FearX":"webp","Fluxo":"webp","FluxoAcad":"webp","FlyQuest":"png","Fnatic":"png","Furious":"webp","G2":"webp","GAM":"webp","GenG":"png","Hanwha":"png","IG":"png","INTZ":"webp","INTZAcad":"webp","Isurus":"webp","JDG":"png","KT":"webp","KaBuM":"webp","KaBuMAcad":"webp","Karmine":"png","Keyd":"webp","Kwangdong":"webp","LNG":"png","LOUD":"png","LOUDAcad":"webp","Leviatan":"webp","MAD":"svg","MGNBlue":"webp","MRiders":"webp","NRG":"webp","Nongshim":"webp","OMG":"webp","RED":"webp","REDAcad":"webp","RNG":"svg","RareAtom":"webp","Rebirth":"webp","Rogue":"svg","SBTC":"webp","SK":"png","ShoRebel":"webp","T1":"png","TES":"webp","TL":"svg","TSM":"png","TeamSecret":"webp","UltraPrime":"webp","Vikings":"webp","Vitality":"webp","WBG":"png","paiN":"png","paiNAcad":"webp"};
|
||
const TEAMS = {
|
||
LCK: [
|
||
{ id: 'T1', name: 'T1', div: 1 }, { id: 'GenG', name: 'Gen.G', div: 1 },
|
||
{ id: 'Hanwha', name: 'Hanwha Life Esports', div: 1 }, { id: 'KT', name: 'KT Rolster', div: 1 },
|
||
{ id: 'DplusKIA', name: 'Dplus KIA', div: 1 }, { id: 'DRX', name: 'DRX', div: 1 },
|
||
{ id: 'FearX', name: 'FearX', div: 2 }, { id: 'BRION', name: 'OKSavingsBank BRION', div: 2 },
|
||
{ id: 'Nongshim', name: 'Nongshim RedForce', div: 2 }, { id: 'Kwangdong', name: 'Kwangdong Freecs', div: 2 },
|
||
],
|
||
LPL: [
|
||
{ id: 'JDG', name: 'JD Gaming', div: 1 }, { id: 'BLG', name: 'Bilibili Gaming', div: 1 },
|
||
{ id: 'TES', name: 'Top Esports', div: 1 }, { id: 'LNG', name: 'LNG Esports', div: 1 },
|
||
{ id: 'WBG', name: 'Weibo Gaming', div: 1 }, { id: 'EDG', name: 'EDward Gaming', div: 1 },
|
||
{ id: 'IG', name: 'Invictus Gaming', div: 2 }, { id: 'RNG', name: 'Royal Never Give Up', div: 2 },
|
||
{ id: 'FPX', name: 'FunPlus Phoenix', div: 2 }, { id: 'OMG', name: 'Oh My God', div: 2 },
|
||
{ id: 'RareAtom', name: 'Rare Atom', div: 2 }, { id: 'UltraPrime', name: 'Ultra Prime', div: 2 },
|
||
],
|
||
LEC: [
|
||
{ id: 'G2', name: 'G2 Esports', div: 1 }, { id: 'Fnatic', name: 'Fnatic', div: 1 },
|
||
{ id: 'Vitality', name: 'Team Vitality', div: 1 }, { id: 'Karmine', name: 'Karmine Corp', div: 1 },
|
||
{ id: 'MAD', name: 'MAD Lions KOI', div: 1 }, { id: 'SK', name: 'SK Gaming', div: 1 },
|
||
{ id: 'BDS', name: 'Team BDS', div: 2 }, { id: 'Rogue', name: 'Rogue', div: 2 },
|
||
{ id: 'MRiders', name: 'Movistar Riders', div: 2 },
|
||
],
|
||
LCS: [
|
||
{ id: 'TL', name: 'Team Liquid', div: 1 }, { id: 'C9', name: 'Cloud9', div: 1 },
|
||
{ id: '100T', name: '100 Thieves', div: 1 }, { id: 'FlyQuest', name: 'FlyQuest', div: 1 },
|
||
{ id: 'Dignitas', name: 'Dignitas', div: 1 },
|
||
{ id: 'NRG', name: 'NRG', div: 2 }, { id: 'TSM', name: 'TSM', div: 2 },
|
||
{ id: 'ShoRebel', name: 'Shopify Rebellion', div: 2 },
|
||
],
|
||
LTA: [
|
||
{ id: 'paiN', name: 'paiN Gaming', div: 1 }, { id: 'LOUD', name: 'LOUD', div: 1 },
|
||
{ id: 'RED', name: 'RED Canids', div: 1 }, { id: 'FURIA', name: 'FURIA', div: 1 },
|
||
{ id: 'Fluxo', name: 'Fluxo', div: 1 }, { id: 'INTZ', name: 'INTZ', div: 1 },
|
||
{ id: 'KaBuM', name: 'KaBuM! Esports', div: 1 }, { id: 'Keyd', name: 'Keyd Stars', div: 1 },
|
||
{ id: 'Leviatan', name: 'Leviatán Esports', div: 1 }, { id: 'Estral', name: 'Estral Esports', div: 1 },
|
||
{ id: 'Isurus', name: 'Isurus', div: 1 },
|
||
{ id: 'paiNAcad', name: 'paiN Academy', div: 2 }, { id: 'LOUDAcad', name: 'LOUD Academy', div: 2 },
|
||
{ id: 'REDAcad', name: 'RED Canids Academy', div: 2 }, { id: 'FURIAAcad', name: 'FURIA Academy', div: 2 },
|
||
{ id: 'FluxoAcad', name: 'Fluxo Academy', div: 2 }, { id: 'INTZAcad', name: 'INTZ Academy', div: 2 },
|
||
{ id: 'KaBuMAcad', name: 'KaBuM Academy', div: 2 }, { id: '6K', name: '6K Esports', div: 2 },
|
||
{ id: 'AllKnights', name: 'All Knights', div: 2 }, { id: 'Furious', name: 'Furious Gaming', div: 2 },
|
||
{ id: 'Rebirth', name: 'Rebirth Esports', div: 2 },
|
||
],
|
||
VCS: [
|
||
{ id: 'GAM', name: 'GAM Esports', div: 1 }, { id: 'Vikings', name: 'Vikings Esports', div: 1 },
|
||
{ id: 'TeamSecret', name: 'Team Secret', div: 1 }, { id: 'Cerberus', name: 'Cerberus Esports', div: 1 },
|
||
{ id: 'EVOS', name: 'EVOS Esports', div: 2 }, { id: 'MGNBlue', name: 'MGN Blue Esports', div: 2 },
|
||
{ id: 'SBTC', name: 'SBTC Esports', div: 2 },
|
||
],
|
||
};
|
||
function teamById(id){ for (const rg of Object.values(TEAMS)){ const t = rg.find(t => t.id === id); if (t) return t; } return null; }
|
||
function logoFile(id){ const ext = LOGO_EXT[id]; return ext ? 'logos/' + id + '.' + ext : null; }
|
||
function logoImg(id, size, cls){
|
||
const f = logoFile(id); const t = teamById(id);
|
||
const inits = t ? t.name.split(/[^A-Za-z]+/).filter(Boolean).slice(0,2).map(w=>w[0].toUpperCase()).join('') : '?';
|
||
if (f) return `<img class="logo ${cls||''}" style="width:${size}px;height:${size}px" src="${f}" alt="${esc(t.name)}" onerror="this.outerHTML='<span class="fallback ${cls||''}" style="width:${size}px;height:${size}px">${esc(inits)}</span>'">`;
|
||
return `<span class="fallback ${cls||''}" style="width:${size}px;height:${size}px">${esc(inits)}</span>`;
|
||
}
|
||
const ROLES = {
|
||
Top: { em: '🗡️', fl: 'isla. solo. 1v1 sin piedad.', kill: 3.0, ast: 4.2, death: 0.95, pentaW: 0.35 },
|
||
Jungla: { em: '🐺', fl: 'invadí, gankeá, tilteá al jungla rival.', kill: 2.6, ast: 6.5, death: 1.05, pentaW: 0.4 },
|
||
Mid: { em: '🧙', fl: 'el carril del 1v9. la responsabilidad.', kill: 3.8, ast: 5.5, death: 0.9, pentaW: 1.0 },
|
||
ADC: { em: '🏹', fl: 'late game. esperá el huevo, no feedees.', kill: 4.4, ast: 4.6, death: 1.0, pentaW: 1.15 },
|
||
Support: { em: '🛡️', fl: 'hacés el trabajo sucio y nadie te da crédito.', kill: 1.3, ast: 10.5, death: 1.25, pentaW: 0.2 },
|
||
};
|
||
const CATS = {
|
||
entrenamiento: { name: 'Entrenamiento', icon: '🎯' }, salud: { name: 'Salud y tilt', icon: '🩹' },
|
||
preparacion: { name: 'Preparación', icon: '💪' }, alimentacion: { name: 'Alimentación', icon: '🍜' },
|
||
escandalo: { name: 'Escándalo', icon: '😱' }, estudios: { name: 'Plan B', icon: '📚' },
|
||
momento: { name: 'Momento', icon: '⚔️' },
|
||
};
|
||
const EVENTS = [
|
||
{ cat: 'entrenamiento', title: 'Cambió la meta', ctx: 'Parche nuevo: el campeón que grindeaste toda la temporada quedó en tier B. El coach te mira raro en la reunión de draft.',
|
||
opts: [
|
||
{ t: 'Spamear SoloQ con el champ del meta', d: { mecanica: 2.5 }, risk: 0.28,
|
||
pos: 'Doce horas de SoloQ y ya le sacás el teclado al champ nuevo. El coach sonríe (por primera vez en su vida).',
|
||
neg: 'El champ nuevo no te sale ni en entrenamiento. Dos splits de One Trick Pony sin el pony.' },
|
||
{ t: 'Chuparte todos los VODs de los pros', d: { vision: 2.2 }, risk: 0.15,
|
||
pos: 'Descubriste el pathing secreto del server. Jugás 3 niveles más arriba en el mapa.',
|
||
neg: 'Tanta VOD-review te hizo dormir con la cabeza en el teclado. Tu mecanica de siempre se oxida.' },
|
||
{ t: 'Seguir con tu main, la meta es para cagones', d: { sinergia: 2.4 }, risk: 0.45,
|
||
pos: 'Tu champ te conoce. El equipo te arma comps alrededor tuyo y funcionó. Quién dice out of meta, no?',
|
||
neg: 'Te banearon el main en el split final. Jugar con el reemplazo fue como jugar con las manos atadas.' },
|
||
]},
|
||
{ cat: 'entrenamiento', title: 'Maratón de SoloQ', ctx: 'El equipo tiene día libre. Podés hacer lo que quieras para llegar mejor al próximo split.',
|
||
opts: [
|
||
{ t: 'Grindear 12 horas seguidas', d: { mecanica: 2.8 }, risk: 0.4,
|
||
pos: 'Llegaste a challenger y tu mecanica se afiló como cuchillo. El ping era mental, dicen.',
|
||
neg: 'A las 2 AM hiciste un mal game y entraste en espiral. El tilt te dura tres días y el coach te mira feo.' },
|
||
{ t: 'Sesión de review con el coach', d: { vision: 1.6, sinergia: 1.4 }, risk: 0.12,
|
||
pos: 'Te mostró los 47 errores que nadie ve. Sos más inteligente sin cambiar de campeón.',
|
||
neg: 'La review duró 5 horas por un ward. Tu tiempo valía más que ese ward.' },
|
||
{ t: 'Descansar y resetear la cabeza', d: { sinergia: 1.2 }, risk: 0.08,
|
||
pos: 'Dormiste 9 horas y jugaste con la mente limpia. El cuerpo agradece.',
|
||
neg: 'Dormiste tanto que te perdiste el scrim. El coach sumó una marca negra.' },
|
||
{ t: 'Streaming de SoloQ a las 4 AM', d: { marca: 2.4 }, risk: 0.3,
|
||
pos: 'El clip del tilt te hizo viral. 40 mil seguidores nuevos y una entrevista para un medio de esports.',
|
||
neg: 'El tilt fue TAN épico que el clip lo vieron tus padres. No te hablan.' },
|
||
]},
|
||
{ cat: 'entrenamiento', title: 'El equipo rival te humilló', ctx: 'Perdieron 3-0 en scrims contra un equipo de segunda que nadie respetaba. Hay que reaccionar.',
|
||
opts: [
|
||
{ t: 'Revancha mental: analizar cada pick rival', d: { vision: 2.2, sinergia: 1.0 }, risk: 0.15,
|
||
pos: 'Les sacaste el patrón completo. La próxima vez que los veas en el draft, jugás vos.',
|
||
neg: 'Analizaste tanto que el estratega del equipo sintió que le pisabas el puesto. Ahora te esquiva en el pasillo.' },
|
||
{ t: 'Pechar en SoloQ hasta el amanecer', d: { mecanica: 2.2 }, risk: 0.35,
|
||
pos: 'El grind te hizo monstruo. Ahora los humillás vos, y con estilo.',
|
||
neg: 'Pecho frío el split entero. Jugaste como si tuvieras 300 de ping.' },
|
||
{ t: 'Proponer cambiar la estrategia del equipo', d: { sinergia: 2.0, marca: 1.2 }, risk: 0.3,
|
||
pos: 'La nueva estrategia les funcionó: 5 partidas ganadas en fila. Te empiezan a escuchar.',
|
||
neg: 'La estrategia era mala y lo sabías en el fondo. Te comiste el fail y el ego.' },
|
||
]},
|
||
{ cat: 'entrenamiento', title: 'Quieren cambiarte de rol', ctx: 'El nuevo fichaje juega tu rol. La directiva te propone pasar a otro carril.',
|
||
opts: [
|
||
{ t: 'Aceptar el cambio de rol', d: { sinergia: 1.8 }, risk: 0.5, x: { rolChange: true },
|
||
pos: 'El cambio te renovó: jugás con la energía del que no tiene nada que perder. La gente te redescubre.',
|
||
neg: 'Cambiaste de rol y sos un desastre en el nuevo carril. Los memes de tu gameplay vuelan en Reddit.' },
|
||
{ t: 'Negarte y pelear el puesto', d: { mecanica: 2.0, marca: 1.2 }, risk: 0.42,
|
||
pos: 'Ganaste el puesto en el scrim decisivo. Tu nivel subió porque lo defendiste con uñas y dientes.',
|
||
neg: 'Perdiste el puesto y el nuevo te revienta en todo. Tu confianza quedó en el subsuelo.' },
|
||
{ t: 'Buscar equipo en otra parte', d: { sinergia: 1.0 }, risk: 0.25, x: { transfer: 'other' },
|
||
pos: 'Echaste la carta: dos equipos se interesaron y negociás un pase con mejora.',
|
||
neg: 'Nadie te quería tanto como creías. Te quedaste donde mismo y con el ego herido.' },
|
||
]},
|
||
{ cat: 'entrenamiento', title: 'Bootcamp de élite', ctx: 'Te invitan a un bootcamp internacional con los mejores del mundo. Plazas limitadas.',
|
||
opts: [
|
||
{ t: 'Ir y aprender de los mejores', d: { mecanica: 2.6 }, risk: 0.38,
|
||
pos: 'Tres semanas jugando contra el server más duro del planeta. Volviste con otra lectura del juego.',
|
||
neg: 'La diferencia de nivel te mostró lo lejos que estás. Te pegó tan duro que jugaste peor un mes.' },
|
||
{ t: 'Quedarte y laburar tu estilo', d: { sinergia: 1.6, marca: 1.0 }, risk: 0.12,
|
||
pos: 'Le dedicaste el tiempo a tu equipo: sincronizaron jugadas nuevas que pagan en playoffs.',
|
||
neg: 'Mientras vos laburabas lo tuyo, tus rivales volvieron del bootcamp con 200 de nivel extra.' },
|
||
]},
|
||
{ cat: 'salud', title: 'Te arde la muñeca', ctx: 'Tres splits jugando 10 horas por día. Ahora cada flash te cuesta una punzada en la muñeca derecha.',
|
||
opts: [
|
||
{ t: 'Operarte ya', d: { mecanica: -1.5 }, risk: 0.5,
|
||
pos: 'La operación salió perfecta y volviste como nuevo. Jugás como si tuvieras 17 años.',
|
||
neg: 'La recuperación fue más larga de lo previsto y perdiste medio split. La mecánica se resintió.' },
|
||
{ t: 'Fisioterapia + pausas obligatorias', d: { sinergia: 1.6 }, risk: 0.15,
|
||
pos: 'Cambiaste la rutina: estiramientos, descansos y hielo. La muñeca aguanta y jugás mejor.',
|
||
neg: 'El fisio te hizo dejar de jugar a las horas que más fruta dabas. El ritmo se te rompió.' },
|
||
{ t: 'Seguir jugando como si nada', d: { mecanica: 1.2 }, risk: 0.55,
|
||
pos: 'La adrenalina del scrim tapa el dolor. Un split más aguantás.',
|
||
neg: 'Te diste cuenta tarde: la muñeca dijo basta a mitad de split y te perdiste las finales.' },
|
||
]},
|
||
{ cat: 'salud', title: 'Burnout', ctx: 'Vas 3 splits sin vacaciones. El LoL te dejó de gustar y arrancás a jugar peor de lo que rendís.',
|
||
opts: [
|
||
{ t: 'Tomarte una licencia de un mes', d: { sinergia: 1.2, marca: 0.8 }, risk: 0.22,
|
||
pos: 'Un mes sin pantallas te hizo acordar por qué amabas el juego. Volviste con hambre.',
|
||
neg: 'El equipo fichó a un reemplazo que jugó bien. Volviste y ya no sos titular seguro.' },
|
||
{ t: 'Apretar el culo y seguir', d: { mecanica: 1.8 }, risk: 0.48,
|
||
pos: 'Lo atravesaste con huevo: el juego te volvió a enganchar y el rendimiento volvió.',
|
||
neg: 'El burnout te comió por dentro. Jugabas en automático y tu nivel cayó en picada.' },
|
||
{ t: 'Cambiar la rutina completa', d: { sinergia: 2.0 }, risk: 0.18,
|
||
pos: 'Menos SoloQ, más análisis, más gimnasio, más vida. Rendís mejor y encima dormís 8 horas.',
|
||
neg: 'Menos SoloQ = menos reflejos. Te falta ese toque fino de antes.' },
|
||
]},
|
||
{ cat: 'salud', title: 'Spiral de tilt', ctx: 'Perdiste 9 partidas seguidas y ya le pifiaste al equipo en dos scrims. El chat del stream pide tu retiro.',
|
||
opts: [
|
||
{ t: 'Psicólogo de esports', d: { sinergia: 1.8, marca: 0.8 }, risk: 0.1,
|
||
pos: 'Tres sesiones y entendiste que el LoL no te define. Jugás más tranquilo y mejor.',
|
||
neg: 'El psicólogo te dijo algo que no querías escuchar: capaz no tenés lo que se necesita. Te quedó dando vueltas.' },
|
||
{ t: 'Desquitarte en SoloQ ranked', d: { mecanica: 1.6 }, risk: 0.5,
|
||
pos: 'Cargaste el tilt en 20 partidas y salió como catarsis: tu nivel de antes volvió.',
|
||
neg: 'El tilt escaló: te reportaron 47 veces y Riot te suspendió la cuenta principal 3 días. Decisión fatídica.' },
|
||
{ t: 'Apagar todo y dormir 14 horas', d: { sinergia: 1.0 }, risk: 0.2,
|
||
pos: 'Dormiste como un bebé y el reset funcionó. Nuevo día, nueva vida.',
|
||
neg: 'Dormiste hasta la scrim y te olvidaste de contestar al manager. Multa de dos días de sueldo.' },
|
||
]},
|
||
{ cat: 'salud', title: 'Problemas con la visa', ctx: 'Te seleccionaron para viajar al torneo internacional y el consulado te la está complicando.',
|
||
opts: [
|
||
{ t: 'Pelear con los papeles', d: { vision: 1.2 }, risk: 0.4,
|
||
pos: 'A fuerza de turnos y traductor, la sacaste. Volás al torneo con 48 horas de ventaja.',
|
||
neg: 'Te la negaron por un papel mal completado. El equipo viaja sin vos y te perdés la chance.' },
|
||
{ t: 'Quedarte y apoyar desde casa', d: { sinergia: 1.6, marca: 0.6 }, risk: 0.15,
|
||
pos: 'Analizaste los partidos del equipo a distancia y les pasaste scouting clave. Ganaron dos series por tus informes.',
|
||
neg: 'Ver los playoffs por stream con el corazón partido. Tu stock bajó entre los scouts internacionales.' },
|
||
]},
|
||
{ cat: 'preparacion', title: 'Te ofrecen un setup nuevo', ctx: 'El sponsor de hardware quiere que cambies de equipo: monitor, teclado, silla, todo nuevo.',
|
||
opts: [
|
||
{ t: 'Monitor 360Hz + teclado nuevo', d: { mecanica: 1.8 }, risk: 0.2,
|
||
pos: 'El cambio a 360Hz te destapó los ojos: ves los skillshots antes de que salgan.',
|
||
neg: 'El teclado nuevo tiene el shift en otro lado. Erraste 3 flashes en un split y el equipo se quejó.' },
|
||
{ t: 'Silla ergonómica + mesa a medida', d: { sinergia: 1.4 }, risk: 0.08,
|
||
pos: 'Tu espalda te agradece y jugás 2 horas más sin cansarte. El rendimiento sube solo.',
|
||
neg: 'La silla nueva es tan cómoda que te dormís en los breaks de las scrims.' },
|
||
{ t: 'No tocar nada, el setup actual es sagrado', d: { sinergia: 1.0, marca: 0.8 }, risk: 0.12,
|
||
pos: 'La constancia paga: los torneos locales no pueden usar tu config nueva igual. Seguís siendo consistente.',
|
||
neg: 'El sponsor se ofendió un poco y te retiró un beneficio de streaming.' },
|
||
]},
|
||
{ cat: 'preparacion', title: 'Gaming house vs. tu depto', ctx: 'El manager te propone mudarte a la gaming house del equipo. Convivencia total con los compañeros.',
|
||
opts: [
|
||
{ t: 'Mudarme a la gaming house', d: { sinergia: 2.2 }, risk: 0.25,
|
||
pos: 'Convivencia = macro sincronizada. El equipo juega como una mente sola.',
|
||
neg: 'Convivencia = los compas te despiertan con la música a las 9 AM. Tu paciencia llegó al límite.' },
|
||
{ t: 'Quedarme en mi depto', d: { marca: 1.4, sinergia: 0.6 }, risk: 0.15,
|
||
pos: 'Tu espacio te permite streamear tranquilo y editar contenido. La marca personal crece.',
|
||
neg: 'Los compas se arman jugadas en el living mientras vos te enterás por el replay.' },
|
||
]},
|
||
{ cat: 'preparacion', title: 'Preparación física', ctx: 'El staff médico del equipo insiste: hay que entrenar cuerpo, no solo manos.',
|
||
opts: [
|
||
{ t: 'Gimnasio 3 veces por semana', d: { sinergia: 1.6 }, risk: 0.15,
|
||
pos: 'Más fuerza, más energía, mejor postura. Jugás las 5 partidas del best of 5 sin bajar la cabeza.',
|
||
neg: 'Tanto fierro que te agarró agujetas y no podías mover el mouse. El coach no entendía nada.' },
|
||
{ t: 'Yoga y estiramiento diario', d: { vision: 1.0, sinergia: 0.8 }, risk: 0.08,
|
||
pos: 'Tu mente se despejó y tu reflejo visual mejoró. El chi fluye y el farmeo también.',
|
||
neg: 'Nadie te toma en serio en el team con tu mat de yoga. Te cargan hasta en las entrevistas.' },
|
||
{ t: 'El gimnasio es para los otros', d: {}, risk: 0.3,
|
||
pos: 'Todo el tiempo extra va al juego. Tu mecanica afilada es tu gimnasio.',
|
||
neg: 'A los 24 años ya te duelen la espalda y el cuello. Los de 17 te corren el mapa sin cansarse.' },
|
||
]},
|
||
{ cat: 'preparacion', title: 'Nuevo headset del sponsor', ctx: 'El sponsor de periféricos te ofrece un headset con cancelación de ruido y micrófono de radio.',
|
||
opts: [
|
||
{ t: 'Usarlo en scrims y entrenar las calls', d: { sinergia: 1.8 }, risk: 0.1,
|
||
pos: 'La comunicación del equipo es otra: calls claras, cero ruido, cero gritos. El macro mejora.',
|
||
neg: 'El micrófono tan bueno también graba tus críticas al jungla. Se enteró. No fue lindo.' },
|
||
{ t: 'Solo para streaming', d: { marca: 1.8 }, risk: 0.1,
|
||
pos: 'El sonido de tu stream es premium y la audiencia lo nota: más subs y más clip.',
|
||
neg: 'Te olvidaste de sacar el micrófono en una call privada y filtraste el plan táctico del equipo.' },
|
||
]},
|
||
{ cat: 'alimentacion', title: 'Energy drinks o comida real', ctx: 'Llevás 6 meses sobreviviendo a base de bebida energética y arroz con algo.',
|
||
opts: [
|
||
{ t: 'Unificar criterio: comida real', d: { sinergia: 1.6 }, risk: 0.1,
|
||
pos: 'La nutricionista te arma el plan: más foco, más energía sostenida, menos picos. Juega mejor todo el split.',
|
||
neg: 'La comida real te pareció un embole y volviste a las energéticas a las dos semanas.' },
|
||
{ t: 'Energéticas y a la mierda', d: { mecanica: 1.6 }, risk: 0.35,
|
||
pos: 'El split jugaste al palo: la cafeína te mantuvo 14 horas de grind sin bajar.',
|
||
neg: 'El estómago dijo basta en plena serie de playoffs. Tuviste que salir a comprar leche en el descanso.' },
|
||
{ t: 'Firmar con el sponsor de bebida energética', d: { marca: 1.8, sinergia: 1.0 }, risk: 0.25,
|
||
pos: 'Plata + exposición + los fans te asocian con la marca. Tu valor de mercado sube.',
|
||
neg: 'El sponsor te exigió salir en los streams con la bebida siempre a mano. El doc del equipo te ve mal.' },
|
||
]},
|
||
{ cat: 'alimentacion', title: 'El equipo se va de bootcamp a otro país', ctx: 'Comida nueva, horarios nuevos, todo nuevo. Tu estómago ya te avisó que no va a cooperar.',
|
||
opts: [
|
||
{ t: 'Adaptarme a la comida local', d: { sinergia: 1.4 }, risk: 0.2,
|
||
pos: 'Descubriste platos nuevos y encima le caíste bien a la cocinera del bootcamp. Combo completo.',
|
||
neg: 'La comida local te cayó mal y te perdiste dos días de scrim. El estómago no perdona.' },
|
||
{ t: 'Pedir delivery de tu comida de confianza', d: { marca: 1.2, sinergia: -0.6 }, risk: 0.15,
|
||
pos: 'La comida de tu país te mantiene en tu zona de confort y encima lo streamiás: los viewers se ríen.',
|
||
neg: 'El delivery del extranjero sale el triple y la mitad de las veces llega frío. Tu presupuesto llora.' },
|
||
{ t: 'Cocinar yo mismo', d: { sinergia: 1.0 }, risk: 0.2,
|
||
pos: 'Cocinar te despeja la cabeza y los compas prueban tu comida casera. Team bonding nivel chef.',
|
||
neg: 'Casi prendés fuego la cocina de la gaming house. El manager te prohibió acercarte a las hornallas.' },
|
||
]},
|
||
{ cat: 'alimentacion', title: 'Cheat day del coach', ctx: 'El coach quiere imponer dieta estricta de lunes a sábado y domingo libre. Te pregunta qué opinás.',
|
||
opts: [
|
||
{ t: 'Seguir la dieta al pie de la letra', d: { sinergia: 1.6 }, risk: 0.12,
|
||
pos: 'Disciplina total: tu energía es estable y tu rendimiento también. El coach está orgulloso.',
|
||
neg: 'La dieta era tan estricta que te bajaste toda la heladera en el cheat day. Balance perdido.' },
|
||
{ t: 'Propuesta: dieta flexible', d: { marca: 1.2, sinergia: 0.6 }, risk: 0.15,
|
||
pos: 'La dieta flexible te mantiene feliz y rendís igual. El equipo adoptó tu sistema.',
|
||
neg: 'Flexible terminó siendo "todo el tiempo". El coach te miró con decepción paterna.' },
|
||
]},
|
||
{ cat: 'alimentacion', title: 'El esponsor de suplementos', ctx: 'Un laboratorio te ofrece suplementos "milagrosos" para la concentración. Suena demasiado bueno.',
|
||
opts: [
|
||
{ t: 'Rechazar: no sé qué mierda es eso', d: { marca: 1.4, sinergia: 0.8 }, risk: 0.08,
|
||
pos: 'Públicamente te mantuviste limpio y honesto. Los fans y el equipo valoran tu criterio.',
|
||
neg: 'La oferta era de 50k. Tu contador casi te mata cuando se enteró que la rechazaste.' },
|
||
{ t: 'Probar "solo una vez"', d: { mecanica: 1.6 }, risk: 0.55,
|
||
pos: 'Concentración brutal el split. Pero ahora dependés de eso y el doc te marcó el alto.',
|
||
neg: 'Control antidopaje positivo en el torneo internacional. Descalificado y suspendido un año. Tu carrera se tambalea.' },
|
||
{ t: 'Consultar al médico del equipo', d: { vision: 1.0 }, risk: 0.1,
|
||
pos: 'El médico lo analizó: es magnesio con marketing. Lo toman todos y no hace nada, pero la anécdota es buena.',
|
||
neg: 'El médico te explicó que era trucho y vos ya le habías dicho "dale" al laboratorio. Bochorno.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'Te ofrecen un boosteo', ctx: 'Un "amigo" de un amigo te ofrece pagarle a alguien para subirte a challenger. Nadie se entera, dice.',
|
||
opts: [
|
||
{ t: 'Aceptar, nadie se entera', d: { mecanica: 1.4 }, risk: 0.75,
|
||
pos: 'Subiste a challenger y el equipo ni se enteró. Bueno... casi.',
|
||
neg: 'SE ENTERARON. Cuenta suspendida, multa de la liga y tu reputación hecha pelota. El manager te hizo hablar con Riot.' },
|
||
{ t: 'Rechazar y reportarlo', d: { marca: 1.8, sinergia: 0.6 }, risk: 0.1,
|
||
pos: 'Lo contaste en un stream y la gente te aplaudió: honestidad +50. Hasta Riot te siguió en redes.',
|
||
neg: 'El "amigo" del amigo resultó ser el primo del dueño del equipo. Incómodo.' },
|
||
{ t: 'Hacer el boosteo vos mismo por plata', d: { marca: 1.4, sinergia: 0.6 }, risk: 0.65,
|
||
pos: 'La guita extra cayó linda y nadie se enteró. La cuenta de un cliente tuyo subió a diamante.',
|
||
neg: 'Riot rastrea los juegos compartidos. Cuenta suspendida 3 meses y tus jefes te dieron un ultimátum.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'La VPN para el servidor', ctx: 'El server local está muerto a ciertas horas. Un compa te dice: "y si usás VPN para jugar en otro server?"',
|
||
opts: [
|
||
{ t: 'Usar la VPN', d: { mecanica: 1.2 }, risk: 0.7,
|
||
pos: 'Jugaste con más nivel competitivo un par de meses. El ping no era el problema, resultó ser tu mentalidad.',
|
||
neg: 'Te detectaron el cambio de IP en plena partida oficial. Penalización de la liga y el equipo tuvo que explicarse.' },
|
||
{ t: 'No usar la VPN', d: { sinergia: 0.8, marca: 0.8 }, risk: 0.1,
|
||
pos: 'Te mantuviste dentro de las reglas y el equipo te respalda. Los días malos de server son de todos.',
|
||
neg: 'Los que usaron VPN te sacaron ventaja en SoloQ. Tu ranking local no muestra tu nivel real.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'Coaching en vivo por el pinganillo', ctx: 'En un scrim importa un "asesor" que te va dictando cada jugada por el ear. La liga lo prohíbe.',
|
||
opts: [
|
||
{ t: 'Escuchar y ejecutar', d: { sinergia: 1.2 }, risk: 0.6,
|
||
pos: 'Las jugadas salieron perfectas un tiempo. El "asesor" era medio genio.',
|
||
neg: 'Lo descubrieron en playoffs. Multa, partido anulado y la serie perdida en la mesa. Bochorno internacional.' },
|
||
{ t: 'Sacarte el pinganillo', d: { marca: 1.6, sinergia: 0.6 }, risk: 0.15,
|
||
pos: 'Jugaste con lo tuyo y ganaste igual. El stream mostró el momento: la comunidad te elevó.',
|
||
neg: 'El "asesor" era el dueño del equipo. Ahora no te habla en las reuniones.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'Te acusan de elo boosting', ctx: 'Unos foros dicen que tu rank subió de golpe y que estás comprado. Es mentira, pero la comunidad arde.',
|
||
opts: [
|
||
{ t: 'Demostrarlo con gameplays en stream', d: { marca: 2.0 }, risk: 0.12,
|
||
pos: 'Stream de 10 horas mostrando tu grind real. La gente te cree y tu canal explota.',
|
||
neg: 'El stream fue tan bueno que la gente cree que el rank lo hizo tu editor. No hay con qué darle.' },
|
||
{ t: 'Ignorarlo y seguir', d: { sinergia: 1.0 }, risk: 0.3,
|
||
pos: 'Te chupó un huevo y jugaste igual. Los haters se cansaron solos.',
|
||
neg: 'Los rumores crecieron y hasta un periodista lo preguntó en una rueda de prensa. Te tocó el orgullo.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'Se filtró una rage quit tuya', ctx: 'Un clip viejo donde cerraste el juego a los 12 minutos se volvió viral. Tu org está por hacer un comunicado.',
|
||
opts: [
|
||
{ t: 'Pedir disculpas públicas con humor', d: { marca: 1.8 }, risk: 0.15,
|
||
pos: 'Te disculpaste riéndote de vos mismo y el clip hasta te hizo ganar seguidores. La gente ama la autocrítica.',
|
||
neg: 'La disculpa salió tan cringe que ahora el clip viral es tu disculpa. Día de mierda.' },
|
||
{ t: 'No decir nada, aguantar la tormenta', d: { sinergia: 0.8 }, risk: 0.35,
|
||
pos: 'El tema murió solo en una semana. La gente tiene memoria de pez dorado.',
|
||
neg: 'El tema no murió: los periodistas te lo preguntaron en cada entrevista durante un mes.' },
|
||
]},
|
||
{ cat: 'estudios', title: 'La universidad a distancia', ctx: 'Tu familia te llama: "estudiá algo, esto de los videojuegos no es un laburo". Te inscribís (o no).',
|
||
opts: [
|
||
{ t: 'Anotarme en la carrera a distancia', d: { marca: 1.2, sinergia: 0.4 }, risk: 0.25,
|
||
pos: 'Estudiás y jugás: el equilibrio te hace más maduro. Además tu familia por fin te deja de hinchar.',
|
||
neg: 'Entre el estudio y el juego no dormís. El rendimiento en scrims cayó y el coach te vio bostezando.' },
|
||
{ t: 'Mandarle a la universidad', d: { mecanica: 1.4 }, risk: 0.2,
|
||
pos: 'Todo el tiempo es para el juego y se nota: tu nivel sube sin distracciones.',
|
||
neg: 'Tu familia te dejó de hablar tres meses. Después se reconcilió cuando viste plata en serio.' },
|
||
{ t: 'Hacer un curso de inglés online', d: { sinergia: 1.2, marca: 0.8 }, risk: 0.1,
|
||
pos: 'Inglés para entrevistas y para hablar con los internacionales. Tu stock global sube.',
|
||
neg: 'El curso era para principiantes y vos ya sabías de más. Plata tirada, tiempo tirado.' },
|
||
]},
|
||
{ cat: 'estudios', title: 'La plata del contrato', ctx: 'Acumulaste unos buenos mangos y no sabés qué hacer. Tu contador te da un parte.',
|
||
opts: [
|
||
{ t: 'Plazo fijo y a la mierda', d: { marca: 1.2 }, risk: 0.08,
|
||
pos: 'La plata crece solita y vos dormís tranquilo. Tu valor de mercado sube porque sos "serio".',
|
||
neg: 'El plazo fijo rinde menos que la inflación de tu país. Tu contador llora de la risa.' },
|
||
{ t: 'Invertir en NFT de monos', d: { marca: -1.4 }, risk: 0.85,
|
||
pos: 'Lo vendiste justo antes del crash y saliste casi entero. La anécdota queda para siempre.',
|
||
neg: 'Perdiste el 80% en monos pixelados. La comunidad te lo recuerda en cada stream.' },
|
||
{ t: 'Comprarte el setup de tus sueños', d: { mecanica: 1.4, marca: 0.8 }, risk: 0.1,
|
||
pos: 'Monitor, teclado, silla, pared de paneles: tu setup es top 5 del server y tu streaming mejora.',
|
||
neg: 'El setup era tan caro que te quedaste sin plata para el alquiler. El manager te adelantó sueldo.' },
|
||
{ t: 'Ponerla en un emprendimiento con un amigo', d: { marca: 0.8 }, risk: 0.4,
|
||
pos: 'El emprendimiento (una cafetería gamer) arrancó bien. Ingreso extra y te da otra perspectiva.',
|
||
neg: 'El emprendimiento era un "amigo" que desapareció con la plata. Lección cara.' },
|
||
]},
|
||
{ cat: 'estudios', title: 'Te ofrecen un canal de YouTube', ctx: 'El manager de contenidos del equipo te propone un canal propio de resúmenes y momentos top.',
|
||
opts: [
|
||
{ t: 'Editarlo yo mismo', d: { marca: 2.0 }, risk: 0.2,
|
||
pos: 'Tu estilo edgy y auténtico engancha: 100k subs en dos splits y sponsors personales.',
|
||
neg: 'Editar te comió las horas de descanso. El rendimiento en scrims bajó y el coach te retó.' },
|
||
{ t: 'Contratar un editor', d: { sinergia: -0.8, marca: 1.6 }, risk: 0.12,
|
||
pos: 'El canal crece sin que toques nada. Plata saliendo, pero marca personal al palo.',
|
||
neg: 'El editor subió un clip de una estrategia secreta del equipo. Desastre de relaciones públicas.' },
|
||
{ t: 'Nada de contenido, solo jugar', d: { mecanica: 1.2 }, risk: 0.15,
|
||
pos: 'Todo tu tiempo al juego: el nivel sube y el equipo te valora como jugador puro.',
|
||
neg: 'Mientras tus rivales hacen marca, nadie te conoce fuera del server. Tu valor de mercado se estanca.' },
|
||
]},
|
||
{ cat: 'estudios', title: 'Clases de inglés para entrevistas', ctx: 'El equipo te anota en inglés avanzado: apuntan a entrevistas internacionales y a que te entiendan en el MSI.',
|
||
opts: [
|
||
{ t: 'Tomármelo en serio', d: { sinergia: 1.4, marca: 0.8 }, risk: 0.08,
|
||
pos: 'Inglés fluido: te manejás con la prensa internacional y hasta improvisás en las entrevistas.',
|
||
neg: 'Inglés fluido pero con acento tan fuerte que los angloparlantes creen que es otro idioma.' },
|
||
{ t: 'Ir por cumplir', d: { marca: 0.6 }, risk: 0.25,
|
||
pos: 'Aprendiste lo justo: "yes", "no" y "GG". Alcanza para los que importan.',
|
||
neg: 'En la entrevista post-partido dijiste "I am tilted" para describir la victoria. Clip eterno.' },
|
||
]},
|
||
{ cat: 'entrenamiento', title: 'El draft experimental', ctx: 'El coach llega con un cuaderno lleno de picks que "la meta todavía no entendió". Te toca a vos estrenarlos en scrims.',
|
||
opts: [
|
||
{ t: 'Probar los picks locos', d: { mecanica: 2.0, sinergia: 1.0 }, risk: 0.4,
|
||
pos: 'El pick raro fue un antes y un después: los rivales no saben contra qué juegan. Draft pick legend.',
|
||
neg: 'El pick raro era raro por algo. Te gankearon 9 veces antes de los 12 minutos y el coach borró el cuaderno.' },
|
||
{ t: 'Pedir draft seguro', d: { vision: 1.8 }, risk: 0.15,
|
||
pos: 'Con lo conocido jugás al nivel de siempre y el scouting rinde. El coach te mira y asiente.',
|
||
neg: 'Los picks seguros no sorprenden a nadie: los rivales te counterpean en cada serie.' },
|
||
{ t: 'Proponer tu propio campeón', d: { sinergia: 1.4, marca: 1.0 }, risk: 0.3,
|
||
pos: 'El equipo te dejó armar la comp alrededor de tu main y salió redondo. El staff nota tu lectura.',
|
||
neg: 'Tu propuesta era mala y lo sabías: el split entero te cargan con la "comp del genio".' },
|
||
]},
|
||
{ cat: 'entrenamiento', title: 'El rival de SoloQ', ctx: 'Hay un tipo que te persigue en ranked: cada vez que entrás en cola, aparece del otro lado y te hace la vida imposible.',
|
||
opts: [
|
||
{ t: 'Estudiarlo y ganarle la mental war', d: { vision: 2.2 }, risk: 0.25,
|
||
pos: 'Le sacaste el patrón: invadís donde él wardeaba y el tipo ya no sabe jugar contra vos. Lo quebraste.',
|
||
neg: 'Lo estudiaste tanto que empezaste a jugar para contrarrestarlo y te olvidaste del propio juego.' },
|
||
{ t: 'Sacarlo de tu cola a la fuerza', d: { mecanica: 2.0 }, risk: 0.4,
|
||
pos: 'DuoQ con tu jungla y a la mierda: le ganaste 4 seguidas y el tipo cambió de horario de cola.',
|
||
neg: 'Perdiste 6 seguidas intentándolo: el tipo es mejor que vos y encima ahora lo sabe.' },
|
||
{ t: 'Invitarle a un scrim', d: { sinergia: 1.6, marca: 1.0 }, risk: 0.2,
|
||
pos: 'El rival eterno resultó copado: se probó con vos y ahora es tu compañero de duo. Alianza inesperada.',
|
||
neg: 'El tipo usó el scrim para robarte las estrategias del equipo. Tu culpa, dice el coach.' },
|
||
]},
|
||
{ cat: 'salud', title: 'Insomnio crónico', ctx: 'Tres meses durmiendo 4 horas por noche. Los reflejos siguen, pero tu cabeza ya no procesa el mapa a tiempo.',
|
||
opts: [
|
||
{ t: 'Rutina de sueño estricta', d: { sinergia: 2.0 }, risk: 0.12,
|
||
pos: 'Dos semanas durmiendo 8 horas y volviste con una claridad mental que no tenías desde la academia.',
|
||
neg: 'La rutina estricta te costó una scrim de madrugada que era "importante" según tu jungla.' },
|
||
{ t: 'Cafeína y adrenalina hasta el final', d: { mecanica: 1.6 }, risk: 0.45,
|
||
pos: 'El cuerpo aguanta de milagro y el split te lo llevaste con reflejos de 16 años.',
|
||
neg: 'A los 20 años jugás como si tuvieras 40: la cabeza te va un segundo tarde en cada teamfight.' },
|
||
{ t: 'Pedir ayuda profesional', d: { marca: 1.2, sinergia: 0.8 }, risk: 0.1,
|
||
pos: 'El especialista del sueño te rearmó los horarios y hasta el equipo adoptó tu rutina. Iluminado.',
|
||
neg: 'La consulta salió cara y el médico te dijo que el problema era el LoL. No lo vas a aceptar.' },
|
||
]},
|
||
{ cat: 'salud', title: 'La vista cansada', ctx: 'Doce horas de pantalla por día y los ojos te arden en el loading screen. El oculista del equipo te mira preocupado.',
|
||
opts: [
|
||
{ t: 'Lentes con filtro y descansos de 20-20-20', d: { vision: 2.2 }, risk: 0.1,
|
||
pos: 'La regla 20-20-20 te cambió la vida: los ojos frescos y el mapa lo leés con otra claridad.',
|
||
neg: 'Los lentes te hicieron ver TODO, incluso los wards que no existían. Jugaste persiguiendo sombras.' },
|
||
{ t: 'Seguir así, total es joda', d: { mecanica: 1.2 }, risk: 0.5,
|
||
pos: 'La juventud es una droga: un split más sin problema. (El oculista no opina igual.)',
|
||
neg: 'El ojo izquierdo te dijo basta en pleno game 5 y perdiste la serie por un skillshot que no viste.' },
|
||
{ t: 'Reducir el streaming y el celular', d: { sinergia: 1.4, marca: -0.6 }, risk: 0.1,
|
||
pos: 'Menos pantalla extra = más juego. Tu vista agradece y tu rank también.',
|
||
neg: 'Menos stream = menos marca. Los fans te preguntan si estás bien y tus números de audiencia bajan.' },
|
||
]},
|
||
{ cat: 'preparacion', title: 'Retiro de la leyenda', ctx: 'Un pro retirado, leyenda viva del server, te ofrece sesiones privadas de entrenamiento. Te quiere "dejar algo antes de irse".',
|
||
opts: [
|
||
{ t: 'Aceptar todas las sesiones', d: { mecanica: 2.4, vision: 1.0 }, risk: 0.3,
|
||
pos: 'La leyenda te pasó los secretos que no salen en los VODs: jugás con la cabeza de un veterano.',
|
||
neg: 'La leyenda te hizo jugar con SU estilo, que era de otra época. El meta actual te come vivo.' },
|
||
{ t: 'Entrenar con él de sparring', d: { mecanica: 1.8 }, risk: 0.2,
|
||
pos: 'Perder 50 partidas seguidas contra una leyenda te afiló el filo. Ahora el server te queda chico.',
|
||
neg: 'Tanta derrota en sparring te quebró la confianza: hasta en tu Elo dudás de cada decisión.' },
|
||
{ t: 'Decirle que no, sos tu propia leyenda', d: { sinergia: 1.2, marca: 1.4 }, risk: 0.25,
|
||
pos: 'El rechazo con respeto te dio una imagen de seguridad que la comunidad aplaude. Autosuficiente.',
|
||
neg: 'La leyenda se ofendió y en su stream te tiró una indirecta sutil (no era sutil).' },
|
||
]},
|
||
{ cat: 'preparacion', title: 'Retreat de team building', ctx: 'El equipo se va tres días a la montaña, sin pantallas, con fogata y dinámicas de grupo. El coach insiste en que "nos une".',
|
||
opts: [
|
||
{ t: 'Ir con todo el equipo', d: { sinergia: 2.4 }, risk: 0.15,
|
||
pos: 'La fogata y la caminata hicieron más que mil scrims: el equipo juega como hermanos ahora.',
|
||
neg: 'Tres días sin jugar = tres días de reflejos oxidados. Volviste y la primera scrim fue un desastre.' },
|
||
{ t: 'Quedarte y grindear solo', d: { mecanica: 1.8 }, risk: 0.3,
|
||
pos: 'Mientras el equipo se abrazaba en la montaña, vos subiste dos rangos de SoloQ. Nivel al palo.',
|
||
neg: 'El equipo volvió unido y vos sos el outsider que no fue. Las calls ya no te incluyen.' },
|
||
{ t: 'Ir pero con la laptop "por las dudas"', d: { sinergia: 1.4, marca: 0.8 }, risk: 0.2,
|
||
pos: 'Jugaste un poco, compartiste un montón: el equilibrio perfecto entre team y grind.',
|
||
neg: 'Te vieron con la laptop y te cargaron todo el viaje. Dicen que el wifi de la montaña no perdona.' },
|
||
]},
|
||
{ cat: 'alimentacion', title: 'La nueva cafetería del staff', ctx: 'Abrieron una cafetería gamer en la gaming house: café premium, snacks y un menú saludable que el nutricionista aprobó.',
|
||
opts: [
|
||
{ t: 'Menú saludable del nutricionista', d: { sinergia: 1.8 }, risk: 0.08,
|
||
pos: 'La comida rica Y saludable existe: tu energía es estable y el estómago te perdona todo.',
|
||
neg: 'El menú saludable es caro y el sueldo de rookie no llega a fin de mes con café premium.' },
|
||
{ t: 'Café a full como los pros coreanos', d: { mecanica: 1.6 }, risk: 0.35,
|
||
pos: 'El café coreano te dio el empuje para las 14 horas: tu grind sube de nivel.',
|
||
neg: 'Cinco cafés al día: manos temblorosas en la scrim y el jungla te pidió que te calmes.' },
|
||
{ t: 'Hacerte socio de la cafetería', d: { marca: 1.6 }, risk: 0.3,
|
||
pos: 'Tu cara en el cartel de la cafetería del equipo: la marca crece y el café sale gratis.',
|
||
neg: 'La cafetería cerró a los dos meses: perdiste la inversión y el cartel con tu cara quedó en la calle.' },
|
||
]},
|
||
{ cat: 'alimentacion', title: 'El desayuno del equipo', ctx: 'El staff médico quiere implementar desayuno obligatorio en la gaming house. Vos siempre jugaste con el estómago vacío.',
|
||
opts: [
|
||
{ t: 'Desayuno completo todos los días', d: { sinergia: 1.6 }, risk: 0.1,
|
||
pos: 'El cerebro con nafta juega distinto: tu macro mejora y el tilt baja un 40%.',
|
||
neg: 'El desayuno pesado te da sueño en las primeras horas. La scrim de las 10 AM es un martirio.' },
|
||
{ t: 'Seguir con el ayuno matutino', d: { mecanica: 1.4 }, risk: 0.3,
|
||
pos: 'Tu cuerpo ya está adaptado: jugás con la mente liviana y los reflejos a full.',
|
||
neg: 'A mitad de game 4 te agarró el bajón de azúcar: moriste solo en el río por un skillshot fácil.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'Se filtró tu sueldo', ctx: 'Un medio publicó la lista de salarios de la liga y el tuyo es el más bajo de los titulares. El vestuario entero lo vio.',
|
||
opts: [
|
||
{ t: 'Exigir renegociación ahora', d: { marca: 1.8 }, risk: 0.4,
|
||
pos: 'La presión pública jugó a tu favor: la directiva te subió el sueldo y una cláusula de mejora.',
|
||
neg: 'La directiva se sintió expuesta y te marcó: el ambiente se congeló y tu contrato siguió igual.' },
|
||
{ t: 'Callar y demostrar en el server', d: { sinergia: 1.2, mecanica: 1.2 }, risk: 0.2,
|
||
pos: 'Jugaste como un animal el split: ahora todos saben que cobrás poco y jugás mucho. Stock alto.',
|
||
neg: 'Callaste y los demás cobran el triple. El resentimiento te come por dentro (pero rendís bien).' },
|
||
{ t: 'Publicar un stream descontracturado', d: { marca: 1.6 }, risk: 0.15,
|
||
pos: 'Lo tomaste con humor en stream: la comunidad te quiere y hasta el CEO te felicitó por la actitud.',
|
||
neg: 'El stream lo vio la directiva y no les gustó el tono. Te citaron a una reunión incómoda.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'Rivalidad con el streamer', ctx: 'Un streamer famoso dijo en vivo que "cualquiera llega a pro hoy en día". Sus 200 mil viewers te etiquetaron a vos en los clips.',
|
||
opts: [
|
||
{ t: 'Aceptar el 1v1 en su stream', d: { marca: 2.2 }, risk: 0.35,
|
||
pos: 'Le ganaste el 1v1 en vivo frente a 200 mil personas: tu nombre explota y la marca se dispara.',
|
||
neg: 'Perdiste el 1v1 por un detalle y el clip se hizo viral. La gente no recuerda el contexto, recuerda la derrota.' },
|
||
{ t: 'Ignorarlo y seguir con tu carrera', d: { sinergia: 1.0 }, risk: 0.2,
|
||
pos: 'No le diste bola y el tema murió solo. Tu carrera habla por vos.',
|
||
neg: 'El streamer siguió tirando indirectas un mes y parte de la comunidad se lo creyó.' },
|
||
{ t: 'Invitarle a la gaming house', d: { marca: 1.8, sinergia: 0.8 }, risk: 0.2,
|
||
pos: 'El "rival" resultó ser copado y el video del tour de la gaming house explotó: views y subs.',
|
||
neg: 'El streamer se llevó material para hacerte quedar mal en su canal. Error de estrategia.' },
|
||
]},
|
||
{ cat: 'estudios', title: 'El secundario pendiente', ctx: 'Tu familia lo vuelve a mencionar: te falta terminar el secundario. Un instituto online te propone terminarlo en un año.',
|
||
opts: [
|
||
{ t: 'Terminarlo online', d: { marca: 1.4, sinergia: 0.6 }, risk: 0.2,
|
||
pos: 'Título en mano y la familia en paz: además los sponsors lo valoran y tu imagen mejora.',
|
||
neg: 'Entre el estudio y el juego, algo se resiente: las noches de parcial te matan el split.' },
|
||
{ t: 'Dejarlo para después de retirarme', d: { mecanica: 1.4 }, risk: 0.25,
|
||
pos: 'Todo el foco en la carrera: la plata y los títulos hablan más que un papel.',
|
||
neg: 'El tema sigue pendiente y tu familia lo saca en cada llamada. "¿Y el secundario?"' },
|
||
{ t: 'Pagarle a un tutor que te prepare', d: { marca: 1.0, sinergia: 0.8 }, risk: 0.1,
|
||
pos: 'El tutor te hace los resúmenes y vos estudiás lo justo: aprobás sin sacrificar el game.',
|
||
neg: 'El tutor resultó ser un fan que solo quería conocer a un pro. Perdiste la plata y el tiempo.' },
|
||
]},
|
||
{ cat: 'estudios', title: 'El podcast de tu equipo', ctx: 'El manager de contenidos te ofrece ser la cara del podcast semanal del equipo. Tiempo fuera de la práctica, pero exposición.',
|
||
opts: [
|
||
{ t: 'Aceptar ser la voz del podcast', d: { marca: 2.0 }, risk: 0.2,
|
||
pos: 'Tu humor en el podcast lo rompe: el equipo gana fans y vos te convertís en la cara visible.',
|
||
neg: 'Dijiste una frase polémica en vivo y el clip dio la vuelta al mundo. Comunicado oficial mediante.' },
|
||
{ t: 'Participar solo cuando haya fecha libre', d: { sinergia: 1.2 }, risk: 0.12,
|
||
pos: 'Aparecés cuando podés: la exposición justa sin sacrificar el game.',
|
||
neg: 'Tu ausencia se nota y el manager te lo dice: "el podcast te necesita más que vos a él".' },
|
||
{ t: 'Negarme: soy jugador, no influencer', d: { mecanica: 1.2 }, risk: 0.2,
|
||
pos: 'Todo el tiempo al juego: el rendimiento puro te mantiene en la elite.',
|
||
neg: 'Mientras tus rivales hacen marca, tu nombre suena menos: los sponsors te miran de reojo.' },
|
||
]},
|
||
{ cat: 'momento', title: 'BO5 contra el rival eterno', ctx: 'Playoffs: 2-2 en la serie contra el equipo que te humilló en la temporada regular. El game 5 define tu split.',
|
||
opts: [
|
||
{ t: 'Cerrar los ojos y jugar el game de tu vida', d: { mecanica: 2.2 }, risk: 0.5,
|
||
pos: 'Flash + backdoor a los 38 minutos: la gente enloquece y esa jugada se ve en recopilados por años.',
|
||
neg: 'Erraste el flash decisivo y el nexus explotó con tu cara en la pantalla gigante. Los memes no perdonan.' },
|
||
{ t: 'Jugar conservador, esperar su error', d: { vision: 2.0, sinergia: 1.0 }, risk: 0.3,
|
||
pos: 'Los dejaste estrellarse contra tu visionado: ganaste sin arriesgar, el clásico juego de los que saben.',
|
||
neg: 'Tan conservador que el rival escaló gratis y te pasó por arriba. El macro no le ganó al macro rival.' },
|
||
{ t: 'Pedir el pick que nadie espera', d: { sinergia: 1.6, marca: 1.2 }, risk: 0.45,
|
||
pos: 'El pick loco los tomó por sorpresa: ganaste y la comunidad te llena de elogios. Draft gamer.',
|
||
neg: 'El pick loco era un meme y lo pagaste caro: el coach ya no te deja elegir ni la música del bootcamp.' },
|
||
]},
|
||
{ cat: 'momento', title: 'Remontada de 0-2', ctx: 'La serie está 0-2 en contra y el equipo está destruido anímicamente. Solo vos seguís hablando en las calls.',
|
||
opts: [
|
||
{ t: 'Prender fuego el vestuario con una arenga', d: { sinergia: 2.2, marca: 1.0 }, risk: 0.35,
|
||
pos: 'La arenga fue tan buena que el equipo revivió: 3-2 en la serie y todos recuerdan tu speech.',
|
||
neg: 'La arenga no alcanzó: perdieron 0-3 y te quedaste gritando en un vestuario vacío. Incómodo.' },
|
||
{ t: 'Cambiar todo el plan de juego', d: { vision: 1.8 }, risk: 0.4,
|
||
pos: 'El cambio de plan los agarró desprevenidos: el rival no supo reaccionar y la serie se igualó.',
|
||
neg: 'Cambiar el plan a mitad de serie fue un caos: perdiste la identidad de juego y la serie también.' },
|
||
{ t: 'Aceptar la derrota con dignidad', d: { sinergia: 1.2 }, risk: 0.15,
|
||
pos: 'El equipo se fue entero: sin bronca interna y con la cabeza puesta en el próximo split.',
|
||
neg: 'Te diste por vencido y el team lo notó: la derrota fue tan silenciosa que dolió más.' },
|
||
]},
|
||
{ cat: 'momento', title: 'La final se define en el último game', ctx: 'Final de la liga, todo igualado, game 5, 40 minutos de juego. Un solo teamfight define el título. Todos te miran en la llamada.',
|
||
opts: [
|
||
{ t: 'Llamar el teamfight decisivo', d: { sinergia: 2.4 }, risk: 0.4,
|
||
pos: 'Tu call fue perfecta: engañaron al rival y ganaron la final. Te levantan en andas y sos leyenda del split.',
|
||
neg: 'La call fue un desastre: entraron 5 contra 4 y perdieron. El título quedó a un click de distancia.' },
|
||
{ t: 'Dejar que el veterano decida', d: { vision: 1.8 }, risk: 0.2,
|
||
pos: 'El veterano leyó el juego mejor que nadie y el título llegó: aprendiste de los grandes.',
|
||
neg: 'El veterano erró la lectura y el equipo lo sintió: "todos la vimos venir", dijo el público.' },
|
||
{ t: 'Intentar la jugada individual', d: { mecanica: 2.2 }, risk: 0.5,
|
||
pos: 'El 1v1 en el río definió la final: tu nombre queda grabado en la historia de la liga.',
|
||
neg: 'Intentaste la jugada heroica y te atraparon en el río: el equipo te la recuerda en cada reunión.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'Te ofrecen arreglar un partido', ctx: 'Un tipo que "trabaja para un sitio de apuestas" te pide perder la próxima serie a propósito. Hay plata de por medio y nadie se entera, dice.',
|
||
opts: [
|
||
{ t: 'Aceptar: la plata es la plata', d: { mecanica: 1.4 }, risk: 0.8,
|
||
pos: 'La guita cayó y nadie notó nada... hasta que el movimiento de la casa de apuestas se hizo raro.',
|
||
neg: 'Riot abrió investigación: cuenta suspendida, multa de la liga y dos años sin competir. Tu carrera se hizo humo en una serie.' },
|
||
{ t: 'Rechazar y denunciarlo', d: { marca: 2.0, sinergia: 0.8 }, risk: 0.1,
|
||
pos: 'Lo reportaste a la liga y al staff de integridad: el tipo cayó en cana digital. La comunidad te aplaude en cada stream.',
|
||
neg: 'El tipo del arreglo desapareció sin rastro y a vos te quedó la paranoia de mirar por encima del hombro.' },
|
||
{ t: 'Fingir que jugás mal, total un par de games', d: { sinergia: -1.2, marca: -1.0 }, risk: 0.65,
|
||
pos: 'Perdiste "de casualidad" una serie intrascendente y cobraste. Nadie sospechó, ni tu propio equipo.',
|
||
neg: 'Los memes de tu gameplay "raro" se hicieron virales y la liga te citó. La investigación terminó en sanción.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'La organización paga tarde', ctx: 'Llevás tres meses de sueldo atrasado. El manager dice que "es tema de la oficina" y los jugadores del equipo arrancan a hablar entre ellos.',
|
||
opts: [
|
||
{ t: 'Reclamar público y colectivo', d: { marca: 1.6, sinergia: -1.0 }, risk: 0.35,
|
||
pos: 'El comunicado conjunto de los jugadores hizo que la directiva apareciera con la plata al toque. Pago total.',
|
||
neg: 'La directiva se ofendió: te marcaron, te apartaron del roster titular y la plata llegó igual de tarde.' },
|
||
{ t: 'Aguantar y rendir en el server', d: { sinergia: 1.4 }, risk: 0.25,
|
||
pos: 'Jugaste como si no te debieran nada: la directiva valoró la actitud y regularizó los pagos en silencio.',
|
||
neg: 'Aguantaste tres meses más y la deuda creció. Cuando la org quebró, la plata nunca apareció.' },
|
||
{ t: 'Poner las cartas sobre la mesa: me voy', d: { sinergia: 1.0, marca: 1.0 }, risk: 0.3, x: { transfer: 'other' },
|
||
pos: 'Tu agente sonó teléfonos y dos equipos te ofrecieron pagarte lo que te deben. Pase con deuda saldada.',
|
||
neg: 'La cláusula de salida tenía letra chica: te fuiste, pero te descontaron "gastos administrativos".' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'Te acusan de account sharing', ctx: 'Un rival te acusa públicamente de haber jugado una serie oficial con otra cuenta. La liga abrió investigación y los periodistas te persiguen.',
|
||
opts: [
|
||
{ t: 'Demostrar la inocencia con evidencia', d: { marca: 2.2 }, risk: 0.2,
|
||
pos: 'Historiales, IPs y VODs en mano: la liga te absolvió y el acusador quedó en offside. Tu reputación sale fortalecida.',
|
||
neg: 'La evidencia no convenció a nadie: "la podés haber armado", dicen los foros. La duda te persigue el split entero.' },
|
||
{ t: 'Callar y dejar que la liga investigue', d: { sinergia: 0.8 }, risk: 0.45,
|
||
pos: 'No alimentaste el circo: la investigación cerró sin cargos y el tema murió en dos semanas.',
|
||
neg: 'El silencio se interpretó como culpa: te suspendieron una serie preventiva y el daño a tu imagen quedó.' },
|
||
{ t: 'Mostrar todo tu gameplay en stream', d: { marca: 1.8 }, risk: 0.15,
|
||
pos: 'Un stream de 12 horas jugando en vivo con cámara: la gente vio que jugás igual que "el de la otra cuenta". Absuelto por la comunidad.',
|
||
neg: 'En el stream hiciste una jugada tan idéntica al VOD "sospechoso" que la teoría de la conspiración creció.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'La liga favorece al otro equipo', ctx: 'Un replay polémico, un horario cambiado a tu contra, y el equipo rival que siempre la pelea de local. Los fans dicen que la liga "tiene su favorito".',
|
||
opts: [
|
||
{ t: 'Protesta formal ante la liga', d: { marca: 1.6, sinergia: 0.8 }, risk: 0.35,
|
||
pos: 'El reclamo formal se escuchó: te dieron la razón en un punto y la imagen de la liga quedó en veremos.',
|
||
neg: 'La protesta cayó en oídos sordos y encima te tildaron de "llorón". Los árbitros te miran raro desde entonces.' },
|
||
{ t: 'Ganar igual, calladito', d: { sinergia: 1.4 }, risk: 0.25,
|
||
pos: 'No necesitaste que la liga te favorezca: le ganaste al "favorito" en su casa y el público estalló.',
|
||
neg: 'Perdiste por detalles y la sensación de injusticia te carcomió el resto del split.' },
|
||
{ t: 'Exponerlo en redes', d: { marca: 2.0 }, risk: 0.5,
|
||
pos: 'El hilo con los clips se hizo viral: la liga tuvo que salir a aclarar y hasta el patrocinador se anotició.',
|
||
neg: 'La liga te multó por "declaraciones públicas contra el circuito" y el equipo tuvo que pagar. Redes apagadas por un mes.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'La organización desaparece', ctx: 'El equipo deja de pagar el alquiler de la gaming house. El manager no contesta y el dueño vendió el edificio. La org se está yendo a pique.',
|
||
opts: [
|
||
{ t: 'Activar contactos ya', d: { sinergia: 1.0 }, risk: 0.25, x: { transfer: 'other' },
|
||
pos: 'Tu agente movió el mundo: en una semana tenías dos pruebas en equipos que sí pagan. Salida limpia.',
|
||
neg: 'Ningún equipo te quería con el "sello" de una org quebrada. Te quedaste cobrando migajas de un club fantasma.' },
|
||
{ t: 'Quedarte hasta el final', d: { sinergia: 1.6, marca: 1.0 }, risk: 0.4,
|
||
pos: 'La org se reflotó de pedo con un inversor y valoró a los que se quedaron: te subieron el sueldo y el rol.',
|
||
neg: 'La org se disolvió un lunes: te quedaste sin equipo, sin sueldo y con el pasaje pagado por vos. La escena se apiadó en redes.' },
|
||
{ t: 'Grabar todo para el documental', d: { marca: 2.2 }, risk: 0.2,
|
||
pos: 'El "documental de la crisis" se hizo viral: la gente te bancó y un medio grande te ofreció un programa.',
|
||
neg: 'El dueño de la org se sintió traicionado y te bloqueó el traspaso. La venganza tardó pero llegó.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'Multa por toxicidad', ctx: 'En una partida oficial te escapó un insulto y el micrófono lo captó. La liga te citó y el clip ya corre por las redes.',
|
||
opts: [
|
||
{ t: 'Disculpa pública inmediata', d: { marca: 1.4 }, risk: 0.15,
|
||
pos: 'Te disculpaste antes de que el clip escale: la multa fue simbólica y la comunidad valoró la humildad.',
|
||
neg: 'La disculpa sonó falsa y el clip con tu "contexto" la hizo peor. Ahora tenés un meme propio.' },
|
||
{ t: 'Apelar la sanción', d: { marca: 1.0 }, risk: 0.5,
|
||
pos: 'La apelación bajó la multa a la mitad: la letra del reglamento estaba de tu lado.',
|
||
neg: 'La apelación alargó el tema: te suspendieron un partido más por "no aceptar la sanción".' },
|
||
{ t: 'Negarlo todo', d: { sinergia: 0.6 }, risk: 0.6,
|
||
pos: 'Sin admisión, la sanción quedó en la mínima: "no se pudo determinar la autoría", dijeron. Les creyeron a medias.',
|
||
neg: 'El audio se ecualizó y quedó clarísimo que eras vos: sanción doble por faltar a la verdad.' },
|
||
]},
|
||
{ cat: 'momento', title: 'DDOS en plena serie', ctx: 'Game 3 de la serie, todo 1-1, y el server se cae a los 20 minutos. La liga no se decide: ¿replay o resultado en mesa?',
|
||
opts: [
|
||
{ t: 'Exigir el replay completo', d: { sinergia: 1.8 }, risk: 0.3,
|
||
pos: 'La liga cedió y se rejugó la partida completa: ganaste el game que te habían "robado". Justicia técnica.',
|
||
neg: 'La liga decidió dar el punto al rival "por ventaja adquirida". Reclamaste, pero la mesa no se movió.' },
|
||
{ t: 'Aceptar la reanudación desde el momento exacto', d: { vision: 1.6 }, risk: 0.25,
|
||
pos: 'La reanudación te favoreció: retomaste con la ventaja que ya tenías y cerraste la serie.',
|
||
neg: 'El bug de la reanudación te comió tu mejor ventaja: el rival aprovechó el caos y te dio vuelta la serie.' },
|
||
{ t: 'Proponer el "replay express" con un solo game definitorio', d: { mecanica: 1.8 }, risk: 0.45,
|
||
pos: 'Un solo game, todo o nada: lo ganaste con una jugada que ya es historia de la liga. Nervios de acero.',
|
||
neg: 'El replay express fue un caos de producción: empezó una hora tarde y el público ya se había ido. Perdiste el game y la atención.' },
|
||
]},
|
||
{ cat: 'estudios', title: 'El contrato leonino', ctx: 'La directiva te pasa la renovación: sueldo lindo, pero con cláusulas raras de salida y derechos de imagen eternos. "Firmá y listo", dicen.',
|
||
opts: [
|
||
{ t: 'Leerlo con un abogado', d: { vision: 1.6 }, risk: 0.1,
|
||
pos: 'El abogado encontró tres cláusulas truchas: las sacaron y el contrato terminó siendo de los mejores de la liga.',
|
||
neg: 'El abogado te cobró el 20% de la renovación. La letra chica la pagaste vos en honorarios.' },
|
||
{ t: 'Firmar sin leer, total confianza', d: { mecanica: 1.2 }, risk: 0.4,
|
||
pos: 'Firmaste y todo bien: la directiva te respetó igual y el contrato era más justo de lo que parecía.',
|
||
neg: 'Los derechos de imagen quedaron atados por 10 años: cada stream tuyo, cada marca, todo pasa por la org.' },
|
||
{ t: 'Negociar punto por punto', d: { marca: 1.6, sinergia: 0.6 }, risk: 0.3,
|
||
pos: 'Negociaste como un veterano: subida salarial por cláusula de salida, y la directiva terminó respetándote más.',
|
||
neg: 'Tanto punto por punto que la directiva se cansó: firmaste el original con dos cláusulas peores "de castigo".' },
|
||
]},
|
||
{ cat: 'preparacion', title: 'La liga achica las plazas', ctx: 'Anunciaron que el circuito reduce cupos el año que viene: los equipos de media tabla juegan por su supervivencia. El tuyo está en el límite.',
|
||
opts: [
|
||
{ t: 'Campaña para salvar la plaza', d: { marca: 1.6, sinergia: 1.0 }, risk: 0.3,
|
||
pos: 'El equipo se unió, los fans armaron bandera y la plaza se salvó: la comunidad te lo agradece en cada partido.',
|
||
neg: 'La campaña distrajo al equipo del rendimiento: quedaron últimos y la plaza se perdió igual.' },
|
||
{ t: 'Puro juego: la plaza se gana en el server', d: { mecanica: 1.6 }, risk: 0.3,
|
||
pos: 'Te enfocaste en rendir y el equipo escaló posiciones: te salvaste por mérito propio, no por campañas.',
|
||
neg: 'Rendiste, pero las decisiones se tomaron en oficinas que no miran el server. La plaza se fue igual.' },
|
||
{ t: 'Aprovechar para salir del circuito chico', d: { sinergia: 1.0 }, risk: 0.25, x: { transfer: 'other' },
|
||
pos: 'Con la plaza en duda, tu agente te consiguió una prueba en una liga más grande: te fuiste justo a tiempo.',
|
||
neg: 'La liga grande no te esperaba: la prueba salió mal y volviste a un circuito que ya no tenía tu plaza.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'La marca es trucha', ctx: 'Un periodista descubre que el dueño de tu org no tiene los derechos legales del nombre ni del logo del equipo. La liga lo está investigando y el escándalo ya es público.',
|
||
opts: [
|
||
{ t: 'Ayudar a refundar la marca', d: { marca: 2.0, sinergia: 1.2 }, risk: 0.3,
|
||
pos: 'Propuestas para el nuevo nombre, redes renovadas, la refundación salió bien: la gente abraza la nueva era.',
|
||
neg: 'La refundación fue un desastre de identidad: la gente ni se entera de que seguís siendo el mismo equipo.' },
|
||
{ t: 'Exigir a la directiva que lo arregle', d: { vision: 1.4 }, risk: 0.25,
|
||
pos: 'Presionaste y el dueño compró los derechos de una vez: multa paga, marca legal y a seguir.',
|
||
neg: 'El dueño no tenía la plata y la liga te multó igual al equipo: descontaron del sueldo de los jugadores.' },
|
||
{ t: 'Usar la polémica para moverte', d: { sinergia: 1.0 }, risk: 0.25, x: { transfer: 'other' },
|
||
pos: 'Con el escándalo encima, tu agente encontró un club serio que te quiere: saliste de la tormenta con mejora.',
|
||
neg: 'Ninguna org seria quiso tocar a un jugador de un club "trucho". Te quedaste hasta que se limpió todo.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El compa que filtra', ctx: 'Un jugador de un equipo rival te contacta: te paga si le pasás el plan de draft de tu equipo para la Promoción/Relegación. "Nadie se entera", te jura.',
|
||
opts: [
|
||
{ t: 'Rechazar y avisar a tu org', d: { marca: 1.8, sinergia: 0.8 }, risk: 0.12,
|
||
pos: 'El staff de integridad lo investigó todo: el rival quedó sancionado y vos sos el héroe de la promoción.',
|
||
neg: 'El tipo del contacto desapareció y nadie pudo probar nada. Te quedó la fama de "el que avisa".' },
|
||
{ t: 'Aceptar y pasarle el draft real', d: { mecanica: 1.2 }, risk: 0.8,
|
||
pos: 'La plata cayó y el plan "se filtró solo". Nadie sospechó... hasta que compararon los pick orders.',
|
||
neg: 'Se filtraron los chats: sanción de la liga, veto de por vida y la promoción la jugó tu reemplazo.' },
|
||
{ t: 'Aceptar pero pasarle el draft falso', d: { vision: 1.8 }, risk: 0.4,
|
||
pos: 'El rival armó su plan sobre un draft que nunca ibas a jugar: los humillaste en la promoción con el plan real.',
|
||
neg: 'El tipo sospechó que lo estafabas y filtró la conversación igual: tuviste que explicar mucho y mal.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El compa acusado', ctx: 'Tu compañero de equipo apareció en un hilo de denuncias graves en redes. La org no sabe qué hacer y los sponsors llaman preocupados.',
|
||
opts: [
|
||
{ t: 'Hablar con la directiva para que actúe', d: { marca: 1.6, sinergia: 0.6 }, risk: 0.2,
|
||
pos: 'La org desvinculó al compa de inmediato y el equipo salió ileso del escándalo. Tomaste la postura correcta.',
|
||
neg: 'Te tildaron de traidor en el vestuario: los que quedaron te miran raro y el clima se enrareció.' },
|
||
{ t: 'Mantener distancia y no opinar', d: { sinergia: 1.0 }, risk: 0.35,
|
||
pos: 'No alimentaste el circo: la org manejó todo en silencio y tu carrera siguió sin manchas.',
|
||
neg: 'Tu silencio se leyó mal: la comunidad te puso en el "grupo de los que callan". La marca lo sintió.' },
|
||
{ t: 'Pedir al equipo un comunicado firme', d: { marca: 1.4 }, risk: 0.3,
|
||
pos: 'El comunicado del plantel marcó postura y la comunidad lo valoró: el equipo salió fortalecido.',
|
||
neg: 'El comunicado salió ambiguo y todos los tomaron para el lado que no era. Doble daño.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El pacto del primer blood', ctx: 'Una casa de apuestas te ofrece plata si pactás la primera sangre de la serie. "Es inofensivo, nadie nota la diferencia", te dicen.',
|
||
opts: [
|
||
{ t: 'Reportarlo a integridad', d: { marca: 2.0, sinergia: 0.6 }, risk: 0.1,
|
||
pos: 'El staff de integridad armó una trampa y cazó a la red completa. Vos quedaste como el jugador limpio de la liga.',
|
||
neg: 'El contacto era de una cuenta falsa de Riot testeando tu honestidad: te felicitaron, pero te hicieron pasar el susto.' },
|
||
{ t: 'Pactar el blood y listo', d: { mecanica: 1.2 }, risk: 0.85,
|
||
pos: 'Un blood de más o de menos: la guita cayó y nadie se dio cuenta. (Nadie, por ahora.)',
|
||
neg: 'Las casas de apuestas detectaron el movimiento anómalo: veto permanente de la liga y tu carrera terminó en la penumbra.' },
|
||
{ t: 'Pactarlo "a medias" con tu jungla', d: { sinergia: 1.0 }, risk: 0.55,
|
||
pos: 'Lo pactaron tan sutil que hasta los casters lo elogiaron como "lectura perfecta". El negocio salió redondo.',
|
||
neg: 'El jungla lo contó en un stream borracho: dos vetos de por vida y el video es historia de la liga.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El ring del clasificatorio', ctx: 'Un pro de una liga grande te pide que juegues la cuenta de un equipo menor en la clasificatoria. "Es plata fácil y nadie se entera".',
|
||
opts: [
|
||
{ t: 'Decir que no, obvio', d: { marca: 1.6, sinergia: 0.6 }, risk: 0.1,
|
||
pos: 'Le cerraste la puerta al tipo y se corrió la voz: te respetan como el que no se vende.',
|
||
neg: 'El pro se ofendió y te tildó de "amargo" en una entrevista. La gente le creyó a él.' },
|
||
{ t: 'Aceptar jugar "solo un game"', d: { mecanica: 1.6 }, risk: 0.75,
|
||
pos: 'Un game, una clasificatoria asegurada, plata en el bolsillo. Nadie miró, dicen.',
|
||
neg: 'La liga comparó IPs y horarios: sancionado el equipo menor, el pro y vos. Suspensión de un año.' },
|
||
{ t: 'Exigir plata por adelantado', d: { marca: 1.2 }, risk: 0.6,
|
||
pos: 'Cobraste por adelantado y al final no jugaste: plata gratis y el "amigo" nunca más te habló.',
|
||
neg: 'El pro te denunció por "estafa": ahora los dos están en el expediente de la liga. Nadie sale bien.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'Soborno en la final de ascenso', ctx: 'El dueño de un club rival te ofrece plata por "no aparecer enchufado" en la final de ascenso. Tu equipo depende de ese partido.',
|
||
opts: [
|
||
{ t: 'Contarlo todo a tu club', d: { marca: 2.0 }, risk: 0.1,
|
||
pos: 'La denuncia hizo caer al club rival y la final se jugó con la cancha a tu favor: ascendiste limpio.',
|
||
neg: 'El dueño negó todo y la liga no encontró pruebas: quedó como "acusación sin sustento".' },
|
||
{ t: 'Agarrar la plata y jugar mal "de casualidad"', d: { sinergia: -1.4 }, risk: 0.8,
|
||
pos: 'Jugaste el peor game de tu vida sin que nadie lo notara del todo. La guita cayó, pero el peso quedó.',
|
||
neg: 'Tu "casualidad" fue tan evidente que hasta tu madre lo vio: la liga revisó las cintas y cayó todo.' },
|
||
{ t: 'Usar la oferta para negociar tu futuro', d: { marca: 1.4, sinergia: 0.8 }, risk: 0.3,
|
||
pos: 'Le dijiste que no al soborno y le vendiste a tu club la jugada: te subieron el sueldo y te blindaron el puesto.',
|
||
neg: 'El dueño del rival se sintió extorsionado y te denunció a la liga por "pedir coimas". La verdad salió, pero el mambo ya estaba.' },
|
||
]},
|
||
{ cat: 'preparacion', title: 'La gaming house de la miseria', ctx: 'La gaming house tiene una sola silla rota, internet que se corta a las 6 PM y humedad en las paredes. Los jugadores ya armaron grupo de quejas.',
|
||
opts: [
|
||
{ t: 'Liderar el reclamo de condiciones', d: { sinergia: 1.8 }, risk: 0.25,
|
||
pos: 'El reclamo firmado por todo el plantel movió a la directiva: gaming house nueva y el rendimiento subió solo.',
|
||
neg: 'La directiva tomó el reclamo como rebelión: te sacaron del roster "por actitud" y el internet siguió igual.' },
|
||
{ t: 'Pagarte vos el internet y la silla', d: { mecanica: 1.4 }, risk: 0.15,
|
||
pos: 'Inversión personal en tu setup: jugás cómodo y tu rendimiento no depende de la miseria de la casa.',
|
||
neg: 'Pagaste todo de tu bolsillo y la org lo dio por sentado: ahora la heladera también es "tuya".' },
|
||
{ t: 'Quejarte en el stream', d: { marca: 1.6 }, risk: 0.35,
|
||
pos: 'El clip del techo con humedad se hizo viral: la directiva se vio obligada a arreglar todo en una semana.',
|
||
neg: 'La directiva te sancionó por "dañar la imagen del club" y los fans se dividieron: tu lado ganó, pero con costo.' },
|
||
]},
|
||
{ cat: 'momento', title: 'El estudio sin gente', ctx: 'La liga mudó el estudio a otra ciudad con la tribuna vacía: partidos en silencio de biblioteca. La afición se aleja y la producción se resiente.',
|
||
opts: [
|
||
{ t: 'Pedir jugar los partidos con público en tu ciudad', d: { marca: 1.6 }, risk: 0.3,
|
||
pos: 'La liga cedió un evento con público: la final se jugó llena y la audiencia volvió a crecer. La gente te lo agradece.',
|
||
neg: 'La liga te ignoró y el tema quedó en un hilo de Twitter que nadie leyó. El silencio siguió.' },
|
||
{ t: 'Adaptarte al teatro vacío', d: { sinergia: 1.4 }, risk: 0.15,
|
||
pos: 'Jugaste mejor sin presión: el silencio te favoreció y tu rendimiento en el "estudio fantasma" fue top.',
|
||
neg: 'El silencio te comió la motivación: jugabas sin energía, como si nada importara.' },
|
||
{ t: 'Exigir el cambio de sede en la asamblea', d: { marca: 1.2, sinergia: 0.8 }, risk: 0.35,
|
||
pos: 'Vos y otros jugadores plantaron el reclamo: la liga escuchó y rearmó el calendario con sedes locales.',
|
||
neg: 'El plantel se dividió entre los que querían y los que no: la asamblea terminó en una pelea que no resolvió nada.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El dueño fantasma', ctx: 'Enterate de que el CEO de tu org firmó tus contratos con identificación falsa. Debe plata a todos: jugadores, staff, sponsors. Y nadie lo encuentra.',
|
||
opts: [
|
||
{ t: 'Reclamar por la vía legal', d: { vision: 1.6 }, risk: 0.3,
|
||
pos: 'El reclamo legal salió bien: la liga intervino, la deuda se regularizó y el dueño fantasma quedó en la lista negra del circuito.',
|
||
neg: 'La vía legal se alargó meses: cobraste, pero después de que la org ya había muerto en los papeles.' },
|
||
{ t: 'Salir a buscar equipo YA', d: { sinergia: 1.0 }, risk: 0.25, x: { transfer: 'other' },
|
||
pos: 'Con el escándalo fresco, las orgs serias te buscaron para "salvarte del barco": saliste con contrato y deuda saldada por el comprador.',
|
||
neg: 'Tu reputación quedó manchada por asociación: "jugador de la org fantasma". Las pruebas fueron más incómodas que útiles.' },
|
||
{ t: 'Quedarte y ayudar a refundar lo que quede', d: { marca: 1.8, sinergia: 1.2 }, risk: 0.35,
|
||
pos: 'Vos y los compas sostuvieron el club hasta que llegó un inversor: la refundación se contó como historia de redención.',
|
||
neg: 'Aguantaste hasta el final y el final fue la quiebra: te quedaste sin cobrar los últimos meses y con la moraleja aprendida.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'La liga te debe los premios', ctx: 'Terminaron el split y los premios no llegan: la liga puso excusas, pasaron semanas y los equipos arman comunicado conjunto.',
|
||
opts: [
|
||
{ t: 'Firmar el comunicado conjunto', d: { marca: 1.4, sinergia: 1.0 }, risk: 0.15,
|
||
pos: 'El comunicado unido hizo que la liga pagara todo en una semana. La unión hace la fuerza, incluso en esports.',
|
||
neg: 'La liga pagó, pero te marcó como "rebelde": después te tocaron los peores horarios del calendario.' },
|
||
{ t: 'Cobrar por tu cuenta y a la mierda', d: { marca: 1.2 }, risk: 0.35,
|
||
pos: 'Tu agente presionó en privado y cobraste antes que todos. Nadie se enteró (o sí, pero nadie dijo nada).',
|
||
neg: 'El resto de los equipos se enteró de que cobraste por separado: te tildaron de romper el frente común.' },
|
||
{ t: 'Aguantar y esperar', d: { sinergia: 1.0 }, risk: 0.4,
|
||
pos: 'La plata apareció tarde pero apareció: mientras tanto jugaste igual, y la liga lo valoró en silencio.',
|
||
neg: 'Los premios nunca llegaron completos y los que firmaron el comunicado cobraron antes que vos. Lección cara.' },
|
||
]},
|
||
{ cat: 'preparacion', title: 'Varado en el extranjero', ctx: 'La Promoción se juega en otro país y las restricciones de viaje te dejan varado ahí: meses sin volver a casa, sin saber cuándo se juega.',
|
||
opts: [
|
||
{ t: 'Entrenar como si nada y esperar', d: { mecanica: 1.8 }, risk: 0.25,
|
||
pos: 'Aprovechaste el encierro para grindear: volviste siendo mejor jugador y ganaste la promoción varada.',
|
||
neg: 'Tantos meses de incertidumbre te comieron la cabeza: jugaste la promoción con la mente en tu casa.' },
|
||
{ t: 'Exigir formato online', d: { marca: 1.4, sinergia: 0.6 }, risk: 0.35,
|
||
pos: 'Tu reclamo público empujó a la liga a hacer la promoción online: jugaste desde casa y ganaste.',
|
||
neg: 'La liga te ignoró y jugaron igual: el viaje en vano y el público te vio como "el que se queja".' },
|
||
{ t: 'Volverte y arriesgar el cupo', d: { sinergia: 1.2 }, risk: 0.4,
|
||
pos: 'Volviste por tu cuenta y la liga terminó permitiendo formato online: tu desobediencia se volvió sabiduría.',
|
||
neg: 'Volviste y la promoción se jugó presencial: tu equipo perdió con suplente y el cupo se fue. Te lo echaron en cara.' },
|
||
]},
|
||
{ cat: 'momento', title: 'La fusión de ligas', ctx: 'Anuncian que tu liga se fusiona con otra región más grande: hay cupos limitados y tu equipo pelea por uno. El ecosistema entero tiembla.',
|
||
opts: [
|
||
{ t: 'Rendir al máximo para asegurar el cupo', d: { mecanica: 2.0 }, risk: 0.3,
|
||
pos: 'Jugaste los mejores games de tu carrera en la ventana decisiva: tu equipo se ganó el cupo por mérito.',
|
||
neg: 'Rendiste, pero los cupos se repartieron en oficinas: tu equipo se quedó afuera y la liga vieja murió sin tu despedida.' },
|
||
{ t: 'Hacer lobby en la liga nueva', d: { marca: 1.6, sinergia: 0.8 }, risk: 0.35,
|
||
pos: 'Tus contactos en la liga nueva hablaron por el equipo: cupo asegurado y hasta te ofrecieron rol de referente.',
|
||
neg: 'El lobby se descubrió y quedó feo: "se metieron por la puerta de atrás", dijeron. El cupo llegó, pero con el sello.' },
|
||
{ t: 'Pelear el cupo individual en la liga fusionada', d: { sinergia: 1.0 }, risk: 0.25, x: { transfer: 'other' },
|
||
pos: 'Tu nivel individual te hizo jugable para equipos de la liga fusionada: te ficharon directo, sin pasar por la puerta.',
|
||
neg: 'En la liga fusionada sos un pez chico: probaste, no quedaste y volviste a un circuito que ya no existía.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El coach que filtra intel', ctx: 'Descubriste que tu coach le pasa información táctica de tus partidos a equipos rivales. Tiene un año de ban pendiente y sigue trabajando.',
|
||
opts: [
|
||
{ t: 'Denunciarlo a la liga', d: { marca: 1.8 }, risk: 0.2,
|
||
pos: 'La liga lo baneó hasta el final de la temporada: el roster quedó limpio y vos ganaste fama de incorruptible.',
|
||
neg: 'Sin pruebas suficientes, la denuncia cayó en saco roto: el coach siguió y ahora te esquiva en el pasillo.' },
|
||
{ t: 'Encararlo directo', d: { sinergia: 1.6 }, risk: 0.25,
|
||
pos: 'La charla cara a cara lo asustó: dejó de pasar intel y el equipo arrancó a ganar de verdad.',
|
||
neg: 'El coach lo negó todo y le avisó al dueño: ahora sos vos el que queda mirando raro en las reuniones.' },
|
||
{ t: 'Usar el intel filtrado a tu favor', d: { vision: 1.8 }, risk: 0.45,
|
||
pos: 'Le pasabas información falsa por el canal del coach: los rivales armaron planes sobre mentiras y ganaste dos series.',
|
||
neg: 'El doble juego se descubrió a mitad de serie: multa para el equipo y el coach, y la promoción se fue al tacho.' },
|
||
]},
|
||
{ cat: 'preparacion', title: 'Verificación de identidad', ctx: 'La liga endureció los controles por los casos de cuentas compartidas: cámara encendida, pasaporte en mano y revisión de hardware en cada partido online.',
|
||
opts: [
|
||
{ t: 'Acondicionar tu setup para la verificación', d: { vision: 1.6 }, risk: 0.12,
|
||
pos: 'Cámara, documentos y setup en orden: pasaste todas las verificaciones sin drama y hasta te felicitaron por la prolijidad.',
|
||
neg: 'Tu setup era tan desordenado que la revisión tardó 40 minutos: la liga te puso en la lista de "vigilados".' },
|
||
{ t: 'Quejarte del control', d: { marca: 1.0, sinergia: -0.6 }, risk: 0.35,
|
||
pos: 'Tu queja pública abrió el debate y la liga suavizó el proceso: la gente te vio como defensor de los jugadores.',
|
||
neg: 'La liga interpretó tu queja como miedo a ser verificado: te revisaron en cada partido, con lupa.' },
|
||
{ t: 'Aprovechar para limpiar tu nombre', d: { marca: 1.4 }, risk: 0.15,
|
||
pos: 'Sos de los pocos que pasó todas las verificaciones sin una sola mancha: la liga te puso de ejemplo en el comunicado.',
|
||
neg: 'En una verificación encontraron un smurf tuyo de hace años: "explicación de contexto", pero el sello quedó.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'La ola de baneos de por vida', ctx: 'La liga anunció sanciones de por vida para siete jugadores y un coach por una red de amaño de partidos. Tu nombre circuló en los memes, aunque no estás involucrado.',
|
||
opts: [
|
||
{ t: 'Apoyar públicamente la limpieza', d: { marca: 1.6 }, risk: 0.1,
|
||
pos: 'Saliste a bancar la decisión y a pedir "cero tolerancia": la comunidad te vio como el jugador limpio de la liga.',
|
||
neg: 'Unos lo leyeron como hacerte el santo: "el que no debe nada, no habla tanto". Igual, la liga te anotó del lado bueno.' },
|
||
{ t: 'Exigir que la investigación siga hasta el final', d: { marca: 1.2, sinergia: 0.6 }, risk: 0.3,
|
||
pos: 'Tu pedido de "que caiga toda la red" empujó la investigación: se descubrieron más involucrados y tu equipo quedó como el más transparente.',
|
||
neg: 'La investigación se comió semanas de calendario: series postergadas, sponsors nerviosos, y un par de rivales te miraron feo.' },
|
||
{ t: 'Callarte y enfocarte en jugar', d: { vision: 1.4 }, risk: 0.25,
|
||
pos: 'Mientras todos hablaban, vos ganaste: sin declaraciones ni ruido, pasaste de ronda en los playoffs.',
|
||
neg: 'Tu silencio se leyó como complicidad: "si no dice nada, algo sabe". Los periodistas te siguieron pidiendo una palabra.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'Tu org renuncia a la liga', ctx: 'Tu organización anunció por comunicado que abandona la liga, criticando el trato de la liga y el formato. Quedás libre de un día para el otro, a mitad de temporada.',
|
||
opts: [
|
||
{ t: 'Apoyar a la org en el comunicado', d: { sinergia: 1.4 }, risk: 0.3,
|
||
pos: 'Saliste junto a la org y el respaldo mutuo te consiguió una salida decorosa: te ficharon rápido con buena reputación.',
|
||
neg: 'La liga te vio como parte del problema: "jugador de la org que renunció". Las ofertas tardaron en llegar.' },
|
||
{ t: 'Desmarcarte y buscar equipo YA', d: { marca: 1.2 }, risk: 0.25, x: { transfer: 'other' },
|
||
pos: 'Te moviste rápido con un agente y a las dos semanas ya tenías contrato nuevo en otra org de la misma liga.',
|
||
neg: 'Quedaste como "el que abandonó el barco": la liga nueva te miró con desconfianza y el vestuario te recibió frío.' },
|
||
{ t: 'Quedarte y bancar a la org en la pelea legal', d: { marca: 1.8, sinergia: 1.0 }, risk: 0.4,
|
||
pos: 'La pelea legal de la org terminó ganando indemnizaciones: vos cobraste tu parte y la historia quedó como ejemplo de lucha.',
|
||
neg: 'La pelea legal se alargó y la liga ya tenía su lista de "no deseados": tu carrera esperó un año para recomponerse.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'Te acusan de usar scripts', ctx: 'En una partida online un rival dice que tus "esquives imposibles" son de script. Riot banea la cuenta en la liga y tu equipo pierde partidos por derrotas automáticas.',
|
||
opts: [
|
||
{ t: 'Pedir revisión de hardware y demos', d: { marca: 1.4 }, risk: 0.15,
|
||
pos: 'Entregaste demos, cámara y logs: la liga confirmó que no había nada raro y hasta aclaró el caso en un comunicado.',
|
||
neg: 'La revisión tardó semanas: perdiste partidos por la derrota automática mientras tanto y nadie leyó la aclaración final.' },
|
||
{ t: 'Encarar al rival en público', d: { sinergia: 1.0 }, risk: 0.4,
|
||
pos: 'La discusión en vivo te dio visibilidad: muchos jugadores salieron a bancarte y el rival quedó como el tóxico.',
|
||
neg: 'La pelea pública empeoró todo: la liga te sancionó por conducta y "el que grita más fuerte" quedó igual de manchado.' },
|
||
{ t: 'Aguantar el ban y esperar la apelación', d: { vision: 1.6 }, risk: 0.35,
|
||
pos: 'La apelación ganó por falta de pruebas: volviste a la liga y tu nivel calló todas las bocas.',
|
||
neg: 'La apelación se perdió por un detalle de formato: el ban quedó firme y "la cuenta con scripts" te persiguió un año.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'La sanción retroactiva por boosting', ctx: 'La liga revisó historiales viejos y te cayó una sanción por una cuenta que le prestaste a un amigo en la academia, hace dos años. El timing no podía ser peor: playoffs.',
|
||
opts: [
|
||
{ t: 'Aceptar la sanción y cumplirla', d: { marca: 1.2 }, risk: 0.2,
|
||
pos: 'Cumpliste los meses de ban sin quejarte: la liga y los fans valoraron la honestidad y volviste más fuerte.',
|
||
neg: 'Te perdiste los playoffs enteros: el equipo avanzó sin vos y tuviste que remar para recuperar el puesto.' },
|
||
{ t: 'Apelar con pruebas', d: { marca: 1.6 }, risk: 0.3,
|
||
pos: 'Mostraste los logs de que la cuenta era tuya y la sanción se redujo a la mitad: llegaste a la parte final de los playoffs.',
|
||
neg: 'La apelación quedó en la cola de casos por la ola de sanciones: jugaste los playoffs "bajo investigación" y te pesó.' },
|
||
{ t: 'Admitir el boosting y reconstruir tu imagen', d: { sinergia: 1.4 }, risk: 0.25,
|
||
pos: 'Lo contaste antes de que lo contaran: "fue un error de pendejo". La comunidad valoró la asunción y tu carrera siguió.',
|
||
neg: 'Admitirlo te costó sponsors y un split entero sin equipo: la honestidad no se cobra en contratos, al menos no de inmediato.' },
|
||
]},
|
||
{ cat: 'preparacion', title: 'La promoción que nunca llega', ctx: 'La liga postergó la Promoción/Relegación por meses: los equipos quedaron en el limbo, cobrando sin competir, con contratos vencidos y sin calendario. Los foros arden contra la liga.',
|
||
opts: [
|
||
{ t: 'Mantener el equipo entrenando como si nada', d: { sinergia: 1.8 }, risk: 0.2,
|
||
pos: 'Mientras todos se relajaban, tu equipo siguió con scrims y VODs: cuando la promoción se jugó, estaban un nivel arriba.',
|
||
neg: 'Tantos meses entrenando sin objetivo real quemaron al plantel: llegaron a la promoción con la cabeza en otro lado.' },
|
||
{ t: 'Presionar públicamente por un calendario', d: { marca: 1.4, sinergia: 0.4 }, risk: 0.35,
|
||
pos: 'Tu reclamo (y el de otros equipos) hizo que la liga confirmara la fecha: te vieron como el jugador que moviliza a la comunidad.',
|
||
neg: 'La liga confirmó la fecha, pero te marcó: "el equipo que se queja" recibió los peores horarios de la promoción.' },
|
||
{ t: 'Buscar alternativas mientras tanto', d: { vision: 1.6 }, risk: 0.3,
|
||
pos: 'Con los meses libres, te ficharon para torneos exhibición y stream: volviste a la promoción con más nivel y más fans.',
|
||
neg: 'Las alternativas te distrajeron: volviste sin ritmo competitivo y la promoción te encontró frío.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'La ola de multas por conducta', ctx: 'La liga sancionó en una semana a varios jugadores conocidos por conducta antideportiva en SoloQ: multas económicas, advertencias oficiales y debate público sobre la toxicidad del high elo.',
|
||
opts: [
|
||
{ t: 'Salir a apoyar la mano dura', d: { marca: 1.6 }, risk: 0.15,
|
||
pos: 'Bancaste las sanciones en público: la liga te citó como ejemplo de jugador limpio y los casters te mencionaron.',
|
||
neg: 'Unos jugadores sancionados te agarraron bronca: "el que se hace el santo". Los scrims se volvieron tensos.' },
|
||
{ t: 'Pedir contexto antes de juzgar', d: { sinergia: 1.4 }, risk: 0.3,
|
||
pos: 'Saliste a defender la salud mental de los jugadores: la comunidad debatió, la liga escuchó y suavizó las multas para algunos.',
|
||
neg: 'Te tildaron de defensor de tóxicos: la liga te miró raro y un sponsor se preguntó si "compartís esos valores".' },
|
||
{ t: 'Callarte y no exponerte', d: { vision: 1.2 }, risk: 0.2,
|
||
pos: 'No opinaste y no te salpicó nada: mientras el debate ardía, vos te enfocaste en ganar partidos.',
|
||
neg: 'Tu silencio se leyó como complicidad: "el que no opina, algo esconde". Igual, no te sancionaron.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El import que no habla español', ctx: 'La org fichó a un jugador coreano que no habla español: los scrims se hacen con traductor, las calls se pierden y la afición critica que se desplace talento local.',
|
||
opts: [
|
||
{ t: 'Aprender inglés básico para ayudarlo', d: { sinergia: 1.6 }, risk: 0.15,
|
||
pos: 'Vos y el import armaron un código de juego con inglés y ping: las calls mejoraron y la dupla se volvió la mejor del equipo.',
|
||
neg: 'El inglés básico no alcanzó para el macro: en los games tensos, el import siguió jugando solo.' },
|
||
{ t: 'Exigir que juegue alguien local', d: { marca: 1.2, sinergia: -0.4 }, risk: 0.4,
|
||
pos: 'Tu queja pública se sumó a la crítica de la comunidad: la org escuchó y puso un jugador local en el roster.',
|
||
neg: 'La org no te perdonó la presión: "el que arma el roster soy yo". El vestuario quedó dividido y el import se fue.' },
|
||
{ t: 'Bancar el proyecto del import', d: { sinergia: 1.2, vision: 1.0 }, risk: 0.3,
|
||
pos: 'Le enseñaste el juego con gestos y paciencia: a mitad de split ya llamaba básico y el equipo funcionaba como nunca.',
|
||
neg: 'El proyecto fracasó igual: el import se fue por otra liga y vos quedaste como "el que perdió el tiempo".' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El coach juega los scrims', ctx: 'Descubriste que tu coach juega los scrims con una cuenta alternativa y que un "suplente" oculto entrena con otra identidad. Nadie sabe quién es quién en el roster.',
|
||
opts: [
|
||
{ t: 'Denunciarlo a la liga', d: { marca: 1.6 }, risk: 0.25,
|
||
pos: 'La liga abrió investigación y separó al coach: el roster quedó limpio y la org te agradeció en privado.',
|
||
neg: 'Sin pruebas contundentes, el coach la negó: vos quedaste como el conflictivo y el staff te esquivó.' },
|
||
{ t: 'Encarar al coach en privado', d: { sinergia: 1.4 }, risk: 0.2,
|
||
pos: 'La charla lo frenó: los scrims volvieron a ser legales y el "suplente oculto" se fue silenciosamente.',
|
||
neg: 'El coach lo admitió pero se sintió traicionado: a partir de ahí te puso a vos como "el difícil del equipo".' },
|
||
{ t: 'Aprovechar la situación para aprender', d: { vision: 1.8 }, risk: 0.35,
|
||
pos: 'Observaste sus patrones y aprendiste lectura de mapas de otro nivel: el conocimiento se quedó con vos para siempre.',
|
||
neg: 'El doble juego se destapó en plena serie: el equipo quedó en la mira de la liga y perdiste partidos por alineación irregular.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El ghosting en la serie', ctx: 'Durante una pausa técnica de la serie, alguien del staff recibe información externa sobre el draft rival. No hay prueba, pero todos lo vieron. La liga investiga.',
|
||
opts: [
|
||
{ t: 'Pedir auditoría del broadcast', d: { marca: 1.8 }, risk: 0.15,
|
||
pos: 'Tu pedido público de transparencia hizo que la liga auditara todo: salieron limpios y el equipo ganó credibilidad.',
|
||
neg: 'La auditoría no encontró nada, pero te marcó como "el que desconfía de su propia org".' },
|
||
{ t: 'Avisar a tu equipo y seguir jugando', d: { sinergia: 1.4 }, risk: 0.25,
|
||
pos: 'Le avisaste al capitán y ajustaron el draft a tiempo: ganaron la serie y la ventaja ilegal quedó en un malentendido.',
|
||
neg: 'El aviso llegó tarde y la información externa favoreció al rival: perdiste la serie y la sospecha quedó en el aire.' },
|
||
{ t: 'Negarte a usar la información', d: { vision: 1.2 }, risk: 0.3,
|
||
pos: 'Decidiste jugar limpio: la liga lo supo, no encontró nada raro y tu integridad quedó en el comunicado.',
|
||
neg: 'El rival que SÍ usó información externa te ganó la serie: la limpieza no paga boletos a playoffs.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'La leyenda polémica', ctx: 'Un histórico midlaner de la región (varios títulos, siempre en controversia) se mete en tu timeline: críticas a tu equipo, declaraciones sobre tu rendimiento y una pelea pública con tu org.',
|
||
opts: [
|
||
{ t: 'Responder con resultados', d: { vision: 1.8 }, risk: 0.2,
|
||
pos: 'No entraste al debate: le ganaste la serie y tu juego habló por vos. La leyenda tuvo que reconocerte.',
|
||
neg: 'Ganaste, pero la leyenda siguió tirando sombra: su público te bardeó igual en cada stream.' },
|
||
{ t: 'Responderle en redes', d: { marca: 1.4 }, risk: 0.35,
|
||
pos: 'Tu respuesta se volvió viral y la gente se puso de tu lado: la vieja escuela contra la nueva, y ganaste el debate.',
|
||
neg: 'La leyenda tiene años de experiencia en bardear: te comió la cabeza y tu rendimiento cayó una semana.' },
|
||
{ t: 'Buscarlo para aprender', d: { sinergia: 1.2 }, risk: 0.25,
|
||
pos: 'Lo contactaste en privado y compartió consejos de mid: la polémica se convirtió en mentoría inesperada.',
|
||
neg: 'La charla se filtró y pareció que te arrastrabas: la comunidad te vio como "el que le lame las botas".' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El acomodo del representante', ctx: 'Un representante influyente te ofrece entrar a un equipo de la liga grande "por contactos", sin pasar por el proceso de pruebas. Es la misma gente que se recicla entre organizaciones.',
|
||
opts: [
|
||
{ t: 'Aceptar el acomodo', d: { sinergia: 1.4 }, risk: 0.35,
|
||
pos: 'Entraste a la liga grande sin pruebas: los resultados te dieron la razón y nadie se acordó del acomodo.',
|
||
neg: 'El roster no te bancó: "entró por contactos", decían. Jugaste una temporada al pedo y te fuiste.' },
|
||
{ t: 'Exigir pasar por las pruebas', d: { marca: 1.6 }, risk: 0.2,
|
||
pos: 'Ganaste el puesto por mérito en las pruebas: la historia se contó como ejemplo y el representante te respetó más.',
|
||
neg: 'Perdiste las pruebas contra alguien peor pero más "acomodado": el mérito no siempre gana en esta liga.' },
|
||
{ t: 'Rechazar el contacto', d: { vision: 1.4 }, risk: 0.25,
|
||
pos: 'Seguiste tu camino sin atajos: más tarde te ficharon por rendimiento y tu carrera quedó limpia.',
|
||
neg: 'El representante se ofendió y te bloqueó: las puertas que no se abren por contactos, a veces no se abren nunca.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'La mafia del reciclaje', ctx: 'Los mismos nombres de siempre llenan los rosters de la liga grande, aunque lleven años con malos resultados. Los talentos de SoloQ denuncian que es imposible entrar. A vos te acaban de rechazar por "falta de experiencia en liga".',
|
||
opts: [
|
||
{ t: 'Hacer campaña por los talentos nuevos', d: { marca: 1.8 }, risk: 0.3,
|
||
pos: 'Tu denuncia abrió el debate: la liga pidió que los equipos den chances a rookies y a vos te llovieron ofertas de academias.',
|
||
neg: 'Los equipos grandes te tildaron de envidioso: "el que no pudo entrar, critica". Las ofertas tardaron un año.' },
|
||
{ t: 'Seguir el juego y buscar contactos', d: { sinergia: 1.2 }, risk: 0.25,
|
||
pos: 'Te acercaste a los referentes y entraste por recomendación: una vez adentro, demostraste que el sistema estaba mal.',
|
||
neg: 'Entraste por contactos y te comieron los "veteranos": jugaste poco, miraste mucho y tu talento se oxidó.' },
|
||
{ t: 'Dominar la SoloQ hasta que no te puedan ignorar', d: { vision: 1.8 }, risk: 0.2,
|
||
pos: 'Llegaste a challenger con récord: te ficharon porque no había forma de ignorarte. El mérito rompió el sistema.',
|
||
neg: 'Dominaste SoloQ pero nadie te fichó igual: el sistema es más fuerte que el talento, y la frustración te comió.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El stream sniper', ctx: 'En una partida de SoloQ importante, un rival está mirando tu stream en vivo y esquiva tus jugadas. Es el tercero que lo hace esta semana. La comunidad lo graba.',
|
||
opts: [
|
||
{ t: 'Denunciarlo con clips', d: { marca: 1.6 }, risk: 0.15,
|
||
pos: 'Los clips se volvieron virales: la liga y Riot le pusieron sanción y vos ganaste fama de "jugador que se cuida".',
|
||
neg: 'El stream sniper lo negó y sus fans te bardearon: "el streamer que se victimiza". La denuncia quedó en la nada.' },
|
||
{ t: 'Jugar con delay', d: { vision: 1.4 }, risk: 0.1,
|
||
pos: 'Ajustaste el delay y las jugadas sorpresa volvieron a funcionar: subiste de rango tranquilo.',
|
||
neg: 'El delay te costó la interacción con tu chat: perdiste viewers y sponsor se quejó de las métricas.' },
|
||
{ t: 'Hacerte el boludo y darle una trampa', d: { vision: 1.8 }, risk: 0.4,
|
||
pos: 'Fingiste un gank y le diste un bait de campeonato: el clip del sniper cayendo en la trampa se volvió leyenda.',
|
||
neg: 'La "trampa" se leyó como desprecio al rival: te acusaron de tóxico y la liga te llamó la atención.' },
|
||
]},
|
||
{ cat: 'preparacion', title: 'El fichaje que se cae', ctx: 'Te anunciaron en el nuevo equipo, pero el trámite se complica: la visa no llega, el contrato tiene una cláusula rara y la org nueva empieza a dudar. Los medios ya anunciaron tu llegada.',
|
||
opts: [
|
||
{ t: 'Apurar el trámite y la visa', d: { vision: 1.6 }, risk: 0.25,
|
||
pos: 'Le metiste pila a la burocracia: la visa llegó, el contrato se firmó y tu debut fue la nota de la semana.',
|
||
neg: 'La visa se atrasó igual por el país de origen: jugaste los primeros meses como "jugador invitado" sin contrato.' },
|
||
{ t: 'Negociar la cláusula', d: { marca: 1.4 }, risk: 0.3,
|
||
pos: 'Discutiste la cláusula con el representante: quedó más justa y la org valoró tu perfil negociador.',
|
||
neg: 'La negociación tensó el ambiente: la org arrancó desconfiando de vos y el arranque fue frío.' },
|
||
{ t: 'Pelear el fichaje o renegociar con tu equipo actual', d: { sinergia: 1.2 }, risk: 0.35, x: { transfer: 'other' },
|
||
pos: 'El fichaje caído te abrió la puerta a una mejor oferta de otro equipo: terminaste mejor de lo planeado.',
|
||
neg: 'Entre el fichaje caído y la renegociación, quedaste sin contrato dos semanas: la incertidumbre te comió.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'Tu directiva te ensucia', ctx: 'La alta directiva de tu org insultó a árbitros y a rivales tras una derrota, en un comunicado y en redes. La liga la sancionó económicamente y ahora todo el club carga con la etiqueta.',
|
||
opts: [
|
||
{ t: 'Desmarcarte públicamente', d: { marca: 1.6 }, risk: 0.25,
|
||
pos: 'Saliste a aclarar que el plantel no comparte las declaraciones: los sponsors y la liga lo valoraron.',
|
||
neg: 'La directiva te vio como traidor: "el que lava las manos". El vestuario se dividió en dos bandos.' },
|
||
{ t: 'Bancar a la directiva', d: { sinergia: 1.2 }, risk: 0.35,
|
||
pos: 'Saliste a defender a tu org: la afición se unió contra la liga y el tema se convirtió en "todos contra el sistema".',
|
||
neg: 'Bancaste los insultos y te salpicó: la liga te anotó como "cómplice" y los árbitros te cobraron todo a vos.' },
|
||
{ t: 'Pedir la cabeza del director', d: { marca: 1.4, sinergia: 0.6 }, risk: 0.3,
|
||
pos: 'Tu pedido interno se filtró y la directiva cayó: la nueva gestión arrancó con vos como referente.',
|
||
neg: 'El director se enteró de tu pedido: te hicieron la vida imposible hasta que te fuiste del club.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El caster vetado', ctx: 'Un caster amigo tuyo denunció salarios atrasados y contratos inexistentes de la liga. Lo sacaron del broadcast "por ajustes de producción" y nadie lo llama más. Te pregunta si querés apoyarlo públicamente.',
|
||
opts: [
|
||
{ t: 'Apoyarlo en público', d: { marca: 1.8 }, risk: 0.35,
|
||
pos: 'Tu apoyo le dio visibilidad al caso: la liga pagó deudas y lo reincorporó. La comunidad te vio como alguien con principios.',
|
||
neg: 'La liga te marcó: "el jugador del caster". Tus entrevistas post-partido se volvieron más cortas y frías.' },
|
||
{ t: 'Apoyarlo en privado', d: { sinergia: 1.4 }, risk: 0.15,
|
||
pos: 'Lo ayudaste con contactos y le conseguiste laburo en otro proyecto: su carrera siguió y tu perfil quedó limpio.',
|
||
neg: 'El apoyo privado no movió la aguja: el caster siguió vetado y te reprochó no haberte jugado por él.' },
|
||
{ t: 'No meterte', d: { vision: 1.4 }, risk: 0.2,
|
||
pos: 'No te expusiste: la liga siguió como siempre y vos seguiste jugando sin problemas.',
|
||
neg: 'El caster lo tomó como traición: "todos callan cuando conviene". Perdiste un amigo y una voz a favor en los streams.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'La cláusula aspiradora', ctx: 'Firmaste de joven un contrato con una cláusula de rescisión millonaria y cesión de derechos de imagen. Un equipo grande te quiere fichar y la org pide una fortuna. El contrato te tiene de rehén.',
|
||
opts: [
|
||
{ t: 'Negociar la salida con tu org', d: { marca: 1.4 }, risk: 0.3,
|
||
pos: 'Negociaste un precio razonable: saliste con la bendición de la org y el equipo nuevo te recibió bien.',
|
||
neg: 'La org se plantó en la cláusula: te quedaste y el vestuario se enteró de que querías irte. El clima se pudrió.' },
|
||
{ t: 'Forzar la salida por la vía legal', d: { vision: 1.6 }, risk: 0.4,
|
||
pos: 'El abogado encontró un vicio en la firma: el contrato se declaró abusivo y saliste libre.',
|
||
neg: 'El caso se alargó y la cláusula se mantuvo: pagaste de tu bolsillo parte de la rescisión. Lección cara.' },
|
||
{ t: 'Quedarte y cumplir el contrato', d: { sinergia: 1.2 }, risk: 0.2,
|
||
pos: 'Cumpliste el contrato completo y te fuiste por la puerta grande: los equipos grandes te esperaron.',
|
||
neg: 'Pasaste un año siendo "el que se quería ir": la directiva te escondió y tu valor de mercado cayó.' },
|
||
]},
|
||
{ cat: 'preparacion', title: 'El coach de midlaner', ctx: 'La visa del import no llegó y la liga no posterga: tu equipo decide jugar con el coach de midlaner improvisado. Nadie quiere ser el que pierda la partida con un staff adentro.',
|
||
opts: [
|
||
{ t: 'Acompañar al coach y cubrir el caos', d: { sinergia: 1.6 }, risk: 0.25,
|
||
pos: 'Vos y el jungla jugaron alrededor del coach: el experimento funcionó y ganaron la serie de pura coordinación.',
|
||
neg: 'El coach se comió la lane: perdieron y el staff quedó en el centro de la burla del subreddit.' },
|
||
{ t: 'Exigir jugar vos en esa posición', d: { vision: 1.6 }, risk: 0.35,
|
||
pos: 'Te moviste de rol a último momento y la jugaste de memoria: ganaste la serie y demostraste flexibilidad.',
|
||
neg: 'La posición no era la tuya: perdiste la serie y cargaste con la culpa de algo que no era tu responsabilidad.' },
|
||
{ t: 'Denunciar la alineación irregular', d: { marca: 1.4 }, risk: 0.3,
|
||
pos: 'La liga intervino y postergó la serie: la org odió el escándalo, pero tu nombre quedó asociado a la justicia.',
|
||
neg: 'La liga no hizo nada y el equipo perdió igual: te quedaste afuera de la serie por "no remar el barco".' },
|
||
]},
|
||
{ cat: 'momento', title: 'El CM que te invita a comer Minecraft', ctx: 'Tu community manager te prometió beneficios del sponsor "en los próximos días". Cuando pedís detalles, te manda una captura de comida pixelada del juego. Es un meme, pero el equipo cree que es real.',
|
||
opts: [
|
||
{ t: 'Seguirle el chiste', d: { sinergia: 1.4 }, risk: 0.1,
|
||
pos: 'Te sumaste al meme: la comunidad se partió de risa y el clip se viralizó. El CM te agradeció para siempre.',
|
||
neg: 'La comunidad entendió el chiste, pero el sponsor no: "¿esto es lo que representa nuestra marca?". Pidieron disculpas.' },
|
||
{ t: 'Exigir los beneficios reales', d: { marca: 1.2 }, risk: 0.25,
|
||
pos: 'Apretaste al CM y llegaron los beneficios reales: la comida de verdad, el setup y la ropa prometida.',
|
||
neg: 'El CM se sintió enojado: "no tenés humor". Los beneficios llegaron, pero la relación con el staff se enfrió.' },
|
||
{ t: 'Denunciar el meme como falta de respeto', d: { vision: 1.2 }, risk: 0.35,
|
||
pos: 'La liga tomó el caso como ejemplo de condiciones laborales: el sponsor respondió con un comunicado y beneficios reales.',
|
||
neg: 'Te tildaron de "el que no tiene humor": la comunidad te agarró de punto y el CM renunció con un hilo en tu contra.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El VOD durante la pausa', ctx: 'Pausa técnica de más de cinco horas por un DDoS al rival. Tu top laner fue visto mirando el stream del propio partido en otra pantalla. La liga investiga si fue ventaja injusta.',
|
||
opts: [
|
||
{ t: 'Denunciarlo vos mismo antes de que lo hagan', d: { marca: 1.8 }, risk: 0.2,
|
||
pos: 'Lo confesaste antes de que se filtrara: la liga lo valoró y la sanción fue mínima. Tu reputación de honesto creció.',
|
||
neg: 'El top laner lo negó todo y la evidencia no alcanzó: te quedaste como el que "delató a su propio equipo".' },
|
||
{ t: 'Proteger al top laner y cubrirlo', d: { sinergia: 1.6 }, risk: 0.35,
|
||
pos: 'Lo cubriste en la investigación: no encontraron nada concluyente y la serie se rejugó. El equipo te lo debe.',
|
||
neg: 'La liga encontró los registros del stream: descalificaron al top laner y el equipo cargó con la etiqueta de tramposo.' },
|
||
{ t: 'Exigir que la liga aclare el reglamento', d: { vision: 1.4 }, risk: 0.3,
|
||
pos: 'Tu pedido público de claridad sobre qué se puede ver en las pausas cambió el reglamento: la comunidad te vio como referente.',
|
||
neg: 'La liga tomó tu pedido como obstrucción: "el que pide reglas, algo teme". Te revisaron las pantallas en cada pausa.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'La liga se queda sin equipos', ctx: 'Ocho organizaciones renunciaron en bloque a la liga por diferencias con los organizadores. La liga está al borde de desaparecer y a los equipos que quedan les toca rearmar el calendario.',
|
||
opts: [
|
||
{ t: 'Unirte al reclamo de los que se van', d: { marca: 1.4, sinergia: 0.6 }, risk: 0.35,
|
||
pos: 'Tu equipo se sumó a la renuncia masiva: la liga negoció, cedió en todo y la temporada se salvó con mejores condiciones.',
|
||
neg: 'La liga se murió igual: tu equipo quedó sin torneo y vos sin sueldo por un semestre.' },
|
||
{ t: 'Quedarte y aprovechar el vacío', d: { vision: 1.6 }, risk: 0.25,
|
||
pos: 'Con ocho equipos menos, tu equipo dominó el calendario: la liga se repuso y tu puesto se volvió central.',
|
||
neg: 'La liga se repuso pero con los equipos que se fueron negociando privilegios: vos quedaste en el molde.' },
|
||
{ t: 'Organizar una liga alternativa', d: { marca: 1.8, sinergia: 1.0 }, risk: 0.4,
|
||
pos: 'Vos y otros capitanes armaron un torneo paralelo: la liga oficial tuvo que llamarlos para que volvieran. Leyenda de la escena.',
|
||
neg: 'El torneo paralelo se cayó por falta de sponsors: perdiste plata, tiempo y la liga oficial te marcó como "rebelde".' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El dueño que debuta a los 43', ctx: 'El dueño de tu org —un tipo de 43 años, ex-CEO de varios equipos— anuncia que juega como jungla titular esta serie. Los rivales denuncian account sharing y el vestuario no sabe si reír o llorar.',
|
||
opts: [
|
||
{ t: 'Jugar alrededor del dueño', d: { sinergia: 1.4 }, risk: 0.3,
|
||
pos: 'Le armaste el juego alrededor y el experimento funcionó: el dueño quedó feliz, ganaron y la historia se contó como anécdota.',
|
||
neg: 'El dueño se comió la jungla rival: perdieron y la burla del subreddit duró semanas. "El dueño que juega" se volvió meme.' },
|
||
{ t: 'Pedir que juegue el jungla titular', d: { vision: 1.6 }, risk: 0.35,
|
||
pos: 'Tu reclamo interno se filtró: la liga intervino y el dueño dio un paso al costado. El vestuario te lo agradeció en silencio.',
|
||
neg: 'El dueño se enteró de tu reclamo: te tildó de "desleal" y tu lugar en el roster se enfrió hasta el final del contrato.' },
|
||
{ t: 'Denunciar el account sharing', d: { marca: 1.6 }, risk: 0.25,
|
||
pos: 'La liga abrió investigación: verificaron identidad con cámara y pasaporte, y permitieron seguir. Quedaste como el que defiende las reglas.',
|
||
neg: 'La investigación no encontró nada y el dueño se victimizó: "me persiguen por ser dueño". Te quedó la fama de soplón.' },
|
||
]},
|
||
{ cat: 'preparacion', title: 'El cambio de organizador', ctx: 'La liga cambia de manos: la empresa que la organizaba le transfiere los derechos a otra. Nadie sabe qué pasa con el calendario, los playoffs ni los premios acumulados.',
|
||
opts: [
|
||
{ t: 'Adaptarte rápido y ver qué viene', d: { vision: 1.6 }, risk: 0.25,
|
||
pos: 'El organizador nuevo armó un calendario prolijo y vos arrancaste fuerte: la transición te encontró enfocado.',
|
||
neg: 'El organizador nuevo tardó meses en definir todo: jugaste a ciegas y el split se sintió como una eternidad.' },
|
||
{ t: 'Reclamar garantías por los premios viejos', d: { marca: 1.4 }, risk: 0.3,
|
||
pos: 'Tu reclamo por los premios del organizador anterior se escuchó: el nuevo asumió las deudas y te vio como líder.',
|
||
neg: 'El organizador anterior desapareció con la plata: tu reclamo quedó en la nada y perdiste tiempo de preparación.' },
|
||
{ t: 'Aprovechar el caos para negociar', d: { sinergia: 1.2 }, risk: 0.35,
|
||
pos: 'Con el cambio de manos, renegociaste tu contrato con condiciones mejores: el nuevo organizador quiso empezar con buen pie.',
|
||
neg: 'La renegociación te distrajo del juego: arrancaste el split desenfocado y el contrato nuevo no era tan bueno como el viejo.' },
|
||
]},
|
||
{ cat: 'escandalo', title: 'El CEO que amenaza', ctx: 'El CEO de tu org le dejó mensajes amenazantes a un jugador rival por una deuda de pagos: "te haré daño, no sabés con quién te metiste". El chat se filtró y la liga abrió investigación.',
|
||
opts: [
|
||
{ t: 'Desmarcarte del CEO', d: { marca: 1.6 }, risk: 0.2,
|
||
pos: 'Saliste a aclarar que el plantel repudia las amenazas: la liga sancionó al CEO y tu imagen quedó limpia.',
|
||
neg: 'El CEO te vio como traidor: "el que tira la piedra y esconde la mano". El vestuario se dividió entre los que lo bancan y los que no.' },
|
||
{ t: 'Mediar entre el CEO y el jugador', d: { sinergia: 1.6 }, risk: 0.25,
|
||
pos: 'Tus gestiones apagaron el conflicto: el jugador retiró la denuncia, el CEO pagó la deuda y la liga cerró el caso.',
|
||
neg: 'La mediación falló y te salpicó: el CEO te acusó de "ponerte del lado del enemigo" y el jugador de "lavarte las manos".' },
|
||
{ t: 'Declarar en la investigación', d: { vision: 1.4 }, risk: 0.3,
|
||
pos: 'Tu testimonio fue clave: la liga sancionó al CEO con multa y suspensión. La comunidad te vio como el jugador con valores.',
|
||
neg: 'El CEO quedó sancionado pero te la juró: te hicieron la vida imposible hasta el final de tu contrato.' },
|
||
]},
|
||
];
|
||
/* ---------- COMPETENCIAS INTERNACIONALES ---------- */
|
||
const COMPETITIONS = {
|
||
'First Stand': { split: 2, ic: '⚡', flavor: 'El nuevo torneo internacional que abre el año, con los campeones de cada región.' },
|
||
'MSI': { split: 4, ic: '🌍', flavor: 'Mid-Season Invitational: los mejores de cada liga a mitad de temporada.' },
|
||
'EWC': { split: 6, ic: '🏜️', flavor: 'Esports World Cup: el torneo de clubes en Arabia Saudita, con premio millonario.' },
|
||
'Asian Games': { split: 8, ic: '🏅', flavor: 'Juegos Asiáticos: tu selección nacional representa a la región.' },
|
||
'Worlds': { split: 'last', ic: '🏆', flavor: 'El Campeonato Mundial: el torneo más grande del año, el que todos quieren ganar.' },
|
||
};
|
||
function compForSplit(s){
|
||
if (s === 2) return 'First Stand';
|
||
if (s === 4) return 'MSI';
|
||
if (s === 6) return 'EWC';
|
||
if (s === 8) return 'Asian Games';
|
||
if (s === G.totalSplits && G.totalSplits >= 9) return 'Worlds';
|
||
return null;
|
||
}
|
||
|
||
/* ============ ESTADO DE PARTIDA ============ */
|
||
let G = null;
|
||
|
||
function newGame(teamId){
|
||
const t = teamById(teamId);
|
||
G = {
|
||
nick: UI.nick || 'Anónimo', num: UI.num, hand: UI.hand, region: UI.region, role: UI.role,
|
||
teamId: t.id, div: t.div,
|
||
stats: { mecanica: rnd(42, 58), vision: rnd(42, 58), farmeo: rnd(42, 58), sinergia: rnd(42, 58), marca: rnd(40, 54) },
|
||
split: 0, totalSplits: rnd(10, 12),
|
||
kills: 0, assists: 0, deaths: 0, games: 0, penta: 0,
|
||
value: 120000, maxValue: 120000, salary: 8000, ratingMax: 0,
|
||
teamTitles: [], indTitles: [], intl: [],
|
||
teams: [], events: [], history: [],
|
||
regSelect: { games: 0, kills: 0, ast: 0, apps: 0 },
|
||
streamCount: 0,
|
||
retired: false, retiring: false, finalRating: 0,
|
||
};
|
||
G.teams.push({ id: t.id, name: t.name, div: t.div, from: 1, to: G.totalSplits, games: 0, kills: 0, ast: 0 });
|
||
G.ratingMax = rating();
|
||
}
|
||
|
||
function rnd(a, b){ return a + Math.floor(Math.random() * (b - a + 1)); }
|
||
function pick(arr){ return arr[Math.floor(Math.random() * arr.length)]; }
|
||
function clamp(v, a, b){ return Math.max(a, Math.min(b, v)); }
|
||
function shuffle(arr){ const a = arr.slice(); for (let i = a.length - 1; i > 0; i--){ const j = Math.floor(Math.random() * (i + 1)); [a[i], a[j]] = [a[j], a[i]]; } return a; }
|
||
function statNames(){ return [['mecanica','Mecánica'],['vision','Visión'],['farmeo','Farmeo'],['sinergia','Sinergia'],['marca','Marca']]; }
|
||
function rating(){
|
||
const s = G.stats;
|
||
const w = { mecanica: 1.15, vision: 0.95, farmeo: 1.05, sinergia: 1.0, marca: 0.85 };
|
||
const t = statNames().reduce((acc, [k]) => acc + s[k] * w[k], 0);
|
||
const tw = Object.values(w).reduce((a, b) => a + b, 0);
|
||
return clamp(Math.round(t / tw), 40, 99);
|
||
}
|
||
function updateRatingMax(){ if (rating() > G.ratingMax) G.ratingMax = rating(); }
|
||
function marketValue(){
|
||
const r = rating();
|
||
const v = 50000 * Math.pow(10, (r - 40) * 0.055);
|
||
const bonus = 1 + G.indTitles.length * 0.18 + G.teamTitles.length * 0.05;
|
||
return Math.round(v * bonus / 10000) * 10000;
|
||
}
|
||
function ageNow(){ return 17 + Math.floor((G.split - 1) / 2); }
|
||
function fmtMoney(v){ return v >= 1000000 ? '$' + (v / 1000000).toFixed(2) + 'M' : '$' + Math.round(v / 1000) + 'k'; }
|
||
|
||
/* ============ UI helpers ============ */
|
||
const UI = { nick: '', num: 13, hand: 'diestro', region: null, role: null };
|
||
const $ = id => document.getElementById(id);
|
||
function showScreen(id){
|
||
document.querySelectorAll('.screen').forEach(s => s.classList.remove('active'));
|
||
$(id).classList.add('active');
|
||
window.scrollTo({ top: 0 });
|
||
}
|
||
function esc(s){ return String(s).replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); }
|
||
function fallbackBadge(id, size){
|
||
const t = teamById(id);
|
||
const inits = t ? t.name.split(/[^A-Za-z]+/).filter(Boolean).slice(0,2).map(w=>w[0].toUpperCase()).join('') : '?';
|
||
return `<span class="fallback" style="width:${size}px;height:${size}px">${esc(inits)}</span>`;
|
||
}
|
||
function splitClass(s){
|
||
const total = G.totalSplits;
|
||
const ratio = s / total;
|
||
if (ratio <= 0.35) return 'early';
|
||
if (ratio <= 0.7) return 'mid';
|
||
return 'late';
|
||
}
|
||
|
||
/* ---- landing ---- */
|
||
function buildLanding(){
|
||
const strip = $('stripLogos');
|
||
const ids = ['T1','GenG','G2','Fnatic','TL','C9','JDG','BLG','paiN','LOUD','GAM','Karmine'];
|
||
strip.innerHTML = ids.map(id => {
|
||
const f = logoFile(id);
|
||
return f ? `<img src="${f}" alt="${teamById(id).name}" loading="lazy" onerror="this.outerHTML=fallbackBadge('${id}',40)">` : fallbackBadge(id, 40);
|
||
}).join('');
|
||
const best = loadHall();
|
||
$('hall').style.display = '';
|
||
$('hallBody').innerHTML = best.length
|
||
? '<ol>' + best.map((b, i) => `<li><span class="medal">${i + 1}</span><span>${esc(b.nick)}</span><span class="rval">${b.rating} / ${fmtMoney(b.value)}</span></li>`).join('') + '</ol>'
|
||
: '<div class="empty">Todavía no hay leyendas. Sé la primera.</div>';
|
||
}
|
||
|
||
/* ---- create ---- */
|
||
function buildCreate(){
|
||
$('regionGrid').innerHTML = Object.entries(REGIONS).map(([k, r]) =>
|
||
`<button class="region-card" data-r="${k}"><h3>${r.flag} ${r.name}</h3><p>${esc(r.flavor)}</p></button>`).join('');
|
||
$('regionGrid').querySelectorAll('.region-card').forEach(b => b.addEventListener('click', () => {
|
||
$('regionGrid').querySelectorAll('.region-card').forEach(x => x.classList.remove('on'));
|
||
b.classList.add('on'); UI.region = b.dataset.r;
|
||
}));
|
||
$('roleGrid').innerHTML = Object.entries(ROLES).map(([k, r]) =>
|
||
`<button class="role-card" data-r="${k}"><div class="em">${r.em}</div><div class="nm">${k}</div><div class="st">${esc(r.fl)}</div></button>`).join('');
|
||
$('roleGrid').querySelectorAll('.role-card').forEach(b => b.addEventListener('click', () => {
|
||
$('roleGrid').querySelectorAll('.role-card').forEach(x => x.classList.remove('on'));
|
||
b.classList.add('on'); UI.role = b.dataset.r;
|
||
}));
|
||
$('segHand').querySelectorAll('.opt').forEach(b => b.addEventListener('click', () => {
|
||
$('segHand').querySelectorAll('.opt').forEach(x => x.classList.remove('on'));
|
||
b.classList.add('on'); UI.hand = b.dataset.v;
|
||
}));
|
||
$('segHand').querySelector('.opt[data-v="diestro"]').classList.add('on');
|
||
$('inpNick').addEventListener('input', e => UI.nick = e.target.value.trim());
|
||
$('inpNum').addEventListener('input', e => UI.num = clamp(parseInt(e.target.value) || 0, 0, 99));
|
||
}
|
||
|
||
/* ============ FLUJO PRINCIPAL ============ */
|
||
function boot(){
|
||
buildLanding();
|
||
buildCreate();
|
||
$('btnStart').addEventListener('click', () => showScreen('create'));
|
||
$('btnBegin').addEventListener('click', () => {
|
||
if (!UI.region){ toast('Elegí tu región primero 👆'); return; }
|
||
if (!UI.role){ toast('Elegí tu rol 👆'); return; }
|
||
if (!UI.nick) UI.nick = 'xX' + ['Feeder','God','Tilter','Smurf','Rata','Pro'][Math.floor(Math.random() * 6)] + 'Xx';
|
||
startAcademy();
|
||
});
|
||
$('btnExport').addEventListener('click', exportImage);
|
||
$('btnAgain').addEventListener('click', () => showScreen('create'));
|
||
$('inpNick').addEventListener('keydown', e => { if (e.key === 'Enter') $('btnBegin').click(); });
|
||
}
|
||
document.addEventListener('DOMContentLoaded', boot);
|
||
|
||
/* Oferta de academia */
|
||
function startAcademy(){
|
||
const pool = shuffle(TEAMS[UI.region]);
|
||
const offers = pool.slice(0, 3);
|
||
const card = $('resultCard');
|
||
card.className = 'result-card';
|
||
card.innerHTML = `
|
||
<div class="verdict great">FICHÁSTE</div>
|
||
<p class="rtext">Tu trial en el server dio que hablar. <b>${offers.length} organizaciones</b> de tu liga te llamaron por el traspaso. Elegí tu destino:</p>
|
||
<div class="opt-grid" style="margin:14px 0">
|
||
${offers.map((t, i) => `
|
||
<button class="opt-card" data-team="${t.id}">
|
||
<span class="oc-label">Oferta ${['A','B','C'][i]}</span>
|
||
${logoImg(t.id, 64, 'oc-emblem')}
|
||
<span class="oc-title">${esc(t.name)}</span>
|
||
<span class="oc-tag">${t.div === 1 ? 'PRIMERA división' : 'SEGUNDA división'}</span>
|
||
</button>`).join('')}
|
||
</div>`;
|
||
$('resultOverlay').classList.add('show');
|
||
card.querySelectorAll('.opt-card').forEach(b => b.addEventListener('click', () => {
|
||
$('resultOverlay').classList.remove('show');
|
||
newGame(b.dataset.team);
|
||
showScreen('career');
|
||
nextSplit();
|
||
}));
|
||
}
|
||
/* ============ RENDER CAREER (Screen A) ============ */
|
||
function renderPlayerCard(){
|
||
const t = teamById(G.teamId);
|
||
const reg = REGIONS[G.region];
|
||
const v = G.value >= 1000000 ? '$' + (G.value / 1000000).toFixed(2) + 'M' : '$' + Math.round(G.value / 1000) + 'k';
|
||
$('playerCard').innerHTML = `
|
||
<div class="elo-badge"><span class="lbl">ELO</span><span class="num">${rating()}</span></div>
|
||
<div class="player-meta">
|
||
<div class="meta-top">
|
||
<span class="badge badge-region">${reg.flag} ${reg.code}</span>
|
||
<span class="badge badge-role">#${G.num} ${G.role}</span>
|
||
<span class="right"><span>SPLIT ${G.split}</span><span>· ${ageNow()} años</span></span>
|
||
</div>
|
||
<div class="org-line">${logoImg(G.teamId, 30)}<span class="org-name">${esc(t.name)}</span></div>
|
||
<div class="value-line">VALOR <b>${v}</b></div>
|
||
</div>`;
|
||
}
|
||
function renderStatsRow3(){
|
||
const kA = G.kills + G.assists;
|
||
$('statsRow3').innerHTML = `
|
||
<div class="stat3"><div class="ic">⚡</div><div class="stat-num">${G.games}</div><div class="stat-lbl">Partidas</div></div>
|
||
<div class="stat3"><div class="ic">🗡️</div><div class="stat-num">${kA}</div><div class="stat-lbl">Kills+Assist</div></div>
|
||
<div class="stat3"><div class="ic">💥</div><div class="stat-num">${G.penta}</div><div class="stat-lbl">Pentakills</div></div>`;
|
||
}
|
||
function renderAchievements(){
|
||
const ach = G.teamTitles.concat(G.indTitles);
|
||
if (ach.length){
|
||
$('achievementsBox').innerHTML = `<div class="ach-list">${ach.map(a => `<span class="ach-chip">${a.ic} ${esc(a.name)}</span>`).join('')}</div>`;
|
||
} else {
|
||
$('achievementsBox').innerHTML = `<div class="ach-trophy">🏆</div><div class="empty-ach">Sin logros aún</div>`;
|
||
}
|
||
}
|
||
function renderTimeline(){
|
||
const box = $('timelineBox');
|
||
const total = G.totalSplits;
|
||
let rows = '';
|
||
/* header */
|
||
rows = `<div class="tl-head"><span class="c-idx">SPLIT</span><span class="c-org">ORG</span><span class="c-elo">ELO</span><span class="c-num">GAM</span><span class="c-num">KIL</span><span class="c-num">AST</span></div>`;
|
||
let prevOrg = null;
|
||
for (let s = 1; s <= total; s++){
|
||
const h = G.history.find(x => x.split === s);
|
||
if (h){
|
||
const arr = (prevOrg && h.org !== prevOrg) ? '<span class="c-arr">↳</span>' : '';
|
||
rows += `<div class="tl-row">
|
||
<span class="c-idx"><span class="split-badge ${splitClass(s)}">${s}</span>${arr}</span>
|
||
<span class="c-org">${logoImg(h.org, 22)}<span class="em">${esc(h.orgName)}</span></span>
|
||
<span class="c-elo">${h.elo}</span>
|
||
<span class="c-num">${h.games}</span><span class="c-num">${h.kills}</span><span class="c-num">${h.ast}</span>
|
||
</div>`;
|
||
prevOrg = h.org;
|
||
} else if (s === G.split){
|
||
rows += `<div class="tl-row active">
|
||
<span class="c-idx"><span class="split-badge ${splitClass(s)}">${s}</span></span>
|
||
<span class="c-org">${logoImg(G.teamId, 22)}<span class="em">Eligiendo org...</span></span>
|
||
<span class="c-elo">${rating()}</span>
|
||
<span class="c-num" style="color:var(--text-muted)">—</span><span class="c-num" style="color:var(--text-muted)">—</span><span class="c-num" style="color:var(--text-muted)">—</span>
|
||
</div>`;
|
||
} else {
|
||
rows += `<div class="tl-row future">
|
||
<span class="c-idx"><span class="split-badge ${splitClass(s)}">${s}</span></span>
|
||
<span class="c-org"><span class="em">—</span></span>
|
||
<span class="c-elo"></span><span class="c-num"></span><span class="c-num"></span><span class="c-num"></span>
|
||
</div>`;
|
||
}
|
||
}
|
||
/* final row: selección regional */
|
||
const rs = G.regSelect;
|
||
rows += `<div class="tl-final">
|
||
<span class="f-flag">${REGIONS[G.region].flag}</span>
|
||
<span class="f-name">Selección Regional</span>
|
||
<span class="c-num">${rs.games}</span><span class="c-num">${rs.kills}</span><span class="c-num">${rs.ast}</span>
|
||
</div>`;
|
||
box.innerHTML = `<div class="tl-collapse" id="tlToggle">Carrera <span>▾</span></div><div class="tl-body" id="tlBody">${rows}</div>`;
|
||
const isMobile = window.innerWidth < 768;
|
||
const body = $('tlBody');
|
||
if (isMobile) body.classList.add('closed');
|
||
const tgl = $('tlToggle');
|
||
if (tgl){
|
||
if (isMobile) tgl.querySelector('span').textContent = '▸';
|
||
tgl.addEventListener('click', () => {
|
||
body.classList.toggle('closed');
|
||
tgl.querySelector('span').textContent = body.classList.contains('closed') ? '▸' : '▾';
|
||
});
|
||
}
|
||
}
|
||
function renderCareer(){
|
||
renderPlayerCard();
|
||
renderStatsRow3();
|
||
renderAchievements();
|
||
renderTimeline();
|
||
}
|
||
function nextSplit(){
|
||
G.split++;
|
||
const ev = nextEvent();
|
||
renderCareer();
|
||
renderDecision(ev);
|
||
}
|
||
|
||
/* ============ EVENTOS / DECISIONES ============ */
|
||
function nextEvent(){
|
||
const s = G.split;
|
||
/* competición internacional — SOLO equipos de primera división */
|
||
const comp = compForSplit(s);
|
||
if (comp){
|
||
if (G.div === 1) return intlEvent(comp);
|
||
/* equipo de 2da: no puede ir a internacional */
|
||
}
|
||
/* descenso por rating bajo */
|
||
if (G.div === 1 && rating() < 47) return demotionEvent();
|
||
/* ascenso desde segunda */
|
||
if (G.div === 2 && rating() >= 55) return promotionEvent();
|
||
/* oferta de fichaje — NO en primeros splits, y mucho menos frecuente */
|
||
if (s >= 4 && rating() >= REGIONS[G.region].threshold - 4 && Math.random() < 0.22) return transferEvent();
|
||
/* decisión random */
|
||
const ev = pick(EVENTS.filter(e => e.cat !== 'salud'));
|
||
return { kind: 'decision', ev };
|
||
}
|
||
|
||
function intlEvent(name){
|
||
const p = clamp((rating() - 36) / 60, 0.1, 0.95);
|
||
return { kind: 'intl', name, p, rolls: [p, p * 0.95, p * 0.9, p * 0.8] };
|
||
}
|
||
|
||
function transferEvent(){
|
||
const current = G.teamId;
|
||
const offers = [];
|
||
const pool = [];
|
||
Object.entries(TEAMS).forEach(([rg, ts]) => {
|
||
if (rg === G.region) ts.forEach(t => { if (t.id !== current) pool.push({ ...t, rg, delta: 0 }); });
|
||
else ts.forEach(t => {
|
||
if (t.div === 1 && rating() >= REGIONS[rg].threshold - 6) pool.push({ ...t, rg, delta: 1 });
|
||
});
|
||
});
|
||
if (!pool.length) return transferEvent2();
|
||
const n = Math.min(3, pool.length);
|
||
for (let i = 0; i < n; i++) offers.push(pool.splice(Math.floor(Math.random() * pool.length), 1)[0]);
|
||
return { kind: 'transfer', offers };
|
||
}
|
||
function transferEvent2(){
|
||
const ts = TEAMS[G.region].filter(t => t.id !== G.teamId);
|
||
const offers = [];
|
||
for (let i = 0; i < Math.min(2, ts.length); i++) offers.push(ts.splice(Math.floor(Math.random() * ts.length), 1)[0]);
|
||
return { kind: 'transfer', offers };
|
||
}
|
||
function promotionEvent(){
|
||
const pool = TEAMS[G.region].filter(t => t.div === 1);
|
||
return { kind: 'promotion', team: pick(pool) };
|
||
}
|
||
function demotionEvent(){ return { kind: 'demotion' }; }
|
||
function renderDecision(ev){
|
||
const box = $('decisionBox');
|
||
if (ev.kind === 'decision'){
|
||
const cat = CATS[ev.ev.cat];
|
||
const ctx = ev.ev.ctx.replace(/\{year\}/g, 2024 + Math.floor((G.split - 1) / 2)).replace(/\{split\}/g, G.split);
|
||
box.innerHTML = `
|
||
<div class="dc-cat">${cat.icon} ${cat.name} · Split ${G.split}</div>
|
||
<h2>${esc(ev.ev.title)}</h2>
|
||
<p class="dc-ctx">${esc(ctx)}</p>
|
||
<div class="opt-grid">
|
||
${ev.ev.opts.map((o, i) => {
|
||
const okPct = Math.round((1 - o.risk) * 100);
|
||
const failPct = Math.round(o.risk * 100);
|
||
return `<button class="opt-card" data-i="${i}">
|
||
<span class="oc-label">Opción ${['A','B','C','D'][i]}</span>
|
||
<span class="oc-title">${esc(o.t)}</span>
|
||
<span class="oc-desc">${esc(o.pos.slice(0, 60))}…</span>
|
||
<span class="oc-pills"><span class="pill success">${okPct}%</span><span class="pill danger">${failPct}%</span></span>
|
||
</button>`;
|
||
}).join('')}
|
||
${G.split >= 6 ? `<button class="opt-card wide" data-i="retire"><span class="oc-title">Retirarme y abrir un canal de streaming</span><span class="oc-desc">A los ${ageNow()} años sos veterano. Dijeron que se podía.</span></button>` : ''}
|
||
</div>`;
|
||
box.querySelectorAll('.opt-card').forEach(b => b.addEventListener('click', () => {
|
||
if (b.dataset.i === 'retire'){ G.retired = true; G.retiring = true; doSplitEnd(null); return; }
|
||
const res = resolveDecision(ev.ev, parseInt(b.dataset.i, 10));
|
||
showResult(res);
|
||
}));
|
||
} else if (ev.kind === 'transfer'){
|
||
renderTransfer(ev);
|
||
} else if (ev.kind === 'promotion'){
|
||
renderPromotion(ev);
|
||
} else if (ev.kind === 'demotion'){
|
||
renderDemotion(ev);
|
||
} else if (ev.kind === 'intl'){
|
||
renderIntl(ev);
|
||
}
|
||
}
|
||
|
||
function renderTransfer(ev){
|
||
const box = $('decisionBox');
|
||
box.innerHTML = `
|
||
<div class="dc-cat">🤝 Fichaje · Split ${G.split}</div>
|
||
<h2>Llamadas del agente</h2>
|
||
<p class="dc-ctx">Tu nivel ya da que hablar. Hay ${ev.offers.length} ofertas sobre la mesa y tu agente no para de mandarte mensajes con el emoji del cohete.</p>
|
||
<div class="opt-grid">
|
||
${ev.offers.map((o, i) => `
|
||
<button class="opt-card" data-i="${i}">
|
||
<span class="oc-label">Oferta ${['A','B','C'][i]}</span>
|
||
${logoImg(o.id, 64, 'oc-emblem')}
|
||
<span class="oc-title">${esc(o.name)}</span>
|
||
<span class="oc-tag">${o.rg} · ${o.div === 1 ? 'Primera' : 'Segunda'}</span>
|
||
</button>`).join('')}
|
||
<button class="opt-card wide" data-i="stay"><span class="oc-title">Quedarme donde estoy</span><span class="oc-desc">La continuidad también vale. El equipo confía en vos.</span></button>
|
||
</div>`;
|
||
box.querySelectorAll('.opt-card').forEach(b => b.addEventListener('click', () => {
|
||
const i = b.dataset.i;
|
||
let res;
|
||
if (i === 'stay'){
|
||
G.stats.sinergia = round1(clamp(G.stats.sinergia + 1.6, 20, 99));
|
||
G.stats.marca = round1(clamp(G.stats.marca + 0.6, 20, 99));
|
||
res = { kind: 'transferStay', ok: true, deltas: [{ k: 'sinergia', v: 1.6 }, { k: 'marca', v: 0.6 }], text: 'Te quedaste y la directiva lo valoró: confianza total en el proyecto. Los que se van vuelven a preguntarse si hicieron bien.' };
|
||
} else {
|
||
const off = ev.offers[parseInt(i, 10)];
|
||
const accepted = Math.random() >= (off.rg !== G.region && off.div === 1 ? 0.25 : 0.1);
|
||
if (accepted){
|
||
moveTeam(off.id, 'transfer');
|
||
G.stats.sinergia = round1(clamp(G.stats.sinergia - 1.5, 20, 99));
|
||
G.stats.marca = round1(clamp(G.stats.marca + 1.8, 20, 99));
|
||
res = { kind: 'transferMove', ok: true, delta: 'marca', deltaV: 1.8, text: `Firmaste por ${off.name}. Nuevo equipo, nuevos compas, nueva etapa. ${off.rg !== G.region ? 'Cruzás de región: todo es distinto y tu juego se renueva.' : 'La casa se cambia pero el sueño sigue igual.'}` };
|
||
} else {
|
||
G.stats.marca = round1(clamp(G.stats.marca - 1.5, 20, 99));
|
||
res = { kind: 'transferFail', ok: false, deltas: [{ k: 'marca', v: -1.5 }], text: `${off.name} te dejó esperando: al final ficharon a otro. Tu agente dice que "no era el momento".` };
|
||
}
|
||
}
|
||
showResult(res);
|
||
}));
|
||
}
|
||
|
||
function renderPromotion(ev){
|
||
const box = $('decisionBox');
|
||
box.innerHTML = `
|
||
<div class="dc-cat">🚀 Ascenso · Split ${G.split}</div>
|
||
<h2>Te llaman de ${esc(ev.team.name)}</h2>
|
||
<p class="dc-ctx">El equipo de primera de la región te quiere. Pasaste de ser una promesa a ser EL producto. Tu agente ya habla de cláusulas.</p>
|
||
<div class="opt-grid">
|
||
<button class="opt-card" data-i="go">
|
||
<span class="oc-label">Saltar a Primera</span>
|
||
${logoImg(ev.team.id, 64, 'oc-emblem')}
|
||
<span class="oc-title">${esc(ev.team.name)}</span>
|
||
<span class="oc-tag">${REGIONS[G.region].name} · Primera</span>
|
||
</button>
|
||
<button class="opt-card wide" data-i="stay"><span class="oc-title">Quedarme y liderar el ascenso</span><span class="oc-desc">Ser el rey de un reino chico también es un camino.</span></button>
|
||
</div>`;
|
||
box.querySelectorAll('.opt-card').forEach(b => b.addEventListener('click', () => {
|
||
let res;
|
||
if (b.dataset.i === 'go'){
|
||
moveTeam(ev.team.id, 'promotion');
|
||
G.stats.sinergia = round1(clamp(G.stats.sinergia + 1.8, 20, 99));
|
||
G.stats.marca = round1(clamp(G.stats.marca + 1.5, 20, 99));
|
||
res = { kind: 'promotionGo', ok: true, deltas: [{ k: 'sinergia', v: 1.8 }, { k: 'marca', v: 1.5 }], text: `Bienvenido a la Primera, ${G.nick}. ${ev.team.name} pagó el pase y el público ya corea tu nombre en la presentación.` };
|
||
} else {
|
||
G.stats.marca = round1(clamp(G.stats.marca + 1.6, 20, 99));
|
||
G.stats.sinergia = round1(clamp(G.stats.sinergia + 1.4, 20, 99));
|
||
res = { kind: 'promotionStay', ok: true, deltas: [{ k: 'marca', v: 1.6 }, { k: 'sinergia', v: 1.4 }], text: 'Te quedaste y llevaste al equipo al título de la segunda división. Los hinchas te quieren como a un ídolo de verdad.' };
|
||
}
|
||
showResult(res);
|
||
}));
|
||
}
|
||
|
||
function renderDemotion(ev){
|
||
const box = $('decisionBox');
|
||
const acad = TEAMS[G.region].filter(t => t.div === 2);
|
||
const target = acad.length ? pick(acad) : null;
|
||
box.innerHTML = `
|
||
<div class="dc-cat">📉 Crisis · Split ${G.split}</div>
|
||
<h2>El equipo no rinde y los dedos apuntan a vos</h2>
|
||
<p class="dc-ctx">Resultados malos, confianza baja, y la directiva ya habla de "reestructuración". Tu puesto en el plantel pende de un hilo.</p>
|
||
<div class="opt-grid">
|
||
<button class="opt-card" data-i="fight"><span class="oc-title">Pelearla en los scrims</span><span class="oc-desc">Responder con juego. La presión te pone en modo bestia.</span></button>
|
||
${target ? `<button class="opt-card" data-i="accept"><span class="oc-title">Préstamo a ${esc(target.name)}</span><span class="oc-desc">Bajar a segunda para recuperar confianza.</span></button>` : ''}
|
||
<button class="opt-card" data-i="leave"><span class="oc-title">Pedir la cláusula</span><span class="oc-desc">Si acá no te valoran, en otro lado sí.</span></button>
|
||
</div>`;
|
||
box.querySelectorAll('.opt-card').forEach(b => b.addEventListener('click', () => {
|
||
const i = b.dataset.i;
|
||
let res;
|
||
if (i === 'fight'){
|
||
const ok = Math.random() >= 0.35;
|
||
if (ok){
|
||
G.stats.mecanica = round1(clamp(G.stats.mecanica + 2, 20, 99));
|
||
G.stats.marca = round1(clamp(G.stats.marca + 1.5, 20, 99));
|
||
res = { kind: 'demFight', ok: true, deltas: [{ k: 'mecanica', v: 2 }, { k: 'marca', v: 1.5 }], text: 'La peleaste a puro huevo: dos semanas después sos titular indiscutido y el equipo levantó. La crisis te hizo más fuerte.' };
|
||
} else {
|
||
G.stats.marca = round1(clamp(G.stats.marca - 2, 20, 99));
|
||
res = { kind: 'demFight', ok: false, deltas: [{ k: 'marca', v: -2 }], text: 'Los scrims no te salieron y la directiva perdió la paciencia. Te bajan a la banca y el mensaje es claro: rendí o andá.' };
|
||
}
|
||
} else if (i === 'accept' && target){
|
||
moveTeam(target.id, 'demotion');
|
||
res = { kind: 'demLoan', ok: true, text: `Préstamo a ${target.name}: arrancaste de cero en segunda. Duelen el orgullo y el sueldo, pero el reset te recompuso la cabeza.` };
|
||
} else {
|
||
const ok = Math.random() >= 0.3;
|
||
if (ok){
|
||
const other = TEAMS[G.region].filter(t => t.id !== G.teamId);
|
||
const nt = other.length ? pick(other) : null;
|
||
if (nt){ moveTeam(nt.id, 'transfer'); res = { kind: 'demLeave', ok: true, text: `La cláusula se activó y fichaste por ${nt.name}. Cambio de aire, nueva chance, misma hambre.` }; }
|
||
else res = { kind: 'demLeave', ok: true, text: 'Saliste libre y negociaste: nuevo contrato, mismo sueño. A veces hay que irse para crecer.' };
|
||
} else {
|
||
res = { kind: 'demLeave', ok: false, text: 'Nadie pagó la cláusula. Te quedaste, pero la relación con la directiva quedó fría como el Meta de los últimos años.' };
|
||
}
|
||
}
|
||
showResult(res);
|
||
}));
|
||
}
|
||
|
||
function renderIntl(ev){
|
||
const box = $('decisionBox');
|
||
const comp = COMPETITIONS[ev.name];
|
||
const isWorlds = ev.name === 'Worlds';
|
||
box.innerHTML = `
|
||
<div class="dc-cat">${comp.ic} ${ev.name} · Split ${G.split}</div>
|
||
<h2>${isWorlds ? 'El torneo más grande del año' : ev.name}</h2>
|
||
<p class="dc-ctx">${esc(comp.flavor)} Tu equipo terminó ${ev.p >= 0.6 ? 'entre los mejores de la región' : 'con chances matemáticas'} y hay cupo para ${ev.name}.</p>
|
||
<div class="opt-grid">
|
||
<button class="opt-card" data-i="go"><span class="oc-title">Ir y darlo todo</span><span class="oc-desc">El escenario más grande. Tu momento.</span></button>
|
||
<button class="opt-card" data-i="focus"><span class="oc-title">Poner el foco en el split local</span><span class="oc-desc">Priorizar lo seguro: el título regional también vale.</span></button>
|
||
</div>`;
|
||
box.querySelectorAll('.opt-card').forEach(b => b.addEventListener('click', () => {
|
||
if (b.dataset.i === 'focus'){
|
||
G.stats.sinergia = round1(clamp(G.stats.sinergia + 1.5, 20, 99));
|
||
showResult({ kind: 'intlSkip', ok: true, deltas: [{ k: 'sinergia', v: 1.5 }], text: `Dejaste pasar ${ev.name} y apostaste al split local. El equipo llegó entero y peleó el título regional.` });
|
||
return;
|
||
}
|
||
runIntl(ev);
|
||
}));
|
||
}
|
||
|
||
function runIntl(ev){
|
||
const isWorlds = ev.name === 'Worlds';
|
||
const q = ev.p >= 0.35 ? 1 : (Math.random() >= 0.35 ? 1 : 0);
|
||
if (!q){
|
||
G.stats.marca = round1(clamp(G.stats.marca - 1.5, 20, 99));
|
||
G.stats.sinergia = round1(clamp(G.stats.sinergia - 1, 20, 99));
|
||
showResult({ kind: 'intlFail', ok: false, deltas: [{ k: 'marca', v: -1.5 }, { k: 'sinergia', v: -1 }], text: `${ev.name}: el equipo no clasificó en la última fecha. Viste la final en el sillón de la sala, con la bronca adentro. La región entera se acordó de tu lineup.` });
|
||
return;
|
||
}
|
||
/* participa en la competencia: suma desempeño a la selección regional */
|
||
const p = ev.p;
|
||
const r = rating();
|
||
const role = ROLES[G.role];
|
||
const games = Math.round(8 + p * 10);
|
||
const factor = (r / 60) * (games / 12) * (0.9 + Math.random() * 0.25);
|
||
const kills = Math.round(role.kill * factor * 0.8);
|
||
const ast = Math.round(role.ast * factor * 0.8);
|
||
G.regSelect.apps++;
|
||
G.regSelect.games += games;
|
||
G.regSelect.kills += kills;
|
||
G.regSelect.ast += ast;
|
||
const stageNames = ['la fase de grupos', 'cuartos de final', 'la semifinal', 'la final'];
|
||
let stage = -1;
|
||
let win = true;
|
||
for (let i = 0; i < 4; i++){
|
||
const chance = Math.max(0, ev.rolls[i]);
|
||
if (Math.random() < chance) continue;
|
||
win = false; stage = i; break;
|
||
}
|
||
const name = ev.name;
|
||
if (!win){
|
||
if (stage === 3){
|
||
G.intl.push({ name, result: 'subcampeón' });
|
||
G.teamTitles.push({ name: 'Subcampeón de ' + name, ic: '🥈' });
|
||
G.stats.marca = round1(clamp(G.stats.marca - 0.8, 20, 99));
|
||
showResult({ kind: 'intl2', ok: false, deltas: [{ k: 'marca', v: -0.8 }], text: `${ev.name}: llegaron a LA FINAL y la perdieron por detalles. Subcampeones: la región te llora y te quiere igual.` });
|
||
} else if (stage === 2){
|
||
G.intl.push({ name, result: 'semifinalista' });
|
||
G.stats.marca = round1(clamp(G.stats.marca - 1.2, 20, 99));
|
||
G.stats.sinergia = round1(clamp(G.stats.sinergia - 1, 20, 99));
|
||
showResult({ kind: 'intl3', ok: false, deltas: [{ k: 'marca', v: -1.2 }, { k: 'sinergia', v: -1 }], text: `${ev.name}: cayeron en la semifinal a manos del eventual campeón. Buen torneo, bronca eterna.` });
|
||
} else {
|
||
G.intl.push({ name, result: stage === 1 ? 'cuartos de final' : 'fase de grupos' });
|
||
G.stats.marca = round1(clamp(G.stats.marca - 1.8, 20, 99));
|
||
G.stats.sinergia = round1(clamp(G.stats.sinergia - 1.5, 20, 99));
|
||
showResult({ kind: 'intl4', ok: false, deltas: [{ k: 'marca', v: -1.8 }, { k: 'sinergia', v: -1.5 }], text: `${ev.name}: eliminados en ${stageNames[stage]}. Los memes de la región no esperan a nadie.` });
|
||
}
|
||
return;
|
||
}
|
||
G.teamTitles.push({ name: 'Campeón de ' + name, ic: isWorlds ? '🏆' : '🏅' });
|
||
G.intl.push({ name, result: 'campeón' });
|
||
const mvp = Math.random() >= 0.5;
|
||
if (mvp) G.indTitles.push({ name: 'MVP de la final de ' + name, ic: '🌟' });
|
||
showResult({ kind: 'intlWin', ok: true, text: `¡${name.toUpperCase()} CHAMPIONS! Tu equipo se llevó el trofeo y VOS fuiste la figura${mvp ? ' (MVP de la final, obvio)' : ''}. La región festeja, los haters guardan los memes, y tu valor de mercado explota.` });
|
||
}
|
||
/* ---------- RESOLUCIÓN ---------- */
|
||
function resolveDecision(ev, optIdx){
|
||
const opt = ev.opts[optIdx];
|
||
const effectiveRisk = Math.min(0.85, opt.risk * 1.0 + 0.03);
|
||
const ok = Math.random() >= effectiveRisk;
|
||
const res = { kind: 'decision', ev, opt, ok, text: ok ? opt.pos : opt.neg, deltas: [] };
|
||
const SCALE = 2.6;
|
||
if (ok){
|
||
Object.entries(opt.d).forEach(([k, v]) => {
|
||
G.stats[k] = round1(clamp(G.stats[k] + v * SCALE, 20, 99));
|
||
res.deltas.push({ k, v: Math.round(v * SCALE * 10) / 10 });
|
||
});
|
||
} else {
|
||
Object.entries(opt.d).forEach(([k, v]) => {
|
||
G.stats[k] = round1(clamp(G.stats[k] - v * SCALE * 0.9, 20, 99));
|
||
res.deltas.push({ k, v: -Math.round(v * SCALE * 0.9 * 10) / 10 });
|
||
});
|
||
}
|
||
if (opt.x && opt.x.rolChange) res.rolChange = true;
|
||
if (opt.x && opt.x.transfer === 'other') res.transferSearch = true;
|
||
return res;
|
||
}
|
||
function round1(x){ return Math.round(x * 10) / 10; }
|
||
|
||
function applySplitPerf(res){
|
||
const r = rating();
|
||
const role = ROLES[G.role];
|
||
const winRate = clamp(0.35 + (r - 50) / 160 + (G.div === 2 ? -0.03 : 0.03), 0.22, 0.82);
|
||
for (const k of ['mecanica','vision','farmeo','sinergia','marca']){
|
||
G.stats[k] = round1(clamp(G.stats[k] + 0.48 + Math.random() * 0.2 + (winRate - 0.45) * 1.0, 20, 99));
|
||
}
|
||
if (winRate > 0.55){
|
||
G.stats.mecanica = round1(clamp(G.stats.mecanica + 0.4, 20, 99));
|
||
G.stats.sinergia = round1(clamp(G.stats.sinergia + 0.3, 20, 99));
|
||
}
|
||
const games = 16 + Math.floor(r / 6) + rnd(0, 3);
|
||
const factor = (r / 60) * (games / 20) * (0.9 + Math.random() * 0.25);
|
||
const kills = Math.round(role.kill * factor);
|
||
const assists = Math.round(role.ast * factor * 0.95);
|
||
const deaths = Math.round(games * 0.11 * (1 + (100 - r) / 260));
|
||
G.kills += kills; G.assists += assists; G.deaths += deaths; G.games += games;
|
||
const pentaP = (r - 55) / 2600 * role.pentaW * (G.role === 'ADC' || G.role === 'Mid' ? 1.35 : 1);
|
||
if (Math.random() < Math.max(0, pentaP)){
|
||
G.penta++;
|
||
if (res) res.penta = true;
|
||
}
|
||
G.value = marketValue();
|
||
if (G.value > G.maxValue) G.maxValue = G.value;
|
||
G.salary = Math.round(G.value / 24);
|
||
updateRatingMax();
|
||
return { games, kills, assists };
|
||
}
|
||
|
||
/* ---------- CAMBIO DE EQUIPO ---------- */
|
||
function moveTeam(newId, reason){
|
||
const old = G.teams[G.teams.length - 1];
|
||
old.to = G.split;
|
||
const t = teamById(newId);
|
||
G.teamId = newId;
|
||
G.div = t.div;
|
||
G.teams.push({ id: newId, name: t.name, div: t.div, from: G.split, to: G.totalSplits, games: 0, kills: 0, ast: 0 });
|
||
if (reason === 'promotion') G.stats.sinergia = round1(clamp(G.stats.sinergia + 1.5, 20, 99));
|
||
if (reason === 'demotion') G.stats.marca = round1(clamp(G.stats.marca - 2, 20, 99));
|
||
}
|
||
|
||
/* ---------- RESULTADO + CIERRE DE SPLIT ---------- */
|
||
function showResult(res){
|
||
const card = $('resultCard');
|
||
const great = res.ok && (res.kind === 'intlWin' || (res.deltas && res.deltas.some(d => d.v >= 2)));
|
||
const bad = !res.ok && !['intlSkip','intlWin'].includes(res.kind);
|
||
const verdict = res.ok ? (great ? '¡JUGADÓN!' : 'BIEN AHÍ') : (bad ? 'QUE PEDO' : 'CÓMO SALIÓ');
|
||
const teamChange = ['transferMove','promotionGo','demLoan','demLeave'].includes(res.kind);
|
||
card.className = 'result-card';
|
||
let html = `<div class="verdict ${bad ? 'bad' : great ? 'great' : ''}">${verdict}</div>
|
||
<p class="rtext">${esc(res.text)}</p>`;
|
||
if (teamChange){
|
||
html += `<div class="team-change">${logoImg(G.teamId, 56, 'tc-logo')}<span class="arrow">→</span></div>`;
|
||
}
|
||
if (res.penta) html += `<div class="deltas"><span class="delta up">PENTAKILL</span></div>`;
|
||
if (res.deltas && res.deltas.length) html += `<div class="deltas">${res.deltas.map(d => `<span class="delta ${d.v >= 0 ? 'up' : 'down'}">${statLabel(d.k)} ${d.v >= 0 ? '+' : ''}${d.v}</span>`).join('')}</div>`;
|
||
if (res.rolChange) html += `<div class="deltas"><span class="delta money">Ahora sos ${G.role}</span></div>`;
|
||
html += `<button class="btn" id="btnContinue" style="margin-top:8px">Continuar</button>`;
|
||
card.innerHTML = html;
|
||
$('resultOverlay').classList.add('show');
|
||
$('btnContinue').addEventListener('click', () => {
|
||
$('resultOverlay').classList.remove('show');
|
||
doSplitEnd(res);
|
||
});
|
||
}
|
||
function statLabel(k){ const m = statNames().find(s => s[0] === k); return m ? m[1] : k; }
|
||
|
||
function doSplitEnd(res){
|
||
if (G.retiring){ finishCareer(); return; }
|
||
if (res && res.kind === 'decision' && res.opt && res.opt.x && res.opt.x.rolChange){
|
||
const roles = Object.keys(ROLES);
|
||
G.role = roles[(roles.indexOf(G.role) + rnd(1, roles.length - 1)) % roles.length];
|
||
}
|
||
const perf = applySplitPerf(null);
|
||
if (perf.penta) G.events.push('penta@' + G.split);
|
||
/* registrar split en historial de timeline */
|
||
const curTeam = teamById(G.teamId);
|
||
G.history.push({ split: G.split, org: G.teamId, orgName: curTeam.name, elo: rating(), games: perf.games, kills: perf.kills, ast: perf.assists });
|
||
const lastTeam = G.teams[G.teams.length - 1];
|
||
lastTeam.games += perf.games; lastTeam.kills += perf.kills; lastTeam.ast += perf.assists;
|
||
|
||
/* título de split regional (primera o segunda división) */
|
||
if (G.split % 2 === 0){
|
||
const year = 2024 + Math.floor((G.split - 1) / 2);
|
||
const need = G.div === 1 ? REGIONS[G.region].threshold - 8 : REGIONS[G.region].threshold - 15;
|
||
if (rating() >= need){
|
||
const p = rating() / 112;
|
||
const roll = Math.random();
|
||
if (roll < p){
|
||
G.teamTitles.push({ name: G.div === 1 ? `Campeón de ${REGIONS[G.region].name} (${year})` : `Campeón de la 2ª División de ${REGIONS[G.region].name} (${year})`, ic: '🏆' });
|
||
if (Math.random() < 0.4) award('MVP del Split', '🌟');
|
||
} else if (roll < p + p * 0.7){
|
||
G.teamTitles.push({ name: `Subcampeón de ${REGIONS[G.region].name} (${year})`, ic: '🥈' });
|
||
}
|
||
}
|
||
}
|
||
if (rating() >= 62) award('Guante de Oro', '🥇');
|
||
if (G.stats.farmeo >= 60) award('Rey del Farmeo', '🌾');
|
||
if (G.penta >= 1) award('Carry Definitivo', '💥');
|
||
if (G.stats.marca >= 58) award('Community Darling', '❤️');
|
||
if (G.split <= 3 && rating() >= 64) award('Mejor Novato', '🌱');
|
||
if (rating() >= 85) award('Jugador del Año', '👑');
|
||
|
||
if (G.split >= G.totalSplits){ finishCareer(); } else { nextSplit(); }
|
||
}
|
||
function award(name, ic){
|
||
if (!G.indTitles.find(t => t.name === name)) G.indTitles.push({ name, ic });
|
||
}
|
||
function intlIcon(result){
|
||
if (result === 'campeón') return '🏆';
|
||
if (result === 'subcampeón') return '🥈';
|
||
return '🌍';
|
||
}
|
||
|
||
function finishCareer(){
|
||
G.retired = true;
|
||
G.finalRating = rating();
|
||
G.value = marketValue();
|
||
updateRatingMax();
|
||
if (G.indTitles.length === 0 && rating() >= 72) G.indTitles.push({ name: 'Ídolo de la comunidad', ic: '🔥' });
|
||
saveHall();
|
||
renderSummary();
|
||
showScreen('summary');
|
||
}
|
||
|
||
/* ---------- RESUMEN (Screen B) ---------- */
|
||
function renderSummary(){
|
||
const region = REGIONS[G.region];
|
||
const rs = G.regSelect;
|
||
const kda = G.deaths ? ((G.kills + G.assists) / G.deaths).toFixed(2) : '∞';
|
||
$('sumSub').textContent = `${G.role} · ${region.name} · ${G.totalSplits} splits · ${G.retired ? 'retirado' : 'leyenda'}`;
|
||
|
||
/* Panel 1: identidad */
|
||
const eloPanel = `
|
||
<div class="sum-panel">
|
||
<div class="sp-label">Carrera terminada</div>
|
||
<div style="display:flex;align-items:center;gap:10px">
|
||
<div style="flex:1;min-width:0">
|
||
<div class="sp-nick">${esc(G.nick)}</div>
|
||
<div class="sp-row"><span class="badge badge-role">#${G.num} ${G.role}</span><span class="badge badge-region">${region.flag} ${region.code}</span></div>
|
||
<div class="sp-value">VALOR <b>${fmtMoney(G.maxValue)}</b></div>
|
||
</div>
|
||
<div class="big-elo"><span class="lbl">ELO</span><span class="num">${G.ratingMax}</span></div>
|
||
</div>
|
||
<div class="sp-stats">
|
||
<div class="stat3"><div class="stat-num">${G.games}</div><div class="stat-lbl">Partidas</div></div>
|
||
<div class="stat3"><div class="stat-num">${G.kills}</div><div class="stat-lbl">Kills</div></div>
|
||
<div class="stat3"><div class="stat-num">${G.assists}</div><div class="stat-lbl">Asist.</div></div>
|
||
</div>
|
||
</div>`;
|
||
|
||
/* Panel 2: selección regional */
|
||
const regPicks = G.intl.filter(x => x.result === 'campeón').length;
|
||
const regPanel = `
|
||
<div class="sum-panel">
|
||
<div class="sp-label">Selección regional</div>
|
||
<div class="sp-flag">${region.flag}</div>
|
||
<div class="sp-region">${region.name}</div>
|
||
<div class="sp-region-sub">${rs.apps} participaciones internacionales</div>
|
||
<div class="sp-stats">
|
||
<div class="stat3"><div class="stat-num">${rs.games}</div><div class="stat-lbl">Partidas</div></div>
|
||
<div class="stat3"><div class="stat-num">${rs.kills}</div><div class="stat-lbl">Kills</div></div>
|
||
<div class="stat3"><div class="stat-num">${rs.ast}</div><div class="stat-lbl">Asist.</div></div>
|
||
</div>
|
||
<div class="ach-grid">${regPicks ? `<span class="ach-chip">🏆 ${regPicks} internacional</span>` : ''}</div>
|
||
</div>`;
|
||
|
||
/* Panel 3: premios individuales */
|
||
const indPanel = `
|
||
<div class="sum-panel">
|
||
<div class="sp-label">Premios</div>
|
||
${G.indTitles.length ? `<div class="ach-grid">${G.indTitles.map(t => `<span class="ach-chip">${t.ic} ${esc(t.name)}</span>`).join('')}</div>` : `<div class="ach-empty"><span class="ic">🏆</span>Sin premios</div>`}
|
||
</div>`;
|
||
|
||
$('sumTop').innerHTML = eloPanel + regPanel + indPanel;
|
||
|
||
/* grid de orgs */
|
||
$('orgsGrid').innerHTML = G.teams.map(t => {
|
||
const color = REGIONS[G.region].accent;
|
||
return `<div class="org-card" style="--og-color:${color}">
|
||
<div class="og-bg"></div>
|
||
${logoImg(t.id, 56, 'og-logo')}
|
||
<div class="og-name">${esc(t.name)}</div>
|
||
<div class="og-div">${t.div === 1 ? 'Primera' : 'Segunda'} · Splits ${t.from}–${t.to}</div>
|
||
<div class="og-stats"><span><b>${t.games}</b> GAM</span><span><b>${t.kills}</b> KIL</span><span><b>${t.ast}</b> AST</span></div>
|
||
</div>`;
|
||
}).join('');
|
||
|
||
$('sumQuote').textContent = quoteFor();
|
||
}
|
||
|
||
function quoteFor(){
|
||
const r = G.ratingMax;
|
||
const w = G.teamTitles.filter(x => x.name.startsWith('Campeón de Worlds')).length;
|
||
if (w) return '«La leyenda no necesita explicaciones: tiene el trofeo.» — vos, después del Worlds';
|
||
if (r >= 90) return '«Dicen que el teclado no define al jugador. Define poco, pero el tuyo era el más caro del server.»';
|
||
if (r >= 75) return '«Fuiste de las mejores en el server, pero las finales se te hicieron espejito. La próxima, dicen.»';
|
||
if (r >= 60) return '«Profesional, estable, querido por la hinchada. El podcast de la liga te va a extrañar.»';
|
||
return '«El LoL no era para cualquiera. Evidentemente.» — tus viejos, en cada cena';
|
||
}
|
||
|
||
/* ---------- HALL OF FAME ---------- */
|
||
function saveHall(){
|
||
try {
|
||
const best = loadHall();
|
||
best.push({ nick: G.nick, rating: G.ratingMax, value: G.maxValue, region: G.region, role: G.role, ts: Date.now() });
|
||
best.sort((a, b) => b.rating - a.rating || b.value - a.value);
|
||
localStorage.setItem('lolero-hall', JSON.stringify(best.slice(0, 8)));
|
||
} catch (e) {}
|
||
}
|
||
function loadHall(){
|
||
try { return JSON.parse(localStorage.getItem('lolero-hall')) || []; } catch (e) { return []; }
|
||
}
|
||
|
||
/* ---------- EXPORT IMAGEN ---------- */
|
||
function exportImage(){
|
||
const W = 1080, H = 1920;
|
||
const cv = document.createElement('canvas');
|
||
cv.width = W; cv.height = H;
|
||
const ctx = cv.getContext('2d');
|
||
const x = W / 2;
|
||
let y = 0;
|
||
const grad = ctx.createLinearGradient(0, 0, 0, H);
|
||
grad.addColorStop(0, '#0a0a0c'); grad.addColorStop(0.5, '#0f0f12'); grad.addColorStop(1, '#0a0a0c');
|
||
ctx.fillStyle = grad; ctx.fillRect(0, 0, W, H);
|
||
const gold = '#d9730a', gold2 = '#f59e0b', mut = '#a1a1aa', txt = '#f4f4f5', muted = '#52525b';
|
||
const font = (s, w) => `${w || 800} ${s}px 'Inter', system-ui, sans-serif`;
|
||
const center = t => { ctx.textAlign = 'center'; ctx.fillText(t, x, y); };
|
||
ctx.fillStyle = gold; ctx.font = font(64, 800);
|
||
y = 130; center('1v9');
|
||
ctx.fillStyle = gold2; ctx.font = font(30, 700); ctx.letterSpacing = '6px';
|
||
y += 50; center('CONVERTITE EN LEYENDA');
|
||
ctx.font = font(22, 600); ctx.fillStyle = mut; ctx.letterSpacing = '0px';
|
||
y += 44; center('Carrera de pro player · League of Legends');
|
||
ctx.strokeStyle = 'rgba(217,115,10,.4)'; ctx.lineWidth = 2;
|
||
y += 40; ctx.beginPath(); ctx.moveTo(120, y); ctx.lineTo(W - 120, y); ctx.stroke();
|
||
y += 56;
|
||
ctx.fillStyle = txt; ctx.font = font(44, 800);
|
||
center((G.nick || 'Leyenda').toUpperCase());
|
||
ctx.font = font(24, 600); ctx.fillStyle = mut;
|
||
y += 42; center(`${G.role} · ${REGIONS[G.region].name} · ${REGIONS[G.region].country} · N° ${G.num}`);
|
||
y += 64;
|
||
const boxes = [['PARTIDAS',G.games],['KILLS',G.kills],['ASIST.',G.assists],['MUERTES',G.deaths],['PENTAKILLS',G.penta],['KDA',G.deaths ? ((G.kills+G.assists)/G.deaths).toFixed(2) : '∞']];
|
||
const bw = 300, bh = 130, gap = 24, ox = (W - 3*bw - 2*gap) / 2;
|
||
boxes.forEach((b, i) => {
|
||
const cx = ox + (i % 3) * (bw + gap), cy = y + Math.floor(i / 3) * (bh + gap);
|
||
ctx.fillStyle = 'rgba(24,24,27,.9)'; ctx.strokeStyle = '#27272a'; ctx.lineWidth = 2;
|
||
roundRect(ctx, cx, cy, bw, bh, 18); ctx.fill(); ctx.stroke();
|
||
ctx.fillStyle = mut; ctx.font = font(20, 700); ctx.textAlign = 'center';
|
||
ctx.fillText(b[0], cx + bw / 2, cy + 34);
|
||
ctx.fillStyle = gold2; ctx.font = font(42, 800);
|
||
ctx.fillText(String(b[1]), cx + bw / 2, cy + 100);
|
||
});
|
||
y += 2 * (bh + gap) + 30;
|
||
ctx.fillStyle = mut; ctx.font = font(22, 700); center('ELO MÁXIMO');
|
||
ctx.fillStyle = gold; ctx.font = font(110, 800); y += 96; center(String(G.ratingMax));
|
||
ctx.font = font(22, 700); ctx.fillStyle = mut; y += 46; center('VALOR MÁXIMO');
|
||
ctx.fillStyle = gold2; ctx.font = font(44, 800); y += 56; center(fmtMoney(G.maxValue));
|
||
y += 50;
|
||
ctx.fillStyle = mut; ctx.font = font(22, 700); center('EQUIPOS EN LA CARRERA');
|
||
y += 14;
|
||
const teamRows = G.teams.map(t => `${t.name} (Splits ${t.from}–${t.to}, ${t.div === 1 ? '1ª' : '2ª'})`);
|
||
ctx.fillStyle = txt; ctx.font = font(26, 700);
|
||
for (const row of teamRows.slice(0, 6)){ y += 34; center(row); }
|
||
if (teamRows.length > 6){ ctx.fillStyle = mut; ctx.font = font(20, 600); y += 30; center(`+ ${teamRows.length - 6} equipos más`); }
|
||
y += 40;
|
||
ctx.fillStyle = mut; ctx.font = font(22, 700); center('TÍTULOS');
|
||
const allTitles = G.teamTitles.concat(G.indTitles);
|
||
ctx.font = font(24, 600); y += 14;
|
||
if (!allTitles.length){ y += 32; ctx.fillStyle = mut; center('Ninguno. La gloria no era para hoy.'); }
|
||
else {
|
||
for (const t of allTitles.slice(0, 6)){ y += 34; ctx.fillStyle = gold2; center(`${t.ic} ${t.name}`); }
|
||
if (allTitles.length > 6){ ctx.fillStyle = mut; ctx.font = font(20, 600); y += 30; center(`+ ${allTitles.length - 6} más`); }
|
||
}
|
||
y += 40;
|
||
ctx.fillStyle = mut; ctx.font = font(22, 700); center('INTERNACIONAL');
|
||
ctx.font = font(24, 600); y += 14;
|
||
if (!G.intl.length){ y += 32; ctx.fillStyle = mut; center('Nunca salió del server regional'); }
|
||
else {
|
||
for (const t of G.intl){ y += 34; ctx.fillStyle = t.result === 'campeón' ? gold2 : txt; center(`${intlIcon(t.result)} ${t.name}: ${t.result}`); }
|
||
}
|
||
y += 44;
|
||
ctx.strokeStyle = 'rgba(217,115,10,.4)'; ctx.beginPath(); ctx.moveTo(120, y); ctx.lineTo(W - 120, y); ctx.stroke();
|
||
ctx.fillStyle = mut; ctx.font = font(24, 600); y += 40; center(`${G.nick || 'Leyenda'} · Fin de la carrera`);
|
||
ctx.font = font(20, 600); y += 32; center('Jugá la tuya: lolero.cbcren.online');
|
||
cv.toBlob(blob => {
|
||
if (!blob){ toast('No se pudo exportar :('); return; }
|
||
const a = document.createElement('a');
|
||
a.href = URL.createObjectURL(blob);
|
||
a.download = `1v9_${(G.nick || 'leyenda').replace(/[^a-z0-9]/gi, '_')}.png`;
|
||
document.body.appendChild(a); a.click();
|
||
setTimeout(() => { URL.revokeObjectURL(a.href); a.remove(); }, 500);
|
||
toast('Imagen descargada 📸 Compartila con el mundo');
|
||
}, 'image/png');
|
||
}
|
||
function roundRect(ctx, x, y, w, h, r){
|
||
ctx.beginPath();
|
||
ctx.moveTo(x + r, y); ctx.arcTo(x + w, y, x + w, y + h, r); ctx.arcTo(x + w, y + h, x, y + h, r);
|
||
ctx.arcTo(x, y + h, x, y, r); ctx.arcTo(x, y, x + w, y, r); ctx.closePath();
|
||
}
|
||
let toastTimer = null;
|
||
function toast(msg){
|
||
const t = $('toast'); t.textContent = msg; t.classList.add('show');
|
||
clearTimeout(toastTimer); toastTimer = setTimeout(() => t.classList.remove('show'), 2600);
|
||
}
|
||
</script>
|
||
</body>
|
||
</html>
|