diff --git a/assets/words.json b/assets/words.json index e6c1414..16d6a9b 100644 --- a/assets/words.json +++ b/assets/words.json @@ -71572,6 +71572,7 @@ "shirtwaists", "shirty", "shit", + "shite", "shitfaced", "shithead", "shitheads", diff --git a/config/default.js b/config/default.js index 86121ad..5c63c5c 100755 --- a/config/default.js +++ b/config/default.js @@ -136,7 +136,8 @@ module.exports = { }, wordle: { minLength: 3, - defaultLength: 5, + length: 5, + mode: 'easy', }, numbers: { length: 6, diff --git a/src/games/wordle.js b/src/games/wordle.js index 5a5f586..8e35a50 100644 --- a/src/games/wordle.js +++ b/src/games/wordle.js @@ -60,13 +60,13 @@ function getBoard(letters, showLetters, context) { : style.grey(letter); }).join(config.platform === 'irc' ? ' ' : ' '); // regular space vs em space - return `${prefix}${middle}${suffix} Letters: ${letterBoard}`; // eslint-disable-line no-irregular-whitespace + return `${prefix}${middle}${suffix}${wordle.mode === 'hard' ? ' (Hard)' : ''} Letters: ${letterBoard}`; // eslint-disable-line no-irregular-whitespace } return `${prefix}${middle}${suffix}`; } -function start(length = settings.defaultLength, context) { +function start(length = settings.length, mode = settings.mode, context) { const wordPool = words[length]; if (length < settings.minLength) { @@ -85,15 +85,16 @@ function start(length = settings.defaultLength, context) { wordles.set(context.room.id, { word: word.word.toUpperCase(), wordList, + mode, definitions: word.definitions, letters: new Map(alphabet.map((letter) => [letter, null])), guesses: [], }); if (config.platform === 'irc') { - context.sendMessage(`${getBoard(Array.from({ length }, () => null), false, context)} guess the word with ${config.prefix}w [word]! ${style.bgsilver(' X ')} not in word; ${style.bgyellow(` X${style.yellow('?')}`)} wrong position; ${style.bggreen(` X${style.green('*')}`)} correct position.`, context.room.id); // eslint-disable-line no-irregular-whitespace + context.sendMessage(`${getBoard(Array.from({ length }, () => null), false, context)}${mode === 'hard' ? ' (Hard)' : ''} guess the word with ${config.prefix}w [word]! ${style.bgsilver(' X ')} not in word; ${style.bgyellow(` X${style.yellow('?')}`)} wrong position; ${style.bggreen(` X${style.green('*')}`)} correct position.`, context.room.id); // eslint-disable-line no-irregular-whitespace } else { - context.sendMessage(`${getBoard(Array.from({ length }, () => null), false, context)} guess the word with ${config.prefix}w [word]! ${style.grey(style.bold('X'))} not in word; ${style.orange(style.bold('X'))} wrong position; ${style.green(style.bold('X'))} correct position.`, context.room.id); + context.sendMessage(`${getBoard(Array.from({ length }, () => null), false, context)}${mode === 'hard' ? ' (Hard)' : ''} guess the word with ${config.prefix}w [word]! ${style.grey(style.bold('X'))} not in word; ${style.orange(style.bold('X'))} wrong position; ${style.green(style.bold('X'))} correct position.`, context.room.id); } context.logger.info(`Wordle started: ${word.word.toUpperCase()}`); @@ -122,6 +123,37 @@ function play(guess, context) { const guessLetters = upperGuess.split(''); const check = guessLetters.map((letter) => [letter, null]); + const prevGuess = wordle.guesses.at(-1)?.[1]; + + if (wordle.mode === 'hard' && prevGuess) { + const prevLetters = prevGuess.split(''); + + const valid = prevLetters.every((letter, index) => { + if (wordle.letters.get(letter) === false && !guessLetters.includes(letter)) { + context.sendMessage(`(Hard) Your guess must include the letter ${config.platform === 'irc' + ? style.bggreen(` ${letter} `) + : `${style.grey(style.code('['))}${style.orange(style.bold(style.code(letter)))}${style.grey(style.code(']'))}` + }.`, context.room.id); + + return false; + } + + if (wordle.letters.get(letter) === true && letter === wordle.word[index] && letter !== guessLetters[index]) { + context.sendMessage(`(Hard) Your guess must include the letter ${config.platform === 'irc' + ? style.bgyellow(` ${letter} `) + : `${style.grey(style.code('['))}${style.green(style.bold(style.code(letter)))}${style.grey(style.code(']'))}` + } in the correct position.`, context.room.id); + + return false; + } + + return true; + }); + + if (!valid) { + return; + } + } // correct guessLetters.forEach((letter, index) => { @@ -169,7 +201,10 @@ function play(guess, context) { function onCommand(args, context) { const wordle = wordles.get(context.room.id); - const length = Number(args[0]) || settings.defaultLength; + const length = args.map((arg) => Number(arg)).find(Boolean) || settings.length; + const mode = args.find((arg) => arg === 'easy' || arg === 'hard') + || (context.command === 'hardle' && 'hard') + || settings.mode; if (['guess', 'w'].includes(context.command)) { play(args[0], context); @@ -189,7 +224,7 @@ function onCommand(args, context) { } if (!wordle && context.room.id) { - start(length, context); + start(length, mode, context); return; } @@ -198,8 +233,8 @@ function onCommand(args, context) { module.exports = { name: 'Wordle', - commands: ['wordle', 'guess', 'w'], - help: `Guess the ${settings.defaultLength}-letter word on the board. Submit a guess with ${config.prefix}w [word]. If the letter is green, it is in the correct place. If it is yellow, it is part of the word, but not in the correct place. The number of letters in the word is the highest score you can get. You lose 1 point per guess, down to 1 point.`, + commands: ['wordle', 'hardle', 'lingo', 'guess', 'w'], + help: `Guess the ${settings.length}-letter word on the board. Submit a guess with ${config.prefix}w [word]. If the letter is green, it is in the correct place. If it is yellow, it is part of the word, but not in the correct place. The number of letters in the word is the highest score you can get. You lose 1 point per guess, down to 1 point.`, onCommand, // onMessage, };