feat(economy): implement shop command with interactive panel for browsing offers
This commit is contained in:
617
SUGERENCIAS_Y_MEJORAS.md
Normal file
617
SUGERENCIAS_Y_MEJORAS.md
Normal file
@@ -0,0 +1,617 @@
|
||||
# 🎯 Análisis Completo y Sugerencias de Mejora
|
||||
|
||||
## 📊 Análisis del Proyecto
|
||||
|
||||
Después de analizar todo tu código, he identificado que tienes un **excelente sistema base** con:
|
||||
|
||||
✅ Sistema de economía robusto (items, wallet, inventario)
|
||||
✅ Sistema de minijuegos completo (mina, pesca, pelea, granja)
|
||||
✅ Sistema de combate con equipamiento y stats
|
||||
✅ Sistema de crafteo y fundición
|
||||
✅ Sistema de mutaciones para items
|
||||
✅ DisplayComponents avanzado con editor visual
|
||||
✅ Sistema de cooldowns y progresión
|
||||
✅ Sistema de alianzas con leaderboards
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Sugerencias de Nuevas Funcionalidades
|
||||
|
||||
### 1. 🏆 **Sistema de Logros/Achievements** ⭐⭐⭐⭐⭐
|
||||
|
||||
**Por qué es importante:** Los logros mantienen a los jugadores enganchados con objetivos claros.
|
||||
|
||||
**Implementación sugerida:**
|
||||
|
||||
```typescript
|
||||
// prisma/schema.prisma
|
||||
model Achievement {
|
||||
id String @id @default(cuid())
|
||||
key String // "first_mine", "craft_10_items", "defeat_100_mobs"
|
||||
name String
|
||||
description String
|
||||
icon String?
|
||||
category String // "mining", "crafting", "combat", "economy"
|
||||
|
||||
// Requisitos para desbloquear (JSON flexible)
|
||||
requirements Json // { type: "mine_count", value: 100 }
|
||||
|
||||
// Recompensas al desbloquear
|
||||
rewards Json? // { coins: 500, items: [...], title: "..." }
|
||||
|
||||
guildId String?
|
||||
guild Guild? @relation(fields: [guildId], references: [id])
|
||||
|
||||
// Logros desbloqueados por usuarios
|
||||
unlocked PlayerAchievement[]
|
||||
|
||||
hidden Boolean @default(false) // logros secretos
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@unique([guildId, key])
|
||||
}
|
||||
|
||||
model PlayerAchievement {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
guildId String
|
||||
achievementId String
|
||||
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
guild Guild @relation(fields: [guildId], references: [id])
|
||||
achievement Achievement @relation(fields: [achievementId], references: [id])
|
||||
|
||||
unlockedAt DateTime @default(now())
|
||||
metadata Json? // datos extra como progreso
|
||||
|
||||
@@unique([userId, guildId, achievementId])
|
||||
@@index([userId, guildId])
|
||||
}
|
||||
```
|
||||
|
||||
**Comandos sugeridos:**
|
||||
- `!logros` - Ver tus logros desbloqueados y progreso
|
||||
- `!logros @usuario` - Ver logros de otro usuario
|
||||
- `!logro-crear <key>` - Crear nuevo logro (admin)
|
||||
- `!ranking-logros` - Ver quién tiene más logros
|
||||
|
||||
**Ejemplos de logros:**
|
||||
- 🎖️ **Primera Mina**: Mina por primera vez
|
||||
- ⛏️ **Minero Novato**: Mina 50 veces
|
||||
- ⛏️ **Minero Veterano**: Mina 500 veces
|
||||
- 🎣 **Pescador Experto**: Pesca 100 veces
|
||||
- ⚔️ **Cazador de Monstruos**: Derrota 100 mobs
|
||||
- 💰 **Millonario**: Acumula 1,000,000 monedas
|
||||
- 🛠️ **Maestro Craftero**: Craftea 100 items
|
||||
- 📦 **Coleccionista**: Ten 50 items únicos
|
||||
- 🗡️ **Arsenal Completo**: Equipa arma, armadura y capa legendarias
|
||||
|
||||
---
|
||||
|
||||
### 2. 📊 **Sistema de Estadísticas Detalladas** ⭐⭐⭐⭐
|
||||
|
||||
**Por qué es importante:** A los jugadores les gusta ver su progreso en números.
|
||||
|
||||
**Implementación sugerida:**
|
||||
|
||||
```typescript
|
||||
// prisma/schema.prisma
|
||||
model PlayerStats {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
guildId String
|
||||
|
||||
// Stats de minijuegos
|
||||
minesCompleted Int @default(0)
|
||||
fishingCompleted Int @default(0)
|
||||
fightsCompleted Int @default(0)
|
||||
farmsCompleted Int @default(0)
|
||||
|
||||
// Stats de combate
|
||||
mobsDefeated Int @default(0)
|
||||
damageDealt Int @default(0)
|
||||
damageTaken Int @default(0)
|
||||
|
||||
// Stats de economía
|
||||
totalCoinsEarned Int @default(0)
|
||||
totalCoinsSpent Int @default(0)
|
||||
itemsCrafted Int @default(0)
|
||||
itemsSmelted Int @default(0)
|
||||
|
||||
// Stats de items
|
||||
chestsOpened Int @default(0)
|
||||
itemsConsumed Int @default(0)
|
||||
|
||||
// Récords personales
|
||||
highestDamageDealt Int @default(0)
|
||||
longestWinStreak Int @default(0)
|
||||
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
guild Guild @relation(fields: [guildId], references: [id])
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@unique([userId, guildId])
|
||||
}
|
||||
```
|
||||
|
||||
**Comando sugerido:**
|
||||
```
|
||||
!stats [@usuario]
|
||||
```
|
||||
|
||||
Muestra:
|
||||
- Total de actividades realizadas
|
||||
- Mobs derrotados
|
||||
- Monedas ganadas/gastadas
|
||||
- Items crafteados
|
||||
- Récords personales
|
||||
|
||||
---
|
||||
|
||||
### 3. 🎁 **Sistema de Misiones Diarias/Semanales** ⭐⭐⭐⭐⭐
|
||||
|
||||
**Por qué es importante:** Mantiene a los jugadores volviendo cada día.
|
||||
|
||||
**Implementación sugerida:**
|
||||
|
||||
```typescript
|
||||
// prisma/schema.prisma
|
||||
model Quest {
|
||||
id String @id @default(cuid())
|
||||
key String
|
||||
name String
|
||||
description String
|
||||
icon String?
|
||||
|
||||
// Tipo de misión
|
||||
type String // "daily", "weekly", "event"
|
||||
category String // "mining", "combat", "economy"
|
||||
|
||||
// Requisitos
|
||||
requirements Json // { type: "mine", count: 10 }
|
||||
|
||||
// Recompensas
|
||||
rewards Json // { coins: 500, items: [...], xp: 100 }
|
||||
|
||||
// Disponibilidad
|
||||
startAt DateTime?
|
||||
endAt DateTime?
|
||||
|
||||
guildId String?
|
||||
guild Guild? @relation(fields: [guildId], references: [id])
|
||||
|
||||
progress QuestProgress[]
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@unique([guildId, key])
|
||||
}
|
||||
|
||||
model QuestProgress {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
guildId String
|
||||
questId String
|
||||
|
||||
progress Int @default(0) // progreso actual
|
||||
completed Boolean @default(false)
|
||||
claimed Boolean @default(false) // si ya reclamó recompensa
|
||||
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
guild Guild @relation(fields: [guildId], references: [id])
|
||||
quest Quest @relation(fields: [questId], references: [id])
|
||||
|
||||
completedAt DateTime?
|
||||
claimedAt DateTime?
|
||||
expiresAt DateTime? // para misiones diarias/semanales
|
||||
|
||||
@@unique([userId, guildId, questId])
|
||||
@@index([userId, guildId])
|
||||
}
|
||||
```
|
||||
|
||||
**Comandos sugeridos:**
|
||||
- `!misiones` - Ver misiones disponibles y progreso
|
||||
- `!mision-reclamar <id>` - Reclamar recompensa de misión completada
|
||||
- `!mision-crear <key>` - Crear nueva misión (admin)
|
||||
|
||||
**Ejemplos de misiones diarias:**
|
||||
- ⛏️ Mina 10 veces (Recompensa: 500 monedas)
|
||||
- 🎣 Pesca 5 veces (Recompensa: 3 cañas)
|
||||
- ⚔️ Derrota 15 mobs (Recompensa: poción de vida)
|
||||
- 🛒 Compra 3 items de la tienda (Recompensa: 10% descuento)
|
||||
- 🛠️ Craftea 5 items (Recompensa: materiales extra)
|
||||
|
||||
---
|
||||
|
||||
### 4. 🏪 **Comando de Tienda Mejorado** ⭐⭐⭐⭐⭐
|
||||
|
||||
**Lo que falta actualmente:**
|
||||
- Solo tienes `!comprar <offerId>` que requiere saber el ID
|
||||
- No hay forma visual de ver la tienda
|
||||
- No hay categorías ni filtros
|
||||
- No hay vista previa de items
|
||||
|
||||
**Voy a crear un comando completo con DisplayComponents** ⬇️
|
||||
|
||||
---
|
||||
|
||||
### 5. 🎲 **Sistema de Eventos Temporales** ⭐⭐⭐⭐
|
||||
|
||||
**Por qué es importante:** Crea urgencia y mantiene el contenido fresco.
|
||||
|
||||
**Implementación sugerida:**
|
||||
|
||||
```typescript
|
||||
// prisma/schema.prisma
|
||||
model Event {
|
||||
id String @id @default(cuid())
|
||||
key String
|
||||
name String
|
||||
description String
|
||||
icon String?
|
||||
|
||||
// Configuración del evento
|
||||
config Json? // multiplicadores, drops especiales, etc.
|
||||
|
||||
// Items/áreas/mobs específicos del evento
|
||||
specialItems String[] // keys de items que solo aparecen en evento
|
||||
|
||||
// Fechas
|
||||
startAt DateTime
|
||||
endAt DateTime
|
||||
|
||||
guildId String?
|
||||
guild Guild? @relation(fields: [guildId], references: [id])
|
||||
|
||||
active Boolean @default(true)
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@unique([guildId, key])
|
||||
}
|
||||
```
|
||||
|
||||
**Ejemplos de eventos:**
|
||||
- 🎃 **Halloween:** Mobs especiales, items de Halloween, drops x2
|
||||
- 🎄 **Navidad:** Cofres navideños, items temáticos, monedas x1.5
|
||||
- 🐰 **Pascua:** Huevos de Pascua escondidos, mobs conejos
|
||||
- 💘 **San Valentín:** Items de amor, crafteos especiales
|
||||
|
||||
**Comando sugerido:**
|
||||
```
|
||||
!eventos
|
||||
```
|
||||
Muestra eventos activos con tiempo restante y recompensas especiales.
|
||||
|
||||
---
|
||||
|
||||
### 6. 🔄 **Sistema de Intercambio entre Jugadores** ⭐⭐⭐⭐
|
||||
|
||||
**Por qué es importante:** Fomenta la economía entre jugadores.
|
||||
|
||||
**Implementación sugerida:**
|
||||
|
||||
```typescript
|
||||
// prisma/schema.prisma
|
||||
model Trade {
|
||||
id String @id @default(cuid())
|
||||
|
||||
// Jugador que inicia el trade
|
||||
initiatorId String
|
||||
initiator User @relation("TradeInitiator", fields: [initiatorId], references: [id])
|
||||
|
||||
// Jugador que recibe la oferta
|
||||
targetId String
|
||||
target User @relation("TradeTarget", fields: [targetId], references: [id])
|
||||
|
||||
guildId String
|
||||
guild Guild @relation(fields: [guildId], references: [id])
|
||||
|
||||
// Ofertas de ambos jugadores (JSON)
|
||||
initiatorOffer Json // { coins: 100, items: [{ key, qty }] }
|
||||
targetOffer Json // { coins: 50, items: [{ key, qty }] }
|
||||
|
||||
status String // "pending", "accepted", "rejected", "expired", "completed"
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
expiresAt DateTime
|
||||
completedAt DateTime?
|
||||
|
||||
@@index([initiatorId, targetId, guildId])
|
||||
}
|
||||
```
|
||||
|
||||
**Comandos sugeridos:**
|
||||
- `!tradear @usuario` - Iniciar intercambio
|
||||
- `!trade-ofrecer <coins|item:key:qty>` - Añadir a tu oferta
|
||||
- `!trade-aceptar` - Aceptar intercambio
|
||||
- `!trade-cancelar` - Cancelar intercambio
|
||||
|
||||
---
|
||||
|
||||
### 7. 🏘️ **Sistema de Guilds/Clanes** ⭐⭐⭐⭐⭐
|
||||
|
||||
**Por qué es importante:** Fomenta el trabajo en equipo y competencia.
|
||||
|
||||
**Implementación sugerida:**
|
||||
|
||||
```typescript
|
||||
// prisma/schema.prisma
|
||||
model PlayerGuild {
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
tag String // [TAG]
|
||||
description String?
|
||||
icon String?
|
||||
|
||||
leaderId String
|
||||
leader User @relation(fields: [leaderId], references: [id])
|
||||
|
||||
guildId String // Discord guild
|
||||
discordGuild Guild @relation(fields: [guildId], references: [id])
|
||||
|
||||
// Stats del clan
|
||||
level Int @default(1)
|
||||
xp Int @default(0)
|
||||
|
||||
// Recursos del clan
|
||||
treasury Int @default(0) // monedas compartidas
|
||||
|
||||
members PlayerGuildMember[]
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@unique([guildId, tag])
|
||||
}
|
||||
|
||||
model PlayerGuildMember {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
playerGuildId String
|
||||
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
playerGuild PlayerGuild @relation(fields: [playerGuildId], references: [id])
|
||||
|
||||
rank String @default("member") // "leader", "officer", "member"
|
||||
contribution Int @default(0) // contribución total
|
||||
|
||||
joinedAt DateTime @default(now())
|
||||
|
||||
@@unique([userId, playerGuildId])
|
||||
}
|
||||
```
|
||||
|
||||
**Comandos sugeridos:**
|
||||
- `!clan-crear <nombre> <tag>` - Crear clan
|
||||
- `!clan-info [@clan]` - Ver info del clan
|
||||
- `!clan-invitar @usuario` - Invitar a clan
|
||||
- `!clan-donar <cantidad>` - Donar al tesoro
|
||||
- `!clan-ranking` - Ver ranking de clanes
|
||||
- `!clan-buffs` - Buffs activos del clan
|
||||
|
||||
**Beneficios de clanes:**
|
||||
- Buffs compartidos (XP+10%, drops+5%, etc.)
|
||||
- Almacén compartido
|
||||
- Misiones de clan con recompensas grupales
|
||||
- Guerras entre clanes
|
||||
- Ranking de clanes
|
||||
|
||||
---
|
||||
|
||||
### 8. 🎰 **Sistema de Ruleta/Lotería** ⭐⭐⭐
|
||||
|
||||
**Por qué es importante:** Da emoción y oportunidades de ganar grande.
|
||||
|
||||
**Comando sugerido:**
|
||||
```
|
||||
!ruleta <apuesta>
|
||||
```
|
||||
|
||||
- Cuesta monedas
|
||||
- Puede dar: monedas x2, x5, x10, items raros, o perder todo
|
||||
- Cooldown de 1 hora
|
||||
|
||||
---
|
||||
|
||||
### 9. 🏠 **Sistema de Viviendas/Bases** ⭐⭐⭐⭐
|
||||
|
||||
**Por qué es importante:** Personalización y progresión a largo plazo.
|
||||
|
||||
**Características:**
|
||||
- Cada jugador puede tener una casa
|
||||
- Mejoras de casa (nivel 1-10)
|
||||
- Almacén extra por nivel
|
||||
- Decoraciones
|
||||
- Buffs pasivos (+5% XP, -10% cooldowns, etc.)
|
||||
- Costo de mantenimiento semanal
|
||||
|
||||
---
|
||||
|
||||
### 10. 🔥 **Sistema de Racha (Streaks)** ⭐⭐⭐⭐
|
||||
|
||||
**Por qué es importante:** Incentiva jugar todos los días.
|
||||
|
||||
**Implementación:**
|
||||
```typescript
|
||||
model PlayerStreak {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
guildId String
|
||||
|
||||
currentStreak Int @default(0)
|
||||
longestStreak Int @default(0)
|
||||
lastActiveDate DateTime
|
||||
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
guild Guild @relation(fields: [guildId], references: [id])
|
||||
|
||||
@@unique([userId, guildId])
|
||||
}
|
||||
```
|
||||
|
||||
**Recompensas por racha:**
|
||||
- Día 1: 100 monedas
|
||||
- Día 3: 300 monedas + cofre básico
|
||||
- Día 7: 1000 monedas + cofre raro
|
||||
- Día 14: 3000 monedas + cofre épico
|
||||
- Día 30: 10000 monedas + item legendario
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Bugs y Mejoras Técnicas Detectadas
|
||||
|
||||
### 1. **Sistema de Cooldowns**
|
||||
**Problema:** Los cooldowns están dispersos por actividad.
|
||||
**Mejora:** Centralizar en una función helper que muestre todos los cooldowns activos de un usuario.
|
||||
|
||||
```typescript
|
||||
// src/game/cooldowns/service.ts
|
||||
export async function getUserActiveCooldowns(userId: string, guildId: string) {
|
||||
const cds = await prisma.actionCooldown.findMany({
|
||||
where: { userId, guildId, until: { gt: new Date() } },
|
||||
orderBy: { until: 'asc' }
|
||||
});
|
||||
|
||||
return cds.map(cd => ({
|
||||
key: cd.key,
|
||||
remaining: Math.ceil((cd.until.getTime() - Date.now()) / 1000),
|
||||
expiresAt: cd.until
|
||||
}));
|
||||
}
|
||||
```
|
||||
|
||||
### 2. **Validación de Props en Items**
|
||||
**Mejora:** Añadir validación TypeScript más estricta para props de items.
|
||||
|
||||
```typescript
|
||||
// src/game/economy/validators.ts
|
||||
export function validateItemProps(props: any): { valid: boolean; errors: string[] } {
|
||||
const errors: string[] = [];
|
||||
|
||||
if (props.tool) {
|
||||
if (!['pickaxe', 'rod', 'sword', 'bow', 'halberd', 'net'].includes(props.tool.type)) {
|
||||
errors.push(`Invalid tool type: ${props.tool.type}`);
|
||||
}
|
||||
if (props.tool.tier && (props.tool.tier < 1 || props.tool.tier > 10)) {
|
||||
errors.push(`Tool tier must be between 1-10`);
|
||||
}
|
||||
}
|
||||
|
||||
if (props.damage && props.damage < 0) {
|
||||
errors.push(`Damage cannot be negative`);
|
||||
}
|
||||
|
||||
// ... más validaciones
|
||||
|
||||
return { valid: errors.length === 0, errors };
|
||||
}
|
||||
```
|
||||
|
||||
### 3. **Sistema de Paginación Mejorado**
|
||||
**Mejora:** Crear componente reutilizable para paginación en todos los comandos.
|
||||
|
||||
```typescript
|
||||
// src/core/lib/pagination.ts
|
||||
export function paginate<T>(items: T[], page: number, perPage: number) {
|
||||
const totalPages = Math.max(1, Math.ceil(items.length / perPage));
|
||||
const safePage = Math.min(Math.max(1, page), totalPages);
|
||||
const start = (safePage - 1) * perPage;
|
||||
const end = start + perPage;
|
||||
|
||||
return {
|
||||
items: items.slice(start, end),
|
||||
page: safePage,
|
||||
totalPages,
|
||||
hasNext: safePage < totalPages,
|
||||
hasPrev: safePage > 1,
|
||||
total: items.length
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### 4. **Logs y Auditoría**
|
||||
**Mejora:** Añadir sistema de logs para operaciones importantes.
|
||||
|
||||
```typescript
|
||||
// prisma/schema.prisma
|
||||
model AuditLog {
|
||||
id String @id @default(cuid())
|
||||
userId String
|
||||
guildId String
|
||||
action String // "buy", "craft", "trade", "equip", etc.
|
||||
target String? // ID del item/mob/área afectado
|
||||
details Json? // detalles adicionales
|
||||
|
||||
user User @relation(fields: [userId], references: [id])
|
||||
guild Guild @relation(fields: [guildId], references: [id])
|
||||
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
@@index([userId, guildId])
|
||||
@@index([action])
|
||||
@@index([createdAt])
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Prioridades Recomendadas
|
||||
|
||||
### Alta Prioridad (Implementar Ya)
|
||||
1. ✅ **Comando de Tienda con DisplayComponents** (lo voy a crear)
|
||||
2. 🏆 **Sistema de Logros**
|
||||
3. 🎁 **Misiones Diarias**
|
||||
4. 🔥 **Sistema de Rachas**
|
||||
|
||||
### Media Prioridad (Próximos Sprints)
|
||||
5. 📊 **Estadísticas Detalladas**
|
||||
6. 🏘️ **Sistema de Clanes**
|
||||
7. 🎲 **Eventos Temporales**
|
||||
|
||||
### Baja Prioridad (Largo Plazo)
|
||||
8. 🔄 **Intercambio entre Jugadores**
|
||||
9. 🏠 **Sistema de Viviendas**
|
||||
10. 🎰 **Ruleta/Lotería**
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Mejoras de UX/UI
|
||||
|
||||
### 1. Mensajes más Visuales
|
||||
Usar más DisplayComponents en lugar de texto plano:
|
||||
- `!inventario` → DisplayComponents con imágenes
|
||||
- `!player` → DisplayComponents con stats visuales
|
||||
- `!tienda` → DisplayComponents con preview de items
|
||||
|
||||
### 2. Botones Interactivos
|
||||
Añadir botones en lugar de comandos:
|
||||
- `!mina` → Añadir botones "Minar Otra Vez", "Ver Inventario"
|
||||
- `!pelear` → Añadir botones "Pelear de Nuevo", "Equipar Mejor Arma"
|
||||
- `!tienda` → Añadir botones de compra directa
|
||||
|
||||
### 3. Confirmaciones
|
||||
Añadir confirmaciones para acciones importantes:
|
||||
- Comprar items caros
|
||||
- Fundir items
|
||||
- Eliminar items
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Conclusión
|
||||
|
||||
Tu bot tiene una **base excelente y muy completa**. Las sugerencias principales son:
|
||||
|
||||
1. **Más engagement:** Logros, misiones, rachas
|
||||
2. **Más social:** Clanes, trades, rankings
|
||||
3. **Más visual:** DisplayComponents en todos lados
|
||||
4. **Más feedback:** Stats, logs, notificaciones
|
||||
|
||||
Ahora voy a crear el **comando de tienda completo con DisplayComponents** 🚀
|
||||
Reference in New Issue
Block a user