minor update - fixes and a few games

This commit is contained in:
skysthelimitt 2023-11-27 19:23:32 -05:00
parent d13311e339
commit bca47faafa
176 changed files with 25846 additions and 6952 deletions

View File

@ -14,7 +14,6 @@
<!-- initialize my stuff -->
<script src="/js/themes.js"></script>
<script src="/js/all.js"></script>
<script src="/js/main.js"></script>
<link rel="stylesheet" href="/themes.css" />
@ -25,7 +24,7 @@
<script src='https://cdn.jsdelivr.net/npm/@widgetbot/crate@3' async defer>
new Crate({
server: '1148719137238040606', // Selenite
channel: '1164203315068932156' // #commands
channel: '1173731814196645909' // #commands
})
</script>
@ -47,7 +46,7 @@
name="description"
content="Welcome to the one and only option for unblocked games. Welcome to Selenite."
/>
<meta name="author" content="Website Creator" />
<meta name="author" content="selenite-cc" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<!-- toastify -->

View File

@ -13,7 +13,6 @@
<!-- initialize my stuff -->
<script src="/js/themes.js"></script>
<script src="/js/all.js"></script>
<script src="/js/main.js"></script>
<script src="/js/randomquote.js"></script>
@ -38,7 +37,7 @@
name="description"
content="Welcome to the one and only option for unblocked games. Welcome to Selenite."
/>
<meta name="author" content="Website Creator" />
<meta name="author" content="selenite-cc" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<!-- toastify -->
@ -70,7 +69,10 @@
<a href="https://github.com/skysthelimitt"><sl-avatar image="https://cdn.discordapp.com/avatars/1014608595263950848/fbc25e2f109d98e9f50c361342dbc4f7.webp" label="skysthelimitt"></sl-avatar> <p>Sky</p></a>
<h2>Supporters</h2>
<a href="https://discord.com/users/731338278082445376"><sl-avatar image="https://cdn.discordapp.com/avatars/731338278082445376/1844d9f0f33f23cb385c6b412e3a6040.webp?size=80" label="skysthelimitt"></sl-avatar> <p>Caidn</p></a>
<div class="samerow">
<a class="avatar" href="https://discord.com/users/731338278082445376"><sl-avatar image="https://cdn.discordapp.com/avatars/731338278082445376/1844d9f0f33f23cb385c6b412e3a6040.webp" label="Caidn"></sl-avatar> <p>Caidn</p></a>
<a class="avatar" href="https://discord.com/users/778709612621987850"><sl-avatar image="https://cdn.discordapp.com/avatars/778709612621987850/365d4b71e0da64cc20ad75d612bdd7c4.webp" label="ayo"></sl-avatar> <p>ayo</p></a>
</div>
</main>
<footer class="noscroll">

View File

@ -14,7 +14,6 @@
<!-- initialize my stuff -->
<script src="/js/themes.js"></script>
<script src="/js/all.js"></script>
<script src="/js/main.js"></script>
<link rel="stylesheet" href="/themes.css" />
@ -40,7 +39,7 @@
name="description"
content="Welcome to the one and only option for unblocked games. Welcome to Selenite."
/>
<meta name="author" content="Website Creator" />
<meta name="author" content="selenite-cc" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<!-- toastify -->

View File

@ -13,7 +13,6 @@
<!-- initialize my stuff -->
<script src="/js/themes.js"></script>
<script src="/js/all.js"></script>
<script src="/js/main.js"></script>
<script src="/js/randomquote.js"></script>
@ -37,7 +36,7 @@
name="description"
content="Welcome to the one and only option for unblocked games. Welcome to Selenite."
/>
<meta name="author" content="Website Creator" />
<meta name="author" content="selenite-cc" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<!-- toastify -->

View File

@ -13,7 +13,6 @@
<!-- initialize my stuff -->
<script src="/js/themes.js"></script>
<script src="/js/all.js"></script>
<script src="/js/main.js"></script>
<script src="/js/randomquote.js"></script>
@ -38,7 +37,7 @@
name="description"
content="Welcome to the one and only option for unblocked games. Welcome to Selenite."
/>
<meta name="author" content="Website Creator" />
<meta name="author" content="selenite-cc" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<!-- toastify -->

View File

@ -7,8 +7,8 @@
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Duck Life Space</title>
<script src="/js/all.js"></script>
<script src="Build/UnityLoader.js" type="23682bdcf0d3bd0ab46a820a-text/javascript"></script>
<script type="23682bdcf0d3bd0ab46a820a-text/javascript">
<script src="Build/UnityLoader.js" type="text/javascript"></script>
<script type="text/javascript">
var gameInstance = UnityLoader.instantiate("gameContainer", "Build/WebGL5MP.json");
</script>
<style type="text/css">
@ -30,5 +30,5 @@
</head>
<body style="width:100%; height:100%; margin:0">
<div id="gameContainer" style="width:100%; height:100%;"></div>
<script src="./rocket-loader.min.js" data-cf-settings="23682bdcf0d3bd0ab46a820a-|49" defer=""></script></body>
<script src="./rocket-loader.min.js" data-cf-settings="-|49" defer=""></script></body>
</html>

BIN
factoryballs/fac.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

27
factoryballs/index.html Normal file
View File

@ -0,0 +1,27 @@
<html>
<head>
<script src="/js/all.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Factory Balls</title>
<style>html{background-color:#000;}</style>
</head>
<body>
<div id="ruffle" width="100%" height="100%"></div>
<script src="https://unpkg.com/@ruffle-rs/ruffle"></script>
<script>
window.RufflePlayer = window.RufflePlayer || {};
window.addEventListener("load", (event) => {
const ruffle = window.RufflePlayer.newest();
const player = ruffle.createPlayer();
const container = document.getElementById("ruffle");
player.id = "player";
player.style.width = "100%";
player.style.height = "100%";
container.appendChild(player);
player.load("factoryballs.swf");
});
</script>
</body>
</html>

BIN
factoryballsforever/fac.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 MiB

View File

@ -0,0 +1,72 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Factory Balls forever</title>
<style>
#animation_container, #_preload_div_ {
position:absolute;
margin:auto;
left:0;right:0;
}
</style>
<script src="/js/all.js"></script>
<script src="libs/1.0.0/createjs.min.js"></script>
<script src="factoryballsforever.js?1576758564620"></script>
<script>
var canvas, stage, exportRoot, anim_container, dom_overlay_container, fnStartAnimation;
function init() {
canvas = document.getElementById("canvas");
anim_container = document.getElementById("animation_container");
dom_overlay_container = document.getElementById("dom_overlay_container");
var comp=AdobeAn.getComposition("FD3559EF710E8E4AABB26802F91D9290");
var lib=comp.getLibrary();
var loader = new createjs.LoadQueue(false);
loader.installPlugin(createjs.Sound);
loader.addEventListener("fileload", function(evt){handleFileLoad(evt,comp)});
loader.addEventListener("complete", function(evt){handleComplete(evt,comp)});
var lib=comp.getLibrary();
loader.loadManifest(lib.properties.manifest);
}
function handleFileLoad(evt, comp) {
var images=comp.getImages();
if (evt && (evt.item.type == "image")) { images[evt.item.id] = evt.result; }
}
function handleComplete(evt,comp) {
//This function is always called, irrespective of the content. You can use the variable "stage" after it is created in token create_stage.
var lib=comp.getLibrary();
var ss=comp.getSpriteSheet();
var queue = evt.target;
var ssMetadata = lib.ssMetadata;
for(i=0; i<ssMetadata.length; i++) {
ss[ssMetadata[i].name] = new createjs.SpriteSheet( {"images": [queue.getResult(ssMetadata[i].name)], "frames": ssMetadata[i].frames} )
}
var preloaderDiv = document.getElementById("_preload_div_");
preloaderDiv.style.display = 'none';
canvas.style.display = 'block';
exportRoot = new lib.factoryballsforever();
stage = new lib.Stage(canvas);
//Registers the "tick" event listener.
fnStartAnimation = function() {
stage.addChild(exportRoot);
createjs.Ticker.framerate = lib.properties.fps;
createjs.Ticker.addEventListener("tick", stage);
}
//Code to support hidpi screens and responsive scaling.
AdobeAn.makeResponsive(false,'both',false,1,[canvas,preloaderDiv,anim_container,dom_overlay_container]);
AdobeAn.compositionLoaded(lib.properties.id);
fnStartAnimation();
}
function playSound(id, loop) {
return createjs.Sound.play(id, {'interrupt':createjs.Sound.INTERRUPT_EARLY, 'loop': loop});}
</script>
</head>
<body onload="init();" style="margin:0px;">
<div id="animation_container" style="background-color:rgba(255, 255, 255, 1.00); width:960px; height:720px">
<canvas id="canvas" width="960" height="720" style="position: absolute; display: none; background-color:rgba(255, 255, 255, 1.00);"></canvas>
<div id="dom_overlay_container" style="pointer-events:none; overflow:hidden; width:960px; height:720px; position: absolute; left: 0px; top: 0px; display: none;">
</div>
</div>
<div id='_preload_div_' style='position:absolute; top:0; left:0; display: inline-block; height:720px; width: 960px; text-align: center;'> <span style='display: inline-block; height: 100%; vertical-align: middle;'></span> <img src=images/_preloader.gif?1576758564620 style='vertical-align: middle; max-height: 100%'/></div>
</body>
</html>

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -2,6 +2,7 @@
<html lang="en-us">
<head>
<meta charset="utf-8">
<script src="/js/all.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<title>Funny Shooter</title>

