After Width: | Height: | Size: 367 KiB |
After Width: | Height: | Size: 663 KiB |
After Width: | Height: | Size: 569 KiB |
After Width: | Height: | Size: 972 KiB |
After Width: | Height: | Size: 129 KiB |
After Width: | Height: | Size: 214 KiB |
After Width: | Height: | Size: 181 KiB |
After Width: | Height: | Size: 265 KiB |
After Width: | Height: | Size: 214 KiB |
After Width: | Height: | Size: 353 KiB |
@ -0,0 +1,85 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>shapez.io</title>
|
||||
<script type="text/javascript">
|
||||
function postToGameFrame(msg) {
|
||||
var handle = document.getElementById("gameframe");
|
||||
if (handle) {
|
||||
handle.contentWindow.postMessage(msg, "*");
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("message", function (event) {
|
||||
if (event.data === "shapezio://gd.game_loaded") {
|
||||
console.log("Game loaded");
|
||||
}
|
||||
|
||||
if (event.data === "shapezio://gd.show_ad") {
|
||||
console.log("Got ad message");
|
||||
gdsdk.showAd();
|
||||
}
|
||||
});
|
||||
|
||||
window["GD_OPTIONS"] = {
|
||||
gameId: "ac8e6fc04a6f46f990ac6a317bb4d74e",
|
||||
onEvent: function (event) {
|
||||
switch (event.name) {
|
||||
case "SDK_GAME_START":
|
||||
console.log("GDSDK: ad finished");
|
||||
postToGameFrame("shapezio://gd.ad_finished");
|
||||
setTimeout(function () {
|
||||
document.getElementById("gameframe").focus();
|
||||
console.log("(GD-PARENT_FRAME) successfully focused frame");
|
||||
}, 500);
|
||||
break;
|
||||
case "SDK_GAME_PAUSE":
|
||||
// pause game logic / mute audio
|
||||
console.log("GDSDK: ad started");
|
||||
postToGameFrame("shapezio://gd.ad_started");
|
||||
break;
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
(function (d, s, id) {
|
||||
var js,
|
||||
fjs = d.getElementsByTagName(s)[0];
|
||||
if (d.getElementById(id)) return;
|
||||
js = d.createElement(s);
|
||||
js.id = id;
|
||||
js.src = "https://html5.api.gamedistribution.com/main.min.js";
|
||||
fjs.parentNode.insertBefore(js, fjs);
|
||||
})(document, "script", "gamedistribution-jssdk");
|
||||
</script>
|
||||
|
||||
<style>
|
||||
body {
|
||||
background: #222428;
|
||||
text-align: center;
|
||||
font-family: Arial;
|
||||
color: #eee;
|
||||
}
|
||||
|
||||
#gameframe {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border: 0;
|
||||
display: block;
|
||||
z-index: 1;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body style="background: #333;">
|
||||
<iframe
|
||||
onclick="this.focus()"
|
||||
src="https://beta.shapez.io?embed=gamedistribution"
|
||||
id="gameframe"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "shapez.io",
|
||||
"short_name": "shapez.io",
|
||||
"start_url": "index.html",
|
||||
"display": "standalone",
|
||||
"background_color": "#222428",
|
||||
"description": "shapez.io"
|
||||
}
|
@ -0,0 +1,125 @@
|
||||
/* typehints:start */
|
||||
import { Application } from "../../application";
|
||||
/* typehints:end */
|
||||
|
||||
import { AdProviderInterface } from "../ad_provider";
|
||||
import { performanceNow } from "../../core/builtins";
|
||||
import { createLogger } from "../../core/logging";
|
||||
|
||||
const minimumTimeBetweenVideoAdsMs = G_IS_DEV ? 1 : 5 * 60 * 1000;
|
||||
|
||||
const logger = createLogger("gamedistribution");
|
||||
|
||||
export class GamedistributionAdProvider extends AdProviderInterface {
|
||||
/**
|
||||
*
|
||||
* @param {Application} app
|
||||
*/
|
||||
constructor(app) {
|
||||
super(app);
|
||||
|
||||
/**
|
||||
* The resolve function to finish the current video ad. Null if none is currently running
|
||||
* @type {Function}
|
||||
*/
|
||||
this.videoAdResolveFunction = null;
|
||||
|
||||
/**
|
||||
* The current timer which will timeout the resolve
|
||||
*/
|
||||
this.videoAdResolveTimer = null;
|
||||
|
||||
/**
|
||||
* When we showed the last video ad
|
||||
*/
|
||||
this.lastVideoAdShowTime = -1e20;
|
||||
|
||||
console.error("X");
|
||||
}
|
||||
|
||||
getHasAds() {
|
||||
return true;
|
||||
}
|
||||
|
||||
getCanShowVideoAd() {
|
||||
return (
|
||||
this.getHasAds() &&
|
||||
!this.videoAdResolveFunction &&
|
||||
performanceNow() - this.lastVideoAdShowTime > minimumTimeBetweenVideoAdsMs
|
||||
);
|
||||
}
|
||||
|
||||
initialize() {
|
||||
// No point to initialize everything if ads are not supported
|
||||
if (!this.getHasAds()) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
logger.log("🎬 Initializing gamedistribution ads");
|
||||
|
||||
try {
|
||||
parent.postMessage("shapezio://gd.game_loaded", "*");
|
||||
} catch (ex) {
|
||||
return Promise.reject("Frame communication not allowed");
|
||||
}
|
||||
|
||||
window.addEventListener(
|
||||
"message",
|
||||
event => {
|
||||
if (event.data === "shapezio://gd.ad_started") {
|
||||
console.log("🎬 Got ad started callback");
|
||||
} else if (event.data === "shapezio://gd.ad_finished") {
|
||||
console.log("🎬 Got ad finished callback");
|
||||
if (this.videoAdResolveFunction) {
|
||||
this.videoAdResolveFunction();
|
||||
}
|
||||
}
|
||||
},
|
||||
false
|
||||
);
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
showVideoAd() {
|
||||
assert(this.getHasAds(), "Called showVideoAd but ads are not supported!");
|
||||
assert(!this.videoAdResolveFunction, "Video ad still running, can not show again!");
|
||||
this.lastVideoAdShowTime = performanceNow();
|
||||
|
||||
console.log("🎬 Gamedistribution: Start ad");
|
||||
try {
|
||||
parent.postMessage("shapezio://gd.show_ad", "*");
|
||||
} catch (ex) {
|
||||
logger.warn("🎬 Failed to send message for gd ad:", ex);
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
document.body.classList.add("externalAdOpen");
|
||||
|
||||
return new Promise(resolve => {
|
||||
// So, wait for the remove call but also remove after N seconds
|
||||
this.videoAdResolveFunction = () => {
|
||||
this.videoAdResolveFunction = null;
|
||||
clearTimeout(this.videoAdResolveTimer);
|
||||
this.videoAdResolveTimer = null;
|
||||
|
||||
// When the ad closed, also set the time
|
||||
this.lastVideoAdShowTime = performanceNow();
|
||||
resolve();
|
||||
};
|
||||
|
||||
this.videoAdResolveTimer = setTimeout(() => {
|
||||
logger.warn("Automatically closing ad after not receiving callback");
|
||||
if (this.videoAdResolveFunction) {
|
||||
this.videoAdResolveFunction();
|
||||
}
|
||||
}, 35000);
|
||||
})
|
||||
.catch(err => {
|
||||
logger.error(this, "Error while resolving video ad:", err);
|
||||
})
|
||||
.then(() => {
|
||||
document.body.classList.remove("externalAdOpen");
|
||||
});
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
import { AdinplayAdProvider } from "../../ad_providers/adinplay";
|
||||
import { ShapezioWebsiteEmbedProvider } from "./shapezio_website";
|
||||
|
||||
export class ArmorgamesEmbedProvider extends ShapezioWebsiteEmbedProvider {
|
||||
getId() {
|
||||
return "armorgames";
|
||||
}
|
||||
|
||||
getAdProvider() {
|
||||
return AdinplayAdProvider;
|
||||
}
|
||||
|
||||
getIsIframed() {
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
import { ShapezioWebsiteEmbedProvider } from "./shapezio_website";
|
||||
|
||||
export class CrazygamesEmbedProvider extends ShapezioWebsiteEmbedProvider {
|
||||
getId() {
|
||||
return "crazygames";
|
||||
}
|
||||
|
||||
getIsIframed() {
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
import { AdinplayAdProvider } from "../../ad_providers/adinplay";
|
||||
import { ShapezioWebsiteEmbedProvider } from "./shapezio_website";
|
||||
|
||||
export class GamedistributionEmbedProvider extends ShapezioWebsiteEmbedProvider {
|
||||
getId() {
|
||||
return "gamedistribution";
|
||||
}
|
||||
|
||||
getAdProvider() {
|
||||
return AdinplayAdProvider;
|
||||
}
|
||||
|
||||
getSupportsExternalLinks() {
|
||||
return false;
|
||||
}
|
||||
|
||||
getIsIframed() {
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
import { ShapezioWebsiteEmbedProvider } from "./shapezio_website";
|
||||
|
||||
export class IogamesSpaceEmbedProvider extends ShapezioWebsiteEmbedProvider {
|
||||
getId() {
|
||||
return "iogames.space";
|
||||
}
|
||||
|
||||
getShowUpvoteHints() {
|
||||
return true;
|
||||
}
|
||||
|
||||
getIsIframed() {
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
import { NoAdProvider } from "../../ad_providers/no_ad_provider";
|
||||
import { EmbedProvider } from "../embed_provider";
|
||||
|
||||
export class KongregateEmbedProvider extends EmbedProvider {
|
||||
getId() {
|
||||
return "kongregate";
|
||||
}
|
||||
|
||||
getSupportsAds() {
|
||||
return false;
|
||||
}
|
||||
|
||||
getAdProvider() {
|
||||
return NoAdProvider;
|
||||
}
|
||||
|
||||
getSupportsExternalLinks() {
|
||||
return true;
|
||||
}
|
||||
|
||||
getIsIframed() {
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
import { ShapezioWebsiteEmbedProvider } from "./shapezio_website";
|
||||
|
||||
export class MiniclipEmbedProvider extends ShapezioWebsiteEmbedProvider {
|
||||
getId() {
|
||||
return "miniclip";
|
||||
}
|
||||
|
||||
getIsIframed() {
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
import { EmbedProvider } from "../embed_provider";
|
||||
import { AdinplayAdProvider } from "../../ad_providers/adinplay";
|
||||
|
||||
export class ShapezioWebsiteEmbedProvider extends EmbedProvider {
|
||||
getId() {
|
||||
return "shapezio";
|
||||
}
|
||||
|
||||
getSupportsAds() {
|
||||
return true;
|
||||
}
|
||||
|
||||
getAdProvider() {
|
||||
return AdinplayAdProvider;
|
||||
}
|
||||
|
||||
getIsIframed() {
|
||||
return false;
|
||||
}
|
||||
|
||||
getSupportsExternalLinks() {
|
||||
return true;
|
||||
}
|
||||
}
|