Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/* Wild Encounter Reader
*
* From: https://github.com/PokemonAutomation/
*
*/

#include "PokemonFRLG_WildEncounterReader.h"
#include "Common/Cpp/Color.h"
#include "Common/Cpp/Exceptions.h"
#include "CommonFramework/GlobalSettingsPanel.h"
#include "CommonFramework/ImageTypes/ImageViewRGB32.h"
#include "CommonFramework/Tools/GlobalThreadPools.h"
#include "CommonFramework/VideoPipeline/VideoOverlayScopes.h"
#include "CommonTools/Images/ImageFilter.h"
#include "CommonTools/Images/ImageManip.h"
#include "CommonTools/OCR/OCR_NumberReader.h"
#include "CommonTools/OCR/OCR_Routines.h"
#include "Pokemon/Inference/Pokemon_NameReader.h"
#include "PokemonFRLG/PokemonFRLG_Settings.h"
#include "PokemonFRLG_DigitReader.h"
#include <opencv2/imgproc.hpp>

namespace PokemonAutomation {
namespace NintendoSwitch {
namespace PokemonFRLG {


WildEncounterReader::WildEncounterReader(Color color)
: m_box_name(0.075, 0.120, 0.265, 0.063)
// , m_box_level(0.325, 0.120, 0.092, 0.063)
{}

void WildEncounterReader::make_overlays(VideoOverlaySet& items) const {
const BoxOption& GAME_BOX = GameSettings::instance().GAME_BOX;
items.add(m_color, GAME_BOX.inner_to_outer(m_box_name));
// items.add(m_color, GAME_BOX.inner_to_outer(m_box_level));
}

PokemonFRLG_WildEncounter WildEncounterReader::read_encounter(
Logger& logger, Language language,
const ImageViewRGB32& frame,
std::set<std::string>& subset,
double max_log10p
) {
PokemonFRLG_WildEncounter encounter;
ImageViewRGB32 game_screen =
extract_box_reference(frame, GameSettings::instance().GAME_BOX);

// Read Name (black text on off-white background).
const std::vector<OCR::TextColorRange> name_text_color_ranges{
{combine_rgb(0, 0, 0), combine_rgb(64, 64, 64)},
{combine_rgb(0, 0, 0), combine_rgb(96, 96, 96)},
{combine_rgb(0, 0, 0), combine_rgb(128, 128, 128)},
};
// auto name_result = Pokemon::PokemonNameReader::instance().read_substring(
auto name_result = Pokemon::PokemonNameReader(subset).read_substring(
logger, language, extract_box_reference(game_screen, m_box_name),
name_text_color_ranges,
0.01, 0.50, max_log10p);
if (!name_result.results.empty()) {
encounter.name = name_result.results.begin()->second.token;
}
return encounter;
}

} // namespace PokemonFRLG
} // namespace NintendoSwitch
} // namespace PokemonAutomation

Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/* Wild Encounter Reader
*
* From: https://github.com/PokemonAutomation/
*
*/

#ifndef PokemonAutomation_PokemonFRLG_WildEncounterReader_H
#define PokemonAutomation_PokemonFRLG_WildEncounterReader_H

#include <optional>
#include <string>
#include "Common/Cpp/Color.h"
#include "CommonFramework/ImageTools/ImageBoxes.h"
#include "CommonFramework/Language.h"


namespace PokemonAutomation{

class Logger;
class ImageViewRGB32;
class VideoOverlaySet;

namespace NintendoSwitch{
namespace PokemonFRLG{

struct PokemonFRLG_WildEncounter{
std::string name;
std::optional<unsigned> level;
// gender
};

class WildEncounterReader {
public:
static constexpr double MAX_LOG10P = -1.40;

WildEncounterReader(Color color = COLOR_RED);

void make_overlays(VideoOverlaySet& items) const;

// Reads species from the top left of the battle screen
// by matching to the provided subset of species
PokemonFRLG_WildEncounter read_encounter(
Logger& logger, Language language,
const ImageViewRGB32& frame,
std::set<std::string>& subset,
double max_log10p = MAX_LOG10P
);

private:
Color m_color;
ImageFloatBox m_box_name;
// ImageFloatBox m_box_level;
};

} // namespace PokemonFRLG
} // namespace NintendoSwitch
} // namespace PokemonAutomation
#endif