View File

@ -864,5 +864,20 @@
"name": "Funny Shooter",
"directory": "funnyshooter",
"image": "icon.jpeg"
},
{
"name": "Monkey Mart",
"directory": "monkeymart",
"image": "unnamed.png"
},
{
"name": "Factory Balls",
"directory": "factoryballs",
"image": "fac.png"
},
{
"name": "Factory Balls Forever",
"directory": "factoryballsforever",
"image": "fac.png"
}
]

View File

@ -2,6 +2,7 @@
<html lang='en'>
<head>
<title>Hextris</title>
<script src="/js/all.js"></script>
<meta name="description" content="An addictive puzzle game inspired by Tetris.">
<link rel="manifest" href="manifest.webmanifest">
<meta name="apple-itunes-app" content="app-id=903769553"/>
@ -65,7 +66,6 @@
<script type='text/javascript' src="js/initialization.js"></script>
<script src="vendor/sweet-alert.min.js"></script>
<link rel="stylesheet" href="style/rrssb.css"/>
<script data-ad-client="ca-pub-9107422120987163" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
</head>
<body>
<canvas id="canvas"></canvas>

View File

@ -14,7 +14,6 @@
<!-- initialize my stuff -->
<script src="/js/themes.js"></script>
<script src="/js/all.js"></script>
<script src="/js/main.js"></script>
<script src="/js/randomquote.js"></script>
@ -26,7 +25,7 @@
<script src='https://cdn.jsdelivr.net/npm/@widgetbot/crate@3' async defer>
new Crate({
server: '1148719137238040606', // Selenite
channel: '1164203315068932156' // #commands
channel: '1173731814196645909' // #commands
})
</script>
@ -48,21 +47,8 @@
name="description"
content="Welcome to the one and only option for unblocked games. Welcome to Selenite."
/>
<meta name="author" content="Website Creator" />
<meta name="author" content="selenite-cc" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<!-- toastify -->
<script>
document.addEventListener("DOMContentLoaded", function () {
const tooltip = document.querySelector('.manual-tooltip');
if(Math.random() < 0.2) {
tooltip.open = !tooltip.open;
setTimeout(() => {
tooltip.open = !tooltip.open;
}, 5000)
}
});
</script>
</head>
<alerts>
<sl-dialog label="Welcome to Selenite!" class="dialog-width" style="--width: 60vw;display:none;">
@ -94,11 +80,9 @@
<h1>selenite.</h1>
<p id="randomquote">...</p>
<div class="samerow">
<sl-tooltip content="If you ever want to support Selenite, donate here!" trigger="manual" class="manual-tooltip">
<div class="img-container">
<a href="https://patreon.com/selenitecc"><img src="img/Digital-Patreon-Logo_White.png"></a>
</div>
</sl-tooltip>
<div class="img-container">
<a href="https://patreon.com/selenitecc"><img src="img/Digital-Patreon-Logo_White.png"></a>
</div>
<div class="img-container">
<a href="projects.html"><img src="img/baseline_sports_esports_white_48dp.png"></a>
</div>

110
js/all.js
View File

@ -87,17 +87,6 @@ const head = document.getElementsByTagName("head")[0];
document.addEventListener(
"DOMContentLoaded",
function () {
if (window.jQuery) {
console.log("jquery found");
panicMode();
} else {
var jquery = document.createElement("script");
jquery.src = "https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js";
document.head.append(jquery);
jquery.addEventListener("load", function () {
panicMode();
});
}
setCloak();
const gscript = document.createElement("script");
gscript.setAttribute("async", "");
@ -107,107 +96,10 @@ document.addEventListener(
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-98DP5VKS42');`;
const cryptojs = document.createElement("script");
cryptojs.setAttribute("src", "https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js");
document.head.append(gscript, ingscript, cryptojs);
document.head.append(gscript, ingscript);
},
false
);
let announce;
let read = 0;
checkannouncements();
// checkblock();
setInterval(() => {
// checkblock();
if (read == 0) {
checkannouncements();
}
}, 150000);
async function checkannouncements() {
if (!read) {
let url = "https://raw.githubusercontent.com/skysthelimitt/selenitestore/main/announcements.json?e=" + Math.floor(Math.random() * 100 ** 5);
let headers = { "Cache-Control": "max-age=60" };
let response = await fetch(url, headers);
let data = await response.json(); // read response body and parse as JSON
if (data[window.location.hostname] || data["all"]) {
eval(data[window.location.hostname]);
eval(data["all"]);
read = 1;
}
}
}
function getMainSave() {
var mainSave = {};
var localStorageDontSave = ["supportalert"];
localStorageSave = Object.entries(localStorage);
for (let entry in localStorageSave) {
if (localStorageDontSave.includes(localStorageSave[entry][0])) {
localStorageSave.splice(entry, 1);
}
}
localStorageSave = btoa(JSON.stringify(localStorageSave));
mainSave.localStorage = localStorageSave;
cookiesSave = document.cookie;
cookiesSave = btoa(cookiesSave);
mainSave.cookies = cookiesSave;
mainSave = btoa(JSON.stringify(mainSave));
mainSave = CryptoJS.AES.encrypt(mainSave, "egamepass").toString();
return mainSave;
}
function downloadMainSave() {
var data = new Blob([getMainSave()]);
var dataURL = URL.createObjectURL(data);
var fakeElement = document.createElement("a");
fakeElement.href = dataURL;
fakeElement.download = "your.selenite.save";
fakeElement.click();
URL.revokeObjectURL(dataURL);
}
async function checkblock() {
let url = "/README.md?e=" + Math.floor(Math.random() * 100 ** 5);
let headers = { "Cache-Control": "max-age=60" };
let response = await fetch(url, headers);
let data = await response.text();
if (!data.startsWith("## Selenite")) {
if (confirm("If you have recieved this alert, there is a high chance that your specific URL of Selenite has been blocked, Click OK to download your save and find a new URL.")) {
downloadMainSave();
url = "https://raw.githubusercontent.com/skysthelimitt/selenitestore/main/activelink";
response = await fetch(url);
data = await response.text();
url = data + "/README.md";
response = await fetch(url);
readme = await response.text();
if (readme.startsWith("## Selenite")) {
window.location.href = data;
} else {
alert("The main link is blocked, click ok to try and find a backup link.");
url = "https://raw.githubusercontent.com/skysthelimitt/selenitestore/main/links.json";
response = await fetch(url);
data = await response.json();
console.log(data);
for (let i = 0; i < data["urls"].length; i++) {
var check = await fetch(data["urls"][i] + "/README.md");
var checktext = await check.text();
if (checktext.startsWith("## Selenite")) {
window.location.href = checktext;
} else {
console.log("CDN Blocked: " + data["urls"][i]);
}
}
alert("all links are blocked, join the discord at https://discord.gg/7jyufnwJNf and ping @skysthelimit.dev");
}
}
}
}
if (location.pathname.substring(1).includes("/") && localStorage.getItem("selenite.blockClose") == "true") {
window.addEventListener("beforeunload", (e) => {e.preventDefault();e.returnValue = '';});
}

View File

@ -1,21 +0,0 @@
var url = "https://egamepass.pages.dev";
var urlObj = new window.URL(window.location.href);
document.getElementById("create").onclick = function () {
if (url.value.substring(0, 8) !== "https://" && url.value.substring(0, 7) !== "http://") {
url.value = "https://" + url.value.split("https://").pop();
} else if (url.value.substring(0, 7) == "http://") {
url.value = "https://" + url.value.split("http://").pop();
}
win = window.open();
win.document.body.style.margin = "0";
win.document.body.style.height = "100vh";
var iframe = win.document.createElement("iframe");
iframe.style.border = "none";
iframe.style.width = "100%";
iframe.style.height = "100%";
iframe.style.margin = "0";
iframe.referrerpolicy = "no-referrer";
iframe.allow = "fullscreen";
iframe.src = url.value;
win.document.body.appendChild(iframe);
};

View File

@ -21,7 +21,7 @@
<p class="notSupportedMessage">JavaScript appears to be disabled. Please enable it to view this content.</p>
</div>
</noscript>
<script type="82602b3792b8678659e83237-text/javascript">
<script type="text/javascript">
document.addEventListener('touchmove', function(e) {
e.preventDefault();
}, { passive: false });
@ -38,9 +38,9 @@
}
}, false);
</script>
<script src="scripts/supportcheck.js" type="82602b3792b8678659e83237-text/javascript"></script>
<script src="scripts/offlineclient.js" type="82602b3792b8678659e83237-module"></script>
<script src="scripts/main.js" type="82602b3792b8678659e83237-module"></script>
<script src="scripts/register-sw.js" type="82602b3792b8678659e83237-module"></script>
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="82602b3792b8678659e83237-|49" defer=""></script></body>
<script src="scripts/supportcheck.js" type="text/javascript"></script>
<script src="scripts/offlineclient.js" type="module"></script>
<script src="scripts/main.js" type="module"></script>
<script src="scripts/register-sw.js" type="module"></script>
<script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="|49" defer=""></script></body>
</html>

