feat: intl events con resultado aleatorio directo (campeon/subcampeon/semi/eliminado), trofeo + stats + anio

This commit is contained in:
lolero-dev
2026-08-03 01:37:01 -03:00
parent 2db7b3e28f
commit c3ee2d5cec
2 changed files with 38 additions and 41 deletions
+37 -40
View File
@@ -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){