private MazeStatus Play_DoTowerMaze(ref Comm.CommFetchOptions opts, int map_stage)
        {
            Utils.LoggerNotifications("<color=#a07000>Running through maze tower " + map_stage.ToString() + "...</color>");

            string maze_tower_basic_data = this.GetGameData(ref this.opts, "maze", "Show", "MapStageId=" + map_stage.ToString(), false);
            JObject maze_tower_basic_data_JSON = JObject.Parse(maze_tower_basic_data);

            bool free_reset = maze_tower_basic_data.Replace(" ", string.Empty).Replace("\"", string.Empty).Contains("FreeReset:1");

            bool tower_is_cleared = true;
            for (int layer_in_mazetower_check = 1; layer_in_mazetower_check <= 10; layer_in_mazetower_check++)
            {
                string current_layer = this.GetGameData(ref this.opts, "maze", "Info", "Layer=" + layer_in_mazetower_check.ToString() + "&MapStageId=" + map_stage.ToString());
                JObject current_layer_JSON = JObject.Parse(current_layer);

                if (Utils.CInt(current_layer_JSON["status"]) > 0)
                {
                    try
                    {
                        if (!current_layer.Replace("\"", "").Replace(" ", "").Contains("IsFinish:true")) tower_is_cleared = false;
                        if ((Utils.True("Game_MazeTowerChests")) && (Utils.CInt(current_layer_JSON["data"]["RemainBoxNum"]) > 0)) tower_is_cleared = false;
                        if ((Utils.True("Game_MazeTowerMonsters")) && (Utils.CInt(current_layer_JSON["data"]["RemainMonsterNum"]) > 0)) tower_is_cleared = false;
                    }
                    catch
                    {
                        break;
                    }
                }
                else
                    break;

                if (!tower_is_cleared)
                    break;
            }

            if (tower_is_cleared)
            {
                if (free_reset)
                    this.GetGameData(ref this.opts, "maze", "Reset", "MapStageId=" + map_stage.ToString(), false);
                else
                {
                    Utils.Logger("<b><color=#ff0000>THIS TOWER MAZE HAS BEEN CLEARED AND NO FREE RESETS ARE AVAILABLE FOR IT!</color></b>");
                    return MazeStatus.Skipped_No_Reset_Available;
                }
            }
            else
                Utils.Logger("<b>TOWER MAZE HAS BEEN STARTED IN A PREVIOUS SESSION -- RESUMING!</b>");

            int max_floor = 100;
            for (int layer_in_mazetower = 1; layer_in_mazetower <= max_floor; layer_in_mazetower++)
            {
                string current_layer_JSON = this.GetGameData(ref this.opts, "maze", "Info", "Layer=" + layer_in_mazetower.ToString() + "&MapStageId=" + map_stage.ToString());
                JObject current_layer_data = JObject.Parse(current_layer_JSON);

                if (Utils.CInt(current_layer_data["status"]) == 0)
                    break;

                max_floor = Utils.CInt(current_layer_data["data"]["TotalLayer"]);

                string[] current_layer_items = Utils.SubStringsDups(Utils.ChopperBlank(current_layer_JSON.Replace(" ", ""), "\"Items\":[", "]"), ",");

                for (int current_item_index = 0; current_item_index < current_layer_items.Length; current_item_index++)
                {
                    int current_item_type = Utils.CInt(current_layer_items[current_item_index]);

                    if ((current_item_type == 2) || (current_item_type == 3))
                    {
                        Utils.Logger("Layer #" + layer_in_mazetower.ToString() + ", slot #" + (current_item_index + 1).ToString() + ", type " + MapType(current_item_type));

                        bool want_to_fight_this_type = true;
                        if ((current_item_type == 2) && (!Utils.True("Game_MazeTowerChests"))) want_to_fight_this_type = false;
                        if ((current_item_type == 3) && (!Utils.True("Game_MazeTowerMonsters"))) want_to_fight_this_type = false;

                        if (want_to_fight_this_type)
                        {
                            string fight_info = this.GetGameData(ref this.opts, "maze", "Battle", "Layer=" + layer_in_mazetower.ToString() + "&ItemIndex=" + current_item_index.ToString() + "&MapStageId=" + map_stage.ToString() + "&manual=1", false);
                            JObject fight_JSON = JObject.Parse(fight_info);

                            string battle_id = "";
                            if (fight_info.Contains("\"BattleId\""))
                                battle_id = fight_JSON["data"]["BattleId"].ToString();

                            if (!Utils.ValidText(battle_id))
                            {
                                if (fight_info.Contains("\"message\":"))
                                {
                                    if (fight_info.ToLower().Contains("not enough energy"))
                                    {
                                        Utils.Logger("<b>RAN OUT OF ENERGY -- TRY AGAIN LATER!</b>");
                                        return MazeStatus.Out_Of_Energy;
                                    }

                                    Utils.LoggerNotifications("<color=#aa0000><b>Problem picking a maze tower fight: " + fight_JSON["message"].ToString() + "</b></color>");
                                    Utils.LoggerNotifications("<color=#aa0000><b>In map " + map_stage.ToString() + ", floor " + layer_in_mazetower.ToString() + ", position " + (current_item_index + 1).ToString() + " (" + MapType(current_item_type) + ")</b></color>");
                                    continue;
                                }

                                Utils.LoggerNotifications("<color=#aa0000><b>Problem picking a maze tower fight: odd server response</b>");
                                Utils.LoggerNotifications("<color=#aa0000><b>" + fight_info + "</b>");
                                Utils.LoggerNotifications("<color=#aa0000><b>In map " + map_stage.ToString() + ", floor " + layer_in_mazetower.ToString() + ", position " + (current_item_index + 1).ToString() + " (" + MapType(current_item_type) + ")</b></color>");
                                //return MazeStatus.Error;
                                continue;
                            }

                            string battle_result_original = this.GetGameData(ref this.opts, "maze", "ManualBattle", "battleid=" + battle_id + "&stage=&manual=0", false, "user_mapfight" + map_stage.ToString() + "_level" + layer_in_mazetower.ToString() + "_" + MapType(current_item_type) + "_at" + current_item_index.ToString());
                            string battle_result = Utils.ChopperBlank(battle_result_original, "\"Award\":", "}") + ",";

                            string reward_gold = Utils.ChopperBlank(battle_result, "\"Coins\":", ",").Replace("\"", "").Trim();
                            string reward_EXP = Utils.ChopperBlank(battle_result, "\"Exp\":", ",").Replace("\"", "").Trim();
                            string reward_card = Utils.ChopperBlank(battle_result, "\"CardId\":", ",").Replace("\"", "").Trim();

                            Utils.Logger();
                            if (Utils.CInt(reward_gold) > 0) Utils.Logger("<b>Gold earned from maze tower fight:</b> " + Utils.CInt(reward_gold).ToString("#,##0"));
                            if (Utils.CInt(reward_EXP) > 0) Utils.Logger("<b>Experience earned from maze tower fight:</b> " + Utils.CInt(reward_EXP).ToString("#,##0"));
                            if (Utils.CInt(reward_card) > 0) Utils.Logger("<b>Card earned from maze tower fight:</b> " + this.FriendlyReplacerInbound("[Card #" + reward_card + "]"));
                            Utils.Logger();

                            Utils.LoggerNotifications("<color=#ffa000>Maze tower " + MapType(current_item_type) + " fight on map " + map_stage.ToString() + ", floor " + layer_in_mazetower.ToString() + ": " + new GameReward(battle_result_original).AllAwards + "</color>");

                            if (battle_result_original.Replace(" ", "").Replace("\"", "").Contains("{IsClear:1,"))
                            {
                                string maze_tower_completed_result = Utils.ChopperBlank(battle_result_original, "{\"IsClear\"", "}") + ",";

                                string completion_reward_gold = Utils.ChopperBlank(maze_tower_completed_result, "\"Coins\":", ",").Replace("\"", "").Trim();
                                string completion_reward_EXP = Utils.ChopperBlank(maze_tower_completed_result, "\"Exp\":", ",").Replace("\"", "").Trim();
                                string completion_reward_card = Utils.ChopperBlank(maze_tower_completed_result, "\"CardId\":", ",").Replace("\"", "").Trim();

                                if (Utils.CInt(completion_reward_gold) > 0) Utils.Logger("<b>Gold earned from maze tower completion:</b> " + Utils.CInt(completion_reward_gold).ToString("#,##0"));
                                if (Utils.CInt(completion_reward_EXP) > 0) Utils.Logger("<b>Experience earned from maze tower completion:</b> " + Utils.CInt(completion_reward_EXP).ToString("#,##0"));
                                if (Utils.CInt(completion_reward_card) > 0) Utils.Logger("<b>Card earned from maze tower completion:</b> " + this.FriendlyReplacerInbound("[Card #" + completion_reward_card + "]"));
                                Utils.Logger();

                                string output_rewards = "";
                                if (Utils.CInt(completion_reward_gold) > 0) output_rewards += ", " + Utils.CInt(completion_reward_gold).ToString("#,##0") + " gold";
                                if (Utils.CInt(completion_reward_EXP) > 0) output_rewards += ", " + Utils.CInt(completion_reward_EXP).ToString("#,##0") + " EXP";
                                if (Utils.CInt(completion_reward_card) > 0) output_rewards += ", " + this.FriendlyReplacerInbound("[Card #" + completion_reward_card + "]");
                                if (output_rewards.Length > 0)
                                    Utils.LoggerNotifications("<color=#ffa000>Maze tower completion rewards for map " + map_stage.ToString() + ": " + output_rewards.Substring(2) + "</color>");
                            }
                        }
                    }
                }

                if (current_layer_JSON.Replace("\"", "").Replace(" ", "").ToLower().Contains("isfinish:true")) continue;

                for (int current_item_index = 0; current_item_index < current_layer_items.Length; current_item_index++)
                {
                    int current_item_type = Utils.CInt(current_layer_items[current_item_index]);

                    if (current_item_type == 5)
                    {
                        string fight_info = this.GetGameData(ref this.opts, "maze", "Battle", "Layer=" + layer_in_mazetower.ToString() + "&ItemIndex=" + current_item_index.ToString() + "&MapStageId=" + map_stage.ToString() + "&manual=1", false);
                        JObject fight_JSON = JObject.Parse(fight_info);

                        string battle_id = "";
                        if (fight_info.Contains("\"BattleId\""))
                            battle_id = fight_JSON["data"]["BattleId"].ToString();

                        if (string.IsNullOrEmpty(battle_id))
                        {
                            if (fight_info.Contains("\"message\":"))
                            {
                                if (fight_info.ToLower().Contains("not enough energy"))
                                {
                                    Utils.Logger("<b>RAN OUT OF ENERGY -- TRY AGAIN LATER!</b>");
                                    return MazeStatus.Out_Of_Energy;
                                }

                                Utils.LoggerNotifications("<color=#aa0000><b>Problem picking a maze tower fight: " + fight_JSON["message"].ToString() + "</b></color>");
                                Utils.LoggerNotifications("<color=#aa0000><b>In map " + map_stage.ToString() + ", floor " + layer_in_mazetower.ToString() + ", position " + (current_item_index + 1).ToString() + " (" + MapType(current_item_type) + ")</b></color>");
                                continue;
                            }

                            Utils.LoggerNotifications("<color=#aa0000><b>Problem picking a maze tower fight: odd server response</b></color>");
                            Utils.LoggerNotifications("<color=#aa0000><b>" + fight_info + "</b></color>");
                            Utils.LoggerNotifications("<color=#aa0000><b>In map " + map_stage.ToString() + ", floor " + layer_in_mazetower.ToString() + ", position " + (current_item_index + 1).ToString() + " (" + MapType(current_item_type) + ")</b></color>");
                            continue;
                            //return MazeStatus.Error;
                        }

                        string battle_result_original = this.GetGameData(ref this.opts, "maze", "ManualBattle", "battleid=" + battle_id + "&stage=&manual=0", false, "user_mapfight" + map_stage.ToString() + "_level" + layer_in_mazetower.ToString() + "_" + MapType(current_item_type) + "_at" + current_item_index.ToString());

                        if (battle_result_original.Replace(" ", "").Replace("\"", "").Contains("{IsClear:1,"))
                        {
                            string maze_tower_completed_result = Utils.ChopperBlank(battle_result_original, "{\"IsClear\"", "}") + ",";

                            string completion_reward_gold = Utils.ChopperBlank(maze_tower_completed_result, "\"Coins\":", ",").Replace("\"", "").Trim();
                            string completion_reward_EXP = Utils.ChopperBlank(maze_tower_completed_result, "\"Exp\":", ",").Replace("\"", "").Trim();
                            string completion_reward_card = Utils.ChopperBlank(maze_tower_completed_result, "\"CardId\":", ",").Replace("\"", "").Trim();

                            Utils.Logger();
                            if (Utils.CInt(completion_reward_gold) > 0) Utils.Logger("<b>Gold earned from maze tower completion:</b> " + Utils.CInt(completion_reward_gold).ToString("#,##0"));
                            if (Utils.CInt(completion_reward_EXP) > 0) Utils.Logger("<b>Experience earned from maze tower completion:</b> " + Utils.CInt(completion_reward_EXP).ToString("#,##0"));
                            if (Utils.CInt(completion_reward_card) > 0) Utils.Logger("<b>Card earned from maze tower completion:</b> " + this.FriendlyReplacerInbound("[Card #" + completion_reward_card + "]"));
                            Utils.Logger();

                            string output_rewards = "";
                            if (Utils.CInt(completion_reward_gold) > 0) output_rewards += ", " + Utils.CInt(completion_reward_gold).ToString("#,##0") + " gold";
                            if (Utils.CInt(completion_reward_EXP) > 0) output_rewards += ", " + Utils.CInt(completion_reward_EXP).ToString("#,##0") + " EXP";
                            if (Utils.CInt(completion_reward_card) > 0) output_rewards += ", " + this.FriendlyReplacerInbound("[Card #" + completion_reward_card + "]");
                            if (output_rewards.Length > 0)
                                Utils.LoggerNotifications("<color=#ffa000>Maze tower completion rewards for map " + map_stage.ToString() + ": " + output_rewards.Substring(2) + "</color>");
                        }

                    }
                }

            }

            return MazeStatus.Completed;
        }
        public string GetGameData__internal(ref Comm.CommFetchOptions opts, string page, string action, string post_data = "", bool log = false, string log_to = "", bool only_if_valid = true)
        {
            opts.POST_Data = post_data;

            //log = true;

            Utils.Logger();

            string result = Utils.CStr(Comm.Download(this.GAME_URL + page + ".php?do=" + action + "&v=" + this.seq_id.ToString() + GameTagToUse, opts));
            Utils.Logger("<b>HTTP request:</b> " + this.GAME_URL + page + ".php?do=" + action + "&v=" + this.seq_id.ToString() + GameTagToUse);
            if (post_data.Trim().Length > 0)
                Utils.Logger("<b>POST'ing:</b> " + opts.POST_Data);
            this.seq_id++;
            frmMain.AuthSerial++;

            try
            {
                // converts \u0123 into actual unicode characters
                if (result.Contains("\\u"))
                    result = this.regex_unicode_replacer.Replace(result, match => ((char)int.Parse(match.Groups[1].Value, NumberStyles.HexNumber)).ToString());
            }
            catch { }

            if (Want_Debug && log /* && (!only_if_valid || result.Contains("\"status\":1,")) */)
            {
                try
                {
                    if (!System.IO.Directory.Exists(Utils.AppFolder + "\\Game Data"))
                        System.IO.Directory.CreateDirectory(Utils.AppFolder + "\\Game Data");

                    string request_info = string.Empty;

                    request_info += "Data requested:  " + DateTime.Now.ToString() + "  (local time)\r\n";
                    request_info += "Data from server page:   " + page + ".php?do=" + action + "&v=" + this.seq_id.ToString() + GameTagToUse + "\r\n";
                    if (Utils.ValidText(post_data))
                        request_info += "Data POST'ed to this page:  " + post_data + "\r\n";

                    Utils.FileOverwrite(Utils.AppFolder + "\\Game Data\\" + GameAbbreviation(Service) + ", " + RequestMeaning(page, action, log_to) + " (" + Utils.GetAppSetting("Login_Account").Trim().Replace("@", ".").Replace(":", ".") + "), request.txt", request_info);
                    Utils.FileOverwrite(Utils.AppFolder + "\\Game Data\\" + GameAbbreviation(Service) + ", " + RequestMeaning(page, action, log_to) + " (" + Utils.GetAppSetting("Login_Account").Trim().Replace("@", ".").Replace(":", ".") + "), data.json", JSBeautifyLib.JSBeautify.BeautifyMe(result));
                }
                catch (Exception ex)
                {
                    Utils.Chatter(Errors.GetShortErrorDetails(ex));
                }
            }

            Utils.Logger(result);
            Utils.Logger();

            return result;
        }
        public string GetGameData(ref Comm.CommFetchOptions opts, string page, string action, string post_data = "", bool log = false, string log_to = "", bool only_if_valid = true)
        {
            string result = string.Empty;

            for (int i = 0; i < 3; i++)
            {
                try
                {
                    result = this.GetGameData__internal(ref opts, page, action, post_data, log, log_to, only_if_valid);

                    if (!string.IsNullOrEmpty(result) && !result.StartsWith("[")) // automatic retries on connection failures
                        break;
                }
                catch { }
            }

            return result;
        }
 public string GetGameData(ref Comm.CommFetchOptions opts, string page, string action, bool log = false, string log_to = "", bool only_if_valid = true)
 {
     return this.GetGameData(ref opts, page, action, "", log, log_to, only_if_valid);
 }
