From 304d2999de0d1868da77b9e3d8daac5d2f21b34c Mon Sep 17 00:00:00 2001 From: "d.fomin" Date: Wed, 30 May 2018 06:28:47 +0500 Subject: [PATCH 1/2] all --- hero.png | Bin 0 -> 6642 bytes index.html | 24 +++++++ tamagochi.js | 194 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 218 insertions(+) create mode 100644 hero.png create mode 100644 tamagochi.js diff --git a/hero.png b/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..ff7cfe7fb8d929166ef26925eee3066d89ef8ff1 GIT binary patch literal 6642 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index ae344b1..ebea7dc 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,31 @@ Хрюногочи + +
+
+ hrundel +
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+ + +
+
diff --git a/tamagochi.js b/tamagochi.js new file mode 100644 index 0000000..32f8890 --- /dev/null +++ b/tamagochi.js @@ -0,0 +1,194 @@ +const Notification = window.Notification || window.webkitNotification; +const AudioContext = window.AudioContext || window.webkitAudioContext; +const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; + +const MAX_POINTS = 100; +const MIN_POINTS = 10; + +var hero; + +const heroActions = { + none: "NONE", + eating: "EATING", + sleeping: "SLEEPING", + listening: "LISTENING", +}; + +class Hero { + setDefaults() { + this.health = MAX_POINTS; + this.energy = MAX_POINTS; + this.mood = MAX_POINTS; + this.action = heroActions.none; + this.speechRecognizer = getSpeechRecognizer(); + this.recognizedText = ""; + } + + constructor(state) { + if (!state) { + this.setDefaults(); + return; + } + this.health = state.health; + this.energy = state.energy; + this.mood = state.mood; + this.action = state.action; + this.speechRecognizer = getSpeechRecognizer(); + } + + getState() { + return { + health: this.health, + energy: this.energy, + mood: this.mood, + action: this.action + }; + } + + isDead() { + return this.health === 0 && this.energy === 0 || + this.health === 0 && this.mood === 0 || + this.energy === 0 && this.mood === 0; + } + + update() { + if (this.action === heroActions.dead) { + return; + } + + this.health = Math.max(0, this.health - 10); + this.energy = Math.max(0, this.energy - 10); + this.mood = Math.max(0, this.mood - 1); + + if (this.health <= MIN_POINTS) { + this.notify('Здоровье'); + } + + if (this.energy <= MIN_POINTS) { + this.notify('Энергия'); + } + + if (this.mood <= MIN_POINTS) { + this.notify('Настроение'); + } + + this.changeActionIfNeeded(); + } + + changeActionIfNeeded() { + if (this.action === heroActions.sleeping) { + this.sleep(); + } else if (this.action === heroActions.eating) { + setTimeout(() => { + this.action = heroActions.none; + }, 2000); + } else if (this.action === heroActions.listening && this.mood === MAX_POINTS - 1) { + this.action = heroActions.none; + } + } + + eat() { + this.health = Math.min(this.health + 5, MAX_POINTS); + } + + sleep() { + this.energy = Math.min(this.energy + 5, MAX_POINTS); + } + + async notify(text) { + if (!Notification || Notification.permission === 'denied') { + return; + } + const permissionResult = await Notification.requestPermission(); + + if (permissionResult === 'granted') { + return new Notification(text, { body: 'Говорит хрюн' }); + } + } + + listen() { + if (!SpeechRecognition || this.action === heroActions.dead) { + return; + } + this.action = heroActions.listening; + this.speechRecognizer.start(); + } + + +} + +function getSpeechRecognizer() { + var speechRecognizer; + + if (SpeechRecognition) { + speechRecognizer = new SpeechRecognition(); + speechRecognizer.lang = 'en-US'; + speechRecognizer.continuous = true; + speechRecognizer.interimResults = true; + speechRecognizer.onresult = recognizedTextEvent => { + if (this.action !== heroActions.listening) { + this.speechRecognizer.stop(); + + return; + } + this.recognizedText = ''; + this.mood = Math.min(this.mood + 10, MAX_POINTS); + for (let i = recognizedTextEvent.resultIndex; i < recognizedTextEvent.results.length; i += 1) { + this.recognizedText += recognizedTextEvent.results[i][0].transcript; + }; + } + } + return speechRecognizer; +} + +function render() { + hero.update(); + + document.querySelector('.state__health').textContent = hero.health; + document.querySelector('.state__energy').textContent = hero.energy; + document.querySelector('.state__mood').textContent = hero.mood; + document.getElementById('recognizedText').textContent = hero.recognizedText; + + if (hero.isDead()) { + alert('Busted!'); + } + saveState(); +}; + +function saveState() { + document.cookie = `state=${JSON.stringify(hero.getState())}`; +} + +function getHeroFromState() { + if (document.cookie) { + const oldState = JSON.parse(document.cookie.split('=')[1]); + return new Hero(oldState); + } else { + return new Hero(); + } +} + +window.onload = () => { + hero = getHeroFromState(); + + document.getElementById('eat').onclick = () => hero.eat(); + document.getElementById('restart').onclick = () => hero = new Hero(); + document.querySelector('.hero__avatar').onclick = () => hero.listen(); + + render(); + + if (hero.action === heroActions.sleeping) { + hero.action = heroActions.none; + } + + setInterval(() => render(), 1500); +}; + +window.onblur = () => { + hero.action = heroActions.sleeping; +}; + +window.onfocus = () => { + hero.action = heroActions.none; +}; + From aa47eef846f6417e4d14407071db935cdc69d212 Mon Sep 17 00:00:00 2001 From: "d.fomin" Date: Wed, 30 May 2018 06:39:35 +0500 Subject: [PATCH 2/2] lint --- index.html | 6 +++--- tamagochi.js | 37 +++++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/index.html b/index.html index ebea7dc..8bbf033 100644 --- a/index.html +++ b/index.html @@ -12,13 +12,13 @@ hrundel
- +
- +
- +
diff --git a/tamagochi.js b/tamagochi.js index 32f8890..f9fc281 100644 --- a/tamagochi.js +++ b/tamagochi.js @@ -1,5 +1,4 @@ const Notification = window.Notification || window.webkitNotification; -const AudioContext = window.AudioContext || window.webkitAudioContext; const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; const MAX_POINTS = 100; @@ -8,10 +7,10 @@ const MIN_POINTS = 10; var hero; const heroActions = { - none: "NONE", - eating: "EATING", - sleeping: "SLEEPING", - listening: "LISTENING", + none: 'NONE', + eating: 'EATING', + sleeping: 'SLEEPING', + listening: 'LISTENING' }; class Hero { @@ -21,12 +20,13 @@ class Hero { this.mood = MAX_POINTS; this.action = heroActions.none; this.speechRecognizer = getSpeechRecognizer(); - this.recognizedText = ""; + this.recognizedText = ''; } constructor(state) { if (!state) { this.setDefaults(); + return; } this.health = state.health; @@ -56,9 +56,9 @@ class Hero { return; } - this.health = Math.max(0, this.health - 10); - this.energy = Math.max(0, this.energy - 10); - this.mood = Math.max(0, this.mood - 1); + this.health = Math.max(0, this.health - 10); + this.energy = Math.max(0, this.energy - 10); + this.mood = Math.max(0, this.mood - 1); if (this.health <= MIN_POINTS) { this.notify('Здоровье'); @@ -114,7 +114,7 @@ class Hero { this.speechRecognizer.start(); } - + } function getSpeechRecognizer() { @@ -133,11 +133,13 @@ function getSpeechRecognizer() { } this.recognizedText = ''; this.mood = Math.min(this.mood + 10, MAX_POINTS); - for (let i = recognizedTextEvent.resultIndex; i < recognizedTextEvent.results.length; i += 1) { + for (let i = recognizedTextEvent.resultIndex; + i < recognizedTextEvent.results.length; i += 1) { this.recognizedText += recognizedTextEvent.results[i][0].transcript; - }; - } + } + }; } + return speechRecognizer; } @@ -150,10 +152,11 @@ function render() { document.getElementById('recognizedText').textContent = hero.recognizedText; if (hero.isDead()) { + // eslint-disable-next-line alert('Busted!'); } saveState(); -}; +} function saveState() { document.cookie = `state=${JSON.stringify(hero.getState())}`; @@ -162,16 +165,18 @@ function saveState() { function getHeroFromState() { if (document.cookie) { const oldState = JSON.parse(document.cookie.split('=')[1]); + return new Hero(oldState); - } else { - return new Hero(); } + + return new Hero(); } window.onload = () => { hero = getHeroFromState(); document.getElementById('eat').onclick = () => hero.eat(); + // eslint-disable-next-line document.getElementById('restart').onclick = () => hero = new Hero(); document.querySelector('.hero__avatar').onclick = () => hero.listen();