File diff suppressed because one or more lines are too long

BIN
monkeymart/MonkeyMart.wasm Normal file

Binary file not shown.

File diff suppressed because one or more lines are too long

BIN
monkeymart/archive.zip Normal file

Binary file not shown.

View File

@ -0,0 +1 @@
{"content":[{"name":"game.projectc","size":4051,"pieces":[{"name":"game.projectc0","offset":0}]},{"name":"game.arci","size":25968,"pieces":[{"name":"game.arci0","offset":0}]},{"name":"game.arcd","size":3776864,"pieces":[{"name":"game.arcd0","offset":0},{"name":"game.arcd1","offset":2097152}]},{"name":"game.dmanifest","size":24407,"pieces":[{"name":"game.dmanifest0","offset":0}]},{"name":"game.public.der","size":162,"pieces":[{"name":"game.public.der0","offset":0}]}]}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,217 @@
[project]
title = MonkeyMart
version = 2.2
write_log = 0
compress_archive = 1
publisher = unnamed
developer = unnamed
bundle_resources = bundle
title_as_file_name = MonkeyMart
[display]
width = 960
height = 640
high_dpi = 1
samples = 0
fullscreen = 0
update_frequency = 60
swap_interval = 1
vsync = 1
display_profiles = /builtins/render/default.display_profilesc
dynamic_orientation = 0
display_device_info = 0
[render]
clear_color_red = 0
clear_color_green = 0
clear_color_blue = 0
clear_color_alpha = 0
[physics]
type = 2D
max_collision_object_count = 128
use_fixed_timestep = 0
gravity_y = -10
debug = 0
debug_alpha = 0.9
world_count = 4
gravity_x = 0
gravity_z = 0
scale = 1
allow_dynamic_transforms = 1
debug_scale = 30
max_collisions = 64
max_contacts = 128
contact_impulse_limit = 0
ray_cast_limit_2d = 64
ray_cast_limit_3d = 128
trigger_overlap_capacity = 16
velocity_threshold = 1
max_fixed_timesteps = 2
[bootstrap]
main_collection = /main/controller.collectionc
render = /orthographic/render/orthographic.renderc
[graphics]
default_texture_min_filter = linear
default_texture_mag_filter = linear
max_draw_calls = 1024
max_characters = 8192
max_debug_vertices = 10000
texture_profiles = /updated.texture_profiles
verify_graphics_calls = 1
memory_size = 512
[shader]
output_spirv = 0
[sound]
gain = 1
max_sound_data = 128
max_sound_buffers = 32
max_sound_sources = 16
max_sound_instances = 256
max_component_count = 32
use_thread = 1
[resource]
http_cache = 0
max_resources = 1024
[input]
repeat_delay = 0.5
repeat_interval = 0.2
gamepads = /builtins/input/default.gamepadsc
game_binding = /input/game.input_bindingc
use_accelerometer = 1
[sprite]
max_count = 512
subpixels = 1
[model]
max_count = 128
split_meshes = 0
[mesh]
max_count = 128
[gui]
max_count = 64
max_particlefx_count = 64
max_particle_count = 1024
[collection]
max_instances = 2048
max_input_stack_entries = 16
[collection_proxy]
max_count = 8
[collectionfactory]
max_count = 128
[factory]
max_count = 128
[ios]
launch_screen = /builtins/manifests/ios/LaunchScreen.storyboardc
pre_renderered_icons = 0
bundle_identifier = example.unnamed
bundle_name =
infoplist = /builtins/manifests/ios/Info.plist
default_language = en
localizations = en
[android]
version_code = 1
minimum_sdk_version = 16
target_sdk_version = 31
package = com.example.todo
gcm_sender_id =
manifest = /builtins/manifests/android/AndroidManifest.xml
iap_provider = GooglePlay
input_method = HiddenInputField
immersive_mode = 0
display_cutout = 1
debuggable = 0
proguard =
[osx]
app_icon =
infoplist = /builtins/manifests/osx/Info.plist
bundle_identifier = example.unnamed
bundle_name =
bundle_version = 1
default_language = en
localizations = en
[windows]
app_icon =
[html5]
custom_heap_size = 0
heap_size = 64
htmlfile = /engine_template.html
cssfile = /css_theme.css
splash_image = /images/bg_loading.png
archive_location_prefix = archive
archive_location_suffix =
engine_arguments = --verify-graphics-calls=false
wasm_streaming = 0
show_fullscreen_button = 0
show_made_with_defold = 0
show_console_banner = 1
scale_mode = stretch
[particle_fx]
max_count = 0
max_emitter_count = 0
max_particle_count = 0
[iap]
auto_finish_transactions = 1
[network]
http_timeout = 0
ssl_certificates =
http_thread_count = 4
http_cache_enabled = 1
[library]
include_dirs =
[script]
shared_state = 1
[label]
max_count = 64
subpixels = 1
[profiler]
track_cpu = 0
sleep_between_server_updates = 0
[liveupdate]
settings = /liveupdate.settings
enabled = 1
[tilemap]
max_count = 0
max_tile_count = 0
[engine]
run_while_iconified = 0
fixed_update_frequency = 60
[gameanalytics]
game_key_html5 = 8460790931685c9f59f3e669a97521bd
secret_key_html5 = 6d3a08c1c25fca8bb1587ed50c42a81ddff80aa0
[spine]
max_count = 512
[native_extension]
app_manifest = /manifest.appmanifest

Binary file not shown.

BIN
monkeymart/bg_loading.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

852
monkeymart/dmloader.js Normal file
View File

