Skip to content
Merged
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
Expand Up @@ -26,46 +26,52 @@ namespace NintendoSwitch{
namespace PokemonFRLG{

WhiteDialogDetector::WhiteDialogDetector(Color color)
: m_right_box(0.844, 0.725, 0.005, 0.197)
, m_top_box(0.151, 0.719, 0.698, 0.006)
, m_bottom_box(0.152, 0.913, 0.692, 0.009)
: m_right_box(0.923385, 0.748077, 0.00615385, 0.204577)
, m_top_box(0.0704615, 0.741846, 0.859077, 0.00623077)
, m_bottom_box(0.0716923, 0.943308, 0.851692, 0.00934615)
{}
void WhiteDialogDetector::make_overlays(VideoOverlaySet& items) const{
items.add(COLOR_RED, m_right_box);
items.add(COLOR_RED, m_top_box);
items.add(COLOR_RED, m_bottom_box);
const BoxOption& GAME_BOX = GameSettings::instance().GAME_BOX;
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_right_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_top_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_bottom_box));
}
bool WhiteDialogDetector::detect(const ImageViewRGB32& screen){
ImageViewRGB32 right_image = extract_box_reference(screen, m_right_box);
ImageViewRGB32 top_image = extract_box_reference(screen, m_top_box);
ImageViewRGB32 bottom_image = extract_box_reference(screen, m_bottom_box);
ImageViewRGB32 game_screen = extract_box_reference(screen, GameSettings::instance().GAME_BOX);

ImageViewRGB32 right_image = extract_box_reference(game_screen, m_right_box);
ImageViewRGB32 top_image = extract_box_reference(game_screen, m_top_box);
ImageViewRGB32 bottom_image = extract_box_reference(game_screen, m_bottom_box);
if (is_white(right_image)
&& is_white(top_image)
&& is_white(bottom_image)
){
){
return true;
}
return false;
}

AdvanceWhiteDialogDetector::AdvanceWhiteDialogDetector(Color color)
: m_dialog_box(0.145, 0.727, 0.707, 0.193)
, m_right_box(0.844, 0.725, 0.005, 0.197)
, m_top_box(0.151, 0.719, 0.698, 0.006)
, m_bottom_box(0.152, 0.913, 0.692, 0.009)
: m_dialog_box(0.0630769, 0.750154, 0.870154, 0.200423)
, m_right_box(0.923385, 0.748077, 0.00615385, 0.204577)
, m_top_box(0.0704615, 0.741846, 0.859077, 0.00623077)
, m_bottom_box(0.0716923, 0.943308, 0.851692, 0.00934615)
{}
void AdvanceWhiteDialogDetector::make_overlays(VideoOverlaySet& items) const{
items.add(COLOR_RED, m_dialog_box);
items.add(COLOR_RED, m_right_box);
items.add(COLOR_RED, m_top_box);
items.add(COLOR_RED, m_bottom_box);
const BoxOption& GAME_BOX = GameSettings::instance().GAME_BOX;
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_dialog_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_right_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_top_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_bottom_box));
}
bool AdvanceWhiteDialogDetector::detect(const ImageViewRGB32& screen){
ImageViewRGB32 game_screen = extract_box_reference(screen, GameSettings::instance().GAME_BOX);

const bool replace_color_within_range = false;

//Filter out background
ImageRGB32 filtered_region = filter_rgb32_range(
extract_box_reference(screen, m_dialog_box),
extract_box_reference(game_screen, m_dialog_box),
combine_rgb(164, 0, 0), combine_rgb(255, 114, 87), Color(0), replace_color_within_range
);
ImageStats stats = image_stats(filtered_region);
Expand All @@ -77,118 +83,129 @@ bool AdvanceWhiteDialogDetector::detect(const ImageViewRGB32& screen){
cout << stats.average.b << endl;
*/

ImageViewRGB32 right_image = extract_box_reference(screen, m_right_box);
ImageViewRGB32 top_image = extract_box_reference(screen, m_top_box);
ImageViewRGB32 bottom_image = extract_box_reference(screen, m_bottom_box);
ImageViewRGB32 right_image = extract_box_reference(game_screen, m_right_box);
ImageViewRGB32 top_image = extract_box_reference(game_screen, m_top_box);
ImageViewRGB32 bottom_image = extract_box_reference(game_screen, m_bottom_box);

if (is_white(right_image)
&& is_white(top_image)
&& is_white(bottom_image)
&& (stats.average.r > stats.average.b + 180)
&& (stats.average.r > stats.average.g + 180)
)
{
){
return true;
}
return false;
}

SelectionDialogDetector::SelectionDialogDetector(Color color)
: m_right_box(0.844, 0.725, 0.005, 0.197)
, m_top_box(00.151, 0.719, 0.698, 0.006)
, m_bottom_box(0.152, 0.913, 0.692, 0.009)
, m_selection_box(0.813, 0.436, 0.013, 0.195)
: m_right_box(0.923385, 0.748077, 0.00615385, 0.204577)
, m_top_box(0.0704615, 0.741846, 0.859077, 0.00623077)
, m_bottom_box(0.0716923, 0.943308, 0.851692, 0.00934615)
, m_selection_box(0.885231, 0.447962, 0.016, 0.2025)
{}
void SelectionDialogDetector::make_overlays(VideoOverlaySet& items) const{
items.add(COLOR_RED, m_right_box);
items.add(COLOR_RED, m_top_box);
items.add(COLOR_RED, m_bottom_box);
items.add(COLOR_RED, m_selection_box);
const BoxOption& GAME_BOX = GameSettings::instance().GAME_BOX;
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_right_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_top_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_bottom_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_selection_box));
}
bool SelectionDialogDetector::detect(const ImageViewRGB32& screen){
ImageViewRGB32 right_image = extract_box_reference(screen, m_right_box);
ImageViewRGB32 top_image = extract_box_reference(screen, m_top_box);
ImageViewRGB32 bottom_image = extract_box_reference(screen, m_bottom_box);
ImageViewRGB32 selection_image = extract_box_reference(screen, m_selection_box);
ImageViewRGB32 game_screen = extract_box_reference(screen, GameSettings::instance().GAME_BOX);

ImageViewRGB32 right_image = extract_box_reference(game_screen, m_right_box);
ImageViewRGB32 top_image = extract_box_reference(game_screen, m_top_box);
ImageViewRGB32 bottom_image = extract_box_reference(game_screen, m_bottom_box);
ImageViewRGB32 selection_image = extract_box_reference(game_screen, m_selection_box);
if (is_white(right_image)
&& is_white(top_image)
&& is_white(bottom_image)
&& is_white(selection_image)
){
){
return true;
}
return false;
}

