Adversator – Free Browser-Based Online MOBA Game

What is Adversator?

Adversator is a real-time free-to-play multiplayer online battle arena (MOBA) game that runs directly in your web browser using WebGL technology. Unlike traditional MOBAs that require downloads, Adversator offers instant gameplay with no installation required.

Game Features

  • Cross-Platform Play - Play on PC browsers or mobile devices
  • Real-Time PvP Battles - 5v5 competitive matches
  • Unique Hero Roster - Multiple characters with special abilities
  • Ranking System - Competitive ladder and matchmaking
  • Free to Play - No subscriptions or pay-to-win mechanics
  • Regular Updates - New heroes, maps, and game modes added frequently

How to Play Adversator

Simply visit our website using a modern browser (Chrome, Firefox, Edge) and start playing immediately. The game loads directly in your browser with no downloads required. Create an account to track your stats, rank, and unlock achievements.

MOBA Gaming Community

Join thousands of players in our growing MOBA community. Adversator combines the strategic depth of games like League of Legends and Dota 2 with the accessibility of browser-based gaming.

Browser Gaming Technology

Built with Unity WebGL, Adversator showcases the power of modern browser gaming. Experience smooth gameplay and high-quality graphics without installing any software.

Frequently Asked Questions

Is Adversator really free?

Yes, Adversator is completely free to play. We support the game through optional subscriptions and non-intrusive advertisements.

What browsers are supported?

Chrome, Firefox, Edge, and Safari (latest versions). WebGL must be enabled.

Can I play on mobile?

Yes! Adversator has a dedicated mobile version available through our mobile platform selector.

How does Adversator compare to other MOBAs?

Adversator offers faster match times (15-20 minutes), simplified controls for browser play, and instant access without downloads.

Gaming Categories

Adversator falls into several gaming categories: MOBA, Action Strategy, Multiplayer Online Games, Browser Games, Free-to-Play Games, and Competitive Esports.

