Subversion Repositories Games.Carmageddon

Rev

Rev 1 | Rev 20 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1 Rev 18
Line 2... Line 2...
2
 
2
 
3
#include "car.h"
3
#include "car.h"
4
#include "brender/brender.h"
4
#include "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"
32
#include "trig.h"
33
#include "trig.h"
33
#include "utility.h"
34
#include "utility.h"
34
#include "world.h"
35
#include "world.h"
35
#include <math.h>
36
#include <math.h>
36
#include <stdlib.h>
37
#include <stdlib.h>
Line 884... Line 885...
884
        if (fabsf(c->curvature) > c->maxcurve / 2.0f && c->gear < 2 && c->gear && c->traction_control) {
885
        if (fabsf(c->curvature) > c->maxcurve / 2.0f && c->gear < 2 && c->gear && c->traction_control) {
885
            ts = 0.7f;
886
            ts = 0.7f;
886
        } else if (c->joystick.acc < 0) {
887
        } else if (c->joystick.acc < 0) {
887
            ts = (br_scalar) 1.2; // Pierre-Marie Baty -- added type cast
888
            ts = (br_scalar) 1.2; // Pierre-Marie Baty -- added type cast
888
        } else {
889
        } else {
889
            ts = c->joystick.acc / 54613.0;
890
            ts = c->joystick.acc / 54613.0f;
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
    //int j; // Pierre-Marie Baty -- unused variable
1084
    int j;
1085
    //float amount; // Pierre-Marie Baty -- unused variable
1085
    float amount;
1086
    //br_scalar total_deflection; // Pierre-Marie Baty -- unused variable
1086
    br_scalar total_deflection;
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);
1088
    NOT_IMPLEMENTED();
1124
            } else {
-
 
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;
1089
}
1151
}
1090
 
1152
 
1091
// IDA: void __usercall ApplyPhysicsToCars(tU32 last_frame_time@<EAX>, tU32 pTime_difference@<EDX>)
1153
// IDA: void __usercall ApplyPhysicsToCars(tU32 last_frame_time@<EAX>, tU32 pTime_difference@<EDX>)
1092
void ApplyPhysicsToCars(tU32 last_frame_time, tU32 pTime_difference) {
1154
void ApplyPhysicsToCars(tU32 last_frame_time, tU32 pTime_difference) {
1093
    //br_vector3 minus_k; // Pierre-Marie Baty -- unused variable
1155
    //br_vector3 minus_k; // Pierre-Marie Baty -- unused variable
Line 1134... Line 1196...
1134
            BrVector3Copy(&gCar_to_view->old_v, &gCar_to_view->v);
1196
            BrVector3Copy(&gCar_to_view->old_v, &gCar_to_view->v);
1135
        }
1197
        }
