feat: intl events con resultado aleatorio directo (campeon/subcampeon/semi/eliminado), trofeo + stats + anio
This commit is contained in:
+1
-1
@@ -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.
|
||||
|
||||
+37
-40
@@ -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){
|
||||
|
||||
Reference in New Issue
Block a user