`); document.close(); // Stop everything else window.stop?.(); throw new Error("Duplicate Adversator tab"); } AntiLeave(); function AntiLeave() { window.addEventListener('beforeunload', (event) => { event.returnValue = "Are you sure you want to leave?"; }); } var fs = document.getElementById('btnFS'); fs.addEventListener('click', goFullScreen); function goFullScreen() { var fullscreenElement = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement; if(fullscreenElement){ exitFullscreen(); }else { launchIntoFullscreen(document.getElementById('container')); } } // From https://davidwalsh.name/fullscreen // Find the right method, call on correct element function launchIntoFullscreen(element) { try { if (element.requestFullscreen) { element.requestFullscreen().catch(err => { console.warn("Fullscreen request denied:", err); }); } else if (element.mozRequestFullScreen) { element.mozRequestFullScreen(); } else if (element.webkitRequestFullscreen) { element.webkitRequestFullscreen(); } else if (element.msRequestFullscreen) { element.msRequestFullscreen(); } } catch (err) { console.warn("Fullscreen error (legacy):", err); } } // Whack fullscreen function exitFullscreen() { if (document.exitFullscreen) { document.exitFullscreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } } var adBlockerDetected = false; var canRefreshAds = true; var isCheckAdBanner = false; // function BlinkTab(message) { // Store state in a closure const state = { oldTitle: document.title, timeoutId: null, audioCtx: null }; function createAudioContext() { if (!state.audioCtx) { state.audioCtx = new (window.AudioContext || window.webkitAudioContext)(); state.audioCtx.suspend(); state.audioCtx.resume().catch(e => console.log("AudioContext resume error:", e)); } return state.audioCtx; } function blink() { document.title = document.title === message ? ' ' : message; createAudioContext(); // Fix Chrome AudioContext bug } function clear() { if (state.timeoutId) { clearInterval(state.timeoutId); state.timeoutId = null; } document.title = state.oldTitle; document.removeEventListener('visibilitychange', onVisibilityChange); window.removeEventListener('mousemove', clear); createAudioContext(); // Fix Chrome AudioContext bug } function onVisibilityChange() { if (document.visibilityState === 'visible') { clear(); } } // Only start if not already running if (!state.timeoutId) { state.timeoutId = setInterval(blink, 1000); document.addEventListener('visibilitychange', onVisibilityChange); window.addEventListener('mousemove', clear, { once: true }); createAudioContext(); // Fix Chrome AudioContext bug } // Return a function to manually clear the blinking return clear; } //ME SERT POUR CRAZYGAMES function ConnectedToLobby(){ console.log("IsConnected()"); //HideCMPToolbar(); } //Lancé depuis le jeu, dès la fin du chargement de la page. function ShowBannerAds() { console.log("ShowBannerAds()"); canRefreshAds = true; LoadAds(); } //Lancé depuis le jeu, quand on sort du lobby et qu'on arrive dans la partie. function HideBannerAds() { //if( canRefreshAds == false){return;} //console.log("HideBannerAds()"); canRefreshAds = false; var adsenseDiv = document.getElementById("gold-container"); adsenseDiv.innerHTML = ''; //adsenseDiv.style.display = "none"; } //Depuis le jeu function ShowVideoAds() { console.log("ShowVideoAds()"); } //Depuis le jeu function ShowRewardedVideoAds() { console.log("ShowRewardedVideoAds()"); show_rewarded(); } //Depuis le jeu function show_rewarded() { console.log("show_rewarded()"); } //COUPE LE SON A L'UN-FOCUS !!! // Override AudioContext to track all created contexts (function () { const OriginalAudioContext = window.AudioContext || window.webkitAudioContext; if (!OriginalAudioContext) { console.warn("AudioContext is not supported in this browser."); return; } // List to store all AudioContexts window.__audioContextList = window.__audioContextList || []; // Custom AudioContext class to track instances class CustomAudioContext extends OriginalAudioContext { constructor(...args) { super(...args); window.__audioContextList.push(this); } } // Replace global AudioContext with the custom version window.AudioContext = CustomAudioContext; window.webkitAudioContext = CustomAudioContext; })(); // Function to mute all AudioContexts function muteAudioContexts() { if (window.__audioContextList) { window.__audioContextList.forEach(ctx => { if (ctx.state === 'running') { ctx.suspend().then(() => console.log("AudioContext muted.")); } }); } } // Function to unmute all AudioContexts function unmuteAudioContexts() { if (window.__audioContextList) { window.__audioContextList.forEach(ctx => { if (ctx.state === 'suspended') { ctx.resume().then(() => console.log("AudioContext unmuted.")); } }); } } // Detect visibility change document.addEventListener("visibilitychange", () => { if (document.hidden) { // Mute when the tab is inactive muteAudioContexts(); console.log("Tab is inactive. Sound muted."); } else { // Unmute when the tab is active again unmuteAudioContexts(); console.log("Tab is active. Sound unmuted."); } }); function checkIframeParent(domains) { // Check if the page is running inside an iframe if (window.self !== window.top) { try { // Get the referrer domain const referrer = document.referrer; if (referrer) { const referrerDomain = new URL(referrer).hostname; if (domains.includes(referrerDomain)) { console.warn("Unauthorized embedding detected from:", referrerDomain); //document.body.innerHTML = "

Unauthorized Embedding Detected!

"; } } else { console.warn("Referrer not available. Cannot verify embedding."); //document.body.innerHTML = "

Embedding Not Allowed

"; } } catch (e) { console.error("Unable to check the parent domain due to security restrictions."); //document.body.innerHTML = "

Embedding Not Allowed

"; } } } // Example usage const allowedDomains = ["www.B.com", "example.com"]; const notAllowedDomains = ["www.B.com", "example.com"]; checkIframeParent(notAllowedDomains); ///SHADOW DOM ///Va cacher le popup d'approbation de adsense. const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { mutation.addedNodes.forEach((node) => { if (node.nodeType === Node.ELEMENT_NODE) { // Check if the element is NOT within the 'gold-container' const parentContainer = node.closest("#gold-container"); if (!parentContainer) { console.log("Element found outside #gold-container:", node); // Check if the element matches :not(.ft-hidden) const toolbar = node.matches && node.matches(":not(.ft-hidden)") ? node : node.querySelector(":not(.ft-hidden)"); if (toolbar) { console.log("Element found with :not(.ft-hidden). Hiding it..."); setTimeout(() => { hideElement(toolbar); }, 6000); // Wait 6 seconds before hiding } // If the node has a shadow DOM, observe its contents if (node.shadowRoot) { console.log("Shadow DOM detected outside #gold-container. Observing shadow contents..."); observeShadowDOM(node.shadowRoot); } } } }); }); }); // Function to hide the element by updating styles function hideElement(element) { // Apply inline styles to override existing CSS element.style.transition = "opacity 0.25s"; // Retain the original transition element.style.opacity = "0"; // Make the element invisible element.style.pointerEvents = "none"; // Disable interactions console.log("Element hidden successfully."); } // Function to observe shadow DOM contents function observeShadowDOM(shadowRoot) { const shadowObserver = new MutationObserver((mutations) => { mutations.forEach((mutation) => { mutation.addedNodes.forEach((node) => { if (node.nodeType === Node.ELEMENT_NODE) { const toolbar = node.matches && node.matches(":not(.ft-hidden)") ? node : node.querySelector(":not(.ft-hidden)"); if (toolbar) { console.log("Element found inside Shadow DOM. Hiding it..."); hideElement(toolbar); } } }); }); }); shadowObserver.observe(shadowRoot, { childList: true, subtree: true }); } // Start observing the document for changes observer.observe(document.body, { childList: true, subtree: true }); console.log("MutationObserver is active and watching for :not(.ft-hidden).");