1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-17 00:07:41 +02:00

highscore input window

This commit is contained in:
Laserlicht
2023-09-22 20:39:20 +02:00
committed by GitHub
parent fe0adfa4bd
commit a4cb74f0dc
5 changed files with 262 additions and 132 deletions

View File

@ -37,6 +37,7 @@
#include "gui/WindowHandler.h" #include "gui/WindowHandler.h"
#include "mainmenu/CMainMenu.h" #include "mainmenu/CMainMenu.h"
#include "mainmenu/CHighScoreScreen.h"
#include "mapView/mapHandler.h" #include "mapView/mapHandler.h"
@ -1690,11 +1691,13 @@ void CPlayerInterface::requestReturningToMainMenu(bool won)
else else
{ {
GH.dispatchMainThread( GH.dispatchMainThread(
[]() [won]()
{ {
CSH->endGameplay(); CSH->endGameplay();
GH.defActionsDef = 63; GH.defActionsDef = 63;
CMM->menu->switchToTab("main"); CMM->menu->switchToTab("main");
if(won)
GH.windows().createAndPushWindow<CHighScoreInputScreen>();
} }
); );
} }

View File

@ -22,6 +22,7 @@
#include "mainmenu/CMainMenu.h" #include "mainmenu/CMainMenu.h"
#include "mainmenu/CPrologEpilogVideo.h" #include "mainmenu/CPrologEpilogVideo.h"
#include "mainmenu/CHighScoreScreen.h"
#ifdef VCMI_ANDROID #ifdef VCMI_ANDROID
#include "../lib/CAndroidVMHelper.h" #include "../lib/CAndroidVMHelper.h"
@ -695,7 +696,10 @@ void CServerHandler::startCampaignScenario(std::shared_ptr<CampaignState> cs)
if(!ourCampaign->isCampaignFinished()) if(!ourCampaign->isCampaignFinished())
CMM->openCampaignLobby(ourCampaign); CMM->openCampaignLobby(ourCampaign);
else else
{
CMM->openCampaignScreen(ourCampaign->campaignSet); CMM->openCampaignScreen(ourCampaign->campaignSet);
GH.windows().createAndPushWindow<CHighScoreInputScreen>();
}
}; };
if(epilogue.hasPrologEpilog) if(epilogue.hasPrologEpilog)
{ {

View File

@ -12,6 +12,8 @@
#include "CHighScoreScreen.h" #include "CHighScoreScreen.h"
#include "../gui/CGuiHandler.h" #include "../gui/CGuiHandler.h"
#include "../gui/WindowHandler.h"
#include "../gui/Shortcut.h"
#include "../widgets/TextControls.h" #include "../widgets/TextControls.h"
#include "../widgets/Buttons.h" #include "../widgets/Buttons.h"
#include "../widgets/Images.h" #include "../widgets/Images.h"
@ -19,6 +21,7 @@
#include "../render/Canvas.h" #include "../render/Canvas.h"
#include "../CGameInfo.h" #include "../CGameInfo.h"
#include "../CVideoHandler.h"
#include "../../lib/CGeneralTextHandler.h" #include "../../lib/CGeneralTextHandler.h"
#include "../../lib/CConfigHandler.h" #include "../../lib/CConfigHandler.h"
#include "../../lib/CCreatureHandler.h" #include "../../lib/CCreatureHandler.h"
@ -44,13 +47,13 @@ CHighScoreScreen::CHighScoreScreen()
Settings entry2 = persistentStorage.write["highscore"]["campaign"][std::to_string(i)]["points"]; Settings entry2 = persistentStorage.write["highscore"]["campaign"][std::to_string(i)]["points"];
entry2->Integer() = std::rand() % 400 * 5; entry2->Integer() = std::rand() % 400 * 5;
Settings entry3 = persistentStorage.write["highscore"]["standard"][std::to_string(i)]["player"]; Settings entry3 = persistentStorage.write["highscore"]["scenario"][std::to_string(i)]["player"];
entry3->String() = "test"; entry3->String() = "test";
Settings entry4 = persistentStorage.write["highscore"]["standard"][std::to_string(i)]["land"]; Settings entry4 = persistentStorage.write["highscore"]["scenario"][std::to_string(i)]["land"];
entry4->String() = "test"; entry4->String() = "test";
Settings entry5 = persistentStorage.write["highscore"]["standard"][std::to_string(i)]["days"]; Settings entry5 = persistentStorage.write["highscore"]["scenario"][std::to_string(i)]["days"];
entry5->Integer() = 123; entry5->Integer() = 123;
Settings entry6 = persistentStorage.write["highscore"]["standard"][std::to_string(i)]["points"]; Settings entry6 = persistentStorage.write["highscore"]["scenario"][std::to_string(i)]["points"];
entry6->Integer() = std::rand() % 400; entry6->Integer() = std::rand() % 400;
} }
} }
@ -71,7 +74,7 @@ void CHighScoreScreen::addHighScores()
{ {
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
background = std::make_shared<CPicture>(ImagePath::builtin(highscorepage == HighScorePage::STANDARD ? "HISCORE" : "HISCORE2")); background = std::make_shared<CPicture>(ImagePath::builtin(highscorepage == HighScorePage::SCENARIO ? "HISCORE" : "HISCORE2"));
texts.clear(); texts.clear();
images.clear(); images.clear();
@ -83,7 +86,7 @@ void CHighScoreScreen::addHighScores()
texts.push_back(std::make_shared<CLabel>(115, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.433"))); texts.push_back(std::make_shared<CLabel>(115, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.433")));
texts.push_back(std::make_shared<CLabel>(220, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.434"))); texts.push_back(std::make_shared<CLabel>(220, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.434")));
if(highscorepage == HighScorePage::STANDARD) if(highscorepage == HighScorePage::SCENARIO)
{ {
texts.push_back(std::make_shared<CLabel>(400, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.435"))); texts.push_back(std::make_shared<CLabel>(400, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.435")));
texts.push_back(std::make_shared<CLabel>(555, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.436"))); texts.push_back(std::make_shared<CLabel>(555, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.436")));
@ -97,15 +100,15 @@ void CHighScoreScreen::addHighScores()
// Content // Content
int y = 65; int y = 65;
auto & data = persistentStorage["highscore"][highscorepage == HighScorePage::STANDARD ? "standard" : "campaign"]; auto & data = persistentStorage["highscore"][highscorepage == HighScorePage::SCENARIO ? "scenario" : "campaign"];
for (int i = 0; i < 11; i++) for (int i = 0; i < 11; i++)
{ {
auto & curData = data[std::to_string(i)]; auto & curData = data[std::to_string(i)];
texts.push_back(std::make_shared<CLabel>(115, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, std::to_string(i))); texts.push_back(std::make_shared<CLabel>(115, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, std::to_string(i+1)));
texts.push_back(std::make_shared<CLabel>(220, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, curData["player"].String())); texts.push_back(std::make_shared<CLabel>(220, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, curData["player"].String()));
if(highscorepage == HighScorePage::STANDARD) if(highscorepage == HighScorePage::SCENARIO)
{ {
texts.push_back(std::make_shared<CLabel>(400, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, curData["land"].String())); texts.push_back(std::make_shared<CLabel>(400, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, curData["land"].String()));
texts.push_back(std::make_shared<CLabel>(555, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, std::to_string(curData["days"].Integer()))); texts.push_back(std::make_shared<CLabel>(555, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, std::to_string(curData["days"].Integer())));
@ -117,7 +120,7 @@ void CHighScoreScreen::addHighScores()
texts.push_back(std::make_shared<CLabel>(590, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, std::to_string(curData["points"].Integer()))); texts.push_back(std::make_shared<CLabel>(590, y + i * 50, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, std::to_string(curData["points"].Integer())));
} }
int divide = (highscorepage == HighScorePage::STANDARD) ? 1 : 5; int divide = (highscorepage == HighScorePage::SCENARIO) ? 1 : 5;
for(auto & creature : creatures) { for(auto & creature : creatures) {
if(curData["points"].Integer() / divide <= creature["max"].Integer() && curData["points"].Integer() / divide >= creature["min"].Integer()) if(curData["points"].Integer() / divide <= creature["max"].Integer() && curData["points"].Integer() / divide >= creature["min"].Integer())
images.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("CPRSMALL"), (*CGI->creh)[CreatureID::decode(creature["creature"].String())]->getIconIndex(), 0, 670, y - 15 + i * 50)); images.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("CPRSMALL"), (*CGI->creh)[CreatureID::decode(creature["creature"].String())]->getIconIndex(), 0, 670, y - 15 + i * 50));
@ -136,7 +139,7 @@ void CHighScoreScreen::buttonCampaginClick()
void CHighScoreScreen::buttonStandardClick() void CHighScoreScreen::buttonStandardClick()
{ {
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
highscorepage = HighScorePage::STANDARD; highscorepage = HighScorePage::SCENARIO;
addHighScores(); addHighScores();
addButtons(); addButtons();
redraw(); redraw();
@ -163,3 +166,89 @@ void CHighScoreScreen::buttonExitClick()
{ {
close(); close();
} }
CHighScoreInputScreen::CHighScoreInputScreen()
: CWindowObject(BORDERED)
{
addUsedEvents(LCLICK);
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
pos = center(Rect(0, 0, 800, 600));
updateShadow();
int border = 100;
int textareaW = ((pos.w - 2 * border) / 4);
std::vector<std::string> t = { "438", "439", "440", "441", "676" };
for (int i = 0; i < 5; i++)
texts.push_back(std::make_shared<CMultiLineLabel>(Rect(textareaW * i + border - (textareaW / 2), 450, textareaW, 100), FONT_HIGH_SCORE, ETextAlignment::TOPCENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt." + t[i])));
}
void CHighScoreInputScreen::addEntry(std::string text) {
}
void CHighScoreInputScreen::show(Canvas & to)
{
CCS->videoh->update(pos.x, pos.y, to.getInternalSurface(), true, false);
redraw();
CIntObject::show(to);
}
void CHighScoreInputScreen::activate()
{
CCS->videoh->open(VideoPath::builtin("HSLOOP.SMK"));
CIntObject::activate();
}
void CHighScoreInputScreen::deactivate()
{
CCS->videoh->close();
CIntObject::deactivate();
}
void CHighScoreInputScreen::clickPressed(const Point & cursorPosition)
{
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
if(!input)
{
input = std::make_shared<CHighScoreInput>(
[&] (std::string text)
{
if(!text.empty())
{
addEntry(text);
}
close();
});
}
}
CHighScoreInput::CHighScoreInput(std::function<void(std::string text)> readyCB)
: CWindowObject(0), ready(readyCB)
{
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
pos = center(Rect(0, 0, 232, 212));
updateShadow();
background = std::make_shared<CPicture>(ImagePath::builtin("HIGHNAME"));
text = std::make_shared<CMultiLineLabel>(Rect(15, 15, 202, 202), FONT_SMALL, ETextAlignment::TOPCENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.96"));
buttonOk = std::make_shared<CButton>(Point(26, 142), AnimationPath::builtin("MUBCHCK.DEF"), CGI->generaltexth->zelp[560], std::bind(&CHighScoreInput::okay, this), EShortcut::GLOBAL_ACCEPT);
buttonCancel = std::make_shared<CButton>(Point(142, 142), AnimationPath::builtin("MUBCANC.DEF"), CGI->generaltexth->zelp[561], std::bind(&CHighScoreInput::abort, this), EShortcut::GLOBAL_CANCEL);
statusBar = CGStatusBar::create(std::make_shared<CPicture>(background->getSurface(), Rect(7, 186, 218, 18), 7, 186));
textInput = std::make_shared<CTextInput>(Rect(18, 104, 200, 25), FONT_SMALL, 0);
textInput->setText(settings["general"]["playerName"].String());
}
void CHighScoreInput::okay()
{
ready(textInput->getText());
}
void CHighScoreInput::abort()
{
ready("");
}

View File

@ -12,11 +12,13 @@
class CButton; class CButton;
class CLabel; class CLabel;
class CMultiLineLabel;
class CAnimImage; class CAnimImage;
class CTextInput;
class CHighScoreScreen : public CWindowObject class CHighScoreScreen : public CWindowObject
{ {
enum HighScorePage { STANDARD, CAMPAIGN }; enum HighScorePage { SCENARIO, CAMPAIGN };
void addButtons(); void addButtons();
void addHighScores(); void addHighScores();
@ -26,7 +28,7 @@ class CHighScoreScreen : public CWindowObject
void buttonResetClick(); void buttonResetClick();
void buttonExitClick(); void buttonExitClick();
HighScorePage highscorepage = HighScorePage::STANDARD; HighScorePage highscorepage = HighScorePage::SCENARIO;
std::shared_ptr<CPicture> background; std::shared_ptr<CPicture> background;
std::vector<std::shared_ptr<CButton>> buttons; std::vector<std::shared_ptr<CButton>> buttons;
@ -35,3 +37,35 @@ class CHighScoreScreen : public CWindowObject
public: public:
CHighScoreScreen(); CHighScoreScreen();
}; };
class CHighScoreInput : public CWindowObject
{
std::shared_ptr<CPicture> background;
std::shared_ptr<CMultiLineLabel> text;
std::shared_ptr<CButton> buttonOk;
std::shared_ptr<CButton> buttonCancel;
std::shared_ptr<CGStatusBar> statusBar;
std::shared_ptr<CTextInput> textInput;
std::function<void(std::string text)> ready;
void okay();
void abort();
public:
CHighScoreInput(std::function<void(std::string text)> readyCB);
};
class CHighScoreInputScreen : public CWindowObject
{
std::vector<std::shared_ptr<CMultiLineLabel>> texts;
std::shared_ptr<CHighScoreInput> input;
public:
CHighScoreInputScreen();
void addEntry(std::string text);
void show(Canvas & to) override;
void activate() override;
void deactivate() override;
void clickPressed(const Point & cursorPosition) override;
};

View File

@ -1,122 +1,122 @@
{ {
"creatures": [ "creatures": [
{ "min" : 1, "max" : 4, "creature": "core:imp" }, { "min" : 1, "max" : 4, "creature": "imp" },
{ "min" : 5, "max" : 8, "creature": "core:gremlin" }, { "min" : 5, "max" : 8, "creature": "gremlin" },
{ "min" : 9, "max" : 12, "creature": "core:gnoll" }, { "min" : 9, "max" : 12, "creature": "gnoll" },
{ "min" : 13, "max" : 16, "creature": "core:troglodyte" }, { "min" : 13, "max" : 16, "creature": "troglodyte" },
{ "min" : 17, "max" : 20, "creature": "core:familiar" }, { "min" : 17, "max" : 20, "creature": "familiar" },
{ "min" : 21, "max" : 24, "creature": "core:skeleton" }, { "min" : 21, "max" : 24, "creature": "skeleton" },
{ "min" : 25, "max" : 28, "creature": "core:goblin" }, { "min" : 25, "max" : 28, "creature": "goblin" },
{ "min" : 29, "max" : 32, "creature": "core:masterGremlin" }, { "min" : 29, "max" : 32, "creature": "masterGremlin" },
{ "min" : 33, "max" : 36, "creature": "core:hobgoblin" }, { "min" : 33, "max" : 36, "creature": "hobgoblin" },
{ "min" : 37, "max" : 40, "creature": "core:pikeman" }, { "min" : 37, "max" : 40, "creature": "pikeman" },
{ "min" : 41, "max" : 44, "creature": "core:infernalTroglodyte" }, { "min" : 41, "max" : 44, "creature": "infernalTroglodyte" },
{ "min" : 45, "max" : 48, "creature": "core:skeletonWarrior" }, { "min" : 45, "max" : 48, "creature": "skeletonWarrior" },
{ "min" : 49, "max" : 52, "creature": "core:gnollMarauder" }, { "min" : 49, "max" : 52, "creature": "gnollMarauder" },
{ "min" : 53, "max" : 56, "creature": "core:walkingDead" }, { "min" : 53, "max" : 56, "creature": "walkingDead" },
{ "min" : 57, "max" : 60, "creature": "core:centaur" }, { "min" : 57, "max" : 60, "creature": "centaur" },
{ "min" : 61, "max" : 64, "creature": "core:halberdier" }, { "min" : 61, "max" : 64, "creature": "halberdier" },
{ "min" : 65, "max" : 68, "creature": "core:archer" }, { "min" : 65, "max" : 68, "creature": "archer" },
{ "min" : 69, "max" : 72, "creature": "core:lizardman" }, { "min" : 69, "max" : 72, "creature": "lizardman" },
{ "min" : 73, "max" : 76, "creature": "core:zombie" }, { "min" : 73, "max" : 76, "creature": "zombie" },
{ "min" : 77, "max" : 80, "creature": "core:goblinWolfRider" }, { "min" : 77, "max" : 80, "creature": "goblinWolfRider" },
{ "min" : 81, "max" : 84, "creature": "core:centaurCaptain" }, { "min" : 81, "max" : 84, "creature": "centaurCaptain" },
{ "min" : 85, "max" : 88, "creature": "core:dwarf" }, { "min" : 85, "max" : 88, "creature": "dwarf" },
{ "min" : 89, "max" : 92, "creature": "core:harpy" }, { "min" : 89, "max" : 92, "creature": "harpy" },
{ "min" : 93, "max" : 96, "creature": "core:lizardWarrior" }, { "min" : 93, "max" : 96, "creature": "lizardWarrior" },
{ "min" : 97, "max" : 100, "creature": "core:gog" }, { "min" : 97, "max" : 100, "creature": "gog" },
{ "min" : 101, "max" : 104, "creature": "core:stoneGargoyle" }, { "min" : 101, "max" : 104, "creature": "stoneGargoyle" },
{ "min" : 105, "max" : 108, "creature": "core:sharpshooter" }, { "min" : 105, "max" : 108, "creature": "sharpshooter" },
{ "min" : 109, "max" : 112, "creature": "core:orc" }, { "min" : 109, "max" : 112, "creature": "orc" },
{ "min" : 113, "max" : 116, "creature": "core:obsidianGargoyle" }, { "min" : 113, "max" : 116, "creature": "obsidianGargoyle" },
{ "min" : 117, "max" : 120, "creature": "core:hobgoblinWolfRider" }, { "min" : 117, "max" : 120, "creature": "hobgoblinWolfRider" },
{ "min" : 121, "max" : 124, "creature": "core:battleDwarf" }, { "min" : 121, "max" : 124, "creature": "battleDwarf" },
{ "min" : 125, "max" : 128, "creature": "core:woodElf" }, { "min" : 125, "max" : 128, "creature": "woodElf" },
{ "min" : 129, "max" : 132, "creature": "core:harpyHag" }, { "min" : 129, "max" : 132, "creature": "harpyHag" },
{ "min" : 133, "max" : 136, "creature": "core:magog" }, { "min" : 133, "max" : 136, "creature": "magog" },
{ "min" : 137, "max" : 140, "creature": "core:orcChieftain" }, { "min" : 137, "max" : 140, "creature": "orcChieftain" },
{ "min" : 141, "max" : 144, "creature": "core:stoneGolem" }, { "min" : 141, "max" : 144, "creature": "stoneGolem" },
{ "min" : 145, "max" : 148, "creature": "core:wight" }, { "min" : 145, "max" : 148, "creature": "wight" },
{ "min" : 149, "max" : 152, "creature": "core:serpentFly" }, { "min" : 149, "max" : 152, "creature": "serpentFly" },
{ "min" : 153, "max" : 156, "creature": "core:dragonFly" }, { "min" : 153, "max" : 156, "creature": "dragonFly" },
{ "min" : 157, "max" : 160, "creature": "core:wraith" }, { "min" : 157, "max" : 160, "creature": "wraith" },
{ "min" : 161, "max" : 164, "creature": "core:waterElemental" }, { "min" : 161, "max" : 164, "creature": "waterElemental" },
{ "min" : 165, "max" : 168, "creature": "core:earthElemental" }, { "min" : 165, "max" : 168, "creature": "earthElemental" },
{ "min" : 169, "max" : 172, "creature": "core:grandElf" }, { "min" : 169, "max" : 172, "creature": "grandElf" },
{ "min" : 173, "max" : 176, "creature": "core:beholder" }, { "min" : 173, "max" : 176, "creature": "beholder" },
{ "min" : 177, "max" : 180, "creature": "core:fireElemental" }, { "min" : 177, "max" : 180, "creature": "fireElemental" },
{ "min" : 181, "max" : 184, "creature": "core:griffin" }, { "min" : 181, "max" : 184, "creature": "griffin" },
{ "min" : 185, "max" : 187, "creature": "core:airElemental" }, { "min" : 185, "max" : 187, "creature": "airElemental" },
{ "min" : 188, "max" : 190, "creature": "core:hellHound" }, { "min" : 188, "max" : 190, "creature": "hellHound" },
{ "min" : 191, "max" : 193, "creature": "core:evilEye" }, { "min" : 191, "max" : 193, "creature": "evilEye" },
{ "min" : 194, "max" : 196, "creature": "core:cerberus" }, { "min" : 194, "max" : 196, "creature": "cerberus" },
{ "min" : 197, "max" : 199, "creature": "core:ironGolem" }, { "min" : 197, "max" : 199, "creature": "ironGolem" },
{ "min" : 200, "max" : 202, "creature": "core:ogre" }, { "min" : 200, "max" : 202, "creature": "ogre" },
{ "min" : 203, "max" : 205, "creature": "core:swordsman" }, { "min" : 203, "max" : 205, "creature": "swordsman" },
{ "min" : 206, "max" : 208, "creature": "core:demon" }, { "min" : 206, "max" : 208, "creature": "demon" },
{ "min" : 209, "max" : 211, "creature": "core:royalGriffin" }, { "min" : 209, "max" : 211, "creature": "royalGriffin" },
{ "min" : 212, "max" : 214, "creature": "core:hornedDemon" }, { "min" : 212, "max" : 214, "creature": "hornedDemon" },
{ "min" : 215, "max" : 217, "creature": "core:monk" }, { "min" : 215, "max" : 217, "creature": "monk" },
{ "min" : 218, "max" : 220, "creature": "core:dendroidGuard" }, { "min" : 218, "max" : 220, "creature": "dendroidGuard" },
{ "min" : 221, "max" : 223, "creature": "core:medusa" }, { "min" : 221, "max" : 223, "creature": "medusa" },
{ "min" : 224, "max" : 226, "creature": "core:pegasus" }, { "min" : 224, "max" : 226, "creature": "pegasus" },
{ "min" : 227, "max" : 229, "creature": "core:silverPegasus" }, { "min" : 227, "max" : 229, "creature": "silverPegasus" },
{ "min" : 230, "max" : 232, "creature": "core:basilisk" }, { "min" : 230, "max" : 232, "creature": "basilisk" },
{ "min" : 233, "max" : 235, "creature": "core:vampire" }, { "min" : 233, "max" : 235, "creature": "vampire" },
{ "min" : 236, "max" : 238, "creature": "core:mage" }, { "min" : 236, "max" : 238, "creature": "mage" },
{ "min" : 239, "max" : 241, "creature": "core:medusaQueen" }, { "min" : 239, "max" : 241, "creature": "medusaQueen" },
{ "min" : 242, "max" : 244, "creature": "core:crusader" }, { "min" : 242, "max" : 244, "creature": "crusader" },
{ "min" : 245, "max" : 247, "creature": "core:goldGolem" }, { "min" : 245, "max" : 247, "creature": "goldGolem" },
{ "min" : 248, "max" : 250, "creature": "core:ogreMage" }, { "min" : 248, "max" : 250, "creature": "ogreMage" },
{ "min" : 251, "max" : 253, "creature": "core:archMage" }, { "min" : 251, "max" : 253, "creature": "archMage" },
{ "min" : 254, "max" : 256, "creature": "core:greaterBasilisk" }, { "min" : 254, "max" : 256, "creature": "greaterBasilisk" },
{ "min" : 257, "max" : 259, "creature": "core:zealot" }, { "min" : 257, "max" : 259, "creature": "zealot" },
{ "min" : 260, "max" : 262, "creature": "core:pitFiend" }, { "min" : 260, "max" : 262, "creature": "pitFiend" },
{ "min" : 263, "max" : 265, "creature": "core:diamondGolem" }, { "min" : 263, "max" : 265, "creature": "diamondGolem" },
{ "min" : 266, "max" : 268, "creature": "core:vampireLord" }, { "min" : 266, "max" : 268, "creature": "vampireLord" },
{ "min" : 269, "max" : 271, "creature": "core:dendroidSoldier" }, { "min" : 269, "max" : 271, "creature": "dendroidSoldier" },
{ "min" : 272, "max" : 274, "creature": "core:minotaur" }, { "min" : 272, "max" : 274, "creature": "minotaur" },
{ "min" : 275, "max" : 277, "creature": "core:lich" }, { "min" : 275, "max" : 277, "creature": "lich" },
{ "min" : 278, "max" : 280, "creature": "core:genie" }, { "min" : 278, "max" : 280, "creature": "genie" },
{ "min" : 281, "max" : 283, "creature": "core:gorgon" }, { "min" : 281, "max" : 283, "creature": "gorgon" },
{ "min" : 284, "max" : 286, "creature": "core:masterGenie" }, { "min" : 284, "max" : 286, "creature": "masterGenie" },
{ "min" : 287, "max" : 289, "creature": "core:roc" }, { "min" : 287, "max" : 289, "creature": "roc" },
{ "min" : 290, "max" : 292, "creature": "core:mightyGorgon" }, { "min" : 290, "max" : 292, "creature": "mightyGorgon" },
{ "min" : 293, "max" : 295, "creature": "core:minotaurKing" }, { "min" : 293, "max" : 295, "creature": "minotaurKing" },
{ "min" : 296, "max" : 298, "creature": "core:powerLich" }, { "min" : 296, "max" : 298, "creature": "powerLich" },
{ "min" : 299, "max" : 301, "creature": "core:thunderbird" }, { "min" : 299, "max" : 301, "creature": "thunderbird" },
{ "min" : 302, "max" : 304, "creature": "core:pitLord" }, { "min" : 302, "max" : 304, "creature": "pitLord" },
{ "min" : 305, "max" : 307, "creature": "core:cyclop" }, { "min" : 305, "max" : 307, "creature": "cyclop" },
{ "min" : 308, "max" : 310, "creature": "core:wyvern" }, { "min" : 308, "max" : 310, "creature": "wyvern" },
{ "min" : 311, "max" : 313, "creature": "core:cyclopKing" }, { "min" : 311, "max" : 313, "creature": "cyclopKing" },
{ "min" : 314, "max" : 316, "creature": "core:wyvernMonarch" }, { "min" : 314, "max" : 316, "creature": "wyvernMonarch" },
{ "min" : 317, "max" : 319, "creature": "core:manticore" }, { "min" : 317, "max" : 319, "creature": "manticore" },
{ "min" : 320, "max" : 322, "creature": "core:scorpicore" }, { "min" : 320, "max" : 322, "creature": "scorpicore" },
{ "min" : 323, "max" : 325, "creature": "core:efreet" }, { "min" : 323, "max" : 325, "creature": "efreet" },
{ "min" : 326, "max" : 328, "creature": "core:unicorn" }, { "min" : 326, "max" : 328, "creature": "unicorn" },
{ "min" : 329, "max" : 331, "creature": "core:efreetSultan" }, { "min" : 329, "max" : 331, "creature": "efreetSultan" },
{ "min" : 332, "max" : 334, "creature": "core:cavalier" }, { "min" : 332, "max" : 334, "creature": "cavalier" },
{ "min" : 335, "max" : 337, "creature": "core:naga" }, { "min" : 335, "max" : 337, "creature": "naga" },
{ "min" : 338, "max" : 340, "creature": "core:warUnicorn" }, { "min" : 338, "max" : 340, "creature": "warUnicorn" },
{ "min" : 341, "max" : 343, "creature": "core:blackKnight" }, { "min" : 341, "max" : 343, "creature": "blackKnight" },
{ "min" : 344, "max" : 346, "creature": "core:champion" }, { "min" : 344, "max" : 346, "creature": "champion" },
{ "min" : 347, "max" : 349, "creature": "core:dreadKnight" }, { "min" : 347, "max" : 349, "creature": "dreadKnight" },
{ "min" : 350, "max" : 352, "creature": "core:nagaQueen" }, { "min" : 350, "max" : 352, "creature": "nagaQueen" },
{ "min" : 353, "max" : 355, "creature": "core:behemoth" }, { "min" : 353, "max" : 355, "creature": "behemoth" },
{ "min" : 356, "max" : 358, "creature": "core:boneDragon" }, { "min" : 356, "max" : 358, "creature": "boneDragon" },
{ "min" : 359, "max" : 361, "creature": "core:giant" }, { "min" : 359, "max" : 361, "creature": "giant" },
{ "min" : 362, "max" : 364, "creature": "core:hydra" }, { "min" : 362, "max" : 364, "creature": "hydra" },
{ "min" : 365, "max" : 367, "creature": "core:ghostDragon" }, { "min" : 365, "max" : 367, "creature": "ghostDragon" },
{ "min" : 368, "max" : 370, "creature": "core:redDragon" }, { "min" : 368, "max" : 370, "creature": "redDragon" },
{ "min" : 371, "max" : 373, "creature": "core:greenDragon" }, { "min" : 371, "max" : 373, "creature": "greenDragon" },
{ "min" : 374, "max" : 376, "creature": "core:angel" }, { "min" : 374, "max" : 376, "creature": "angel" },
{ "min" : 377, "max" : 379, "creature": "core:devil" }, { "min" : 377, "max" : 379, "creature": "devil" },
{ "min" : 380, "max" : 382, "creature": "core:chaosHydra" }, { "min" : 380, "max" : 382, "creature": "chaosHydra" },
{ "min" : 383, "max" : 385, "creature": "core:ancientBehemoth" }, { "min" : 383, "max" : 385, "creature": "ancientBehemoth" },
{ "min" : 386, "max" : 388, "creature": "core:archDevil" }, { "min" : 386, "max" : 388, "creature": "archDevil" },
{ "min" : 389, "max" : 391, "creature": "core:titan" }, { "min" : 389, "max" : 391, "creature": "titan" },
{ "min" : 392, "max" : 394, "creature": "core:goldDragon" }, { "min" : 392, "max" : 394, "creature": "goldDragon" },
{ "min" : 395, "max" : 397, "creature": "core:blackDragon" }, { "min" : 395, "max" : 397, "creature": "blackDragon" },
{ "min" : 398, "max" : 400, "creature": "core:archangel" } { "min" : 398, "max" : 400, "creature": "archangel" }
] ]
} }