fix: torneo intl se juega directo sin boton (liga pausada); suspension de un anio salta 2 splits real

This commit is contained in:
lolero-dev
2026-08-03 01:45:59 -03:00
parent 9e65a69a67
commit 1811a3b955
2 changed files with 16 additions and 9 deletions
+2 -1
View File
@@ -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] Juego completo en un solo archivo (`index.html`), autocontenido, offline.
- [x] 68 equipos reales con logos, 5 roles, 6 regiones. - [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] 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] 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] Fichajes con cadencia realista (≥ split 4, ~2/carrera).
- [x] Gating: equipos de 2ª división no van a internacionales. - [x] Gating: equipos de 2ª división no van a internacionales.
+14 -8
View File
@@ -1007,7 +1007,7 @@ const EVENTS = [
{ t: 'Decir que no, obvio', d: { marca: 1.6, sinergia: 0.6 }, risk: 0.1, { 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.', 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.' }, 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.', 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.' }, 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, { t: 'Exigir plata por adelantado', d: { marca: 1.2 }, risk: 0.6,
@@ -1956,13 +1956,9 @@ function renderIntl(ev){
box.innerHTML = ` box.innerHTML = `
<div class="dc-cat">${comp.ic} ${ev.name} · Split ${G.split}</div> <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> <h2>${isWorlds ? 'El torneo más grande del año' : ev.name}</h2>
<p class="dc-ctx">${esc(comp.flavor)} La liga se pausa: este split se juega ${ev.name} y tu equipo tiene cupo.</p> <p class="dc-ctx">${esc(comp.flavor)} La liga se pausa: tu equipo ya tiene cupo y este split se juega ${ev.name}. Sin vuelta atrás.</p>
<div class="opt-grid"> <p class="dc-hint">Determinando el resultado del torneo…</p>`;
<button class="opt-card wide" data-i="go"><span class="oc-title">Jugar el torneo</span><span class="oc-desc">La liga está parada: este split es ${ev.name}. Todo o nada.</span></button> setTimeout(() => runIntl(ev), 900);
</div>`;
box.querySelectorAll('.opt-card').forEach(b => b.addEventListener('click', () => {
runIntl(ev);
}));
} }
function runIntl(ev){ 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.rolChange) res.rolChange = true;
if (opt.x && opt.x.transfer === 'other') res.transferSearch = 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; return res;
} }
function round1(x){ return Math.round(x * 10) / 10; } 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){ function doSplitEnd(res){
if (G.retiring){ finishCareer(); return; } 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){ if (res && res.kind === 'decision' && res.opt && res.opt.x && res.opt.x.rolChange){
const roles = Object.keys(ROLES); const roles = Object.keys(ROLES);
G.role = roles[(roles.indexOf(G.role) + rnd(1, roles.length - 1)) % roles.length]; G.role = roles[(roles.indexOf(G.role) + rnd(1, roles.length - 1)) % roles.length];