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