#include <stdio.h>
#include <inttypes.h>

typedef struct {
  int32_t x, y, z;
} Vec32;

typedef struct {
  int16_t x, y, z;
} Vec16;

typedef struct {
  Vec32 pos1;
  Vec32 pos2;
  Vec16 rot;
  int16_t grav;
  int16_t steer;
  uint16_t curRpm;
  uint16_t lastRpm;
  uint16_t idleRpm;
  uint16_t speed;
  uint16_t speed2;
  uint16_t lastSpeed;
  uint16_t gearRatio;
  uint8_t data[0x9E];
} CarState;

typedef struct {
  uint8_t data1[0x120];
  Vec16 v1;
  Vec16 v2;
  Vec16 v3;
  Vec16 v4;
  uint16_t fis;
  uint16_t fps;
  uint32_t dist;
  uint16_t frame;
  uint16_t unk1;
  uint16_t unk2;
  uint16_t playerFinish;
  uint16_t oppFinish;
  uint16_t fpsCount;
  uint16_t impactSpeed;
  uint16_t topSpeed;
  uint16_t jumps;
  CarState player;
  CarState opponent;
  uint8_t data2[0x16A];
} GameState;

int main(int argc, char* argv[])
{
  if (argc != 2) {
    printf("Usage: %s DUMP.BIN\n", argv[0]);
    return 1;
  }

  FILE* fin = fopen(argv[1], "r");

  uint16_t frames;
  fread(&frames, sizeof(uint16_t), 1, fin);

  printf("frame;x;y;z;rpm;speed;dist;jump;finish\n");

  GameState state;
  for (int i = 0; i < frames; i++) {
    fread(&state, sizeof(GameState), 1, fin);

    printf("%d;%d;%d;%d;%d;%d;%d;%d;%d\n",
        state.frame,
        state.v1.x,
        state.v1.y,
        state.v1.z,
        state.player.curRpm,
        state.player.speed2,
        state.dist,
        state.jumps,
        state.playerFinish == 0 ? 0 : 1
        );
  }

  fclose(fin);

  return 0;
}
