【超速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である。あまり使うことは無いと思うが、念のためメモしておく。