Subversion Repositories Games.Carmageddon

Rev

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 1... Line 1...
1
#include "pedestrn.h"
1
#include "pedestrn.h"
2
#include "brender.h"
2
#include "brender/brender.h"
3
#include "car.h"
3
#include "car.h"
4
#include "constants.h"
4
#include "constants.h"
5
#include "displays.h"
5
#include "displays.h"
6
#include "errors.h"
6
#include "errors.h"
7
#include "globvars.h"
7
#include "globvars.h"
Line 17... Line 17...
17
#include "piping.h"
17
#include "piping.h"
18
#include "powerup.h"
18
#include "powerup.h"
19
#include "pratcam.h"
19
#include "pratcam.h"
20
#include "raycast.h"
20
#include "raycast.h"
21
#include "replay.h"
21
#include "replay.h"
22
#include "shortcut.h"
-
 
23
#include "sound.h"
22
#include "sound.h"
24
#include "spark.h"
23
#include "spark.h"
25
#include "structur.h"
24
#include "structur.h"
26
#include "trig.h"
25
#include "trig.h"
27
#include "utility.h"
26
#include "utility.h"
Line 436... Line 435...
436
            BrActorRemove(the_ped_gib->actor);
435
            BrActorRemove(the_ped_gib->actor);
437
        }
436
        }
438
        BrActorAdd(pPedestrian->actor, the_ped_gib->actor);
437
        BrActorAdd(pPedestrian->actor, the_ped_gib->actor);
439
        the_ped_gib->actor->render_style = BR_RSTYLE_FACES;
438
        the_ped_gib->actor->render_style = BR_RSTYLE_FACES;
440
        BrMatrix34Identity(&the_ped_gib->actor->t.t.mat);
439
        BrMatrix34Identity(&the_ped_gib->actor->t.t.mat);
441
        the_ped_gib->actor->t.t.translate.t.v[Y] += pPedestrian->actor->t.t.mat.m[1][1] * 2.f / (pPedestrian->height2 * 3.f);
440
        the_ped_gib->actor->t.t.translate.t.v[V_Y] += pPedestrian->actor->t.t.mat.m[1][1] * 2.f / (pPedestrian->height2 * 3.f);
442
        the_ped_gib->actor->t.t.translate.t.v[Z] = 0.01f;
441
        the_ped_gib->actor->t.t.translate.t.v[V_Z] = 0.01f;
443
        the_ped_gib->actor->material = gPed_gib_materials[0].materials[0];
442
        the_ped_gib->actor->material = gPed_gib_materials[0].materials[0];
444
        the_ped_gib->gib_index = 0;
443
        the_ped_gib->gib_index = 0;
445
        the_ped_gib->parent_index = GET_PEDESTRIAN_INDEX(pPedestrian);
444
        the_ped_gib->parent_index = GET_PEDESTRIAN_INDEX(pPedestrian);
446
        MungeModelSize(the_ped_gib->actor, gExploding_ped_scale[0]);
445
        MungeModelSize(the_ped_gib->actor, gExploding_ped_scale[0]);
447
        exploded = 1;
446
        exploded = 1;
Line 478... Line 477...
478
            BrActorRemove(the_ped_gib->actor);
477
            BrActorRemove(the_ped_gib->actor);
479
        }
478
        }
480
        BrActorAdd(pPedestrian->actor, the_ped_gib->actor);
479
        BrActorAdd(pPedestrian->actor, the_ped_gib->actor);
481
        the_ped_gib->actor->render_style = BR_RSTYLE_FACES;
480
        the_ped_gib->actor->render_style = BR_RSTYLE_FACES;
482
        BrMatrix34Identity(&the_ped_gib->actor->t.t.mat);
481
        BrMatrix34Identity(&the_ped_gib->actor->t.t.mat);
483
        the_ped_gib->actor->t.t.translate.t.v[Y] += pPedestrian->actor->t.t.mat.m[1][1] / (pPedestrian->height2 * 2.f);
482
        the_ped_gib->actor->t.t.translate.t.v[V_Y] += pPedestrian->actor->t.t.mat.m[1][1] / (pPedestrian->height2 * 2.f);
484
        do {
483
        do {
485
            next_gib_index = IRandomBetween(0, gPed_gib_materials[the_ped_gib->size].count - 1);
484
            next_gib_index = IRandomBetween(0, gPed_gib_materials[the_ped_gib->size].count - 1);
486
        } while (gPed_gib_maxes[the_ped_gib->size][next_gib_index] <= gPed_gib_counts[the_ped_gib->size][next_gib_index]);
485
        } while (gPed_gib_maxes[the_ped_gib->size][next_gib_index] <= gPed_gib_counts[the_ped_gib->size][next_gib_index]);
487
        gPed_gib_counts[the_ped_gib->size][next_gib_index]++;
486
        gPed_gib_counts[the_ped_gib->size][next_gib_index]++;
488
        the_ped_gib->actor->material = gPed_gib_materials[the_ped_gib->size].materials[next_gib_index];
487
        the_ped_gib->actor->material = gPed_gib_materials[the_ped_gib->size].materials[next_gib_index];
Line 570... Line 569...
570
                } else {
569
                } else {
571
                    the_ped_gib->actor->t.t.mat.m[0][0] = -1.f / pedestrian->width;
570
                    the_ped_gib->actor->t.t.mat.m[0][0] = -1.f / pedestrian->width;
572
                    the_ped_gib->actor->t.t.mat.m[1][1] = -1.f / pedestrian->height2;
571
                    the_ped_gib->actor->t.t.mat.m[1][1] = -1.f / pedestrian->height2;
573
                }
572
                }
574
 
573
 
575
                the_ped_gib->actor->t.t.translate.t.v[X] += the_ped_gib->x_speed * pFrame_period / pedestrian->width;
574
                the_ped_gib->actor->t.t.translate.t.v[V_X] += the_ped_gib->x_speed * pFrame_period / pedestrian->width;
576
                the_ped_gib->actor->t.t.translate.t.v[Y] += the_ped_gib->y_speed * pFrame_period / pedestrian->height2;
575
                the_ped_gib->actor->t.t.translate.t.v[V_Y] += the_ped_gib->y_speed * pFrame_period / pedestrian->height2;
577
                the_ped_gib->y_speed -= gFrame_period * gGravity_multiplier * 1.420289855072464e-6;
576
                the_ped_gib->y_speed -= gFrame_period * gGravity_multiplier * 1.420289855072464e-6;
578
                AddPedGibToPipingSession(i, &the_ped_gib->actor->t.t.mat, the_ped_gib->size, the_ped_gib->gib_index, the_ped_gib->parent_index);
577
                AddPedGibToPipingSession(i, &the_ped_gib->actor->t.t.mat, the_ped_gib->size, the_ped_gib->gib_index, the_ped_gib->parent_index);
579
            }
578
            }
