struct CarInput {
  u32_be flags;  // Picks digital or analog handling of each.
  u16_be throttle;
  u16_be brake;
  i16_be steering;
  u16_be unknown_10;
  u16_be unknown_12;
  uint8_t unknown_14[3];
  uint8_t control_type;
  uint8_t unknown_18[2];
};
GUEST_SIZE(CarInput, 20);
GUEST_OFFSET(CarInput, flags, 0);
GUEST_OFFSET(CarInput, throttle, 4);
GUEST_OFFSET(CarInput, brake, 6);
GUEST_OFFSET(CarInput, steering, 8);
GUEST_OFFSET(CarInput, control_type, 17);

struct OtherCar {
  f32_be distance;  // 200.0 when there's none.
  f32_be unknown_4[2];
  f32_be unknown_12;  // 1.0.
  f32_be unknown_16;
  f32_be unknown_20;  // -1.0.
  u16_be unknown_24;
  i16_be unknown_26;
  u16_be unknown_28;
  uint8_t unknown_30[2];
  u16_be unknown_32[2];
};
GUEST_SIZE(OtherCar, 36);
GUEST_OFFSET(OtherCar, distance, 0);

struct PathPoint {
  Vector point;
  u16_be unknown_16[2];
  uint8_t unknown_20[44];
};
GUEST_SIZE(PathPoint, 64);
GUEST_OFFSET(PathPoint, point, 0);

struct AiCorner {
  u32_be unknown_0[2];
  u16_be unknown_8[4];
  f32_be unknown_16;  // 1.0.
  f32_be unknown_20;
  u32_be unknown_24;
  f32_be unknown_28[2];
  uint8_t unknown_36[2];
  uint8_t unknown_38[2];
  u32_be kind;
};
GUEST_SIZE(AiCorner, 44);
GUEST_OFFSET(AiCorner, kind, 40);

struct AiPath {
  u32_be driver;
  uint8_t unknown_4[12];
  PathPoint points[80];
  uint8_t unknown_5136[26];
  u16_be corner_count;
  AiCorner corners[8];
  f32_be unknown_5516;
  u32_be unknown_5520;
  i32_be unknown_5524[2];
  u32_be callback;
};
GUEST_SIZE(AiPath, 5536);
GUEST_OFFSET(AiPath, driver, 0);
GUEST_OFFSET(AiPath, points, 16);
GUEST_OFFSET(AiPath, corner_count, 5162);
GUEST_OFFSET(AiPath, corners, 5164);
GUEST_OFFSET(AiPath, callback, 5532);

struct AiDriver {
  CarInput input;
  uint8_t unknown_20[28];
  Vector unknown_48[2];
  Vector unknown_80;
  f32_be unknown_96[16];
  uint8_t unknown_160[4];
  f32_be unknown_164[2];
  OtherCar others[7];
  i32_be other_ids[7];
  u32_be unknown_452;
  u16_be unknown_456[2];
  f32_be unknown_460;
  u32_be unknown_464;
  u16_be unknown_468;
  uint8_t unknown_470[10];
  AiPath path;
  uint8_t unknown_6016[40];
  f32_be unknown_6056;
  uint8_t unknown_6060[4];
  f32_be unknown_6064[3];
  f32_be unknown_6076;
  f32_be unknown_6080[5];
  uint8_t unknown_6100;
  uint8_t unknown_6101[3];
  f32_be unknown_6104[3];
  u32_be callback;
  uint8_t unknown_6120[8];
};
GUEST_SIZE(AiDriver, 6128);
GUEST_OFFSET(AiDriver, input, 0);
GUEST_OFFSET(AiDriver, others, 172);
GUEST_OFFSET(AiDriver, other_ids, 424);
GUEST_OFFSET(AiDriver, path, 480);
GUEST_OFFSET(AiDriver, callback, 6116);

struct AiSkill {
  u32_be unknown_0;
  i16_be unknown_4[7];
  uint8_t unknown_18[2];
  f32_be unknown_20;
  u16_be unknown_24;
  uint8_t unknown_26;
  uint8_t unknown_27[1];
  u16_be unknown_28;
  uint8_t unknown_30;
  uint8_t unknown_31[1];
  u16_be unknown_32;
  uint8_t unknown_34;
  uint8_t unknown_35[1];
  u32_be unknown_36;
};
GUEST_SIZE(AiSkill, 40);
