selectable levels
This commit is contained in:
		
							parent
							
								
									d91c92370f
								
							
						
					
					
						commit
						ed0a12125d
					
				
					 3 changed files with 76 additions and 11 deletions
				
			
		| 
						 | 
					@ -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],
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										17
									
								
								index.html
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								index.html
									
									
									
									
									
								
							| 
						 | 
					@ -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>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue