Malody-Reader是一個用於讀取Malody PC端資料的庫。
支援獲取資料:遊戲主體狀態,遊玩中資料,結算資料,當前譜面資料,本地玩家資料,Mp結算玩家資料。
1.可讀取資料
1.遊戲主狀態資料
遊戲狀態、遊玩判定
/// <summary> /// 遊戲狀態 /// </summary> enum GameStatus : DWORD { STATUS_DEFAULTE = 0, // 大廳介面 STATUS_GAMING = 1, // 遊戲中介面 STATUS_ROOM = 2, // 房間介面 STATUS_RESULT = 4, // 結算介面 STATUS_STORE = 5, // 商店介面 STATUS_CREATE = 6, // 編輯介面 }; /// <summary> /// 遊戲判定 /// </summary> enum GameJudge : DWORD { JUDGE_A, JUDGE_B, JUDGE_C, JUDGE_D, JUDGE_E, };2.遊玩中資料
分數、ACC、最大Combo、當前Combo、Hit資料
/// <summary> /// 遊戲資料 /// </summary> class ResultData { public: int Score = 0; double Accuracy = 0; int MaxCombo = 0; int CurrentCombo = 0; struct _hitdata { int Best = 0; int Cool = 0; int Great = 0; int Miss = 0; }Hit; };3.結算資料
分數、ACC、最大Combo、Hit資料
/// <summary> /// 遊戲資料 /// </summary> class ResultData { public: int Score = 0; double Accuracy = 0; int MaxCombo = 0; int CurrentCombo = 0; struct _hitdata { int Best = 0; int Cool = 0; int Great = 0; int Miss = 0; }Hit; };4.當前譜面資料
曲目名、等級名、曲目作者、譜面作者、BPM、模式、Key數量
遊玩模式:[0]Key [3]Catch [4]Jubeat [5]Taiko [6]Ring [7]Slider
/// <summary> /// 當前選中譜面資料 /// </summary> class MapData { public: std::string SongName; std::string LevelName; std::string Artists; std::string Creator; float BPM = 0; GameMode Mode = MODE_NONE; int KeyCount = 0; // Key模式下的Key數量 }; /// <summary> /// 遊戲模式 /// </summary> enum GameMode : DWORD { MODE_KEY = 0, // Key MODE_CATCH = 3, // Catch MODE_JUBEAT = 4, // Jubeat MODE_TAIKO = 5, // Taiko MODE_RING = 6, // Ring MODE_SLIDER = 7, // Slieder MODE_NONE = 8, // None };5.本地玩家資料
玩家ID、玩家名
/// <summary> /// 玩家資料 /// </summary> class OnlinePlayer { public: int ID = 0; std::string Name; OnlinePlayer(){} OnlinePlayer(int ID, std::string Name) :ID(ID), Name(Name) {} };6.MP玩家結算資料
[陣列](玩家名字、玩家結算資料)
/// <summary> /// MP玩家結算資料 /// </summary> class MPData { public: OnlinePlayer Player; ResultData Data; }; std::vector<MPData> MPDatas;
2.計算函式
1.CalcAccuracy
計算遊玩打擊的準確度
/// <summary> /// 計算準確度 /// </summary> /// <param name="Data">打擊資料</param> /// <returns>準確度</returns> double CalcAccuracy(const Malody::ResultData::_hitdata& Data) { _is_invalid_int(Data.Best); _is_invalid_int(Data.Cool); _is_invalid_int(Data.Great); _is_invalid_int(Data.Miss); int Nums = Data.Best + Data.Cool + Data.Great + Data.Miss; double Accuracy = 0; Accuracy = (Data.Best + Data.Cool * 0.75 + Data.Great * 0.4) / Nums; if (isnan(Accuracy) || isinf(Accuracy) || Accuracy < 0 || Accuracy>100) return 0; return Accuracy; }2.CalcMM
計算Stable單曲Malody metric值
/// <summary> /// 計算MM值 /// </summary> /// <param name="Data">結算資料</param> /// <param name="MapLevel">譜面等級</param> /// <returns>MM值</returns> float CalcMM(const Malody::ResultData& Data,const int& MapLevel) { float S = 0, A = 0, L = 1, MM = 0; S = static_cast<float> (Data.Score) / (2400 * (Data.Hit.Best + Data.Hit.Cool + Data.Hit.Great + Data.Hit.Miss)); L *= powf(1.05, (MapLevel > 10) ? 9 : (MapLevel - 1)); if (MapLevel >= 10) L *= powf(1.04, (MapLevel > 15) ? 5 : (MapLevel - 10)); if (MapLevel >= 15) L *= powf(1.03, (MapLevel > 20) ? 5 : (MapLevel - 15)); if (MapLevel >= 20) L *= powf(1.02, MapLevel - 20); if (Data.Accuracy > 99.6) A = (Data.Accuracy == 100) ? 0.05 : (Data.Accuracy - 99.6) / 10; MM = ((S + A) * L - 1) * 60; _is_invalid_float(MM); return MM; }3.使用方面
可以用於開發不同功能的Malody外掛,過段時間我會用這個庫開發一個demo外掛開源用於使用示例。
結語
Github地址:https://github.com/TKazer/Malody-Reader
開發語言:C++
開源協議:MIT
QQ:1319923129
Email:[email protected] / [email protected]
作者: Liv
