public function ParseAndSaveWorldMap($world_response, $descriptor)
 {
     $log_seq = 0;
     $func_args = func_get_args();
     $func_args[0] = 'Removed Hex Array. See WS Request Log.';
     $func_log_id = DataLoadLogDAO::startFunction($this->db, $this->data_load_id, __CLASS__, __FUNCTION__, $func_args);
     DataLoadLogDAO::logEvent2($this->db, $func_log_id, $log_seq++, 'INFO', $descriptor);
     // Get the Hexes section of the world response
     $success = $world_response['responses'][0]['return_value']['success'];
     if ($success != 1) {
         $reason = $world_response['responses'][0]['return_value']['reason'];
         DataLoadLogDAO::completeFunction($this->db, $func_log_id, "Error Getting Map Data: {$reason}", 1);
         // Even though this is technically a failure, we return true because we don't want to retry this request
         return true;
     }
     $world = $world_response['responses'][0]['return_value']['hexes'];
     $hex_count = 0;
     // Sometimes this happens but I'm not sure why... so I created a return code to try again...
     if (empty($world)) {
         DataLoadLogDAO::completeFunction($this->db, $func_log_id, 'No Hexes Found', 1);
         echo "No hexes found.\r\n";
         return false;
     }
     // Parse and store each Hex
     foreach ($world as $key => $hex_arr) {
         $hex_count++;
         // Take the array and create the Hex object
         $hex = Hex::FromJson($hex_arr);
         $hex->data_load_id = $this->data_load_id;
         // Set the world ID
         $hex->world_id = $this->auth->world_id;
         // Recalculate the x coordinate.  Not sure why they store the data this way.
         $hex->hex_x = (int) self::convertToMapCoordinate($hex->hex_x, $hex->hex_y);
         // Check if this hex already exists so we know whether we're inserting or updating
         $hex_exists = WorldMapDAO::checkHexExists($this->db, $hex->world_id, $hex->hex_x, $hex->hex_y);
         if ($hex->building_id) {
             $hex->building_id = BuildingDAO::getLocalIdFromGameId($this->db, $hex->building_id);
         }
         // Determine whether we should use the player ID or NPC ID
         if (isset($hex->player_id)) {
             $game_player_id = $hex->player_id;
         } else {
             if (isset($hex->npc_player_id)) {
                 $game_player_id = $hex->npc_player_id;
             } else {
                 $game_player_id = null;
             }
         }
         // Get the local Player ID from our database
         $player_id = PlayerDAO::getLocalIdFromGameId($this->db, $game_player_id);
         // Start building a new player record
         $player = new Player();
         // Set the local Player ID if we found one
         if ($player_id) {
             $player->id = $player_id;
         }
         // Set the world ID and game player ID
         $player->world_id = $hex->world_id;
         $player->game_player_id = $game_player_id;
         // Initialize flags to NULL
         $hex->is_sb = null;
         $hex->is_npc = null;
         // Handle Alliance Base as a special case
         if ($hex->is_guild_town_center === 1) {
             $hex->town_name = $hex->guild_name;
             $hex->player_name = $hex->guild_name;
             $hex->player_level = $hex->guild_town_phase;
             $hex->building_id = 15;
         }
         // If this is a town tile then we have additional information, so let's process it
         if (isset($hex->town_name) || in_array($hex->building_id, array(14))) {
             $hex->command_center = true;
             // Set base properties
             $hex->is_sb = ($hex->town_radius == 2 and $hex->building_id == 1) ? 1 : 0;
             $hex->is_npc = $hex->town_name === 'Renegade Outpost' ? 1 : 0;
             // Set the player's name and level
             $player->player_name = $hex->player_name;
             $player->level = $hex->player_level;
             $player->data_load_id = $this->data_load_id;
             // Calculate the end of the player's bubble
             if ($hex->immune_until_ts > 0) {
                 $player->immune_until = date('Y-m-d H:i:s', $hex->immune_until_ts);
             } else {
                 $player->immune_until = null;
             }
             // If this player is in a guild, process that information
             if (isset($hex->guild_id)) {
                 // Get the local Guild ID from our database
                 $guild_id = GuildDAO::getLocalIdFromGameId($this->db, $hex->guild_id);
                 // If we didn't find this guild, then start building the record.
                 // Otherwise, don't bother because this information won't change frequently.
                 if (!$guild_id) {
                     $guild = new Guild();
                     $guild->world_id = $hex->world_id;
                     $guild->game_guild_id = $hex->guild_id;
                     $guild->guild_name = $hex->guild_name;
                     $guild->data_load_id = $this->data_load_id;
                     // Insert the guild record into our database and keep the new local ID for later
                     $guild_id = GuildDAO::insertGuild($this->db, $guild);
                     if ($this->db->hasError()) {
                         echo 'Error inserting Guild: ';
                         print_r($this->db->getError());
                         $log_msg = print_r($guild, true) . "\r\n\r\n" . print_r($this->db->getError(), true);
                         DataLoadLogDAO::logEvent2($this->db, $func_log_id, $log_seq++, 'ERROR', "Error inserting Guild [{$guild->guild_name}] into World [{$guild->world_id}]", $log_msg, 1);
                         echo "\r\n";
                     }
                 }
                 // Set the player's guild
                 $player->guild_id = $guild_id;
             }
         }
         // If this player didn't already exist in our database, create it.  Otherwise, update it.
         if (!$player_id) {
             if ($game_player_id) {
                 //DataLoadLogDAO::logEvent2($this->db, $func_log_id, $log_seq++, 'DEBUG', "Inserting Player [{$player->player_name}] into World [{$player->world_id}]", var_export($player, true));
                 $player_id = PlayerDAO::insertPlayer($this->db, $player);
                 if ($this->db->hasError()) {
                     echo 'Error inserting Player: ';
                     print_r($this->db->getError());
                     echo "\r\n";
                     $log_msg = print_r($player, true) . "\r\n\r\n" . print_r($this->db->getError(), true);
                     DataLoadLogDAO::logEvent2($this->db, $func_log_id, $log_seq++, 'ERROR', "Error inserting Player [{$player->player_name}] into World [{$player->world_id}]", $log_msg, 1);
                 }
             }
         } else {
             if ($player->player_name) {
                 //DataLoadLogDAO::logEvent2($this->db, $func_log_id, $log_seq++, 'DEBUG', "Updating Player [{$player->player_name}] in World [{$player->world_id}]", var_export($player, true));
                 // Update the player, but exclude battle points, power, and the number of bases because these aren't available in this case
                 $updateCount = PlayerDAO::updatePlayer($this->db, $player, array('battle_points', 'glory_points', 'bases'));
                 if ($this->db->hasError()) {
                     echo 'Error updating Player: ';
                     print_r($this->db->getError());
                     echo "\r\n";
                     $log_msg = var_export($player, true) . "\r\n\r\n" . print_r($this->db->getError(), true);
                     DataLoadLogDAO::logEvent2($this->db, $func_log_id, $log_seq++, 'ERROR', "Error updating Player [{$player->player_name}] in World [{$player->world_id}]", $log_msg, 1);
                 }
             }
         }
         // Set the player ID on the hex tile to the local database ID
         if (isset($hex->player_id) || isset($hex->npc_player_id)) {
             $hex->player_id = $player_id;
         }
         // Insert or update the hex record
         if ($hex_exists == false) {
             $hex_id = WorldMapDAO::insertHex($this->db, $hex);
             if ($this->db->hasError()) {
                 echo 'Error inserting Hex: ';
                 print_r($this->db->getError());
                 echo "\r\n";
                 $log_msg = var_export($hex, true) . "\r\n\r\n" . print_r($this->db->getError(), true);
                 DataLoadLogDAO::logEvent2($this->db, $func_log_id, $log_seq++, 'ERROR', "Error inserting hex into World {$hex->world_id}, X: {$hex->hex_x}, Y: {$hex->hex_y}", $log_msg);
             }
         } else {
             $hex_id = WorldMapDAO::updateHex($this->db, $hex);
             if ($this->db->hasError()) {
                 echo 'Error updating Hex: ';
                 print_r($this->db->getError());
                 echo "\r\n";
                 $log_msg = var_export($hex, true) . "\r\n\r\n" . print_r($this->db->getError(), true);
                 DataLoadLogDAO::logEvent2($this->db, $func_log_id, $log_seq++, 'ERROR', "Error updating hex in World {$hex->world_id}, X: {$hex->hex_x}, Y: {$hex->hex_y}", $log_msg, 1);
             }
         }
     }
     DataLoadLogDAO::completeFunction($this->db, $func_log_id, "Created {$hex_count} Hexes");
     echo "Created {$hex_count} Hexes\r\n";
     return true;
 }
 function SavePlayerLeaderboard($leader_data)
 {
     $log_seq = 0;
     $func_args = func_get_args();
     $func_args[0] = 'Removed Hex Array. See WS Request Log.';
     $func_log_id = DataLoadLogDAO::startFunction($this->db, $this->data_load_id, __CLASS__, __FUNCTION__, $func_args);
     $count = 0;
     foreach ($leader_data as $key => $leader) {
         $player = new Player();
         $player->world_id = $this->auth->world_id;
         $player->data_load_id = $this->data_load_id;
         $player->game_player_id = $leader['player_id'];
         $player->player_name = $leader['player_name'];
         $player->battle_points = $leader['score'];
         $player->glory_points = $leader['glory_points'];
         $player->level = $leader['level'];
         $player->bases = $leader['bases'];
         $id = PlayerDAO::getLocalIdFromGameId($this->db, $player->game_player_id);
         if ($id) {
             $player->id = $id;
             PlayerDAO::updatePlayer($this->db, $player, array('guild_id', 'immune_until'));
         } else {
             PlayerDAO::insertPlayer($this->db, $player);
         }
         if ($this->db->hasError()) {
             echo 'Error saving player: ';
             print_r($this->db->getError());
             echo "\r\n";
             $log_msg = print_r($player, true) . "\r\n\r\n" . print_r($this->db->getError(), true);
             DataLoadLogDAO::logEvent2($this->db, $func_log_id, $log_seq++, 'ERROR', "Error Saving Player: World [{$player->world_id}], Player: [{$player->player_name}]", $log_msg, 1);
         } else {
             $count++;
         }
     }
     DataLoadLogDAO::completeFunction($this->db, $func_log_id, "Saved {$count} Players");
 }