BattleDialogDetector::BattleDialogDetector(Color color)
: m_dialog_top_box(0.124, 0.727, 0.752, 0.009)
, m_dialog_right_box(0.871, 0.736, 0.005, 0.179)
: m_dialog_top_box(0.0372308, 0.750154, 0.925538, 0.00934615)
, m_dialog_right_box(0.956615, 0.7595, 0.00615385, 0.185885)
{}
void BattleDialogDetector::make_overlays(VideoOverlaySet& items) const{
items.add(COLOR_RED, m_dialog_top_box);
items.add(COLOR_RED, m_dialog_right_box);
const BoxOption& GAME_BOX = GameSettings::instance().GAME_BOX;
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_dialog_top_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_dialog_right_box));
}
bool BattleDialogDetector::detect(const ImageViewRGB32& screen){
ImageViewRGB32 dialog_top_image = extract_box_reference(screen, m_dialog_top_box);
ImageViewRGB32 dialog_right_image = extract_box_reference(screen, m_dialog_right_box);
ImageViewRGB32 game_screen = extract_box_reference(screen, GameSettings::instance().GAME_BOX);

ImageViewRGB32 dialog_top_image = extract_box_reference(game_screen, m_dialog_top_box);
ImageViewRGB32 dialog_right_image = extract_box_reference(game_screen, m_dialog_right_box);

if (is_solid(dialog_top_image, { 0.176, 0.357, 0.467 }, 0.25, 20)
&& is_solid(dialog_right_image, { 0.176, 0.357, 0.467 }, 0.25, 20)
){
){
return true;
}
return false;
}


