diff --git a/docs/NEXT_STEPS.md b/docs/NEXT_STEPS.md index b4acd89..d419712 100644 --- a/docs/NEXT_STEPS.md +++ b/docs/NEXT_STEPS.md @@ -7,7 +7,7 @@ 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). +- [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] 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 cd394ad..aeb7911 100644 --- a/index.html +++ b/index.html @@ -1766,8 +1766,8 @@ function nextEvent(){ } 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] }; + const p = clamp((rating() - 45) / 70, 0.05, 0.8); + return { kind: 'intl', name, p }; } function transferEvent(){ @@ -1973,15 +1973,8 @@ function renderIntl(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 year = 2024 + Math.floor((G.split - 1) / 2); const r = rating(); const role = ROLES[G.role]; const games = Math.round(8 + p * 10); @@ -1992,39 +1985,43 @@ function runIntl(ev){ 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.` }); - } + /* evento directo: una sola tirada define el resultado del torneo */ + const roll = Math.random(); + if (roll < p * 0.28){ + /* CAMPEÓN */ + G.teamTitles.push({ name: `Campeón de ${name} (${year})`, ic: isWorlds ? '🏆' : '🏅' }); + G.intl.push({ name, result: 'campeón' }); + G.stats.marca = round1(clamp(G.stats.marca + 3.5, 20, 99)); + G.stats.sinergia = round1(clamp(G.stats.sinergia + 2.5, 20, 99)); + const mvp = Math.random() >= 0.5; + if (mvp) G.indTitles.push({ name: `MVP de la final de ${name}`, ic: '🌟' }); + showResult({ kind: 'intlWin', ok: true, deltas: [{ k: 'marca', v: 3.5 }, { k: 'sinergia', v: 2.5 }], text: `¡${name.toUpperCase()} CHAMPIONS ${year}! 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.` }); 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.` }); + if (roll < p * 0.55){ + /* subcampeón */ + G.teamTitles.push({ name: `Subcampeón de ${name} (${year})`, ic: '🥈' }); + G.intl.push({ name, result: 'subcampeón' }); + G.stats.marca = round1(clamp(G.stats.marca + 2, 20, 99)); + G.stats.sinergia = round1(clamp(G.stats.sinergia + 1, 20, 99)); + showResult({ kind: 'intl2', ok: true, deltas: [{ k: 'marca', v: 2 }, { k: 'sinergia', v: 1 }], text: `${name} ${year}: llegaron a LA FINAL y la perdieron por detalles. Subcampeones: la región te llora y te quiere igual.` }); + return; + } + if (roll < p * 0.55 + p * 0.25){ + /* semifinalista */ + G.intl.push({ name, result: 'semifinalista' }); + G.stats.marca = round1(clamp(G.stats.marca + 1, 20, 99)); + G.stats.sinergia = round1(clamp(G.stats.sinergia + 0.5, 20, 99)); + showResult({ kind: 'intl3', ok: true, deltas: [{ k: 'marca', v: 1 }, { k: 'sinergia', v: 0.5 }], text: `${name} ${year}: cayeron en la semifinal a manos del eventual campeón. Buen torneo, bronca eterna.` }); + return; + } + /* eliminado temprano */ + const stage = roll < p * 0.8 ? 'cuartos de final' : 'fase de grupos'; + G.intl.push({ name, result: stage }); + 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: 'intl4', ok: false, deltas: [{ k: 'marca', v: -1.5 }, { k: 'sinergia', v: -1 }], text: `${name} ${year}: eliminados en ${stage}. Los memes de la región no esperan a nadie.` }); } /* ---------- RESOLUCIÓN ---------- */ function resolveDecision(ev, optIdx){