diff --git a/docs/NEXT_STEPS.md b/docs/NEXT_STEPS.md index d419712..39852d6 100644 --- a/docs/NEXT_STEPS.md +++ b/docs/NEXT_STEPS.md @@ -7,7 +7,8 @@ Estado actual y mejoras posibles, en orden de impacto. - [x] Juego completo en un solo archivo (`index.html`), autocontenido, offline. - [x] 68 equipos reales con logos, 5 roles, 6 regiones. - [x] 94 eventos de decisión en 7 categorías (26 originales + 68 nuevos: escándalos LATAM reales + momentos BO5). -- [x] 5 competencias internacionales (First Stand, MSI, EWC, Asian Games, Worlds) como **eventos con resultado aleatorio directo**: una tirada decide campeón/subcampeón/semifinal/eliminado, con trofeo (🏆/🥈) + stats, año en el título y MVP de final. +- [x] 5 competencias internacionales (First Stand, MSI, EWC, Asian Games, Worlds) como **eventos directos sin botón**: si el equipo tiene cupo se juega solo (la liga se pausa). Una tirada decide campeón/subcampeón/semifinal/eliminado, con trofeo (🏆/🥈) + stats, año en el título y MVP de final. Título regional solo en splits impares (nunca coexiste con torneo intl). +- [x] Suspensión de un año real: la opción "Aceptar jugar solo un game" (El ring del clasificatorio) con `x: { suspend: 2 }` hace que `doSplitEnd` salte 2 splits sin rendimiento ni historia. - [x] Títulos regionales (1ª y 2ª) + premios individuales (incluye Mejor Novato, Jugador del Año). - [x] Fichajes con cadencia realista (≥ split 4, ~2/carrera). - [x] Gating: equipos de 2ª división no van a internacionales. diff --git a/index.html b/index.html index f1aadcb..89c32b6 100644 --- a/index.html +++ b/index.html @@ -1007,7 +1007,7 @@ const EVENTS = [ { 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, + { t: 'Aceptar jugar "solo un game"', d: { mecanica: 1.6 }, risk: 0.75, x: { suspend: 2 }, 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, @@ -1956,13 +1956,9 @@ function renderIntl(ev){ box.innerHTML = `
${esc(comp.flavor)} La liga se pausa: este split se juega ${ev.name} y tu equipo tiene cupo.
-${esc(comp.flavor)} La liga se pausa: tu equipo ya tiene cupo y este split se juega ${ev.name}. Sin vuelta atrás.
+Determinando el resultado del torneo…
`; + setTimeout(() => runIntl(ev), 900); } function runIntl(ev){ @@ -2037,6 +2033,7 @@ function resolveDecision(ev, optIdx){ } if (opt.x && opt.x.rolChange) res.rolChange = true; if (opt.x && opt.x.transfer === 'other') res.transferSearch = true; + if (opt.x && opt.x.suspend && !ok) res.suspend = opt.x.suspend; return res; } function round1(x){ return Math.round(x * 10) / 10; } @@ -2110,6 +2107,15 @@ function statLabel(k){ const m = statNames().find(s => s[0] === k); return m ? m function doSplitEnd(res){ if (G.retiring){ finishCareer(); return; } + /* suspensión: el jugador se pierde los splits sancionado (no juega, no suma nada) */ + if (res && res.suspend){ + const lost = Math.min(res.suspend, G.totalSplits - G.split); + G.history.push({ split: G.split, org: G.teamId, orgName: teamById(G.teamId).name, elo: rating(), games: 0, kills: 0, ast: 0, suspended: true }); + G.split += lost; + if (G.split >= G.totalSplits){ finishCareer(); return; } + nextSplit(); + 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];