2 changes: 2 additions & 0 deletions SerialPrograms/Source/PokemonFRLG/PokemonFRLG_Panels.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "Programs/ShinyHunting/PokemonFRLG_ShinyHunt-Overworld.h"
#include "Programs/TestPrograms/PokemonFRLG_SoundListener.h"
#include "Programs/TestPrograms/PokemonFRLG_ReadStats.h"
#include "Programs/TestPrograms/PokemonFRLG_ReadEncounter.h"

namespace PokemonAutomation{
namespace NintendoSwitch{
Expand Down Expand Up @@ -58,6 +59,7 @@ std::vector<PanelEntry> PanelListFactory::make_panels() const{
ret.emplace_back("---- Developer Tools ----");
ret.emplace_back(make_single_switch_program<SoundListener_Descriptor, SoundListener>());
ret.emplace_back(make_single_switch_program<ReadStats_Descriptor, ReadStats>());
ret.emplace_back(make_single_switch_program<ReadEncounter_Descriptor, ReadEncounter>());
}

return ret;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/* Read Encounter
*
* From: https://github.com/PokemonAutomation/
*
*/

#include <chrono>
#include <string>
#include <optional>
#include "Common/Cpp/Color.h"
#include "CommonFramework/VideoPipeline/VideoFeed.h"
#include "CommonFramework/VideoPipeline/VideoOverlayScopes.h"
#include "NintendoSwitch/Commands/NintendoSwitch_Commands_PushButtons.h"
#include "Pokemon/Pokemon_Strings.h"
#include "Pokemon/Inference/Pokemon_NameReader.h"
#include "PokemonFRLG/Inference/PokemonFRLG_WildEncounterReader.h"
#include "PokemonFRLG_ReadEncounter.h"

namespace PokemonAutomation{
namespace NintendoSwitch{
namespace PokemonFRLG{

using namespace std::chrono_literals;


ReadEncounter_Descriptor::ReadEncounter_Descriptor()
: SingleSwitchProgramDescriptor(
"PokemonFRLG:ReadEncounter",
Pokemon::STRING_POKEMON + " FRLG",
"Read Wild Encounter", "",
"Read name and level of a wild encounter.",
ProgramControllerClass::StandardController_NoRestrictions,
FeedbackType::REQUIRED,
AllowCommandsWhenRunning::DISABLE_COMMANDS
){}

ReadEncounter::ReadEncounter()
: LANGUAGE(
"<b>Game Language:</b>",
Pokemon::PokemonNameReader::instance().languages(),
LockMode::LOCK_WHILE_RUNNING, true
)
, SUBSET(
"<b>Possible Encounters:</b>",
{
{Subset::route1, "route1", "Route 1 (Pidgey / Rattata)"},
{Subset::route22, "route22", "Route 22 (Rattata / Spearow / Mankey"},
{Subset::viridianforest, "viridianforest", "Viridian Forest (Caterpie / Metapod / Weedle / Kakuna / Pikachu)"},
{Subset::rocktunnel, "rocktunnel", "Rock Tunnel (Geodude / Machop / Mankey / Onix / Zubat)"},
{Subset::pokemontower, "pokemontower", "Pokemon Tower (Gastly, Haunter, Cubone)"},
},
LockMode::LOCK_WHILE_RUNNING,
Subset::route1
)
{
PA_ADD_OPTION(LANGUAGE);
PA_ADD_OPTION(SUBSET);
}

void ReadEncounter::program(
SingleSwitchProgramEnvironment& env,
ProControllerContext& context
){
env.log(
"Starting Read Encounter program..."
);

std::set<std::string> subset;
switch (SUBSET){
case Subset::route1:
subset = std::set<std::string>{"pidgey","rattata"};
break;
case Subset::route22:
subset = std::set<std::string>{"rattata", "spearow", "mankey"};
break;
case Subset::viridianforest:
subset = std::set<std::string>{"caterpie", "metapod", "weedle", "kakuna", "pikachu"};
break;
case Subset::rocktunnel:
subset = std::set<std::string>{"geodude", "zubat", "mankey", "machop", "onix"};
break;
case Subset::pokemontower:
subset = std::set<std::string>{"gastly", "haunter", "cubone"};
break;
default:
subset = std::set<std::string>{};
}

WildEncounterReader reader(COLOR_RED);
VideoOverlaySet overlays(env.console.overlay());
reader.make_overlays(overlays);

env.log("Reading name and level...");
VideoSnapshot screen = env.console.video().snapshot();
PokemonFRLG_WildEncounter encounter = reader.read_encounter(env.logger(), LANGUAGE, screen, subset);

env.log("Name: " + encounter.name);

env.log("Finished reading encounter.", COLOR_BLUE);
pbf_wait(context, 10s);
context.wait_for_all_requests();
}

} // namespace PokemonFRLG
} // namespace NintendoSwitch
} // namespace PokemonAutomation

Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/* Read Encounter
*
* From: https://github.com/PokemonAutomation/
*
*/

#ifndef PokemonAutomation_PokemonFRLG_ReadEncounter_H
#define PokemonAutomation_PokemonFRLG_ReadEncounter_H

#include <set>
#include "CommonFramework/Tools/VideoStream.h"
#include "CommonTools/Options/LanguageOCROption.h"
#include "NintendoSwitch/Controllers/Procon/NintendoSwitch_ProController.h"
#include "NintendoSwitch/NintendoSwitch_SingleSwitchProgram.h"

namespace PokemonAutomation{
namespace NintendoSwitch{
namespace PokemonFRLG{

class ReadEncounter_Descriptor : public SingleSwitchProgramDescriptor{
public:
ReadEncounter_Descriptor();
};

class ReadEncounter : public SingleSwitchProgramInstance{
public:
ReadEncounter();
virtual void program(
SingleSwitchProgramEnvironment &env,
ProControllerContext &context
) override;

virtual void start_program_border_check(
VideoStream &stream, FeedbackType feedback_type
) override{}

private:
enum class Subset{
route1,
route22,
viridianforest,
rocktunnel,
pokemontower
};

OCR::LanguageOCROption LANGUAGE;
EnumDropdownOption<Subset> SUBSET;

};

} // namespace PokemonFRLG
} // namespace NintendoSwitch
} // namespace PokemonAutomation
#endif

4 changes: 4 additions & 0 deletions SerialPrograms/cmake/SourceFiles.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -1455,6 +1455,8 @@ file(GLOB LIBRARY_SOURCES
Source/PokemonFRLG/Inference/PokemonFRLG_DigitReader.h
Source/PokemonFRLG/Inference/PokemonFRLG_StatsReader.cpp
Source/PokemonFRLG/Inference/PokemonFRLG_StatsReader.h
Source/PokemonFRLG/Inference/PokemonFRLG_WildEncounterReader.cpp
Source/PokemonFRLG/Inference/PokemonFRLG_WildEncounterReader.h
Source/PokemonFRLG/PokemonFRLG_Navigation.cpp
Source/PokemonFRLG/PokemonFRLG_Navigation.h
Source/PokemonFRLG/PokemonFRLG_Panels.cpp
Expand All @@ -1481,6 +1483,8 @@ file(GLOB LIBRARY_SOURCES
Source/PokemonFRLG/Programs/TestPrograms/PokemonFRLG_SoundListener.h
Source/PokemonFRLG/Programs/TestPrograms/PokemonFRLG_ReadStats.cpp
Source/PokemonFRLG/Programs/TestPrograms/PokemonFRLG_ReadStats.h
Source/PokemonFRLG/Programs/TestPrograms/PokemonFRLG_ReadEncounter.cpp
Source/PokemonFRLG/Programs/TestPrograms/PokemonFRLG_ReadEncounter.h
Source/PokemonHome/Inference/PokemonHome_BallReader.cpp
Source/PokemonHome/Inference/PokemonHome_BallReader.h
Source/PokemonHome/Inference/PokemonHome_BoxGenderDetector.cpp
Expand Down