📖 GUIDE ADMIN
← Console Admin

Guide Admin ElementaQuest

Manuel du créateur de contenu : ajouter cartes, monstres, lieux géographiques, événements et missions. Couvre aussi les réglages d'équilibrage en live et la gestion des comptes joueurs.

📖 Public visé Ce guide s'adresse aux administrateurs (rôle is_admin()=true). Les sections 1-5 traitent du contenu jouable. La 6 est le levier d'équilibrage. La 7 est l'outil support. La 8 dépanne les problèmes courants.

Introduction

Accès à la console admin

Connexion via ElementaQuest_Admin.html. La console n'est accessible qu'aux comptes ayant is_admin() = true. Pour octroyer le rôle admin à un nouveau compte :

insert into public.admin_users (user_id) values ('UUID-DU-USER');

Structure de la console

OngletUsage
📊 DashboardStats globales, derniers joueurs inscrits, activité live
📍 Géo-locationsLister/éditer les lieux disponibles pour la chasse
✦ ÉvénementsCréer/gérer Battle Royale et Boss Hunt
➕ CréerCréation rapide d'une nouvelle géo-location
👤 JoueursRecherche, reset, octroi de boosters/cartes
🃏 CatalogueCartes et monstres existants (read-only en V1)
📋 MissionsTemplates de missions quotidiennes/hebdo
⚙️ RéglagesConfig live (rates booster, paliers Expert, coûts tickets…)

1. Cartes

33 cartes au catalogue. Stockées dans la table public.cards. L'édition se fait actuellement en SQL ou via l'éditeur catalogue (V2 prévue). Voici la structure et les règles à respecter.

Schéma d'une carte

idtextrequis
Slug unique (snake_case, sans accent). Ex : flammes, vague_deferlante. Sert de clé étrangère partout.
nametextrequis
Nom affiché en jeu. Ex : "Vague Déferlante", "Phénix Renaissant".
typetextrequis
Élément de la carte. Valeurs autorisées : eau feu roc
cattextrequis
Catégorie. Valeurs : atk (attaque), def (défense), heal (soin pur), special (effets sans dégât direct)
valueintrequis
Valeur principale : pour atk = dégâts, pour def = bouclier, pour heal = PV récupérés, pour special selon l'effet.
raritytextrequis
Rareté. Valeurs : commun rare leg
effecttext · optionnel
Code d'effet (déclenche du JS dans le moteur de jeu). Voir tableau plus bas.
effectVal · effectDurint · optionnels
Paramètres d'effet (valeur appliquée + durée en tours). Selon l'effet.
descriptiontext
Texte affiché sur la carte (1 phrase courte). Ex : "Inflige 22 dégâts. +50% si l'adv. est de type Roc."

Effets supportés (moteur Phase C)

CodeDescriptionParams utilisés
pierceIgnore les boucliers de l'adversaire
shieldbreakDétruit le bouclier de l'adv (Nova Solaire)
lifestealInflige X dégâts + soigne effectVal au selfeffectVal
freezeGèle l'adversaire 1 tour (passe son tour)
boost+50% dégâts sur prochaine attaque (Surpuissance)
burnBrûlure : effectVal dégâts/tour pendant effectDureffectVal, effectDur
dotDoT : effectVal dégâts au tour suivant (Pluie Acide)effectVal, effectDur
heal_persistentSoin persistant : value PV/tour pendant effectDureffectDur
block_persistentBloque tous dégâts pendant effectDur (Citadelle)effectDur
reviveCharge passive : ressuscite à effectVal PV à la morteffectVal
fire_boostInflige value, +effectVal sur prochaine carte feuvalue, effectVal
cancelskillInflige value, annule prochaine compétence adv (Extinction)value
reflectBouclier value + renvoie effectVal en cas d'attaquevalue, effectVal
leg_water40 dég + 20 PV self + gel adv (Diluvium)
leg_maréevalue dég/tour ×effectDur + 5 PV/tour ×effectDurvalue, effectDur
⚠️ Triangle élémentaire Multiplicateurs hardcodés : eau bat feu (×1.5), feu bat roc (×1.5), roc bat eau (×1.5). Les autres = ×0.75 (faible) ou ×1.0 (neutre). Calcul basé sur le type du monstre attaquant, pas le type de la carte.

