import db def apply_variable_action(slug, action): """Exécute au moment du clic (mode jouable) une action "modifier_variable" — même logique/vocabulaire d'opérations que apply_data_action.py (DATA_OPERATIONS), appliqué à une variable globale (une seule valeur pour tout le jeu) plutôt qu'au champ d'une ligne d'objet.""" var_name = action.get("target_variable") operation = action.get("data_operation") raw_value = action.get("data_value") if not (var_name and operation): return False variable = db.get_global_variable(slug, var_name) if not variable: return False var_type = variable["type"] current = variable.get("value") if var_type in ("nombre_entier", "nombre_decimal"): try: current = float(current) if current not in (None, "") else 0 except (TypeError, ValueError): current = 0 elif var_type == "booleen": current = 1 if str(current).strip().lower() in ("1", "true", "vrai") else 0 if operation == "definir_texte": new_value = raw_value or "" elif operation == "definir_nombre": try: new_value = float(raw_value) if var_type == "nombre_decimal" else int(float(raw_value)) except (TypeError, ValueError): new_value = 0 elif operation == "definir_bool_vrai": new_value = 1 elif operation == "definir_bool_faux": new_value = 0 elif operation == "basculer_bool": new_value = 0 if current else 1 elif operation in ("incrementer", "decrementer"): try: amount = float(raw_value) if raw_value not in (None, "") else 0 except (TypeError, ValueError): amount = 0 if operation == "decrementer": amount = -amount result = (current or 0) + amount new_value = result if var_type == "nombre_decimal" else int(result) else: return False return db.update_global_variable_value(slug, var_name, new_value)