Add secret option to unlock giga qwörtle
This commit is contained in:
parent
153c97ae43
commit
de6e7811cf
@ -132,6 +132,10 @@ body.wide {
|
||||
margin-top: 1em;
|
||||
}
|
||||
|
||||
#puzzles {
|
||||
width: 5em;
|
||||
}
|
||||
|
||||
#copyarea {
|
||||
display: none;
|
||||
background-color: #1f2937;
|
||||
|
@ -20,6 +20,10 @@
|
||||
<label><input type="checkbox" id="wide">Breiter Modus</label>
|
||||
<br>
|
||||
<label><input type="checkbox" id="count">Anzahl bei richtigen Buchstaben</label>
|
||||
<div id="secret-options" style="display: none">
|
||||
<br>
|
||||
<label>Anzahl Wörter: <input type="number" id="puzzles" value="4"></label>
|
||||
</div>
|
||||
</div>
|
||||
<textarea id="copyarea"></textarea>
|
||||
</div>
|
||||
|
69
index.js
69
index.js
@ -33,12 +33,16 @@ function saveLocalStorage() {
|
||||
localStorage.setItem(LOCALSTORAGE_KEY, JSON.stringify(saveData));
|
||||
}
|
||||
|
||||
const inputAmount = document.getElementById("puzzles");
|
||||
|
||||
const NUMBER_OF_WORDS = Number(inputAmount.value) || 4;
|
||||
const daysSinceEpoch = Math.floor(new Date()/8.64e7);
|
||||
const startDay = 19046;
|
||||
const daysSinceStart = daysSinceEpoch - startDay + 1;
|
||||
const rng = mulberry32(daysSinceEpoch);
|
||||
const rngSeed = NUMBER_OF_WORDS === 4 ? daysSinceEpoch : (daysSinceEpoch*daysSinceEpoch*NUMBER_OF_WORDS);
|
||||
const rng = mulberry32(rngSeed);
|
||||
const chosenWords = [];
|
||||
for (let i = 0; i < 4; i++) {
|
||||
for (let i = 0; i < NUMBER_OF_WORDS; i++) {
|
||||
while (true) {
|
||||
const idx = Math.floor((rng() * words.length) % words.length);
|
||||
const chosen = words[idx];
|
||||
@ -51,13 +55,13 @@ for (let i = 0; i < 4; i++) {
|
||||
}
|
||||
|
||||
const WORD_LENGTH = 5;
|
||||
const MAX_GUESSES = 9;
|
||||
const MAX_GUESSES = 5 + NUMBER_OF_WORDS;
|
||||
const URL = "https://studwww.informatik.kit.edu/~s_keller/qwörtle/";
|
||||
const guessed = [];
|
||||
let input = "";
|
||||
const data = [];
|
||||
const solutions = [];
|
||||
const done = [false, false, false, false];
|
||||
const done = Array(NUMBER_OF_WORDS).fill(false);
|
||||
let shareText = "";
|
||||
|
||||
function gameOver() {
|
||||
@ -66,6 +70,7 @@ function gameOver() {
|
||||
}
|
||||
const NUMBERS = "0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣";
|
||||
const FAIL = "❌";
|
||||
const SOLVED = "✅";
|
||||
const ANY = "⬜";
|
||||
const POSITION = "🟨";
|
||||
const CORRECT = "🟩";
|
||||
@ -73,9 +78,13 @@ function gameOver() {
|
||||
let text = "";
|
||||
text += "Tägliches Qwörtle #" + daysSinceStart + "\n";
|
||||
let summary = "";
|
||||
for (let i = 0; i < 4; i++) {
|
||||
for (let i = 0; i < NUMBER_OF_WORDS; i++) {
|
||||
if (done[i]) {
|
||||
summary += NUMBERS.slice(done[i] * 3, done[i] * 3 + 3);
|
||||
if (done[i] <= 9) {
|
||||
summary += NUMBERS.slice(done[i] * 3, done[i] * 3 + 3);
|
||||
} else {
|
||||
summary += SOLVED;
|
||||
}
|
||||
} else {
|
||||
summary += FAIL;
|
||||
}
|
||||
@ -86,7 +95,7 @@ function gameOver() {
|
||||
document.getElementById("summary").innerText = summary;
|
||||
document.getElementById("summary").style.display = "block";
|
||||
text += summary + URL + "\n";
|
||||
for (let i = 0; i < 2; i++) {
|
||||
for (let i = 0; i < NUMBER_OF_WORDS / 2; i++) {
|
||||
for (let j = 0; j < MAX_GUESSES; j++) {
|
||||
const rowA = data[2*i * MAX_GUESSES + j];
|
||||
const rowB = data[(2*i+1) * MAX_GUESSES + j];
|
||||
@ -119,7 +128,7 @@ function gameOver() {
|
||||
}
|
||||
text += part1 + " " + part2 + "\n";
|
||||
}
|
||||
if (i === 0) {
|
||||
if (i % 2 === 0) {
|
||||
text += "\n";
|
||||
}
|
||||
}
|
||||
@ -148,9 +157,12 @@ document.getElementById("share").addEventListener("click", () => {
|
||||
});
|
||||
|
||||
let keys = {};
|
||||
let characters = [{}, {}, {}, {}];
|
||||
let characters = [];
|
||||
for (let i = 0; i < NUMBER_OF_WORDS; i++) {
|
||||
characters.push({});
|
||||
}
|
||||
|
||||
function makeGradient(a, b, c, d) {
|
||||
function makeGradient(a, b, c, d, allNope) {
|
||||
const CORRECT = "rgb(0 204 136)";
|
||||
const POSITION = "rgb(255 204 0)";
|
||||
const OTHER = "rgb(156, 163, 175)";
|
||||
@ -158,7 +170,7 @@ function makeGradient(a, b, c, d) {
|
||||
"correct": CORRECT,
|
||||
"position": POSITION
|
||||
};
|
||||
if (a === "nope" && b === "nope" && c === "nope" && d === "nope") {
|
||||
if (allNope) {
|
||||
return "rgb(21 94 117)";
|
||||
}
|
||||
const style = "conic-gradient(" +
|
||||
@ -183,7 +195,7 @@ function processKey(e) {
|
||||
console.error("word not in list");
|
||||
return;
|
||||
}
|
||||
for (let pos = 0; pos < 4; pos++) {
|
||||
for (let pos = 0; pos < NUMBER_OF_WORDS; pos++) {
|
||||
if (done[pos]) {
|
||||
for (let i = 0; i < WORD_LENGTH; i++) {
|
||||
const el = data[pos * MAX_GUESSES + guessed.length][i];
|
||||
@ -274,13 +286,23 @@ function processKey(e) {
|
||||
continue;
|
||||
}
|
||||
const c = char.toUpperCase();
|
||||
let anyNotNope = (characters[0][c] && characters[0][c] !== "nope")
|
||||
|| (characters[1][c] && characters[1][c] !== "nope")
|
||||
|| (characters[2][c] && characters[2][c] !== "nope")
|
||||
|| (characters[3][c] && characters[3][c] !== "nope");
|
||||
let anyNotNope = false;
|
||||
for (let i = 0; i < NUMBER_OF_WORDS; i++) {
|
||||
anyNotNope |= (characters[i][c] && characters[i][c] !== "nope");
|
||||
if (anyNotNope) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (anyNotNope || (characters[0][c] === "nope" && characters[1][c] === "nope" && characters[2][c] === "nope" && characters[3][c] === "nope")) {
|
||||
keys[char].style.background = makeGradient(characters[0][c], characters[1][c], characters[2][c], characters[3][c]);
|
||||
if (characters[0][c] === "nope" && characters[1][c] === "nope" && characters[2][c] === "nope" && characters[3][c] === "nope") {
|
||||
let allNope = true;
|
||||
for (let i = 0; i < NUMBER_OF_WORDS; i++) {
|
||||
if (characters[i][c] !== "nope") {
|
||||
allNope = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
keys[char].style.background = makeGradient(characters[0][c], characters[1][c], characters[2][c], characters[3][c], allNope);
|
||||
if (allNope) {
|
||||
keys[char].style.color = "#fff";
|
||||
keys[char].style.opacity = "0.5";
|
||||
} else if (anyNotNope) {
|
||||
@ -293,7 +315,7 @@ function processKey(e) {
|
||||
}
|
||||
return;
|
||||
} else if (e.key === "Backspace" && input.length > 0) {
|
||||
for (let pos = 0; pos < 4; pos++) {
|
||||
for (let pos = 0; pos < NUMBER_OF_WORDS; pos++) {
|
||||
data[pos * MAX_GUESSES + guessed.length][input.length - 1].innerText = "";
|
||||
}
|
||||
input = input.substring(0, input.length - 1);
|
||||
@ -310,7 +332,7 @@ function processKey(e) {
|
||||
console.error("input full");
|
||||
return;
|
||||
}
|
||||
for (let pos = 0; pos < 4; pos++) {
|
||||
for (let pos = 0; pos < NUMBER_OF_WORDS; pos++) {
|
||||
if (done[pos]) {
|
||||
continue;
|
||||
}
|
||||
@ -319,7 +341,7 @@ function processKey(e) {
|
||||
input += key;
|
||||
}
|
||||
const validGuess = input.length < 5 || validGuesses.indexOf(input) !== -1;
|
||||
for (let pos = 0; pos < 4; pos++) {
|
||||
for (let pos = 0; pos < NUMBER_OF_WORDS; pos++) {
|
||||
if (done[pos]) {
|
||||
continue;
|
||||
}
|
||||
@ -329,6 +351,9 @@ function processKey(e) {
|
||||
data[pos * MAX_GUESSES + guessed.length][0].parentElement.className = "row";
|
||||
}
|
||||
}
|
||||
if (input === "GIGAQ") {
|
||||
document.getElementById("secret-options").style.display = "block";
|
||||
}
|
||||
}
|
||||
document.addEventListener("keydown", processKey);
|
||||
|
||||
@ -360,7 +385,7 @@ for (let i = 0; i < 3; i++) {
|
||||
}
|
||||
|
||||
function createGameGrid(container) {
|
||||
for (let pos = 0; pos < 4; pos++) {
|
||||
for (let pos = 0; pos < NUMBER_OF_WORDS; pos++) {
|
||||
container.appendChild(createWordle(chosenWords[pos]));
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user