diff --git a/mupen64plus-input-qt/main.cpp b/mupen64plus-input-qt/main.cpp index 3798e50..1a85b2d 100644 --- a/mupen64plus-input-qt/main.cpp +++ b/mupen64plus-input-qt/main.cpp @@ -74,6 +74,7 @@ typedef void (*ptr_vosk_recognizer_free)(VoskRecognizer *recognizer); typedef int (*ptr_vosk_recognizer_accept_waveform)(VoskRecognizer *recognizer, const char *data, int length); typedef const char *(*ptr_vosk_recognizer_final_result)(VoskRecognizer *recognizer); typedef void (*ptr_vosk_set_log_level)(int log_level); +typedef void (*ptr_vosk_recognizer_set_max_alternatives)(VoskRecognizer *recognizer, int max_alternatives); ptr_vosk_recognizer_accept_waveform VoskAcceptWaveform; ptr_vosk_recognizer_final_result VoskFinalResult; @@ -82,6 +83,7 @@ ptr_vosk_recognizer_new_grm VoskNewRecognizer; ptr_vosk_model_free VoskFreeModel; ptr_vosk_recognizer_free VoskFreeRecognizer; ptr_vosk_set_log_level VoskSetLogLevel; +ptr_vosk_recognizer_set_max_alternatives VoskSetAlternatives; static void (*l_DebugCallback)(void *, int, const char *) = NULL; @@ -393,6 +395,7 @@ EXPORT void CALL SendVRUWord(uint16_t length, uint16_t *word, uint8_t lang) if (recognizer) VoskFreeRecognizer(recognizer); recognizer = VoskNewRecognizer(model, (float)hardware_spec->freq, doc.toJson()); + VoskSetAlternatives(recognizer, 3); } } @@ -437,45 +440,71 @@ EXPORT void CALL SetVRUWordMask(uint8_t, uint8_t *) { } +static bool compare(QString &s1, QString &s2) +{ + return s1.size() > s2.size(); +} + EXPORT void CALL ReadVRUResults(uint16_t *error_flags, uint16_t *num_results, uint16_t *mic_level, uint16_t *voice_level, uint16_t *voice_length, uint16_t *matches) { SDL_PauseAudioDevice(audio_dev, 1); - uint16_t match = 0x7FFF; + uint16_t match[5] = {0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF}; *error_flags = 0; QByteArray data(SDL_GetQueuedAudioSize(audio_dev), 0); uint32_t audio_length = SDL_DequeueAudio(audio_dev, data.data(), SDL_GetQueuedAudioSize(audio_dev)); VoskAcceptWaveform(recognizer, data.constData(), audio_length); QJsonDocument doc = QJsonDocument::fromJson(VoskFinalResult(recognizer)); QJsonObject object = doc.object(); - int match_index = words.indexOf(object.value("text").toString()); - if (match_index > -1 && word_indexes.at(match_index) < word_list_length) + QStringList found; + QStringList alternatives; + QString textResult; + QJsonArray alternatives_array = object.value("alternatives").toArray(); + for (int i = 0; i < alternatives_array.size(); ++i) { - /* found a match */ - DebugMessage(M64MSG_INFO, "match: %s", object.value("text").toString().toUtf8().constData()); - match = word_indexes.at(match_index); + textResult = alternatives_array.at(i).toObject().value("text").toString(); + if (!textResult.isEmpty()) + alternatives.append(textResult); } - else if (!object.value("text").toString().isEmpty()) + for (int i = 0; i < words.size() - 1 /* -1 to skip the [unk] entry */; ++i) + { + if (!found.contains(words.at(i)) && alternatives.filter(words.at(i)).size() > 0) + { + /* found a match */ + DebugMessage(M64MSG_INFO, "match: %s", words.at(i).toUtf8().constData()); + found.append(words.at(i)); + if (found.size() == 5) + break; + } + } + /* Use the longest match */ + std::sort(found.begin(), found.end(), compare); + for (int i = 0; i < found.size(); ++i) + { + match[i] = word_indexes.at(words.indexOf(found.at(i))); + } + if (found.size() == 0 && alternatives.size() > 0) { /* heard something but it didn't match anything */ *error_flags = 0x4000; - match = 0; // we match index 0, but mark the error flag saying we are really not sure + match[0] = 0; // we match index 0, but mark the error flag saying we are really not sure + found.append("0"); } - *num_results = (match == 0x7FFF) ? 0 : 1; + *num_results = found.size(); /* The N64 programming manual states what range these values should be within */ *mic_level = 0xBB8; *voice_level = 0xBB8; *voice_length = 0x8004; - matches[0] = match; + matches[0] = match[0]; matches[1] = *error_flags ? 0x700 : 0; - matches[2] = 0x7FFF; - matches[3] = 0; - matches[4] = 0x7FFF; - matches[5] = 0; - matches[6] = 0x7FFF; - matches[7] = 0; - matches[8] = 0x7FFF; - matches[9] = 0; + matches[2] = match[1]; + matches[3] = (match[1] == 0x7FFF) ? 0 : 0x100; + matches[4] = match[2]; + matches[5] = (match[2] == 0x7FFF) ? 0 : 0x200; + matches[6] = match[3]; + matches[7] = (match[3] == 0x7FFF) ? 0 : 0x300; + matches[8] = match[4]; + matches[9] = (match[4] == 0x7FFF) ? 0 : 0x400; } EXPORT void CALL ControllerCommand(int Control, unsigned char *Command) @@ -718,6 +747,7 @@ static int setupVosk() VoskFreeModel = (ptr_vosk_model_free) voskLib->resolve("vosk_model_free"); VoskFreeRecognizer = (ptr_vosk_recognizer_free) voskLib->resolve("vosk_recognizer_free"); VoskSetLogLevel = (ptr_vosk_set_log_level) voskLib->resolve("vosk_set_log_level"); + VoskSetAlternatives = (ptr_vosk_recognizer_set_max_alternatives) voskLib->resolve("vosk_recognizer_set_max_alternatives"); VoskSetLogLevel(-1); diff --git a/mupen64plus-input-qt/vruwords.h b/mupen64plus-input-qt/vruwords.h index 0a4e12b..b40e036 100644 --- a/mupen64plus-input-qt/vruwords.h +++ b/mupen64plus-input-qt/vruwords.h @@ -34,12 +34,12 @@ const char * vruwords = "{\"03A50024000303CF00A80003036000EA\": [\"pikachu\"], \ \"03A50024000303CF00A8000303A50024000303CF00A8000303A50024\": [\"pika pika pi\"], \ \"03A50024000303A50024000303CF00A80003036000EA\": [\"pi pikachu\"], \ \"03A50024000303A50024000303CF00A8000303A50024\": [\"pi pika pi\"], \ -\"03A50024000303D8000303CF00C9\": [\"pikka\"], \ +\"03A50024000303D8000303CF00C9\": [\"pika\"], \ \"03A50024000303CF00A8\": [\"pika\"], \ -\"03A50024000303CF00A8000303A50024000303CF00A8\": [\"pikapika\"], \ +\"03A50024000303CF00A8000303A50024000303CF00A8\": [\"pika pika\"], \ \"03A503030024000303CF00A8\": [\"pi ka\"], \ \"03A50024000303CF00C9000303CF00C9\": [\"pi ka ka\"], \ -\"03A50024000303CF00A8000303CF00A8000303A50024\": [\"pi kakapi\"], \ +\"03A50024000303CF00A8000303CF00A8000303A50024\": [\"pi ka ka pi\"], \ \"037E02F10042035A036C0087000303C604050297\": [\"bring that here\"], \ \"039F0213000603960066000303B70045000303C6\": [\"go get it\"], \ \"0393004803E70045000303C6000303C000E703270024\": [\"give it to me\"], \ @@ -57,7 +57,7 @@ const char * vruwords = "{\"03A50024000303CF00A80003036000EA\": [\"pikachu\"], \ \"0309023703FC0213000303C9030C00EA000303C6\": [\"you're so cute\"], \ \"03BD00A202F1004803ED0045000303D8\": [\"terrific\"], \ \"037500C9000303BD023703F002F10024\": [\"butter free\"], \ -\"043200C603360006037E02F4005D02E500A8\": [\"ambrella\"], \ +\"043200C603360006037E02F4005D02E500A8\": [\"am brel a\"], \ \"037B01CE035A0006037B01CE035A\": [\"boing boing\"], \ \"043801290348000303C000ED036C00A5033C0066000303D803FC000303C603FC000303BA018F00060366\": [\"on to the next stage\"], \ \"042F0087000303AB009F02EE\": [\"apple\"], \ @@ -74,7 +74,7 @@ const char * vruwords = "{\"03A50024000303CF00A80003036000EA\": [\"pikachu\"], \ \"037500A5033C0084033F00A8\": [\"banana\"], \ \"036F0042033C0084033F00C9\": [\"banana\"], \ \"037500C6033C0084033F00A8\": [\"banana\"], \ -\"03CC0087000303C6000303BA018602EE\": [\"cattail\"], \ +\"03CC0087000303C6000303BA018602EE\": [\"cat tail\"], \ \"032101A702EE00060390040B02340006037E\": [\"wild herb\"], \ \"03D502D60348\": [\"corn\"], \ \"03B1014D000303B4000303D502D60348\": [\"popcorn\"], \ @@ -107,14 +107,14 @@ const char * vruwords = "{\"03A50024000303CF00A80003036000EA\": [\"pikachu\"], \ \"03C3021603FC000303BD00A800060384018F000303D502D60348\": [\"toasted acorn\"], \ \"03F002EB01950042034E018F000303D502D60348\": [\"flying acorn\"], \ \"042C018F000303D502D60348000303C3014D000303B4\": [\"acorn top\"], \ -\"036600C603360006037B0216040202FA00E70336\": [\"jumbo shroom\"], \ +\"036600C603360006037B0216040202FA00E70336\": [\"jumbo mushroom\"], \ \"02FD021603FC000303BD00A8000603900006036600A503360006037B0213\": [\"roasted jumbo\"], \ -\"039002F1002103270027040202FA00E70336\": [\"dreamy shroom\"], \ +\"039002F1002103270027040202FA00E70336\": [\"dreamy mushroom\"], \ \"03C602F700CC03F0009F02EE000303C3014D000303B4\": [\"truffle top\"], \ -\"037E02E800ED040202FA00E70336\": [\"blue shroom\"], \ -\"0411014D000303C6040202FA00E70336\": [\"hot shroom\"], \ -\"02F4006600060390040202FA00E70336\": [\"red shroom\"], \ -\"03FC00C603390027040202FA00E70336\": [\"sunny shroom\"], \ +\"037E02E800ED040202FA00E70336\": [\"blue mushroom\"], \ +\"0411014D000303C6040202FA00E70336\": [\"hot mushroom\"], \ +\"02F4006600060390040202FA00E70336\": [\"red mushroom\"], \ +\"03FC00C603390027040202FA00E70336\": [\"sunny mushroom\"], \ \"032D00CC040202FA00E70336\": [\"mushroom\"], \ \"0411014D000303C6032D00CC040202FA00E70336\": [\"hot mushroom\"], \ \"02EB01B0000303C60006037500C002EE0006037E\": [\"light bulb\"], \ @@ -233,9 +233,9 @@ const char * vruwords = "{\"03A50024000303CF00A80003036000EA\": [\"pikachu\"], \ \"03FC000303CF00C60348000303D80006037E02EB015003FC014A0336\": [\"skunk blossom\"], \ \"03FC000303C602FD016E00060372029D0024\": [\"strawberry\"], \ \"02F4008A03FC000303B402F10024\": [\"raspberry\"], \ -\"0438012C0006038100480402\": [\"oddish\"], \ +\"0438012C0006038100480402\": [\"odd ish\"], \ \"03A202E800E70336\": [\"gloom\"], \ -\"03EA01A702EE000303B402E800E70336\": [\"vileplume\"], \ +\"03EA01A702EE000303B402E800E70336\": [\"vile plume\"], \ \"042F01AD033603FC02BE0024\": [\"im sorry\"], \ \"03FC02BE0024\": [\"sorry\"], \ \"03CC0084033F00A50348\": [\"cannon\"], \ @@ -253,18 +253,18 @@ const char * vruwords = "{\"03A50024000303CF00A80003036000EA\": [\"pikachu\"], \ \"04080084035701290348\": [\"hang on\"], \ \"03C602F40066000603660234\": [\"treasure\"], \ \"03960066000303C602EB015003FC000303C6\": [\"get lost\"], \ -\"03A50024000303CF00BD040B00A8\": [\"pikka\"], \ +\"03A50024000303CF00BD040B00A8\": [\"pee ka\"], \ \"03A500090024000303CF00C9\": [\"pi ka\"], \ \"0375009C041101AD034800060381030C00EA\": [\"behind you\"], \ \"036F0018041101AD03480006036600EA\": [\"behind you\"], \ \"041101EF032A006303390024\": [\"how many\"], \ \"041101EF032A0063033900150258036C02B8\": [\"how many are there\"], \ -\"03B1020A02DF001503180087000603A2\": [\"poliwag\"], \ -\"03B1014402DF001503180087000603A2\": [\"poliwag\"], \ +\"03B1020A02DF001503180087000603A2\": [\"poly wag\"], \ +\"03B1014402DF001503180087000603A2\": [\"poly wag\"], \ \"03B1020A02DF0015031B022B02EE\": [\"poliwhirl\"], \ -\"03FC000303D5031B0234000303BD009F02EE\": [\"squirtle\"], \ -\"0396008A03FC000303C602DF0024\": [\"gastly\"], \ -\"041101290348000303BD0234\": [\"haunter\"], \ +\"03FC000303D5031B0234000303BD009F02EE\": [\"squirt el\"], \ +\"0396008A03FC000303C602DF0024\": [\"ghastly\"], \ +\"041101290348000303BD0234\": [\"haunt er\"], \ \"02FD0129035A\": [\"wrong\"], \ \"036C0087000303C603DE02FD0129035A\": [\"thats wrong\"], \ \"03D503150045000303C6\": [\"quit\"], \ @@ -292,12 +292,12 @@ const char * vruwords = "{\"03A50024000303CF00A80003036000EA\": [\"pikachu\"], \ \"03720087000303CF00C9000303B4\": [\"back up\"], \ \"03C90024000303B40006039F01F80042035A\": [\"keep going\"], \ \"03FC000303C602F4018F00060387009C0408006600060390\": [\"straight ahead\"], \ -\"037500C002EE0006037500AB03FC02D9\": [\"bulbasaur\"], \ -\"03E70021033F00AB03FC02D9\": [\"venusaur\"], \ +\"037500C002EE0006037500AB03FC02D9\": [\"bulb a saur\"], \ +\"03E70021033F00AB03FC02D9\": [\"venus are\"], \ \"03FC02EB0213000303B10213000303D8\": [\"slowpoke\"], \ -\"03FC000303D5031B0234000303BD009F02EE\": [\"squirtle\"], \ +\"03FC000303D5031B0234000303BD009F02EE\": [\"squirt el\"], \ \"03600252032A00840348000603870234\": [\"charmander\"], \ -\"03C903060087000303BD0234000303A50024\": [\"caterpie\"], \ +\"03C903060087000303BD0234000303A50024\": [\"cater pie\"], \ \"02EB014D000303B402F700AB03FC\": [\"lapras\"], \ \"02E20087000303B402F700AB03FC\": [\"lapras\"], \ \"03C302130006039900A8000303A50024\": [\"togepi\"], \ @@ -323,8 +323,8 @@ const char * vruwords = "{\"03A50024000303CF00A80003036000EA\": [\"pikachu\"], \ \"039C0108033302D603390042035A\": [\"good morning\"], \ \"0318018F000303CF00C9000303B4\": [\"wake up\"], \ \"03960066000303BD00C9000303B4\": [\"get up\"], \ -\"04260024000303CF00A5034803DE\": [\"ekans\"], \ -\"042C0066000303CF00A5034803DE\": [\"ekans\"], \ +\"04260024000303CF00A5034803DE\": [\"e cans\"], \ +\"042C0066000303CF00A5034803DE\": [\"e cans\"], \ \"037E02F10042034B0045000303C604050297\": [\"bring it here\"], \ \"030C00EA000303CF00A503390024000303C6036C0087000303C6\": [\"you can eat that\"], \ \"03BA019203FC000303BD00A8000303C6\": [\"taste it\"], \ @@ -353,212 +353,212 @@ const char * vruwords = "{\"03A50024000303CF00A80003036000EA\": [\"pikachu\"], \ \"03D802DF0021033F00C9000303B4\": [\"clean up\"], \ \"03D802DF00210348036C0087000303BD00C9000303B4\": [\"clean that up\"], \ \"03B70048040200EA\": [\"tissue\"], \ -\"037500C002EE0006037500AB03FC02D9\": [\"bulbasaur\"], \ -\"042F01B303E7002703FC02D9\": [\"ivysaur\"], \ -\"042F01B303EA00AB03FC02D9\": [\"ivysaur\"], \ -\"03E70021033F00AB03FC02D9\": [\"venusaur\"], \ -\"03600252032A00840348000603870234\": [\"charmander\"], \ -\"036002520327001B02DF0009030900A50348\": [\"charmeleon\"], \ -\"0360025803DE025500060390\": [\"charizard\"], \ -\"0360024000AB03DE025500060390\": [\"charizard\"], \ -\"03FC000303D5031B0234000303BD009F02EE\": [\"squirtle\"], \ -\"03210255000303BD0234000303BD009F02EE\": [\"wartortle\"], \ -\"03210255000303C302D9000303BD009F02EE\": [\"wartortle\"], \ -\"037E02E2008A03FC000303C301D403FC\": [\"blastoise\"], \ -\"03CC0087000303BD0234000303A50024\": [\"caterpie\"], \ -\"032A0066000303BD00A8000303B1014D00060390\": [\"metapod\"], \ +\"037500C002EE0006037500AB03FC02D9\": [\"bulb a saur\"], \ +\"042F01B303E7002703FC02D9\": [\"ivy saur\"], \ +\"042F01B303EA00AB03FC02D9\": [\"ivy saur\"], \ +\"03E70021033F00AB03FC02D9\": [\"venus are\"], \ +\"03600252032A00840348000603870234\": [\"char mander\"], \ +\"036002520327001B02DF0009030900A50348\": [\"char me leon\"], \ +\"0360025803DE025500060390\": [\"chari z ard\"], \ +\"0360024000AB03DE025500060390\": [\"chari z ard\"], \ +\"03FC000303D5031B0234000303BD009F02EE\": [\"squirt el\"], \ +\"03210255000303BD0234000303BD009F02EE\": [\"war tor tell\"], \ +\"03210255000303C302D9000303BD009F02EE\": [\"war tor tell\"], \ +\"037E02E2008A03FC000303C301D403FC\": [\"blast oise\"], \ +\"03CC0087000303BD0234000303A50024\": [\"cater pie\"], \ +\"032A0066000303BD00A8000303B1014D00060390\": [\"meta pod\"], \ \"037500C9000303BD023703F002F10024\": [\"butter free\"], \ -\"0315002400060387009F02EE\": [\"weedle\"], \ -\"03D2010B000303D200E7033F00A8\": [\"kakuna\"], \ -\"03C90045000303D200E7033F00A8\": [\"kakuna\"], \ -\"036F00240006039002F1003C02EE\": [\"beedrill\"], \ -\"036F00240006039002F7009F02EE\": [\"beedrill\"], \ -\"03A5004500060366014D000303C6\": [\"pidgeot\"], \ -\"02F40087000303BD00A8000303BD00A8\": [\"rattata\"], \ -\"02F700A8000303BA00870006038700A8\": [\"rattata\"], \ -\"02F40087000303BA00870006038700A8\": [\"rattata\"], \ -\"02F40087000303B70045000303CC018F000303C6\": [\"raticate\"], \ -\"03FC000303A502880213\": [\"spearow\"], \ -\"03ED02880213\": [\"fearow\"], \ -\"04260024000303CF00A5034803DE\": [\"ekans\"], \ -\"042C0066000303CF00A5034803DE\": [\"ekans\"], \ -\"043802550006037B014D000303D8\": [\"arbok\"], \ +\"0315002400060387009F02EE\": [\"weed el\"], \ +\"03D2010B000303D200E7033F00A8\": [\"ka kuna\"], \ +\"03C90045000303D200E7033F00A8\": [\"ka kuna\"], \ +\"036F00240006039002F1003C02EE\": [\"bee drill\"], \ +\"036F00240006039002F7009F02EE\": [\"bee drill\"], \ +\"03A5004500060366014D000303C6\": [\"pid gee ot\"], \ +\"02F40087000303BD00A8000303BD00A8\": [\"rat tata\"], \ +\"02F700A8000303BA00870006038700A8\": [\"rat tata\"], \ +\"02F40087000303BA00870006038700A8\": [\"rat tata\"], \ +\"02F40087000303B70045000303CC018F000303C6\": [\"rat i cat\"], \ +\"03FC000303A502880213\": [\"spear ow\"], \ +\"03ED02880213\": [\"fear ow\"], \ +\"04260024000303CF00A5034803DE\": [\"e cans\"], \ +\"042C0066000303CF00A5034803DE\": [\"e cans\"], \ +\"043802550006037B014D000303D8\": [\"ar bok\"], \ \"03A50024000303CF00A80003036000EA\": [\"pikachu\"], \ -\"02FD01B00003036000EA\": [\"raichu\"], \ -\"03FC00840348040202FA00EA\": [\"sandshrew\"], \ -\"03FC0084034803FC02E2008A0402\": [\"sandslash\"], \ -\"0339004500060387021F00A5034803ED0021032A018602EE\": [\"nidoran female\"], \ -\"033900450006038D020D02F700A5034803ED0021032A017A009F02EE\": [\"nidoran female\"], \ -\"033900450006038702190021033F00A8\": [\"nidorina\"], \ -\"033900240006038D0213000303D5031500210348\": [\"nidoqueen\"], \ -\"033900450006038D020D02F700A50348032A018602EE\": [\"nidoran male\"], \ -\"0339004500060387021F00A50348032A017A009F02EE\": [\"nidoran male\"], \ -\"033900450006038D02BE002103450213\": [\"nidorino\"], \ -\"033900240006038D020D02F1002103450213\": [\"nidorino\"], \ -\"033900240006038D0213000303C90042035A\": [\"nidoking\"], \ -\"03D802E2006903F0008102F10024\": [\"clefairy\"], \ -\"03D802E500AB03F0008102F10024\": [\"clefairy\"], \ -\"03D802E2006903F0018F00060375009F02EE\": [\"clefable\"], \ -\"03D802E500AB03F0018F00060375009F02EE\": [\"clefable\"], \ -\"03EA009F02EE000303A50045000303D803FC\": [\"vulpix\"], \ -\"034501AD0348000303BA018602EE03DE\": [\"ninetales\"], \ -\"03630045000603A202DF0024000303AB00CC03F0\": [\"jigglypuff\"], \ -\"0363004500060399009F02DF0024000303AB00CC03F0\": [\"jigglypuff\"], \ -\"03150045000603A202DF0024000303BD00CC03F0\": [\"wigglytuff\"], \ -\"03DE00EA000603720087000303C6\": [\"zubat\"], \ -\"039F020A02EE000603720087000303C6\": [\"golbat\"], \ -\"0438012C0006038100480402\": [\"oddish\"], \ +\"02FD01B00003036000EA\": [\"rye chu\"], \ +\"03FC00840348040202FA00EA\": [\"sand shrew\"], \ +\"03FC0084034803FC02E2008A0402\": [\"sand slash\"], \ +\"0339004500060387021F00A5034803ED0021032A018602EE\": [\"ni doran female\"], \ +\"033900450006038D020D02F700A5034803ED0021032A017A009F02EE\": [\"ni doran female\"], \ +\"033900450006038702190021033F00A8\": [\"ni door ina\"], \ +\"033900240006038D0213000303D5031500210348\": [\"nido queen\"], \ +\"033900450006038D020D02F700A50348032A018602EE\": [\"ni doran male\"], \ +\"0339004500060387021F00A50348032A017A009F02EE\": [\"ni doran male\"], \ +\"033900450006038D02BE002103450213\": [\"ni dor ino\"], \ +\"033900240006038D020D02F1002103450213\": [\"ni dor ino\"], \ +\"033900240006038D0213000303C90042035A\": [\"ni do king\"], \ +\"03D802E2006903F0008102F10024\": [\"cle fairy\"], \ +\"03D802E500AB03F0008102F10024\": [\"cle fairy\"], \ +\"03D802E2006903F0018F00060375009F02EE\": [\"cle fable\"], \ +\"03D802E500AB03F0018F00060375009F02EE\": [\"cle fable\"], \ +\"03EA009F02EE000303A50045000303D803FC\": [\"vol pix\"], \ +\"034501AD0348000303BA018602EE03DE\": [\"nine tales\"], \ +\"03630045000603A202DF0024000303AB00CC03F0\": [\"jiggly puff\"], \ +\"0363004500060399009F02DF0024000303AB00CC03F0\": [\"jiggly puff\"], \ +\"03150045000603A202DF0024000303BD00CC03F0\": [\"wiggly tuff\"], \ +\"03DE00EA000603720087000303C6\": [\"zoo bat\"], \ +\"039F020A02EE000603720087000303C6\": [\"goal bat\"], \ +\"0438012C0006038100480402\": [\"odd ish\"], \ \"03A202E800E70336\": [\"gloom\"], \ -\"03EA01A702EE000303B402E800E70336\": [\"vileplume\"], \ +\"03EA01A702EE000303B402E800E70336\": [\"vile plume\"], \ \"03B1024000AB03FC\": [\"paras\"], \ \"03A802A300AB03FC\": [\"paras\"], \ -\"03B1024000AB03FC0066000303D8000303C6\": [\"parasect\"], \ -\"03A802A300AB03FC0066000303D8000303C6\": [\"parasect\"], \ -\"03EA006303450210033C0087000303C6\": [\"venonat\"], \ -\"03EA0063034502100333012F03F6\": [\"venomoth\"], \ -\"03810045000603A202E500A8000303C6\": [\"diglett\"], \ -\"0327001501F503F6\": [\"meowth\"], \ +\"03B1024000AB03FC0066000303D8000303C6\": [\"para sect\"], \ +\"03A802A300AB03FC0066000303D8000303C6\": [\"para sect\"], \ +\"03EA006303450210033C0087000303C6\": [\"ven on at\"], \ +\"03EA0063034502100333012F03F6\": [\"venom oth\"], \ +\"03810045000603A202E500A8000303C6\": [\"dig let\"], \ +\"0327001501F503F6\": [\"meow eth\"], \ \"03AB023703E400A50348\": [\"persian\"], \ -\"03FC01B00006038700C9000303D8\": [\"psyduck\"], \ -\"039C010202EE0006038700C9000303D8\": [\"golduck\"], \ -\"032A0084035A000303C90024\": [\"mankey\"], \ -\"03B402FD01AD032A018F000303B4\": [\"primeape\"], \ -\"03A202FD020A02EB01B3036C\": [\"growlithe\"], \ -\"03A202FD01E902DF0048036C\": [\"growlithe\"], \ -\"04380255000303CC018C034501AD0348\": [\"arcanine\"], \ -\"04380255000303CF00A5034501AD0348\": [\"arcanine\"], \ -\"03B1020A02DF001503180087000603A2\": [\"poliwag\"], \ -\"03B1020A02DF0015031B022B02EE\": [\"poliwhirl\"], \ -\"03B1020A02DF001E02F4008A03F6\": [\"poliwrath\"], \ -\"03B1014402DF001E02F4008A03F6\": [\"poliwrath\"], \ +\"03FC01B00006038700C9000303D8\": [\"psy duck\"], \ +\"039C010202EE0006038700C9000303D8\": [\"goal duck\"], \ +\"032A0084035A000303C90024\": [\"man key\"], \ +\"03B402FD01AD032A018F000303B4\": [\"prime ape\"], \ +\"03A202FD020A02EB01B3036C\": [\"growl ith\"], \ +\"03A202FD01E902DF0048036C\": [\"growl ith\"], \ +\"04380255000303CC018C034501AD0348\": [\"ar canine\"], \ +\"04380255000303CF00A5034501AD0348\": [\"ar canine\"], \ +\"03B1020A02DF001503180087000603A2\": [\"poly wag\"], \ +\"03B1020A02DF0015031B022B02EE\": [\"poly whirl\"], \ +\"03B1020A02DF001E02F4008A03F6\": [\"poly wrath\"], \ +\"03B1014402DF001E02F4008A03F6\": [\"poly wrath\"], \ \"042F00870006037E02F700A8\": [\"abra\"], \ -\"03CF00A80006038400870006037E02F700A8\": [\"kadabra\"], \ -\"042F007E02E500A8000303CF00AB03DE00840336\": [\"alakazam\"], \ -\"032D00A800030360014D000303B4\": [\"machop\"], \ -\"032D00A8000303600213000303D8\": [\"machoke\"], \ -\"032D00A80003036000840336000303B4\": [\"machamp\"], \ -\"0372005D02EE03FC000303B402FD01F2000303C6\": [\"bellsprout\"], \ -\"03BA0063033F00A8000303CF00C002EE\": [\"tentacool\"], \ -\"03BA0063033F00A8000303D802FA00E102EE\": [\"tentacruel\"], \ -\"03630009030F02130006038A00EA00060390\": [\"geodude\"], \ -\"03A202F4008A03EA009F02E50234\": [\"graveler\"], \ -\"03A202F4008A03EA02E50234\": [\"graveler\"], \ +\"03CF00A80006038400870006037E02F700A8\": [\"ka dab ra\"], \ +\"042F007E02E500A8000303CF00AB03DE00840336\": [\"ala ka zam\"], \ +\"032D00A800030360014D000303B4\": [\"ma chop\"], \ +\"032D00A8000303600213000303D8\": [\"ma choke\"], \ +\"032D00A80003036000840336000303B4\": [\"ma champ\"], \ +\"0372005D02EE03FC000303B402FD01F2000303C6\": [\"bell sprout\"], \ +\"03BA0063033F00A8000303CF00C002EE\": [\"ten ta cool\"], \ +\"03BA0063033F00A8000303D802FA00E102EE\": [\"ten ta cruel\"], \ +\"03630009030F02130006038A00EA00060390\": [\"geo dude\"], \ +\"03A202F4008A03EA009F02E50234\": [\"gravel er\"], \ +\"03A202F4008A03EA02E50234\": [\"gravel er\"], \ \"039F020A02E500A50336\": [\"golem\"], \ \"039F014402EE0336\": [\"golem\"], \ -\"03B1021003390024000303BD00A8\": [\"ponyta\"], \ -\"03B1021003390024000303C3016E\": [\"ponyta\"], \ -\"02F40087000303A5004500060384008A0402\": [\"rapidash\"], \ +\"03B1021003390024000303BD00A8\": [\"pony ta\"], \ +\"03B1021003390024000303C3016E\": [\"pony ta\"], \ +\"02F40087000303A5004500060384008A0402\": [\"rap e dash\"], \ \"03FC02EB0213000303B10213000303D8\": [\"slowpoke\"], \ -\"03FC02EB02130006037E02FD0213\": [\"slowbro\"], \ -\"032A0087000603A2033F00A5033301B0000303C6\": [\"magnemite\"], \ -\"032A0087000603A2033F00A8000303C3014A0348\": [\"magneton\"], \ -\"03F0025803F0006600030360000303C6\": [\"farfetch'd\"], \ -\"038D02130006039002F100150213\": [\"dodrio\"], \ +\"03FC02EB02130006037E02FD0213\": [\"slow bro\"], \ +\"032A0087000603A2033F00A5033301B0000303C6\": [\"mag ne mite\"], \ +\"032A0087000603A2033F00A8000303C3014A0348\": [\"mag ne ton\"], \ +\"03F0025803F0006600030360000303C6\": [\"far fetched\"], \ +\"038D02130006039002F100150213\": [\"dod rio\"], \ \"03F9001B02EE\": [\"seel\"], \ -\"038A00EA0006039F014A035A\": [\"dewgong\"], \ -\"038A00EA0006039F014A0348\": [\"dewgong\"], \ -\"03A202FD01AD032D0234\": [\"grimer\"], \ -\"032D00C9000303D8\": [\"muk\"], \ -\"0402005D02EE000603870234\": [\"shellder\"], \ -\"03D802EB01D403FC000303BD0234\": [\"cloyster\"], \ -\"0396008A03FC000303C602DF00\": [\"gastly\"], \ -\"0396008A03FC02DF0024\": [\"gastly\"], \ -\"041101290348000303BD0234\": [\"haunter\"], \ -\"03960084035A0006039F0255\": [\"gengar\"], \ -\"0396006303480006039F0255\": [\"gengar\"], \ -\"0438014A03390045000303D803FC\": [\"onix\"], \ -\"039002FD01F503DB0024\": [\"drowzee\"], \ -\"039002FD021603DB0024\": [\"drowzee\"], \ -\"04050045000303B403450213\": [\"hypno\"], \ -\"03D802F400870006036F00\": [\"krabby\"], \ -\"03C90042035A02E50234\": [\"kingler\"], \ -\"03EA020A02EE000303C302D90006037E\": [\"voltorb\"], \ +\"038A00EA0006039F014A035A\": [\"dew gong\"], \ +\"038A00EA0006039F014A0348\": [\"dew gong\"], \ +\"03A202FD01AD032D0234\": [\"grim er\"], \ +\"032D00C9000303D8\": [\"muck\"], \ +\"0402005D02EE000603870234\": [\"shell der\"], \ +\"03D802EB01D403FC000303BD0234\": [\"cloy ster\"], \ +\"0396008A03FC000303C602DF00\": [\"ghastly\"], \ +\"0396008A03FC02DF0024\": [\"ghastly\"], \ +\"041101290348000303BD0234\": [\"haunt er\"], \ +\"03960084035A0006039F0255\": [\"gen gar\"], \ +\"0396006303480006039F0255\": [\"gen gar\"], \ +\"0438014A03390045000303D803FC\": [\"on ix\"], \ +\"039002FD01F503DB0024\": [\"drowsy\"], \ +\"039002FD021603DB0024\": [\"drowsy\"], \ +\"04050045000303B403450213\": [\"hip no\"], \ +\"03D802F400870006036F00\": [\"crabby\"], \ +\"03C90042035A02E50234\": [\"king ler\"], \ +\"03EA020A02EE000303C302D90006037E\": [\"volt orb\"], \ \"0426001B02E20066000303D8000303C602FD021300060390\": [\"electrode\"], \ \"0432009F02E20066000303D8000303C602FD021300060390\": [\"electrode\"], \ -\"042C0066000603A203DE000303C9030C00EA000303C6\": [\"exeggcute\"], \ -\"042C0066000603A203DE0066000303C9030C00EA000303C302D9\": [\"exeggutor\"], \ -\"042C0066000603A203FC00A8000303C9030C00EA000603870234\": [\"exeggutor\"], \ -\"03C9030C00EA0006037B02100348\": [\"cubone\"], \ -\"032A02A9020403180087000303D8\": [\"marowak\"], \ -\"03330246020403180087000303D8\": [\"marowak\"], \ -\"04050045000303C603330210034802DF0024\": [\"hitmonlee\"], \ -\"04050045000303C60333014A034802DF0024\": [\"hitmonlee\"], \ -\"04050045000303C60333021003480003036000840348\": [\"hitmonchan\"], \ -\"02DF0045000303C90024000303BD00A5035A\": [\"lickitung\"], \ -\"02DF0045000303C90045000303BD00A5035A\": [\"lickitung\"], \ -\"02DF0045000303C90045000303C00108035A\": [\"lickitung\"], \ -\"03D5015003ED0042035A\": [\"koffing\"], \ -\"0315002703DB0042035A\": [\"weezing\"], \ -\"02FD01A4041102D60348\": [\"rhyhorn\"], \ -\"02FD01B00006038D01290348\": [\"rhydon\"], \ -\"03600084034803F90024\": [\"chansey\"], \ +\"042C0066000603A203DE000303C9030C00EA000303C6\": [\"execute\"], \ +\"042C0066000603A203DE0066000303C9030C00EA000303C302D9\": [\"executor\"], \ +\"042C0066000603A203FC00A8000303C9030C00EA000603870234\": [\"executor\"], \ +\"03C9030C00EA0006037B02100348\": [\"cue bone\"], \ +\"032A02A9020403180087000303D8\": [\"mar oh wack\"], \ +\"03330246020403180087000303D8\": [\"mar oh wack\"], \ +\"04050045000303C603330210034802DF0024\": [\"hit mon lee\"], \ +\"04050045000303C60333014A034802DF0024\": [\"hit mon lee\"], \ +\"04050045000303C60333021003480003036000840348\": [\"hit mon chan\"], \ +\"02DF0045000303C90024000303BD00A5035A\": [\"lick eh tung\"], \ +\"02DF0045000303C90045000303BD00A5035A\": [\"lick i tung\"], \ +\"02DF0045000303C90045000303C00108035A\": [\"lick a tung\"], \ +\"03D5015003ED0042035A\": [\"coughing\"], \ +\"0315002703DB0042035A\": [\"wheezing\"], \ +\"02FD01A4041102D60348\": [\"rye horn\"], \ +\"02FD01B00006038D01290348\": [\"rye don\"], \ +\"03600084034803F90024\": [\"chance e\"], \ \"03BA0084034800060366005D02E500A8\": [\"tangela\"], \ \"03BA018C034800060396005D02E500A8\": [\"tangela\"], \ -\"03CC018C035A0006039900AB03FC000303D5014A0348\": [\"kangaskhan\"], \ -\"041102DC03F90024\": [\"horsea\"], \ -\"03F900240006039002F700A8\": [\"seadra\"], \ -\"039F020A02EE0006038100210348\": [\"goldeen\"], \ -\"03F90024000303C90042035A\": [\"seaking\"], \ -\"03FC000303C3023A030C00EA\": [\"staryu\"], \ -\"03FC000303C3025203270024\": [\"starmie\"], \ -\"0327004803FC000303BD0231033301AD0336\": [\"mr.mime\"], \ -\"03FC01B3036C0234\": [\"scyther\"], \ +\"03CC018C035A0006039900AB03FC000303D5014A0348\": [\"kang as khan\"], \ +\"041102DC03F90024\": [\"horse sea\"], \ +\"03F900240006039002F700A8\": [\"sea dra\"], \ +\"039F020A02EE0006038100210348\": [\"gold een\"], \ +\"03F90024000303C90042035A\": [\"seeking\"], \ +\"03FC000303C3023A030C00EA\": [\"starry you\"], \ +\"03FC000303C3025203270024\": [\"star me\"], \ +\"0327004803FC000303BD0231033301AD0336\": [\"mister mime\"], \ +\"03FC01B3036C0234\": [\"sigh ther\"], \ \"03630042035A000303D803FC\": [\"jynx\"], \ -\"0426001B02E20066000303D8000303BD00A80006037500CC03DE\": [\"electabuzz\"], \ -\"0432009F02E20066000303D8000303BD00A80006037500CC03DE\": [\"electabuzz\"], \ -\"032A0087000603A203330255\": [\"magmar\"], \ -\"03A50042034803FC0234\": [\"pinsir\"], \ -\"03C3020D02FD012F03FC\": [\"tauros\"], \ -\"03C30246021603FC\": [\"tauros\"], \ -\"032A0087000603630045000303D50255000303B4\": [\"magikarp\"], \ -\"039602A300A80006038D015003FC\": [\"gyarados\"], \ -\"039602A300A80006038D021603FC\": [\"gyarados\"], \ -\"02EB014D000303B402F700AB03FC\": [\"lapras\"], \ -\"02E20087000303B402F700AB03FC\": [\"lapras\"], \ +\"0426001B02E20066000303D8000303BD00A80006037500CC03DE\": [\"elect tra buzz\"], \ +\"0432009F02E20066000303D8000303BD00A80006037500CC03DE\": [\"elect tra buzz\"], \ +\"032A0087000603A203330255\": [\"mag mar\"], \ +\"03A50042034803FC0234\": [\"pin sir\"], \ +\"03C3020D02FD012F03FC\": [\"tar os\"], \ +\"03C30246021603FC\": [\"tar os\"], \ +\"032A0087000603630045000303D50255000303B4\": [\"magi karp\"], \ +\"039602A300A80006038D015003FC\": [\"guy a rad os\"], \ +\"039602A300A80006038D021603FC\": [\"guy a rad os\"], \ +\"02EB014D000303B402F700AB03FC\": [\"lap ras\"], \ +\"02E20087000303B402F700AB03FC\": [\"lap ras\"], \ \"03810045000303C30213\": [\"ditto\"], \ -\"0426002703E70024\": [\"eevee\"], \ -\"03EA018F000303B102BE0015014A0348\": [\"vaporeon\"], \ -\"03EA00A8000303B102BE000F00A50348\": [\"vaporeon\"], \ -\"0366020A02EE000303B70015014A0348\": [\"jolteon\"], \ -\"03F002E2029D0015014A0348\": [\"flareon\"], \ -\"03B1020D02F100240006039F014A0348\": [\"porygon\"], \ -\"03B1020D02F100240006039900A50348\": [\"porygon\"], \ -\"043B0210032D00C6034501B0000303C6\": [\"omanyte\"], \ -\"04380129032D00A5034501B0000303C6\": [\"omanyte\"], \ -\"043B0210032D00CC03FC000303C30255\": [\"omastar\"], \ -\"04380129032D00AB03FC000303C30255\": [\"omastar\"], \ -\"03CF00C90006037800EA0006038D0213\": [\"kabuto\"], \ -\"03D5012C0006037800EA000303C3014D000303B403FC\": [\"kabutops\"], \ -\"03D5012C0006037500A8000303C3014D000303B403FC\": [\"kabutops\"], \ -\"03D5012C0006037500A8000303C3015003FC\": [\"kabutops\"], \ -\"042C02A90213000603840087000303D8000303BD00C002EE\": [\"aerodactyl\"], \ -\"03FC034502D002E20087000303D803FC\": [\"snorlax\"], \ -\"04380255000303B70045000303D200E703450213\": [\"articuno\"], \ -\"03DE0087000303B40006038D015003FC\": [\"zapdos\"], \ -\"03DE0087000303B40006038D021603FC\": [\"zapdos\"], \ -\"0333020A02EE000303C602F4006903FC\": [\"moltres\"], \ -\"039002F700A8000303B7002103390024\": [\"dratini\"], \ +\"0426002703E70024\": [\"e v\"], \ +\"03EA018F000303B102BE0015014A0348\": [\"vapor eon\"], \ +\"03EA00A8000303B102BE000F00A50348\": [\"vapor eon\"], \ +\"0366020A02EE000303B70015014A0348\": [\"jolt eon\"], \ +\"03F002E2029D0015014A0348\": [\"flare eon\"], \ +\"03B1020D02F100240006039F014A0348\": [\"por e gon\"], \ +\"03B1020D02F100240006039900A50348\": [\"por e gon\"], \ +\"043B0210032D00C6034501B0000303C6\": [\"oman ite\"], \ +\"04380129032D00A5034501B0000303C6\": [\"oman ite\"], \ +\"043B0210032D00CC03FC000303C30255\": [\"oma star\"], \ +\"04380129032D00AB03FC000303C30255\": [\"oma star\"], \ +\"03CF00C90006037800EA0006038D0213\": [\"ka boo tow\"], \ +\"03D5012C0006037800EA000303C3014D000303B403FC\": [\"ka bu tops\"], \ +\"03D5012C0006037500A8000303C3014D000303B403FC\": [\"ka bu tops\"], \ +\"03D5012C0006037500A8000303C3015003FC\": [\"ka bu tops\"], \ +\"042C02A90213000603840087000303D8000303BD00C002EE\": [\"aero dac tell\"], \ +\"03FC034502D002E20087000303D803FC\": [\"snore lax\"], \ +\"04380255000303B70045000303D200E703450213\": [\"art eh cuno\"], \ +\"03DE0087000303B40006038D015003FC\": [\"zap dos\"], \ +\"03DE0087000303B40006038D021603FC\": [\"zap dos\"], \ +\"0333020A02EE000303C602F4006903FC\": [\"mol tres\"], \ +\"039002F700A8000303B7002103390024\": [\"duh rat ini\"], \ \"039002F400870006039900A5033C02B8\": [\"dragonair\"], \ -\"039002F400870006039900A5034501B0000303C6\": [\"dragonite\"], \ -\"0327030C00EA000303C000EA\": [\"mewtwo\"], \ +\"039002F400870006039900A5034501B0000303C6\": [\"dragon ite\"], \ +\"0327030C00EA000303C000EA\": [\"mew two\"], \ \"0327030C00EA\": [\"mew\"], \ -\"03C3014D000303AB00AB03EA000603630045000603A202DF0024000303AB00AB03F0\": [\"top of jigglypuff\"], \ -\"03C302130006039900A8000303A50024\": [\"togepi\"], \ -\"03C302130006039C010B000303A50024\": [\"togepi\"], \ -\"03C30213000603930045000303A500090024\": [\"togepi\"], \ -\"03B1014402DF001503180087000603A2\": [\"poliwag\"], \ -\"03150024000303A50042034800060372005D02EE\": [\"weepinbell\"], \ -\"03E70045000303D8000303C602F1002400060372005D02EE\": [\"victreebel\"], \ -\"03BA0063033F00A8000303D200E102EE\": [\"tentacool\"], \ -\"038700C9000603A2000303C602F100150213\": [\"dugtrio\"], \ -\"03A50045000603630024\": [\"pidgey\"], \ -\"038D02130006038A00DB0213\": [\"doduo\"], \ -\"03A50045000603660213000303C30213\": [\"pidgeotto\"], \ -\"03CF00C9000303D200E7033F00A8\": [\"kakuna\"], \ -\"03BA00630348000303BD00A8000303D200E102EE\": [\"tentacool\"], \ -\"03CC018C035A00060396008A03FC000303D5014A0348\": [\"kangaskhan\"], \ -\"043B0210032D00AB03FC000303C30255\": [\"omastar\"], \ -\"03CF00A80006037800EA000303C3014D000303B403FC\": [\"kabutops\"], \ +\"03C3014D000303AB00AB03EA000603630045000603A202DF0024000303AB00AB03F0\": [\"top of jiggly puff\"], \ +\"03C302130006039900A8000303A50024\": [\"toge pi\"], \ +\"03C302130006039C010B000303A50024\": [\"toge pi\"], \ +\"03C30213000603930045000303A500090024\": [\"toge pi\"], \ +\"03B1014402DF001503180087000603A2\": [\"poly wag\"], \ +\"03150024000303A50042034800060372005D02EE\": [\"weeping bell\"], \ +\"03E70045000303D8000303C602F1002400060372005D02EE\": [\"vic tree bell\"], \ +\"03BA0063033F00A8000303D200E102EE\": [\"ten ta cool\"], \ +\"038700C9000603A2000303C602F100150213\": [\"dug trio\"], \ +\"03A50045000603630024\": [\"pid gee\"], \ +\"038D02130006038A00DB0213\": [\"do duo\"], \ +\"03A50045000603660213000303C30213\": [\"pid gee otto\"], \ +\"03CF00C9000303D200E7033F00A8\": [\"ka kuna\"], \ +\"03BA00630348000303BD00A8000303D200E102EE\": [\"ten ta cool\"], \ +\"03CC018C035A00060396008A03FC000303D5014A0348\": [\"kang as khan\"], \ +\"043B0210032D00AB03FC000303C30255\": [\"oma star\"], \ +\"03CF00A80006037800EA000303C3014D000303B403FC\": [\"ka boo tops\"], \ \"036C0087000303C603FC02FD01B0000303C6\": [\"thats right\"], \ \"036C0087000303C603FC0006039C010B00060390\": [\"thats good\"], \ \"036C0087000303C3031B00C60348\": [\"that one\"], \ @@ -580,8 +580,8 @@ const char * vruwords = "{\"03A50024000303CF00A80003036000EA\": [\"pikachu\"], \ \"043B0213000303CF0234\": [\"ochre\"], \ \"043B0213000303CF0225031E010B0006039003DE\": [\"ochre woods\"], \ \"043B0213000303CF023703ED004803FF0042035A0411020A02EE\": [\"ochre fishing hole\"], \ -\"03FC000303B402F10042035A02DF002703F0\": [\"springleaf\"], \ -\"03FC000303B402F10042035A02DF002703F003ED000F00C002EE00060390\": [\"springleaf field\"], \ +\"03FC000303B402F10042035A02DF002703F0\": [\"spring leaf\"], \ +\"03FC000303B402F10042035A02DF002703F003ED000F00C002EE00060390\": [\"spring leaf field\"], \ \"0438014402E500AB03EA01AD0348\": [\"olivine\"], \ \"0438014402E500AB03EA01AD034802E2018F000303D8\": [\"olivine lake\"], \ \"0438014402E500AB03EA01AD034803ED004803FF0042035A0411020A02EE\": [\"olivine fishing hole\"], \