Example #5
0
        public string GetGameData__internal(ref Comm.CommFetchOptions opts, string page, string action, string post_data = "", bool log = false, string log_to = "", bool only_if_valid = true)
        {
            // Add global throttle to all connections
            if (Want_Throttle && (Connection_Throttle_MS > 1))
            {
                if (GetGameData_dtLastRequest != DateTime.MinValue)
                {
                    if ((DateTime.Now - GetGameData_dtLastRequest).TotalMilliseconds < Connection_Throttle_MS)
                    {
                        Utils.StartMethodMultithreadedAndWait(() =>
                        {
                            System.Threading.Thread.Sleep((int)Connection_Throttle_MS - 1);
                            return;
                        }, (double)Connection_Throttle_MS);
                    }
                }

                this.GetGameData_dtLastRequest = DateTime.Now;
            }

            opts.POST_Data = post_data;

            //log = true;

            Utils.Logger();

            string result = Utils.CStr(Comm.Download(this.GAME_URL + page + ".php?do=" + action + "&v=" + this.seq_id.ToString() + GameTagToUse, opts));
            Utils.Logger("<b>HTTP request:</b> " + this.GAME_URL + page + ".php?do=" + action + "&v=" + this.seq_id.ToString() + GameTagToUse);
            if (post_data.Trim().Length > 0)
                Utils.Logger("<b>POST'ing:</b> " + opts.POST_Data);
            this.seq_id++;
            frmMain.AuthSerial++;

            try
            {
                // converts \u0123 into actual unicode characters
                if (result.Contains("\\u"))
                    result = this.regex_unicode_replacer.Replace(result, match => ((char)int.Parse(match.Groups[1].Value, NumberStyles.HexNumber)).ToString());
            }
            catch { }

            if (Want_Debug && log /* && (!only_if_valid || result.Contains("\"status\":1,")) */)
            {
                try
                {
                    if (!System.IO.Directory.Exists(Utils.AppFolder + "\\Game Data"))
                        System.IO.Directory.CreateDirectory(Utils.AppFolder + "\\Game Data");

                    string request_info = string.Empty;

                    request_info += "Data requested:  " + DateTime.Now.ToString() + "  (local time)\r\n";
                    request_info += "Data from server page:   " + page + ".php?do=" + action + "&v=" + this.seq_id.ToString() + GameTagToUse + "\r\n";
                    if (Utils.ValidText(post_data))
                        request_info += "Data POST'ed to this page:  " + post_data + "\r\n";

                    Utils.FileOverwrite(Utils.AppFolder + "\\Game Data\\" + GameAbbreviation(Service) + ", " + RequestMeaning(page, action, log_to) + " (" + Utils.GetAppSetting("Login_Account").Trim().Replace("@", ".").Replace(":", ".") + "), request.txt", request_info);
                    Utils.FileOverwrite(Utils.AppFolder + "\\Game Data\\" + GameAbbreviation(Service) + ", " + RequestMeaning(page, action, log_to) + " (" + Utils.GetAppSetting("Login_Account").Trim().Replace("@", ".").Replace(":", ".") + "), data.json", JSBeautifyLib.JSBeautify.BeautifyMe(result));
                }
                catch (Exception ex)
                {
                    Utils.Chatter(Errors.GetShortErrorDetails(ex));
                }
            }
            
            // PSIV: moved to a setting, with constant overwrites this could lead to potentially heavy IO, bad news for SSD wear/tear
            if (StoreReplays)
                this.StoreReplay(page + action, result);

            Utils.Logger(result);
            Utils.Logger();

            return result;
        }
Example #6
0
 public static string PageFetch(string sURL, Comm.CommFetchOptions options)
 {
     options.WantCookies = true;
     return Utils.CStr(Comm.Download(sURL, options));
 }