1136
        for (i = 0; i < gNum_active_cars; i++) {
1198
        for (i = 0; i < gNum_active_cars; i++) {
1137
            car = gActive_car_list[i];
1199
            car = gActive_car_list[i];
1138
            car->dt = -1.f;
1200
            car->dt = -1.f;
1139
            if (car->message.type == 15 && car->message.time >= gLast_mechanics_time && gLast_mechanics_time + harness_game_config.physics_step_time >= car->message.time) {
1201
            if (car->message.type == NETMSGID_MECHANICS && car->message.time >= gLast_mechanics_time && car->message.time <= gLast_mechanics_time + harness_game_config.physics_step_time) {
-
 
1202
                // time between car message and next mechanics
1140
                car->dt = (double)(gLast_mechanics_time + harness_game_config.physics_step_time - car->message.time) / 1000.0;
1203
                car->dt = (gLast_mechanics_time + harness_game_config.physics_step_time - car->message.time) / 1000.0f;
-
 
1204
                // if the time between car message and next mechanics is about equal to timestep
1141
                if (gDt - 0.0001f <= car->dt) {
1205
                if (car->dt >= gDt - 0.0001f) {
1142
                    GetNetPos(car);
1206
                    GetNetPos(car);
1143
                } else if (gNet_mode == eNet_mode_host) {
1207
                } else if (gNet_mode == eNet_mode_host) {
1144
                    car->dt = -1.f;
1208
                    car->dt = -1.f;
1145
                } else {
1209
                } else {
1146
                    for (dam_index = 0; dam_index < COUNT_OF(car->damage_units); dam_index++) {
1210
                    for (dam_index = 0; dam_index < COUNT_OF(car->damage_units); dam_index++) {
Line 1168... Line 1232...
1168
        }
1232
        }
1169
        for (i = 0; i < gNum_active_non_cars; i++) {
1233
        for (i = 0; i < gNum_active_non_cars; i++) {
1170
            non_car = gActive_non_car_list[i];
1234
            non_car = gActive_non_car_list[i];
1171
            if (!non_car->collision_info.doing_nothing_flag) {
1235
            if (!non_car->collision_info.doing_nothing_flag) {
1172
                non_car->collision_info.dt = -1.f;
1236
                non_car->collision_info.dt = -1.f;
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) {
1237
                if (non_car->collision_info.message.type == NETMSGID_NONCAR_INFO && non_car->collision_info.message.time >= gLast_mechanics_time && gLast_mechanics_time + harness_game_config.physics_step_time >= non_car->collision_info.message.time) {
1174
                    non_car->collision_info.dt = (gLast_mechanics_time + harness_game_config.physics_step_time - non_car->collision_info.message.time) / 1000.0f;
1238
                    non_car->collision_info.dt = (gLast_mechanics_time + harness_game_config.physics_step_time - non_car->collision_info.message.time) / 1000.0f;
1175
                    GetNetPos((tCar_spec*)non_car);
1239
                    GetNetPos((tCar_spec*)non_car);
1176
                }
1240
                }
1177
                if (non_car->collision_info.box_face_ref != gFace_num__car
1241
                if (non_car->collision_info.box_face_ref != gFace_num__car
1178
                    && (non_car->collision_info.box_face_ref != gFace_num__car - 1
1242
                    && (non_car->collision_info.box_face_ref != gFace_num__car - 1
Line 1420... Line 1484...
1420
// IDA: void __cdecl ToggleControls()
1484
// IDA: void __cdecl ToggleControls()
1421
void ToggleControls(void) {
1485
void ToggleControls(void) {
1422
    LOG_TRACE("()");
1486
    LOG_TRACE("()");
1423
 
1487
 
1424
    gControl__car++;
1488
    gControl__car++;
1425
    if (ControlCar[gControl__car] == 0) {
1489
    if (ControlCar[gControl__car] == NULL) {
1426
        gControl__car = 0;
1490
        gControl__car = 0;
1427
    }
1491
    }
1428
    switch (gControl__car) {
1492
    switch (gControl__car) {
1429
    case 0:
1493
    case 0:
1430
        NewTextHeadupSlot(4, 0, 500, -1, "Original Controls");
1494
        NewTextHeadupSlot(4, 0, 500, -1, "Original Controls");
Line 1445... Line 1509...
1445
}
1509
}
1446
 
1510
 
1447
// IDA: void __usercall ControlCar2(tCar_spec *c@<EAX>, br_scalar dt)
1511
// IDA: void __usercall ControlCar2(tCar_spec *c@<EAX>, br_scalar dt)
1448
void ControlCar2(tCar_spec* c, br_scalar dt) {
1512
void ControlCar2(tCar_spec* c, br_scalar dt) {
1449
    LOG_TRACE("(%p, %f)", c, dt);
1513
    LOG_TRACE("(%p, %f)", c, dt);
-
 
1514
 
1450
    NOT_IMPLEMENTED();
1515
    c->acc_force = 0.f;
-
 
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
    }
1451
}
1552
}
1452
 
1553
 
1453
// IDA: void __usercall ControlCar3(tCar_spec *c@<EAX>, br_scalar dt)
1554
// IDA: void __usercall ControlCar3(tCar_spec *c@<EAX>, br_scalar dt)
1454
void ControlCar3(tCar_spec* c, br_scalar dt) {
1555
void ControlCar3(tCar_spec* c, br_scalar dt) {
1455
    LOG_TRACE("(%p, %f)", c, dt);
1556
    LOG_TRACE("(%p, %f)", c, dt);
-
 
1557
 
1456
    NOT_IMPLEMENTED();
1558
    if (c->keys.left) {
-
 
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
    }
1457
}
1589
}
1458
 
1590
 
1459
// IDA: void __usercall ControlCar4(tCar_spec *c@<EAX>, br_scalar dt)
1591
// IDA: void __usercall ControlCar4(tCar_spec *c@<EAX>, br_scalar dt)
1460
void ControlCar4(tCar_spec* c, br_scalar dt) {
1592
void ControlCar4(tCar_spec* c, br_scalar dt) {
1461
    //br_scalar ts; // Pierre-Marie Baty -- unused variable
1593
    //br_scalar ts; // Pierre-Marie Baty -- unused variable
Line 1511... Line 1643...
1511
}
1643
}
1512
 
1644
 
1513
// IDA: void __usercall ControlCar5(tCar_spec *c@<EAX>, br_scalar dt)
1645
// IDA: void __usercall ControlCar5(tCar_spec *c@<EAX>, br_scalar dt)
1514
void ControlCar5(tCar_spec* c, br_scalar dt) {
1646
void ControlCar5(tCar_spec* c, br_scalar dt) {
1515
    LOG_TRACE("(%p, %f)", c, dt);
1647
    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
    }
1516
    NOT_IMPLEMENTED();
1697
    c->keys.left = 1;
1517
}
1698
}
1518
 
1699
 
1519
// IDA: void __usercall ControlCar1(tCar_spec *c@<EAX>, br_scalar dt)
1700
// IDA: void __usercall ControlCar1(tCar_spec *c@<EAX>, br_scalar dt)
1520
void ControlCar1(tCar_spec* c, br_scalar dt) {
1701
void ControlCar1(tCar_spec* c, br_scalar dt) {
1521
    LOG_TRACE("(%p, %f)", c, dt);
1702
    LOG_TRACE("(%p, %f)", c, dt);
-
 
1703
 
1522
    NOT_IMPLEMENTED();
1704
    c->acc_force = 0.f;
-
 
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
    }
1523
}
1731
}
1524
 
1732
 
1525
// IDA: void __usercall setrotate(br_vector3 *wdt@<EAX>, br_matrix34 *m@<EDX>)
1733
// IDA: void __usercall setrotate(br_vector3 *wdt@<EAX>, br_matrix34 *m@<EDX>)
1526
void setrotate(br_vector3* wdt, br_matrix34* m) {
1734
void setrotate(br_vector3* wdt, br_matrix34* m) {
1527
    //br_euler e; // Pierre-Marie Baty -- unused variable
1735
    br_euler e;
1528
    LOG_TRACE("(%p, %p)", wdt, m);
1736
    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;
1529
    NOT_IMPLEMENTED();
1742
    BrEulerToMatrix34(m, &e);
1530
}
1743
}
1531
 
1744
 
1532
// IDA: void __usercall RotateCar2(tCollision_info *c@<EAX>, br_scalar dt)
1745
// IDA: void __usercall RotateCar2(tCollision_info *c@<EAX>, br_scalar dt)
1533
void RotateCar2(tCollision_info* c, br_scalar dt) {
1746
void RotateCar2(tCollision_info* c, br_scalar dt) {
1534
    //br_vector3 wdt; // Pierre-Marie Baty -- unused variable
1747
    br_vector3 wdt;
1535
    //br_vector3 wdt2; // Pierre-Marie Baty -- unused variable
1748
    br_vector3 wdt2;
1536
    //br_vector3 L; // Pierre-Marie Baty -- unused variable
1749
    br_vector3 L;
1537
    //br_vector3 L2; // Pierre-Marie Baty -- unused variable
1750
    br_vector3 L2;
1538
    //br_matrix34 m; // Pierre-Marie Baty -- unused variable
1751
    br_matrix34 m;
1539
    LOG_TRACE("(%p, %f)", c, dt);
1752
    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);
1540
    NOT_IMPLEMENTED();
1759
    setrotate(&wdt, &m);
-
 
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);
1541
}
1765
}
1542
 
1766
 
1543
// IDA: void __usercall RotateCarSecondOrder(tCollision_info *c@<EAX>, br_scalar dt)
1767
// IDA: void __usercall RotateCarSecondOrder(tCollision_info *c@<EAX>, br_scalar dt)
1544
void RotateCarSecondOrder(tCollision_info* c, br_scalar dt) {
1768
void RotateCarSecondOrder(tCollision_info* c, br_scalar dt) {
1545
    br_vector3 L;
1769
    br_vector3 L;
Line 4326... Line 4550...
4326
    MungeCarGraphics(gFrame_period);
4550
    MungeCarGraphics(gFrame_period);
4327
}
4551
}
4328
 
4552
 
4329
// IDA: tCar_spec* __cdecl GetRaceLeader()
4553
// IDA: tCar_spec* __cdecl GetRaceLeader()
4330
tCar_spec* GetRaceLeader(void) {
4554
tCar_spec* GetRaceLeader(void) {
4331
    //int i; // Pierre-Marie Baty -- unused variable
4555
    int i;
4332
    //int score; // Pierre-Marie Baty -- unused variable
4556
    int score;
4333
    //tCar_spec* car; // Pierre-Marie Baty -- unused variable
4557
    tCar_spec* car;
4334
    LOG_TRACE("()");
4558
    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
    }
4335
    NOT_IMPLEMENTED();
4572
    return car;
4336
}
4573
}
4337
 
4574
 
4338
// IDA: void __cdecl AmIGettingBoredWatchingCameraSpin()
4575
// IDA: void __cdecl AmIGettingBoredWatchingCameraSpin()
4339
void AmIGettingBoredWatchingCameraSpin(void) {
4576
void AmIGettingBoredWatchingCameraSpin(void) {
4340
    //static tU32 time_of_death; // Pierre-Marie Baty -- unused variable
4577
    static tU32 time_of_death;
4341
    //static tU32 headup_timer; // Pierre-Marie Baty -- unused variable
4578
    static tU32 headup_timer;
4342
    //tCar_spec* car; // Pierre-Marie Baty -- unused variable
4579
    tCar_spec* car;
4343
    //char s[256]; // Pierre-Marie Baty -- unused variable
4580
    char s[256];
4344
    LOG_TRACE("()");
4581
    LOG_TRACE("()");
4345
 
4582
 
-
 
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));
4346
    STUB_ONCE();
4617
                }
-
 
4618
                headup_timer = GetRaceTime();
-
 
4619
                NewTextHeadupSlot(6, 0, 500, -4, s);
-
 
4620
            }
-
 
4621
        }
-
 
4622
    }
4347
}
4623
}
4348
 
4624
 
4349
// IDA: void __cdecl ViewNetPlayer()
4625
// IDA: void __cdecl ViewNetPlayer()
4350
void ViewNetPlayer(void) {
4626
void ViewNetPlayer(void) {
4351
    LOG_TRACE("()");
4627
    LOG_TRACE("()");
Line 4544... Line 4820...
4544
 
4820
 
4545
    if (gAction_replay_mode && gAction_replay_camera_mode != eAction_replay_standard && gPed_actor != NULL && !gProgram_state.cockpit_on) {
4821
    if (gAction_replay_mode && gAction_replay_camera_mode != eAction_replay_standard && gPed_actor != NULL && !gProgram_state.cockpit_on) {
4546
        IncidentCam(c, pTime);
4822
        IncidentCam(c, pTime);
4547
    }
4823
    }
4548
}
4824
}
4549
 
-
 
4550
// IDA: int __usercall PossibleRemoveNonCarFromWorld@<EAX>(br_actor *pActor@<EAX>)
4825
// IDA: int __usercall PossibleRemoveNonCarFromWorld@<EAX>(br_actor *pActor@<EAX>)
4551
int PossibleRemoveNonCarFromWorld(br_actor* pActor) {
4826
int PossibleRemoveNonCarFromWorld(br_actor* pActor) {
4552
    tU8 cx;
4827
    tU8 cx;
4553
    tU8 cz;
4828
    tU8 cz;
4554
    tTrack_spec* track_spec;
4829
    tTrack_spec* track_spec;
Line 5406... Line 5681...
5406
    return i;
5681
    return i;
5407
}
5682
}
5408
 
5683
 
5409
// IDA: int __usercall BoundsTest@<EAX>(br_bounds *bnds@<EAX>, br_vector3 *p@<EDX>)
5684
// IDA: int __usercall BoundsTest@<EAX>(br_bounds *bnds@<EAX>, br_vector3 *p@<EDX>)
5410
int BoundsTest(br_bounds* bnds, br_vector3* p) {
5685
int BoundsTest(br_bounds* bnds, br_vector3* p) {
5411
    //int j; // Pierre-Marie Baty -- unused variable
5686
    int j;
5412
    LOG_TRACE("(%p, %p)", bnds, p);
5687
    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]) {
5413
    NOT_IMPLEMENTED();
5691
            return 0;
-
 
5692
        }
-
 
5693
    }
-
 
5694
    return 1;
5414
}
5695
}
5415
 
