selectable levels

This commit is contained in:
Dominic DiTaranto 2025-09-10 23:39:27 -04:00
parent d91c92370f
commit ed0a12125d
3 changed files with 76 additions and 11 deletions

View file

@ -20,8 +20,8 @@ var level_2 = `
###### ######
`; `;
var level_3_par = 100; var level_10_par = 100;
var level_3 = ` var level_10 = `
###### ######
### #### ### ####
# 0 # # 0 #
@ -40,8 +40,8 @@ var level_4 = `
#### ####
`; `;
var level_5_par = 100; var level_3_par = 100;
var level_5 = ` var level_3 = `
####### #######
# # # #
# .0. # # .0. #
@ -100,8 +100,8 @@ var level_9 = `
### ###
`; `;
var level_10_par = 100; var level_5_par = 100;
var level_10 = ` var level_5 = `
##### #####
#. # #. #
#.# # #.# #
@ -1988,6 +1988,8 @@ var level_155 = `
`; `;
var microban_levels = [ var microban_levels = [
[level_1, level_1_par],
[level_2, level_2_par], [level_2, level_2_par],
[level_3, level_3_par], [level_3, level_3_par],
[level_4, level_4_par], [level_4, level_4_par],

View file

@ -1,14 +1,33 @@
var _listener; var _listener;
function getCookie(cname) {
let name = cname + "=";
let decodedCookie = decodeURIComponent(document.cookie);
let ca = decodedCookie.split(";");
for (let i = 0; i < ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == " ") {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
}
class Game { class Game {
constructor() { constructor() {
this.mapInstance = null; this.mapInstance = null;
this.levelCount = levels.length;
this.level = 1; this.level = 1;
this.lives = 10; this.lives = 10;
this.points = 0; this.points = 0;
this.totalMoves = 0; this.totalMoves = 0;
this.levelMoves = {}; this.levelMoves = {};
this.traditional = false; this.traditional = false;
this.populateLevelSelector();
} }
toggleTraditional() { toggleTraditional() {
@ -34,13 +53,38 @@ class Game {
document.removeEventListener("keydown", _listener); document.removeEventListener("keydown", _listener);
g.levelMoves[this.level] = 0; g.levelMoves[this.level] = 0;
this.lives -= 1; this.lives -= 1;
// handle points
this.initializeLevel(); this.initializeLevel();
} }
continue() {} populateLevelSelector() {
let elem = document.getElementById("level-selector");
elem.innerHTML = "";
let maxLevel = parseInt(getCookie("sokobanya")) + 1;
if (isNaN(maxLevel)) {
document.cookie = "sokobanya=1";
maxLevel = 1;
}
for (let i = 0; i < this.levelCount; i++) {
if (i !== 0) {
let opt = document.createElement("option");
opt.value = i;
opt.innerHTML = i;
handlePoints() {} if (i !== 1 && i > maxLevel) {
opt.disabled = true;
}
elem.appendChild(opt);
}
}
var self = this;
elem.addEventListener("change", function () {
self.levelMoves[this.level] = 0;
self.level = parseInt(elem.value);
self.initializeLevel();
});
}
} }
class Map { class Map {
@ -308,8 +352,14 @@ class Map {
} }
continue() { continue() {
let maxLevel = parseInt(getCookie("sokobanya"));
if (maxLevel < g.level) {
document.cookie = `sokobanya=${g.level}`;
}
console.log(parseInt(getCookie("sokobanya")));
g.level += 1; g.level += 1;
g.initializeLevel(); g.initializeLevel();
g.populateLevelSelector();
let continueLink = document.getElementById("continueLink"); let continueLink = document.getElementById("continueLink");
continueLink.classList.add("disabled"); continueLink.classList.add("disabled");
} }

View file

@ -99,6 +99,11 @@
color: green; color: green;
text-decoration: none; text-decoration: none;
} }
#level-select-container {
font-size: 15px;
margin-bottom: 10px;
}
</style> </style>
<div class="opts"> <div class="opts">
<a href="#" onclick="toggleDisplay('opts-menu')">settings</a> <a href="#" onclick="toggleDisplay('opts-menu')">settings</a>
@ -113,6 +118,10 @@
▄█ █▄█ █░█ █▄█ █▄█ █▀█ █░▀█ ░█░ █▀█ ▄█ █▄█ █░█ █▄█ █▄█ █▀█ █░▀█ ░█░ █▀█
</pre> </pre>
<div id="stats">LEVEL: 0 | MOVES: 0 | LIVES: 10 | POINTS: 0</div> <div id="stats">LEVEL: 0 | MOVES: 0 | LIVES: 10 | POINTS: 0</div>
<div id="level-select-container">
SELECT LEVEL:
<select name="level" id="level-selector"></select>
</div>
</center> </center>
<div class="container"> <div class="container">
<div id="map"></div> <div id="map"></div>
@ -196,6 +205,10 @@
</li> </li>
</ul> </ul>
<h4>UPDATES:</h4> <h4>UPDATES:</h4>
<li>
(09/10/25) v1.2: added level selector so you can pick up where you left
off (unless you delete your cookies or use a privacy browser).
</li>
<li> <li>
(09/07/25) v1.1: released mobile support via toggleable Dpad, see (09/07/25) v1.1: released mobile support via toggleable Dpad, see
settings at top right of page! Also added support for traditional settings at top right of page! Also added support for traditional
@ -204,9 +217,9 @@
<h4>TODO:</h4> <h4>TODO:</h4>
<ul> <ul>
<li><s>Mobile Support</s></li> <li><s>Mobile Support</s></li>
<li>Selectable levels upon completion</li> <li><s>Selectable levels upon completion</s></li>
<li>Create a cool song and SFX</li> <li>Create a cool song and SFX</li>
<li>Points system</li> <li>Points system (I probably will not do this, seems unnecessary)</li>
<li>Steam animation when you beat a level</li> <li>Steam animation when you beat a level</li>
<li>Add more level sets (worlds)</li> <li>Add more level sets (worlds)</li>
</ul> </ul>