diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1c7eb362b0ae683d6f5646d450ad579a522b98c1..0c7da4d35dcb6a7ff428bbba1ee4822e13478a69 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "axios": "^0.26.0", + "damerau-levenshtein": "^1.0.8", "phaser": "^3.55.2" }, "devDependencies": { @@ -5090,6 +5091,11 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -18776,6 +18782,11 @@ } } }, + "damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index 52c559c5799b5a63f31059e041d758a497b2fc0a..4c280c396a51cf7baa5d9f93d8ad54239ea7625a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,6 +18,7 @@ }, "dependencies": { "axios": "^0.26.0", + "damerau-levenshtein": "^1.0.8", "phaser": "^3.55.2" }, "devDependencies": { diff --git a/frontend/src/js/enemy.js b/frontend/src/js/enemy.js index 468c795a06dce189ece8c59c23a73308d6621f1f..7fe3af9f3f8dd6f21cf40a7249f4fc5c250c23da 100644 --- a/frontend/src/js/enemy.js +++ b/frontend/src/js/enemy.js @@ -2,7 +2,7 @@ let enemies = ["bear", "wolf", "deer", "boar"]; let enemiesSpeed = 50000; class enemy { - refData = null; + word = null; constructor(scene) { this.scene = scene; @@ -19,7 +19,7 @@ class enemy { scale = 3; } - let flag = this.scene.add.sprite(400, 300, `WORD-${this.refData.id}`); + let flag = this.scene.add.sprite(400, 300, `WORD-${this.word.id}`); let enemy = this.scene.physics.add .sprite(-100, this.scene.cameras.main.height - 100, randomEnemyType) .setScale(scale) diff --git a/frontend/src/js/fight_scene.js b/frontend/src/js/fight_scene.js index 6cf0be5e559e78a9ecee10ec25fb17975b67b594..a16cd0c75230604a6ed72654c30409030c2166f3 100644 --- a/frontend/src/js/fight_scene.js +++ b/frontend/src/js/fight_scene.js @@ -3,6 +3,8 @@ import Phaser from "phaser"; import enemy from "./enemy"; import backend from "./backend"; +import levenshtein from "damerau-levenshtein"; + const fightScene = new Phaser.Scene("fight"); let onscreenEnemies = []; @@ -292,21 +294,33 @@ function shootSpear(enemy, hit, scene = fightScene) { function submitTranscription(transcription) { // TODO: guess the enemy if any - const enemy = window.onscreenEnemies[0].sprite; + let similarity = 0; + let match = null; + window.onscreenEnemies.forEach((foe) => { + const s = levenshtein( + transcription.toLowerCase(), + foe.word.ocr_transcript.toLowerCase(), + ).similarity; + if (s <= similarity) return; + similarity = s; + match = foe; + }); - let hit = true; - enemy.disableInteractive(); + console.log(similarity, match.word.ocr_transcript); + + // TODO: we can have near misses depending on similarity! + let hit = similarity >= 0.9; + let enemy = match; + enemy.sprite.disableInteractive(); // here invoke image - enemy.movement.pause(); - setAnimation(enemy, enemy.typeName + "_idle"); + enemy.sprite.movement.pause(); + setAnimation(enemy.sprite, enemy.sprite.typeName + "_idle"); // let beginTime = new Date().getTime(); // let endTime = new Date().getTime(); // let deltaTime = endTime - beginTime; - hit = transcription == "fuffa"; - - shootSpear(enemy, hit); + shootSpear(enemy.sprite, hit); } function gameStart(scene) { @@ -321,7 +335,7 @@ function dispatchEnemy(scene) { window.onscreenEnemies.push(e); backend.post("GetImage", {}).then(function (response) { - e.refData = response.data; + e.word = response.data; scene.textures.addBase64(`WORD-${response.data.id}`, response.data.image); scene.textures.once(