Browse Source

highscore input window

Laserlicht 2 years ago
parent
commit
a4cb74f0dc

+ 4 - 1
client/CPlayerInterface.cpp

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

+ 4 - 0
client/CServerHandler.cpp

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

+ 100 - 11
client/mainmenu/CHighScoreScreen.cpp

@@ -12,6 +12,8 @@
 
 #include "CHighScoreScreen.h"
 #include "../gui/CGuiHandler.h"
+#include "../gui/WindowHandler.h"
+#include "../gui/Shortcut.h"
 #include "../widgets/TextControls.h"
 #include "../widgets/Buttons.h"
 #include "../widgets/Images.h"
@@ -19,6 +21,7 @@
 #include "../render/Canvas.h"
 
 #include "../CGameInfo.h"
+#include "../CVideoHandler.h"
 #include "../../lib/CGeneralTextHandler.h"
 #include "../../lib/CConfigHandler.h"
 #include "../../lib/CCreatureHandler.h"
@@ -44,13 +47,13 @@ CHighScoreScreen::CHighScoreScreen()
         Settings entry2 = persistentStorage.write["highscore"]["campaign"][std::to_string(i)]["points"];
         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";
-        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";
-        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;
-        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;
     }
 }
@@ -71,7 +74,7 @@ void CHighScoreScreen::addHighScores()
 {
 	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();
     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>(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>(555, 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("core.genrltxt.436")));
@@ -97,15 +100,15 @@ void CHighScoreScreen::addHighScores()
 
     // Content
     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++)
     {
         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()));
     
-        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>(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())));
         }
 
-        int divide = (highscorepage == HighScorePage::STANDARD) ? 1 : 5;
+        int divide = (highscorepage == HighScorePage::SCENARIO) ? 1 : 5;
         for(auto & creature : creatures) {
             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));
@@ -136,7 +139,7 @@ void CHighScoreScreen::buttonCampaginClick()
 void CHighScoreScreen::buttonStandardClick()
 {
 	OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
-    highscorepage = HighScorePage::STANDARD;
+    highscorepage = HighScorePage::SCENARIO;
     addHighScores();
     addButtons();
     redraw();
@@ -163,3 +166,89 @@ void CHighScoreScreen::buttonExitClick()
 {
     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("");
+}

+ 36 - 2
client/mainmenu/CHighScoreScreen.h

@@ -12,11 +12,13 @@
 
 class CButton;
 class CLabel;
+class CMultiLineLabel;
 class CAnimImage;
+class CTextInput;
 
 class CHighScoreScreen : public CWindowObject
 {
-    enum HighScorePage { STANDARD, CAMPAIGN };
+    enum HighScorePage { SCENARIO, CAMPAIGN };
 
     void addButtons();
     void addHighScores();
@@ -26,7 +28,7 @@ class CHighScoreScreen : public CWindowObject
     void buttonResetClick();
     void buttonExitClick();
 
-    HighScorePage highscorepage = HighScorePage::STANDARD;
+    HighScorePage highscorepage = HighScorePage::SCENARIO;
 
     std::shared_ptr<CPicture> background;
     std::vector<std::shared_ptr<CButton>> buttons;
@@ -35,3 +37,35 @@ class CHighScoreScreen : public CWindowObject
 public:
 	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;
+};

+ 118 - 118
config/highscoreCreatures.json

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