feat: 1v9 convertite en leyenda LoL career simulator

This commit is contained in:
Renato
2026-08-03 05:54:46 +02:00
commit 472a250782
75 changed files with 2464 additions and 0 deletions
+122
View File
@@ -0,0 +1,122 @@
# Arquitectura — 1v9: Convertite en Leyenda
## Visión general
Es un **juego de decisiones** (historia interactiva) en un **único archivo** `index.html`
(HTML + CSS + JS inline, sin dependencias externas para jugar). Todo el estado vive en memoria
durante la partida; no hay persistencia obligatoria (un `localStorage` opcional guarda el
"Salón de la fama" con las mejores carreras).
```
Landing → Creación → Oferta de academia → Loop de carrera (N splits) → Resumen final (compartible)
```
---
## Flujo de pantallas
| Pantalla | Rol |
|----------|-----|
| **Landing** | Presentación + botón "Convertite en leyenda" + Salón de la fama |
| **Creación** | Nick, nº de invocador, mano, región, rol |
| **Oferta de academia** | 3 equipos aleatorios de tu liga para elegir |
| **Carrera (Screen A)** | Panel de jugador + decisión + timeline, 2 columnas |
| **Resumen (Screen B)** | 3 paneles + grid de orgs + botón "Jugar de nuevo" |
---
## Datos del juego
### REGIONES
`LCK / LPL / LEC / LCS / LTA / VCS`, cada una con:
- `code` (KR/CN/EU/NA/AM/VN), `flag`, `country`, `flavor`.
- `threshold`: umbral de ELO para competir en su primera división (LCK=68…VCS=50).
### TEAMS (68 equipos reales)
`{ id, name, div }``div: 1` = primera división, `div: 2` = segunda/academia.
Los logos se resuelven con `LOGO_EXT[id]``logos/<id>.<ext>`.
### ROLES
`{ em, fl, kill, ast, death, pentaW }` — coeficientes de farmeo/perf de cada rol.
### EVENTS (26 eventos de decisión)
Cada evento: `{ cat, title, ctx, opts[] }`.
Cada opción: `{ t, d, risk, pos, neg, x? }`
- `d`: deltas a stats (`mecanica, vision, farmeo, sinergia, marca`).
- `risk`: probabilidad de fracaso (0-1).
- `pos`/`neg`: textos de resultado (éxito/fracaso).
- `x`: efectos extra (`rolChange`, `transfer`).
### COMPETITIONS (5 internacionales)
`{ split, ic, flavor }` — First Stand (2), MSI (4), EWC (6), Asian Games (8), Worlds (último).
---
## Estado de partida (`G`)
```js
{
nick, num, hand, region, role,
teamId, div,
stats: { mecanica, vision, farmeo, sinergia, marca },
split, totalSplits,
kills, assists, deaths, games, penta,
value, maxValue, salary, ratingMax,
teamTitles, indTitles, intl,
teams, events, history,
regSelect: { games, kills, ast, apps },
retired, retiring, finalRating
}
```
---
## Mecánicas clave
### Rating / ELO
Media ponderada de las 5 stats (mecánica 1.15, farmeo 1.05, sinergia 1.0, visión 0.95, marca 0.85),
clamp `[40, 99]`.
### Market value
`50000 * 10^((rating-40)*0.055)` × bonus por títulos, redondeado a `10k`.
### Crecimiento pasivo
Cada split suma `+0.48 + rand*0.2` (+ bonus por winRate) a cada stat; rendimiento malo reduce.
### Decisiones
`ok = Math.random() >= (risk + 0.03)`. Éxito: `+delta*2.6`. Fracaso: `-delta*2.6*0.9`.
### Fichajes
Solo desde **split 4**, con ~22% de chance por split y `rating >= threshold-4`.
Ofertas de otros equipos (misma región o extranjeros de primera si el rating alcanza).
### Competencias internacionales
**Solo equipos de primera división** (un equipo de 2ª no va a MSI/Worlds). Bracket de 4 rondas
con probabilidad por rating: grupos → cuartos → semis → final.
### Títulos
- **Regional**: cada split par, si `rating >= threshold-X` (primera o segunda división).
- **Individuales**: Guante de Oro (ELO≥62), Rey del Farmeo (farmeo≥60), Carry Definitivo (penta≥1), Community Darling (marca≥58), MVP del Split.
---
## UI (estilo Copero)
Design tokens en `:root`:
```
--bg-base:#0a0a0c --bg-card:#18181b --bg-card-alt:#1f1f23 --bg-row-active:#0e3a3f
--accent-ovr:#d9730a --accent-role:#7c3aed
--success:#22c55e --danger:#ef4444 --border-subtle:#27272a
```
- **Screen A**: 2 columnas (3fr/2fr). Izquierda: badge ELO + panel jugador + stats + logros + decisión.
Derecha: timeline de carrera (SPLIT/ORG/ELO/GAM/KIL/AST) con fila activa teal y filas futuras grises.
- **Screen B**: 3 paneles (identidad, selección regional, premios) + grid de orgs + botón "Jugar de nuevo".
- **Responsive**: <768px colapsa la timeline (default cerrada) y apila a 1 columna.
---
## Export de imagen
Un `<canvas>` 1080×1920 dibuja el resumen completo (dark bg, badges ELO, stats, títulos, orgs)
y se descarga como PNG. Es el mecanismo de viralidad del juego.