5696
 
5416
// IDA: int __usercall CollideCameraWithOtherCars@<EAX>(br_vector3 *car_pos@<EAX>, br_vector3 *cam_pos@<EDX>)
5697
// IDA: int __usercall CollideCameraWithOtherCars@<EAX>(br_vector3 *car_pos@<EAX>, br_vector3 *cam_pos@<EDX>)
5417
int CollideCameraWithOtherCars(br_vector3* car_pos, br_vector3* cam_pos) {
5698
int CollideCameraWithOtherCars(br_vector3* car_pos, br_vector3* cam_pos) {
5418
    //int i; // Pierre-Marie Baty -- unused variable
5699
    int i;
5419
    //int plane; // Pierre-Marie Baty -- unused variable
5700
    int plane;
5420
    //br_scalar ts; // Pierre-Marie Baty -- unused variable
5701
    br_scalar ts;
5421
    //tCar_spec* c; // Pierre-Marie Baty -- unused variable
5702
    tCar_spec* c;
5422
    //br_vector3 tv; // Pierre-Marie Baty -- unused variable
5703
    br_vector3 tv;
5423
    //br_vector3 pos_car_space; // Pierre-Marie Baty -- unused variable
5704
    br_vector3 pos_car_space;
5424
    //br_vector3 dir; // Pierre-Marie Baty -- unused variable
5705
    br_vector3 dir;
5425
    //br_vector3 p; // Pierre-Marie Baty -- unused variable
5706
    br_vector3 p;
5426
    //br_vector3 n; // Pierre-Marie Baty -- unused variable
5707
    br_vector3 n;
5427
    //br_bounds bnds; // Pierre-Marie Baty -- unused variable
5708
    br_bounds bnds;
5428
    LOG_TRACE("(%p, %p)", car_pos, cam_pos);
5709
    LOG_TRACE("(%p, %p)", car_pos, cam_pos);
5429
 
5710
 
-
 
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;
5430
    STUB_ONCE();
5726
            }
-
 
5727
        }
-
 
5728
    }
5431
    return 0;
5729
    return 0;
5432
}
5730
}
5433
 
5731
 
5434
// IDA: void __cdecl InitialiseExternalCamera()
5732
// IDA: void __cdecl InitialiseExternalCamera()
5435
void InitialiseExternalCamera(void) {
5733
void InitialiseExternalCamera(void) {