From f7accecff41e5110403ce651de11639022a1a071 Mon Sep 17 00:00:00 2001 From: Paolo Brasolin <paolo.brasolin@eurac.edu> Date: Thu, 10 Mar 2022 10:07:56 +0100 Subject: [PATCH] feat: #fe match best onscreen foe --- frontend/package-lock.json | 11 +++++++++++ frontend/package.json | 1 + frontend/src/js/enemy.js | 4 ++-- frontend/src/js/fight_scene.js | 32 +++++++++++++++++++++++--------- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1c7eb36..0c7da4d 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 52c559c..4c280c3 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 468c795..7fe3af9 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 6cf0be5..a16cd0c 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( -- GitLab