BO4の詳細ステータスをのぞいてみた

こんちゃ!洋梨🍐です。

皆さんは 「CallOfDuty BlackOps 4」 をご存知でしょうか?これは私がハマっているゲームになります。そんな「BO4」では前作「BO3」では見れていた各武器ごとのキル数などは今作で見れなくなっていたり逆に増えたりしているものもあるのですが、ここで

「サーバーではどんなデーターが保存されているのだろうか?」

「詳細を見れるアプリ作ってみたいな」

と思い、調査および閲覧アプリの開発をしてみました。

今回はその手順を残したメモになります。

取得できるデーターを知る

まず、CallOfDutyのサーバーにAPIアクセスします。すると、

JSON形式でのリスポンス

このようにJSON形式でユーザー情報が返されます。

これを解析すれば情報を詳しく知れそうです。

リスポンス情報一覧はこちら

アプリを開発する

友達のIDで検索してみた

今回作ったアプリはこんな感じです。

IDで検索し、結果を一覧として表示するだけです。

情報を入れるためのクラスを定義する

まずAPIで取得した情報を入れる為のクラスを定義します。

C#で作ると以下のようになりました。

namespace CallOfDuty
{
    public class CODData : CODData_Base
    {
        public string status { get; set; }
        public Data data { get; set; }
    }
    public class CODData_Base
    {
        public class Data
        {
            public string title { get; set; }
            public string platform { get; set; }
            public string username { get; set; }
            public Mp mp { get; set; }
            public Zombies zombies { get; set; }
            public object engagement { get; set; }
        }

        public class Mp
        {
            public Lifetime lifetime { get; set; }
            public Weekly weekly { get; set; }
            public long level { get; set; }
            public long maxLevel { get; set; }
            public long levelXpRemainder { get; set; }
            public long levelXpGained { get; set; }
            public long prestige { get; set; }
            public long prestigeId { get; set; }
            public long maxPrestige { get; set; }
        }

        public class Lifetime
        {
            public LifeTime_All all;
            //public Dictionary<string, double> all { get; set; }
            public Dictionary<string, Dictionary<string, long>> mode { get; set; }
            public Dictionary<string, Dictionary<string, MapValue>> map { get; set; }
        }

        public class LifeTime_All
        {
            public double prestige; //プレステージ
            public double level; //レベル
            public double totalGamesPlayed; //トータルゲーム数

            public double wins;
            public double statsWonMatch;

            public double damagePerGame;
            public double scorePerMinute;

            public double ekia;
            public double kills;
            public double directActionKills;
            public double deaths;
            public double kdRatio; // K/D レシオ
            public double ekiadRatio; // EKIA/D レシオ

            public double accuracy; //命中率
            public double longestKillstreak; //最長連続キル

            public double headshotPercentage; // HS Par
            public double statsHeadshot; // HS

            public double teamkills;
        }

        public class MapValue
        {
            public long loss { get; set; }
            public long timePlayed { get; set; }
            public long stat2 { get; set; }
            public long gamesPlayed { get; set; }
            public long stat1 { get; set; }
            public long draw { get; set; }
            public long win { get; set; }
        }

        public class Weekly
        {
            public LifeTime_All all;
            //public Dictionary<string, double> all { get; set; }
            public Mode mode { get; set; }
            public AllClass map { get; set; }
        }

        public class AllClass
        {
        }

        public class Mode
        {
            public Dictionary<string, double> oic;// { get; set; }
            public Dictionary<string, double> tdm { get; set; }
        }

        public class Zombies
        {
            public WeeklyClass lifetime { get; set; }
            public WeeklyClass weekly { get; set; }
        }

        public class WeeklyClass
        {
            public AllClass all { get; set; }
            public AllClass mode { get; set; }
            public AllClass map { get; set; }
        }
    }
}

APIリクエストを送信・JSONを取得する

WebRequestでリクエストを作成・送信します。以下はその例です。

            string uri; // Request URI
            WebRequest req = WebRequest.Create(uri);
            WebResponse res = await req.GetResponseAsync();
            var stm = res.GetResponseStream();
            string s;
            using (StreamReader str = new StreamReader(stm))
            {
                s = await str.ReadToEndAsync();
            }

取得したJSONをシリアライズ

受信したJSON形式のテキストデータをCODDataクラスに変換します。

        private CODData Convert(string json)
        {
            using (var stm = new MemoryStream())
            using (var stmR = new StreamReader(stm))
            {
                DataContractJsonSerializer dataContract = new DataContractJsonSerializer(typeof(CODData));
                CODData cod = (CODData)dataContract.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(json)));
                return cod;
            }
        }

画面に表示する

あとは取得した情報の入った CODData を表示するだけです。

これにデザインを加えれば完成です。

まとめ

サーバーには使用を想定していないようなデーターまで保存されている(例「右手のみでのキル数」など) 事が分かってとても興味深かった(-_-)


ここまで読んでくれてありがとうございました!!

ホームページでは他にも

・様々な記事や作った作品および過程
・ソースコード、素材ファイル
・あらゆる”モノ”の作り方

などなど随時、記事や作品を新規公開・更新していますので是非見ていってくださいね!見ていただけると本当に嬉しいです!