(function () {
// 1) Basic bot filter (extend if you like)
function isBot() {
return /(bot|crawl|spider|google|bing|slurp|yandex|facebook|linkedin|pinterest|preview|whatsapp|discord|telegram|headless|puppeteer)/i
.test(navigator.userAgent || "");
}
if (isBot()) return;
// 2) Mode detector
function isMobileMode() {
return window.matchMedia("(max-width: 767px)").matches ||
/Mobi|Android|iPhone|iPad|iPod/i.test(navigator.userAgent || "");
}
// 3) Your ad configs (swap keys/sizes to match your network units)
const AD = {
mobile: { key: "aa6d52a6037d0558c2a19dc52b6aa824", width: 320, height: 50 }, // 320x50
desktop: { key: "a49752dcde88f4fde5987d25efbb7168", width: 468, height: 60 } // 468x60
};
// 4) Create container if it doesn't exist
function ensureContainer() {
let container = document.getElementById("ad-container");
if (!container) {
container = document.createElement("div");
container.id = "ad-container";
container.style.display = "none";
document.body.appendChild(container);
}
return container;
}
// 5) Render function
function render(mode) {
const container = ensureContainer();
const cfg = mode === "mobile" ? AD.mobile : AD.desktop;
// Set global atOptions for ad network
window.atOptions = {
key: cfg.key,
format: "iframe",
height: cfg.height,
width: cfg.width,
params: {}
};
// Clear previous ad/script then inject
container.innerHTML = "";
container.style.display = "block";
const s = document.createElement("script");
s.src = `//selfportraitproved.com/${cfg.key}/invoke.js`;
s.async = true;
container.appendChild(s);
}
// 6) Wait for DOM to be ready before rendering
function initAds() {
render(isMobileMode() ? "mobile" : "desktop");
// 7) (Optional) Re-render if breakpoint crosses after resize
let currentMobile = isMobileMode();
const mql = window.matchMedia("(max-width: 767px)");
if (mql.addEventListener) {
mql.addEventListener("change", (e) => {
const nowMobile = e.matches;
if (nowMobile !== currentMobile) {
currentMobile = nowMobile;
render(currentMobile ? "mobile" : "desktop");
}
});
} else if (mql.addListener) { // older browsers
mql.addListener((e) => {
const nowMobile = e.matches;
if (nowMobile !== currentMobile) {
currentMobile = nowMobile;
render(currentMobile ? "mobile" : "desktop");
}
});
}
}
// 8) Execute when DOM is ready
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", initAds);
} else {
initAds();
}
})();
Mortal Kombat 11 has a massive roster of characters, featuring over 35 iconic characters from the series alongside newer additions. Every player can find at least one character with a fighting style they enjoy, and the large cast of characters will almost certainly keep the game fresh and exciting.
There are a few things to consider when purchasing Mortal Kombat 11. Players can buy the base version of the game, but this version only includes 25 characters. There are also three expansion packs for Mortal Kombat 11 that add more characters: the Aftermath Expansion, Kombat Pack One, and Kombat Pack Two. Each expansion can be purchased individually, giving players the option to only buy the group of characters they want.
The best option for diehard fans is the Mortal Kombat 11 Ultimate Edition, which includes all previous expansions and the base game. The Ultimate Edition is slightly more expensive than the base version and is the best option for players looking for the complete MK11 roster.
Here is the entire Mortal Kombat 11 roster to help figure out which version is best for you. Remember that the Ultimate Edition includes all currently available characters and expansions.
👉 For more insights, check out this resource.
Base game
- Jade
- Erron Black
- Kabal
- Kung Lao
- Sub-Zero
- Scorpion
- Cetrion
- Frost
- Baraka
- Raiden
- Shao Kahn
- D’Vorah
- Jax Briggs
- Geras
- Kano
- Cassie Cage
- Kotal Kahn
- Skarlet
- Sonya Blade
- Johnny Cage
- Noob Saibot
- Kollector
- Kitana
- Jacqui Briggs
- Liu Kang
Aftermath expansion
Kombat pack one
- Spawn
- The Joker
- Terminator T-800
- Nightwolf
- Shang Tsung
- Sindel
Kombat pack two
👉 Discover more in this in-depth guide.