BattleMenuDetector::BattleMenuDetector(Color color)
: m_menu_top_box(0.523, 0.720, 0.357, 0.008) //top of the white dialog box
, m_menu_right_box(0.875, 0.729, 0.005, 0.193)
, m_dialog_top_box(0.123, 0.726, 0.373, 0.013)
, m_dialog_right_box(0.492, 0.739, 0.005, 0.172) //right side, closest to the menu
: m_menu_top_box(0.528308, 0.742885, 0.439385, 0.00830769) //top of the white dialog box
, m_menu_right_box(0.961538, 0.752231, 0.00615385, 0.200423)
, m_dialog_top_box(0.036, 0.749115, 0.459077, 0.0135)
, m_dialog_right_box(0.490154, 0.762615, 0.00615385, 0.178615) //right side, closest to the menu
{}
void BattleMenuDetector::make_overlays(VideoOverlaySet& items) const{
items.add(COLOR_RED, m_menu_top_box);
items.add(COLOR_RED, m_menu_right_box);
items.add(COLOR_RED, m_dialog_top_box);
items.add(COLOR_RED, m_dialog_right_box);
const BoxOption& GAME_BOX = GameSettings::instance().GAME_BOX;
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_menu_top_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_menu_right_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_dialog_top_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_dialog_right_box));
}
bool BattleMenuDetector::detect(const ImageViewRGB32& screen){
ImageViewRGB32 game_screen = extract_box_reference(screen, GameSettings::instance().GAME_BOX);

//Menu is white
ImageViewRGB32 menu_top_image = extract_box_reference(screen, m_menu_top_box);
ImageViewRGB32 menu_right_image = extract_box_reference(screen, m_menu_right_box);
ImageViewRGB32 menu_top_image = extract_box_reference(game_screen, m_menu_top_box);
ImageViewRGB32 menu_right_image = extract_box_reference(game_screen, m_menu_right_box);

//Background dialog is teal
ImageViewRGB32 dialog_top_image = extract_box_reference(screen, m_dialog_top_box);
ImageViewRGB32 dialog_right_image = extract_box_reference(screen, m_dialog_right_box);
ImageViewRGB32 dialog_top_image = extract_box_reference(game_screen, m_dialog_top_box);
ImageViewRGB32 dialog_right_image = extract_box_reference(game_screen, m_dialog_right_box);

if (is_white(menu_top_image)
&& is_white(menu_right_image)
&& is_solid(dialog_top_image, { 0.176, 0.357, 0.467 }, 0.25, 20) //40, 81, 106 teal
&& is_solid(dialog_right_image, { 0.176, 0.357, 0.467 }, 0.25, 20)
){
){
return true;
}
return false;
}


