Rev 18 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 18 | Rev 20 | ||
|---|---|---|---|
| Line 2... | Line 2... | ||
| 2 | 2 | ||
| 3 | #include "car.h" | 3 | #include "car.h" | 
| 4 | #include "brender.h" | 4 | #include "brender/brender.h" | 
| 5 | #include "brucetrk.h" | 5 | #include "brucetrk.h" | 
| 6 | #include "car.h" | 6 | #include "car.h" | 
| 7 | #include "constants.h" | 7 | #include "constants.h" | 
| 8 | #include "controls.h" | 8 | #include "controls.h" | 
| 9 | #include "crush.h" | 9 | #include "crush.h" | 
| Line 27... | Line 27... | ||
| 27 | #include "raycast.h" | 27 | #include "raycast.h" | 
| 28 | #include "replay.h" | 28 | #include "replay.h" | 
| 29 | #include "skidmark.h" | 29 | #include "skidmark.h" | 
| 30 | #include "sound.h" | 30 | #include "sound.h" | 
| 31 | #include "spark.h" | 31 | #include "spark.h" | 
| 32 | #include "structur.h" | - | |
| 33 | #include "trig.h" | 32 | #include "trig.h" | 
| 34 | #include "utility.h" | 33 | #include "utility.h" | 
| 35 | #include "world.h" | 34 | #include "world.h" | 
| 36 | #include <math.h> | 35 | #include <math.h> | 
| 37 | #include <stdlib.h> | 36 | #include <stdlib.h> | 
| Line 885... | Line 884... | ||
| 885 | if (fabsf(c->curvature) > c->maxcurve / 2.0f && c->gear < 2 && c->gear && c->traction_control) { | 884 | if (fabsf(c->curvature) > c->maxcurve / 2.0f && c->gear < 2 && c->gear && c->traction_control) { | 
| 886 | ts = 0.7f; | 885 | ts = 0.7f; | 
| 887 | } else if (c->joystick.acc < 0) { | 886 | } else if (c->joystick.acc < 0) { | 
| 888 | ts = (br_scalar) 1.2; // Pierre-Marie Baty -- added type cast | 887 | ts = (br_scalar) 1.2; // Pierre-Marie Baty -- added type cast | 
| 889 | } else { | 888 | } else { | 
| 890 | ts = c->joystick.acc / 54613. | 889 | ts = c->joystick.acc / 54613.0; | 
| - | 890 | LOG_PANIC("ooo"); | |
| 891 |         } | 891 |         } | 
| 892 | 892 | ||
| 893 | torque = c->engine_power_multiplier * ts * gEngine_powerup_factor[c->power_up_levels[1]]; | 893 | torque = c->engine_power_multiplier * ts * gEngine_powerup_factor[c->power_up_levels[1]]; | 
| 894 | if (c->damage_units[0].damage_level > 10) { | 894 | if (c->damage_units[0].damage_level > 10) { | 
| 895 | torque = (1.0f - (double)(c->damage_units[0].damage_level - 10) / 100.0f) * torque; | 895 | torque = (1.0f - (double)(c->damage_units[0].damage_level - 10) / 100.0f) * torque; | 
| Line 1079... | Line 1079... | ||
| 1079 |     } | 1079 |     } | 
| 1080 | } | 1080 | } | 
| 1081 | 1081 | ||
| 1082 | // IDA: void __usercall GetNetPos(tCar_spec *pCar@<EAX>) | 1082 | // IDA: void __usercall GetNetPos(tCar_spec *pCar@<EAX>) | 
| 1083 | void GetNetPos(tCar_spec* pCar) { | 1083 | void GetNetPos(tCar_spec* pCar) { | 
| 1084 | 
 | 1084 |     //int j; // Pierre-Marie Baty -- unused variable | 
| 1085 | 
 | 1085 |     //float amount; // Pierre-Marie Baty -- unused variable | 
| 1086 | br_scalar total_deflection | 1086 |     //br_scalar total_deflection; // Pierre-Marie Baty -- unused variable | 
| 1087 | LOG_TRACE("(%p)", pCar); | 1087 | LOG_TRACE("(%p)", pCar); | 
| 1088 | - | ||
| 1089 | if (gNet_mode == eNet_mode_host && pCar->last_car_car_collision > pCar->message.cc_coll_time) { | - | |
| 1090 | pCar->message.type = 0; | - | |
| 1091 | pCar->dt = -1.0f; | - | |
| 1092 | return; | - | |
| 1093 |     } | - | |
| 1094 | if (fabsf(pCar->message.omega.v[0]) > 10000.0 | - | |
| 1095 | || fabsf(pCar->message.omega.v[1]) > 10000.0 | - | |
| 1096 | || fabsf(pCar->message.omega.v[2]) > 10000.0 | - | |
| 1097 | || fabsf(pCar->message.omega.v[0]) > 10000.0 | - | |
| 1098 | || fabsf(pCar->message.omega.v[1]) > 10000.0 | - | |
| 1099 | || fabsf(pCar->message.omega.v[2]) > 10000.0) { | - | |
| 1100 | BrVector3SetFloat(&pCar->message.omega, 0.0, 0.0, 0.0); | - | |
| 1101 | BrVector3SetFloat(&pCar->message.v, 0.0, 0.0, 0.0); | - | |
| 1102 |     } | - | |
| 1103 | GetExpandedMatrix(&pCar->car_master_actor->t.t.mat, &pCar->message.mat); | - | |
| 1104 | if (gNet_mode == eNet_mode_client) { | - | |
| 1105 | BrMatrix34Copy(&pCar->oldmat, &pCar->car_master_actor->t.t.mat); | - | |
| 1106 |     } | - | |
| 1107 | BrVector3Copy(&pCar->v, &pCar->message.v); | - | |
| 1108 | BrVector3Copy(&pCar->omega, &pCar->message.omega); | - | |
| 1109 | - | ||
| 1110 | if (pCar->driver > eDriver_non_car) { | - | |
| 1111 | pCar->curvature = pCar->message.curvature * pCar->maxcurve / 32767.0f; | - | |
| 1112 | - | ||
| 1113 | for (j = 0; j < COUNT_OF(pCar->oldd); j++) { | - | |
| 1114 | pCar->oldd[j] = (pCar->message.d[j] * pCar->susp_height[j >> 1]) / 255.0f; | - | |
| 1115 |         } | - | |
| 1116 | if (pCar->driver == eDriver_oppo || pCar->repair_time >= pCar->message.repair_time) { | - | |
| 1117 | for (j = 0; j < COUNT_OF(pCar->damage_units); j++) { | - | |
| 1118 | pCar->damage_units[j].damage_level = pCar->message.damage[j]; | - | |
| 1119 |             } | - | |
| 1120 | SortOutSmoke(pCar); | - | |
| 1121 | } else { | - | |
| 1122 | if (pCar->message.repair_time - pCar->repair_time < 100000) { | - | |
| 1123 | amount = RepairCar2(pCar, pCar->message.repair_time - pCar->repair_time, &total_deflection); | - | |
| 1124 | 
 | 1088 | NOT_IMPLEMENTED(); | 
| 1125 | TotallyRepairACar(pCar); | - | |
| 1126 | pCar->repair_time = pCar->message.repair_time; | - | |
| 1127 |             } | - | |
| 1128 | for (j = 0; j < COUNT_OF(pCar->damage_units); j++) { | - | |
| 1129 | pCar->damage_units[j].damage_level = pCar->message.damage[j]; | - | |
| 1130 |             } | - | |
| 1131 | SetSmokeLastDamageLevel(pCar); | - | |
| 1132 | StopCarSmoking(pCar); | - | |
| 1133 |         } | - | |
| 1134 | if (pCar->driver == eDriver_net_human) { | - | |
| 1135 | pCar->revs = pCar->message.revs; | - | |
| 1136 |         } | - | |
| 1137 | if (pCar->driver >= eDriver_net_human) { | - | |
| 1138 | pCar->bounds[1].min.v[2] = pCar->message.front; | - | |
| 1139 | pCar->bounds[1].max.v[2] = pCar->message.back; | - | |
| 1140 |         } | - | |
| 1141 | if (pCar->driver != eDriver_local_human) { | - | |
| 1142 | for (j = 0; j < COUNT_OF(pCar->wheel_dam_offset); j++) { | - | |
| 1143 | pCar->wheel_dam_offset[j] = pCar->message.wheel_dam_offset[j]; | - | |
| 1144 |             } | - | |
| 1145 |         } | - | |
| 1146 | GetFacesInBox((tCollision_info*)pCar); | - | |
| 1147 |     } | - | |
| 1148 | - | ||
| 1149 | pCar->message.type = 0; | - | |
| 1150 | pCar->last_car_car_collision = pCar->message.cc_coll_time; | - | |
| 1151 | } | 1089 | } | 
| 1152 | 1090 | ||
| 1153 | // IDA: void __usercall ApplyPhysicsToCars(tU32 last_frame_time@<EAX>, tU32 pTime_difference@<EDX>) | 1091 | // IDA: void __usercall ApplyPhysicsToCars(tU32 last_frame_time@<EAX>, tU32 pTime_difference@<EDX>) | 
| 1154 | void ApplyPhysicsToCars(tU32 last_frame_time, tU32 pTime_difference) { | 1092 | void ApplyPhysicsToCars(tU32 last_frame_time, tU32 pTime_difference) { | 
| 1155 |     //br_vector3 minus_k; // Pierre-Marie Baty -- unused variable | 1093 |     //br_vector3 minus_k; // Pierre-Marie Baty -- unused variable | 
| Line 1196... | Line 1134... | ||
| 1196 | BrVector3Copy(&gCar_to_view->old_v, &gCar_to_view->v); | 1134 | BrVector3Copy(&gCar_to_view->old_v, &gCar_to_view->v); | 
| 1197 |         } | 1135 |         } | 
| 1198 | for (i = 0; i < gNum_active_cars; i++) { | 1136 | for (i = 0; i < gNum_active_cars; i++) { | 
| 1199 | car = gActive_car_list[i]; | 1137 | car = gActive_car_list[i]; | 
| 1200 | car->dt = -1.f; | 1138 | car->dt = -1.f; | 
| 1201 | if (car->message.type == | 1139 | if (car->message.type == 15 && car->message.time >= gLast_mechanics_time && gLast_mechanics_time + harness_game_config.physics_step_time >= car->message.time) { | 
| 1202 |                 // time between car message and next mechanics | - | |
| 1203 | car->dt = (gLast_mechanics_time + harness_game_config.physics_step_time - car->message.time) / 1000. | 1140 | car->dt = (double)(gLast_mechanics_time + harness_game_config.physics_step_time - car->message.time) / 1000.0; | 
| 1204 |                 // if the time between car message and next mechanics is about equal to timestep | - | |
| 1205 | if ( | 1141 | if (gDt - 0.0001f <= car->dt) { | 
| 1206 | GetNetPos(car); | 1142 | GetNetPos(car); | 
| 1207 | } else if (gNet_mode == eNet_mode_host) { | 1143 | } else if (gNet_mode == eNet_mode_host) { | 
| 1208 | car->dt = -1.f; | 1144 | car->dt = -1.f; | 
| 1209 | } else { | 1145 | } else { | 
| 1210 | for (dam_index = 0; dam_index < COUNT_OF(car->damage_units); dam_index++) { | 1146 | for (dam_index = 0; dam_index < COUNT_OF(car->damage_units); dam_index++) { | 
| Line 1232... | Line 1168... | ||
| 1232 |         } | 1168 |         } | 
| 1233 | for (i = 0; i < gNum_active_non_cars; i++) { | 1169 | for (i = 0; i < gNum_active_non_cars; i++) { | 
| 1234 | non_car = gActive_non_car_list[i]; | 1170 | non_car = gActive_non_car_list[i]; | 
| 1235 | if (!non_car->collision_info.doing_nothing_flag) { | 1171 | if (!non_car->collision_info.doing_nothing_flag) { | 
| 1236 | non_car->collision_info.dt = -1.f; | 1172 | non_car->collision_info.dt = -1.f; | 
| 1237 | if (non_car->collision_info.message.type == | 1173 | if (non_car->collision_info.message.type == 16 && non_car->collision_info.message.time >= gLast_mechanics_time && gLast_mechanics_time + harness_game_config.physics_step_time >= non_car->collision_info.message.time) { | 
| 1238 | non_car->collision_info.dt = (gLast_mechanics_time + harness_game_config.physics_step_time - non_car->collision_info.message.time) / 1000.0f; | 1174 | non_car->collision_info.dt = (gLast_mechanics_time + harness_game_config.physics_step_time - non_car->collision_info.message.time) / 1000.0f; | 
| 1239 | GetNetPos((tCar_spec*)non_car); | 1175 | GetNetPos((tCar_spec*)non_car); | 
| 1240 |                 } | 1176 |                 } | 
| 1241 | if (non_car->collision_info.box_face_ref != gFace_num__car | 1177 | if (non_car->collision_info.box_face_ref != gFace_num__car | 
| 1242 | && (non_car->collision_info.box_face_ref != gFace_num__car - 1 | 1178 | && (non_car->collision_info.box_face_ref != gFace_num__car - 1 | 
| Line 1484... | Line 1420... | ||
| 1484 | // IDA: void __cdecl ToggleControls() | 1420 | // IDA: void __cdecl ToggleControls() | 
| 1485 | void ToggleControls(void) { | 1421 | void ToggleControls(void) { | 
| 1486 | LOG_TRACE("()"); | 1422 | LOG_TRACE("()"); | 
| 1487 | 1423 | ||
| 1488 |     gControl__car++; | 1424 |     gControl__car++; | 
| 1489 | if (ControlCar[gControl__car] == | 1425 | if (ControlCar[gControl__car] == 0) { | 
| 1490 | gControl__car = 0; | 1426 | gControl__car = 0; | 
| 1491 |     } | 1427 |     } | 
| 1492 | switch (gControl__car) { | 1428 | switch (gControl__car) { | 
| 1493 | case 0: | 1429 | case 0: | 
| 1494 | NewTextHeadupSlot(4, 0, 500, -1, "Original Controls"); | 1430 | NewTextHeadupSlot(4, 0, 500, -1, "Original Controls"); | 
| Line 1509... | Line 1445... | ||
| 1509 | } | 1445 | } | 
| 1510 | 1446 | ||
| 1511 | // IDA: void __usercall ControlCar2(tCar_spec *c@<EAX>, br_scalar dt) | 1447 | // IDA: void __usercall ControlCar2(tCar_spec *c@<EAX>, br_scalar dt) | 
| 1512 | void ControlCar2(tCar_spec* c, br_scalar dt) { | 1448 | void ControlCar2(tCar_spec* c, br_scalar dt) { | 
| 1513 | LOG_TRACE("(%p, %f)", c, dt); | 1449 | LOG_TRACE("(%p, %f)", c, dt); | 
| 1514 | - | ||
| 1515 | 
 | 1450 | NOT_IMPLEMENTED(); | 
| 1516 | if (c->keys.acc) { | - | |
| 1517 | c->acc_force = 7.f * c->M; | - | |
| 1518 |     } | - | |
| 1519 | if (c->keys.dec) { | - | |
| 1520 | c->acc_force = -7.f * c->M; | - | |
| 1521 |     } | - | |
| 1522 | if (c->keys.left) { | - | |
| 1523 | if (c->turn_speed < 0.f) { | - | |
| 1524 | c->turn_speed = 0.f; | - | |
| 1525 |         } | - | |
| 1526 | if (c->curvature >= 0.f) { | - | |
| 1527 | c->turn_speed += dt / 0.04f * (0.05f / (5.f + BrVector3Length(&c->v)) / 2.f); | - | |
| 1528 | } else { | - | |
| 1529 | c->turn_speed += 0.01f * dt / 0.04f / 2.f; | - | |
| 1530 |         } | - | |
| 1531 |     } | - | |
| 1532 | if (c->keys.right) { | - | |
| 1533 | if (c->turn_speed > 0.f) { | - | |
| 1534 | c->turn_speed = 0.f; | - | |
| 1535 |         } | - | |
| 1536 | if (c->curvature <= 0.f) { | - | |
| 1537 | c->turn_speed -= dt / 0.04f * (0.05f / (5.f + BrVector3Length(&c->v)) / 2.f); | - | |
| 1538 | } else { | - | |
| 1539 | c->turn_speed -= 0.01f * dt / 0.04f / 2.f; | - | |
| 1540 |         } | - | |
| 1541 |     } | - | |
| 1542 | if (!c->keys.left && !c->keys.right) { | - | |
| 1543 | c->turn_speed = 0.f; | - | |
| 1544 |     } | - | |
| 1545 | c->curvature += c->turn_speed; | - | |
| 1546 | if (c->curvature > c->maxcurve) { | - | |
| 1547 | c->curvature = c->maxcurve; | - | |
| 1548 |     } | - | |
| 1549 | if (c->curvature < -c->maxcurve) { | - | |
| 1550 | c->curvature = -c->maxcurve; | - | |
| 1551 |     } | - | |
| 1552 | } | 1451 | } | 
| 1553 | 1452 | ||
| 1554 | // IDA: void __usercall ControlCar3(tCar_spec *c@<EAX>, br_scalar dt) | 1453 | // IDA: void __usercall ControlCar3(tCar_spec *c@<EAX>, br_scalar dt) | 
| 1555 | void ControlCar3(tCar_spec* c, br_scalar dt) { | 1454 | void ControlCar3(tCar_spec* c, br_scalar dt) { | 
| 1556 | LOG_TRACE("(%p, %f)", c, dt); | 1455 | LOG_TRACE("(%p, %f)", c, dt); | 
| 1557 | - | ||
| 1558 | 
 | 1456 | NOT_IMPLEMENTED(); | 
| 1559 | if (c->turn_speed < 0.f) { | - | |
| 1560 | c->turn_speed = 0.f; | - | |
| 1561 |         } | - | |
| 1562 | if (c->curvature >= 0.f && c->omega.v[1] >= 0.f) { | - | |
| 1563 | c->turn_speed += dt / 0.04f * (0.05f / (5.f + BrVector3Length(&c->v)) / 2.f) * 0.75f; | - | |
| 1564 | } else { | - | |
| 1565 | c->turn_speed += 0.01f * dt / 0.04f / 2.f * 3.f; | - | |
| 1566 |         } | - | |
| 1567 |     } | - | |
| 1568 | - | ||
| 1569 | if (c->keys.right) { | - | |
| 1570 | if (c->turn_speed > 0.f) { | - | |
| 1571 | c->turn_speed = 0.f; | - | |
| 1572 |         } | - | |
| 1573 | if (c->curvature <= 0.f && c->omega.v[1] <= 0.f) { | - | |
| 1574 | c->turn_speed -= dt / 0.04f * (0.05f / (5.f + BrVector3Length(&c->v)) / 2.f) * 0.75f; | - | |
| 1575 | } else { | - | |
| 1576 | c->turn_speed -= 0.01f * dt / 0.04f / 2.f * 3.f; | - | |
| 1577 |         } | - | |
| 1578 |     } | - | |
| 1579 | if (!c->keys.left && !c->keys.right) { | - | |
| 1580 | c->turn_speed = 0.f; | - | |
| 1581 |     } | - | |
| 1582 | c->curvature += c->turn_speed; | - | |
| 1583 | if (c->curvature > c->maxcurve) { | - | |
| 1584 | c->curvature = c->maxcurve; | - | |
| 1585 |     } | - | |
| 1586 | if (c->curvature < -c->maxcurve) { | - | |
| 1587 | c->curvature = -c->maxcurve; | - | |
| 1588 |     } | - | |
| 1589 | } | 1457 | } | 
| 1590 | 1458 | ||
| 1591 | // IDA: void __usercall ControlCar4(tCar_spec *c@<EAX>, br_scalar dt) | 1459 | // IDA: void __usercall ControlCar4(tCar_spec *c@<EAX>, br_scalar dt) | 
| 1592 | void ControlCar4(tCar_spec* c, br_scalar dt) { | 1460 | void ControlCar4(tCar_spec* c, br_scalar dt) { | 
| 1593 |     //br_scalar ts; // Pierre-Marie Baty -- unused variable | 1461 |     //br_scalar ts; // Pierre-Marie Baty -- unused variable | 
| Line 1643... | Line 1511... | ||
| 1643 | } | 1511 | } | 
| 1644 | 1512 | ||
| 1645 | // IDA: void __usercall ControlCar5(tCar_spec *c@<EAX>, br_scalar dt) | 1513 | // IDA: void __usercall ControlCar5(tCar_spec *c@<EAX>, br_scalar dt) | 
| 1646 | void ControlCar5(tCar_spec* c, br_scalar dt) { | 1514 | void ControlCar5(tCar_spec* c, br_scalar dt) { | 
| 1647 | LOG_TRACE("(%p, %f)", c, dt); | 1515 | LOG_TRACE("(%p, %f)", c, dt); | 
| 1648 | - | ||
| 1649 | c->acc_force = 0.f; | - | |
| 1650 | if (c->keys.acc) { | - | |
| 1651 | c->acc_force = 7.f * c->M; | - | |
| 1652 |     } | - | |
| 1653 | if (c->keys.dec) { | - | |
| 1654 | c->acc_force = -7.f * c->M; | - | |
| 1655 |     } | - | |
| 1656 | if (c->keys.left) { | - | |
| 1657 | if (c->turn_speed < 0.f) { | - | |
| 1658 | c->turn_speed = 0.f; | - | |
| 1659 |         } | - | |
| 1660 | if (c->curvature >= 0) { | - | |
| 1661 | c->turn_speed += dt / 0.04f * (0.05f / (5.f + BrVector3Length(&c->v)) / 2.f) * 0.5f; | - | |
| 1662 | } else { | - | |
| 1663 | c->turn_speed += 0.01f * dt / 0.04f / 2.f * .5f; | - | |
| 1664 |         } | - | |
| 1665 |     } | - | |
| 1666 | if (c->keys.right) { | - | |
| 1667 | if (c->turn_speed > 0.f) { | - | |
| 1668 | c->turn_speed = 0.f; | - | |
| 1669 |         } | - | |
| 1670 | if (c->curvature <= 0) { | - | |
| 1671 | c->turn_speed -= dt / 0.04f * (0.05f / (5.f + BrVector3Length(&c->v)) / 2.f) * 0.5f; | - | |
| 1672 | } else { | - | |
| 1673 | c->turn_speed -= 0.01f * dt / 0.04f / 2.f * .5f; | - | |
| 1674 |         } | - | |
| 1675 |     } | - | |
| 1676 | if (!c->keys.left && !c->keys.right) { | - | |
| 1677 | c->turn_speed = 0.f; | - | |
| 1678 | if (c->curvature < 0.f && !c->keys.holdw) { | - | |
| 1679 | c->curvature += dt / 0.04f * 0.05f / (5.f + BrVector3Length(&c->v)) / 2.f * 4.f; | - | |
| 1680 | if (c->curvature > 0.f) { | - | |
| 1681 | c->curvature = 0.f; | - | |
| 1682 |             } | - | |
| 1683 | } else if (c->curvature > 0.f && !c->keys.holdw) { | - | |
| 1684 | c->curvature -= dt / 0.04f * 0.05f / (5.f + BrVector3Length(&c->v)) / 2.f * 4.f; | - | |
| 1685 | if (c->curvature < 0.f) { | - | |
| 1686 | c->curvature = 0.f; | - | |
| 1687 |             } | - | |
| 1688 |         } | - | |
| 1689 |     } | - | |
| 1690 | c->curvature += c->turn_speed; | - | |
| 1691 | if (c->curvature > c->maxcurve) { | - | |
| 1692 | c->curvature = c->maxcurve; | - | |
| 1693 |     } | - | |
| 1694 | if (c->curvature < -c->maxcurve) { | - | |
| 1695 | c->curvature = -c->maxcurve; | - | |
| 1696 |     } | - | |
| 1697 | 
 | 1516 | NOT_IMPLEMENTED(); | 
| 1698 | } | 1517 | } | 
| 1699 | 1518 | ||
| 1700 | // IDA: void __usercall ControlCar1(tCar_spec *c@<EAX>, br_scalar dt) | 1519 | // IDA: void __usercall ControlCar1(tCar_spec *c@<EAX>, br_scalar dt) | 
| 1701 | void ControlCar1(tCar_spec* c, br_scalar dt) { | 1520 | void ControlCar1(tCar_spec* c, br_scalar dt) { | 
| 1702 | LOG_TRACE("(%p, %f)", c, dt); | 1521 | LOG_TRACE("(%p, %f)", c, dt); | 
| 1703 | - | ||
| 1704 | 
 | 1522 | NOT_IMPLEMENTED(); | 
| 1705 | if (c->keys.acc) { | - | |
| 1706 | c->acc_force = 7.f * c->M; | - | |
| 1707 |     } | - | |
| 1708 | if (c->keys.dec) { | - | |
| 1709 | c->acc_force = -7.f * c->M; | - | |
| 1710 |     } | - | |
| 1711 | if (c->keys.left) { | - | |
| 1712 | if (c->curvature >= 0.f) { | - | |
| 1713 | c->curvature += dt / 0.04f * 0.05f / (5.f + BrVector3Length(&c->v)); | - | |
| 1714 | } else { | - | |
| 1715 | c->curvature += 0.01f * dt / 0.04f; | - | |
| 1716 |         } | - | |
| 1717 |     } | - | |
| 1718 | if (c->keys.right) { | - | |
| 1719 | if (c->curvature <= 0.f) { | - | |
| 1720 | c->curvature -= dt / 0.04f * 0.05f / (5.f + BrVector3Length(&c->v)); | - | |
| 1721 | } else { | - | |
| 1722 | c->curvature -= 0.01f * dt / 0.04f; | - | |
| 1723 |         } | - | |
| 1724 |     } | - | |
| 1725 | if (c->curvature > c->maxcurve) { | - | |
| 1726 | c->curvature = c->maxcurve; | - | |
| 1727 |     } | - | |
| 1728 | if (c->curvature < -c->maxcurve) { | - | |
| 1729 | c->curvature = -c->maxcurve; | - | |
| 1730 |     } | - | |
| 1731 | } | 1523 | } | 
| 1732 | 1524 | ||
| 1733 | // IDA: void __usercall setrotate(br_vector3 *wdt@<EAX>, br_matrix34 *m@<EDX>) | 1525 | // IDA: void __usercall setrotate(br_vector3 *wdt@<EAX>, br_matrix34 *m@<EDX>) | 
| 1734 | void setrotate(br_vector3* wdt, br_matrix34* m) { | 1526 | void setrotate(br_vector3* wdt, br_matrix34* m) { | 
| 1735 | br_euler e | 1527 |     //br_euler e; // Pierre-Marie Baty -- unused variable | 
| 1736 | LOG_TRACE("(%p, %p)", wdt, m); | 1528 | LOG_TRACE("(%p, %p)", wdt, m); | 
| 1737 | - | ||
| 1738 | e.a = BR_ANGLE_RAD(wdt->v[0]); | - | |
| 1739 | e.b = BR_ANGLE_RAD(wdt->v[1]); | - | |
| 1740 | e.c = BR_ANGLE_RAD(wdt->v[2]); | - | |
| 1741 | e.order = 0; | - | |
| 1742 | 
 | 1529 | NOT_IMPLEMENTED(); | 
| 1743 | } | 1530 | } | 
| 1744 | 1531 | ||
| 1745 | // IDA: void __usercall RotateCar2(tCollision_info *c@<EAX>, br_scalar dt) | 1532 | // IDA: void __usercall RotateCar2(tCollision_info *c@<EAX>, br_scalar dt) | 
| 1746 | void RotateCar2(tCollision_info* c, br_scalar dt) { | 1533 | void RotateCar2(tCollision_info* c, br_scalar dt) { | 
| 1747 | br_vector3 wdt | 1534 |     //br_vector3 wdt; // Pierre-Marie Baty -- unused variable | 
| 1748 | br_vector3 wdt2 | 1535 |     //br_vector3 wdt2; // Pierre-Marie Baty -- unused variable | 
| 1749 | br_vector3 L | 1536 |     //br_vector3 L; // Pierre-Marie Baty -- unused variable | 
| 1750 | br_vector3 L2 | 1537 |     //br_vector3 L2; // Pierre-Marie Baty -- unused variable | 
| 1751 | br_matrix34 m | 1538 |     //br_matrix34 m; // Pierre-Marie Baty -- unused variable | 
| 1752 | LOG_TRACE("(%p, %f)", c, dt); | 1539 | LOG_TRACE("(%p, %f)", c, dt); | 
| 1753 | - | ||
| 1754 | BrVector3Scale(&wdt, &c->omega, dt); | - | |
| 1755 | BrVector3Negate(&wdt2, &wdt); | - | |
| 1756 | BrVector3Mul(&L, &c->I, &c->omega); | - | |
| 1757 | setrotate(&wdt2, &m); | - | |
| 1758 | BrMatrix34ApplyV(&L2, &L, &m); | - | |
| 1759 | 
 | 1540 | NOT_IMPLEMENTED(); | 
| 1760 | BrMatrix34PreTranslate(&m, -c->cmpos.v[0], -c->cmpos.v[1], -c->cmpos.v[2]); | - | |
| 1761 | BrMatrix34PostTranslate(&m, c->cmpos.v[0], c->cmpos.v[1], c->cmpos.v[2]); | - | |
| 1762 | BrMatrix34Pre(&c->car_master_actor->t.t.mat, &m); | - | |
| 1763 | BrVector3Copy(&c->oldomega, &c->omega); | - | |
| 1764 | Vector3Div(&c->omega, &L2, &c->I); | - | |
| 1765 | } | 1541 | } | 
| 1766 | 1542 | ||
| 1767 | // IDA: void __usercall RotateCarSecondOrder(tCollision_info *c@<EAX>, br_scalar dt) | 1543 | // IDA: void __usercall RotateCarSecondOrder(tCollision_info *c@<EAX>, br_scalar dt) | 
| 1768 | void RotateCarSecondOrder(tCollision_info* c, br_scalar dt) { | 1544 | void RotateCarSecondOrder(tCollision_info* c, br_scalar dt) { | 
| 1769 |     br_vector3 L; | 1545 |     br_vector3 L; | 
| Line 4550... | Line 4326... | ||
| 4550 | MungeCarGraphics(gFrame_period); | 4326 | MungeCarGraphics(gFrame_period); | 
| 4551 | } | 4327 | } | 
| 4552 | 4328 | ||
| 4553 | // IDA: tCar_spec* __cdecl GetRaceLeader() | 4329 | // IDA: tCar_spec* __cdecl GetRaceLeader() | 
| 4554 | tCar_spec* GetRaceLeader(void) { | 4330 | tCar_spec* GetRaceLeader(void) { | 
| 4555 | 
 | 4331 |     //int i; // Pierre-Marie Baty -- unused variable | 
| 4556 | 
 | 4332 |     //int score; // Pierre-Marie Baty -- unused variable | 
| 4557 | tCar_spec | 4333 |     //tCar_spec* car; // Pierre-Marie Baty -- unused variable | 
| 4558 | LOG_TRACE("()"); | 4334 | LOG_TRACE("()"); | 
| 4559 | - | ||
| 4560 | if ((gCurrent_net_game->type == eNet_game_type_foxy || gCurrent_net_game->type == eNet_game_type_tag) && gIt_or_fox >= 0 && gIt_or_fox < gNumber_of_net_players) { | - | |
| 4561 | car = gNet_players[gIt_or_fox].car; | - | |
| 4562 | } else { | - | |
| 4563 | car = gNet_players[0].car; | - | |
| 4564 | score = gNet_players[0].last_score_index; | - | |
| 4565 | for (i = 1; i < gNumber_of_net_players; i++) { | - | |
| 4566 | if (score > gNet_players[i].last_score_index) { | - | |
| 4567 | score = gNet_players[i].last_score_index; | - | |
| 4568 | car = gNet_players[i].car; | - | |
| 4569 |             } | - | |
| 4570 |         } | - | |
| 4571 |     } | - | |
| 4572 | 
 | 4335 | NOT_IMPLEMENTED(); | 
| 4573 | } | 4336 | } | 
| 4574 | 4337 | ||
| 4575 | // IDA: void __cdecl AmIGettingBoredWatchingCameraSpin() | 4338 | // IDA: void __cdecl AmIGettingBoredWatchingCameraSpin() | 
| 4576 | void AmIGettingBoredWatchingCameraSpin(void) { | 4339 | void AmIGettingBoredWatchingCameraSpin(void) { | 
| 4577 | 
 | 4340 |     //static tU32 time_of_death; // Pierre-Marie Baty -- unused variable | 
| 4578 | 
 | 4341 |     //static tU32 headup_timer; // Pierre-Marie Baty -- unused variable | 
| 4579 | tCar_spec | 4342 |     //tCar_spec* car; // Pierre-Marie Baty -- unused variable | 
| 4580 | 
 | 4343 |     //char s[256]; // Pierre-Marie Baty -- unused variable | 
| 4581 | LOG_TRACE("()"); | 4344 | LOG_TRACE("()"); | 
| 4582 | 4345 | ||
| 4583 | if (gNet_mode == eNet_mode_none | - | |
| 4584 | || (gCurrent_net_game->type != eNet_game_type_sudden_death | - | |
| 4585 | && gCurrent_net_game->type != eNet_game_type_tag | - | |
| 4586 | && gCurrent_net_game->type != eNet_game_type_fight_to_death)) { | - | |
| 4587 | gOpponent_viewing_mode = 0; | - | |
| 4588 | } else if (!gRace_finished) { | - | |
| 4589 | time_of_death = 0; | - | |
| 4590 | gOpponent_viewing_mode = 0; | - | |
| 4591 | } else if (time_of_death == 0) { | - | |
| 4592 | time_of_death = GetRaceTime(); | - | |
| 4593 | } else { | - | |
| 4594 | if (GetRaceTime() >= time_of_death + 10000) { | - | |
| 4595 | if (gOpponent_viewing_mode == 0) { | - | |
| 4596 | gOpponent_viewing_mode = 1; | - | |
| 4597 | gNet_player_to_view_index = -2; | - | |
| 4598 | ViewNetPlayer(); | - | |
| 4599 |             } | - | |
| 4600 | if (gNet_player_to_view_index >= gNumber_of_net_players) { | - | |
| 4601 | gNet_player_to_view_index = -2; | - | |
| 4602 | ViewNetPlayer(); | - | |
| 4603 |             } | - | |
| 4604 | if (gNet_player_to_view_index < 0 && gCar_to_view != GetRaceLeader()) { | - | |
| 4605 | gNet_player_to_view_index = -2; | - | |
| 4606 | ViewNetPlayer(); | - | |
| 4607 |             } | - | |
| 4608 | if ((GetRaceTime() > headup_timer + 1000 || headup_timer > GetRaceTime()) && gRace_over_reason == eRace_not_over_yet) { | - | |
| 4609 | strcpy(s, GetMiscString(kMiscString_WATCHING)); | - | |
| 4610 | strcat(s, " "); | - | |
| 4611 | if (gNet_player_to_view_index >= 0) { | - | |
| 4612 | strcat(s, gNet_players[gNet_player_to_view_index].player_name); | - | |
| 4613 | } else if (gCurrent_net_game->type == eNet_game_type_tag) { | - | |
| 4614 | strcat(s, GetMiscString(kMiscString_QUOTE_IT_QUOTE)); | - | |
| 4615 | } else { | - | |
| 4616 | strcat(s, GetMiscString(kMiscString_RACE_LEADER)); | - | |
| 4617 | 
 | 4346 | STUB_ONCE(); | 
| 4618 | headup_timer = GetRaceTime(); | - | |
| 4619 | NewTextHeadupSlot(6, 0, 500, -4, s); | - | |
| 4620 |             } | - | |
| 4621 |         } | - | |
| 4622 |     } | - | |
| 4623 | } | 4347 | } | 
| 4624 | 4348 | ||
| 4625 | // IDA: void __cdecl ViewNetPlayer() | 4349 | // IDA: void __cdecl ViewNetPlayer() | 
| 4626 | void ViewNetPlayer(void) { | 4350 | void ViewNetPlayer(void) { | 
| 4627 | LOG_TRACE("()"); | 4351 | LOG_TRACE("()"); | 
| Line 4820... | Line 4544... | ||
| 4820 | 4544 | ||
| 4821 | if (gAction_replay_mode && gAction_replay_camera_mode != eAction_replay_standard && gPed_actor != NULL && !gProgram_state.cockpit_on) { | 4545 | if (gAction_replay_mode && gAction_replay_camera_mode != eAction_replay_standard && gPed_actor != NULL && !gProgram_state.cockpit_on) { | 
| 4822 | IncidentCam(c, pTime); | 4546 | IncidentCam(c, pTime); | 
| 4823 |     } | 4547 |     } | 
| 4824 | } | 4548 | } | 
| - | 4549 | ||
| 4825 | // IDA: int __usercall PossibleRemoveNonCarFromWorld@<EAX>(br_actor *pActor@<EAX>) | 4550 | // IDA: int __usercall PossibleRemoveNonCarFromWorld@<EAX>(br_actor *pActor@<EAX>) | 
| 4826 | int PossibleRemoveNonCarFromWorld(br_actor* pActor) { | 4551 | int PossibleRemoveNonCarFromWorld(br_actor* pActor) { | 
| 4827 |     tU8 cx; | 4552 |     tU8 cx; | 
| 4828 |     tU8 cz; | 4553 |     tU8 cz; | 
| 4829 | tTrack_spec* track_spec; | 4554 | tTrack_spec* track_spec; | 
| Line 5681... | Line 5406... | ||
| 5681 | return i; | 5406 | return i; | 
| 5682 | } | 5407 | } | 
| 5683 | 5408 | ||
| 5684 | // IDA: int __usercall BoundsTest@<EAX>(br_bounds *bnds@<EAX>, br_vector3 *p@<EDX>) | 5409 | // IDA: int __usercall BoundsTest@<EAX>(br_bounds *bnds@<EAX>, br_vector3 *p@<EDX>) | 
| 5685 | int BoundsTest(br_bounds* bnds, br_vector3* p) { | 5410 | int BoundsTest(br_bounds* bnds, br_vector3* p) { | 
| 5686 | 
 | 5411 |     //int j; // Pierre-Marie Baty -- unused variable | 
| 5687 | LOG_TRACE("(%p, %p)", bnds, p); | 5412 | LOG_TRACE("(%p, %p)", bnds, p); | 
| 5688 | - | ||
| 5689 | for (j = 0; j < 3; j++) { | - | |
| 5690 | if (p->v[j] > bnds->max.v[j] || p->v[j] < bnds->min.v[j]) { | - | |
| 5691 | 
 | 5413 | NOT_IMPLEMENTED(); | 
| 5692 |         } | - | |
| 5693 |     } | - | |
| 5694 | return 1; | - | |
| 5695 | } | 5414 | } | 
| 5696 | 5415 | ||
| 5697 | // IDA: int __usercall CollideCameraWithOtherCars@<EAX>(br_vector3 *car_pos@<EAX>, br_vector3 *cam_pos@<EDX>) | 5416 | // IDA: int __usercall CollideCameraWithOtherCars@<EAX>(br_vector3 *car_pos@<EAX>, br_vector3 *cam_pos@<EDX>) | 
| 5698 | int CollideCameraWithOtherCars(br_vector3* car_pos, br_vector3* cam_pos) { | 5417 | int CollideCameraWithOtherCars(br_vector3* car_pos, br_vector3* cam_pos) { | 
| 5699 | 
 | 5418 |     //int i; // Pierre-Marie Baty -- unused variable | 
| 5700 | 
 | 5419 |     //int plane; // Pierre-Marie Baty -- unused variable | 
| 5701 | br_scalar ts | 5420 |     //br_scalar ts; // Pierre-Marie Baty -- unused variable | 
| 5702 | tCar_spec | 5421 |     //tCar_spec* c; // Pierre-Marie Baty -- unused variable | 
| 5703 | br_vector3 tv | 5422 |     //br_vector3 tv; // Pierre-Marie Baty -- unused variable | 
| 5704 | br_vector3 pos_car_space | 5423 |     //br_vector3 pos_car_space; // Pierre-Marie Baty -- unused variable | 
| 5705 | br_vector3 dir | 5424 |     //br_vector3 dir; // Pierre-Marie Baty -- unused variable | 
| 5706 | br_vector3 p | 5425 |     //br_vector3 p; // Pierre-Marie Baty -- unused variable | 
| 5707 | br_vector3 n | 5426 |     //br_vector3 n; // Pierre-Marie Baty -- unused variable | 
| 5708 | br_bounds bnds | 5427 |     //br_bounds bnds; // Pierre-Marie Baty -- unused variable | 
| 5709 | LOG_TRACE("(%p, %p)", car_pos, cam_pos); | 5428 | LOG_TRACE("(%p, %p)", car_pos, cam_pos); | 
| 5710 | 5429 | ||
| 5711 | for (i = 0; i < gNum_cars_and_non_cars; i++) { | - | |
| 5712 | if (BoundsTest(&gActive_car_list[i]->bounds_world_space, cam_pos)) { | - | |
| 5713 | c = gActive_car_list[i]; | - | |
| 5714 | BrVector3Sub(&tv, cam_pos, &c->car_master_actor->t.t.translate.t); | - | |
| 5715 | BrMatrix34TApplyV(&p, &tv, &c->car_master_actor->t.t.mat); | - | |
| 5716 | if (BoundsTest(&c->bounds[0], &p)) { | - | |
| 5717 | BrVector3Sub(&tv, cam_pos, car_pos); | - | |
| 5718 | BrMatrix34TApplyV(&dir, &tv, &c->car_master_actor->t.t.mat); | - | |
| 5719 | BrVector3Add(&pos_car_space, &p, &dir); | - | |
| 5720 | BrVector3SetFloat(&tv, 0.03f, 0.03f, 0.03f); | - | |
| 5721 | BrVector3Sub(&bnds.min, &c->bounds[0].min, &tv); | - | |
| 5722 | BrVector3Add(&bnds.max, &c->bounds[0].max, &tv); | - | |
| 5723 | plane = LineBoxColl(&pos_car_space, &p, &bnds, &tv); | - | |
| 5724 | BrMatrix34ApplyP(cam_pos, &tv, &c->car_master_actor->t.t.mat); | - | |
| 5725 | return 1; | - | |
| 5726 | 
 | 5430 | STUB_ONCE(); | 
| 5727 |         } | - | |
| 5728 |     } | - | |
| 5729 | return 0; | 5431 | return 0; | 
| 5730 | } | 5432 | } | 
| 5731 | 5433 | ||
| 5732 | // IDA: void __cdecl InitialiseExternalCamera() | 5434 | // IDA: void __cdecl InitialiseExternalCamera() | 
| 5733 | void InitialiseExternalCamera(void) { | 5435 | void InitialiseExternalCamera(void) { |