Add secret option to unlock giga qwörtle

This commit is contained in:
Arne Keller 2022-02-25 14:12:42 +01:00
parent 153c97ae43
commit de6e7811cf
3 changed files with 55 additions and 22 deletions

View File

@ -132,6 +132,10 @@ body.wide {
margin-top: 1em;
}
#puzzles {
width: 5em;
}
#copyarea {
display: none;
background-color: #1f2937;

View File

@ -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>

View File

@ -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]));
}
}