【超速GP】アプリ解析 各種メモ
『ミニ四駆 超速グランプリ』(以下、超速GP)のアプリ解析で得られた文字列のメモ。
注意事項
この解説は、誤った情報を払拭し、正しい情報を得る目的で提供されるが、ゲームの利用規約に抵触する内容が含まれる。不正な手段で得られた情報を利用してゲームを有利に進めることは、他のプレイヤーとの公平さを欠くチート行為に当たるため、正しい倫理観に基づく行動を期待する。
環境
超速GP Android版 v1.1.3
Il2CppDumper v6.2.1
dnSpy v6.1.4
解析手順は省略。以下を参考のこと。
SectionStatusFlag
// Namespace: Dimps.Thrust.Race
[FlagsAttribute] // RVA: 0x42CB94 Offset: 0x42CB94 VA: 0x42CB94
public enum SectionStatusFlag // TypeDefIndex: 6070
{
// Fields
public int value__; // 0x0
public const SectionStatusFlag NORMAL = 0; // 0x0
public const SectionStatusFlag COURSE_OUT = 1; // 0x0
public const SectionStatusFlag ON_LC_FIRST = 2; // 0x0
public const SectionStatusFlag LAP_BEHIND = 4; // 0x0
public const SectionStatusFlag LANDING = 256; // 0x0
public const SectionStatusFlag FANCE_RIDE = 512; // 0x0
public const SectionStatusFlag RIDE_ON_RIGHT = 1024; // 0x0
public const SectionStatusFlag LIFT_UP = 2048; // 0x0
public const SectionStatusFlag LIFT_ON_RIGHT = 4096; // 0x0
public const SectionStatusFlag BOUNCE_UP = 8192; // 0x0
}
NORMAL……正常
COURSE_OUT……コースアウト(とあるが実際はリタイヤ全般)
ON_LC_FIRST……レーンチェンジで第1レーンへ移動中?
LAP_BEHIND……周回遅れ
LANDING……着地
FANCE_RIDE……フェンス乗り上げ?(スペルミス?)
RIDE_ON_RIGHT……(不明)
LIFT_UP……持ち上がり
LIFT_ON_RIGHT……(不明)
BOUNCE_UP……跳ね上がり
SectionStatusFlagはraceRecordListに記載されたセクションごとのマシン状態を読み解くのに必要なビットマスクであり、実際のステータスはこれらを足し合わせた数字になる。周回遅れでリタイアは4+1=5、レーンチェンジで第1レーンへ移動中にコースアウトは2+1=3、レーンチェンジで第1レーンへ移動中に片輪が持ち上がりつつ着地は256+2048=2304、着地して跳ね上がりは256+8192=8448といった事例を確認している。
このステータスフラグはアプリ側で大まかなマシンの挙動を再現するために送られてくるもので、プレイヤーが知りたがるような詳しいコースアウト事由は含まれない。「オーバースピード」「着地失敗」「バウンド」「耐久不足」のいずれのケースでもサーバは同じステータス1を返すため、アプリ側での区別は付かない。
リザルト画面に表示されるコースアウト事由は、ステータスフラグとは別にサーバから提供されるシャーシちゃんのアドバイスを基にしているようだ。シャーシちゃんのアドバイスが提供されないテスト走行やエディットカップではアプリ側でコースアウト事由が分からず、一律「リタイヤ」表示となる。
ItemRaceParamMaster
// Namespace: Dimps.Thrust.Json.Meta
[Serializable]
public class ItemRaceParamMaster // TypeDefIndex: 6538
{
// Fields
public int itemId; // 0x8
public int score; // 0xC
public int weight; // 0x10
public int motorRpm; // 0x14
public int motorTorque; // 0x18
public int motorCurrent; // 0x1C
public int tireSize; // 0x20
public int tireRrc; // 0x24
public int tireGrip; // 0x28
public int tireGripAcc; // 0x2C
public int tireCor; // 0x30
public int gearRatio; // 0x34
public int gearLoss; // 0x38
public int rollerSize; // 0x3C
public int rollerCof; // 0x40
public int rollerAngle; // 0x44
public int rollerRrc; // 0x48
public int brakeSpeed; // 0x4C
public int downForceSpeed; // 0x50
public int liftInAcc; // 0x54
public int liftOutAcc; // 0x58
public int jumpInSpeed; // 0x5C
public int jumpOutSpeed; // 0x60
public int durability; // 0x64
public int jumpDurability; // 0x68
public int curveDurability; // 0x6C
public int batteryPower; // 0x70
public int batteryCapacity; // 0x74
public int antiCourserRrc; // 0x78
public int stabilizerSize; // 0x7C
public int stabilizerCof; // 0x80
public int torqueLoss; // 0x84
public int damperRate; // 0x88
public int outLiftInAcc; // 0x8C
public int outLiftOutAcc; // 0x90
public int inLiftInAcc; // 0x94
public int inLiftOutAcc; // 0x98
public int narrowOneWay; // 0x9C
public int tread; // 0xA0
public int wheelBase; // 0xA4
public int comWheelBase; // 0xA8
public int rollerWidth; // 0xAC
public int rollerBase; // 0xB0
public int oneWayWheel; // 0xB4
public int antiCourserRrc2; // 0xB8
public int antiCourserRrc3; // 0xBC
public int antiCourserRrc4; // 0xC0
public int antiCourserRrc5; // 0xC4
public int motorCurrentLoss; // 0xC8
// Methods
// RVA: 0x497120 Offset: 0x497120 VA: 0x497120
public void .ctor() { }
}
weight……重さ
motorRpm……モーター回転数(=スピード)
motorTorque……モータートルク(=パワー)
motorCurrent……モーター消費電流
tireSize……タイヤ径
tireRrc……タイヤ転がり抵抗係数 (Rrc=Rolling Resistance Coefficient?) (=スピードロス)
tireGrip……タイヤグリップ(=タイヤ摩擦)
tireGripAcc……コーナー時?タイヤグリップ(=タイヤ旋回)
tireCor……タイヤ反発係数 (Cor=Coefficient of Restitution?)
gearRatio……ギヤ比
gearLoss……ギヤロス(=ギヤ負荷)
rollerSize……ローラー径
rollerCof……ローラー摩擦係数 (Cof=Coefficient of Friction?) (=ローラー摩擦)
rollerAngle……ローラー角(=スラスト角)
rollerRrc……ローラー転がり抵抗係数 (Rrc=Rolling Resistance Coefficient?) (=ローラー抵抗)
brakeSpeed……ブレーキ速度(=ブレーキ減速)
downForceSpeed……ダウンフォース速度(=エアロダウンフォース)
liftInAcc……対コーナー進入時持ち上がり係数 (Acc=Anti Curve/Corner Coefficient?)
liftOutAcc……対コーナー脱出時持ち上がり係数 (Acc=Anti Curve/Corner Coefficient?)
jumpInSpeed……ジャンプ進入時速度
jumpOutSpeed……ジャンプ脱出時速度
durability……耐久
jumpDurability……ジャンプ耐久
curveDurability……カーブ耐久
batteryPower……電池電圧
batteryCapacity……電池容量
antiCourserRrc……対コース転がり抵抗係数 (Rrc=Rolling Resistance Coefficient?) (=オフロード)
stabilizerSize……スタイライザ―径
stabilizerCof……スタビライザー摩擦係数 (Cof=Coefficient of Friction?) (=スタビ減速)
torqueLoss……トルクロス(=パワーロス)
damperRate……ダンパー減衰力(=制振)
outLiftInAcc……対コーナー進入時外輪持ち上がり係数 (Acc=Anti Curve/Corner Coefficient?)
outLiftOutAcc……対コーナー脱出時外輪持ち上がり係数 (Acc=Anti Curve/Corner Coefficient?)
inLiftInAcc……対コーナー進入時内輪持ち上がり係数 (Acc=Anti Curve/Corner Coefficient?)
inLiftOutAcc……対コーナー脱出時内輪持ち上がり係数 (Acc=Anti Curve/Corner Coefficient?)
narrowOneWay……ナローワンウェイ
tread……トレッド
wheelBase……ホイールベース
comWheelBase……ホイールベースの質量重心 (com=Center of Mass?)(=重心)
rollerWidth……ローラー幅
rollerBase……ローラーベース
oneWayWheel……ワンウェイホイール
motorCurrentLoss……モーター消費電流ロス(=節電)
※カッコ内は推測
ItemRaceParamMasterはパーツのレース用パラメータのマスタ定義と推測される。セッティング画面で表示されるものに加え、いくつかの非表示のパラメータが存在することが分かる。非表示のパラメータが隠し要素としてレースに反映されているのか、それともサーバでのレース計算には関係がないので非表示にしているのかは判断が難しい。
最も興味深いのは持ち上がり(リフト)関係のパラメータだ。高速でカーブを走行する際に、ローラー位置が低いと高重心となって内輪が持ち上がる(インリフト)状態に、ローラー位置が高いと低重心となって外輪が持ち上がる(アウトリフト)状態になっている可能性がある。
アプリ上では先述の通りステータスフラグでLIFT_UP状態が存在するため度々「片輪走行」として観測されている他、この現象が発生すると大幅にタイムが落ちることが一部では知られている。今のところ優先度は低いが将来的に研究が進むことが期待される。
PositionId
// Namespace: Dimps.Thrust.Json.Definition
public enum PositionId // TypeDefIndex: 6678
{
// Fields
public int value__; // 0x0
public const PositionId INVALID = 0; // 0x0
public const PositionId CHASSIS = 1; // 0x0
public const PositionId BODY = 2; // 0x0
public const PositionId MOTOR = 3; // 0x0
public const PositionId NOSE_UNIT = 4; // 0x0
public const PositionId TAIL_UNIT = 5; // 0x0
public const PositionId GEAR = 10; // 0x0
public const PositionId FRONT_WHEEL = 20; // 0x0
public const PositionId REAR_WHEEL = 21; // 0x0
public const PositionId FRONT_TIRE = 22; // 0x0
public const PositionId REAR_TIRE = 23; // 0x0
public const PositionId BODY_OPTION_WING = 30; // 0x0
public const PositionId BODY_OPTION_COWL = 31; // 0x0
public const PositionId BODY_OPTION_DRIVER = 32; // 0x0
public const PositionId BODY_OPTION_LED = 33; // 0x0
public const PositionId BODY_OPTION_INTAKE = 34; // 0x0
public const PositionId FRONT_PLATE = 50; // 0x0
public const PositionId SIDE_PLATE = 51; // 0x0
public const PositionId REAR_PLATE = 52; // 0x0
public const PositionId FRONT_SETTING_WEIGHT = 100; // 0x0
public const PositionId REAR_SETTING_WEIGHT = 101; // 0x0
public const PositionId FRONT_BRAKE = 110; // 0x0
public const PositionId REAR_BRAKE = 111; // 0x0
public const PositionId FRONT_STABILIZER = 120; // 0x0
public const PositionId SIDE_STABILIZER = 121; // 0x0
public const PositionId REAR_STABILIZER = 122; // 0x0
public const PositionId FRONT_ROLLER_TOP = 150; // 0x0
public const PositionId FRONT_ROLLER_BOTTOM = 151; // 0x0
public const PositionId SIDE_ROLLER_TOP = 152; // 0x0
public const PositionId SIDE_ROLLER_BOTTOM = 153; // 0x0
public const PositionId REAR_ROLLER_TOP = 154; // 0x0
public const PositionId REAR_ROLLER_MIDDLE = 155; // 0x0
public const PositionId REAR_ROLLER_BOTTOM = 156; // 0x0
public const PositionId HIGHMOUNT_ROLLER = 157; // 0x0
public const PositionId FRONT_MASSDAMPER = 170; // 0x0
public const PositionId SIDE_MASSDAMPER = 171; // 0x0
public const PositionId REAR_MASSDAMPER = 172; // 0x0
public const PositionId ACCESSORY = 200; // 0x0
public const PositionId ACCESSORY_2 = 201; // 0x0
public const PositionId ACCESSORY_3 = 202; // 0x0
public const PositionId ACCESSORY_4 = 203; // 0x0
public const PositionId ACCESSORY_5 = 204; // 0x0
public const PositionId ACCESSORY_6 = 205; // 0x0
public const PositionId ACCESSORY_7 = 206; // 0x0
public const PositionId ACCESSORY_8 = 207; // 0x0
public const PositionId SIDE_BUMPER = 1000; // 0x0
public const PositionId REAR_BUMPER = 1001; // 0x0
public const PositionId HIGHMOUNT_PLATE = 1002; // 0x0
public const PositionId LIGHTENING_1 = 1003; // 0x0
public const PositionId LIGHTENING_2 = 1004; // 0x0
public const PositionId LIGHTENING_3 = 1005; // 0x0
public const PositionId LIGHTENING_4 = 1006; // 0x0
public const PositionId BATTERY = 10001; // 0x0
}
PositionIdはraceRecordListに含まれるパーツ位置を読み解くのに必要なIDである。あまり使うことは無いと思うが、念のためメモしておく。