580
        } else if (the_ped_gib->size == 0) {
579
        } else if (the_ped_gib->size == 0) {
581
            frame = (the_time - the_ped_gib->start_time) / 100 - 1;
580
            frame = (the_time - the_ped_gib->start_time) / 100 - 1;
Line 588... Line 587...
588
            if (frame < gPed_gib_materials[0].count) {
587
            if (frame < gPed_gib_materials[0].count) {
589
                the_ped_gib->actor->t.t.mat.m[0][0] = 1.f / gPedestrian_array[the_ped_gib->parent_index].width;
588
                the_ped_gib->actor->t.t.mat.m[0][0] = 1.f / gPedestrian_array[the_ped_gib->parent_index].width;
590
                the_ped_gib->actor->t.t.mat.m[1][1] = 1.f / gPedestrian_array[the_ped_gib->parent_index].height2;
589
                the_ped_gib->actor->t.t.mat.m[1][1] = 1.f / gPedestrian_array[the_ped_gib->parent_index].height2;
591
                the_ped_gib->actor->material = gPed_gib_materials[0].materials[frame];
590
                the_ped_gib->actor->material = gPed_gib_materials[0].materials[frame];
592
                MungeModelSize(the_ped_gib->actor, gExploding_ped_scale[frame]);
591
                MungeModelSize(the_ped_gib->actor, gExploding_ped_scale[frame]);
593
                if (frame == 1 && the_ped_gib->actor->t.t.translate.t.v[Z] == 0.01f) {
592
                if (frame == 1 && the_ped_gib->actor->t.t.translate.t.v[V_Z] == 0.01f) {
594
                    the_ped_gib->actor->t.t.translate.t.v[Z] = -0.01f;
593
                    the_ped_gib->actor->t.t.translate.t.v[V_Z] = -0.01f;
595
                }
594
                }
596
                AddPedGibToPipingSession(i, &the_ped_gib->actor->t.t.mat, the_ped_gib->size, frame, the_ped_gib->parent_index);
595
                AddPedGibToPipingSession(i, &the_ped_gib->actor->t.t.mat, the_ped_gib->size, frame, the_ped_gib->parent_index);
597
            } else {
596
            } else {
598
                the_ped_gib->size = -1;
597
                the_ped_gib->size = -1;
599
                BrActorRemove(the_ped_gib->actor);
598
                BrActorRemove(the_ped_gib->actor);
Line 700... Line 699...
700
        pPedestrian->irreversable = 1;
699
        pPedestrian->irreversable = 1;
701
        // fall through
700
        // fall through
702
    case ePed_instruc_point:
701
    case ePed_instruc_point:
703
        BrVector3Copy(&pPedestrian->to_pos, &instruction->data.point_data.position);
702
        BrVector3Copy(&pPedestrian->to_pos, &instruction->data.point_data.position);
704
        BrVector3Sub(&pPedestrian->direction, &pPedestrian->to_pos, &pPedestrian->actor->t.t.translate.t);
703
        BrVector3Sub(&pPedestrian->direction, &pPedestrian->to_pos, &pPedestrian->actor->t.t.translate.t);
705
        if (pPedestrian->to_pos.v[Y] >= 500.f) {
704
        if (pPedestrian->to_pos.v[V_Y] >= 500.f) {
706
            pPedestrian->direction.v[Y] = 0.f;
705
            pPedestrian->direction.v[V_Y] = 0.f;
707
        }
706
        }
708
        if (Vector3IsZero(&pPedestrian->direction) && instruction != gInitial_instruction) {
707
        if (Vector3IsZero(&pPedestrian->direction) && instruction != gInitial_instruction) {
709
            if (gInitial_instruction == NULL) {
708
            if (gInitial_instruction == NULL) {
710
                gInitial_instruction = instruction;
709
                gInitial_instruction = instruction;
711
            }
710
            }
Line 814... Line 813...
814
    return result;
813
    return result;
815
}
814
}
816
 
815
 
817
// IDA: void __usercall MungePedestrianSequence(tPedestrian_data *pPedestrian@<EAX>, int pAction_changed@<EDX>)
816
// IDA: void __usercall MungePedestrianSequence(tPedestrian_data *pPedestrian@<EAX>, int pAction_changed@<EDX>)
818
void MungePedestrianSequence(tPedestrian_data* pPedestrian, int pAction_changed) {
817
void MungePedestrianSequence(tPedestrian_data* pPedestrian, int pAction_changed) {
819
    tPedestrian_action* the_action;
818
    //tPedestrian_action* the_action; // Pierre-Marie Baty -- unused variable
820
    int i;
819
    int i;
821
    int the_sequence;
820
    int the_sequence;
822
    int current_looping;
821
    int current_looping;
823
    br_scalar ped_movement_angle;
822
    br_scalar ped_movement_angle;
824
    float heading_difference;
823
    float heading_difference;
825
    tPedestrian_sequence* sequence_ptr;
824
    tPedestrian_sequence* sequence_ptr;
826
    LOG_TRACE("(%p, %d)", pPedestrian, pAction_changed);
825
    LOG_TRACE("(%p, %d)", pPedestrian, pAction_changed);
827
 
826
 
828
    if (pPedestrian->ref_number < 100) {
827
    if (pPedestrian->ref_number < 100) {
829
        ped_movement_angle = FastScalarArcTan2(pPedestrian->direction.v[X], pPedestrian->direction.v[Z]);
828
        ped_movement_angle = FastScalarArcTan2(pPedestrian->direction.v[V_X], pPedestrian->direction.v[V_Z]);
830
        if (ped_movement_angle < pPedestrian->car_to_ped) {
829
        if (ped_movement_angle < pPedestrian->car_to_ped) {
831
            ped_movement_angle += 360.f;
830
            ped_movement_angle += 360.f;
832
        }
831
        }
833
        heading_difference = ped_movement_angle - pPedestrian->car_to_ped;
832
        heading_difference = ped_movement_angle - pPedestrian->car_to_ped;
834
    } else {
833
    } else {
Line 866... Line 865...
866
 
865
 
867
    if (pPedestrian->actor->parent != gDont_render_actor) {
866
    if (pPedestrian->actor->parent != gDont_render_actor) {
868
        BrActorRelink(gDont_render_actor, pPedestrian->actor);
867
        BrActorRelink(gDont_render_actor, pPedestrian->actor);
869
        pPedestrian->actor->render_style = BR_RSTYLE_NONE;
868
        pPedestrian->actor->render_style = BR_RSTYLE_NONE;
870
        pPedestrian->mid_air = 1;
869
        pPedestrian->mid_air = 1;
871
        if (pPedestrian->to_pos.v[Y] < 500.f) {
870
        if (pPedestrian->to_pos.v[V_Y] < 500.f) {
872
            pPedestrian->to_pos.v[Y] += 1000.4f;
871
            pPedestrian->to_pos.v[V_Y] += 1000.4f;
873
        }
872
        }
874
        BrVector3Set(&pPedestrian->offset, 0.f, 0.f, 0.f);
873
        BrVector3Set(&pPedestrian->offset, 0.f, 0.f, 0.f);
875
    }
874
    }
876
}
875
}
877
 
876
 
Line 1044... Line 1043...
1044
 
1043
 
1045
    old_parent = NULL;
1044
    old_parent = NULL;
1046
    CalcPedWidthNHeight(pPedestrian, pPedestrian->colour_map, &pPedestrian->height2, &pPedestrian->width);
1045
    CalcPedWidthNHeight(pPedestrian, pPedestrian->colour_map, &pPedestrian->height2, &pPedestrian->width);
1047
    the_frame = &pPedestrian->sequences[pPedestrian->current_sequence].frames[MAX(pPedestrian->current_frame, 0)];
1046
    the_frame = &pPedestrian->sequences[pPedestrian->current_sequence].frames[MAX(pPedestrian->current_frame, 0)];
1048
    if (pPedestrian->ref_number >= 100 && pPedestrian->current_action == pPedestrian->fatal_car_impact_action) {
1047
    if (pPedestrian->ref_number >= 100 && pPedestrian->current_action == pPedestrian->fatal_car_impact_action) {
1049
        x_offset = the_frame->offset.v[X] * 2.0f;
1048
        x_offset = the_frame->offset.v[V_X] * 2.0f;
1050
        y_offset = the_frame->offset.v[Y];
1049
        y_offset = the_frame->offset.v[V_Y];
1051
        pPedestrian->height2 *= 2.0f;
1050
        pPedestrian->height2 *= 2.0f;
1052
        pPedestrian->width *= 2.0f;
1051
        pPedestrian->width *= 2.0f;
1053
    } else {
1052
    } else {
1054
        x_offset = the_frame->offset.v[X];
1053
        x_offset = the_frame->offset.v[V_X];
1055
        y_offset = the_frame->offset.v[Y];
1054
        y_offset = the_frame->offset.v[V_Y];
1056
    }
1055
    }
1057
    pPedestrian->flipped = the_frame->flipped;
1056
    pPedestrian->flipped = the_frame->flipped;
1058
    if (pPedestrian->actor->parent != gDont_render_actor) {
1057
    if (pPedestrian->actor->parent != gDont_render_actor) {
1059
        old_parent = pPedestrian->actor->parent;
1058
        old_parent = pPedestrian->actor->parent;
1060
        BrActorRelink(gDont_render_actor, pPedestrian->actor);
1059
        BrActorRelink(gDont_render_actor, pPedestrian->actor);
Line 1082... Line 1081...
1082
                        / (br_scalar)(pPedestrian->sequences[pPedestrian->current_sequence].looping_frame_start - 1) * 180.0f))
1081
                        / (br_scalar)(pPedestrian->sequences[pPedestrian->current_sequence].looping_frame_start - 1) * 180.0f))
1083
            * pPedestrian->jump_magnitude;
1082
            * pPedestrian->jump_magnitude;
1084
    }
1083
    }
1085
    if (old_parent != NULL) {
1084
    if (old_parent != NULL) {
1086
        BrMatrix34PostTranslate(&pPedestrian->actor->t.t.mat,
1085
        BrMatrix34PostTranslate(&pPedestrian->actor->t.t.mat,
1087
            old_parent->t.t.translate.t.v[X] + x_offset,
1086
            old_parent->t.t.translate.t.v[V_X] + x_offset,
1088
            old_parent->t.t.translate.t.v[Y] + y_offset,
1087
            old_parent->t.t.translate.t.v[V_Y] + y_offset,
1089
            old_parent->t.t.translate.t.v[Z]);
1088
            old_parent->t.t.translate.t.v[V_Z]);
1090
        BrActorRelink(old_parent, pPedestrian->actor);
1089
        BrActorRelink(old_parent, pPedestrian->actor);
1091
        BrVector3Accumulate(&pPedestrian->actor->t.t.translate.t, &pPedestrian->offset);
1090
        BrVector3Accumulate(&pPedestrian->actor->t.t.translate.t, &pPedestrian->offset);
1092
    } else if (pPedestrian->spin_period == 0.0f) {
1091
    } else if (pPedestrian->spin_period == 0.0f) {
1093
        BrMatrix34PostTranslate(&pPedestrian->actor->t.t.mat,
1092
        BrMatrix34PostTranslate(&pPedestrian->actor->t.t.mat,
1094
            pPedestrian->pos.v[X] + x_offset - pPedestrian->offset.v[X],
1093
            pPedestrian->pos.v[V_X] + x_offset - pPedestrian->offset.v[V_X],
1095
            pPedestrian->pos.v[Y] + y_offset - pPedestrian->offset.v[Y],
1094
            pPedestrian->pos.v[V_Y] + y_offset - pPedestrian->offset.v[V_Y],
1096
            pPedestrian->pos.v[Z]);
1095
            pPedestrian->pos.v[V_Z]);
1097
        BrVector3Set(&pPedestrian->offset, x_offset, y_offset, 0.0f);
1096
        BrVector3Set(&pPedestrian->offset, x_offset, y_offset, 0.0f);
1098
    } else {
1097
    } else {
1099
        BrMatrix34PostTranslate(&pPedestrian->actor->t.t.mat,
1098
        BrMatrix34PostTranslate(&pPedestrian->actor->t.t.mat,
1100
            pPedestrian->offset.v[X] + x_offset,
1099
            pPedestrian->offset.v[V_X] + x_offset,
1101
            pPedestrian->offset.v[Y] + y_offset,
1100
            pPedestrian->offset.v[V_Y] + y_offset,
1102
            pPedestrian->offset.v[Z]);
1101
            pPedestrian->offset.v[V_Z]);
1103
    }
1102
    }
1104
    gCurrent_lollipop_index = AddToLollipopQueue(pPedestrian->actor, gCurrent_lollipop_index);
1103
    gCurrent_lollipop_index = AddToLollipopQueue(pPedestrian->actor, gCurrent_lollipop_index);
1105
}
1104
}
1106
 
1105
 
1107
// IDA: void __usercall ChangeActionTo(tPedestrian_data *pPedestrian@<EAX>, int pAction_index@<EDX>, int pRedo_frames_etc@<EBX>)
1106
// IDA: void __usercall ChangeActionTo(tPedestrian_data *pPedestrian@<EAX>, int pAction_index@<EDX>, int pRedo_frames_etc@<EBX>)
Line 1227... Line 1226...
1227
    LOG_TRACE("(%p, %f, %p)", pPedestrian, pDanger_level, pDanger_direction);
1226
    LOG_TRACE("(%p, %f, %p)", pPedestrian, pDanger_level, pDanger_direction);
1228
 
1227
 
1229
    if (gAttracted_pedestrians) {
1228
    if (gAttracted_pedestrians) {
1230
        BrVector3Scale(pDanger_direction, pDanger_direction, -1.f);
1229
        BrVector3Scale(pDanger_direction, pDanger_direction, -1.f);
1231
    }
1230
    }
1232
    old_y = pPedestrian->actor->t.t.translate.t.v[Y];
1231
    old_y = pPedestrian->actor->t.t.translate.t.v[V_Y];
