деобфусцируй

// #STR: "fire_bike"
void __thiscall CBike::ProcessControl(CBike *this)
{
  CColModel *ColModel; // eax
  CVehicleModelInfo *v3; // edx
  char v4; // dl
  unsigned __int8 v5; // cl
  CPed *m_pDriver; // ecx
  CPed *v7; // ecx
  char v8; // al
  char v9; // cl
  char m_nDamageFlags; // dl
  CMatrixLink *m_pMatrix; // edi
  tHandlingData *m_pHandlingData; // eax
  int v13; // edx
  CMatrixLink *v14; // ecx
  int m_pBikeHandlingData; // edx
  double x; // st7
  long double FatAndMuscleModifier; // st7
  CMatrixLink *v18; // ecx
  int v19; // edx
  CMatrixLink *v20; // edi
  long double v21; // st7
  double v22; // st6
  double v23; // st5
  CVector *v24; // eax
  double v25; // st7
  double v26; // st6
  CMatrixLink *v27; // edi
  double v28; // st7
  CVector *v29; // eax
  double v30; // st7
  double v31; // st6
  RwV3d *p_centreOfMass; // eax
  bool v33; // zf
  CVector *v34; // eax
  float *v35; // eax
  CVector *v36; // eax
  float *v37; // eax
  char v38; // al
  CMatrixLink *v39; // eax
  CSimpleTransform *p_pos; // ecx
  CSimpleTransform *p_m_SimpleCoors; // eax
  int v42; // ecx
  int *m_apWheelCollisionEntity; // eax
  double v44; // st7
  unsigned __int8 v46; // c0
  unsigned __int8 v47; // c2
  bool v48; // cl
  CMatrixLink *v49; // ecx
  long double v50; // st7
  double m_fSteerAngle; // st7
  unsigned __int8 v53; // c0
  unsigned __int8 v54; // c2
  double v55; // st7
  CPed *v56; // eax
  __int16 *Association; // eax
  char v58; // al
  double m_fAirResistance; // st7
  double v60; // st7
  CMatrixLink *v61; // edi
  CVector *v62; // eax
  unsigned int v63; // edi
  CPed *v64; // ecx
  int v65; // ebx
  CPed **m_apPassengers; // edi
  float *v67; // eax
  int v68; // ecx
  double v69; // st7
  double v70; // st7
  int v71; // ebp
  float *v72; // eax
  float v73; // ebx
  float *p_y; // edi
  CMatrixLink *v75; // ecx
  CSimpleTransform *v76; // eax
  double v77; // st7
  double v78; // st6
  double v79; // st5
  float *v80; // eax
  int v81; // edx
  double v82; // st7
  double v83; // st6
  int v84; // edi
  int v85; // ebp
  tHandlingData *v86; // ecx
  CPhysical *v87; // edx
  BOOL v88; // ebx
  int SkidmarkType; // eax
  unsigned int v90; // edi
  CVector *Speed; // eax
  float *v92; // ebx
  float v93; // edx
  float v94; // eax
  float y; // eax
  float z; // ecx
  float v97; // ecx
  float v98; // edx
  float v99; // edx
  float v100; // eax
  float v101; // eax
  float v102; // ecx
  float v103; // ecx
  float v104; // edx
  float v105; // edx
  float v106; // eax
  float v107; // eax
  float v108; // ecx
  float *v109; // ebp
  unsigned int v110; // edi
  unsigned int v111; // edi
  CVector *v112; // eax
  const float *m_nNumWheelsOnGround; // edx
  double v114; // st7
  tHandlingData *v115; // ecx
  char v116; // al
  unsigned __int16 v117; // cx
  CVector *v118; // edx
  float *v119; // edi
  double v120; // st7
  char v121; // al
  unsigned __int8 m_nNumContactWheels; // al
  double v123; // st7
  double v124; // st6
  bool v125; // cl
  float v126; // edi
  int v127; // eax
  float v128; // ebp
  CVector *v129; // eax
  bool v130; // c0
  unsigned __int8 v131; // cl
  int v132; // eax
  int v133; // ebx
  CVector *v134; // eax
  tHandlingData *v135; // edi
  unsigned __int8 m_nTypeStatus; // cl
  char v137; // cl
  char v138; // al
  double v139; // st7
  long double Friction; // st7
  double v141; // st7
  double v142; // st7
  double v143; // st7
  float v144; // ecx
  float v145; // edx
  bool v146; // al
  double v147; // st7
  CMatrixLink *v148; // eax
  long double v149; // st7
  long double v150; // st6
  long double v151; // st7
  char *v152; // ebp
  double v153; // st7
  double v154; // st6
  double v155; // st5
  double v156; // st7
  RwV3D *v157; // eax
  long double v158; // st7
  int v159; // eax
  int v160; // eax
  CVector *v161; // eax
  CPhysical *v162; // ecx
  double v164; // st7
  unsigned __int8 v165; // c0
  unsigned __int8 v166; // c3
  double v167; // st7
  CMatrixLink *v168; // eax
  char *v169; // ebp
  double v170; // st7
  double v171; // st6
  double v172; // st5
  double v173; // st7
  RwV3D *v174; // eax
  CMatrixLink *v175; // eax
  double v176; // st7
  CMatrixLink *v177; // eax
  double v178; // st7
  long double v179; // st7
  int v180; // eax
  int v181; // eax
  CVector *v182; // eax
  CVector *z_low; // eax
  CPhysical *v184; // ecx
  double v185; // st7
  double v186; // st7
  CMatrixLink *v187; // eax
  long double v188; // st7
  long double v189; // st6
  long double v190; // st7
  CVector *v191; // eax
  float v192; // ebx
  char *v193; // ebp
  double v194; // st7
  double v195; // st6
  double v196; // st5
  double v197; // st7
  RwV3D *v198; // eax
  long double v199; // st7
  int v200; // eax
  int v201; // eax
  CVector *v202; // eax
  CVector *v203; // eax
  CPhysical *v204; // ecx
  CPed *v205; // eax
  __int16 *v206; // eax
  RwV3D *v207; // eax
  char v208; // al
  float v209; // ecx
  long double v210; // st7
  RwV3D *v211; // eax
  double v212; // st7
  double v213; // st7
  float v214; // eax
  float v215; // ecx
  double v216; // st6
  double v217; // st5
  double v218; // st6
  int v219; // ecx
  double v220; // st7
  double v221; // st7
  int *v222; // eax
  int *m_anWheelState; // ecx
  int v224; // edx
  unsigned __int32 m_nHornCounter; // eax
  ClumpAtomicUnion v226; // eax
  RwMatrix *v227; // eax
  FxSystem_c *FxSystem; // eax
  CEventGroup *EventGlobalGroup; // eax
  double v230; // st7
  FxManager_c *m_pFireParticle; // ecx
  double v232; // st7
  double v233; // st6
  CVector *p_m_vecMoveSpeed; // edi
  double v235; // st5
  int v236; // ebp
  float *v237; // ebx
  double v238; // st7
  char v239; // al
  double v240; // st7
  float v241; // ecx
  long double v242; // st4
  long double v244; // st7
  unsigned __int8 v245; // c0
  unsigned __int8 v246; // c3
  long double v247; // st7
  CPad *v248; // eax
  long double v249; // st7
  CPad *Pad; // eax
  unsigned __int8 v251; // al
  int m_dwFlags; // eax
  CVector *p_m_vecFrictionTurnSpeed; // edx
  CPed *m_pDamageEntity; // ebx
  CMatrixLink *v255; // ecx
  double v256; // st7
  CMatrixLink *v257; // eax
  double v258; // st7
  double v259; // st7
  double v260; // st6
  double v261; // st7
  double v262; // st6
  CMatrixLink *v263; // edx
  int v264; // ecx
  double v265; // st7
  long double v266; // st6
  long double v267; // st7
  CMatrixLink *v268; // eax
  long double v269; // st7
  CMatrixLink *v270; // eax
  int v271; // edx
  double v272; // st7
  CMatrixLink *v273; // eax
  long double v274; // st7
  long double v275; // st6
  CMatrixLink *v276; // edx
  int v277; // ecx
  double v278; // st7
  long double v279; // st6
  long double v280; // st7
  CMatrixLink *v281; // eax
  long double v282; // st7
  CMatrixLink *v283; // eax
  double v284; // st7
  double v285; // st6
  CMatrixLink *v286; // eax
  double v287; // st7
  float v288; // [esp+68h] [ebp-1B8h]
  float v289; // [esp+68h] [ebp-1B8h]
  float v290; // [esp+68h] [ebp-1B8h]
  float v291; // [esp+6Ch] [ebp-1B4h]
  float v292; // [esp+6Ch] [ebp-1B4h]
  float v293; // [esp+6Ch] [ebp-1B4h]
  int v294; // [esp+7Ch] [ebp-1A4h]
  int v295; // [esp+7Ch] [ebp-1A4h]
  float v296; // [esp+80h] [ebp-1A0h]
  CMatrixLink *v297; // [esp+80h] [ebp-1A0h]
  CMatrixLink *v298; // [esp+80h] [ebp-1A0h]
  CVector *p_top; // [esp+80h] [ebp-1A0h]
  CMatrixLink *v300; // [esp+84h] [ebp-19Ch]
  bool out_result; // [esp+88h] [ebp-198h]
  float v302; // [esp+98h] [ebp-188h]
  float v303; // [esp+98h] [ebp-188h]
  float v304; // [esp+98h] [ebp-188h]
  float v305; // [esp+98h] [ebp-188h]
  float v306; // [esp+98h] [ebp-188h]
  float v307; // [esp+98h] [ebp-188h]
  float *v308; // [esp+98h] [ebp-188h]
  int v309; // [esp+98h] [ebp-188h]
  int v310; // [esp+98h] [ebp-188h]
  int v311; // [esp+98h] [ebp-188h]
  float v312; // [esp+98h] [ebp-188h]
  float v313; // [esp+98h] [ebp-188h]
  float v314; // [esp+98h] [ebp-188h]
  float v315; // [esp+98h] [ebp-188h]
  float v316; // [esp+98h] [ebp-188h]
  float v317; // [esp+98h] [ebp-188h]
  CVector *p_normal; // [esp+9Ch] [ebp-184h]
  float v319; // [esp+9Ch] [ebp-184h]
  float v320; // [esp+9Ch] [ebp-184h]
  float v321; // [esp+9Ch] [ebp-184h]
  float v322; // [esp+9Ch] [ebp-184h]
  float v323; // [esp+9Ch] [ebp-184h]
  float v324; // [esp+9Ch] [ebp-184h]
  float v325; // [esp+9Ch] [ebp-184h]
  float v326; // [esp+9Ch] [ebp-184h]
  CVector out; // [esp+A0h] [ebp-180h] BYREF
  bool v328; // [esp+AFh] [ebp-171h]
  CVector a6; // [esp+B0h] [ebp-170h] BYREF
  float m_fTurnMass; // [esp+BCh] [ebp-164h]
  float v331; // [esp+C0h] [ebp-160h]
  CVector a; // [esp+C4h] [ebp-15Ch] BYREF
  float v333; // [esp+D0h] [ebp-150h]
  CVector v334[2]; // [esp+D4h] [ebp-14Ch] BYREF
  unsigned __int8 a3[4]; // [esp+ECh] [ebp-134h]
  CVector v336; // [esp+F0h] [ebp-130h] BYREF
  CVector v337; // [esp+FCh] [ebp-124h] BYREF
  float v338; // [esp+108h] [ebp-118h] BYREF
  float v339; // [esp+10Ch] [ebp-114h]
  float v340; // [esp+110h] [ebp-110h]
  float v341; // [esp+114h] [ebp-10Ch]
  CVector in; // [esp+118h] [ebp-108h] BYREF
  CVector v343; // [esp+124h] [ebp-FCh] BYREF
  CVector direction; // [esp+130h] [ebp-F0h] BYREF
  CVector a1; // [esp+13Ch] [ebp-E4h] BYREF
  RwV3D v346; // [esp+148h] [ebp-D8h] BYREF
  float v347; // [esp+14Ch] [ebp-D4h]
  float v348; // [esp+150h] [ebp-D0h]
  CVector v349; // [esp+154h] [ebp-CCh]
  CVector v350; // [esp+160h] [ebp-C0h]
  CVector v351; // [esp+16Ch] [ebp-B4h]
  CVector a4[2]; // [esp+178h] [ebp-A8h] BYREF
  CVector v353; // [esp+190h] [ebp-90h]
  float a2[12]; // [esp+1A8h] [ebp-78h] BYREF
  char v355[16]; // [esp+1D8h] [ebp-48h] BYREF
  char v356[44]; // [esp+1E8h] [ebp-38h] BYREF
  int v357; // [esp+21Ch] [ebp-4h]

  ColModel = CEntity::GetColModel(&this->vehicle);
  v3 = CModelInfo::ms_modelInfoPtrs[this->vehicle.physical.entity.m_nModelIndex];
  LODWORD(v337.x) = ColModel->m_pColData;
  LODWORD(v334[1].z) = v3;
  v337.z = 0.0;
  CAEVehicleAudioEntity::Service(&this->vehicle.m_vehicleAudio);
  v4 = this->m_nDamageFlags & 0xDF;
  v5 = this->vehicle.m_nVehicleFlags[4] & 0xFD;
  this->vehicle.m_nVehicleFlags[1] &= ~0x20u;
  this->m_bLeanMatrixCalculated = 0;
  this->field_7A8 = 0;
  this->m_nDamageFlags = v4;
  this->vehicle.m_nVehicleFlags[4] = v5;
  if ( CReplay::Mode == 1 )
    return;
  CVehicle::ProcessCarAlarm(&this->vehicle);
  CVehicle::ActivateBombWhenEntered(&this->vehicle);
  CVehicle::UpdateClumpAlpha(&this->vehicle);
  m_pDriver = this->vehicle.m_pDriver;
  if ( m_pDriver && (CPed::IsPlayer(m_pDriver) || (v7 = this->vehicle.m_apPassengers[0]) != 0 && CPed::IsPlayer(v7)) )
  {
    v8 = this->field_7B6[0];
    if ( v8 == 1 )
    {
      this->field_7B6[0] = 2;
    }
    else if ( !v8 )
    {
      this->field_7B6[0] = 1;
    }
  }
  else
  {
    this->field_7B6[0] = 0;
  }
  this->vehicle.physical.entity.placeable.vtbl[1].Destructor(this, &v337.z);
  v9 = this->vehicle.physical.entity.m_nTypeStatus >> 3;
  if ( v9 == 2 )
    return;
  m_nDamageFlags = this->m_nDamageFlags;
  if ( (m_nDamageFlags & 0x10) != 0 )
  {
    m_pMatrix = this->vehicle.physical.entity.placeable.m_pMatrix;
    if ( fabs(m_pMatrix->mat.right.z) > 0.34999999 || fabs(m_pMatrix->mat.top.z) > 0.5 )
      this->m_nDamageFlags = m_nDamageFlags & 0xEF;
  }
  if ( (LOBYTE(v337.z) & 2) != 0 || (this->m_nDamageFlags & 0x18) != 0 )
  {
    qmemcpy(&a.y, "fff?33s?", 8);
    v300 = this->vehicle.physical.entity.placeable.m_pMatrix;
    LODWORD(a.x) = dword_8D3238;
    m_fTurnMass = 1.0;
    Multiply3x3(&v336, &this->vehicle.physical.m_vecTurnSpeed, &v300->mat);
    if ( (this->vehicle.physical.entity.m_nTypeStatus & 0xF8) == 0 )
    {
      if ( this->field_710[0] >= 1.0 && this->field_710[1] >= 1.0 )
      {
        m_fTurnMass = 100.0;
        v302 = CStats::GetFatAndMuscleModifier(0xDu) * 0.2;
        if ( this->field_710[2] >= 1.0 && this->field_710[3] >= 1.0
          || (v14 = this->vehicle.physical.entity.placeable.m_pMatrix, v14->mat.top.z <= 0.0) )
        {
          x = 0.98000002;
        }
        else
        {
          m_pBikeHandlingData = this->m_pBikeHandlingData;
          if ( fabs(*(m_pBikeHandlingData + 44) - v14->mat.top.z) * v302 <= 0.050000001 )
            x = a.x - fabs(*(m_pBikeHandlingData + 44) - v14->mat.top.z) * v302;
          else
            x = a.x - 0.050000001;
        }
LABEL_36:
        a.x = x / (v336.x * v336.x * m_fTurnMass + 1.0);
        a.y = a.y / (1000.0 * v336.y * v336.y + 1.0);
        a.x = pow(a.x, CTimer::ms_fTimeStep);
        v20 = this->vehicle.physical.entity.placeable.m_pMatrix;
        m_fTurnMass = this->vehicle.physical.m_fTurnMass;
        v338 = v336.x * a.x - v336.x;
        v21 = pow(a.y, CTimer::ms_fTimeStep) * v336.y - v336.y;
        v22 = v20->mat.at.z * -1.0;
        v23 = v20->mat.at.y * -1.0;
        out.x = v20->mat.at.x * -1.0;
        *a3 = v22 * v21;
        v341 = v23 * v21;
        out.x = out.x * v21;
        a.x = out.x * m_fTurnMass;
        a.y = v341 * m_fTurnMass;
        a.z = *a3 * m_fTurnMass;
        v24 = Multiply3x3(&out, &v20->mat, &this->vehicle.physical.m_vecCentreOfMass);
        v25 = v24->z + v20->mat.right.z;
        v26 = v24->y + v20->mat.right.y;
        a6.x = v24->x + v20->mat.right.x;
        a6.y = v26;
        a6.z = v25;
        CPhysical::ApplyTurnForce(&this->vehicle.physical, a, a6);
        v27 = this->vehicle.physical.entity.placeable.m_pMatrix;
        v28 = v338 * v27->mat.at.z;
        m_fTurnMass = this->vehicle.physical.m_fTurnMass;
        *a3 = v338 * v27->mat.at.y;
        out.x = v338 * v27->mat.at.x;
        a.x = out.x * m_fTurnMass;
        a.y = *a3 * m_fTurnMass;
        a.z = v28 * m_fTurnMass;
        v29 = Multiply3x3(&out, &v27->mat, &this->vehicle.physical.m_vecCentreOfMass);
        v30 = v29->z + v27->mat.top.z;
        v31 = v29->y + v27->mat.top.y;
        a6.x = v29->x + v27->mat.top.x;
        a6.y = v31;
        a6.z = v30;
        CPhysical::ApplyTurnForce(&this->vehicle.physical, a, a6);
        v9 = this->vehicle.physical.entity.m_nTypeStatus >> 3;
        if ( v9 )
        {
          p_centreOfMass = &this->vehicle.m_pHandlingData->centreOfMass;
          this->vehicle.physical.m_vecCentreOfMass.x = p_centreOfMass->x;
          this->vehicle.physical.m_vecCentreOfMass.y = p_centreOfMass->y;
          this->vehicle.physical.m_vecCentreOfMass.z = p_centreOfMass->z;
        }
        goto LABEL_38;
      }
      if ( this->field_730[2] <= 0.0 && this->field_730[3] <= 0.0 )
      {
        m_fTurnMass = 100.0;
        v303 = CStats::GetFatAndMuscleModifier(0xDu) * 0.075000003;
        FatAndMuscleModifier = CStats::GetFatAndMuscleModifier(0xDu);
        v18 = this->vehicle.physical.entity.placeable.m_pMatrix;
        v334[0].x = FatAndMuscleModifier * 0.25;
        if ( v18->mat.top.z < 0.0 )
        {
          v19 = this->m_pBikeHandlingData;
          if ( fabs(*(v19 + 48) - v18->mat.top.z) * v334[0].x <= v303 )
            x = (fabs(*(v19 + 48) - v18->mat.top.z) * v334[0].x + 0.89999998) * a.x;
          else
            x = (v303 + 0.89999998) * a.x;
          goto LABEL_36;
        }
      }
    }
    x = a.x;
    goto LABEL_36;
  }
  m_pHandlingData = this->vehicle.m_pHandlingData;
  this->vehicle.physical.m_vecCentreOfMass.x = m_pHandlingData->centreOfMass.x;
  v13 = this->m_pBikeHandlingData;
  this->vehicle.physical.m_vecCentreOfMass.y = m_pHandlingData->centreOfMass.y;
  this->vehicle.physical.m_vecCentreOfMass.z = *(v13 + 40);
LABEL_38:
  v33 = (this->vehicle.physical.entity.m_nFlags & 0x10) == 0;
  HIBYTE(v334[1].y) = 0;
  if ( v33 && (v9 == 4 || v9 == 5) && (this->m_nDamageFlags & 8) == 0 )
  {
    v33 = (this->vehicle.m_nVehicleFlags[3] & 1) == 0;
    v328 = 0;
    if ( v33
      && this->vehicle.physical.m_vecMoveSpeed.x == 0.0
      && this->vehicle.physical.m_vecMoveSpeed.y == 0.0
      && this->vehicle.physical.m_vecMoveSpeed.z == 0.0 )
    {
      v328 = LODWORD(this->field_720[3]) != 1065353216;
    }
    if ( v9 == 5 )
    {
      v304 = 0.0060000001;
      v334[0].x = 0.0015;
      v337.y = 0.015;
    }
    else
    {
      v304 = 0.003;
      v334[0].x = 0.00090000004;
      v337.y = 0.0049999999;
    }
    v34 = vectorAdd(&a1, &this->vehicle.physical.m_vecForce, &this->vehicle.physical.m_vecMoveSpeed);
    v35 = VectorDivide(&out, v34, 2.0);
    this->vehicle.physical.m_vecForce.x = *v35;
    this->vehicle.physical.m_vecForce.y = v35[1];
    this->vehicle.physical.m_vecForce.z = v35[2];
    v36 = vectorAdd(&a1, &this->vehicle.physical.m_vecTorque, &this->vehicle.physical.m_vecTurnSpeed);
    v37 = VectorDivide(&out, v36, 2.0);
    this->vehicle.physical.m_vecTorque.x = *v37;
    this->vehicle.physical.m_vecTorque.y = v37[1];
    this->vehicle.physical.m_vecTorque.z = v37[2];
    v305 = v304 * CTimer::ms_fTimeStep;
    if ( v305 * v305 >= CVector::Dot(&this->vehicle.physical.m_vecForce)
      && (v306 = v334[0].x * CTimer::ms_fTimeStep, v306 * v306 >= CVector::Dot(&this->vehicle.physical.m_vecTorque))
      && this->vehicle.physical.m_fMovingSpeed < v337.y
      || v328 )
    {
      v38 = this->vehicle.physical.m_bFakePhysics + 1;
      this->vehicle.physical.m_bFakePhysics = v38;
      if ( v38 > 0xAu || v328 )
      {
        v39 = this->vehicle.physical.entity.placeable.m_pMatrix;
        p_pos = &v39->mat.pos;
        if ( v39 )
        {
          p_m_SimpleCoors = &v39->mat.pos;
        }
        else
        {
          p_pos = &this->vehicle.physical.entity.placeable.m_SimpleCoors;
          p_m_SimpleCoors = &this->vehicle.physical.entity.placeable.m_SimpleCoors;
        }
        if ( !sub_424100(LODWORD(p_m_SimpleCoors->m_vPosn.x), LODWORD(p_pos->m_vPosn.y)) )
        {
          if ( !v328 || this->vehicle.physical.m_bFakePhysics > 0xAu )
            this->vehicle.physical.m_bFakePhysics = 10;
          this->vehicle.physical.m_vecMoveSpeed.x = 0.0;
          this->vehicle.physical.m_vecMoveSpeed.y = 0.0;
          a6.x = 0.0;
          a6.y = 0.0;
          this->vehicle.physical.m_vecMoveSpeed.z = 0.0;
          a6.z = 0.0;
          this->vehicle.physical.m_vecTurnSpeed.x = 0.0;
          this->vehicle.physical.m_vecTurnSpeed.y = 0.0;
          HIBYTE(v334[1].y) = 1;
          this->vehicle.physical.m_vecTurnSpeed.z = 0.0;
        }
      }
    }
    else
    {
      this->vehicle.physical.m_bFakePhysics = 0;
    }
  }
  v42 = 0;
  m_apWheelCollisionEntity = this->m_apWheelCollisionEntity;
  do
  {
    if ( *m_apWheelCollisionEntity )
    {
      this->vehicle.m_nVehicleFlags[4] |= 2u;
      if ( CWorld::bForceProcessControl )
      {
        if ( (*(*m_apWheelCollisionEntity + 28) & 0x20) != 0 )
        {
          this->vehicle.physical.entity.m_nFlags |= 0x40u;
          return;
        }
      }
    }
    ++v42;
    ++m_apWheelCollisionEntity;
  }
  while ( v42 < 4 );
  if ( (this->vehicle.m_nVehicleFlags[4] & 2) != 0 )
  {
    HIBYTE(v334[1].y) = 0;
    this->vehicle.physical.m_bFakePhysics = 0;
  }
  (this->vehicle.physical.entity.placeable.vtbl->VehicleDamage)(this, 0, 0, 0, 0, 0, 49);
  v44 = *&this->vehicle.physical.m_fDamageIntensity;
  v328 = 0;
  if ( v44 > 0.0
    && fabs(
         this->vehicle.physical.m_vLastCollisionDirection.z
       * this->vehicle.physical.entity.placeable.m_pMatrix->mat.right.z
       + this->vehicle.physical.m_vLastCollisionDirection.y
       * this->vehicle.physical.entity.placeable.m_pMatrix->mat.right.y
       + this->vehicle.physical.m_vLastCollisionDirection.x
       * this->vehicle.physical.entity.placeable.m_pMatrix->mat.right.x) > 0.5
    && v46 | v47
    || (this->m_nDamageFlags & 8) != 0 )
  {
    v328 = 1;
  }
  if ( HIBYTE(v334[1].y) )
  {
    CPhysical::SkipPhysics(&this->vehicle.physical);
    v48 = (this->m_nDamageFlags & 0x10) != 0;
    v33 = (this->m_nDamageFlags & 0x10) == 0;
    this->vehicle.m_nVehicleFlags[3] &= 0xDEu;
    if ( !v33 && this->m_rideAnimData.m_fSteerAngle < 0.34906587 )
      this->m_rideAnimData.m_fSteerAngle = CTimer::ms_fTimeStep * 0.017453292 + this->m_rideAnimData.m_fSteerAngle;
    if ( v48 )
    {
      v49 = this->vehicle.physical.entity.placeable.m_pMatrix;
      v307 = pow(0.9700000286102295, CTimer::ms_fTimeStep);
      if ( v49->mat.right.z > 1.0 || v49->mat.right.z >= -1.0 )
      {
        if ( v49->mat.right.z <= 1.0 )
          m_fTurnMass = v49->mat.right.z;
        else
          m_fTurnMass = 1.0;
      }
      else
      {
        m_fTurnMass = -1.0;
      }
      v50 = v307 * *&this->m_rideAnimData.dwordC - (asin(m_fTurnMass) + 0.2617994) * (1.0 - v307);
      *&this->m_rideAnimData.dwordC = v50;
      this->m_rideAnimData.m_fAnimLean = v50;
    }
    goto LABEL_361;
  }
  if ( (this->vehicle.m_nVehicleFlags[3] & 1) == 0 )
    (this->vehicle.physical.entity.placeable.vtbl->ProcessControlCollisionCheck)(this, 1);
  if ( (LOBYTE(v337.z) & 2) != 0 || (this->m_nDamageFlags & 0x18) != 0 )
    goto LABEL_100;
  m_fSteerAngle = this->vehicle.m_fSteerAngle;
  if ( v53 | v54 )
  {
    if ( m_fSteerAngle > -0.43633232 )
    {
      v55 = this->vehicle.m_fSteerAngle - CTimer::ms_fTimeStep * 0.0087266462;
LABEL_99:
      this->vehicle.m_fSteerAngle = v55;
    }
  }
  else if ( m_fSteerAngle < 0.43633232 )
  {
    v55 = CTimer::ms_fTimeStep * 0.0087266462 + this->vehicle.m_fSteerAngle;
    goto LABEL_99;
  }
LABEL_100:
  *a3 = this->vehicle.physical.m_fAirResistance;
  if ( (this->vehicle.physical.entity.m_nTypeStatus & 0xF8) == 0 )
  {
    v56 = this->vehicle.m_pDriver;
    if ( v56 )
    {
      Association = RpAnimBlendClumpGetAssociation(v56->physical.entity.object.m_pRwClump, 199);
      if ( Association )
      {
        if ( *(Association + 6) > 0.5 && *(Association + 8) > 0.059999999 && *(Association + 8) < 0.14 )
        {
          v58 = CCullZones::DoExtraAirResistanceForPlayer();
          m_fAirResistance = this->vehicle.physical.m_fAirResistance;
          v60 = v58 ? m_fAirResistance * 0.85000002 : m_fAirResistance * 0.60000002;
          this->vehicle.physical.m_fAirResistance = v60;
          if ( this->vehicle.m_fGasPedal > 0.5 )
          {
            v61 = this->vehicle.physical.entity.placeable.m_pMatrix;
            if ( dotProduct(&this->vehicle.physical.m_vecMoveSpeed, &v61->mat.top) > 0.25 )
            {
              v296 = CTimer::ms_fTimeStep * this->vehicle.physical.m_fMass * 0.0016000001;
              v62 = scaleVector2(&out, v296, &v61->mat.top);
              CPhysical::ApplyMoveForce(&this->vehicle.physical, v62->x, v62->y, v62->z);
              this->m_nDamageFlags |= 0x20u;
            }
          }
        }
      }
    }
  }
  v63 = (this->vehicle.physical.m_dwFlags >> 8) & 1;
  CPhysical::ProcessControl(&this->vehicle.physical);
  this->vehicle.physical.m_fAirResistance = *a3;
  CBike::ProcessBuoyancy(this);
  if ( !v63 && (this->vehicle.physical.m_dwFlags & 0x100) != 0 )
  {
    v64 = this->vehicle.m_pDriver;
    if ( v64 && CPed::IsPlayer(v64) )
    {
      CPlayerPed::ResetPlayerBreath(this->vehicle.m_pDriver);
    }
    else
    {
      v65 = 0;
      if ( this->vehicle.m_nMaxPassengers )
      {
        m_apPassengers = this->vehicle.m_apPassengers;
        do
        {
          if ( *m_apPassengers && CPed::IsPlayer(*m_apPassengers) )
            CPlayerPed::ResetPlayerBreath(*m_apPassengers);
          ++v65;
          ++m_apPassengers;
        }
        while ( v65 < this->vehicle.m_nMaxPassengers );
      }
    }
  }
  v67 = this->field_710;
  v68 = 4;
  do
  {
    v69 = v67[24];
    ++v67;
    --v68;
    v70 = 1.0 - v69 / v67[27];
    *(v67 - 1) = (*(v67 - 1) - v70) / (1.0 - v70);
  }
  while ( v68 );
  v71 = 0;
  v72 = this->field_710;
  v73 = 0.0;
  v308 = this->field_710;
  p_y = &this->m_anWheelColPoint[0].point.y;
  v334[0].x = 0.0;
  do
  {
    if ( *v72 < 1.0 )
    {
      v75 = this->vehicle.physical.entity.placeable.m_pMatrix;
      v76 = &v75->mat.pos;
      if ( !v75 )
        v76 = &this->vehicle.physical.entity.placeable.m_SimpleCoors;
      v77 = p_y[1] - v76->m_vPosn.z;
      v78 = *p_y - v76->m_vPosn.y;
      v79 = *(p_y - 1) - v76->m_vPosn.x;
      v80 = (&a4[0].x + LODWORD(v73));
      a6.x = v79;
      *v80 = a6.x;
      a6.y = v78;
      v80[1] = a6.y;
      a6.z = v77;
      v80[2] = a6.z;
      v81 = *(LODWORD(v337.x) + 16);
      v82 = *(v81 + v71 + 24) - *(v81 + v71 + 8);
      v83 = *(v81 + v71 + 20) - *(v81 + v71 + 4);
      out.x = *(v81 + v71 + 16) - *(v81 + v71);
      out.y = v83;
      out.z = v82;
      *(&v346._pad0 + LODWORD(v73)) = *Multiply3x3(&a, &v75->mat, &out);
      CVector::Normalise((&v346 + LODWORD(v73)));
      v73 = v334[0].x;
    }
    v72 = v308 + 1;
    v71 += 32;
    LODWORD(v73) += 12;
    p_y += 11;
    ++v308;
    v334[0].x = v73;
  }
  while ( v71 < 128 );
  v84 = 0;
  LODWORD(m_fTurnMass) = this->field_710;
  this->m_anWheelSurfaceType[1] = 0;
  this->m_anWheelSurfaceType[0] = 0;
  this->field_74E[1] = 0;
  this->field_74E[0] = 0;
  v331 = COERCE_FLOAT(v355);
  p_normal = &this->m_anWheelColPoint[0].normal;
  v85 = 0;
  do
  {
    if ( *LODWORD(m_fTurnMass) >= 1.0 )
    {
      a4[v85] = *Multiply3x3(
                   &out,
                   &this->vehicle.physical.entity.placeable.m_pMatrix->mat,
                   (*(LODWORD(v337.x) + 16) + v84 + 16));
    }
    else
    {
      v86 = this->vehicle.m_pHandlingData;
      v333 = *&v86->fSuspensionBiasBetweenFrontAndRear;
      if ( v84 == 64 || v84 == 96 )
        v333 = 1.0 - v333;
      v87 = *LODWORD(m_fTurnMass);
      if ( p_normal->z <= 0.34999999 )
        CPhysical::ApplySpringCollision(
          v86->fSuspensionForceLevel,
          &v346 + v85 * 12,
          &a4[v85],
          *&v87,
          v333,
          SLODWORD(v331));
      else
        CPhysical::ApplySpringCollisionAlt(
          &this->vehicle.physical,
          v86->fSuspensionForceLevel,
          (&v346 + v85 * 12),
          &a4[v85],
          *&v87,
          v333,
          p_normal,
          LODWORD(v331));
      v88 = v84 >= 64;
      SkidmarkType = SurfaceInfos_c::GetSkidmarkType(HIBYTE(p_normal[1].y));
      this->m_anWheelSurfaceType[v88] = SkidmarkType;
      if ( SkidmarkType == 2 )
        this->field_74E[v88] = 1;
    }
    v84 += 32;
    ++v85;
    LODWORD(v331) += 4;
    LODWORD(m_fTurnMass) += 4;
    p_normal = (p_normal + 44);
  }
  while ( v84 < 128 );
  LODWORD(m_fTurnMass) = this->m_apWheelCollisionEntity;
  LODWORD(v333) = this->m_avLocalTouchPoints;
  v90 = 0;
  v309 = 4;
  do
  {
    *&a2[v90 / 4] = *CPhysical::GetSpeed(&this->vehicle.physical, &out, a4[v90 / 0xC]);
    if ( *LODWORD(m_fTurnMass) )
    {
      Speed = CPhysical::GetSpeed(*LODWORD(m_fTurnMass), &a6, *LODWORD(v333));
      a2[v90 / 4] = a2[v90 / 4] - Speed->x;
      a2[v90 / 4 + 1] = a2[v90 / 4 + 1] - Speed->y;
      a2[v90 / 4 + 2] = a2[v90 / 4 + 2] - Speed->z;
    }
    v90 += 12;
    v33 = v309 == 1;
    LODWORD(m_fTurnMass) += 4;
    LODWORD(v333) += 12;
    --v309;
  }
  while ( !v33 );
  v92 = this->field_710;
  if ( this->field_710[0] < 1.0 || this->field_710[1] < 1.0 )
  {
    if ( *v92 >= 1.0 )
    {
      y = this->m_anWheelColPoint[1].normal.y;
      z = this->m_anWheelColPoint[1].normal.z;
      v334[0].y = this->m_anWheelColPoint[1].normal.x;
      v334[0].z = y;
      v334[1].x = z;
    }
    else
    {
      v93 = this->m_anWheelColPoint[0].normal.y;
      v94 = this->m_anWheelColPoint[0].normal.z;
      v334[0].y = this->m_anWheelColPoint[0].normal.x;
      v334[0].z = v93;
      v334[1].x = v94;
    }
    if ( v334[1].x > 0.34999999 )
    {
      a6.x = -v334[0].y;
      v346._pad0 = a6.x;
      a6.y = -v334[0].z;
      v347 = a6.y;
      a6.z = -v334[1].x;
      v348 = a6.z;
    }
    if ( this->field_710[1] >= 1.0 )
    {
      v99 = this->m_anWheelColPoint[0].normal.y;
      v100 = this->m_anWheelColPoint[0].normal.z;
      v334[0].y = this->m_anWheelColPoint[0].normal.x;
      v334[0].z = v99;
      v334[1].x = v100;
    }
    else
    {
      v97 = this->m_anWheelColPoint[1].normal.y;
      v98 = this->m_anWheelColPoint[1].normal.z;
      v334[0].y = this->m_anWheelColPoint[1].normal.x;
      v334[0].z = v97;
      v334[1].x = v98;
    }
    if ( v334[1].x > 0.34999999 )
    {
      a6.x = -v334[0].y;
      a6.y = -v334[0].z;
      a6.z = -v334[1].x;
      v349 = a6;
    }
  }
  if ( this->field_710[2] < 1.0 || this->field_710[3] < 1.0 )
  {
    if ( this->field_710[2] >= 1.0 )
    {
      v103 = this->m_anWheelColPoint[3].normal.y;
      v104 = this->m_anWheelColPoint[3].normal.z;
      v334[0].y = this->m_anWheelColPoint[3].normal.x;
      v334[0].z = v103;
      v334[1].x = v104;
    }
    else
    {
      v101 = this->m_anWheelColPoint[2].normal.y;
      v102 = this->m_anWheelColPoint[2].normal.z;
      v334[0].y = this->m_anWheelColPoint[2].normal.x;
      v334[0].z = v101;
      v334[1].x = v102;
    }
    if ( v334[1].x > 0.34999999 )
    {
      a6.x = -v334[0].y;
      a6.y = -v334[0].z;
      a6.z = -v334[1].x;
      v350 = a6;
    }
    if ( this->field_710[3] >= 1.0 )
    {
      v107 = this->m_anWheelColPoint[2].normal.y;
      v108 = this->m_anWheelColPoint[2].normal.z;
      v334[0].y = this->m_anWheelColPoint[2].normal.x;
      v334[0].z = v107;
      v334[1].x = v108;
    }
    else
    {
      v105 = this->m_anWheelColPoint[3].normal.y;
      v106 = this->m_anWheelColPoint[3].normal.z;
      v334[0].y = this->m_anWheelColPoint[3].normal.x;
      v334[0].z = v105;
      v334[1].x = v106;
    }
    if ( v334[1].x > 0.34999999 )
    {
      a6.x = -v334[0].y;
      a6.y = -v334[0].z;
      a6.z = -v334[1].x;
      v351 = a6;
    }
  }
  v109 = v355;
  v110 = 0;
  v310 = 4;
  do
  {
    if ( *v92 < 1.0 )
      CPhysical::ApplySpringDampening(
        *&this->vehicle.m_pHandlingData->fSuspensionDampingLevel,
        *v109,
        &v346 + v110 * 4,
        &a4[v110 / 3],
        &a2[v110]);
    v110 += 3;
    ++v92;
    ++v109;
    --v310;
  }
  while ( v310 );
  LODWORD(m_fTurnMass) = this->m_apWheelCollisionEntity;
  LODWORD(v333) = this->m_avLocalTouchPoints;
  v111 = 0;
  v311 = 4;
  do
  {
    *&a2[v111 / 4] = *CPhysical::GetSpeed(&this->vehicle.physical, &out, a4[v111 / 0xC]);
    if ( *LODWORD(m_fTurnMass) )
    {
      v112 = CPhysical::GetSpeed(*LODWORD(m_fTurnMass), &a6, *LODWORD(v333));
      a2[v111 / 4] = a2[v111 / 4] - v112->x;
      a2[v111 / 4 + 1] = a2[v111 / 4 + 1] - v112->y;
      a2[v111 / 4 + 2] = a2[v111 / 4 + 2] - v112->z;
    }
    v111 += 12;
    v33 = v311 == 1;
    LODWORD(m_fTurnMass) += 4;
    LODWORD(v333) += 12;
    --v311;
  }
  while ( !v33 );
  m_nNumWheelsOnGround = this->m_nNumWheelsOnGround;
  v338 = this->vehicle.physical.m_vecMoveSpeed.z * this->vehicle.physical.entity.placeable.m_pMatrix->mat.top.z
       + this->vehicle.physical.m_vecMoveSpeed.y * this->vehicle.physical.entity.placeable.m_pMatrix->mat.top.y
       + this->vehicle.physical.m_vecMoveSpeed.x * this->vehicle.physical.entity.placeable.m_pMatrix->mat.top.x;
  v114 = cTransmission::CalculateDriveAcceleration(
           &this->vehicle.m_fGasPedal,
           &this->vehicle.m_nCurrentGear,
           &this->vehicle.m_fGearChangeCount,
           &v338,
           0,
           0,
           m_nNumWheelsOnGround,
           CCheat::m_aCheatsActive.PerfectHandling,
           out_result);
  v115 = this->vehicle.m_pHandlingData;
  v116 = this->vehicle.physical.entity.m_nTypeStatus >> 3;
  v339 = v114 / *&this->vehicle.physical.m_fVelocityFrequency;
  v333 = v115->fBrakeDeceleration * this->vehicle.m_fBreakPedal * CTimer::ms_fTimeStep;
  if ( v116 && v116 != 8 && (v115->handlingFlags & 8) != 0 )
  {
    v312 = 1.0;
    *a3 = 1.0;
    m_fTurnMass = 1.0;
    v341 = 1.0;
  }
  else
  {
    v312 = *&v115->fBrakeBias + *&v115->fBrakeBias;
    *a3 = 1.0 - *&v115->fBrakeBias + 1.0 - *&v115->fBrakeBias;
    m_fTurnMass = *&v115->fTractionBias + *&v115->fTractionBias;
    v341 = 2.0 - m_fTurnMass;
  }
  this->field_806 = this->m_nNumWheelsOnGround;
  this->m_nNumContactWheels = 0;
  this->m_nNumWheelsOnGround = 0;
  v117 = 0;
  v118 = &this->m_anWheelColPoint[0].normal;
  v119 = this->field_730;
  do
  {
    if ( *(v119 - 8) < 1.0 )
    {
      *v119 = 4.0;
LABEL_190:
      v121 = this->m_nNumContactWheels + 1;
      this->m_nNumContactWheels = v121;
      if ( v117 == 2 || v117 == 3 )
        this->m_nNumWheelsOnGround = 1;
      if ( v121 == 1 )
      {
        *&this->field_615[3] = v118->x;
        *&this->field_615[7] = v118->y;
        *&this->field_615[11] = v118->z;
      }
      else
      {
        *&this->field_615[3] = *&this->field_615[3] + v118->x;
        *&this->field_615[7] = v118->y + *&this->field_615[7];
        *&this->field_615[11] = v118->z + *&this->field_615[11];
      }
      goto LABEL_196;
    }
    v120 = *v119 - CTimer::ms_fTimeStep;
    if ( v120 <= 0.0 )
      v120 = 0.0;
    *v119 = v120;
    if ( v120 > 0.0 )
      goto LABEL_190;
LABEL_196:
    ++v117;
    ++v119;
    v118 = (v118 + 44);
  }
  while ( v117 < 4u );
  m_nNumContactWheels = this->m_nNumContactWheels;
  if ( m_nNumContactWheels )
  {
    LODWORD(v334[0].x) = m_nNumContactWheels;
    v331 = 1.0 / m_nNumContactWheels;
    v123 = v331 * *&this->field_615[11];
    v124 = v331 * *&this->field_615[7];
    a6.x = v331 * *&this->field_615[3];
    *&this->field_615[3] = a6.x;
    a6.y = v124;
    *&this->field_615[7] = a6.y;
    a6.z = v123;
    *&this->field_615[11] = a6.z;
    if ( this->vehicle.physical.entity.placeable.m_pMatrix->mat.at.z * *&this->field_615[11]
       + this->vehicle.physical.entity.placeable.m_pMatrix->mat.at.y * *&this->field_615[7]
       + this->vehicle.physical.entity.placeable.m_pMatrix->mat.at.x * *&this->field_615[3] < -0.5 )
    {
      *&this->field_615[3] = *&this->field_615[3] * -1.0;
      *&this->field_615[7] = *&this->field_615[7] * -1.0;
      *&this->field_615[11] = *&this->field_615[11] * -1.0;
    }
  }
  else
  {
    a6.x = 0.0;
    *&this->field_615[3] = 0;
    *&a6.y = 0x3F80000000000000i64;
    *&this->field_615[7] = 0;
    *&this->field_615[11] = 1065353216;
  }
  v125 = this->field_710[0] >= this->field_710[1];
  v126 = v337.x;
  v127 = *(LODWORD(v337.x) + 16);
  v128 = v334[1].z;
  in.x = 0.0;
  in.y = *(v127 + 4);
  LODWORD(v334[0].x) = v125;
  v297 = this->vehicle.physical.entity.placeable.m_pMatrix;
  in.z = *(v127 + 8) - this->field_710[v125] * this->field_770[0] - *(LODWORD(v334[1].z) + 64) * 0.5;
  v129 = Multiply3x3(&out, &v297->mat, &in);
  v130 = this->field_710[2] < this->field_710[3];
  in = *v129;
  v131 = 2;
  if ( !v130 )
    v131 = 3;
  v132 = *(LODWORD(v126) + 16);
  v343.x = 0.0;
  v133 = v131;
  v343.y = *(v132 + 100);
  v298 = this->vehicle.physical.entity.placeable.m_pMatrix;
  v343.z = *(v132 + 72) - this->field_710[v131] * this->field_770[2] - *(LODWORD(v128) + 68) * 0.5;
  v134 = Multiply3x3(&out, &v298->mat, &v343);
  v135 = this->vehicle.m_pHandlingData;
  v343.x = v134->x;
  m_nTypeStatus = this->vehicle.physical.entity.m_nTypeStatus;
  v343.y = v134->y;
  v343.z = v134->z;
  v137 = m_nTypeStatus >> 3;
  v331 = *&v135->fTractionMultiplier * this->m_fCarTraction * flt_C1C818 * 0.25;
  if ( v137 && (v138 = this->m_nDamageFlags, (v138 & 0x10) != 0) && (v138 & 8) == 0 )
  {
    if ( this->m_rideAnimData.m_fSteerAngle < 0.34906587 )
    {
      v139 = CTimer::ms_fTimeStep * 0.02617994 + this->m_rideAnimData.m_fSteerAngle;
      goto LABEL_233;
    }
  }
  else
  {
    if ( fabs(this->vehicle.physical.m_vecMoveSpeed.x) < 0.0099999998
      && fabs(this->vehicle.physical.m_vecMoveSpeed.y) < 0.0099999998
      && this->vehicle.m_fSteerAngle == 0.0 )
    {
      v139 = pow(0.9599999785423279, CTimer::ms_fTimeStep) * this->m_rideAnimData.m_fSteerAngle;
    }
    else
    {
      if ( v338 <= 0.0099999998 || this->field_730[0] <= 0.0 && this->field_730[1] <= 0.0 || v137 )
        goto LABEL_229;
      v356[32] = 60;
      v356[35] = 1;
      Friction = CSurfaceTable::GetFriction(&g_surfaceInfos, v356);
      v319 = Friction * *(this->m_pBikeHandlingData + 32) * v331 * 4.0;
      if ( SurfaceInfos_c::GetAdhesionGroup(&g_surfaceInfos, this->m_anWheelColPoint[v133].surfaceTypeB) == 3
        || SurfaceInfos_c::GetAdhesionGroup(&g_surfaceInfos, this->m_anWheelColPoint[v133].surfaceTypeB) == 4 )
      {
        v141 = v319 * *(this->m_pBikeHandlingData + 36);
      }
      else
      {
        v141 = v319;
      }
      v142 = v141 / (v338 * v338);
      if ( v142 <= 1.0 )
        v337.y = v142;
      else
        v337.y = 1.0;
      v135 = this->vehicle.m_pHandlingData;
      v143 = asin(v337.y) / (v135->fSteeringLock * 0.017453292);
      if ( this->vehicle.m_fSteerAngle < 0.0 && this->m_rideAnimData.m_fAnimLean < 0.0
        || this->vehicle.m_fSteerAngle > 0.0 && this->m_rideAnimData.m_fAnimLean > 0.0 )
      {
        v143 = v143 + v143;
      }
      if ( v143 > 1.0 )
LABEL_229:
        v143 = 1.0;
      if ( (this->vehicle.physical.entity.m_nTypeStatus & 0xF8) != 0 )
        v143 = 1.0;
      v139 = v143 * this->vehicle.m_fSteerAngle;
    }
LABEL_233:
    this->m_rideAnimData.m_fSteerAngle = v139;
  }
  v144 = this->vehicle.physical.m_vecMoveSpeed.x;
  v145 = this->vehicle.physical.m_vecMoveSpeed.y;
  v334[1].x = this->vehicle.physical.m_vecMoveSpeed.z;
  v146 = (v135->handlingFlags & 0x800000) != 0;
  v33 = (v135->handlingFlags & 0x800000) == 0;
  v334[0].y = v144;
  v334[0].z = v145;
  HIBYTE(v340) = v146;
  if ( v33 )
  {
    if ( this->field_730[0] <= 0.0 && this->field_730[1] <= 0.0 )
    {
      v147 = this->field_758[0] * 0.94999999;
      this->field_758[0] = v147;
      this->m_afWheelRotationX[0] = v147 + this->m_afWheelRotationX[0];
      goto LABEL_255;
    }
    v148 = this->vehicle.physical.entity.placeable.m_pMatrix;
    v149 = sin(this->m_rideAnimData.m_fSteerAngle);
    out.z = 0.0;
    v150 = v149;
    v151 = cos(this->m_rideAnimData.m_fSteerAngle);
    out.x = -v150;
    out.y = v151;
    a = *Multiply3x3(&direction, &v148->mat, &out);
    v152 = this + 44 * LODWORD(v334[0].x);
    v153 = a.y * *(v152 + 413) + a.z * *(v152 + 414) + a.x * *(v152 + 412);
    v154 = v153 * *(v152 + 414);
    v155 = v153;
    v156 = v153 * *(v152 + 413);
    a.x = a.x - v155 * *(v152 + 412);
    a.y = a.y - v156;
    a.z = a.z - v154;
    CVector::Normalise(&a);
    v157 = CrossProduct(&direction, &a, (v152 + 1648));
    a6.x = v157->_pad0;
    *&a6.y = *&v157[1]._pad0;
    CVector::Normalise(&a6);
    if ( v328 )
      a6.z = 0.0;
    ::direction.x = 0.0;
    v152[1664] = 60;
    v158 = CSurfaceTable::GetFriction(&g_surfaceInfos, v152 + 1632);
    v337.x = 1.0;
    v320 = v158 * v331;
    if ( *&this->field_7B0 > 0.0 )
    {
      v159 = SurfaceInfos_c::GetAdhesionGroup(&g_surfaceInfos, v152[1667]) - 1;
      if ( !v159 )
        goto LABEL_244;
      v160 = v159 - 1;
      if ( v160 )
      {
        if ( v160 == 1 )
LABEL_244:
          v337.x = 0.89999998;
      }
      else
      {
        v337.x = 0.69999999;
      }
    }
    if ( (this->vehicle.physical.entity.m_nTypeStatus & 0xF8) == 0 )
      v320 = SurfaceInfos_c::GetWetMultiplier(v152[1667]) * v320;
    if ( this->m_anWheelDamageState[0] == 1 )
      v320 = v320 * 0.40000001;
    dword_C1C26C = this->m_anWheelState[0];
    v336 = *CPhysical::GetSpeed(&this->vehicle.physical, &direction, in);
    HIWORD(v161) = HIWORD(v334[0].x);
    v162 = this->m_apWheelCollisionEntity[LODWORD(v334[0].x)];
    if ( v162 )
    {
      v161 = CPhysical::GetSpeed(v162, &direction, this->m_avLocalTouchPoints[LODWORD(v334[0].x)]);
      v336.x = v336.x - v161->x;
      v336.y = v336.y - v161->y;
      v336.z = v336.z - v161->z;
    }
    LOWORD(v161) = this->m_anWheelDamageState[0];
    v291 = v320 * m_fTurnMass;
    v288 = v312 * v333;
    CVehicle::ProcessBikeWheel(
      &a,
      &a6,
      &v336,
      COERCE_FLOAT(&in),
      2,
      ::direction.x,
      v288,
      v291,
      v337.x,
      0,
      this->field_758,
      &dword_C1C26C,
      0,
      *&v161);
    if ( (LOBYTE(v337.z) & 4) != 0 && (dword_C1C26C == 1 || dword_C1C26C == 2) )
      dword_C1C26C = 0;
  }
LABEL_255:
  if ( this->field_730[2] > 0.0 || this->field_730[3] > 0.0 )
  {
    v337.y = v333;
    v168 = this->vehicle.physical.entity.placeable.m_pMatrix;
    v337.x = v331;
    a = v168->mat.top;
    a6 = v168->mat.right;
    v169 = this + 44 * v133;
    v170 = a.y * *(v169 + 413) + a.z * *(v169 + 414) + a.x * *(v169 + 412);
    v171 = v170 * *(v169 + 414);
    v172 = v170;
    v173 = v170 * *(v169 + 413);
    a.x = a.x - v172 * *(v169 + 412);
    a.y = a.y - v173;
    a.z = a.z - v171;
    CVector::Normalise(&a);
    v174 = CrossProduct(&direction, &a, (v169 + 1648));
    a6.x = v174->_pad0;
    *&a6.y = *&v174[1]._pad0;
    CVector::Normalise(&a6);
    if ( v328 )
      a6.z = 0.0;
    if ( (this->vehicle.m_nVehicleFlags[0] & 0x20) != 0 )
    {
      v337.y = 20000.0;
      this->field_7AC = 1065353216;
    }
    else if ( this->field_7A8 )
    {
      v175 = this->vehicle.physical.entity.placeable.m_pMatrix;
      v176 = this->vehicle.m_fSteerAngle * this->vehicle.physical.m_fTurnMass * -0.00069999998;
      v337.y = 0.0;
      v337.x = 0.0;
      v334[1].z = v176 * v175->mat.right.z;
      v321 = v176 * v175->mat.right.y;
      out.x = v176 * v175->mat.right.x;
      out.x = out.x * CTimer::ms_fTimeStep;
      out.y = v321 * CTimer::ms_fTimeStep;
      out.z = v334[1].z * CTimer::ms_fTimeStep;
      CPhysical::ApplyTurnForce(&this->vehicle.physical, v353, out);
    }
    else if ( *&this->field_7AC < 1.0 && this->vehicle.m_fGasPedal > 0.75 )
    {
      v177 = this->vehicle.physical.entity.placeable.m_pMatrix;
      v337.x = v331 * *&this->field_7AC;
      v178 = (1.0 - *&this->field_7AC)
           * this->vehicle.m_fSteerAngle
           * this->vehicle.physical.m_fTurnMass
           * -0.00069999998;
      v334[1].z = v178 * v177->mat.right.z;
      v322 = v178 * v177->mat.right.y;
      out.x = v178 * v177->mat.right.x;
      out.x = out.x * CTimer::ms_fTimeStep;
      out.y = v322 * CTimer::ms_fTimeStep;
      out.z = v334[1].z * CTimer::ms_fTimeStep;
      CPhysical::ApplyTurnForce(&this->vehicle.physical, v353, out);
    }
    if ( ::direction.x > 0.0 && v333 > 0.0 )
      v333 = 0.0;
    ::direction.x = v339;
    v169[1664] = 60;
    v179 = CSurfaceTable::GetFriction(&g_surfaceInfos, v169 + 1632);
    v339 = 1.0;
    v323 = v179 * v337.x;
    if ( *&this->field_7B0 <= 0.0 )
      goto LABEL_285;
    v180 = SurfaceInfos_c::GetAdhesionGroup(&g_surfaceInfos, v169[1667]) - 1;
    if ( !v180 )
      goto LABEL_284;
    v181 = v180 - 1;
    if ( !v181 )
    {
      v339 = 0.69999999;
      goto LABEL_285;
    }
    if ( v181 == 1 )
LABEL_284:
      v339 = 0.89999998;
LABEL_285:
    if ( (this->vehicle.physical.entity.m_nTypeStatus & 0xF8) == 0 )
      v323 = SurfaceInfos_c::GetWetMultiplier(v169[1667]) * v323;
    if ( this->m_anWheelDamageState[1] == 1 )
      v323 = v323 * 0.40000001;
    dword_C1C270 = this->m_anWheelState[1];
    v182 = CPhysical::GetSpeed(&this->vehicle.physical, &direction, v343);
    v336.x = v182->x;
    v336.y = v182->y;
    z_low = LODWORD(v182->z);
    LODWORD(v336.z) = z_low;
    v184 = this->m_apWheelCollisionEntity[v133];
    if ( v184 )
    {
      z_low = CPhysical::GetSpeed(v184, &direction, this->m_avLocalTouchPoints[v133]);
      v336.x = v336.x - z_low->x;
      v336.y = v336.y - z_low->y;
      v336.z = v336.z - z_low->z;
    }
    LOWORD(z_low) = this->m_anWheelDamageState[1];
    v292 = v323 * v341;
    v289 = v337.y * *a3;
    CVehicle::ProcessBikeWheel(
      &a,
      &a6,
      &v336,
      COERCE_FLOAT(&v343),
      2,
      ::direction.x,
      v289,
      v292,
      v339,
      1,
      &this->field_758[1],
      &dword_C1C270,
      1,
      *&z_low);
    if ( (LOBYTE(v337.z) & 4) != 0 && (dword_C1C270 == 1 || dword_C1C270 == 2) )
      dword_C1C270 = 0;
    goto LABEL_295;
  }
  if ( (this->vehicle.m_nVehicleFlags[0] & 0x20) != 0 )
  {
    this->field_758[1] = 0.0;
    goto LABEL_267;
  }
  if ( v339 != 0.0 )
  {
    v164 = this->field_758[1];
    if ( v165 | v166 )
    {
      if ( v164 > -1.0 )
      {
        v167 = this->field_758[1] + 0.050000001;
LABEL_266:
        this->field_758[1] = v167;
      }
    }
    else if ( v164 < 1.0 )
    {
      v167 = this->field_758[1] - 0.1;
      goto LABEL_266;
    }
  }
LABEL_267:
  this->m_afWheelRotationX[1] = CTimer::ms_fTimeStep * this->field_758[1] + this->m_afWheelRotationX[1];
LABEL_295:
  if ( this->field_7A8 && this->m_anWheelState[1] == 1 )
  {
    v185 = *&this->field_7AC - CTimer::ms_fTimeStep * 0.0020000001;
    *&this->field_7AC = v185;
    if ( v185 < 0.0 )
      this->field_7AC = 0;
  }
  else if ( *&this->field_7AC < 1.0 )
  {
    *&this->field_7AC = CTimer::ms_fTimeStep * 0.0049999999 + *&this->field_7AC;
  }
  if ( HIBYTE(v340) )
  {
    if ( this->field_730[0] <= 0.0 && this->field_730[1] <= 0.0 )
    {
      v186 = this->field_758[0] * 0.94999999;
      this->field_758[0] = v186;
      this->m_afWheelRotationX[0] = v186 * CTimer::ms_fTimeStep + this->m_afWheelRotationX[0];
      goto LABEL_321;
    }
    v187 = this->vehicle.physical.entity.placeable.m_pMatrix;
    v188 = sin(this->m_rideAnimData.m_fSteerAngle);
    a6.z = 0.0;
    v189 = v188;
    v190 = cos(this->m_rideAnimData.m_fSteerAngle);
    a6.x = -v189;
    a6.y = v190;
    v191 = Multiply3x3(&direction, &v187->mat, &a6);
    v192 = v334[0].x;
    a = *v191;
    v193 = this + 44 * LODWORD(v334[0].x);
    v194 = a.y * *(v193 + 413) + a.z * *(v193 + 414) + a.x * *(v193 + 412);
    v195 = v194 * *(v193 + 414);
    v196 = v194;
    v197 = v194 * *(v193 + 413);
    a.x = a.x - v196 * *(v193 + 412);
    a.y = a.y - v197;
    a.z = a.z - v195;
    CVector::Normalise(&a);
    v198 = CrossProduct(&direction, &a, (v193 + 1648));
    out.x = v198->_pad0;
    out.y = v198[1]._pad0;
    out.z = v198[2]._pad0;
    CVector::Normalise(&out);
    ::direction.x = 0.0;
    v193[1664] = 60;
    v199 = CSurfaceTable::GetFriction(&g_surfaceInfos, v193 + 1632);
    v324 = v199 * v331;
    v334[0].x = 1.0;
    if ( *&this->field_7B0 > 0.0 )
    {
      v200 = SurfaceInfos_c::GetAdhesionGroup(&g_surfaceInfos, v193[1667]) - 1;
      if ( !v200 )
        goto LABEL_310;
      v201 = v200 - 1;
      if ( v201 )
      {
        if ( v201 == 1 )
LABEL_310:
          v334[0].x = 0.89999998;
      }
      else
      {
        v334[0].x = 0.69999999;
      }
    }
    if ( (this->vehicle.physical.entity.m_nTypeStatus & 0xF8) == 0 )
      v324 = SurfaceInfos_c::GetWetMultiplier(v193[1667]) * v324;
    if ( this->m_anWheelDamageState[0] == 1 )
      v324 = v324 * 0.40000001;
    dword_C1C26C = this->m_anWheelState[0];
    v202 = CPhysical::GetSpeed(&this->vehicle.physical, &direction, in);
    v336.x = v202->x;
    v336.y = v202->y;
    v203 = LODWORD(v202->z);
    LODWORD(v336.z) = v203;
    v204 = this->m_apWheelCollisionEntity[LODWORD(v192)];
    if ( v204 )
    {
      v203 = CPhysical::GetSpeed(v204, &direction, this->m_avLocalTouchPoints[LODWORD(v192)]);
      v336.x = v336.x - v203->x;
      v336.y = v336.y - v203->y;
      v336.z = v336.z - v203->z;
    }
    LOWORD(v203) = this->m_anWheelDamageState[0];
    v293 = v324 * m_fTurnMass;
    v290 = v312 * v333;
    CVehicle::ProcessBikeWheel(
      &a,
      &out,
      &v336,
      COERCE_FLOAT(&in),
      2,
      ::direction.x,
      v290,
      v293,
      v334[0].x,
      0,
      this->field_758,
      &dword_C1C26C,
      0,
      *&v203);
    if ( (LOBYTE(v337.z) & 4) != 0 && (dword_C1C26C == 1 || dword_C1C26C == 2) )
      dword_C1C26C = 0;
  }
LABEL_321:
  this->m_apWheelCollisionEntity[0] = 0;
  this->m_apWheelCollisionEntity[1] = 0;
  this->m_apWheelCollisionEntity[2] = 0;
  this->m_apWheelCollisionEntity[3] = 0;
  v205 = this->vehicle.m_pDriver;
  v313 = 0.0;
  if ( v205 )
  {
    v206 = RpAnimBlendClumpGetAssociation(v205->physical.entity.object.m_pRwClump, 195);
    if ( v206 )
      v313 = *(v206 + 6) * 0.17453294;
  }
  if ( v328 )
  {
    out.x = 0.0;
    out.y = 0.0;
    *&this->field_615[3] = 0;
    *&this->field_615[7] = 0;
    p_top = &this->vehicle.physical.entity.placeable.m_pMatrix->mat.top;
    out.z = 1.0;
    *&this->field_615[11] = 1065353216;
    CrossProduct(&out, p_top, &this->field_615[3]);
    CVector::Normalise(&out);
    v207 = CrossProduct(&direction, &out, &this->vehicle.physical.entity.placeable.m_pMatrix->mat.top);
    *&this->field_615[3] = LODWORD(v207->_pad0);
    *&this->field_615[7] = v207[1];
    *&this->field_615[11] = v207[2];
    CVector::Normalise(&this->field_615[3]);
  }
  if ( (LOBYTE(v337.z) & 2) != 0 || (v208 = this->m_nDamageFlags, (v208 & 8) != 0) )
  {
    v211 = CrossProduct(&direction, &this->vehicle.physical.entity.placeable.m_pMatrix->mat.top, &this->field_615[3]);
    *&this->field_615[15] = LODWORD(v211->_pad0);
    *&this->field_615[19] = v211[1];
    *&this->field_615[23] = v211[2];
    CVector::Normalise(&this->field_615[15]);
    if ( this->vehicle.physical.m_pAttachedTo )
    {
      v212 = 0.0;
    }
    else if ( this->m_nNumContactWheels )
    {
      if ( (this->vehicle.physical.m_dwFlags & 4) != 0 )
      {
        v213 = v334[1].x - this->field_630.z;
        v214 = v334[0].z;
        v215 = v334[1].x;
        v216 = v334[0].z - this->field_630.y;
        v217 = v334[0].y - this->field_630.x;
        this->field_630.x = v334[0].y;
        this->field_630.y = v214;
        this->field_630.z = v215;
      }
      else
      {
        v213 = this->vehicle.physical.m_vecMoveSpeed.z - v334[1].x;
        v216 = this->vehicle.physical.m_vecMoveSpeed.y - v334[0].z;
        v217 = this->vehicle.physical.m_vecMoveSpeed.x - v334[0].y;
      }
      v212 = v216 * *&this->field_615[19] + v213 * *&this->field_615[23] + v217 * *&this->field_615[15];
    }
    else
    {
      v212 = this->vehicle.m_fSteerAngle
           / (this->vehicle.m_pHandlingData->fSteeringLock
            * 0.017453292)
           * CTimer::ms_fTimeStep
           * -0.0040000002;
    }
    if ( CTimer::ms_fTimeStep >= 0.0099999998 )
      v218 = CTimer::ms_fTimeStep;
    else
      v218 = 0.0099999998;
    v219 = this->m_pBikeHandlingData;
    v325 = v212 / (v218 * 0.0080000004);
    if ( this->m_anWheelDamageState[0] == 1 )
    {
      v220 = 0.40000001 * *(v219 + 20);
      if ( v325 > v220 )
      {
        v325 = v220;
LABEL_351:
        v334[1].z = *(v219 + 28);
        v333 = pow(v334[1].z, CTimer::ms_fTimeStep);
        v210 = (asin(v325) - v313) * (1.0 - v333) + v333 * *&this->m_rideAnimData.dwordC;
        goto LABEL_352;
      }
    }
    else
    {
      if ( v325 > *(v219 + 20) )
      {
        v325 = *(v219 + 20);
        goto LABEL_351;
      }
      v220 = *(v219 + 20);
    }
    v221 = -v220;
    if ( v325 < v221 )
      v325 = v221;
    goto LABEL_351;
  }
  if ( (v208 & 0x10) != 0 )
  {
    v209 = this->vehicle.physical.entity.placeable.m_pMatrix->mat.right.z;
    v333 = pow(0.9700000286102295, CTimer::ms_fTimeStep);
    v334[1].z = v209;
    v210 = v333 * *&this->m_rideAnimData.dwordC - (asin(v209) + v313 + 0.2617994) * (1.0 - v333);
  }
  else
  {
    v210 = pow(0.949999988079071, CTimer::ms_fTimeStep) * *&this->m_rideAnimData.dwordC;
  }
LABEL_352:
  *&this->m_rideAnimData.dwordC = v210;
  LODWORD(this->m_rideAnimData.m_fAnimLean) = this->m_rideAnimData.dwordC;
  v222 = &dword_C1C26C;
  m_anWheelState = this->m_anWheelState;
  v224 = 2;
  do
  {
    *m_anWheelState++ = *v222++;
    --v224;
  }
  while ( v224 );
  if ( this->vehicle.m_fGasPedal < 0.0 && this->m_anWheelState[1] == 1 )
    this->m_anWheelState[1] = 0;
  if ( (this->vehicle.physical.entity.m_nTypeStatus & 0xF8) != 0 )
  {
    m_nHornCounter = this->vehicle.m_nHornCounter;
    if ( m_nHornCounter )
      this->vehicle.m_nHornCounter = m_nHornCounter - 1;
  }
  else
  {
    CVehicle::ProcessSirenAndHorn(&this->vehicle, 1);
  }
LABEL_361:
  if ( this->vehicle.m_fHealth >= 250.0 || (this->vehicle.physical.entity.m_nTypeStatus & 0xF8) == 40 )
  {
    m_pFireParticle = this->vehicle.m_pFireParticle;
    this->field_7BC = 0;
    if ( m_pFireParticle )
    {
      FxSystem_c::Kill(m_pFireParticle);
      this->vehicle.m_pFireParticle = 0;
    }
  }
  else
  {
    if ( this->vehicle.m_dwVehicleSubClass != 10 )
    {
      v226.m_pRwObject = this->vehicle.physical.entity.object;
      v227 = v226.m_pRwObject ? &v226.m_pRwObject->parent->modelling : 0;
      if ( !this->vehicle.m_pFireParticle )
      {
        if ( v227 )
        {
          out = CModelInfo::ms_modelInfoPtrs[this->vehicle.physical.entity.m_nModelIndex]->m_pVehicleStruct->m_vDummyPos[7];
          FxSystem = FxManager_c::CreateFxSystem(&g_fxMan, "fire_bike", &out, v227, 0);
          this->vehicle.m_pFireParticle = FxSystem;
          if ( FxSystem )
          {
            FxSystem_c::Play(FxSystem);
            CEventVehicleOnFire__ctor(&in, this);
            v357 = 0;
            EventGlobalGroup = GetEventGlobalGroup();
            CEventGroup::Add(EventGlobalGroup, &in, 0);
            v357 = -1;
            CEventVehicleOnFire::~CEventVehicleOnFire(&in);
          }
        }
      }
    }
    LODWORD(v334[1].z) = (CTimer::ms_fTimeStep * 0.02 * 1000.0);
    v230 = LODWORD(v334[1].z) + *&this->field_7BC;
    *&this->field_7BC = v230;
    if ( v230 > 5000.0 )
      (this->vehicle.physical.entity.placeable.vtbl->BlowUp)(this, this->damagedEntity, 0);
  }
  CVehicle::ProcessDelayedExplosion(&this->vehicle);
  v232 = this->vehicle.physical.m_vecMoveSpeed.z;
  v233 = this->vehicle.physical.m_vecMoveSpeed.y;
  p_m_vecMoveSpeed = &this->vehicle.physical.m_vecMoveSpeed;
  v235 = this->vehicle.physical.m_vecMoveSpeed.x;
  v326 = 0.0;
  v331 = 0.0;
  v236 = 0;
  v237 = this->field_710;
  LODWORD(v334[0].x) = &this->m_anWheelColPoint[0].surfaceTypeB;
  v334[1].z = v235 * v235 + v233 * v233 + v232 * v232;
  do
  {
    v238 = v237[4] - *v237;
    if ( v238 > 0.30000001 && (!v236 || v236 == 2) && v334[1].z > 0.040000003 )
    {
      v239 = this->vehicle.physical.entity.m_nTypeStatus >> 3;
      if ( !v239 || v239 == 3 )
      {
        v314 = v238;
        if ( v314 > v326 )
          v326 = v238;
      }
    }
    if ( *v237 < 1.0 && (this->vehicle.physical.entity.m_nTypeStatus & 0xF8) == 0 )
    {
      *a3 = COERCE_FLOAT(CSurfaceTable::GetRoughness(*LODWORD(v334[0].x)));
      v240 = *a3 * 0.1;
      if ( v331 <= v240 )
        v331 = v240;
    }
    v241 = v334[0].x;
    v237[4] = *v237;
    *v237 = 1.0;
    ++v236;
    ++v237;
    LODWORD(v334[0].x) = LODWORD(v241) + 44;
  }
  while ( v236 < 4 );
  if ( (CTimer::m_snTimeInMilliseconds & 0x7FFu) > 0x320 )
  {
    if ( v331 >= 0.28999999 )
      v326 = 0.0;
    v331 = 0.0;
  }
  if ( (v326 > 0.0 || v331 > 0.0) && (this->vehicle.physical.entity.m_nTypeStatus & 0xF8) == 0 )
  {
    v242 = p_m_vecMoveSpeed->x * p_m_vecMoveSpeed->x
         + this->vehicle.physical.m_vecMoveSpeed.y * this->vehicle.physical.m_vecMoveSpeed.y
         + this->vehicle.physical.m_vecMoveSpeed.z * this->vehicle.physical.m_vecMoveSpeed.z;
    if ( v242 > 0.010000001 )
    {
      v244 = sqrt(v242) / this->vehicle.physical.m_fMass;
      if ( v245 | v246 )
      {
        v249 = v244 * v331 * 400000.0 + 40.0;
        if ( v249 > 150.0 )
          v249 = 150.0;
        LODWORD(v334[1].z) = v249;
        a3[0] = v249;
        v295 = (CTimer::ms_fTimeStep * 5000.0 / a3[0]);
        Pad = CPad::GetPad(0);
        CPad::StartShake(Pad, v295, v249, 0);
      }
      else
      {
        v247 = v244 * v326 * 400000.0 + 100.0;
        if ( v247 > 250.0 )
          v247 = 250.0;
        LODWORD(v334[1].z) = v247;
        a3[0] = v247;
        v294 = (CTimer::ms_fTimeStep * 20000.0 / a3[0]);
        v248 = CPad::GetPad(0);
        CPad::StartShake(v248, v294, v247, 0);
      }
    }
  }
  v251 = this->vehicle.m_nVehicleFlags[1];
  this->vehicle.m_nVehicleFlags[3] &= 0xDEu;
  if ( (v251 & 0x20) == 0 )
    CCarCtrl::ScanForPedDanger(&this->vehicle);
  m_dwFlags = this->vehicle.physical.m_dwFlags;
  if ( (m_dwFlags & 4) != 0 && (m_dwFlags & 8) != 0 )
  {
    p_m_vecMoveSpeed->x = 0.0;
    this->vehicle.physical.m_vecMoveSpeed.y = 0.0;
    this->vehicle.physical.m_vecMoveSpeed.z = 0.0;
    this->vehicle.physical.m_vecTurnSpeed.x = 0.0;
    this->vehicle.physical.m_vecTurnSpeed.y = 0.0;
    this->vehicle.physical.m_vecTurnSpeed.z = 0.0;
    out.x = 0.0;
    this->vehicle.physical.m_vecFrictionMoveSpeed.x = 0.0;
    out.y = 0.0;
    out.z = 0.0;
    this->vehicle.physical.m_vecFrictionMoveSpeed.y = 0.0;
    this->vehicle.physical.m_vecFrictionMoveSpeed.z = 0.0;
    p_m_vecFrictionTurnSpeed = &this->vehicle.physical.m_vecFrictionTurnSpeed;
    goto LABEL_418;
  }
  if ( !HIBYTE(v334[1].y)
    && (this->vehicle.m_fGasPedal == 0.0 || (this->vehicle.physical.entity.m_nTypeStatus & 0xF8) == 40)
    && fabs(p_m_vecMoveSpeed->x) < 0.0049999999
    && fabs(this->vehicle.physical.m_vecMoveSpeed.y) < 0.0049999999
    && fabs(this->vehicle.physical.m_vecMoveSpeed.z) < 0.0049999999 )
  {
    if ( *&this->vehicle.physical.m_fDamageIntensity <= 0.0
      || (m_pDamageEntity = this->vehicle.physical.m_pDamageEntity, m_pDamageEntity != FindPlayerPed(-1)) )
    {
      p_m_vecFrictionTurnSpeed = &this->vehicle.physical.m_vecMoveSpeed;
      this->vehicle.physical.m_vecTurnSpeed.z = 0.0;
LABEL_418:
      out.x = 0.0;
      p_m_vecFrictionTurnSpeed->x = 0.0;
      out.y = 0.0;
      out.z = 0.0;
      p_m_vecFrictionTurnSpeed->y = 0.0;
      p_m_vecFrictionTurnSpeed->z = 0.0;
    }
  }
  if ( (LOBYTE(v337.z) & 2) == 0 && (this->m_nDamageFlags & 0x18) == 0 )
    return;
  v255 = this->vehicle.physical.entity.placeable.m_pMatrix;
  v256 = *&this->field_615[11] * v255->mat.right.z
       + *&this->field_615[7] * v255->mat.right.y
       + v255->mat.right.x * *&this->field_615[3];
  v331 = v256;
  if ( v256 <= 1.0 )
  {
    if ( v331 < -1.0 )
      v331 = -1.0;
  }
  else
  {
    v331 = 1.0;
  }
  Multiply3x3(&v334[0].y, &v255->mat, &this->vehicle.physical.m_vecCentreOfMass);
  v257 = this->vehicle.physical.entity.placeable.m_pMatrix;
  out.x = v334[0].y + v257->mat.right.x;
  out.y = v334[0].z + v257->mat.right.y;
  out.z = v334[1].x + v257->mat.right.z;
  v258 = v331 * this->vehicle.physical.m_fTurnMass;
  if ( (LOBYTE(v337.z) & 2) != 0 )
  {
    v259 = v258 * -0.07;
    v260 = v259 * v257->mat.at.x;
    a.y = v259 * v257->mat.at.y;
    a.z = v259 * v257->mat.at.z;
    a6.x = v260 * CTimer::ms_fTimeStep;
    a6.y = a.y * CTimer::ms_fTimeStep;
    a6.z = a.z * CTimer::ms_fTimeStep;
    CPhysical::ApplyTurnForce(&this->vehicle.physical, a6, out);
    this->m_nDamageFlags &= ~0x10u;
  }
  else
  {
    v261 = v258 * -0.1;
    v262 = v261 * v257->mat.at.x;
    a.y = v261 * v257->mat.at.y;
    a.z = v261 * v257->mat.at.z;
    a6.x = v262 * CTimer::ms_fTimeStep;
    a6.y = a.y * CTimer::ms_fTimeStep;
    a6.z = a.z * CTimer::ms_fTimeStep;
    CPhysical::ApplyTurnForce(&this->vehicle.physical, a6, out);
  }
  if ( (this->vehicle.physical.entity.m_nTypeStatus & 0xF8) != 0 )
    return;
  if ( this->field_730[0] > 0.0
    || this->field_730[1] > 0.0
    || (v263 = this->vehicle.physical.entity.placeable.m_pMatrix, v263->mat.top.z <= 0.0)
    || this->field_730[2] <= 0.0 && this->field_730[3] <= 0.0 )
  {
    if ( this->field_730[2] > 0.0 )
      return;
    if ( this->field_730[3] > 0.0 )
      return;
    v276 = this->vehicle.physical.entity.placeable.m_pMatrix;
    if ( v276->mat.top.z >= 0.0 || this->field_730[0] <= 0.0 && this->field_730[1] <= 0.0 )
      return;
    v277 = this->m_pBikeHandlingData;
    v278 = *(v277 + 48) - v276->mat.top.z;
    if ( v278 <= 0.15000001 )
    {
      if ( v278 >= -0.15000001 )
        goto LABEL_455;
      v278 = -0.30000001 - v278;
      if ( v278 <= 0.0 )
        goto LABEL_455;
    }
    else
    {
      v278 = 0.30000001 - v278;
      if ( v278 >= 0.0 )
      {
LABEL_455:
        v279 = sqrt(
                 p_m_vecMoveSpeed->x * p_m_vecMoveSpeed->x
               + this->vehicle.physical.m_vecMoveSpeed.y * this->vehicle.physical.m_vecMoveSpeed.y
               + this->vehicle.physical.m_vecMoveSpeed.z * this->vehicle.physical.m_vecMoveSpeed.z);
        if ( v279 > 0.1 )
          v279 = 0.1;
        v317 = v278 * *(v277 + 60) * v279;
        v280 = CStats::GetFatAndMuscleModifier(0xCu);
        v281 = this->vehicle.physical.entity.placeable.m_pMatrix;
        out.x = v334[0].y + v281->mat.top.x;
        out.y = v334[0].z + v281->mat.top.y;
        out.z = v334[1].x + v281->mat.top.z;
        v282 = v280 * v317 * this->vehicle.physical.m_fTurnMass * CTimer::ms_fTimeStep * 0.5;
        a6.x = v282 * v281->mat.at.x;
        a6.y = v282 * v281->mat.at.y;
        a6.z = v282 * v281->mat.at.z;
        CPhysical::ApplyTurnForce(&this->vehicle.physical, a6, out);
        v283 = this->vehicle.physical.entity.placeable.m_pMatrix;
        v284 = this->vehicle.physical.m_vecMoveSpeed.z * v283->mat.right.z;
        v285 = this->vehicle.physical.m_vecMoveSpeed.y * v283->mat.right.y;
        out.x = 0.0;
        out.y = 0.0;
        out.z = 1.0;
        v334[1].z = (v284 + v285 + v283->mat.right.x * p_m_vecMoveSpeed->x)
                  * this->vehicle.physical.m_fTurnMass
                  * CTimer::ms_fTimeStep
                  * flt_8D3280;
        CrossProduct(&a1, &out, &v283->mat.right);
        CVector::Normalise(&a1);
        out.x = -a1.x;
        v286 = this->vehicle.physical.entity.placeable.m_pMatrix;
        out.y = -a1.y;
        out.z = -a1.z;
        v287 = -v334[1].z;
        a6.x = v287 * v286->mat.right.x;
        a6.y = v287 * v286->mat.right.y;
        a6.z = v287 * v286->mat.right.z;
        CPhysical::ApplyTurnForce(&this->vehicle.physical, a6, out);
        return;
      }
    }
    v278 = 0.0;
    goto LABEL_455;
  }
  v264 = this->m_pBikeHandlingData;
  v265 = *(v264 + 44) - v263->mat.top.z;
  if ( v265 <= 0.15000001 )
  {
    if ( v265 < -0.079999998 )
    {
      v265 = -0.14 - v265;
      if ( v265 > 0.0 )
LABEL_439:
        v265 = 0.0;
    }
  }
  else
  {
    v265 = 0.30000001 - v265;
    if ( v265 < 0.0 )
      goto LABEL_439;
  }
  if ( sqrt(
         p_m_vecMoveSpeed->x * p_m_vecMoveSpeed->x
       + this->vehicle.physical.m_vecMoveSpeed.y * this->vehicle.physical.m_vecMoveSpeed.y
       + this->vehicle.physical.m_vecMoveSpeed.z * this->vehicle.physical.m_vecMoveSpeed.z) <= 0.1 )
    v266 = sqrt(
             p_m_vecMoveSpeed->x * p_m_vecMoveSpeed->x
           + this->vehicle.physical.m_vecMoveSpeed.y * this->vehicle.physical.m_vecMoveSpeed.y
           + this->vehicle.physical.m_vecMoveSpeed.z * this->vehicle.physical.m_vecMoveSpeed.z);
  else
    v266 = 0.1;
  v315 = v265 * *(v264 + 56) * v266;
  v267 = CStats::GetFatAndMuscleModifier(0xCu);
  v268 = this->vehicle.physical.entity.placeable.m_pMatrix;
  out.x = v334[0].y + v268->mat.top.x;
  out.y = v334[0].z + v268->mat.top.y;
  out.z = v334[1].x + v268->mat.top.z;
  v269 = v267 * v315 * this->vehicle.physical.m_fTurnMass * CTimer::ms_fTimeStep * 0.5;
  a6.x = v269 * v268->mat.at.x;
  a6.y = v269 * v268->mat.at.y;
  a6.z = v269 * v268->mat.at.z;
  CPhysical::ApplyTurnForce(&this->vehicle.physical, a6, out);
  v270 = this->vehicle.physical.entity.placeable.m_pMatrix;
  v271 = this->m_pBikeHandlingData;
  out.x = v334[0].y + v270->mat.top.x;
  out.y = v334[0].z + v270->mat.top.y;
  out.z = v334[1].x + v270->mat.top.z;
  v272 = *(v271 + 52)
       * this->m_rideAnimData.m_fSteerAngle
       * this->vehicle.physical.m_fTurnMass
       * CTimer::ms_fTimeStep
       * 0.5;
  a6.x = v272 * v270->mat.right.x;
  a6.y = v272 * v270->mat.right.y;
  a6.z = v272 * v270->mat.right.z;
  CPhysical::ApplyTurnForce(&this->vehicle.physical, a6, out);
  v273 = this->vehicle.physical.entity.placeable.m_pMatrix;
  v274 = sqrt(
           p_m_vecMoveSpeed->x * p_m_vecMoveSpeed->x
         + p_m_vecMoveSpeed->y * p_m_vecMoveSpeed->y
         + p_m_vecMoveSpeed->z * p_m_vecMoveSpeed->z)
       * this->vehicle.physical.m_fMass
       * *(this->m_pBikeHandlingData + 52)
       * this->m_rideAnimData.m_fSteerAngle
       * CTimer::ms_fTimeStep
       * flt_8D3288;
  v275 = v274 * v273->mat.right.x;
  a6.y = v274 * v273->mat.right.y;
  a6.z = v274 * v273->mat.right.z;
  v316 = sqrt(
           p_m_vecMoveSpeed->x * p_m_vecMoveSpeed->x
         + this->vehicle.physical.m_vecMoveSpeed.y * this->vehicle.physical.m_vecMoveSpeed.y
         + this->vehicle.physical.m_vecMoveSpeed.z * this->vehicle.physical.m_vecMoveSpeed.z);
  out.x = v275 * v316;
  out.y = a6.y * v316;
  out.z = a6.z * v316;
  CPhysical::ApplyMoveForce(&this->vehicle.physical, out.x, out.y, out.z);
  this->m_rideAnimData.m_fAnimLean = CTimer::ms_fTimeStep * this->m_rideAnimData.m_fSteerAngle * flt_8D3284
                                   + this->m_rideAnimData.m_fAnimLean;
}