Limites & règles

Ajouter une nouvelle carte (SQL)

insert into public.cards (id, name, type, cat, value, rarity, effect, effectVal, effectDur, description)
values (
  'tornade',           -- id slug
  'Tornade',           -- name
  'eau',               -- type
  'atk',               -- cat
  18,                  -- value (dégâts)
  'rare',              -- rarity
  'freeze',            -- effect
  null, null,          -- effectVal, effectDur
  'Inflige 18 dégâts et gèle l''adversaire 1 tour.'
);
💡 Ajouter au pool des boosters Toute nouvelle carte est automatiquement disponible dans les boosters via son type et sa rarity. Pas de table booster_pool séparée.

2. Monstres

3 monstres × 3 variants = 9 entités. Stockés dans public.monsters. Chaque monstre a 1 compétence active.

Schéma

idtext
Slug. Ex : aquonix, pyrakos, terragor.
typetext
Élément (eau/feu/roc). Détermine les multiplicateurs en combat.
varianttext
Variante esthétique + PV : standard (100 PV), gold (120 PV), ultime (150 PV).
skill_name · skill_descriptiontext
Nom + description de la compétence active (utilisable 1× par match).
skill_effecttext
Code d'effet de la compétence. Mêmes codes que les cartes (voir tableau effets).
⚠️ Ajouter un nouveau monstre Insérer 3 lignes (1 par variant). Il faut aussi définir le starter deck dans la RPC give_starter_deck() si tu veux qu'il soit choisissable à l'inscription.

3. Géo-locations

Les lieux à découvrir. Stockés dans public.geo_locations. Création via l'onglet ➕ Créer de la console (recommandé) ou par SQL.

Schéma essentiel

nametextrequis
Nom du lieu. Ex : "Tour Eiffel", "Plage de Saleccia".
lat · lngdouble · requis
Coordonnées GPS. Précision : 5-6 décimales suffisent (~1m).
radius_kmint · default 50
Rayon de validation en mode normal. Plus le lieu est précis (ex : monument), plus le radius doit être petit (5-10 km). Pour une région floue, 50+ km.
monster_idtext
Monstre récompense (à découvrir au reveal). Optionnel.
card_reward_idtext
Carte récompense bonus. Optionnel.
hint · hint_2 · hint_3text
Indices progressifs (révélés à chaque essai raté). hint = vague, hint_3 = très précis.
tagstext[]
Tags pour filtrage (montagne, plage, monument, ville). Voir geo_tags.
🌍 Mode Expert vs normal En mode Expert, le radius_km du lieu est ignoré — c'est le réglage global geo.expert.validation_radius_km (défaut 80 km) qui s'applique à TOUS les lieux. Configurable dans ⚙️ Réglages.

Bon usage des indices

NiveauStyleExemple (Tour Eiffel)
hintVague, atmosphérique"Une dame de fer surveille la lumière."
hint_2Pays/région"Capitale de l'amour, en Europe."
hint_3Quartier/repère proche"À côté du Champ-de-Mars, 7e arrondissement."

4. Événements

Événements temporaires : Battle Royale ou Boss Hunt. Onglet ✦ Événements. Stockés dans public.geo_events.

Battle Royale (BR)

Tous les joueurs cherchent le même lieu sur une fenêtre de temps. Score final = distance la plus proche.

Boss Hunt (mode quiz)

Quiz 5 questions sur le lieu mystère. Réussite = découverte instantanée. Échec = cooldown configurable.

⚠️ Statut event Un event en status='draft' n'est pas visible des joueurs. Passer à active dès que les dates starts_at / ends_at sont définies. ended = clôturé, classement final calculé.

5. Missions

Missions quotidiennes (3) et hebdomadaires (2) tirées au hasard depuis mission_templates. Onglet 📋 Missions.

