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) { |