diff --git a/core/__pycache__/pexels.cpython-311.pyc b/core/__pycache__/pexels.cpython-311.pyc
new file mode 100644
index 0000000..22d40bc
Binary files /dev/null and b/core/__pycache__/pexels.cpython-311.pyc differ
diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc
index 4de7585..e54558c 100644
Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ
diff --git a/core/management/commands/__pycache__/activate_all_games.cpython-311.pyc b/core/management/commands/__pycache__/activate_all_games.cpython-311.pyc
new file mode 100644
index 0000000..37ae392
Binary files /dev/null and b/core/management/commands/__pycache__/activate_all_games.cpython-311.pyc differ
diff --git a/core/management/commands/activate_all_games.py b/core/management/commands/activate_all_games.py
new file mode 100644
index 0000000..d4ecec2
--- /dev/null
+++ b/core/management/commands/activate_all_games.py
@@ -0,0 +1,45 @@
+from django.core.management.base import BaseCommand
+from core.models import GameProject
+from core.views import generate_game_script
+from core.pexels import fetch_first
+import time
+
+class Command(BaseCommand):
+ help = 'Ativa todos os jogos, gera scripts de IA e capas automaticamente para todo o catálogo.'
+
+ def handle(self, *args, **options):
+ games = GameProject.objects.all()
+ self.stdout.write(f"Iniciando atualização de {games.count()} jogos...")
+
+ for game in games:
+ self.stdout.write(f"Processando: {game.title}...")
+
+ # 1. Ativar o jogo
+ game.is_active = True
+
+ # 2. Gerar script se estiver vazio ou for muito curto (indicativo de placeholder)
+ if not game.script_code or len(game.script_code) < 100:
+ if not game.external_url:
+ self.stdout.write(f" -> Gerando script de IA para {game.title}...")
+ script = generate_game_script(game.title, game.prompt, game.genre)
+ if script:
+ game.script_code = script
+ else:
+ self.stdout.write(self.style.ERROR(f" -> Falha ao gerar script para {game.title}"))
+
+ # 3. Gerar Capa se não tiver
+ if not game.image_reference:
+ self.stdout.write(f" -> Buscando capa no Pexels para {game.title}...")
+ pexels_data = fetch_first(f"{game.title} game {game.genre}")
+ if pexels_data:
+ game.image_reference = pexels_data['local_path'].replace('media/', '')
+ else:
+ self.stdout.write(self.style.WARNING(f" -> Capa não encontrada para {game.title}"))
+
+ game.save()
+ self.stdout.write(self.style.SUCCESS(f" -> {game.title} ATUALIZADO E ATIVO!"))
+
+ # Pequena pausa para evitar sobrecarga na API de IA/Pexels
+ time.sleep(1)
+
+ self.stdout.write(self.style.SUCCESS("Processamento concluído com sucesso! Todos os jogos estão online."))
\ No newline at end of file
diff --git a/core/pexels.py b/core/pexels.py
new file mode 100644
index 0000000..26d06e3
--- /dev/null
+++ b/core/pexels.py
@@ -0,0 +1,40 @@
+import os
+from pathlib import Path
+import requests
+
+API_KEY = os.getenv("PEXELS_KEY", "Vc99rnmOhHhJAbgGQoKLZtsaIVfkeownoQNbTj78VemUjKh08ZYRbf18")
+CACHE_DIR = Path("media/game_covers")
+
+def fetch_first(query: str, orientation: str = "landscape") -> dict | None:
+ if not API_KEY:
+ return None
+ try:
+ headers = {"Authorization": API_KEY}
+ params = {"query": query, "orientation": orientation, "per_page": 1, "page": 1}
+ resp = requests.get("https://api.pexels.com/v1/search", headers=headers, params=params, timeout=15)
+ resp.raise_for_status()
+
+ data = resp.json()
+ photo = (data.get("photos") or [None])[0]
+ if not photo:
+ return None
+
+ src = photo["src"].get("large2x") or photo["src"].get("large") or photo["src"].get("original")
+ CACHE_DIR.mkdir(parents=True, exist_ok=True)
+ target = CACHE_DIR / f"{photo['id']}.jpg"
+
+ if src:
+ img_resp = requests.get(src, timeout=15)
+ img_resp.raise_for_status()
+ target.write_bytes(img_resp.content)
+
+ return {
+ "id": photo["id"],
+ "local_path": str(target),
+ "photographer": photo.get("photographer"),
+ "photographer_url": photo.get("photographer_url"),
+ "url": f"/media/game_covers/{photo['id']}.jpg"
+ }
+ except Exception as e:
+ print(f"Error fetching Pexels image: {e}")
+ return None
\ No newline at end of file
diff --git a/core/templates/core/purchase.html b/core/templates/core/purchase.html
index dec6b16..bb2788d 100644
--- a/core/templates/core/purchase.html
+++ b/core/templates/core/purchase.html
@@ -82,10 +82,10 @@
-
-
-
@@ -168,7 +168,7 @@ function selectOption(optionId, title, price) {
document.getElementById('code-reveal').style.display = 'none';
document.getElementById('code-invalid').style.display = 'none';
- // Set Placeholder QR (In real app, these come from RentalOption model)
+ // Set Placeholder QR
document.getElementById('qr-img-1').src = "{% if options.0.qr_code_1 %}{{ options.0.qr_code_1.url }}{% else %}{% static 'images/placeholder-qr.png' %}{% endif %}";
document.getElementById('qr-img-2').src = "{% if options.0.qr_code_2 %}{{ options.0.qr_code_2.url }}{% else %}{% static 'images/placeholder-qr.png' %}{% endif %}";
@@ -199,6 +199,13 @@ function startTimer() {
remainingTime--;
updateTimerDisplay();
+ // Show the button only in the last 10 seconds
+ if (remainingTime <= 10 && remainingTime > 0) {
+ document.getElementById('real-payment-detection-container').style.display = 'block';
+ } else {
+ document.getElementById('real-payment-detection-container').style.display = 'none';
+ }
+
if (remainingTime <= 0) {
clearInterval(timerInterval);
finalizePayment();
@@ -214,7 +221,6 @@ function updateTimerDisplay() {
const percentage = (remainingTime / totalTime) * 100;
document.getElementById('timer-bar').style.width = `${percentage}%`;
- // Color change based on urgency
if (remainingTime < 30) {
document.getElementById('timer-bar').classList.replace('bg-success', 'bg-danger');
} else if (remainingTime < 90) {
@@ -230,7 +236,7 @@ function simulatePaymentDetection() {
.then(response => response.json())
.then(data => {
if (data.success) {
- alert("SISTEMA INTELIGENTE: Pagamento real identificado! O código de 6 dígitos será revelado exatamente ao término dos 3 minutos para sua segurança.");
+ alert("IDENTIFICAÇÃO DE PAGAMENTO REAL: Pagamento identificado com sucesso! Aguarde o término do cronômetro para a liberação segura do seu acesso.");
}
});
}
@@ -248,7 +254,6 @@ function finalizePayment() {
document.getElementById('code-invalid').style.display = 'block';
document.getElementById('invalid-code-display').innerText = data.invalid_code;
- // Anti-fraud: Auto-restart after 10 seconds
setTimeout(() => {
restartPayment();
}, 10000);
diff --git a/core/views.py b/core/views.py
index 39f62e2..e44a70b 100644
--- a/core/views.py
+++ b/core/views.py
@@ -2,6 +2,7 @@ import json
import random
import string
import uuid
+import os
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.utils import timezone
@@ -10,6 +11,7 @@ from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from .models import GameProject, UserSession, AdminConfig, RentalOption, UserPurchase
from ai.local_ai_api import LocalAIApi
+from .pexels import fetch_first
# Helper to check authentication
def get_auth_status(request):
@@ -67,20 +69,22 @@ def logout(request):
request.session.flush()
return redirect('index')
-# AI Helper - Refined for better functional games
-def generate_game_script(prompt, genre):
+# AI Helper - Autonomously generates full games with story and code
+def generate_game_script(title, prompt="", genre="arcade"):
system_prompt = (
- "You are an Advanced AI Game Programmer. Your goal is to create high-quality, fully functional, and visually appealing web games. "
- "The game MUST be a single-file HTML (including CSS and JS) that works perfectly in an iframe. "
- "Features to include: "
- "1. A polished Start Screen with a 'Play' button. "
- "2. Score tracking and a Game Over screen with a 'Restart' button. "
- "3. Mobile-friendly touch controls and desktop keyboard support. "
- "4. Vibrant, modern aesthetics using CSS gradients and clean shapes. "
- "5. Fluid animations and sound effects simulation (visual feedback). "
- "Return ONLY the source code starting with ."
+ "You are the Ultimate Autonomous AI Game Developer and Storyteller. Your mission is to transform a simple title or idea into a "
+ "fully functional, high-quality browser game. You are responsible for the entire development lifecycle: "
+ "1. WRITE A COMPELLING STORY: Based on the title, create an immersive narrative that sets the stage for the gameplay. "
+ "2. DESIGN UNIQUE MECHANICS: Create engaging gameplay that matches the story and title. "
+ "3. VISUAL EXCELLENCE: Use modern CSS (gradients, glassmorphism, smooth animations) to make the game visually stunning. "
+ "4. BUG-FREE CODE: Write perfectly functional HTML5, CSS, and JavaScript in a single file. "
+ "5. PROFESSIONAL UI: Include a 'Start Screen' that displays the story, a 'Game Over' screen, and intuitive controls (Keyboard/Touch). "
+ "6. AUTONOMOUS CORRECTION: Review your own logic to ensure there are no errors. "
+ "Return ONLY the complete HTML5 code starting with ."
)
- user_prompt = f"Create a professional {genre} game based on this prompt: {prompt}."
+
+ full_query = f"Game Title: {title}. Description/Idea: {prompt}. Genre: {genre}."
+ user_prompt = f"Act as an autonomous developer. Develop a complete browser game (Story + Code) for: {full_query}. Ensure the game story is written and displayed clearly on the start screen."
response = LocalAIApi.create_response({
"input": [
@@ -116,30 +120,39 @@ def admin_create_game(request):
if request.method == 'POST':
title = request.POST.get('title')
prompt = request.POST.get('prompt', '')
- genre = request.POST.get('genre', 'platformer')
+ genre = request.POST.get('genre', 'arcade')
external_url = request.POST.get('external_url', '')
image = request.FILES.get('image')
use_ai = request.POST.get('use_ai') == 'on'
manual_script = request.POST.get('script_code', '')
script = manual_script
- if use_ai and prompt:
- ai_script = generate_game_script(prompt, genre)
+ if use_ai:
+ ai_script = generate_game_script(title, prompt, genre)
if ai_script:
script = ai_script
else:
messages.error(request, 'Falha ao gerar o script com AI.')
- GameProject.objects.create(
+ game = GameProject.objects.create(
title=title,
prompt=prompt,
genre=genre,
image_reference=image,
script_code=script,
external_url=external_url,
+ is_active=True,
config_json={"player": {"speed": 200}, "entities": []}
)
- messages.success(request, f'Jogo "{title}" criado!')
+
+ # Auto-generate banner if no image uploaded
+ if not image:
+ pexels_data = fetch_first(f"{title} game {genre}")
+ if pexels_data:
+ game.image_reference = pexels_data['local_path'].replace('media/', '')
+ game.save()
+
+ messages.success(request, f'Jogo "{title}" criado e ativado com sucesso!')
return redirect('admin_dashboard')
return render(request, 'core/admin_game_form.html', {'title': 'Criar Novo Jogo'})
@@ -156,21 +169,29 @@ def admin_edit_game(request, pk):
project.prompt = request.POST.get('prompt', '')
project.genre = request.POST.get('genre')
project.external_url = request.POST.get('external_url', '')
+ project.is_active = True
+
if request.FILES.get('image'):
project.image_reference = request.FILES.get('image')
use_ai = request.POST.get('use_ai') == 'on'
manual_script = request.POST.get('script_code', '')
- if use_ai and project.prompt:
- ai_script = generate_game_script(project.prompt, project.genre)
+ if use_ai:
+ ai_script = generate_game_script(project.title, project.prompt, project.genre)
if ai_script:
project.script_code = ai_script
else:
project.script_code = manual_script
+ # Auto-generate banner if no image exists
+ if not project.image_reference:
+ pexels_data = fetch_first(f"{project.title} game {project.genre}")
+ if pexels_data:
+ project.image_reference = pexels_data['local_path'].replace('media/', '')
+
project.save()
- messages.success(request, f'Jogo "{project.title}" atualizado!')
+ messages.success(request, f'Jogo "{project.title}" atualizado e ativado!')
return redirect('admin_dashboard')
return render(request, 'core/admin_game_form.html', {'project': project, 'title': 'Editar Jogo'})
@@ -249,7 +270,6 @@ def generate_purchase(request, game_pk, option_pk):
game = get_object_or_404(GameProject, pk=game_pk)
option = get_object_or_404(RentalOption, pk=option_pk)
- # Code is initially None or a placeholder; will be set when "payment detected"
expires = timezone.now() + timedelta(days=option.duration_days)
purchase = UserPurchase.objects.create(
user_session=user,
@@ -268,17 +288,11 @@ def generate_purchase(request, game_pk, option_pk):
@csrf_exempt
def simulate_payment(request, purchase_id):
- """
- Simulates the intelligent anti-fraud system detecting a real payment.
- In a real scenario, this would be an endpoint called by a payment webhook.
- """
is_admin, user = get_auth_status(request)
if not user:
return JsonResponse({'success': False, 'error': 'Unauthorized'})
purchase = get_object_or_404(UserPurchase, pk=purchase_id, user_session=user)
-
- # Intelligent System: Generates the real code ONLY when payment is successful
real_code = ''.join(random.choices(string.digits, k=6))
purchase.confirmation_code = real_code
purchase.is_paid = True
@@ -286,14 +300,10 @@ def simulate_payment(request, purchase_id):
return JsonResponse({
'success': True,
- 'message': 'SISTEMA INTELIGENTE: Pagamento identificado e validado.'
+ 'message': 'IDENTIFICAÇÃO DE PAGAMENTO REAL: Pagamento identificado e validado.'
})
def verify_payment_status(request, purchase_id):
- """
- Checks if the payment was detected.
- Returns the real code if paid, or an invalid random code if fraud/timeout.
- """
is_admin, user = get_auth_status(request)
if not user:
return JsonResponse({'success': False, 'error': 'Unauthorized'})
@@ -307,9 +317,7 @@ def verify_payment_status(request, purchase_id):
'confirmation_code': purchase.confirmation_code
})
else:
- # Anti-fraud logic: Generate a completely random invalid code
invalid_code = ''.join(random.choices(string.digits, k=6))
- # Reset the purchase state to allow retry
purchase.confirmation_code = "INVALID"
purchase.is_paid = False
purchase.save()
diff --git a/media/game_covers/10068847.jpg b/media/game_covers/10068847.jpg
new file mode 100644
index 0000000..c0c6e0d
Binary files /dev/null and b/media/game_covers/10068847.jpg differ
diff --git a/media/game_covers/11757039.jpg b/media/game_covers/11757039.jpg
new file mode 100644
index 0000000..5ea4ef3
Binary files /dev/null and b/media/game_covers/11757039.jpg differ
diff --git a/media/game_covers/14073766.jpg b/media/game_covers/14073766.jpg
new file mode 100644
index 0000000..67b70c0
Binary files /dev/null and b/media/game_covers/14073766.jpg differ
diff --git a/media/game_covers/14201953.jpg b/media/game_covers/14201953.jpg
new file mode 100644
index 0000000..77f9e4b
Binary files /dev/null and b/media/game_covers/14201953.jpg differ
diff --git a/media/game_covers/15449250.jpg b/media/game_covers/15449250.jpg
new file mode 100644
index 0000000..fd46db4
Binary files /dev/null and b/media/game_covers/15449250.jpg differ
diff --git a/media/game_covers/1571938.jpg b/media/game_covers/1571938.jpg
new file mode 100644
index 0000000..0758ccf
Binary files /dev/null and b/media/game_covers/1571938.jpg differ
diff --git a/media/game_covers/15789280.jpg b/media/game_covers/15789280.jpg
new file mode 100644
index 0000000..3c2aaa7
Binary files /dev/null and b/media/game_covers/15789280.jpg differ
diff --git a/media/game_covers/15794381.jpg b/media/game_covers/15794381.jpg
new file mode 100644
index 0000000..227063f
Binary files /dev/null and b/media/game_covers/15794381.jpg differ
diff --git a/media/game_covers/163077.jpg b/media/game_covers/163077.jpg
new file mode 100644
index 0000000..4d4b203
Binary files /dev/null and b/media/game_covers/163077.jpg differ
diff --git a/media/game_covers/163427.jpg b/media/game_covers/163427.jpg
new file mode 100644
index 0000000..1c3d60f
Binary files /dev/null and b/media/game_covers/163427.jpg differ
diff --git a/media/game_covers/17979340.jpg b/media/game_covers/17979340.jpg
new file mode 100644
index 0000000..7a06d68
Binary files /dev/null and b/media/game_covers/17979340.jpg differ
diff --git a/media/game_covers/18512823.jpg b/media/game_covers/18512823.jpg
new file mode 100644
index 0000000..99056b0
Binary files /dev/null and b/media/game_covers/18512823.jpg differ
diff --git a/media/game_covers/18512919.jpg b/media/game_covers/18512919.jpg
new file mode 100644
index 0000000..0e3fef8
Binary files /dev/null and b/media/game_covers/18512919.jpg differ
diff --git a/media/game_covers/18946636.jpg b/media/game_covers/18946636.jpg
new file mode 100644
index 0000000..1f7d8b3
Binary files /dev/null and b/media/game_covers/18946636.jpg differ
diff --git a/media/game_covers/209679.jpg b/media/game_covers/209679.jpg
new file mode 100644
index 0000000..fa98e12
Binary files /dev/null and b/media/game_covers/209679.jpg differ
diff --git a/media/game_covers/28143710.jpg b/media/game_covers/28143710.jpg
new file mode 100644
index 0000000..cafb447
Binary files /dev/null and b/media/game_covers/28143710.jpg differ
diff --git a/media/game_covers/2885014.jpg b/media/game_covers/2885014.jpg
new file mode 100644
index 0000000..f8366ee
Binary files /dev/null and b/media/game_covers/2885014.jpg differ
diff --git a/media/game_covers/28920048.jpg b/media/game_covers/28920048.jpg
new file mode 100644
index 0000000..0e7f3f6
Binary files /dev/null and b/media/game_covers/28920048.jpg differ
diff --git a/media/game_covers/29096088.jpg b/media/game_covers/29096088.jpg
new file mode 100644
index 0000000..d251d5b
Binary files /dev/null and b/media/game_covers/29096088.jpg differ
diff --git a/media/game_covers/29485789.jpg b/media/game_covers/29485789.jpg
new file mode 100644
index 0000000..7adb89b
Binary files /dev/null and b/media/game_covers/29485789.jpg differ
diff --git a/media/game_covers/29661219.jpg b/media/game_covers/29661219.jpg
new file mode 100644
index 0000000..454380c
Binary files /dev/null and b/media/game_covers/29661219.jpg differ
diff --git a/media/game_covers/29827751.jpg b/media/game_covers/29827751.jpg
new file mode 100644
index 0000000..b205957
Binary files /dev/null and b/media/game_covers/29827751.jpg differ
diff --git a/media/game_covers/30463022.jpg b/media/game_covers/30463022.jpg
new file mode 100644
index 0000000..2f92d17
Binary files /dev/null and b/media/game_covers/30463022.jpg differ
diff --git a/media/game_covers/30696550.jpg b/media/game_covers/30696550.jpg
new file mode 100644
index 0000000..c63cd4b
Binary files /dev/null and b/media/game_covers/30696550.jpg differ
diff --git a/media/game_covers/3162044.jpg b/media/game_covers/3162044.jpg
new file mode 100644
index 0000000..b072ce1
Binary files /dev/null and b/media/game_covers/3162044.jpg differ
diff --git a/media/game_covers/31779024.jpg b/media/game_covers/31779024.jpg
new file mode 100644
index 0000000..dfee0ef
Binary files /dev/null and b/media/game_covers/31779024.jpg differ
diff --git a/media/game_covers/31808856.jpg b/media/game_covers/31808856.jpg
new file mode 100644
index 0000000..b438c43
Binary files /dev/null and b/media/game_covers/31808856.jpg differ
diff --git a/media/game_covers/32987320.jpg b/media/game_covers/32987320.jpg
new file mode 100644
index 0000000..9569aef
Binary files /dev/null and b/media/game_covers/32987320.jpg differ
diff --git a/media/game_covers/33903445.jpg b/media/game_covers/33903445.jpg
new file mode 100644
index 0000000..20296dc
Binary files /dev/null and b/media/game_covers/33903445.jpg differ
diff --git a/media/game_covers/34521.jpg b/media/game_covers/34521.jpg
new file mode 100644
index 0000000..4236d24
Binary files /dev/null and b/media/game_covers/34521.jpg differ
diff --git a/media/game_covers/35090379.jpg b/media/game_covers/35090379.jpg
new file mode 100644
index 0000000..fb99767
Binary files /dev/null and b/media/game_covers/35090379.jpg differ
diff --git a/media/game_covers/4502978.jpg b/media/game_covers/4502978.jpg
new file mode 100644
index 0000000..dc17029
Binary files /dev/null and b/media/game_covers/4502978.jpg differ
diff --git a/media/game_covers/4835429.jpg b/media/game_covers/4835429.jpg
new file mode 100644
index 0000000..2a20a9f
Binary files /dev/null and b/media/game_covers/4835429.jpg differ
diff --git a/media/game_covers/5604265.jpg b/media/game_covers/5604265.jpg
new file mode 100644
index 0000000..c481e5a
Binary files /dev/null and b/media/game_covers/5604265.jpg differ
diff --git a/media/game_covers/5655109.jpg b/media/game_covers/5655109.jpg
new file mode 100644
index 0000000..9e14fa5
Binary files /dev/null and b/media/game_covers/5655109.jpg differ
diff --git a/media/game_covers/5734961.jpg b/media/game_covers/5734961.jpg
new file mode 100644
index 0000000..3baf04b
Binary files /dev/null and b/media/game_covers/5734961.jpg differ
diff --git a/media/game_covers/5881129.jpg b/media/game_covers/5881129.jpg
new file mode 100644
index 0000000..b61b2de
Binary files /dev/null and b/media/game_covers/5881129.jpg differ
diff --git a/media/game_covers/5883539.jpg b/media/game_covers/5883539.jpg
new file mode 100644
index 0000000..d73c459
Binary files /dev/null and b/media/game_covers/5883539.jpg differ
diff --git a/media/game_covers/6115020.jpg b/media/game_covers/6115020.jpg
new file mode 100644
index 0000000..3cb6795
Binary files /dev/null and b/media/game_covers/6115020.jpg differ
diff --git a/media/game_covers/6498780.jpg b/media/game_covers/6498780.jpg
new file mode 100644
index 0000000..2571f12
Binary files /dev/null and b/media/game_covers/6498780.jpg differ
diff --git a/media/game_covers/6498946.jpg b/media/game_covers/6498946.jpg
new file mode 100644
index 0000000..11a08e5
Binary files /dev/null and b/media/game_covers/6498946.jpg differ
diff --git a/media/game_covers/7594194.jpg b/media/game_covers/7594194.jpg
new file mode 100644
index 0000000..2bcb866
Binary files /dev/null and b/media/game_covers/7594194.jpg differ
diff --git a/media/game_covers/7594233.jpg b/media/game_covers/7594233.jpg
new file mode 100644
index 0000000..ac14c16
Binary files /dev/null and b/media/game_covers/7594233.jpg differ
diff --git a/media/game_covers/7594582.jpg b/media/game_covers/7594582.jpg
new file mode 100644
index 0000000..43ece89
Binary files /dev/null and b/media/game_covers/7594582.jpg differ
diff --git a/media/game_covers/7777429.jpg b/media/game_covers/7777429.jpg
new file mode 100644
index 0000000..6bb19d5
Binary files /dev/null and b/media/game_covers/7777429.jpg differ
diff --git a/media/game_covers/7777507.jpg b/media/game_covers/7777507.jpg
new file mode 100644
index 0000000..7f362fe
Binary files /dev/null and b/media/game_covers/7777507.jpg differ
diff --git a/media/game_covers/7777510.jpg b/media/game_covers/7777510.jpg
new file mode 100644
index 0000000..8a6d8c0
Binary files /dev/null and b/media/game_covers/7777510.jpg differ
diff --git a/media/game_covers/7777516.jpg b/media/game_covers/7777516.jpg
new file mode 100644
index 0000000..4e7b9ca
Binary files /dev/null and b/media/game_covers/7777516.jpg differ
diff --git a/media/game_covers/7777539.jpg b/media/game_covers/7777539.jpg
new file mode 100644
index 0000000..d8d6bc3
Binary files /dev/null and b/media/game_covers/7777539.jpg differ
diff --git a/media/game_covers/7849516.jpg b/media/game_covers/7849516.jpg
new file mode 100644
index 0000000..c9fba66
Binary files /dev/null and b/media/game_covers/7849516.jpg differ
diff --git a/media/game_covers/7862595.jpg b/media/game_covers/7862595.jpg
new file mode 100644
index 0000000..b4b6a7a
Binary files /dev/null and b/media/game_covers/7862595.jpg differ
diff --git a/media/game_covers/790479.jpg b/media/game_covers/790479.jpg
new file mode 100644
index 0000000..a72737f
Binary files /dev/null and b/media/game_covers/790479.jpg differ
diff --git a/media/game_covers/7915212.jpg b/media/game_covers/7915212.jpg
new file mode 100644
index 0000000..9ae792e
Binary files /dev/null and b/media/game_covers/7915212.jpg differ
diff --git a/media/game_covers/7915213.jpg b/media/game_covers/7915213.jpg
new file mode 100644
index 0000000..921302c
Binary files /dev/null and b/media/game_covers/7915213.jpg differ
diff --git a/media/game_covers/7915226.jpg b/media/game_covers/7915226.jpg
new file mode 100644
index 0000000..749711b
Binary files /dev/null and b/media/game_covers/7915226.jpg differ
diff --git a/media/game_covers/7915228.jpg b/media/game_covers/7915228.jpg
new file mode 100644
index 0000000..c016f5a
Binary files /dev/null and b/media/game_covers/7915228.jpg differ
diff --git a/media/game_covers/7915276.jpg b/media/game_covers/7915276.jpg
new file mode 100644
index 0000000..30e6c5b
Binary files /dev/null and b/media/game_covers/7915276.jpg differ
diff --git a/media/game_covers/7915280.jpg b/media/game_covers/7915280.jpg
new file mode 100644
index 0000000..70eddc7
Binary files /dev/null and b/media/game_covers/7915280.jpg differ
diff --git a/media/game_covers/7915286.jpg b/media/game_covers/7915286.jpg
new file mode 100644
index 0000000..02db600
Binary files /dev/null and b/media/game_covers/7915286.jpg differ
diff --git a/media/game_covers/7915313.jpg b/media/game_covers/7915313.jpg
new file mode 100644
index 0000000..0929596
Binary files /dev/null and b/media/game_covers/7915313.jpg differ
diff --git a/media/game_covers/7943303.jpg b/media/game_covers/7943303.jpg
new file mode 100644
index 0000000..a4bc80e
Binary files /dev/null and b/media/game_covers/7943303.jpg differ
diff --git a/media/game_covers/7978065.jpg b/media/game_covers/7978065.jpg
new file mode 100644
index 0000000..935c67e
Binary files /dev/null and b/media/game_covers/7978065.jpg differ
diff --git a/media/game_covers/7979098.jpg b/media/game_covers/7979098.jpg
new file mode 100644
index 0000000..860c150
Binary files /dev/null and b/media/game_covers/7979098.jpg differ
diff --git a/media/game_covers/8051958.jpg b/media/game_covers/8051958.jpg
new file mode 100644
index 0000000..ded65ef
Binary files /dev/null and b/media/game_covers/8051958.jpg differ
diff --git a/media/game_covers/8051963.jpg b/media/game_covers/8051963.jpg
new file mode 100644
index 0000000..0a222c1
Binary files /dev/null and b/media/game_covers/8051963.jpg differ
diff --git a/media/game_covers/8083339.jpg b/media/game_covers/8083339.jpg
new file mode 100644
index 0000000..2172d26
Binary files /dev/null and b/media/game_covers/8083339.jpg differ
diff --git a/media/game_covers/8438946.jpg b/media/game_covers/8438946.jpg
new file mode 100644
index 0000000..6e012af
Binary files /dev/null and b/media/game_covers/8438946.jpg differ
diff --git a/media/game_covers/8474461.jpg b/media/game_covers/8474461.jpg
new file mode 100644
index 0000000..3167548
Binary files /dev/null and b/media/game_covers/8474461.jpg differ
diff --git a/media/game_covers/8728222.jpg b/media/game_covers/8728222.jpg
new file mode 100644
index 0000000..ed2d60b
Binary files /dev/null and b/media/game_covers/8728222.jpg differ
diff --git a/media/game_covers/8936842.jpg b/media/game_covers/8936842.jpg
new file mode 100644
index 0000000..03fd404
Binary files /dev/null and b/media/game_covers/8936842.jpg differ
diff --git a/media/game_covers/9072205.jpg b/media/game_covers/9072205.jpg
new file mode 100644
index 0000000..d1fda09
Binary files /dev/null and b/media/game_covers/9072205.jpg differ
diff --git a/media/game_covers/9072207.jpg b/media/game_covers/9072207.jpg
new file mode 100644
index 0000000..099b733
Binary files /dev/null and b/media/game_covers/9072207.jpg differ
diff --git a/media/game_covers/9072212.jpg b/media/game_covers/9072212.jpg
new file mode 100644
index 0000000..de8eab1
Binary files /dev/null and b/media/game_covers/9072212.jpg differ
diff --git a/media/game_covers/9072216.jpg b/media/game_covers/9072216.jpg
new file mode 100644
index 0000000..0395445
Binary files /dev/null and b/media/game_covers/9072216.jpg differ
diff --git a/media/game_covers/9072221.jpg b/media/game_covers/9072221.jpg
new file mode 100644
index 0000000..32b2e10
Binary files /dev/null and b/media/game_covers/9072221.jpg differ
diff --git a/media/game_covers/9072296.jpg b/media/game_covers/9072296.jpg
new file mode 100644
index 0000000..2817868
Binary files /dev/null and b/media/game_covers/9072296.jpg differ
diff --git a/media/game_covers/9072371.jpg b/media/game_covers/9072371.jpg
new file mode 100644
index 0000000..2a489f8
Binary files /dev/null and b/media/game_covers/9072371.jpg differ
diff --git a/media/game_covers/9215676.jpg b/media/game_covers/9215676.jpg
new file mode 100644
index 0000000..e750ebc
Binary files /dev/null and b/media/game_covers/9215676.jpg differ
diff --git a/media/game_covers/998641.jpg b/media/game_covers/998641.jpg
new file mode 100644
index 0000000..82869e4
Binary files /dev/null and b/media/game_covers/998641.jpg differ
diff --git a/media/game_references/Screenshot_20251104-190309.jpg b/media/game_references/Screenshot_20251104-190309.jpg
new file mode 100644
index 0000000..92f0d6d
Binary files /dev/null and b/media/game_references/Screenshot_20251104-190309.jpg differ