Triggers supportés

TriggerQuand ça incrémente ?
open_boosterOuverture d'un booster
complete_geo_sessionDécouverte d'un lieu (n'importe quel mode)
win_pvpVictoire PvP (ranked ou casual)
win_pvp_rankedVictoire ranked uniquement
win_expertSession Expert terminée (peu importe le tier)
recycle_cardRecyclage d'une carte
play_cardJouer une carte en combat (avec filtre type/rarity possible)

Récompenses

Définies dans le template (reward_type + reward_value). Les principales :

6. Réglages (game_config)

L'onglet ⚙️ Réglages permet de modifier en live ~30 paramètres d'équilibrage sans redéploiement. Les changements sont propagés au client au prochain refresh (cache 5 min côté Booster/GeoHunt).

Catégories disponibles

CatégorieQue contrôle ?
missionsNombre de missions/jour, points bonus weekend
boostersTaux de drop par booster (somme = 100), pity légendaire
geoPaliers Expert (max_attempts par tier), rayon validation Expert
pvpELO delta ranked, paliers milestone (boosters tous les N matchs)
combatHP par variant monstre, multiplicateurs élémentaires
ticketsCoûts échange de tickets, BR/Boss skip, retry, toggles échange de tickets

Validation automatique

💡 Reset par défaut Chaque ligne a un bouton ⟲ qui remet la valeur initiale (default_value). Pratique en cas de mauvais réglage. Le RPC est admin_reset_game_config.

7. Gestion joueurs

Onglet 👤 Joueurs. Recherche par username, email ou UUID.

Actions disponibles

ActionRPCEffet
Reset completadmin_reset_userVide cartes/boosters/decks/stats. Garde le compte et le profile.
Octroi boostergrant_boosterAjoute N boosters d'un type au joueur. (Pour compensation/bug.)
Reset startergive_starter_deckSi compte cassé : redonne le monstre starter + 4 boosters.
🚨 Reset utilisateur — irréversible Aucun rollback automatique. Avant un reset, copier le profil et l'inventaire dans un export CSV si tu veux pouvoir restaurer.

8. Dépannage

"Permission denied for function X"

La fonction est révoquée pour authenticated. Soit elle est interne (correct), soit elle a été oubliée par K2. Vérifier :

-- Liste des EXECUTE accordés
select grantee, routine_name, privilege_type
from information_schema.routine_privileges
where routine_schema = 'public' and routine_name = 'NOM_RPC';

Si besoin : grant execute on function public.NOM_RPC(...) to authenticated;

Trigger anti-leg ne fonctionne pas

Vérifier que trg_check_deck_leg_limit existe et utilise jsonb_array_elements_text() (pas unnest) pour parser card_ids. Voir SQL B4_fix_trigger.

Game_config non chargé en client

Le cache côté client est de 5 minutes. Pour forcer un refresh immédiat : vider window.__gameConfig dans la console du navigateur, puis rafraîchir la page.

// Dans la console DevTools du navigateur
window.__gameConfig = null;
location.reload();

Joueur bloqué dans une room PvP zombie

Lancer manuellement cleanup_zombie_rooms() ou attendre le job auto (toutes les 10 min). Sinon, fermer la room directement :

update public.match_rooms
  set status = 'ended', ended_at = now()
where id = 'UUID-ROOM' and status in ('waiting','playing');

Ouverture booster sans cartes ajoutées

Vérifier que le tirage côté client (Booster.html) appelle bien onBoosterOpened() à la fin (qui décrémente user_boosters + insert dans user_cards). Si seulement le visuel a fonctionné mais pas la DB, refaire un tirage. La V2 prévoit de déplacer cette logique côté serveur (RPC open_booster) pour éviter ces désynchros — voir K2 dans la roadmap.

📞 Support Pour tout problème non listé, ouvrir un ticket avec : (1) UUID du joueur concerné, (2) timestamp précis du bug, (3) capture de la console DevTools si erreur visible.