@ -0,0 +1,852 @@
// file downloader
// wraps XMLHttpRequest and adds retry support and progress updates when the
// content is gzipped (gzipped content doesn't report a computable content length
// on Google Chrome)
var FileLoader = {
options: {
retryCount: 4,
retryInterval: 1000,
},
// do xhr request with retries
request: function(url, method, responseType, currentAttempt) {
if (typeof method === 'undefined') throw "No method specified";
if (typeof method === 'responseType') throw "No responseType specified";
if (typeof currentAttempt === 'undefined') currentAttempt = 0;
var obj = {
send: function() {
var onprogress = this.onprogress;
var onload = this.onload;
var onerror = this.onerror;
var xhr = new XMLHttpRequest();
xhr.open(method, url, true);
xhr.responseType = responseType;
xhr.onprogress = function(e) {
if (onprogress) onprogress(xhr, e);
};
xhr.onerror = function(e) {
if (currentAttempt == FileLoader.options.retryCount) {
if (onerror) onerror(xhr, e);
return;
}
currentAttempt = currentAttempt + 1;
setTimeout(obj.send.bind(obj), FileLoader.options.retryInterval);
};
xhr.onload = function(e) {
if (onload) onload(xhr, e);
};
xhr.send(null);
}
};
return obj;
},
// Do HTTP HEAD request to get size of resource
// callback will receive size or undefined in case of an error
size: function(url, callback) {
var request = FileLoader.request(url, "HEAD", "text");
request.onerror = function(xhr, e) {
callback(undefined);
};
request.onload = function(xhr, e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var total = xhr.getResponseHeader('content-length');
callback(total);
} else {
callback(undefined);
}
}
};
request.send();
},
// Do HTTP GET request
// onprogress(loaded, total)
// onerror(error)
// onload(response)
load: function(url, responseType, estimatedSize, onprogress, onerror, onload) {
var request = FileLoader.request(url, "GET", responseType);
request.onprogress = function(xhr, e) {
if (e.lengthComputable) {
onprogress(e.loaded, e.total);
return;
}
var contentLength = xhr.getResponseHeader('content-length');
var size = contentLength != undefined ? contentLength : estimatedSize;
if (size) {
onprogress(e.loaded, size);
} else {
onprogress(e.loaded, e.loaded);
}
};
request.onerror = function(xhr, e) {
onerror("Error loading '" + url + "' (" + e + ")");
};
request.onload = function(xhr, e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var res = xhr.response;
if (responseType == "json" && typeof res === "string") {
onload(JSON.parse(res));
} else {
onload(res);
}
} else {
onerror("Error loading '" + url + "' (" + e + ")");
}
}
};
request.send();
}
};
var EngineLoader = {
wasm_size: 2000000,
wasmjs_size: 250000,
asmjs_size: 4000000,
stream_wasm: false,
loadAndInstantiateWasmAsync: function(src, fromProgress, toProgress, callback) {
FileLoader.load(src, "arraybuffer", EngineLoader.wasm_size,
function(loaded, total) { Progress.calculateProgress(fromProgress, toProgress, loaded, total); },
function(error) { throw error; },
function(wasm) {
Module.instantiateWasm = function(imports, successCallback) {
var wasmInstantiate = WebAssembly.instantiate(new Uint8Array(wasm), imports).then(function(output) {
successCallback(output.instance);
}).catch(function(e) {
console.log('wasm instantiation failed! ' + e);
throw e;
});
return {}; // Compiling asynchronously, no exports.
}
callback();
});
},
setupWasmStreamAsync: async function(src, fromProgress, toProgress) {
// https://stackoverflow.com/a/69179454
var fetchFn = fetch;
if (typeof TransformStream === "function" && ReadableStream.prototype.pipeThrough) {
async function fetchWithProgress(path) {
const response = await fetch(path);
// May be incorrect if compressed
const contentLength = response.headers.get("Content-Length");
const total = parseInt(contentLength, 10);
let bytesLoaded = 0;
const ts = new TransformStream({
transform (chunk, controller) {
bytesLoaded += chunk.byteLength;
Progress.calculateProgress(fromProgress, toProgress, bytesLoaded, total);
controller.enqueue(chunk)
}
});
return new Response(response.body.pipeThrough(ts), response);
}
fetchFn = fetchWithProgress;
}
Module.instantiateWasm = function(imports, successCallback) {
WebAssembly.instantiateStreaming(fetchFn(src), imports).then(function(output) {
Progress.calculateProgress(fromProgress, toProgress, 1, 1);
successCallback(output.instance);
}).catch(function(e) {
console.log('wasm streaming instantiation failed! ' + e);
throw e;
});
return {}; // Compiling asynchronously, no exports.
}
},
// instantiate the .wasm file either by streaming it or first loading and then instantiate it
// https://github.com/emscripten-core/emscripten/blob/master/tests/manual_wasm_instantiate.html#L170
loadWasmAsync: function(exeName) {
if (EngineLoader.stream_wasm && (typeof WebAssembly.instantiateStreaming === "function")) {
EngineLoader.setupWasmStreamAsync(exeName + ".wasm", 10, 50);
EngineLoader.loadAndRunScriptAsync(exeName + '_wasm.js', EngineLoader.wasmjs_size, 0, 10);
}
else {
EngineLoader.loadAndInstantiateWasmAsync(exeName + ".wasm", 0, 40, function() {
EngineLoader.loadAndRunScriptAsync(exeName + '_wasm.js', EngineLoader.wasmjs_size, 40, 50);
});
}
},
loadAsmJsAsync: function(exeName) {
EngineLoader.loadAndRunScriptAsync(exeName + '_asmjs.js', EngineLoader.asmjs_size, 0, 50);
},
// load and start engine script (asm.js or wasm.js)
loadAndRunScriptAsync: function(src, estimatedSize, fromProgress, toProgress) {
FileLoader.load(src, "text", estimatedSize,
function(loaded, total) { Progress.calculateProgress(fromProgress, toProgress, loaded, total); },
function(error) { throw error; },
function(response) {
var tag = document.createElement("script");
tag.text = response;
document.head.appendChild(tag);
});
},
// load engine (asm.js or wasm.js + wasm)
load: function(appCanvasId, exeName) {
Progress.addProgress(Module.setupCanvas(appCanvasId));
if (Module['isWASMSupported']) {
EngineLoader.loadWasmAsync(exeName);
} else {
EngineLoader.loadAsmJsAsync(exeName);
}
}
}
/* ********************************************************************* */
/* Load and combine game archive data that is split into archives */
/* ********************************************************************* */
var GameArchiveLoader = {
// which files to load
_files: [],
_fileIndex: 0,
// file
// name: intended filepath of built object
// size: expected size of built object.
// data: combined pieces
// downloaded: total bytes downloaded
// pieces: array of name, offset and data objects
// numExpectedFiles: total number of files expected in description
// lastRequestedPiece: index of last data file requested (strictly ascending)
// totalLoadedPieces: counts the number pieces received
//MAX_CONCURRENT_XHR: 6, // remove comment if throttling of XHR is desired.
isCompleted: false, // status of process
_onFileLoadedListeners: [], // signature: name, data.
_onArchiveLoadedListeners:[], // signature: void
_onFileDownloadErrorListeners: [], // signature: name
_currentDownloadBytes: 0,
_totalDownloadBytes: 0,
_archiveLocationFilter: function(path) { return "split" + path; },
cleanUp: function() {
this._files = [];
this._fileIndex = 0;
this.isCompleted = false;
this._onGameArchiveLoaderCompletedListeners = [];
this._onAllTargetsBuiltListeners = [];
this._onFileDownloadErrorListeners = [];
this._currentDownloadBytes = 0;
this._totalDownloadBytes = 0;
},
addListener: function(list, callback) {
if (typeof callback !== 'function') throw "Invalid callback registration";
list.push(callback);
},
notifyListeners: function(list, data) {
for (i=0; i<list.length; ++i) {
list[i](data);
}
},
addFileDownloadErrorListener: function(callback) {
this.addListener(this._onFileDownloadErrorListeners, callback);
},
notifyFileDownloadError: function(url) {
this.notifyListeners(this._onFileDownloadErrorListeners, url);
},
addFileLoadedListener: function(callback) {
this.addListener(this._onFileLoadedListeners, callback);
},
notifyFileLoaded: function(file) {
this.notifyListeners(this._onFileLoadedListeners, { name: file.name, data: file.data });
},
addArchiveLoadedListener: function(callback) {
this.addListener(this._onArchiveLoadedListeners, callback);
},
notifyArchiveLoaded: function() {
this.notifyListeners(this._onArchiveLoadedListeners);
},
setFileLocationFilter: function(filter) {
if (typeof filter !== 'function') throw "Invalid filter";
this._archiveLocationFilter = filter;
},
// load the archive_files.json with the list of files and their individual
// pieces
// descriptionUrl: location of text file describing files to be preloaded
loadArchiveDescription: function(descriptionUrl) {
FileLoader.load(
this._archiveLocationFilter(descriptionUrl),
"json",
undefined,
function (loaded, total) { },
function (error) { GameArchiveLoader.notifyFileDownloadError(descriptionUrl); },
function (json) { GameArchiveLoader.onReceiveDescription(json); });
},
onReceiveDescription: function(json) {
this._files = json.content;
this._totalDownloadBytes = 0;
this._currentDownloadBytes = 0;
// calculate total download size of all files
for(var i=0; i<this._files.length; ++i) {
this._totalDownloadBytes += this._files[i].size;
}
this.downloadContent();
},
downloadContent: function() {
var file = this._files[this._fileIndex];
// if the file consists of more than one piece we prepare an array to store the pieces in
if (file.pieces.length > 1) {
file.data = new Uint8Array(file.size);
}
// how many pieces to download at a time
var limit = file.pieces.length;
if (typeof this.MAX_CONCURRENT_XHR !== 'undefined') {
limit = Math.min(limit, this.MAX_CONCURRENT_XHR);
}
// download pieces
for (var i=0; i<limit; ++i) {
this.downloadPiece(file, i);
}
},
notifyDownloadProgress: function() {
Progress.calculateProgress(50, 100, this._currentDownloadBytes, this._totalDownloadBytes);
},
downloadPiece: function(file, index) {
if (index < file.lastRequestedPiece) {
throw "Request out of order";
}
var piece = file.pieces[index];
file.lastRequestedPiece = index;
file.totalLoadedPieces = 0;
var total = 0;
var downloaded = 0;
var url = this._archiveLocationFilter('/' + piece.name);
FileLoader.load(
url, "arraybuffer", undefined,
function (loaded, total) {
var delta = loaded - downloaded;
downloaded = loaded;
GameArchiveLoader._currentDownloadBytes += delta;
GameArchiveLoader.notifyDownloadProgress();
},
function (error) {
GameArchiveLoader.notifyFileDownloadError(error);
},
function (response) {
piece.data = new Uint8Array(response);
piece.dataLength = piece.data.length;
total = piece.dataLength;
downloaded = piece.dataLength;
GameArchiveLoader.onPieceLoaded(file, piece);
GameArchiveLoader.notifyDownloadProgress();
piece.data = undefined;
});
},
addPieceToFile: function(file, piece) {
if (1 == file.pieces.length) {
file.data = piece.data;
} else {
var start = piece.offset;
var end = start + piece.data.length;
if (0 > start) {
throw "Buffer underflow";
}
if (end > file.data.length) {
throw "Buffer overflow";
}
file.data.set(piece.data, piece.offset);
}
},
onPieceLoaded: function(file, piece) {
this.addPieceToFile(file, piece);
++file.totalLoadedPieces;
// is all pieces of the file loaded?
if (file.totalLoadedPieces == file.pieces.length) {
this.onFileLoaded(file);
}
// continue loading more pieces of the file
// if not all pieces are already in progress
else {
var next = file.lastRequestedPiece + 1;
if (next < file.pieces.length) {
this.downloadPiece(file, next);
}
}
},
verifyFile: function(file) {
// verify that we downloaded as much as we were supposed to
var actualSize = 0;
for (var i=0;i<file.pieces.length; ++i) {
actualSize += file.pieces[i].dataLength;
}
// if (actualSize != file.size) {
// throw "Unexpected data size";
// }
// verify the pieces
if (file.pieces.length > 1) {
var output = file.data;
var pieces = file.pieces;
for (i=0; i<pieces.length; ++i) {
var item = pieces[i];
// Bounds check
var start = item.offset;
var end = start + item.dataLength;
if (0 < i) {
var previous = pieces[i - 1];
if (previous.offset + previous.dataLength > start) {
throw "Segment underflow";
}
}
if (pieces.length - 2 > i) {
var next = pieces[i + 1];
if (end > next.offset) {
throw "Segment overflow";
}
}
}
}
},
onFileLoaded: function(file) {
this.verifyFile(file);
this.notifyFileLoaded(file);
++this._fileIndex;
if (this._fileIndex == this._files.length) {
this.onArchiveLoaded();
} else {
this.downloadContent();
}
},
onArchiveLoaded: function() {
this.isCompleted = true;
this.notifyArchiveLoaded();
}
};
/* ********************************************************************* */
/* Default splash and progress visualisation */
/* ********************************************************************* */
var Progress = {
progress_id: "defold-progress",
bar_id: "defold-progress-bar",
listeners: [],
addListener: function(callback) {
if (typeof callback !== 'function') throw "Invalid callback registration";
this.listeners.push(callback);
},
notifyListeners: function(percentage) {
for (i=0; i<this.listeners.length; ++i) {
this.listeners[i](percentage);
}
},
addProgress : function (canvas) {
/* Insert default progress bar below canvas */
canvas.insertAdjacentHTML('afterend', '<div id="' + Progress.progress_id + '" class="canvas-app-progress"><div id="' + Progress.bar_id + '" class="canvas-app-progress-bar" style="width: 0%;"></div></div>');
Progress.bar = document.getElementById(Progress.bar_id);
Progress.progress = document.getElementById(Progress.progress_id);
},
updateProgress: function(percentage) {
if (Progress.bar) {
Progress.bar.style.width = percentage + "%";
}
Progress.notifyListeners(percentage);
},
calculateProgress: function (from, to, current, total) {
this.updateProgress(from + (current / total) * (to - from));
},
removeProgress: function () {
if (Progress.progress.parentElement !== null) {
Progress.progress.parentElement.removeChild(Progress.progress);
// Remove any background/splash image that was set in runApp().
// Workaround for Safari bug DEF-3061.
Module.canvas.style.background = "";
}
}
};
/* ********************************************************************* */
/* Module is Emscripten namespace */
/* ********************************************************************* */
var Module = {
noInitialRun: true,
_filesToPreload: [],
_archiveLoaded: false,
_preLoadDone: false,
_waitingForArchive: false,
// Persistent storage
persistentStorage: true,
_syncInProgress: false,
_syncNeeded: false,
_syncInitial: false,
_syncMaxTries: 3,
_syncTries: 0,
arguments: [],
print: function(text) { console.log(text); },
printErr: function(text) { console.error(text); },
setStatus: function(text) { console.log(text); },
isWASMSupported: (function() {
try {
if (typeof WebAssembly === "object" && typeof WebAssembly.instantiate === "function") {
const module = new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00));
if (module instanceof WebAssembly.Module)
return new WebAssembly.Instance(module) instanceof WebAssembly.Instance;
}
} catch (e) {
}
return false;
})(),
prepareErrorObject: function (err, url, line, column, errObj) {
line = typeof line == "undefined" ? 0 : line;
column = typeof column == "undefined" ? 0 : column;
url = typeof url == "undefined" ? "" : url;
var errorLine = url + ":" + line + ":" + column;
var error = errObj || (typeof window.event != "undefined" ? window.event.error : "" ) || err || "Undefined Error";
var message = "";
var stack = "";
var backtrace = "";
if (typeof error == "object" && typeof error.stack != "undefined" && typeof error.message != "undefined") {
stack = String(error.stack);
message = String(error.message);
} else {
stack = String(error).split("\n");
message = stack.shift();
stack = stack.join("\n");
}
stack = stack || errorLine;
var callLine = /at (\S+:\d*$)/.exec(message);
if (callLine) {
message = message.replace(/(at \S+:\d*$)/, "");
stack = callLine[1] + "\n" + stack;
}
message = message.replace(/(abort\(.+\)) at .+/, "$1");
stack = stack.replace(/\?{1}\S+(:\d+:\d+)/g, "$1");
stack = stack.replace(/ *at (\S+)$/gm, "@$1");
stack = stack.replace(/ *at (\S+)(?: \[as \S+\])? +\((.+)\)/g, "$1@$2");
stack = stack.replace(/^((?:Object|Array)\.)/gm, "");
stack = stack.split("\n");
return { stack:stack, message:message };
},
hasWebGLSupport: function() {
var webgl_support = false;
try {
var canvas = document.createElement("canvas");
var gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
if (gl && gl instanceof WebGLRenderingContext) {
webgl_support = true;
}
} catch (error) {
console.log("An error occurred while detecting WebGL support: " + error);
webgl_support = false;
}
return webgl_support;
},
setupCanvas: function(appCanvasId) {
appCanvasId = (typeof appCanvasId === 'undefined') ? 'canvas' : appCanvasId;
Module.canvas = document.getElementById(appCanvasId);
return Module.canvas;
},
/**
* Module.runApp - Starts the application given a canvas element id
*
* 'extra_params' is an optional object that can have the following fields:
*
* 'archive_location_filter':
* Filter function that will run for each archive path.
*
* 'unsupported_webgl_callback':
* Function that is called if WebGL is not supported.
*
* 'engine_arguments':
* List of arguments (strings) that will be passed to the engine.
*
* 'persistent_storage':
* Boolean toggling the usage of persistent storage.
*
* 'custom_heap_size':
* Number of bytes specifying the memory heap size.
*
* 'disable_context_menu':
* Disables the right-click context menu on the canvas element if true.
*
* 'retry_time':
* Pause before retry file loading after error.
*
* 'retry_count':
* How many attempts we do when trying to download a file.
*
* 'can_not_download_file_callback':
* Function that is called if you can't download file after 'retry_count' attempts.
**/
runApp: function(appCanvasId, extra_params) {
Module.setupCanvas(appCanvasId);
var params = {
archive_location_filter: function(path) { return 'split' + path; },
unsupported_webgl_callback: undefined,
engine_arguments: [],
persistent_storage: true,
custom_heap_size: undefined,
disable_context_menu: true,
retry_time: 1,
retry_count: 10,
can_not_download_file_callback: undefined,
};
for (var k in extra_params) {
if (extra_params.hasOwnProperty(k)) {
params[k] = extra_params[k];
}
}
Module.arguments = params["engine_arguments"];
Module.persistentStorage = params["persistent_storage"];
var fullScreenContainer = params["full_screen_container"];
if (typeof fullScreenContainer === "string") {
fullScreenContainer = document.querySelector(fullScreenContainer);
}
Module.fullScreenContainer = fullScreenContainer || Module.canvas;
if (Module.hasWebGLSupport()) {
Module.canvas.focus();
// Add context menu hide-handler if requested
if (params["disable_context_menu"])
{
Module.canvas.oncontextmenu = function(e) {
e.preventDefault();
};
}
FileLoader.options.retryCount = params["retry_count"];
FileLoader.options.retryInterval = params["retry_time"] * 1000;
if (typeof params["can_not_download_file_callback"] === "function") {
GameArchiveLoader.addFileDownloadErrorListener(params["can_not_download_file_callback"]);
}
// Load and assemble archive
GameArchiveLoader.addFileLoadedListener(Module.onArchiveFileLoaded);
GameArchiveLoader.addArchiveLoadedListener(Module.onArchiveLoaded);
GameArchiveLoader.setFileLocationFilter(params["archive_location_filter"]);
GameArchiveLoader.loadArchiveDescription('/archive_files.json');
} else {
Progress.updateProgress(100, "Unable to start game, WebGL not supported");
Module.setStatus = function(text) {
if (text) Module.printErr('[missing WebGL] ' + text);
};
if (typeof params["unsupported_webgl_callback"] === "function") {
params["unsupported_webgl_callback"]();
}
}
},
onArchiveFileLoaded: function(file) {
Module._filesToPreload.push({path: file.name, data: file.data});
},
onArchiveLoaded: function() {
GameArchiveLoader.cleanUp();
Module._archiveLoaded = true;
Progress.updateProgress(100, "Starting...");
if (Module._waitingForArchive) {
Module._preloadAndCallMain();
}
},
toggleFullscreen: function(element) {
if (GLFW.isFullscreen) {
GLFW.cancelFullScreen();
} else {
GLFW.requestFullScreen(element);
}
},
preSync: function(done) {
// Initial persistent sync before main is called
FS.syncfs(true, function(err) {
if(err) {
Module._syncTries += 1;
console.error("FS syncfs error: " + err);
if (Module._syncMaxTries > Module._syncTries) {
Module.preSync(done);
} else {
Module._syncInitial = true;
done();
}
} else {
Module._syncInitial = true;
if (done !== undefined) {
done();
}
}
});
},
preloadAll: function() {
if (Module._preLoadDone) {
return;
}
Module._preLoadDone = true;
for (var i = 0; i < Module._filesToPreload.length; ++i) {
var item = Module._filesToPreload[i];
FS.createPreloadedFile("", item.path, item.data, true, true);
}
},
// Tries to do a MEM->IDB sync
// It will flag that another one is needed if there is already one sync running.
persistentSync: function() {
// Need to wait for the initial sync to finish since it
// will call close on all its file streams which will trigger
// new persistentSync for each.
if (Module._syncInitial) {
if (Module._syncInProgress) {
Module._syncNeeded = true;
} else {
Module._startSyncFS();
}
}
},
preInit: [function() {
/* Mount filesystem on preinit */
var dir = DMSYS.GetUserPersistentDataRoot();
FS.mkdir(dir);
// If IndexedDB is supported we mount the persistent data root as IDBFS,
// then try to do a IDB->MEM sync before we start the engine to get
// previously saved data before boot.
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
if (Module.persistentStorage && window.indexedDB) {
FS.mount(IDBFS, {}, dir);
// Patch FS.close so it will try to sync MEM->IDB
var _close = FS.close; FS.close = function(stream) { var r = _close(stream); Module.persistentSync(); return r; }
// Sync IDB->MEM before calling main()
Module.preSync(function() {
Module._preloadAndCallMain();
});
} else {
Module._preloadAndCallMain();
}
}],
preRun: [function() {
/* If archive is loaded, preload all its files */
if(Module._archiveLoaded) {
Module.preloadAll();
}
}],
postRun: [function() {
if(Module._archiveLoaded) {
Progress.removeProgress();
}
}],
_preloadAndCallMain: function() {
// If the archive isn't loaded,
// we will have to wait with calling main.
if (!Module._archiveLoaded) {
Module._waitingForArchive = true;
} else {
Module.preloadAll();
Progress.removeProgress();
if (Module.callMain === undefined) {
Module.noInitialRun = false;
} else {
Module.callMain(Module.arguments);
}
}
},
// Wrap IDBFS syncfs call with logic to avoid multiple syncs
// running at the same time.
_startSyncFS: function() {
Module._syncInProgress = true;
if (Module._syncMaxTries > Module._syncTries) {
FS.syncfs(false, function(err) {
Module._syncInProgress = false;
if (err) {
console.error("Module._startSyncFS error: " + err);
Module._syncTries += 1;
}
if (Module._syncNeeded) {
Module._syncNeeded = false;
Module._startSyncFS();
}
});
}
},
};
window.onerror = function(err, url, line, column, errObj) {
if (typeof Module.ccall !== 'undefined') {
var errorObject = Module.prepareErrorObject(err, url, line, column, errObj);
Module.ccall('JSWriteDump', 'null', ['string'], [JSON.stringify(errorObject.stack)]);
}
Module.setStatus('Exception thrown, see JavaScript console');
Module.setStatus = function(text) {
if (text) Module.printErr('[post-exception status] ' + text);
};
};

