- Added subtle highliting of attempted letters - Using correct backspace character - Reduced header size a little - Added a "define" button to show word definition
This commit is contained in:
parent
f9b1457dea
commit
5b79c43551
|
@ -63,14 +63,22 @@ export default class extends Controller {
|
|||
break;
|
||||
case MARKERS.RIGHT_CHAR:
|
||||
if (!keyElement.classList.contains("right-pos")) {
|
||||
keyElement.classList.remove("attempted");
|
||||
keyElement.classList.add("right-char");
|
||||
}
|
||||
break;
|
||||
case MARKERS.MISS:
|
||||
if (keyElement.classList.length == 0) {
|
||||
keyElement.classList.remove("attempted");
|
||||
if (!keyElement.classList.contains("right-pos") && !keyElement.classList.contains("right-char")) {
|
||||
keyElement.classList.remove("attempted");
|
||||
keyElement.classList.add("miss");
|
||||
}
|
||||
break;
|
||||
break;
|
||||
case MARKERS.ATTEMPTED:
|
||||
if (keyElement.classList.length == 0) {
|
||||
keyElement.classList.add("attempted");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ import { WordSource } from "../models/words.js";
|
|||
|
||||
|
||||
export default class extends Controller {
|
||||
static targets = ["row", "playfield", "topMessage", "nextPuzzleButton"];
|
||||
static targets = ["row", "playfield", "topMessage", "nextPuzzleButtons"];
|
||||
static outlets = ["overlay"];
|
||||
|
||||
async connect() {
|
||||
|
@ -44,6 +44,13 @@ export default class extends Controller {
|
|||
this._verifyGuess(rowElem);
|
||||
}
|
||||
}
|
||||
|
||||
loadDef(ev) {
|
||||
ev.preventDefault()
|
||||
|
||||
let word = this._gameController.currentWord();
|
||||
window.open(`https://www.ecosia.org/search?q=define+${word}`, "_blank");
|
||||
}
|
||||
|
||||
tappedBackspace() {
|
||||
if (this._activeLetter == 0) {
|
||||
|
@ -65,10 +72,14 @@ export default class extends Controller {
|
|||
|
||||
switch (results.guessResult) {
|
||||
case GUESS_RESULT.FOUL:
|
||||
this.overlayOutlet.showMessage("Not a valid word.");
|
||||
this.overlayOutlet.showMessage("Not a valid word");
|
||||
|
||||
rowElem.replaceWith(this._buildPlayfieldRow(this._gameController.wordLength()));
|
||||
this._activeLetter = 0;
|
||||
|
||||
window.dispatchEvent(new CustomEvent("guessResults", {
|
||||
detail: results
|
||||
}));
|
||||
break;
|
||||
case GUESS_RESULT.MISS:
|
||||
this._colorizeRow(rowElem, results);
|
||||
|
@ -76,7 +87,7 @@ export default class extends Controller {
|
|||
this._activeRowIndex += 1;
|
||||
if (this._activeRowIndex >= this._gameController.guesses()) {
|
||||
this.topMessageTarget.innerText = this._gameController.currentWord().toUpperCase();
|
||||
this.nextPuzzleButtonTarget.classList.remove("hide");
|
||||
this.nextPuzzleButtonsTarget.classList.remove("hide");
|
||||
} else {
|
||||
this._activeLetter = 0;
|
||||
}
|
||||
|
@ -86,17 +97,7 @@ export default class extends Controller {
|
|||
this._colorizeRow(rowElem, results);
|
||||
|
||||
this.topMessageTarget.innerText = "Hooray! You did it.";
|
||||
this.nextPuzzleButtonTarget.classList.remove("hide");
|
||||
|
||||
/*
|
||||
if (this._gameController.nextWord()) {
|
||||
this._buildPlayfield();
|
||||
} else {
|
||||
console.log("No more words");
|
||||
this._activeRowIndex = -1;
|
||||
this._colorizeRow(rowElem, results);
|
||||
}
|
||||
*/
|
||||
this.nextPuzzleButtonsTarget.classList.remove("hide");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -125,7 +126,7 @@ export default class extends Controller {
|
|||
this.playfieldTarget.replaceChildren.apply(this.playfieldTarget, newRows);
|
||||
|
||||
this.topMessageTarget.innerHTML = " "
|
||||
this.nextPuzzleButtonTarget.classList.add("hide");
|
||||
this.nextPuzzleButtonsTarget.classList.add("hide");
|
||||
|
||||
window.dispatchEvent(new CustomEvent("resetKeyColors"));
|
||||
}
|
||||
|
|
|
@ -7,7 +7,8 @@ export const GUESS_RESULT = {
|
|||
export const MARKERS = {
|
||||
MISS: 'm',
|
||||
RIGHT_POS: 'g',
|
||||
RIGHT_CHAR: 'y'
|
||||
RIGHT_CHAR: 'y',
|
||||
ATTEMPTED: 'a',
|
||||
};
|
||||
|
||||
class ProgressionState {
|
||||
|
@ -87,7 +88,13 @@ export class GameController {
|
|||
|
||||
if (this._currentWord.length <= 5) {
|
||||
if (!this._wordSource.isWord(guess)) {
|
||||
hits = {};
|
||||
for (let i = 0; i < guess.length; i++) {
|
||||
hits[guess[i]] = MARKERS.ATTEMPTED;
|
||||
}
|
||||
|
||||
return {
|
||||
hits: hits,
|
||||
guessResult: GUESS_RESULT.FOUL,
|
||||
};
|
||||
}
|
||||
|
|
|
@ -10,11 +10,25 @@
|
|||
}
|
||||
|
||||
body {
|
||||
height: 100vh;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
button {
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
button.secondary {
|
||||
background: var(--bg);
|
||||
color: var(--accent);
|
||||
}
|
||||
|
||||
button.secondary:hover {
|
||||
background: var(--bg);
|
||||
color: var(--accent-hover);
|
||||
}
|
||||
|
||||
main {
|
||||
flex-grow: 1;
|
||||
flex-shrink: 1;
|
||||
|
@ -23,8 +37,13 @@ main {
|
|||
flex-direction: column;
|
||||
}
|
||||
|
||||
body header > h1 {
|
||||
margin-block: 0.2rem;
|
||||
body header > h1:only-child {
|
||||
margin-block: 0.5rem;
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
body header {
|
||||
padding-block-end: 0;
|
||||
}
|
||||
|
||||
main > div:first-child {
|
||||
|
@ -45,6 +64,12 @@ div.playfield div[data-playfield-target="playfield"] {
|
|||
font-size: 2.5rem;
|
||||
}
|
||||
|
||||
div.playfield div[data-playfield-target="nextPuzzleButtons"] {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 0.8rem;
|
||||
}
|
||||
|
||||
div.keyboard > div {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
|
@ -61,6 +86,10 @@ div.keyboard button {
|
|||
border: solid 1px #444;
|
||||
}
|
||||
|
||||
div.keyboard button:hover {
|
||||
background: #bbb;
|
||||
}
|
||||
|
||||
div.keyboard > div:nth-child(2) {
|
||||
margin-inline: 2vw;
|
||||
}
|
||||
|
@ -75,16 +104,36 @@ button[data-keyboard-target="key"].right-pos {
|
|||
color: var(--color-right-letter-fg);
|
||||
}
|
||||
|
||||
button[data-keyboard-target="key"].right-pos:hover {
|
||||
background: var(--color-right-letter-bg);
|
||||
}
|
||||
|
||||
button[data-keyboard-target="key"].right-char {
|
||||
background: var(--color-has-letter-bg);
|
||||
color: var(--color-has-letter-fg);
|
||||
}
|
||||
|
||||
button[data-keyboard-target="key"].right-char:hover {
|
||||
background: var(--color-has-letter-bg);
|
||||
}
|
||||
|
||||
button[data-keyboard-target="key"].miss {
|
||||
background: var(--color-no-letter-bg);
|
||||
color: var(--color-no-letter-fg);
|
||||
}
|
||||
|
||||
button[data-keyboard-target="key"].miss:hover {
|
||||
background: var(--color-no-letter-bg);
|
||||
}
|
||||
|
||||
button[data-keyboard-target="key"].attempted {
|
||||
background: #ddd;
|
||||
}
|
||||
|
||||
button[data-keyboard-target="key"].miss:hover {
|
||||
background: #ddd;
|
||||
}
|
||||
|
||||
div.playfield div.row {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
|
@ -117,7 +166,7 @@ div.playfield div.row span.miss {
|
|||
|
||||
div.overlay {
|
||||
position: fixed;
|
||||
bottom: 25%;
|
||||
bottom: 30%;
|
||||
left: 10%;
|
||||
right: 10%;
|
||||
z-index: 10;
|
||||
|
@ -131,7 +180,7 @@ div.overlay.show {
|
|||
}
|
||||
|
||||
div.overlay-message {
|
||||
font-size: 2rem;
|
||||
font-size: 1.8rem;
|
||||
line-height: 2.2rem;
|
||||
|
||||
text-align: center;
|
||||
|
@ -145,5 +194,5 @@ div.overlay-message {
|
|||
}
|
||||
|
||||
.hide {
|
||||
display: none;
|
||||
display: none !important;
|
||||
}
|
|
@ -21,7 +21,10 @@
|
|||
<div data-playfield-target="topMessage"> </div>
|
||||
<div data-playfield-target="playfield"></div>
|
||||
|
||||
<button data-playfield-target="nextPuzzleButton" class="hide" data-action="playfield#loadNextPuzzle">Next Puzzle</button>
|
||||
<div data-playfield-target="nextPuzzleButtons" class="hide">
|
||||
<button class="secondary" data-action="playfield#loadDef">Define</button>
|
||||
<button data-action="playfield#loadNextPuzzle">Next Puzzle</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="keyboard" data-controller="keyboard"
|
||||
data-keyboard-playfield-outlet=".playfield"
|
||||
|
@ -54,7 +57,7 @@
|
|||
<button data-keyboard-target="key" data-action="keyboard#tappedKey" data-key="l">l</button>
|
||||
</div>
|
||||
<div>
|
||||
<button data-keyboard-target="key" data-action="keyboard#tapBackspace">←</button>
|
||||
<button data-keyboard-target="key" data-action="keyboard#tapBackspace"><strong>⌫</strong></button>
|
||||
<button data-keyboard-target="key" data-action="keyboard#tappedKey" data-key="z">z</button>
|
||||
<button data-keyboard-target="key" data-action="keyboard#tappedKey" data-key="x">x</button>
|
||||
<button data-keyboard-target="key" data-action="keyboard#tappedKey" data-key="c">c</button>
|
||||
|
@ -62,7 +65,7 @@
|
|||
<button data-keyboard-target="key" data-action="keyboard#tappedKey" data-key="b">b</button>
|
||||
<button data-keyboard-target="key" data-action="keyboard#tappedKey" data-key="n">n</button>
|
||||
<button data-keyboard-target="key" data-action="keyboard#tappedKey" data-key="m">m</button>
|
||||
<button data-keyboard-target="key" data-action="keyboard#tapEnter">↵</button>
|
||||
<button data-keyboard-target="key" data-action="keyboard#tapEnter"><strong>↵</strong></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
Loading…
Reference in a new issue