1233
    if (pPedestrian->current_action != pPedestrian->fatal_car_impact_action
1232
    if (pPedestrian->current_action != pPedestrian->fatal_car_impact_action
1234
        && pPedestrian->current_action != pPedestrian->fatal_ground_impact_action
1233
        && pPedestrian->current_action != pPedestrian->fatal_ground_impact_action
1235
        && pPedestrian->current_action != pPedestrian->giblets_action) {
1234
        && pPedestrian->current_action != pPedestrian->giblets_action) {
1236
        the_action = &pPedestrian->action_list[pPedestrian->current_action];
1235
        the_action = &pPedestrian->action_list[pPedestrian->current_action];
1237
        if (!pPedestrian->done_initial) {
1236
        if (!pPedestrian->done_initial) {
Line 1280... Line 1279...
1280
        if (PercentageChance(100 / (gVesuvians_last_time != 0 ? gVesuvians_last_time : 1))) {
1279
        if (PercentageChance(100 / (gVesuvians_last_time != 0 ? gVesuvians_last_time : 1))) {
1281
            BurstPedestrian(pPedestrian, .001f, 0);
1280
            BurstPedestrian(pPedestrian, .001f, 0);
1282
        }
1281
        }
1283
        gVesuvians_this_time++;
1282
        gVesuvians_this_time++;
1284
    }
1283
    }
1285
    if (pPedestrian->to_pos.v[Y] < 500.f) {
1284
    if (pPedestrian->to_pos.v[V_Y] < 500.f) {
1286
        pPedestrian->falling_speed = 0.f;
1285
        pPedestrian->falling_speed = 0.f;
1287
        pPedestrian->mid_air = 0;
1286
        pPedestrian->mid_air = 0;
1288
    } else {
1287
    } else {
1289
        BrVector3Copy(&cast_point, &pPedestrian->actor->t.t.translate.t);
1288
        BrVector3Copy(&cast_point, &pPedestrian->actor->t.t.translate.t);
1290
        if (cast_point.v[Y] >= 500.f) {
1289
        if (cast_point.v[V_Y] >= 500.f) {
1291
            cast_point.v[Y] -= 999.6f;
1290
            cast_point.v[V_Y] -= 999.6f;
1292
            pPedestrian->pos.v[Y] = pPedestrian->actor->t.t.translate.t.v[Y] = FindYVerticallyBelow2(&cast_point);
1291
            pPedestrian->pos.v[V_Y] = pPedestrian->actor->t.t.translate.t.v[V_Y] = FindYVerticallyBelow2(&cast_point);
1293
            pPedestrian->falling_speed = 0.f;
1292
            pPedestrian->falling_speed = 0.f;
1294
            pPedestrian->mid_air = 0;
1293
            pPedestrian->mid_air = 0;
1295
            pPedestrian->spin_period = 0;
1294
            pPedestrian->spin_period = 0;
1296
            BrVector3Set(&pPedestrian->offset, 0.f, 0.f, 0.f);
1295
            BrVector3Set(&pPedestrian->offset, 0.f, 0.f, 0.f);
1297
        } else {
1296
        } else {
1298
            if (pPedestrian->current_speed == 0.f && !pPedestrian->mid_air) {
1297
            if (pPedestrian->current_speed == 0.f && !pPedestrian->mid_air) {
1299
                pPedestrian->mid_air = 0;
1298
                pPedestrian->mid_air = 0;
1300
            } else {
1299
            } else {
1301
                cast_point.v[Y] = old_y + .4f;
1300
                cast_point.v[V_Y] = old_y + .4f;
1302
                new_y = FindYVerticallyBelow2(&cast_point);
1301
                new_y = FindYVerticallyBelow2(&cast_point);
1303
                if (new_y > old_y) {
1302
                if (new_y > old_y) {
1304
                    pPedestrian->spin_period = 0.f;
1303
                    pPedestrian->spin_period = 0.f;
1305
                    BrVector3Set(&pPedestrian->offset, 0.f, 0.f, 0.f);
1304
                    BrVector3Set(&pPedestrian->offset, 0.f, 0.f, 0.f);
1306
                    pPedestrian->mid_air = 0;
1305
                    pPedestrian->mid_air = 0;
1307
                    pPedestrian->falling_speed = 0.f;
1306
                    pPedestrian->falling_speed = 0.f;
1308
                    pPedestrian->pos.v[Y] = pPedestrian->actor->t.t.translate.t.v[Y] = new_y;
1307
                    pPedestrian->pos.v[V_Y] = pPedestrian->actor->t.t.translate.t.v[V_Y] = new_y;
1309
                } else {
1308
                } else {
1310
                    grav_times_period = ped_gravity * gFrame_period;
1309
                    grav_times_period = ped_gravity * gFrame_period;
1311
                    pPedestrian->falling_speed += grav_times_period;
1310
                    pPedestrian->falling_speed += grav_times_period;
1312
                    pPedestrian->actor->t.t.translate.t.v[Y] -= gFrame_period * pPedestrian->falling_speed;
1311
                    pPedestrian->actor->t.t.translate.t.v[V_Y] -= gFrame_period * pPedestrian->falling_speed;
1313
                    pPedestrian->pos.v[Y] = pPedestrian->actor->t.t.translate.t.v[Y];
1312
                    pPedestrian->pos.v[V_Y] = pPedestrian->actor->t.t.translate.t.v[V_Y];
1314
                    if (pPedestrian->spin_period != 0.f) {
1313
                    if (pPedestrian->spin_period != 0.f) {
1315
                        pPedestrian->offset.v[Y] -= gFrame_period * pPedestrian->falling_speed;
1314
                        pPedestrian->offset.v[V_Y] -= gFrame_period * pPedestrian->falling_speed;
1316
                    }
1315
                    }
1317
                    if (pPedestrian->hit_points > 0
1316
                    if (pPedestrian->hit_points > 0
1318
                        && pPedestrian->falling_sound >= 0
1317
                        && pPedestrian->falling_sound >= 0
1319
                        && pPedestrian->falling_speed >= 0.0008f) {
1318
                        && pPedestrian->falling_speed >= 0.0008f) {
1320
                        DRS3StopSound(pPedestrian->last_sound);
1319
                        DRS3StopSound(pPedestrian->last_sound);
Line 1333... Line 1332...
1333
                            0,
1332
                            0,
1334
                            the_pitch,
1333
                            the_pitch,
1335
                            &pPedestrian->pos);
1334
                            &pPedestrian->pos);
1336
                        pPedestrian->falling_sound = -1;
1335
                        pPedestrian->falling_sound = -1;
1337
                    }
1336
                    }
1338
                    if (new_y <= pPedestrian->actor->t.t.translate.t.v[Y]) {
1337
                    if (new_y <= pPedestrian->actor->t.t.translate.t.v[V_Y]) {
1339
                        pPedestrian->mid_air = 1;
1338
                        pPedestrian->mid_air = 1;
1340
                    } else {
1339
                    } else {
1341
                        pPedestrian->pos.v[Y] = pPedestrian->actor->t.t.translate.t.v[Y] = new_y;
1340
                        pPedestrian->pos.v[V_Y] = pPedestrian->actor->t.t.translate.t.v[V_Y] = new_y;
1342
                        if (pPedestrian->spin_period != 0.f) {
1341
                        if (pPedestrian->spin_period != 0.f) {
1343
                            pPedestrian->offset.v[Y] = pPedestrian->pos.v[Y];
1342
                            pPedestrian->offset.v[V_Y] = pPedestrian->pos.v[V_Y];
1344
                        }
1343
                        }
1345
                        if (pPedestrian->hit_points < 0) {
1344
                        if (pPedestrian->hit_points < 0) {
1346
                            BrVector3Copy(&pPedestrian->to_pos, &pPedestrian->pos);
1345
                            BrVector3Copy(&pPedestrian->to_pos, &pPedestrian->pos);
1347
                        }
1346
                        }
1348
                        damage = (pPedestrian->falling_speed - 0.0015f) * 100000.f;
1347
                        damage = (pPedestrian->falling_speed - 0.0015f) * 100000.f;
Line 1395... Line 1394...
1395
    most_dangerous = 0.f;
1394
    most_dangerous = 0.f;
1396
    ped_pos = &pPedestrian->actor->t.t.translate.t;
1395
    ped_pos = &pPedestrian->actor->t.t.translate.t;
1397
    for (i = 0; i < gNum_active_cars; i++) {
1396
    for (i = 0; i < gNum_active_cars; i++) {
1398
        car = gActive_car_list[i];
1397
        car = gActive_car_list[i];
1399
        if (car->driver == eDriver_local_human) {
1398
        if (car->driver == eDriver_local_human) {
1400
            camera_view_angle = FastScalarArcTan2(ped_pos->v[X] - gCamera_to_world.m[3][X], ped_pos->v[Z] - gCamera_to_world.m[3][Z]);
1399
            camera_view_angle = FastScalarArcTan2(ped_pos->v[V_X] - gCamera_to_world.m[3][V_X], ped_pos->v[V_Z] - gCamera_to_world.m[3][V_Z]);
1401
            pPedestrian->car_to_ped = camera_view_angle;
1400
            pPedestrian->car_to_ped = camera_view_angle;
1402
        }
1401
        }
1403
        if (gBlind_pedestrians) {
1402
        if (gBlind_pedestrians) {
1404
            return car->keys.horn ? 100.f : 0.f;
1403
            return car->keys.horn ? 100.f : 0.f;
1405
        }
1404
        }
1406
        distance_squared = (ped_pos->v[X] - car->pos.v[X]) * (ped_pos->v[X] - car->pos.v[X])
1405
        distance_squared = (ped_pos->v[V_X] - car->pos.v[V_X]) * (ped_pos->v[V_X] - car->pos.v[V_X])
1407
            + 10.f * (ped_pos->v[Y] - car->pos.v[Y]) * 10.f * (ped_pos->v[Y] - car->pos.v[Y])
1406
            + 10.f * (ped_pos->v[V_Y] - car->pos.v[V_Y]) * 10.f * (ped_pos->v[V_Y] - car->pos.v[V_Y])
1408
            + (ped_pos->v[Z] - car->pos.v[Z]) * (ped_pos->v[Z] - car->pos.v[Z]);
1407
            + (ped_pos->v[V_Z] - car->pos.v[V_Z]) * (ped_pos->v[V_Z] - car->pos.v[V_Z]);
1409
        if (distance_squared < gMax_distance_squared) {
1408
        if (distance_squared < gMax_distance_squared) {
1410
            car_movement_angle = FastScalarArcTan2(car->direction.v[X], car->direction.v[Z]);
1409
            car_movement_angle = FastScalarArcTan2(car->direction.v[V_X], car->direction.v[V_Z]);
1411
            car_to_pedestrian_angle = FastScalarArcTan2(ped_pos->v[X] - car->pos.v[X], ped_pos->v[Z] - car->pos.v[Z]);
1410
            car_to_pedestrian_angle = FastScalarArcTan2(ped_pos->v[V_X] - car->pos.v[V_X], ped_pos->v[V_Z] - car->pos.v[V_Z]);
1412
            if (car_to_pedestrian_angle > car_movement_angle) {
1411
            if (car_to_pedestrian_angle > car_movement_angle) {
1413
                car_movement_angle += 360.f;
1412
                car_movement_angle += 360.f;
1414
            }
1413
            }
1415
            heading_difference = car_movement_angle - car_to_pedestrian_angle;
1414
            heading_difference = car_movement_angle - car_to_pedestrian_angle;
1416
            if (heading_difference > 180.f) {
1415
            if (heading_difference > 180.f) {
Line 1467... Line 1466...
1467
    if (fabsf(pPedestrian->current_speed) >= fabsf(pCar->speed)) {
1466
    if (fabsf(pPedestrian->current_speed) >= fabsf(pCar->speed)) {
1468
        BrVector3Scale(&ped_move_in_global, &pPedestrian->direction, -fabsf(pPedestrian->current_speed));
1467
        BrVector3Scale(&ped_move_in_global, &pPedestrian->direction, -fabsf(pPedestrian->current_speed));
1469
    } else {
1468
    } else {
1470
        BrVector3Scale(&ped_move_in_global, &pCar->direction, fabsf(pCar->speed));
1469
        BrVector3Scale(&ped_move_in_global, &pCar->direction, fabsf(pCar->speed));
1471
    }
1470
    }
1472
    if (fabsf(ped_move_in_global.v[X]) < 5e-5f || fabsf(ped_move_in_global.v[Z]) < 5e-5f) {
1471
    if (fabsf(ped_move_in_global.v[V_X]) < 5e-5f || fabsf(ped_move_in_global.v[V_Z]) < 5e-5f) {
1473
        return ePed_hit_unknown;
1472
        return ePed_hit_unknown;
1474
    }
1473
    }
1475
    BrActorToActorMatrix34(&global_to_car, gDont_render_actor, pCar_actor);
1474
    BrActorToActorMatrix34(&global_to_car, gDont_render_actor, pCar_actor);
1476
    BrMatrix34ApplyV(&ped_move_in_car, &ped_move_in_global, &global_to_car);
1475
    BrMatrix34ApplyV(&ped_move_in_car, &ped_move_in_global, &global_to_car);
1477
    if (ped_move_in_car.v[X] >= 0.f) {
1476
    if (ped_move_in_car.v[V_X] >= 0.f) {
1478
        x = pCar_bounds_max_x - pMin_ped_bounds_car->v[X];
1477
        x = pCar_bounds_max_x - pMin_ped_bounds_car->v[V_X];
1479
    } else {
1478
    } else {
1480
        x = pCar_bounds_min_x - pMax_ped_bounds_car->v[X];
1479
        x = pCar_bounds_min_x - pMax_ped_bounds_car->v[V_X];
1481
    }
1480
    }
1482
    if (ped_move_in_car.v[Z] >= 0.f) {
1481
    if (ped_move_in_car.v[V_Z] >= 0.f) {
1483
        z = pCar_bounds_max_z - pMin_ped_bounds_car->v[Z];
1482
        z = pCar_bounds_max_z - pMin_ped_bounds_car->v[V_Z];
1484
    } else {
1483
    } else {
1485
        z = pCar_bounds_min_z - pMax_ped_bounds_car->v[Z];
1484
        z = pCar_bounds_min_z - pMax_ped_bounds_car->v[V_Z];
1486
    }
1485
    }
1487
 
1486
 
1488
    if (ped_move_in_car.v[Z] != 0.f) {
1487
    if (ped_move_in_car.v[V_Z] != 0.f) {
1489
        t = z / ped_move_in_car.v[Z] * ped_move_in_car.v[X];
1488
        t = z / ped_move_in_car.v[V_Z] * ped_move_in_car.v[V_X];
1490
    }
1489
    }
1491
    if (ped_move_in_car.v[Z] == 0.f || t + pPed_x < pCar_bounds_min_x || t + pPed_x > pCar_bounds_max_x) {
1490
    if (ped_move_in_car.v[V_Z] == 0.f || t + pPed_x < pCar_bounds_min_x || t + pPed_x > pCar_bounds_max_x) {
1492
        if (ped_move_in_car.v[X] == 0.f) {
1491
        if (ped_move_in_car.v[V_X] == 0.f) {
1493
            return ePed_hit_unknown;
1492
            return ePed_hit_unknown;
1494
        }
1493
        }
1495
        t = x / ped_move_in_car.v[X];
1494
        t = x / ped_move_in_car.v[V_X];
1496
        z_to_use = t * ped_move_in_car.v[Z];
1495
        z_to_use = t * ped_move_in_car.v[V_Z];
1497
        if (z_to_use + pPed_z < pCar_bounds_min_z || z_to_use + pPed_z > pCar_bounds_max_z) {
1496
        if (z_to_use + pPed_z < pCar_bounds_min_z || z_to_use + pPed_z > pCar_bounds_max_z) {
1498
            return ePed_hit_unknown;
1497
            return ePed_hit_unknown;
1499
        }
1498
        }
1500
        x_to_use = x;
1499
        x_to_use = x;
1501
        if (ped_move_in_car.v[X] >= 0.f) {
1500
        if (ped_move_in_car.v[V_X] >= 0.f) {
1502
            result = ePed_hit_rside;
1501
            result = ePed_hit_rside;
1503
        } else {
1502
        } else {
1504
            result = ePed_hit_lside;
1503
            result = ePed_hit_lside;
1505
        }
1504
        }
1506
    } else {
1505
    } else {
1507
        z_to_use = z;
1506
        z_to_use = z;
1508
        if (ped_move_in_car.v[Z] >= 0.f) {
1507
        if (ped_move_in_car.v[V_Z] >= 0.f) {
1509
            result = ePed_hit_back;
1508
            result = ePed_hit_back;
1510
        } else {
1509
        } else {
1511
            result = ePed_hit_front;
1510
            result = ePed_hit_front;
1512
        }
1511
        }
1513
    }
1512
    }
1514
    BrVector3Set(&scaled_car_direction, 1.01f * x_to_use, 0.f, 1.01f * z_to_use);
1513
    BrVector3Set(&scaled_car_direction, 1.01f * x_to_use, 0.f, 1.01f * z_to_use);
1515
    BrMatrix34TApplyV(&scaled_ped_direction, &scaled_car_direction, &global_to_car);
1514
    BrMatrix34TApplyV(&scaled_ped_direction, &scaled_car_direction, &global_to_car);
1516
    scaled_ped_direction.v[Y] = 0.f;
1515
    scaled_ped_direction.v[V_Y] = 0.f;
1517
    if (pCar->speed == 0.f || gFrame_period * fabsf(pCar->speed) > BrVector3Length(&scaled_ped_direction) / 10.f) {
1516
    if (pCar->speed == 0.f || gFrame_period * fabsf(pCar->speed) > BrVector3Length(&scaled_ped_direction) / 10.f) {
1518
        BrVector3Accumulate(&pPedestrian->actor->t.t.translate.t, &scaled_ped_direction);
1517
        BrVector3Accumulate(&pPedestrian->actor->t.t.translate.t, &scaled_ped_direction);
1519
        BrVector3Accumulate(&pPedestrian->pos, &scaled_ped_direction);
1518
        BrVector3Accumulate(&pPedestrian->pos, &scaled_ped_direction);
1520
    }
1519
    }
1521
    return result;
1520
    return result;
Line 1543... Line 1542...
1543
 
1542
 
1544
    size_sqr = pSize + .05f;
1543
    size_sqr = pSize + .05f;
1545
    dist_sqr = size_sqr * WORLD_SCALE * size_sqr * WORLD_SCALE;
1544
    dist_sqr = size_sqr * WORLD_SCALE * size_sqr * WORLD_SCALE;
1546
    squish = 0;
1545
    squish = 0;
1547
    for (wheel = 0; wheel < COUNT_OF(pCar->blood_remaining); wheel++) {
1546
    for (wheel = 0; wheel < COUNT_OF(pCar->blood_remaining); wheel++) {
1548
        ped_m_x = pCar->wpos[wheel].v[X] - pPed_car->v[X] * WORLD_SCALE;
1547
        ped_m_x = pCar->wpos[wheel].v[V_X] - pPed_car->v[V_X] * WORLD_SCALE;
1549
        ped_m_z = pCar->wpos[wheel].v[Z] - pPed_car->v[Z] * WORLD_SCALE;
1548
        ped_m_z = pCar->wpos[wheel].v[V_Z] - pPed_car->v[V_Z] * WORLD_SCALE;
1550
        if (pCar->blood_remaining[wheel] == 0.f && ped_m_x * ped_m_x + ped_m_z * ped_m_z < dist_sqr) {
1549
        if (pCar->blood_remaining[wheel] == 0.f && ped_m_x * ped_m_x + ped_m_z * ped_m_z < dist_sqr) {
1551
            pCar->blood_remaining[wheel] = SRandomBetween(2.f, 8.f);
1550
            pCar->blood_remaining[wheel] = SRandomBetween(2.f, 8.f);
1552
            pCar->special_start[wheel] = *pPed_glob;
1551
            pCar->special_start[wheel] = *pPed_glob;
1553
            squish = 1;
1552
            squish = 1;
1554
        }
1553
        }
Line 1674... Line 1673...
1674
        }
1673
        }
1675
        BrActorToActorMatrix34(&ped_to_car, pPedestrian->actor, car_actor);
1674
        BrActorToActorMatrix34(&ped_to_car, pPedestrian->actor, car_actor);
1676
        BrMatrix34ApplyP(&min_ped_bounds_car, &min_ped_bounds, &ped_to_car);
1675
        BrMatrix34ApplyP(&min_ped_bounds_car, &min_ped_bounds, &ped_to_car);
1677
        BrMatrix34ApplyP(&max_ped_bounds_car, &max_ped_bounds, &ped_to_car);
1676
        BrMatrix34ApplyP(&max_ped_bounds_car, &max_ped_bounds, &ped_to_car);
1678
        // use gross_dismiss as temporary
1677
        // use gross_dismiss as temporary
1679
        if (max_ped_bounds_car.v[X] < min_ped_bounds_car.v[X]) {
1678
        if (max_ped_bounds_car.v[V_X] < min_ped_bounds_car.v[V_X]) {
1680
            SwapValuesUsingTemporary(max_ped_bounds_car.v[X], min_ped_bounds_car.v[X], gross_dismiss);
1679
            SwapValuesUsingTemporary(max_ped_bounds_car.v[V_X], min_ped_bounds_car.v[V_X], gross_dismiss);
1681
        }
1680
        }
1682
        if (max_ped_bounds_car.v[Y] < min_ped_bounds_car.v[Y]) {
1681
        if (max_ped_bounds_car.v[V_Y] < min_ped_bounds_car.v[V_Y]) {
1683
            SwapValuesUsingTemporary(max_ped_bounds_car.v[Y], min_ped_bounds_car.v[Y], gross_dismiss);
1682
            SwapValuesUsingTemporary(max_ped_bounds_car.v[V_Y], min_ped_bounds_car.v[V_Y], gross_dismiss);
1684
        }
1683
        }
1685
        if (max_ped_bounds_car.v[Z] < min_ped_bounds_car.v[Z]) {
1684
        if (max_ped_bounds_car.v[V_Z] < min_ped_bounds_car.v[V_Z]) {
1686
            SwapValuesUsingTemporary(max_ped_bounds_car.v[Z], min_ped_bounds_car.v[Z], gross_dismiss);
1685
            SwapValuesUsingTemporary(max_ped_bounds_car.v[V_Z], min_ped_bounds_car.v[V_Z], gross_dismiss);
1687
        }
1686
        }
1688
        car_bounds_min_x = the_car->bounds[0].min.v[X];
1687
        car_bounds_min_x = the_car->bounds[0].min.v[V_X];
1689
        car_bounds_max_x = the_car->bounds[0].max.v[X];
1688
        car_bounds_max_x = the_car->bounds[0].max.v[V_X];
1690
        car_bounds_min_z = the_car->bounds[0].min.v[Z];
1689
        car_bounds_min_z = the_car->bounds[0].min.v[V_Z];
1691
        car_bounds_max_z = the_car->bounds[0].max.v[Z];
1690
        car_bounds_max_z = the_car->bounds[0].max.v[V_Z];
1692
        prev_car_bounds_min_x = car_bounds_min_x - the_car->velocity_car_space.v[X] * scalar_frame_time;
1691
        prev_car_bounds_min_x = car_bounds_min_x - the_car->velocity_car_space.v[V_X] * scalar_frame_time;
1693
        prev_car_bounds_max_x = car_bounds_max_x - the_car->velocity_car_space.v[X] * scalar_frame_time;
1692
        prev_car_bounds_max_x = car_bounds_max_x - the_car->velocity_car_space.v[V_X] * scalar_frame_time;
1694
        prev_car_bounds_min_z = car_bounds_min_z - the_car->velocity_car_space.v[Z] * scalar_frame_time;
1693
        prev_car_bounds_min_z = car_bounds_min_z - the_car->velocity_car_space.v[V_Z] * scalar_frame_time;
1695
        prev_car_bounds_max_z = car_bounds_max_z - the_car->velocity_car_space.v[Z] * scalar_frame_time;
1694
        prev_car_bounds_max_z = car_bounds_max_z - the_car->velocity_car_space.v[V_Z] * scalar_frame_time;
1696
        if (!proximity_rayed) {
1695
        if (!proximity_rayed) {
1697
            if (!fated) {
1696
            if (!fated) {
1698
                if (the_car->velocity_car_space.v[X] <= 0.0f) {
1697
                if (the_car->velocity_car_space.v[V_X] <= 0.0f) {
1699
                    if (the_car->velocity_car_space.v[Z] <= 0.0f) {
1698
                    if (the_car->velocity_car_space.v[V_Z] <= 0.0f) {
1700
                        if (max_ped_bounds_car.v[X] <= car_bounds_min_x
1699
                        if (max_ped_bounds_car.v[V_X] <= car_bounds_min_x
1701
                            || min_ped_bounds_car.v[X] >= prev_car_bounds_max_x
1700
                            || min_ped_bounds_car.v[V_X] >= prev_car_bounds_max_x
1702
                            || max_ped_bounds_car.v[Z] <= car_bounds_min_z
1701
                            || max_ped_bounds_car.v[V_Z] <= car_bounds_min_z
1703
                            || min_ped_bounds_car.v[Z] >= prev_car_bounds_max_z
1702
                            || min_ped_bounds_car.v[V_Z] >= prev_car_bounds_max_z
1704
                            || (min_ped_bounds_car.v[X] > car_bounds_max_x
1703
                            || (min_ped_bounds_car.v[V_X] > car_bounds_max_x
1705
                                && max_ped_bounds_car.v[Z] < prev_car_bounds_min_z
1704
                                && max_ped_bounds_car.v[V_Z] < prev_car_bounds_min_z
1706
                                && prev_car_bounds_max_x - car_bounds_max_x != 0.0f
1705
                                && prev_car_bounds_max_x - car_bounds_max_x != 0.0f
1707
                                && (prev_car_bounds_min_z - car_bounds_min_z) / (prev_car_bounds_max_x - car_bounds_max_x) > (max_ped_bounds_car.v[Z] - car_bounds_min_z) / (min_ped_bounds_car.v[X] - car_bounds_max_x))
1706
                                && (prev_car_bounds_min_z - car_bounds_min_z) / (prev_car_bounds_max_x - car_bounds_max_x) > (max_ped_bounds_car.v[V_Z] - car_bounds_min_z) / (min_ped_bounds_car.v[V_X] - car_bounds_max_x))
1708
                            || (max_ped_bounds_car.v[X] < prev_car_bounds_min_x
1707
                            || (max_ped_bounds_car.v[V_X] < prev_car_bounds_min_x
1709
                                && min_ped_bounds_car.v[Z] > car_bounds_max_z
1708
                                && min_ped_bounds_car.v[V_Z] > car_bounds_max_z
1710
                                && car_bounds_min_x - prev_car_bounds_min_x != 0.0f
1709
                                && car_bounds_min_x - prev_car_bounds_min_x != 0.0f
1711
                                && (car_bounds_max_z - prev_car_bounds_max_z) / (car_bounds_min_x - prev_car_bounds_min_x) > (min_ped_bounds_car.v[Z] - prev_car_bounds_max_z) / (max_ped_bounds_car.v[X] - prev_car_bounds_min_x))) {
1710
                                && (car_bounds_max_z - prev_car_bounds_max_z) / (car_bounds_min_x - prev_car_bounds_min_x) > (min_ped_bounds_car.v[V_Z] - prev_car_bounds_max_z) / (max_ped_bounds_car.v[V_X] - prev_car_bounds_min_x))) {
1712
                            continue;
1711
                            continue;
1713
                        }
1712
                        }
1714
                    } else if (max_ped_bounds_car.v[X] <= car_bounds_min_x
1713
                    } else if (max_ped_bounds_car.v[V_X] <= car_bounds_min_x
1715
                        || min_ped_bounds_car.v[X] >= prev_car_bounds_max_x
1714
                        || min_ped_bounds_car.v[V_X] >= prev_car_bounds_max_x
1716
                        || max_ped_bounds_car.v[Z] <= prev_car_bounds_min_z
1715
                        || max_ped_bounds_car.v[V_Z] <= prev_car_bounds_min_z
1717
                        || min_ped_bounds_car.v[Z] >= car_bounds_max_z
1716
                        || min_ped_bounds_car.v[V_Z] >= car_bounds_max_z
1718
                        || (max_ped_bounds_car.v[X] < prev_car_bounds_min_x
1717
                        || (max_ped_bounds_car.v[V_X] < prev_car_bounds_min_x
1719
                            && max_ped_bounds_car.v[Z] < car_bounds_min_z
1718
                            && max_ped_bounds_car.v[V_Z] < car_bounds_min_z
1720
                            && car_bounds_min_x - prev_car_bounds_min_x != 0.0f
1719
                            && car_bounds_min_x - prev_car_bounds_min_x != 0.0f
1721
                            && ((car_bounds_min_z - prev_car_bounds_min_z) / (car_bounds_min_x - prev_car_bounds_min_x) < (max_ped_bounds_car.v[Z] - prev_car_bounds_min_z) / (max_ped_bounds_car.v[X] - prev_car_bounds_min_x)))
1720
                            && ((car_bounds_min_z - prev_car_bounds_min_z) / (car_bounds_min_x - prev_car_bounds_min_x) < (max_ped_bounds_car.v[V_Z] - prev_car_bounds_min_z) / (max_ped_bounds_car.v[V_X] - prev_car_bounds_min_x)))
1722
                        || (min_ped_bounds_car.v[X] > car_bounds_max_x
1721
                        || (min_ped_bounds_car.v[V_X] > car_bounds_max_x
1723
                            && min_ped_bounds_car.v[Z] > prev_car_bounds_max_z
1722
                            && min_ped_bounds_car.v[V_Z] > prev_car_bounds_max_z
1724
                            && prev_car_bounds_max_x - car_bounds_max_x != 0.0f
1723
                            && prev_car_bounds_max_x - car_bounds_max_x != 0.0f
1725
                            && (prev_car_bounds_max_z - car_bounds_max_z) / (prev_car_bounds_max_x - car_bounds_max_x) < (min_ped_bounds_car.v[Z] - car_bounds_max_z) / (min_ped_bounds_car.v[X] - car_bounds_max_x))) {
1724
                            && (prev_car_bounds_max_z - car_bounds_max_z) / (prev_car_bounds_max_x - car_bounds_max_x) < (min_ped_bounds_car.v[V_Z] - car_bounds_max_z) / (min_ped_bounds_car.v[V_X] - car_bounds_max_x))) {
1726
                        continue;
1725
                        continue;
1727
                    }
1726
                    }
1728
                } else if (the_car->velocity_car_space.v[Z] <= 0.0f) {
1727
                } else if (the_car->velocity_car_space.v[V_Z] <= 0.0f) {
1729
                    if (max_ped_bounds_car.v[X] <= prev_car_bounds_min_x
1728
                    if (max_ped_bounds_car.v[V_X] <= prev_car_bounds_min_x
1730
                        || min_ped_bounds_car.v[X] >= car_bounds_max_x
1729
                        || min_ped_bounds_car.v[V_X] >= car_bounds_max_x
1731
                        || max_ped_bounds_car.v[Z] <= car_bounds_min_z
1730
                        || max_ped_bounds_car.v[V_Z] <= car_bounds_min_z
1732
                        || min_ped_bounds_car.v[Z] >= prev_car_bounds_max_z
1731
                        || min_ped_bounds_car.v[V_Z] >= prev_car_bounds_max_z
1733
                        || (max_ped_bounds_car.v[X] < car_bounds_min_x
1732
                        || (max_ped_bounds_car.v[V_X] < car_bounds_min_x
1734
                            && max_ped_bounds_car.v[Z] < prev_car_bounds_min_z
1733
                            && max_ped_bounds_car.v[V_Z] < prev_car_bounds_min_z
1735
                            && prev_car_bounds_min_x - car_bounds_min_x != 0.0f
1734
                            && prev_car_bounds_min_x - car_bounds_min_x != 0.0f
1736
                            && (prev_car_bounds_min_z - car_bounds_min_z) / (prev_car_bounds_min_x - car_bounds_min_x) < (max_ped_bounds_car.v[Z] - car_bounds_min_z) / (max_ped_bounds_car.v[X] - car_bounds_min_x))
1735
                            && (prev_car_bounds_min_z - car_bounds_min_z) / (prev_car_bounds_min_x - car_bounds_min_x) < (max_ped_bounds_car.v[V_Z] - car_bounds_min_z) / (max_ped_bounds_car.v[V_X] - car_bounds_min_x))
1737
                        || (min_ped_bounds_car.v[X] > prev_car_bounds_max_x
1736
                        || (min_ped_bounds_car.v[V_X] > prev_car_bounds_max_x
1738
                            && min_ped_bounds_car.v[Z] > car_bounds_max_z
1737
                            && min_ped_bounds_car.v[V_Z] > car_bounds_max_z
1739
                            && car_bounds_max_x - prev_car_bounds_max_x != 0.0f
1738
                            && car_bounds_max_x - prev_car_bounds_max_x != 0.0f
1740
                            && (car_bounds_max_z - prev_car_bounds_max_z) / (car_bounds_max_x - prev_car_bounds_max_x) < (min_ped_bounds_car.v[Z] - prev_car_bounds_max_z) / (min_ped_bounds_car.v[X] - prev_car_bounds_max_x))) {
1739
                            && (car_bounds_max_z - prev_car_bounds_max_z) / (car_bounds_max_x - prev_car_bounds_max_x) < (min_ped_bounds_car.v[V_Z] - prev_car_bounds_max_z) / (min_ped_bounds_car.v[V_X] - prev_car_bounds_max_x))) {
1741
                        continue;
1740
                        continue;
1742
                    }
1741
                    }
1743
                } else if (max_ped_bounds_car.v[X] <= prev_car_bounds_min_x
1742
                } else if (max_ped_bounds_car.v[V_X] <= prev_car_bounds_min_x
1744
                    || min_ped_bounds_car.v[X] >= car_bounds_max_x
1743
                    || min_ped_bounds_car.v[V_X] >= car_bounds_max_x
1745
                    || max_ped_bounds_car.v[Z] <= prev_car_bounds_min_z
1744
                    || max_ped_bounds_car.v[V_Z] <= prev_car_bounds_min_z
1746
                    || min_ped_bounds_car.v[Z] >= car_bounds_max_z
1745
                    || min_ped_bounds_car.v[V_Z] >= car_bounds_max_z
1747
                    || (min_ped_bounds_car.v[X] > prev_car_bounds_max_x
1746
                    || (min_ped_bounds_car.v[V_X] > prev_car_bounds_max_x
1748
                        && max_ped_bounds_car.v[Z] < car_bounds_min_z
1747
                        && max_ped_bounds_car.v[V_Z] < car_bounds_min_z
1749
                        && car_bounds_max_x - prev_car_bounds_max_x != 0.0f
1748
                        && car_bounds_max_x - prev_car_bounds_max_x != 0.0f
1750
                        && (car_bounds_min_z - prev_car_bounds_min_z) / (car_bounds_max_x - prev_car_bounds_max_x) > (max_ped_bounds_car.v[Z] - prev_car_bounds_min_z) / (min_ped_bounds_car.v[X] - prev_car_bounds_max_x))
1749
                        && (car_bounds_min_z - prev_car_bounds_min_z) / (car_bounds_max_x - prev_car_bounds_max_x) > (max_ped_bounds_car.v[V_Z] - prev_car_bounds_min_z) / (min_ped_bounds_car.v[V_X] - prev_car_bounds_max_x))
1751
                    || (max_ped_bounds_car.v[X] < car_bounds_min_x
1750
                    || (max_ped_bounds_car.v[V_X] < car_bounds_min_x
1752
                        && min_ped_bounds_car.v[Z] > prev_car_bounds_max_z
1751
                        && min_ped_bounds_car.v[V_Z] > prev_car_bounds_max_z
1753
                        && prev_car_bounds_min_x - car_bounds_min_x != 0.0f
1752
                        && prev_car_bounds_min_x - car_bounds_min_x != 0.0f
1754
                        && (prev_car_bounds_max_z - car_bounds_max_z) / (prev_car_bounds_min_x - car_bounds_min_x) > (min_ped_bounds_car.v[Z] - car_bounds_max_z) / (max_ped_bounds_car.v[X] - car_bounds_min_x))) {
1753
                        && (prev_car_bounds_max_z - car_bounds_max_z) / (prev_car_bounds_min_x - car_bounds_min_x) > (min_ped_bounds_car.v[V_Z] - car_bounds_max_z) / (max_ped_bounds_car.v[V_X] - car_bounds_min_x))) {
1755
                    continue;
1754
                    continue;
1756
                }
1755
                }
1757
            }
1756
            }
1758
            proximity_rayed = 0;
1757
            proximity_rayed = 0;
1759
        }
1758
        }
1760
        if (pPedestrian->fate != (tCar_spec*)the_car
1759
        if (pPedestrian->fate != (tCar_spec*)the_car
1761
            && !proximity_rayed
1760
            && !proximity_rayed
1762
            && (the_car->bounds[0].max.v[Y] < min_ped_bounds_car.v[Y]
1761
            && (the_car->bounds[0].max.v[V_Y] < min_ped_bounds_car.v[V_Y]
1763
                || the_car->bounds[0].min.v[Y] > max_ped_bounds_car.v[Y])) {
1762
                || the_car->bounds[0].min.v[V_Y] > max_ped_bounds_car.v[V_Y])) {
1764
            continue;
1763
            continue;
1765
        }
1764
        }
1766
        pPedestrian->fate = NULL;
1765
        pPedestrian->fate = NULL;
1767
        if (pPedestrian->current_action == pPedestrian->fatal_car_impact_action
1766
        if (pPedestrian->current_action == pPedestrian->fatal_car_impact_action
1768
            || pPedestrian->current_action == pPedestrian->fatal_ground_impact_action) {
1767
            || pPedestrian->current_action == pPedestrian->fatal_ground_impact_action) {
Line 1777... Line 1776...
1777
            continue;
1776
            continue;
1778
        }
1777
        }
1779
        break;
1778
        break;
1780
    }
1779
    }
1781
    pPedestrian->killers_ID = the_car->car_ID;
1780
    pPedestrian->killers_ID = the_car->car_ID;
1782
    ped_centre_x = (max_ped_bounds_car.v[X] + min_ped_bounds_car.v[X]) / 2.0f;
1781
    ped_centre_x = (max_ped_bounds_car.v[V_X] + min_ped_bounds_car.v[V_X]) / 2.0f;
1783
    ped_centre_y = (max_ped_bounds_car.v[Z] + min_ped_bounds_car.v[Z]) / 2.0f;
1782
    ped_centre_y = (max_ped_bounds_car.v[V_Z] + min_ped_bounds_car.v[V_Z]) / 2.0f;
1784
    if (proximity_rayed) {
1783
    if (proximity_rayed) {
1785
        hit_pos = ePed_hit_unknown;
1784
        hit_pos = ePed_hit_unknown;
1786
    } else {
1785
    } else {
1787
        hit_pos = MoveToEdgeOfCar(pPedestrian,
1786
        hit_pos = MoveToEdgeOfCar(pPedestrian,
1788
            the_car,
1787
            the_car,
Line 1851... Line 1850...
1851
            }
1850
            }
1852
        }
1851
        }
1853
    } else {
1852
    } else {
1854
        if (FancyATossOffMate(pPedestrian, the_car, impact_speed)) {
1853
        if (FancyATossOffMate(pPedestrian, the_car, impact_speed)) {
1855
            pPedestrian->mid_air = 1;
1854
            pPedestrian->mid_air = 1;
1856
            if (pPedestrian->to_pos.v[Y] < 500.0f) {
1855
            if (pPedestrian->to_pos.v[V_Y] < 500.0f) {
1857
                pPedestrian->to_pos.v[Y] += 1000.4f;
1856
                pPedestrian->to_pos.v[V_Y] += 1000.4f;
1858
            }
1857
            }
1859
            pPedestrian->falling_speed -= impact_speed * 0.02f;
1858
            pPedestrian->falling_speed -= impact_speed * 0.02f;
1860
            if (pPedestrian->falling_speed > -0.001f) {
1859
            if (pPedestrian->falling_speed > -0.001f) {
1861
                pPedestrian->falling_speed = -0.001f;
1860
                pPedestrian->falling_speed = -0.001f;
1862
            }
1861
            }
1863
            tossing = 1;
1862
            tossing = 1;
1864
            pPedestrian->actor->t.t.translate.t.v[Y] += impact_speed * 15.0f;
1863
            pPedestrian->actor->t.t.translate.t.v[V_Y] += impact_speed * 15.0f;
1865
            pPedestrian->pos = pPedestrian->actor->t.t.translate.t;
1864
            pPedestrian->pos = pPedestrian->actor->t.t.translate.t;
1866
        } else {
1865
        } else {
1867
            pPedestrian->actor->render_style = BR_RSTYLE_NONE;
1866
            pPedestrian->actor->render_style = BR_RSTYLE_NONE;
1868
            BrActorRelink(car_actor, pPedestrian->actor);
1867
            BrActorRelink(car_actor, pPedestrian->actor);
1869
        }
1868
        }
Line 1924... Line 1923...
1924
        }
1923
        }
1925
        BrVector3Set(&up, 0.f, 1.f, 0.f);
1924
        BrVector3Set(&up, 0.f, 1.f, 0.f);
1926
        if (billiards_shot) {
1925
        if (billiards_shot) {
1927
            credits_value *= 4;
1926
            credits_value *= 4;
1928
            PratcamEvent(30);
1927
            PratcamEvent(30);
1929
            DoFancyHeadup(kFancyHeadupNiceShotSir);
1928
            DoFancyHeadup(8);
1930
        } else if (fabsf(the_car->omega.v[X]) <= 5.0f
1929
        } else if (fabsf(the_car->omega.v[V_X]) <= 5.0f
1931
            && fabsf(the_car->omega.v[Z]) <= 5.0f
1930
            && fabsf(the_car->omega.v[V_Z]) <= 5.0f
1932
            && BrVector3Dot(&the_car->car_master_actor->t.t.look_up.up, &up) >= 0.1f
1931
            && BrVector3Dot(&the_car->car_master_actor->t.t.look_up.up, &up) >= 0.1f
1933
            && pPedestrian->offset.v[1] >= -0.1f) {
1932
            && pPedestrian->offset.v[1] >= -0.1f) {
1934
            if (((hit_pos != ePed_hit_lside && hit_pos != ePed_hit_rside)
1933
            if (((hit_pos != ePed_hit_lside && hit_pos != ePed_hit_rside)
1935
                    || (fabsf(the_car->velocity_car_space.v[X]) <= fabsf(the_car->velocity_car_space.v[Z])
1934
                    || (fabsf(the_car->velocity_car_space.v[V_X]) <= fabsf(the_car->velocity_car_space.v[V_Z])
1936
                        && fabsf(the_car->omega.v[Y] / the_car->velocity_car_space.v[Z]) <= 600.0f))
1935
                        && fabsf(the_car->omega.v[V_Y] / the_car->velocity_car_space.v[V_Z]) <= 600.0f))
1937
                && (hit_pos != ePed_hit_back || the_car->velocity_car_space.v[Z] <= 0.0f)) {
1936
                && (hit_pos != ePed_hit_back || the_car->velocity_car_space.v[V_Z] <= 0.0f)) {
1938
                if (gCurrent_ped_multiplier >= 2) {
1937
                if (gCurrent_ped_multiplier >= 2) {
1939
                    DoFancyHeadup(gCurrent_ped_multiplier + kFancyHeadup2xComboBonus - 2);
1938
                    DoFancyHeadup(gCurrent_ped_multiplier + kFancyHeadup2xComboBonus - 2);
1940
                } else {
1939
                } else {
1941
                    PratcamEvent(30);
1940
                    PratcamEvent(30);
1942
                    if (exploded) {
1941
                    if (exploded) {
Line 2064... Line 2063...
2064
        pPedestrian->done_initial = 0;
2063
        pPedestrian->done_initial = 0;
2065
    }
2064
    }
2066
    if (gAction_replay_mode) {
2065
    if (gAction_replay_mode) {
2067
        old_frame = pPedestrian->current_frame;
2066
        old_frame = pPedestrian->current_frame;
2068
        pPedestrian->car_to_ped = FastScalarArcTan2(
2067
        pPedestrian->car_to_ped = FastScalarArcTan2(
2069
            pPedestrian->pos.v[X] - gCamera_to_world.m[3][X],
2068
            pPedestrian->pos.v[V_X] - gCamera_to_world.m[3][V_X],
2070
            pPedestrian->pos.v[Z] - gCamera_to_world.m[3][Z]);
2069
            pPedestrian->pos.v[V_Z] - gCamera_to_world.m[3][V_Z]);
2071
        MungePedestrianSequence(pPedestrian, 0);
2070
        MungePedestrianSequence(pPedestrian, 0);
2072
        if (old_frame <= pPedestrian->sequences[pPedestrian->current_sequence].number_of_frames) {
2071
        if (old_frame <= pPedestrian->sequences[pPedestrian->current_sequence].number_of_frames) {
2073
            pPedestrian->current_frame = old_frame;
2072
            pPedestrian->current_frame = old_frame;
2074
        } else {
2073
        } else {
2075
            pPedestrian->current_frame = 0;
2074
            pPedestrian->current_frame = 0;
Line 2188... Line 2187...
2188
void SquirtPathVertex(br_vertex* pFirst_vertex, br_vector3* pPoint) {
2187
void SquirtPathVertex(br_vertex* pFirst_vertex, br_vector3* pPoint) {
2189
    LOG_TRACE("(%p, %p)", pFirst_vertex, pPoint);
2188
    LOG_TRACE("(%p, %p)", pFirst_vertex, pPoint);
2190
 
2189
 
2191
    pFirst_vertex[0].p = *pPoint;
2190
    pFirst_vertex[0].p = *pPoint;
2192
    pFirst_vertex[1].p = *pPoint;
2191
    pFirst_vertex[1].p = *pPoint;
2193
    pFirst_vertex[1].p.v[Y] += .1f;
2192
    pFirst_vertex[1].p.v[V_Y] += .1f;
2194
    pFirst_vertex[2].p = *pPoint;
2193
    pFirst_vertex[2].p = *pPoint;
2195
    pFirst_vertex[2].p.v[X] += -.05f;
2194
    pFirst_vertex[2].p.v[V_X] += -.05f;
2196
    pFirst_vertex[2].p.v[Y] += .05f;
2195
    pFirst_vertex[2].p.v[V_Y] += .05f;
2197
    pFirst_vertex[2].p.v[Z] += -.05f;
2196
    pFirst_vertex[2].p.v[V_Z] += -.05f;
2198
    pFirst_vertex[3].p = *pPoint;
2197
    pFirst_vertex[3].p = *pPoint;
2199
    pFirst_vertex[3].p.v[X] += .05f;
2198
    pFirst_vertex[3].p.v[V_X] += .05f;
2200
    pFirst_vertex[3].p.v[Y] += .05f;
2199
    pFirst_vertex[3].p.v[V_Y] += .05f;
2201
    pFirst_vertex[3].p.v[Z] += .05f;
2200
    pFirst_vertex[3].p.v[V_Z] += .05f;
2202
}
2201
}
2203
 
2202
 
2204
// IDA: void __cdecl ResetAllPedestrians()
2203
// IDA: void __cdecl ResetAllPedestrians()
2205
void ResetAllPedestrians(void) {
2204
void ResetAllPedestrians(void) {
2206
    int i;
2205
    int i;
Line 2224... Line 2223...
2224
        pPedestrian->actor->render_style = BR_RSTYLE_NONE;
2223
        pPedestrian->actor->render_style = BR_RSTYLE_NONE;
2225
        BrActorRelink(gDont_render_actor, pPedestrian->actor);
2224
        BrActorRelink(gDont_render_actor, pPedestrian->actor);
2226
    }
2225
    }
2227
    pPedestrian->mid_air = 0;
2226
    pPedestrian->mid_air = 0;
2228
    BrVector3Set(&cast_point,
2227
    BrVector3Set(&cast_point,
2229
        pPedestrian->pos.v[X],
2228
        pPedestrian->pos.v[V_X],
2230
        pPedestrian->pos.v[Y] + 0.4f,
2229
        pPedestrian->pos.v[V_Y] + 0.4f,
2231
        pPedestrian->pos.v[Z]);
2230
        pPedestrian->pos.v[V_Z]);
2232
    new_y = FindYVerticallyBelow2(&cast_point);
2231
    new_y = FindYVerticallyBelow2(&cast_point);
2233
    pPedestrian->actor->t.t.translate.t.v[Y] = pPedestrian->pos.v[Y] = new_y;
2232
    pPedestrian->actor->t.t.translate.t.v[V_Y] = pPedestrian->pos.v[V_Y] = new_y;
2234
    pPedestrian->spin_period = 0.f;
2233
    pPedestrian->spin_period = 0.f;
2235
    sequence = &pPedestrian->sequences[pPedestrian->current_sequence];
2234
    sequence = &pPedestrian->sequences[pPedestrian->current_sequence];
2236
    if (sequence->number_of_frames == sequence->looping_frame_start) {
2235
    if (sequence->number_of_frames == sequence->looping_frame_start) {
2237
        pPedestrian->current_frame = sequence->number_of_frames - 1;
2236
        pPedestrian->current_frame = sequence->number_of_frames - 1;
2238
        pPedestrian->done_initial = 0;
2237
        pPedestrian->done_initial = 0;
Line 2296... Line 2295...
2296
    pPedestrian->fate = NULL;
2295
    pPedestrian->fate = NULL;
2297
    gInitial_instruction = NULL;
2296
    gInitial_instruction = NULL;
2298
    PedestrianNextInstruction(pPedestrian, 0.f, 1, 0);
2297
    PedestrianNextInstruction(pPedestrian, 0.f, 1, 0);
2299
    BrVector3Copy(&pPedestrian->from_pos, &pPedestrian->actor->t.t.translate.t);
2298
    BrVector3Copy(&pPedestrian->from_pos, &pPedestrian->actor->t.t.translate.t);
2300
    MungePedModel(pPedestrian);
2299
    MungePedModel(pPedestrian);
2301
    pPedestrian->pos.v[Y] += pPedestrian->sequences[pPedestrian->current_sequence].frames[0].offset.v[Y];
2300
    pPedestrian->pos.v[V_Y] += pPedestrian->sequences[pPedestrian->current_sequence].frames[0].offset.v[V_Y];
2302
}
2301
}
2303
 
2302
 
2304
// IDA: void __usercall MungePedestrians(tU32 pFrame_period@<EAX>)
2303
// IDA: void __usercall MungePedestrians(tU32 pFrame_period@<EAX>)
2305
void MungePedestrians(tU32 pFrame_period) {
2304
void MungePedestrians(tU32 pFrame_period) {
2306
    int i;
2305
    int i;
Line 2334... Line 2333...
2334
    }
2333
    }
2335
    // BrVector3(&br_vector3_00550ac0, 0.f, 0.f, 0.f);
2334
    // BrVector3(&br_vector3_00550ac0, 0.f, 0.f, 0.f);
2336
    if (gAction_replay_mode) {
2335
    if (gAction_replay_mode) {
2337
        for (i = 0; i < gPed_count; i++) {
2336
        for (i = 0; i < gPed_count; i++) {
2338
            the_pedestrian = &gPedestrian_array[i];
2337
            the_pedestrian = &gPedestrian_array[i];
2339
            x_delta = fabsf(the_pedestrian->pos.v[X] - gCamera_to_world.m[3][X]);
2338
            x_delta = fabsf(the_pedestrian->pos.v[V_X] - gCamera_to_world.m[3][V_X]);
2340
            z_delta = fabsf(the_pedestrian->pos.v[Z] - gCamera_to_world.m[3][Z]);
2339
            z_delta = fabsf(the_pedestrian->pos.v[V_Z] - gCamera_to_world.m[3][V_Z]);
2341
            if ((the_pedestrian->actor->parent != gDont_render_actor || (x_delta <= ACTIVE_PED_DXDZ && z_delta <= ACTIVE_PED_DXDZ))
2340
            if ((the_pedestrian->actor->parent != gDont_render_actor || (x_delta <= ACTIVE_PED_DXDZ && z_delta <= ACTIVE_PED_DXDZ))
2342
                && (gPedestrians_on || the_pedestrian->ref_number >= 100)
2341
                && (gPedestrians_on || the_pedestrian->ref_number >= 100)
2343
                && the_pedestrian->hit_points != -100) {
2342
                && the_pedestrian->hit_points != -100) {
2344
                gCurrent_lollipop_index = -1;
2343
                gCurrent_lollipop_index = -1;
2345
                DoPedestrian(the_pedestrian, i);
2344
                DoPedestrian(the_pedestrian, i);
2346
            }
2345
            }
2347
        }
2346
        }
2348
    } else {
2347
    } else {
2349
        for (i = 0; i < gPed_count; i++) {
2348
        for (i = 0; i < gPed_count; i++) {
2350
            the_pedestrian = &gPedestrian_array[i];
2349
            the_pedestrian = &gPedestrian_array[i];
2351
            x_delta = fabsf(the_pedestrian->pos.v[X] - gCamera_to_world.m[3][X]);
2350
            x_delta = fabsf(the_pedestrian->pos.v[V_X] - gCamera_to_world.m[3][V_X]);
2352
            z_delta = fabsf(the_pedestrian->pos.v[Z] - gCamera_to_world.m[3][Z]);
2351
            z_delta = fabsf(the_pedestrian->pos.v[V_Z] - gCamera_to_world.m[3][V_Z]);
2353
            if (the_pedestrian->actor->parent == gDont_render_actor
2352
            if (the_pedestrian->actor->parent == gDont_render_actor
2354
                && (x_delta > ACTIVE_PED_DXDZ || z_delta > ACTIVE_PED_DXDZ)) {
2353
                && (x_delta > ACTIVE_PED_DXDZ || z_delta > ACTIVE_PED_DXDZ)) {
2355
                the_pedestrian->active = 0;
2354
                the_pedestrian->active = 0;
2356
            } else if (the_pedestrian->hit_points == -100) {
2355
            } else if (the_pedestrian->hit_points == -100) {
2357
                if (the_pedestrian->respawn_time == 0) {
2356
                if (the_pedestrian->respawn_time == 0) {
Line 2408... Line 2407...
2408
            // This is done such that the "Peds visible on map" powerup draws far away items.
2407
            // This is done such that the "Peds visible on map" powerup draws far away items.
2409
            // (far away animated pedestrians would otherwise remain invisible on the map)
2408
            // (far away animated pedestrians would otherwise remain invisible on the map)
2410
            br_scalar x_delta;
2409
            br_scalar x_delta;
2411
            br_scalar z_delta;
2410
            br_scalar z_delta;
2412
            int ped_respawn_animate;
2411
            int ped_respawn_animate;
2413
            x_delta = fabsf(the_pedestrian->pos.v[X] - gCamera_to_world.m[3][X]);
2412
            x_delta = fabsf(the_pedestrian->pos.v[V_X] - gCamera_to_world.m[3][V_X]);
2414
            z_delta = fabsf(the_pedestrian->pos.v[Z] - gCamera_to_world.m[3][Z]);
2413
            z_delta = fabsf(the_pedestrian->pos.v[V_Z] - gCamera_to_world.m[3][V_Z]);
2415
            ped_respawn_animate = x_delta <= ACTIVE_PED_DXDZ && z_delta <= ACTIVE_PED_DXDZ;
2414
            ped_respawn_animate = x_delta <= ACTIVE_PED_DXDZ && z_delta <= ACTIVE_PED_DXDZ;
2416
#else
2415
#else
2417
#define ped_respawn_animate 1
2416
#define ped_respawn_animate 1
2418
#endif
2417
#endif
2419
            if (the_pedestrian->hit_points == -100) {
2418
            if (the_pedestrian->hit_points == -100) {
Line 2954... Line 2953...
2954
    face_count = 0;
2953
    face_count = 0;
2955
    point_count = 0;
2954
    point_count = 0;
2956
    for (j = 0; j < pInstruc_count; j++) {
2955
    for (j = 0; j < pInstruc_count; j++) {
2957
        if (pInstructions[j].type == ePed_instruc_point || pInstructions[j].type == ePed_instruc_xpoint) {
2956
        if (pInstructions[j].type == ePed_instruc_point || pInstructions[j].type == ePed_instruc_xpoint) {
2958
            the_point = pInstructions[j].data.point_data.position;
2957
            the_point = pInstructions[j].data.point_data.position;
2959
            if (the_point.v[Y] < 500.f) {
2958
            if (the_point.v[V_Y] < 500.f) {
2960
                the_mat = gPath_mat_normal;
2959
                the_mat = gPath_mat_normal;
2961
            } else {
2960
            } else {
2962
                the_point.v[Y] -= 999.6f;
2961
                the_point.v[V_Y] -= 999.6f;
2963
                the_point.v[Y] = FindYVerticallyBelow2(&the_point);
2962
                the_point.v[V_Y] = FindYVerticallyBelow2(&the_point);
2964
                if (the_point.v[Y] < -100.f) {
2963
                if (the_point.v[V_Y] < -100.f) {
2965
                    the_point.v[Y] = 1000.f;
2964
                    the_point.v[V_Y] = 1000.f;
2966
                    the_point.v[Y] = FindYVerticallyBelow2(&the_point);
2965
                    the_point.v[V_Y] = FindYVerticallyBelow2(&the_point);
2967
                }
2966
                }
2968
                if (point_count == 0 || pInstructions[j - 1].data.point_data.position.v[Y] < 500.f) {
2967
                if (point_count == 0 || pInstructions[j - 1].data.point_data.position.v[V_Y] < 500.f) {
2969
                    the_mat = gPath_mat_normal;
2968
                    the_mat = gPath_mat_normal;
2970
                } else {
2969
                } else {
2971
                    the_mat = gPath_mat_calc;
2970
                    the_mat = gPath_mat_calc;
2972
                }
2971
                }
2973
            }
2972
            }
Line 3001... Line 3000...
3001
            }
3000
            }
3002
            point_count++;
3001
            point_count++;
3003
            last_vertex_count = vertex_count;
3002
            last_vertex_count = vertex_count;
3004
            if (j == pInit_instruc) {
3003
            if (j == pInit_instruc) {
3005
                the_model->vertices[vertex_count].p = the_point;
3004
                the_model->vertices[vertex_count].p = the_point;
3006
                the_model->vertices[vertex_count].p.v[Y] += .3f;
3005
                the_model->vertices[vertex_count].p.v[V_Y] += .3f;
3007
                the_model->vertices[vertex_count].p.v[Z] += .05f;
3006
                the_model->vertices[vertex_count].p.v[V_Z] += .05f;
3008
                the_model->vertices[vertex_count + 1].p = the_point;
3007
                the_model->vertices[vertex_count + 1].p = the_point;
3009
                the_model->vertices[vertex_count + 1].p.v[Y] += .3f;
3008
                the_model->vertices[vertex_count + 1].p.v[V_Y] += .3f;
3010
                the_model->vertices[vertex_count + 1].p.v[Z] += -.05f;
3009
                the_model->vertices[vertex_count + 1].p.v[V_Z] += -.05f;
3011
                the_model->vertices[vertex_count + 2].p = the_point;
3010
                the_model->vertices[vertex_count + 2].p = the_point;
3012
                the_model->vertices[vertex_count + 2].p.v[Y] += .3f;
3011
                the_model->vertices[vertex_count + 2].p.v[V_Y] += .3f;
3013
                the_model->vertices[vertex_count + 2].p.v[X] += .05f;
3012
                the_model->vertices[vertex_count + 2].p.v[V_X] += .05f;
3014
                the_model->vertices[vertex_count + 3].p = the_point;
3013
                the_model->vertices[vertex_count + 3].p = the_point;
3015
                the_model->vertices[vertex_count + 3].p.v[Y] += .3f;
3014
                the_model->vertices[vertex_count + 3].p.v[V_Y] += .3f;
3016
                the_model->vertices[vertex_count + 3].p.v[X] += -.05f;
3015
                the_model->vertices[vertex_count + 3].p.v[V_X] += -.05f;
3017
                vertex_count += 4;
3016
                vertex_count += 4;
3018
                the_model->faces[face_count].vertices[0] = vertex_count - 8;
3017
                the_model->faces[face_count].vertices[0] = vertex_count - 8;
3019
                the_model->faces[face_count].vertices[1] = vertex_count - 4;
3018
                the_model->faces[face_count].vertices[1] = vertex_count - 4;
3020
                the_model->faces[face_count].vertices[2] = vertex_count - 3;
3019
                the_model->faces[face_count].vertices[2] = vertex_count - 3;
3021
                the_model->faces[face_count].material = gInit_pos_mat_calc;
3020
                the_model->faces[face_count].material = gInit_pos_mat_calc;
Line 3069... Line 3068...
3069
        for (j = 0, the_instruction = the_pedestrian->instruction_list; j < the_pedestrian->number_of_instructions; j++, the_instruction++) {
3068
        for (j = 0, the_instruction = the_pedestrian->instruction_list; j < the_pedestrian->number_of_instructions; j++, the_instruction++) {
3070
            switch (the_instruction->type) {
3069
            switch (the_instruction->type) {
3071
            case ePed_instruc_point:
3070
            case ePed_instruc_point:
3072
                fprintf(f, "\tpoint\n");
3071
                fprintf(f, "\tpoint\n");
3073
                fprintf(f, "\t%.3f,%.3f,%.3f\n",
3072
                fprintf(f, "\t%.3f,%.3f,%.3f\n",
3074
                    the_instruction->data.point_data.position.v[X],
3073
                    the_instruction->data.point_data.position.v[V_X],
3075
                    the_instruction->data.point_data.position.v[Y],
3074
                    the_instruction->data.point_data.position.v[V_Y],
3076
                    the_instruction->data.point_data.position.v[Z]);
3075
                    the_instruction->data.point_data.position.v[V_Z]);
3077
                break;
3076
                break;
3078
            case ePed_instruc_xpoint:
3077
            case ePed_instruc_xpoint:
3079
                fprintf(f, "\txpoint\n");
3078
                fprintf(f, "\txpoint\n");
3080
                fprintf(f, "\t%.3f,%.3f,%.3f\n",
3079
                fprintf(f, "\t%.3f,%.3f,%.3f\n",
3081
                    the_instruction->data.point_data.position.v[X],
3080
                    the_instruction->data.point_data.position.v[V_X],
3082
                    the_instruction->data.point_data.position.v[Y],
3081
                    the_instruction->data.point_data.position.v[V_Y],
3083
                    the_instruction->data.point_data.position.v[Z]);
3082
                    the_instruction->data.point_data.position.v[V_Z]);
3084
                break;
3083
                break;
3085
            case ePed_instruc_bchoice:
3084
            case ePed_instruc_bchoice:
3086
                fprintf(f, "\tbchoice\n");
3085
                fprintf(f, "\tbchoice\n");
3087
                fprintf(f, "%d", the_instruction->data.choice_data.number_of_choices);
3086
                fprintf(f, "%d", the_instruction->data.choice_data.number_of_choices);
3088
                for (k = 0, the_choice = the_instruction->data.choice_data.choices; k < the_instruction->data.choice_data.number_of_choices; k++, the_choice++) {
3087
                for (k = 0, the_choice = the_instruction->data.choice_data.choices; k < the_instruction->data.choice_data.number_of_choices; k++, the_choice++) {
Line 3416... Line 3415...
3416
    LOG_TRACE("()");
3415
    LOG_TRACE("()");
3417
 
3416
 
3418
    gPed_instrucs[gPed_instruc_count].type = ePed_instruc_point;
3417
    gPed_instrucs[gPed_instruc_count].type = ePed_instruc_point;
3419
    gPed_instrucs[gPed_instruc_count].data.point_data.irreversable = 0;
3418
    gPed_instrucs[gPed_instruc_count].data.point_data.irreversable = 0;
3420
    gPed_instrucs[gPed_instruc_count].data.point_data.position = *gOur_pos;
3419
    gPed_instrucs[gPed_instruc_count].data.point_data.position = *gOur_pos;
3421
    gPed_instrucs[gPed_instruc_count].data.point_data.position.v[Y] += 1000.4f;
3420
    gPed_instrucs[gPed_instruc_count].data.point_data.position.v[V_Y] += 1000.4f;
3422
    gPed_instruc_count++;
3421
    gPed_instruc_count++;
3423
    MungeShowPedPath();
3422
    MungeShowPedPath();
3424
}
3423
}
3425
 
3424
 
3426
// IDA: void __cdecl DropPedPointAir()
3425
// IDA: void __cdecl DropPedPointAir()
Line 3449... Line 3448...
3449
    DropPedPointAir2();
3448
    DropPedPointAir2();
3450
    NewTextHeadupSlot(4, 0, 2000, -1, "Dropped initial auto-y pedestrian point");
3449
    NewTextHeadupSlot(4, 0, 2000, -1, "Dropped initial auto-y pedestrian point");
3451
}
3450
}
3452
 
3451
 
3453
// IDA: br_uint_32 __cdecl KillActorsModel(br_actor *pActor, void *pArg)
3452
// IDA: br_uint_32 __cdecl KillActorsModel(br_actor *pActor, void *pArg)
3454
br_uintptr_t KillActorsModel(br_actor* pActor, void* pArg) {
3453
intptr_t KillActorsModel(br_actor* pActor, void* pArg) {
3455
    LOG_TRACE("(%p, %p)", pActor, pArg);
3454
    LOG_TRACE("(%p, %p)", pActor, pArg);
3456
 
3455
 
3457
    if (pActor->model != NULL) {
3456
    if (pActor->model != NULL) {
3458
        BrModelRemove(pActor->model);
3457
        BrModelRemove(pActor->model);
3459
        BrModelFree(pActor->model);
3458
        BrModelFree(pActor->model);
Line 3491... Line 3490...
3491
    min_distance = BR_SCALAR_MAX;
3490
    min_distance = BR_SCALAR_MAX;
3492
    for (i = 0; i < gPed_count; i++) {
3491
    for (i = 0; i < gPed_count; i++) {
3493
        for (j = 0; j < gPedestrian_array[i].number_of_instructions; j++) {
3492
        for (j = 0; j < gPedestrian_array[i].number_of_instructions; j++) {
3494
            if (gPedestrian_array[i].instruction_list[j].type == ePed_instruc_point || gPedestrian_array[i].instruction_list[j].type == ePed_instruc_xpoint) {
3493
            if (gPedestrian_array[i].instruction_list[j].type == ePed_instruc_point || gPedestrian_array[i].instruction_list[j].type == ePed_instruc_xpoint) {
3495
                the_point = gPedestrian_array[i].instruction_list[j].data.point_data.position;
3494
                the_point = gPedestrian_array[i].instruction_list[j].data.point_data.position;
3496
                if (the_point.v[Y] >= 500.f) {
3495
                if (the_point.v[V_Y] >= 500.f) {
3497
                    the_point.v[Y] -= 999.6f;
3496
                    the_point.v[V_Y] -= 999.6f;
3498
                    the_point.v[Y] = FindYVerticallyBelow2(&the_point);
3497
                    the_point.v[V_Y] = FindYVerticallyBelow2(&the_point);
3499
                    if (the_point.v[Y] < -100.f) {
3498
                    if (the_point.v[V_Y] < -100.f) {
3500
                        the_point.v[Y] = 1000.f;
3499
                        the_point.v[V_Y] = 1000.f;
3501
                        the_point.v[Y] = FindYVerticallyBelow2(&the_point);
3500
                        the_point.v[V_Y] = FindYVerticallyBelow2(&the_point);
3502
                    }
3501
                    }
3503
                }
3502
                }
3504
                the_distance = Vector3DistanceSquared(&the_point, gOur_pos);
3503
                the_distance = Vector3DistanceSquared(&the_point, gOur_pos);
3505
                if (the_distance < min_distance) {
3504
                if (the_distance < min_distance) {
3506
                    *pPed_index = i;
3505
                    *pPed_index = i;
Line 3588... Line 3587...
3588
    LOG_TRACE("()");
3587
    LOG_TRACE("()");
3589
 
3588
 
3590
    if (gPed_instruc_count == 0) {
3589
    if (gPed_instruc_count == 0) {
3591
        GetPedPos(&the_ped, &the_point);
3590
        GetPedPos(&the_ped, &the_point);
3592
        gPedestrian_array[the_ped].instruction_list[the_point].data.point_data.position = *gOur_pos;
3591
        gPedestrian_array[the_ped].instruction_list[the_point].data.point_data.position = *gOur_pos;
3593
        gPedestrian_array[the_ped].instruction_list[the_point].data.point_data.position.v[Y] += 1000.4f;
3592
        gPedestrian_array[the_ped].instruction_list[the_point].data.point_data.position.v[V_Y] += 1000.4f;
3594
        WriteOutPeds();
3593
        WriteOutPeds();
3595
        DisposePedPaths();
3594
        DisposePedPaths();
3596
        ShowPedPaths();
3595
        ShowPedPaths();
3597
    }
3596
    }
3598
}
3597
}
Line 3769... Line 3768...
3769
                gProximity_rays[i].car,
3768
                gProximity_rays[i].car,
3770
                GET_PEDESTRIAN_INDEX(gProximity_rays[i].ped),
3769
                GET_PEDESTRIAN_INDEX(gProximity_rays[i].ped),
3771
                gProximity_rays[i].start_time);
3770
                gProximity_rays[i].start_time);
3772
            car_model = gProximity_rays[i].car->car_model_actors[gProximity_rays[i].car->principal_car_actor].actor->model;
3771
            car_model = gProximity_rays[i].car->car_model_actors[gProximity_rays[i].car->principal_car_actor].actor->model;
3773
 
3772
 
3774
            BrVector3Set(&car_add_c, 0.f, (car_model->bounds.max.v[Y] - car_model->bounds.min.v[Y]) / -5.f, 0.f);
3773
            BrVector3Set(&car_add_c, 0.f, (car_model->bounds.max.v[V_Y] - car_model->bounds.min.v[V_Y]) / -5.f, 0.f);
3775
            BrMatrix34ApplyV(&car_add, &car_add_c, &gProximity_rays[i].car->car_master_actor->t.t.mat);
3774
            BrMatrix34ApplyV(&car_add, &car_add_c, &gProximity_rays[i].car->car_master_actor->t.t.mat);
3776
            BrVector3Add(&car_pos, &gProximity_rays[i].car->pos, &car_add);
3775
            BrVector3Add(&car_pos, &gProximity_rays[i].car->pos, &car_add);
3777
            DRMatrix34TApplyP(&car_pos_cam, &car_pos, &gCamera_to_world);
3776
            DRMatrix34TApplyP(&car_pos_cam, &car_pos, &gCamera_to_world);
3778
 
3777
 
3779
            BrVector3Set(&ped_add, 0.f, gProximity_rays[i].ped->actor->t.t.mat.m[1][1] / 2.f, 0.f);
3778
            BrVector3Set(&ped_add, 0.f, gProximity_rays[i].ped->actor->t.t.mat.m[1][1] / 2.f, 0.f);
Line 3784... Line 3783...
3784
            distance = BrVector3Length(&r1);
3783
            distance = BrVector3Length(&r1);
3785
            BrVector3Normalise(&r1, &r1);
3784
            BrVector3Normalise(&r1, &r1);
3786
 
3785
 
3787
            from_pos = car_pos_cam;
3786
            from_pos = car_pos_cam;
3788
 
3787
 
3789
            seed = the_time + ped_pos.v[X] + ped_pos.v[Y] + ped_pos.v[Z] + car_pos.v[X] + car_pos.v[Y] + car_pos.v[Z];
3788
            seed = the_time + ped_pos.v[V_X] + ped_pos.v[V_Y] + ped_pos.v[V_Z] + car_pos.v[V_X] + car_pos.v[V_Y] + car_pos.v[V_Z];
3790
            srand(seed);
3789
            srand(seed);
3791
 
3790
 
3792
            t = 0.f;
3791
            t = 0.f;
3793
            do {
3792
            do {
3794
                BrVector3Scale(&ray, &r1, t);
3793
                BrVector3Scale(&ray, &r1, t);
3795
                BrVector3Add(&to_pos, &ray, &car_pos_cam);
3794
                BrVector3Add(&to_pos, &ray, &car_pos_cam);
3796
                to_pos.v[X] += SRandomPosNeg(0.1f);
3795
                to_pos.v[V_X] += SRandomPosNeg(0.1f);
3797
                to_pos.v[Y] += SRandomPosNeg(0.1f);
3796
                to_pos.v[V_Y] += SRandomPosNeg(0.1f);
3798
                to_pos.v[Z] += SRandomPosNeg(0.1f);
3797
                to_pos.v[V_Z] += SRandomPosNeg(0.1f);
3799
                DrawLine3D(&to_pos, &from_pos, pRender_screen, pDepth_buffer, gProx_ray_shade_table);
3798
                DrawLine3D(&to_pos, &from_pos, pRender_screen, pDepth_buffer, gProx_ray_shade_table);
3800
                from_pos = to_pos;
3799
                from_pos = to_pos;
3801
                t += 0.05f;
3800
                t += 0.05f;
3802
            } while (t < distance);
3801
            } while (t < distance);
3803
            DrawLine3D(&ped_pos_cam, &from_pos, pRender_screen, pDepth_buffer, gProx_ray_shade_table);
3802
            DrawLine3D(&ped_pos_cam, &from_pos, pRender_screen, pDepth_buffer, gProx_ray_shade_table);