354
monkeymart/index.html Normal file
View File

@ -0,0 +1,354 @@
<html lang="en"><head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, minimal-ui, shrink-to-fit=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<!-- The above 4 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<script src="/js/all.js"></script>
<title>Monkey Mart</title>
<meta name="robots" content="noindex,nofollow" />
<style type="text/css">
/* Disable user selection to avoid strange bug in Chrome on Windows:
* Selecting a text outside the canvas, then clicking+draging would
* drag the selected text but block mouse down/up events to the engine.
*/
body {
position: fixed; /* Prevent overscroll */
margin:0;
padding:0;
}
.canvas-app-container {
width: 100%;
height: 100%;
position: absolute;
align-items: center;
justify-content: center;
overflow: hidden;
}
.canvas-app-container:-webkit-full-screen {
/* Auto width and height in Safari/Chrome fullscreen. */
width: auto;
height: auto;
}
#canvas {
outline: none;
border: 0;
width: 100%;
vertical-align: bottom;
}
#canvas-container {
position: relative;
}
canvas:focus, canvas:active {
outline: none;
border: 0;
ie-dummy: expression(this.hideFocus=true);
-moz-outline-style: none;
}
div {
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.banner-styleBottom {
margin: 0 auto;
position: fixed;
bottom: 0;
display: block;
left: 50%;
transform: translateX(-50%);
}
.banner-styleTop {
margin: 0 auto;
position: fixed;
top: 0;
display: block;
left: 50%;
transform: translateX(-50%);
}
.canvas-app-progress {
position: absolute;
background-color: #0A8A40;
height: 30px;
margin-top: -30px;
width: 100%;
}
.canvas-app-progress-bar {
font-size: 12px;
height: 30px;
color: rgb(255, 255, 255);
background-color: #FFE333;
text-align: center;
line-height: 20px;
}
.link, .button {
font-family: sans-serif;
font-size: 14px;
font-weight: normal;
font-style: normal;
font-stretch: normal;
line-height: normal;
letter-spacing: 0px;
padding-top: 12px;
}
.buttons-background {
background-color: #ffffff;
width: 100%;
height: 42px;
}
body {
background-color: #ffffff;
}
.canvas-app-container {
background: #00BB61;
/* background: -moz-linear-gradient(-45deg, rgba(250,252,255,1) 0%, rgba(250,252,255,1) 50%, rgba(245,249,255,1) 50%, rgba(245,249,255,1) 100%);
background: -webkit-gradient(left top, right bottom, color-stop(0%, rgba(250,252,255,1)), color-stop(50%, rgba(250,252,255,1)), color-stop(50%, rgba(245,249,255,1)), color-stop(100%, rgba(245,249,255,1)));
background: -webkit-linear-gradient(-45deg, rgba(250,252,255,1) 0%, rgba(250,252,255,1) 50%, rgba(245,249,255,1) 50%, rgba(245,249,255,1) 100%);
background: -o-linear-gradient(-45deg, rgba(250,252,255,1) 0%, rgba(250,252,255,1) 50%, rgba(245,249,255,1) 50%, rgba(245,249,255,1) 100%);
background: -ms-linear-gradient(-45deg, rgba(250,252,255,1) 0%, rgba(250,252,255,1) 50%, rgba(245,249,255,1) 50%, rgba(245,249,255,1) 100%);
background: linear-gradient(135deg, rgba(250,252,255,1) 0%, rgba(250,252,255,1) 50%, rgba(245,249,255,1) 50%, rgba(245,249,255,1) 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fafcff', endColorstr='#f5f9ff', GradientType=1 ); */
}
.canvas-app-canvas {
background-repeat: no-repeat;
background-position: center;
background-position: top;
background-size: cover;
background-image: url("bg_loading.png");
}
</style>
<script src="./poki-sdk.js"></script>
</head>
<body>
<div id="app-container" class="canvas-app-container" style="width: 640px; height: 360px;">
<div id="canvas-container" class="canvas-app-canvas-container">
<canvas id="canvas" class="canvas-app-canvas" tabindex="1" width="640" height="360"></canvas>
</div>
<div class="buttons-background">
</div>
<!-- center and anchor to bottom of page -->
<div id="progress-bar-root" style="position: absolute; bottom: 29px; left: 50%; visibility: visible; z-index: 4;">
<!-- <div id="progress-bar-text"> -->
<img id="progress-bar-bg" src="load_bar_bg.png" width="270" style="margin-left: -135px;">
<img id="progress-bar-fg" src="load_bar_fg.png" style="position: absolute; clip: rect(0px, 137.942px, 22px, 0px); margin-top: 0px; margin-left: -270px;" width="270">
</div>
</div>
<!-- -->
<!-- <div id="bannerTop" class="banner-styleTop"></div> -->
<!-- <div id="bannerBottom" class="banner-styleBottom"></div> -->
<!-- -->
<script id="engine-loader" type="text/javascript" src="dmloader.js"></script>
<!-- -->
<script id="engine-setup" type="text/javascript">
var extra_params = {
archive_location_filter: function( path ) {
return ("archive" + path + "");
},
engine_arguments: ["--verify-graphics-calls=false",],
custom_heap_size: 67108864,
full_screen_container: "#canvas-container",
disable_context_menu: true
}
Module['INITIAL_MEMORY'] = extra_params.custom_heap_size;
Module['onRuntimeInitialized'] = function() {
Module.runApp("canvas", extra_params);
};
Module["locateFile"] = function(path, scriptDirectory)
{
// dmengine*.wasm is hardcoded in the built JS loader for WASM,
// we need to replace it here with the correct project name.
if (path == "dmengine.wasm" || path == "dmengine_release.wasm" || path == "dmengine_headless.wasm") {
path = "MonkeyMart.wasm";
}
return scriptDirectory + path;
};
var is_iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
var buttonHeight = 0;
var prevInnerWidth = -1;
var prevInnerHeight = -1;
function resize_game_canvas() {
// Hack for iOS when exit from Fullscreen mode
if (is_iOS) {
window.scrollTo(0, 0);
}
var app_container = document.getElementById('app-container');
var game_canvas = document.getElementById('canvas');
var progress_bar_root = document.getElementById('progress-bar-root');
var progress_bar_fg = document.getElementById('progress-bar-fg');
var progress_bar_bg = document.getElementById('progress-bar-bg');
var innerWidth = window.innerWidth;
var innerHeight = window.innerHeight - buttonHeight;
if (prevInnerWidth == innerWidth && prevInnerHeight == innerHeight)
{
return;
}
prevInnerWidth = innerWidth;
prevInnerHeight = innerHeight;
var width = 960;
var height = 640;
var targetRatio = width / height;
var actualRatio = innerWidth / innerHeight;
//Stretch
width = innerWidth;
height = innerHeight;
app_container.style.width = width + "px";
app_container.style.height = height + buttonHeight + "px";
game_canvas.width = width;
game_canvas.height = height;
// progress bar
var bar_h = width < height ? width:height;
progress_bar_bg.width = Math.min(Math.ceil(bar_h * 0.06 * 300/24),width * 0.8);
progress_bar_bg.style.marginLeft = - progress_bar_bg.width/2 + "px";
progress_bar_fg.width = Math.ceil(progress_bar_bg.width * 1);
progress_bar_fg.style.marginTop = (progress_bar_bg.width * 0) * (0)/2 + "px";
progress_bar_fg.style.marginLeft = -progress_bar_bg.width/2 - progress_bar_fg.width/2 + "px";
// progress_bar_text.style.fontSize = Math.ceil(bar_h * 0.10) + "px";
progress_bar_root.style.bottom = Math.ceil(height*0.08 + buttonHeight) + "px";
}
resize_game_canvas();
window.addEventListener('resize', resize_game_canvas, false);
window.addEventListener('orientationchange', resize_game_canvas, false);
// window.addEventListener('wheel', e => e.preventDefault(), { passive: false });
window.addEventListener("keydown", function(e) {
if([32, 37, 38, 39, 40].indexOf(e.keyCode) > -1) {
e.preventDefault();
}
}, false);
window.addEventListener('focus', resize_game_canvas, false);
// HashSHA1 implementation
!function(){var r=function(r){for(var n="",t=7;t>=0;t--)n+="0123456789abcdef".charAt(r>>4*t&15);return n},n=function(r,n){var t=(65535&r)+(65535&n);return(r>>16)+(n>>16)+(t>>16)<<16|65535&t},e=function(r,n){return r<<n|r>>>32-n},o=function(r,n,t,e){return r<20?n&t|~n&e:r<40?n^t^e:r<60?n&t|n&e|t&e:n^t^e},u=function(r){return r<20?1518500249:r<40?1859775393:r<60?-1894007588:-899497514};window._HashSHA1=function(f){for(var a=function(r){for(var n=1+(r.length+8>>6),t=new Array(16*n),e=0;e<16*n;e++)t[e]=0;for(e=0;e<r.length;e++)t[e>>2]|=r.charCodeAt(e)<<24-e%4*8;return t[e>>2]|=128<<24-e%4*8,t[16*n-1]=8*r.length,t}(f),c=new Array(80),i=1732584193,h=-271733879,v=-1732584194,A=271733878,g=-1009589776,l=0;l<a.length;l+=16){for(var w=i,d=h,y=v,H=A,b=g,s=0;s<80;s++)c[s]=s<16?a[l+s]:e(c[s-3]^c[s-8]^c[s-14]^c[s-16],1),t=n(n(e(i,5),o(s,h,v,A)),n(n(g,c[s]),u(s))),g=A,A=v,v=e(h,30),h=i,i=t;i=n(i,w),h=n(h,d),v=n(v,y),A=n(A,H),g=n(g,b)}return r(i)+r(h)+r(v)+r(A)+r(g)}}();
// Delete all LiveUpdate files stored in IDBFS
var old_preloadAndCallMain = Module._preloadAndCallMain;
Module._preloadAndCallMain = function () {
var dir = DMSYS.GetUserPersistentDataRoot();
var resDir = _HashSHA1("MonkeyMart");
try {
FS.unlink(dir + "/." + resDir + "/liveupdate.arcd");
} catch (e) {}
try {
FS.unlink(dir + "/." + resDir + "/liveupdate.arci");
} catch (e) {}
try {
FS.unlink(dir + "/." + resDir + "/liveupdate.arci.tmp");
} catch (e) {}
old_preloadAndCallMain();
if (Module._archiveLoaded) {
//
}
};
</script>
<script id="engine-start" type="text/javascript">
var currentPercentage = 0
Progress.updateProgress = function(percentage) {
Progress.notifyListeners(percentage);
if(currentPercentage>percentage){
percentage = currentPercentage
}
currentPercentage = percentage
// var progress_bar_text = document.getElementById('progress-bar-text');
// progress_bar_text.innerHTML = "<b>" + Math.ceil(percentage) + "%</b>";
var fg = document.getElementById('progress-bar-fg');
fg.style.clip="rect(0px," + fg.width * percentage/100 + "px," + fg.height+"px," + "0px)"
if(isNaN(percentage)){
var progress_bar_root = document.getElementById('progress-bar-root');
progress_bar_root.style.visibility = "hidden";
}
};
Progress.addProgress = function (){
var progress_bar_root = document.getElementById('progress-bar-root');
progress_bar_root.style.visibility = "visible"
}
Progress.removeProgress = function () {
var progress_bar_root = document.getElementById('progress-bar-root');
progress_bar_root.style.visibility = "hidden";
// Remove any background/splash image that was set in runApp().
// Workaround for Safari bug DEF-3061.
Module.canvas.style.background = "";
}
EngineLoader.stream_wasm = "false" === "true";
EngineLoader.load("canvas", "MonkeyMart");
</script>
<script type="text/javascript">
function poki_showBanner(vBanner) {
PokiSDK.displayAd(document.getElementById(vBanner), '320x50');
}
function poki_showBigBanner(vBanner) {
PokiSDK.displayAd(document.getElementById(vBanner), '728x90');
}
function poki_hideBanner(vBanner) {
PokiSDK.destroyAd(document.getElementById(vBanner));
}
</script>
<script id="poki-sdk-setup" type="text/javascript">
// PokiSDK.gameLoadingStart();
// var data = {};
// var isLoadFinished = false;
// Progress.addListener(function(percentage){
// data.percentageDone = percentage / 100;
// if (!isLoadFinished)
// PokiSDK.gameLoadingProgress(data);
// if (percentage == 100 && !isLoadFinished) {
// PokiSDK.gameLoadingFinished();
// isLoadFinished = true;
// }
// });
Module['onRuntimeInitialized'] = function() {
// PokiSDK.init().then(()=>{
// Module.runApp("canvas", extra_params);
// }).catch(()=>{
// Module.runApp("canvas", extra_params);
// });
Module.runApp("canvas", extra_params);
};
</script>
<script type="text/javascript" src="GameAnalytics.js"></script>
</body></html>

BIN
monkeymart/load_bar_bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 501 B

BIN
monkeymart/load_bar_fg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 B

BIN
monkeymart/pack.zip Normal file

Binary file not shown.

File diff suppressed because one or more lines are too long

85
monkeymart/poki-sdk.js Normal file
View File

@ -0,0 +1,85 @@
(() => {
var e = function(e) {
var n = RegExp("[?&]" + e + "=([^&]*)").exec(window.location.search);
return n && decodeURIComponent(n[1].replace(/\+/g, " "))
},
n = "kids" === e("tag"),
t = new(function() {
function e() {
var e = this;
this.queue = [], this.init = function(n) {
return void 0 === n && (n = {}), new Promise((function(t, o) {
e.enqueue("init", n, t, o)
}))
}, this.rewardedBreak = function() {
return new Promise((function(e) {
e(!1)
}))
}, this.noArguments = function(n) {
return function() {
e.enqueue(n)
}
}, this.oneArgument = function(n) {
return function(t) {
e.enqueue(n, t)
}
}, this.handleAutoResolvePromise = function() {
return new Promise((function(e) {
e()
}))
}, this.throwNotLoaded = function() {
console.debug("PokiSDK is not loaded yet. Not all methods are available.")
}
}
return e.prototype.enqueue = function(e, t, o, i) {
var r = {
fn: e,
options: t,
resolveFn: o,
rejectFn: i
};
n ? i && i() : this.queue.push(r)
}, e.prototype.dequeue = function() {
for (var e = function() {
var e = n.queue.shift(),
t = e,
o = t.fn,
i = t.options;
"function" == typeof window.PokiSDK[o] ? (null == e ? void 0 : e.resolveFn) || (null == e ? void 0 : e.rejectFn) ? window.PokiSDK[o](i).then((function() {
for (var n = [], t = 0; t < arguments.length; t++) n[t] = arguments[t];
"function" == typeof e.resolveFn && e.resolveFn.apply(e, n)
})).catch((function() {
for (var n = [], t = 0; t < arguments.length; t++) n[t] = arguments[t];
"function" == typeof e.rejectFn && e.rejectFn.apply(e, n)
})) : void 0 !== (null == e ? void 0 : e.fn) && window.PokiSDK[o](i) : console.error("Cannot execute " + e.fn)
}, n = this; this.queue.length > 0;) e()
}, e
}());
window.PokiSDK = {
init: t.init,
initWithVideoHB: t.init,
customEvent: t.throwNotLoaded,
commercialBreak: t.handleAutoResolvePromise,
rewardedBreak: t.rewardedBreak,
displayAd: t.throwNotLoaded,
destroyAd: t.throwNotLoaded,
getLeaderboard: t.handleAutoResolvePromise,
getSharableURL: function() {
return new Promise((function(e, n) {
return n()
}))
},
getURLParam: function(n) {
return e("gd" + n) || e(n) || ""
}
}, ["disableProgrammatic", "gameLoadingStart", "gameLoadingFinished", "gameInteractive", "roundStart", "roundEnd", "muteAd"].forEach((function(e) {
window.PokiSDK[e] = t.noArguments(e)
})), ["setDebug", "gameplayStart", "gameplayStop", "gameLoadingProgress", "happyTime", "setPlayerAge", "togglePlayerAdvertisingConsent", "logError", "sendHighscore", "setDebugTouchOverlayController"].forEach((function(e) {
window.PokiSDK[e] = t.oneArgument(e)
}));
var o, i = ((o = window.pokiSDKVersion) || (o = e("ab") || "v2.263.0"), "//tbg95.github.io/poki-sdk-" + (n ? "kids" : "core") + "-" + o + ".js"),
r = document.createElement("script");
r.setAttribute("src", i), r.setAttribute("type", "text/javascript"), r.setAttribute("crossOrigin", "anonymous"), r.onload = function() {
return t.dequeue()
}, document.head.appendChild(r)
})();

BIN
monkeymart/resources.zip Normal file

Binary file not shown.

BIN
monkeymart/unnamed.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

View File

@ -215,7 +215,7 @@ main {
left: 6.5vw;
top: 66%;
transition: 0.5s;
width: 20vw;
width: 35vw;
height: 50px;
}

View File

@ -8,12 +8,7 @@
<meta name="description" content="grow your nut empire">
<meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' name='viewport' />
<!-- Google Analytics -->
<script>
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-92834321-1', 'auto');
ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>
<script src="/js/all.js"></script>
<!-- End Google Analytics -->
</head>
<body>
@ -139,6 +134,8 @@
<button onclick="Save()" class="button" id="menuButton">save</button>
<button onclick="DeleteSave()" class="button" id="menuButton2">delete save</button>
<button onclick="Load()" class="button" id="menuButton3">load save</button>
<button onclick="Download()" class="button" id="menuButton4">download save</button>
<button onclick="Upload()" class="button" id="menuButton5">upload save</button>
</span>
</div>

View File

@ -1946,4 +1946,13 @@ toggleAudio();
//disable clicking on menu by accident before opening
document.getElementById('menuButton').disabled = true;
document.getElementById('menuButton2').disabled = true;
document.getElementById('menuButton3').disabled = true;
document.getElementById('menuButton3').disabled = true;
function Upload() {
localStorage.setItem("save", atob(prompt("Paste your save data.")));
Load();
}
function Download() {
navigator.clipboard.writeText(btoa(localStorage.getItem("save")));
alert("Copied to clipboard.")
}

View File

@ -8,12 +8,8 @@
<meta name="description" content="grow your nut empire">
<meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' name='viewport'/>
<!-- Google Analytics -->
<script>
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-92834321-1', 'auto');
ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>
<script src="/js/all.js"></script>
<!-- End Google Analytics -->
</head>
<body>

View File

@ -3,6 +3,7 @@
<html>
<head>
<meta charset="utf-8">
<script src="/js/all.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<!-- We only include this to explicitly loosen the CSP of various packager environments. It does not provide any security. -->
<meta http-equiv="Content-Security-Policy" content="default-src * 'self' 'unsafe-inline' 'unsafe-eval' data: blob:">

View File

@ -4,6 +4,7 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Pokemon</title>
<script src="/js/all.js"></script>
<style>
@font-face {
font-family: pokemon;

View File

@ -12,7 +12,6 @@
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.9.0/cdn/themes/dark.css" />
<script type="module" src="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.9.0/cdn/shoelace-autoloader.js"></script>
<!-- initialize my stuff -->
<script src="/js/themes.js"></script>
<script src="/js/all.js"></script>
<script src="/js/games.js"></script>
<script src="/js/search.js"></script>
@ -24,7 +23,7 @@
<script src='https://cdn.jsdelivr.net/npm/@widgetbot/crate@3' async defer>
new Crate({
server: '1148719137238040606', // Selenite
channel: '1164203315068932156' // #commands
channel: '1173731814196645909' // #commands
})
</script>
<link rel="stylesheet" href="/style.css" />
@ -47,7 +46,7 @@
name="description"
content="Welcome to the one and only option for unblocked games. Welcome to Selenite."
/>
<meta name="author" content="Website Creator" />
<meta name="author" content="selenite-cc" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<!-- toastify -->

View File

@ -4,6 +4,7 @@
<title>Rise Higher</title>
<link rel="icon" type="image/x-icon" href="media/graphics/promo/Icons/128x128.png" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<script src="/js/all.js"></script>
<!-- Use this metatag when Apple fixes their IOS 9
<meta name="viewport" content="width=device-width,height=device-height, initial-scale=1, maximum-scale=1, user-scalable=0, minimal-ui"/>
-->

View File

@ -23,9 +23,9 @@
fileSize: 27,
loadingComments: ['Loading...'],
cachedDecompressedFileSizes: {
'RSD 1.1.0rc4.wasm.framework.unityweb':538308,
'https://raw.githubusercontent.com/supremegmes/supremegmes.github.io/main/games/rocketSoccer/RSD%201.1.0rc4.wasm.code.unityweb':26620102,
'https://raw.githubusercontent.com/supremegmes/supremegmes.github.io/main/games/rocketSoccer/RSD%201.1.0rc4.data.unityweb':29723236,
'https://cdn.glitch.global/e9e96233-30e8-4cf8-855a-84008f504f2e/RSD%201.1.0rc4.wasm.framework.unityweb':538308,
'https://cdn.glitch.me/e9e96233-30e8-4cf8-855a-84008f504f2e/RSD%201.1.0rc4.wasm.code.unityweb':26620102,
'https://cdn.glitch.me/e9e96233-30e8-4cf8-855a-84008f504f2e/RSD%201.1.0rc4.data.unityweb':29723236,
},
//
};

View File

@ -11,6 +11,7 @@
<link rel="icon" href="favicon-180.png" sizes="180x180">
<link rel="stylesheet" href="index.css">
<script src="https://unpkg.com/@ruffle-rs/ruffle"></script>
<script src="/js/all.js"></script>
</head>
<body>
<div id="nav">

View File

@ -13,7 +13,6 @@
<!-- initialize my stuff -->
<script src="/js/themes.js"></script>
<script src="/js/all.js"></script>
<script src="/js/main.js"></script>
<script src="/js/cloaks.js"></script>
@ -38,7 +37,7 @@
name="description"
content="Welcome to the one and only option for unblocked games. Welcome to Selenite."
/>
<meta name="author" content="Website Creator" />
<meta name="author" content="selenite-cc" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<!-- toastify -->

18
snake/README.md Normal file
View File

@ -0,0 +1,18 @@
# Snake Game
### 27.03.2022
##### [Author: Yegor Murunov](https://yegormurunov.gq)
A popular game snake, writen in javascript. Works both on PC and on touch screens (using swipes). With additional features.
#### Additional features:
- Random food ( banana, apple, carrot, eggplant ... ).
- 2 difficulty modes ( Easy and Hard ).
- In hard mode, you can't hit borders, also a bomb can appear next to food.
- In hard mode, if you touch a bomb, your snake's length will be halved ( rounded up ).
- There are skins for the snake.
- Stores the best record in localStorage.
- Set of music from google snake and minecraft.
[Play](https://yegormurunov.github.io/snake.js/)
[Author: Yegor Murunov](https://yegormurunov.gq)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1006 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 943 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 925 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 683 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Some files were not shown because too many files have changed in this diff Show More