fix: torneo intl se juega directo sin boton (liga pausada); suspension de un anio salta 2 splits real
This commit is contained in:
+2
-1
@@ -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
@@ -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];
|
||||||
|
|||||||
Reference in New Issue
Block a user