AdvanceBattleDialogDetector::AdvanceBattleDialogDetector(Color color)
: m_dialog_box(0.123, 0.725, 0.753, 0.197)
, m_dialog_top_box(0.124, 0.727, 0.752, 0.009)
, m_dialog_right_box(0.871, 0.736, 0.005, 0.179)
: m_dialog_box(0.036, 0.748077, 0.926769, 0.204577)
, m_dialog_top_box(0.0372308, 0.750154, 0.925538, 0.00934615)
, m_dialog_right_box(0.956615, 0.7595, 0.00615385, 0.185885)
{}
void AdvanceBattleDialogDetector::make_overlays(VideoOverlaySet& items) const{
items.add(COLOR_RED, m_dialog_box);
items.add(COLOR_RED, m_dialog_top_box);
items.add(COLOR_RED, m_dialog_right_box);
const BoxOption& GAME_BOX = GameSettings::instance().GAME_BOX;
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_dialog_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_dialog_top_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_dialog_right_box));
}
bool AdvanceBattleDialogDetector::detect(const ImageViewRGB32& screen){
ImageViewRGB32 game_screen = extract_box_reference(screen, GameSettings::instance().GAME_BOX);

const bool replace_color_within_range = false;

//Filter out background
ImageRGB32 filtered_region = filter_rgb32_range(
extract_box_reference(screen, m_dialog_box),
extract_box_reference(game_screen, m_dialog_box),
combine_rgb(164, 0, 0), combine_rgb(255, 114, 87), Color(0), replace_color_within_range
);
ImageStats stats = image_stats(filtered_region);
Expand All @@ -200,15 +217,14 @@ bool AdvanceBattleDialogDetector::detect(const ImageViewRGB32& screen){
cout << stats.average.b << endl;
*/

ImageViewRGB32 dialog_top_image = extract_box_reference(screen, m_dialog_top_box);
ImageViewRGB32 dialog_right_image = extract_box_reference(screen, m_dialog_right_box);
ImageViewRGB32 dialog_top_image = extract_box_reference(game_screen, m_dialog_top_box);
ImageViewRGB32 dialog_right_image = extract_box_reference(game_screen, m_dialog_right_box);

if (is_solid(dialog_top_image, { 0.176, 0.357, 0.467 }, 0.25, 20)
&& is_solid(dialog_right_image, { 0.176, 0.357, 0.467 }, 0.25, 20)
&& (stats.average.r > stats.average.b + 180)
&& (stats.average.r > stats.average.g + 180)
)
{
){
return true;
}
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,51 @@
#define PokemonAutomation_PokemonFRLG_DialogDetector_H

#include <chrono>
#include <atomic>
#include "CommonFramework/VideoPipeline/VideoOverlayScopes.h"
#include "Common/Cpp/Color.h"
#include "CommonFramework/ImageTools/ImageBoxes.h"
#include "CommonFramework/VideoPipeline/VideoOverlayScopes.h"
#include "CommonTools/VisualDetector.h"
#include "CommonTools/VisualDetectors/BlackScreenDetector.h"
#include "CommonTools/InferenceCallbacks/VisualInferenceCallback.h"
#include "PokemonFRLG/PokemonFRLG_Settings.h"

namespace PokemonAutomation{
class CancellableScope;
class VideoFeed;
namespace NintendoSwitch{
namespace PokemonFRLG{


class WhiteScreenOverWatcher : public PokemonAutomation::WhiteScreenOverWatcher{
public:
WhiteScreenOverWatcher(Color color = COLOR_RED)
: PokemonAutomation::WhiteScreenOverWatcher(
color,
GameSettings::instance().GAME_BOX.inner_to_outer({0.231692, 0.0616538, 0.551385, 0.9045})
)
{}
};
class BlackScreenWatcher : public PokemonAutomation::BlackScreenWatcher{
public:
BlackScreenWatcher(Color color = COLOR_RED)
: PokemonAutomation::BlackScreenWatcher(
color,
GameSettings::instance().GAME_BOX.inner_to_outer({0.231692, 0.0616538, 0.551385, 0.9045})
)
{}
};
class BlackScreenOverWatcher : public PokemonAutomation::BlackScreenOverWatcher{
public:
BlackScreenOverWatcher(Color color = COLOR_RED)
: PokemonAutomation::BlackScreenOverWatcher(
color,
GameSettings::instance().GAME_BOX.inner_to_outer({0.231692, 0.0616538, 0.551385, 0.9045})
)
{}
};



// When given a choice popup, there is no advance arrow.
// FRLG doesn't have an advance arrow on the final line of dialog when speaking to an npc!

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,45 +4,45 @@
*
*/

#include "CommonTools/Images/SolidColorTest.h"
#include "CommonTools/Images/ImageFilter.h"
#include "CommonFramework/ImageTools/ImageBoxes.h"
#include "CommonFramework/ImageTypes/ImageRGB32.h"
#include "CommonFramework/ImageTools/ImageStats.h"
#include "CommonFramework/ImageTypes/ImageViewRGB32.h"
#include "CommonFramework/VideoPipeline/VideoOverlayScopes.h"
#include "CommonTools/Images/SolidColorTest.h"
#include "CommonTools/Images/ImageFilter.h"
#include "CommonTools/Images/WaterfillUtilities.h"
#include "CommonTools/ImageMatch/WaterfillTemplateMatcher.h"
#include "CommonFramework/VideoPipeline/VideoOverlay.h"
#include "PokemonFRLG/PokemonFRLG_Settings.h"
#include "PokemonFRLG_PrizeSelectDetector.h"

namespace PokemonAutomation{
namespace NintendoSwitch{
namespace PokemonFRLG{

PrizeSelectDetector::PrizeSelectDetector(Color color)
: m_right_box(0.812, 0.726, 0.013, 0.169)
, m_top_box(0.175, 0.715, 0.649, 0.005)
, m_bottom_box(0.177, 0.896, 0.645, 0.008)
, m_selection_box(0.667, 0.514, 0.173, 0.058)
: m_right_box(0.884, 0.749115, 0.016, 0.1755)
, m_top_box(0.1, 0.737692, 0.798769, 0.00519231)
, m_bottom_box(0.102462, 0.925654, 0.793846, 0.00830769)
, m_selection_box(0.705538, 0.528962, 0.212923, 0.0602308)
{}
void PrizeSelectDetector::make_overlays(VideoOverlaySet& items) const{
items.add(COLOR_RED, m_right_box);
items.add(COLOR_RED, m_top_box);
items.add(COLOR_RED, m_bottom_box);
items.add(COLOR_RED, m_selection_box);
const BoxOption& GAME_BOX = GameSettings::instance().GAME_BOX;
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_right_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_top_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_bottom_box));
items.add(COLOR_RED, GAME_BOX.inner_to_outer(m_selection_box));
}
bool PrizeSelectDetector::detect(const ImageViewRGB32& screen){
ImageViewRGB32 right_image = extract_box_reference(screen, m_right_box);
ImageViewRGB32 top_image = extract_box_reference(screen, m_top_box);
ImageViewRGB32 bottom_image = extract_box_reference(screen, m_bottom_box);
ImageViewRGB32 selection_image = extract_box_reference(screen, m_selection_box);
ImageViewRGB32 game_screen = extract_box_reference(screen, GameSettings::instance().GAME_BOX);

ImageViewRGB32 right_image = extract_box_reference(game_screen, m_right_box);
ImageViewRGB32 top_image = extract_box_reference(game_screen, m_top_box);
ImageViewRGB32 bottom_image = extract_box_reference(game_screen, m_bottom_box);
ImageViewRGB32 selection_image = extract_box_reference(game_screen, m_selection_box);
if (is_solid(right_image, { 0.25, 0.38, 0.369 })
&& is_solid(top_image, { 0.25, 0.38, 0.369 })
&& is_solid(bottom_image, { 0.25, 0.38, 0.369 })
&& is_solid(selection_image, { 0.25, 0.38, 0.369 })
){
){
return true;
}
return false;
Expand Down
Loading