(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();
}
})();
Pre-orders are open for Overwatch’s new Doomfist statue revealed earlier today at gamescom 2018. The 14.25-inch statue will cost $300, a bit pricier than initially expected. (Blizzard’s Overwatch statues typically cost $175, save the extra-large D.Va one.)
“One punch is all I need,” Blizzard wrote on the official Overwatch account. “Pre-order your Doomfist statue today from the Blizzard Gear store.”
Related: Blizzard is showing off a punching Doomfist statue at gamescom 2018
Like the other Overwatch statues in the line, Doomfist looks stunning. His shiny, golden fist is pulled back, winding up for a quick strike. Details, from his facial expression to his chiseled abs, are impeccable. Blizzard’s done a good job making the statue true to Doomfist’s in-game model.
👉 For more insights, check out this resource.
Other Overwatch figures in the statue line include Widowmaker, Mercy, Tracer, D.Va, Genji, Hanzo, and Reaper. All of these, except Reaper, are available for purchase on the Blizzard Gear store alongside Doomfist. Buyers are limited to 10 statues per customer, with wave one of the Doomfist statue scheduled to ship in the fourth quarter of 2018.
More Overwatch merchandise is expected to be revealed at gamescom 2018 and beyond. Earlier today, the Overwatch Twitter account teased six new Overwatch LEGO minifigures of Widowmaker, Reinhardt, Genji, Soldier: 76, Mercy, and McCree. (Not a great composition, if you ask us.) Likewise, Blizzard’s recently shown off new Nerf Rivals blasters for D.Va and Reaper.
👉 Discover more in this in-depth guide.