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 1... Line 1...
1
#include "opponent.h"
1
#include "opponent.h"
2
#include "brender/brender.h"
2
#include "brender.h"
3
#include "car.h"
3
#include "car.h"
4
#include "controls.h"
4
#include "controls.h"
5
#include "crush.h"
5
#include "crush.h"
6
#include "displays.h"
6
#include "displays.h"
7
#include "errors.h"
7
#include "errors.h"
Line 2779... Line 2779...
2779
    tS16 section_no;
2779
    tS16 section_no;
2780
    int node_index_index;
2780
    int node_index_index;
2781
    LOG_TRACE("(%p, %d)", pOpponent_spec, pSection);
2781
    LOG_TRACE("(%p, %d)", pOpponent_spec, pSection);
2782
 
2782
 
2783
    if (pSection >= 20000 && pSection - 20000 < pOpponent_spec->nnext_sections) {
2783
    if (pSection >= 20000 && pSection - 20000 < pOpponent_spec->nnext_sections) {
2784
      node_index_index = pOpponent_spec->next_sections[pSection - 20000].direction == 0;
2784
        node_index_index = pOpponent_spec->next_sections[pSection - 20000].direction == 0;
2785
      if (pSection - 20000 > pOpponent_spec->nnext_sections) {
2785
        if (pSection - 20000 > pOpponent_spec->nnext_sections) {
2786
          section_no = -1;
2786
            section_no = -1;
2787
      } else {
2787
        } else {
2788
          section_no = gProgram_state.AI_vehicles.path_sections[pOpponent_spec->next_sections[pSection - 20000].section_no].node_indices[node_index_index];
2788
            section_no = gProgram_state.AI_vehicles.path_sections[pOpponent_spec->next_sections[pSection - 20000].section_no].node_indices[node_index_index];
2789
          return section_no;
2789
            return section_no;
2790
      }
2790
        }
2791
    }
2791
    }
2792
    dr_dprintf("BIG ERROR - GetOpponentsSectionStartNode() - section not found in next_section array for opponent %s",
2792
    dr_dprintf("BIG ERROR - GetOpponentsSectionStartNode() - section not found in next_section array for opponent %s",
2793
        pOpponent_spec->car_spec->driver_name);
2793
        pOpponent_spec->car_spec->driver_name);
2794
    PDEnterDebugger("BIG ERROR - GetOpponentsSectionStartNode()");
2794
    PDEnterDebugger("BIG ERROR - GetOpponentsSectionStartNode()");
2795
    return -1;
2795
    return -1;
Line 2799... Line 2799...
2799
tS16 GetOpponentsSectionFinishNode(tOpponent_spec* pOpponent_spec, tS16 pSection) {
2799
tS16 GetOpponentsSectionFinishNode(tOpponent_spec* pOpponent_spec, tS16 pSection) {
2800
    //tS16 section_no; // Pierre-Marie Baty -- unused variable
2800
    //tS16 section_no; // Pierre-Marie Baty -- unused variable
2801
    //int node_index_index; // Pierre-Marie Baty -- unused variable
2801
    //int node_index_index; // Pierre-Marie Baty -- unused variable
2802
    LOG_TRACE("(%p, %d)", pOpponent_spec, pSection);
2802
    LOG_TRACE("(%p, %d)", pOpponent_spec, pSection);
2803
 
2803
 
2804
   if (pSection >= 20000 && pSection - 20000 < pOpponent_spec->nnext_sections) {
2804
    if (pSection >= 20000 && pSection - 20000 < pOpponent_spec->nnext_sections) {
2805
       return gProgram_state.AI_vehicles.path_sections[pOpponent_spec->next_sections[pSection - 20000].section_no].node_indices[pOpponent_spec->next_sections[pSection - 20000].direction];
2805
        return gProgram_state.AI_vehicles.path_sections[pOpponent_spec->next_sections[pSection - 20000].section_no].node_indices[pOpponent_spec->next_sections[pSection - 20000].direction];
2806
   }
2806
    }
2807
   dr_dprintf("BIG ERROR - GetOpponentsSectionFinishNode() - section not found in next_section array for opponent %s",
2807
    dr_dprintf("BIG ERROR - GetOpponentsSectionFinishNode() - section not found in next_section array for opponent %s",
2808
       pOpponent_spec->car_spec->driver_name);
2808
        pOpponent_spec->car_spec->driver_name);
2809
   PDEnterDebugger("BIG ERROR - GetOpponentsSectionFinishNode()");
2809
    PDEnterDebugger("BIG ERROR - GetOpponentsSectionFinishNode()");
2810
   return 0;
2810
    return 0;
2811
}
2811
}
2812
 
2812
 
2813
// IDA: br_vector3* __usercall GetOpponentsSectionStartNodePoint@<EAX>(tOpponent_spec *pOpponent_spec@<EAX>, tS16 pSection@<EDX>)
2813
// IDA: br_vector3* __usercall GetOpponentsSectionStartNodePoint@<EAX>(tOpponent_spec *pOpponent_spec@<EAX>, tS16 pSection@<EDX>)
2814
br_vector3* GetOpponentsSectionStartNodePoint(tOpponent_spec* pOpponent_spec, tS16 pSection) {
2814
br_vector3* GetOpponentsSectionStartNodePoint(tOpponent_spec* pOpponent_spec, tS16 pSection) {
2815
    tS16 section_no;
2815
    tS16 section_no;
Line 3249... Line 3249...
3249
    new_section = ReallocExtraPathSections(1);
3249
    new_section = ReallocExtraPathSections(1);
3250
    gProgram_state.AI_vehicles.path_sections[new_section].node_indices[0] = pInserted_node;
3250
    gProgram_state.AI_vehicles.path_sections[new_section].node_indices[0] = pInserted_node;
3251
    gProgram_state.AI_vehicles.path_sections[new_section].node_indices[1] = section_no_index;
3251
    gProgram_state.AI_vehicles.path_sections[new_section].node_indices[1] = section_no_index;
3252
    gProgram_state.AI_vehicles.path_sections[new_section].min_speed[0] = 0;
3252
    gProgram_state.AI_vehicles.path_sections[new_section].min_speed[0] = 0;
3253
    gProgram_state.AI_vehicles.path_sections[new_section].max_speed[0] = 255;
3253
    gProgram_state.AI_vehicles.path_sections[new_section].max_speed[0] = 255;
3254
    gProgram_state.AI_vehicles.path_sections[new_section].min_speed[1] =
-
 
3255
        gProgram_state.AI_vehicles.path_sections[pSection_no].min_speed[1];
3254
    gProgram_state.AI_vehicles.path_sections[new_section].min_speed[1] = gProgram_state.AI_vehicles.path_sections[pSection_no].min_speed[1];
3256
    gProgram_state.AI_vehicles.path_sections[new_section].max_speed[1] =
-
 
3257
        gProgram_state.AI_vehicles.path_sections[pSection_no].max_speed[1];
3255
    gProgram_state.AI_vehicles.path_sections[new_section].max_speed[1] = gProgram_state.AI_vehicles.path_sections[pSection_no].max_speed[1];
3258
    gProgram_state.AI_vehicles.path_sections[new_section].width =
-
 
3259
        gProgram_state.AI_vehicles.path_sections[pSection_no].width;
3256
    gProgram_state.AI_vehicles.path_sections[new_section].width = gProgram_state.AI_vehicles.path_sections[pSection_no].width;
3260
    gProgram_state.AI_vehicles.path_sections[new_section].type =
-
 
3261
        gProgram_state.AI_vehicles.path_sections[pSection_no].type;
3257
    gProgram_state.AI_vehicles.path_sections[new_section].type = gProgram_state.AI_vehicles.path_sections[pSection_no].type;
3262
    gProgram_state.AI_vehicles.path_sections[new_section].one_way =
-
 
3263
        gProgram_state.AI_vehicles.path_sections[pSection_no].one_way;
3258
    gProgram_state.AI_vehicles.path_sections[new_section].one_way = gProgram_state.AI_vehicles.path_sections[pSection_no].one_way;
3264
    gProgram_state.AI_vehicles.path_sections[pSection_no].node_indices[1] = pInserted_node;
3259
    gProgram_state.AI_vehicles.path_sections[pSection_no].node_indices[1] = pInserted_node;
3265
    gProgram_state.AI_vehicles.path_sections[pSection_no].min_speed[1] = 0;
3260
    gProgram_state.AI_vehicles.path_sections[pSection_no].min_speed[1] = 0;
3266
    gProgram_state.AI_vehicles.path_sections[pSection_no].max_speed[1] = 255;
3261
    gProgram_state.AI_vehicles.path_sections[pSection_no].max_speed[1] = 255;
3267
    BrVector3Copy(&gProgram_state.AI_vehicles.path_nodes[pInserted_node].p, pWhere);
3262
    BrVector3Copy(&gProgram_state.AI_vehicles.path_nodes[pInserted_node].p, pWhere);
3268
    gProgram_state.AI_vehicles.path_nodes[pInserted_node].sections
3263
    gProgram_state.AI_vehicles.path_nodes[pInserted_node].sections
3269
        [gProgram_state.AI_vehicles.path_nodes[pInserted_node].number_of_sections] = pSection_no;
3264
        [gProgram_state.AI_vehicles.path_nodes[pInserted_node].number_of_sections]
3270
    gProgram_state.AI_vehicles.path_nodes[pInserted_node].number_of_sections =
3265
        = pSection_no;
3271
        gProgram_state.AI_vehicles.path_nodes[pInserted_node].number_of_sections + 1;
3266
    gProgram_state.AI_vehicles.path_nodes[pInserted_node].number_of_sections = gProgram_state.AI_vehicles.path_nodes[pInserted_node].number_of_sections + 1;
3272
    gProgram_state.AI_vehicles.path_nodes[pInserted_node].sections
3267
    gProgram_state.AI_vehicles.path_nodes[pInserted_node].sections
3273
        [gProgram_state.AI_vehicles.path_nodes[pInserted_node].number_of_sections] = new_section;
3268
        [gProgram_state.AI_vehicles.path_nodes[pInserted_node].number_of_sections]
3274
    gProgram_state.AI_vehicles.path_nodes[pInserted_node].number_of_sections =
3269
        = new_section;
3275
        gProgram_state.AI_vehicles.path_nodes[pInserted_node].number_of_sections + 1;
3270
    gProgram_state.AI_vehicles.path_nodes[pInserted_node].number_of_sections = gProgram_state.AI_vehicles.path_nodes[pInserted_node].number_of_sections + 1;
3276
    for (node1 = 0; node1 < gProgram_state.AI_vehicles.path_nodes[section_no_index].number_of_sections; node1++) {
3271
    for (node1 = 0; node1 < gProgram_state.AI_vehicles.path_nodes[section_no_index].number_of_sections; node1++) {
3277
        if (gProgram_state.AI_vehicles.path_nodes[section_no_index].sections[node1] == pSection_no) {
3272
        if (gProgram_state.AI_vehicles.path_nodes[section_no_index].sections[node1] == pSection_no) {
3278
            gProgram_state.AI_vehicles.path_nodes[section_no_index].sections[node1] = new_section;
3273
            gProgram_state.AI_vehicles.path_nodes[section_no_index].sections[node1] = new_section;
3279
        }
3274
        }
3280
    }
3275
    }
Line 3653... Line 3648...
3653
                centre_mat_dk = gMat_dk_blu;
3648
                centre_mat_dk = gMat_dk_blu;
3654
            }
3649
            }
3655
            if (gProgram_state.AI_vehicles.path_sections[i].one_way) {
3650
            if (gProgram_state.AI_vehicles.path_sections[i].one_way) {
3656
                centre_mat_lt = gMat_lt_yel;
3651
                centre_mat_lt = gMat_lt_yel;
3657
            }
3652
            }
3658
            if ((gProgram_state.AI_vehicles.path_sections[i].min_speed[0] != 0) ||
-
 
3659
                (gProgram_state.AI_vehicles.path_sections[i].max_speed[0] != 255)) {
3653
            if ((gProgram_state.AI_vehicles.path_sections[i].min_speed[0] != 0) || (gProgram_state.AI_vehicles.path_sections[i].max_speed[0] != 255)) {
3660
                edge_mat_start_lt = gMat_lt_turq;
3654
                edge_mat_start_lt = gMat_lt_turq;
3661
                edge_mat_start_dk = gMat_dk_turq;
3655
                edge_mat_start_dk = gMat_dk_turq;
3662
            }
3656
            }
3663
            if ((gProgram_state.AI_vehicles.path_sections[i].min_speed[1] != 0) ||
-
 
3664
                (gProgram_state.AI_vehicles.path_sections[i].max_speed[1] != 255)) {
3657
            if ((gProgram_state.AI_vehicles.path_sections[i].min_speed[1] != 0) || (gProgram_state.AI_vehicles.path_sections[i].max_speed[1] != 255)) {
3665
                edge_mat_finish_lt = gMat_lt_turq;
3658
                edge_mat_finish_lt = gMat_lt_turq;
3666
                edge_mat_finish_dk = gMat_dk_turq;
3659
                edge_mat_finish_dk = gMat_dk_turq;
3667
            }
3660
            }
3668
            if (gAlready_elasticating && gMobile_section == i) {
3661
            if (gAlready_elasticating && gMobile_section == i) {
3669
                BrVector3Copy(&gProgram_state.AI_vehicles.path_nodes[gProgram_state.AI_vehicles.path_sections[i].node_indices[1]].p,
3662
                BrVector3Copy(&gProgram_state.AI_vehicles.path_nodes[gProgram_state.AI_vehicles.path_sections[i].node_indices[1]].p,
Line 3671... Line 3664...
3671
            }
3664
            }
3672
            MakeSection(18 * i, 12 * i,
3665
            MakeSection(18 * i, 12 * i,
3673
                &gProgram_state.AI_vehicles.path_nodes[gProgram_state.AI_vehicles.path_sections[i].node_indices[0]].p,
3666
                &gProgram_state.AI_vehicles.path_nodes[gProgram_state.AI_vehicles.path_sections[i].node_indices[0]].p,
3674
                &gProgram_state.AI_vehicles.path_nodes[gProgram_state.AI_vehicles.path_sections[i].node_indices[1]].p,
3667
                &gProgram_state.AI_vehicles.path_nodes[gProgram_state.AI_vehicles.path_sections[i].node_indices[1]].p,
3675
                gProgram_state.AI_vehicles.path_sections[i].width,
3668
                gProgram_state.AI_vehicles.path_sections[i].width,
3676
                centre_mat_lt,centre_mat_dk,
3669
                centre_mat_lt, centre_mat_dk,
3677
                edge_mat_start_lt,edge_mat_start_dk,
3670
                edge_mat_start_lt, edge_mat_start_dk,
3678
                edge_mat_finish_lt,edge_mat_finish_dk);
3671
                edge_mat_finish_lt, edge_mat_finish_dk);
3679
        }
3672
        }
3680
        for (i = 0; i < gProgram_state.AI_vehicles.number_of_cops; i++) {
3673
        for (i = 0; i < gProgram_state.AI_vehicles.number_of_cops; i++) {
3681
            MakeCube(18 * gProgram_state.AI_vehicles.number_of_path_sections + 8 * i,
3674
            MakeCube(18 * gProgram_state.AI_vehicles.number_of_path_sections + 8 * i,
3682
                12 * gProgram_state.AI_vehicles.number_of_path_sections + 12 * i,
3675
                12 * gProgram_state.AI_vehicles.number_of_path_sections + 12 * i,
3683
                gProgram_state.AI_vehicles.cop_start_points + i,
3676
                gProgram_state.AI_vehicles.cop_start_points + i,
Line 3889... Line 3882...
3889
#ifdef DETHRACE_FIX_BUGS
3882
#ifdef DETHRACE_FIX_BUGS
3890
    f = fopen(gOppo_path_filename, "w");
3883
    f = fopen(gOppo_path_filename, "w");
3891
#else
3884
#else
3892
    f = DRfopen(gOppo_path_filename, "wt");
3885
    f = DRfopen(gOppo_path_filename, "wt");
3893
#endif
3886
#endif
-
 
3887
    if (f == NULL) {
3894
    if (f == NULL) { printf("f is NULL, errno=%d, msg=\"%s\"\n", errno, strerror(errno));}
3888
        printf("f is NULL, errno=%d, msg=\"%s\"\n", errno, strerror(errno));
-
 
3889
    }
3895
    fprintf(f, "%s\n", "START OF OPPONENT PATHS");
3890
    fprintf(f, "%s\n", "START OF OPPONENT PATHS");
3896
    fprintf(f, "\n%-3d                             // Number of path nodes\n",
3891
    fprintf(f, "\n%-3d                             // Number of path nodes\n",
3897
        gProgram_state.AI_vehicles.number_of_path_nodes);
3892
        gProgram_state.AI_vehicles.number_of_path_nodes);
3898
    for (i = 0; i < gProgram_state.AI_vehicles.number_of_path_nodes; i++) {
3893
    for (i = 0; i < gProgram_state.AI_vehicles.number_of_path_nodes; i++) {
3899
        fprintf(f, "%9.3f,%9.3f,%9.3f   // Node #%d\n",
3894
        fprintf(f, "%9.3f,%9.3f,%9.3f   // Node #%d\n",
Line 3993... Line 3988...
3993
            return;
3988
            return;
3994
        }
3989
        }
3995
        original_type = 0;
3990
        original_type = 0;
3996
        if (gProgram_state.AI_vehicles.path_nodes[old_node].number_of_sections != 0) {
3991
        if (gProgram_state.AI_vehicles.path_nodes[old_node].number_of_sections != 0) {
3997
            for (section_no_index = 1; section_no_index < gProgram_state.AI_vehicles.path_nodes[old_node].number_of_sections; section_no_index++) {
3992
            for (section_no_index = 1; section_no_index < gProgram_state.AI_vehicles.path_nodes[old_node].number_of_sections; section_no_index++) {
3998
                if (gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[old_node].sections[section_no_index]].type !=
3993
                if (gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[old_node].sections[section_no_index]].type != gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[old_node].sections[0]].type) {
3999
                        gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[old_node].sections[0]].type) {
-
 
4000
                    all_the_same_type = 0;
3994
                    all_the_same_type = 0;
4001
                }
3995
                }
4002
            }
3996
            }
4003
            if (all_the_same_type) {
3997
            if (all_the_same_type) {
4004
                original_type = gProgram_state.AI_vehicles.path_sections [gProgram_state.AI_vehicles.path_nodes[old_node].sections[0]].type;
3998
                original_type = gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[old_node].sections[0]].type;
4005
            }
3999
            }
4006
        }
4000
        }
4007
        gAlready_elasticating = 1;
4001
        gAlready_elasticating = 1;
4008
        new_node = ReallocExtraPathNodes(1);
4002
        new_node = ReallocExtraPathNodes(1);
4009
        gMobile_section = ReallocExtraPathSections(1);
4003
        gMobile_section = ReallocExtraPathSections(1);
Line 4018... Line 4012...
4018
    gProgram_state.AI_vehicles.path_sections[gMobile_section].type = original_type;
4012
    gProgram_state.AI_vehicles.path_sections[gMobile_section].type = original_type;
4019
    gProgram_state.AI_vehicles.path_sections[gMobile_section].one_way = one_wayness;
4013
    gProgram_state.AI_vehicles.path_sections[gMobile_section].one_way = one_wayness;
4020
    if (gProgram_state.AI_vehicles.path_nodes[old_node].number_of_sections == 0) {
4014
    if (gProgram_state.AI_vehicles.path_nodes[old_node].number_of_sections == 0) {
4021
        gProgram_state.AI_vehicles.path_sections[gMobile_section].width = 1.f;
4015
        gProgram_state.AI_vehicles.path_sections[gMobile_section].width = 1.f;
4022
    } else {
4016
    } else {
4023
        gProgram_state.AI_vehicles.path_sections[gMobile_section].width =
-
 
4024
            gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[old_node].sections[0]].width;
4017
        gProgram_state.AI_vehicles.path_sections[gMobile_section].width = gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[old_node].sections[0]].width;
4025
    }
4018
    }
4026
    gProgram_state.AI_vehicles.path_nodes[new_node].number_of_sections = 0;
4019
    gProgram_state.AI_vehicles.path_nodes[new_node].number_of_sections = 0;
4027
    gProgram_state.AI_vehicles.path_nodes[new_node].sections[gProgram_state.AI_vehicles.path_nodes[new_node].number_of_sections] = gMobile_section;
4020
    gProgram_state.AI_vehicles.path_nodes[new_node].sections[gProgram_state.AI_vehicles.path_nodes[new_node].number_of_sections] = gMobile_section;
4028
    gProgram_state.AI_vehicles.path_nodes[new_node].number_of_sections += 1;
4021
    gProgram_state.AI_vehicles.path_nodes[new_node].number_of_sections += 1;
4029
    gProgram_state.AI_vehicles.path_nodes[old_node].sections[gProgram_state.AI_vehicles.path_nodes[old_node].number_of_sections] = gMobile_section;
4022
    gProgram_state.AI_vehicles.path_nodes[old_node].sections[gProgram_state.AI_vehicles.path_nodes[old_node].number_of_sections] = gMobile_section;
Line 4197... Line 4190...
4197
 
4190
 
4198
// IDA: void __cdecl WidenOppoPathSection()
4191
// IDA: void __cdecl WidenOppoPathSection()
4199
void WidenOppoPathSection(void) {
4192
void WidenOppoPathSection(void) {
4200
    LOG_TRACE("()");
4193
    LOG_TRACE("()");
4201
 
4194
 
4202
 
-
 
4203
   if (gOppo_paths_shown) {
4195
    if (gOppo_paths_shown) {
4204
       RecalcNearestPathSectionWidth(.05f);
4196
        RecalcNearestPathSectionWidth(.05f);
4205
   }
4197
    }
4206
}
4198
}
4207
 
4199
 
4208
// IDA: void __cdecl NarrowOppoPathSection()
4200
// IDA: void __cdecl NarrowOppoPathSection()
4209
void NarrowOppoPathSection(void) {
4201
void NarrowOppoPathSection(void) {
4210
    LOG_TRACE("()");
4202
    LOG_TRACE("()");
Line 4234... Line 4226...
4234
 
4226
 
4235
// IDA: void __cdecl IncreaseSectionMaxSpeed()
4227
// IDA: void __cdecl IncreaseSectionMaxSpeed()
4236
void IncreaseSectionMaxSpeed(void) {
4228
void IncreaseSectionMaxSpeed(void) {
4237
    LOG_TRACE("()");
4229
    LOG_TRACE("()");
4238
 
4230
 
4239
   if (gOppo_paths_shown) {
4231
    if (gOppo_paths_shown) {
4240
       RecalcNearestPathSectionSpeed(1, 1);
4232
        RecalcNearestPathSectionSpeed(1, 1);
4241
   }
4233
    }
4242
}
4234
}
4243
 
4235
 
4244
// IDA: void __cdecl DecreaseSectionMaxSpeed()
4236
// IDA: void __cdecl DecreaseSectionMaxSpeed()
4245
void DecreaseSectionMaxSpeed(void) {
4237
void DecreaseSectionMaxSpeed(void) {
4246
    LOG_TRACE("()");
4238
    LOG_TRACE("()");
Line 4306... Line 4298...
4306
    br_vector3 direction_v;
4298
    br_vector3 direction_v;
4307
    br_vector3 intersect;
4299
    br_vector3 intersect;
4308
    LOG_TRACE("()");
4300
    LOG_TRACE("()");
4309
 
4301
 
4310
    if (!gOppo_paths_shown) {
4302
    if (!gOppo_paths_shown) {
4311
      NewTextHeadupSlot(4, 0, 2000, -1, "Show paths first (F5)");
4303
        NewTextHeadupSlot(4, 0, 2000, -1, "Show paths first (F5)");
4312
    } else if (gAlready_elasticating) {
4304
    } else if (gAlready_elasticating) {
4313
        sprintf(str, "This section will be #%d attached to nodes #%d and #%d",
4305
        sprintf(str, "This section will be #%d attached to nodes #%d and #%d",
4314
            gMobile_section,
4306
            gMobile_section,
4315
            gProgram_state.AI_vehicles.path_sections[gMobile_section].node_indices[0],
4307
            gProgram_state.AI_vehicles.path_sections[gMobile_section].node_indices[0],
4316
            gProgram_state.AI_vehicles.path_sections[gMobile_section].node_indices[1]);
4308
            gProgram_state.AI_vehicles.path_sections[gMobile_section].node_indices[1]);
Line 4393... Line 4385...
4393
    tS16 node_no;
4385
    tS16 node_no;
4394
    LOG_TRACE("()");
4386
    LOG_TRACE("()");
4395
 
4387
 
4396
    if (!gOppo_paths_shown) {
4388
    if (!gOppo_paths_shown) {
4397
        NewTextHeadupSlot(4, 0, 2000, -1, "Show paths first (F5)");
4389
        NewTextHeadupSlot(4, 0, 2000, -1, "Show paths first (F5)");
4398
    }
-
 
4399
    else if (gAlready_elasticating) {
4390
    } else if (gAlready_elasticating) {
4400
        NewTextHeadupSlot(4, 0, 2000, -1, "Not while you're creating a new section");
4391
        NewTextHeadupSlot(4, 0, 2000, -1, "Not while you're creating a new section");
4401
    } else {
4392
    } else {
4402
        node_no = FindNearestPathNode(&gSelf->t.t.translate.t, &distance);
4393
        node_no = FindNearestPathNode(&gSelf->t.t.translate.t, &distance);
4403
        if (distance > 10.f) {
4394
        if (distance > 10.f) {
4404
            NewTextHeadupSlot(4, 0, 2000, -1, "Can't find any nodes close enough");
4395
            NewTextHeadupSlot(4, 0, 2000, -1, "Can't find any nodes close enough");
Line 4426... Line 4417...
4426
        if (distance > 10.f) {
4417
        if (distance > 10.f) {
4427
            NewTextHeadupSlot(4, 0, 2000, -1, "Can't find any nodes close enough");
4418
            NewTextHeadupSlot(4, 0, 2000, -1, "Can't find any nodes close enough");
4428
        } else if (gProgram_state.AI_vehicles.path_nodes[node_no].number_of_sections != 2) {
4419
        } else if (gProgram_state.AI_vehicles.path_nodes[node_no].number_of_sections != 2) {
4429
            NewTextHeadupSlot(4, 0, 2000, -1, "Node must have exactly 2 sections attached");
4420
            NewTextHeadupSlot(4, 0, 2000, -1, "Node must have exactly 2 sections attached");
4430
        } else if ((gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[node_no].sections[0]].node_indices[0] == node_no
4421
        } else if ((gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[node_no].sections[0]].node_indices[0] == node_no
4431
                    && gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[node_no].sections[1]].node_indices[1] == node_no) ||
4422
                       && gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[node_no].sections[1]].node_indices[1] == node_no)
4432
                (gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[node_no].sections[1]].node_indices[0] == node_no
4423
            || (gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[node_no].sections[1]].node_indices[0] == node_no
4433
                    && gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[node_no].sections[0]].node_indices[1] == node_no)) {
4424
                && gProgram_state.AI_vehicles.path_sections[gProgram_state.AI_vehicles.path_nodes[node_no].sections[0]].node_indices[1] == node_no)) {
4434
            ConsistencyCheck();
4425
            ConsistencyCheck();
4435
            DeleteNode(node_no,0);
4426
            DeleteNode(node_no, 0);
4436
            ConsistencyCheck();
4427
            ConsistencyCheck();
4437
            DeleteOrphanNodes();
4428
            DeleteOrphanNodes();
4438
            ConsistencyCheck();
4429
            ConsistencyCheck();
4439
            ShowOppoPaths();
4430
            ShowOppoPaths();
4440
            NewTextHeadupSlot(4, 0, 2000, -1, "Blam!");
4431
            NewTextHeadupSlot(4, 0, 2000, -1, "Blam!");
4441
        }
-
 
4442
        else {
4432
        } else {
4443
            NewTextHeadupSlot(4, 0, 2000, -1, "Sections must point in same direction");
4433
            NewTextHeadupSlot(4, 0, 2000, -1, "Sections must point in same direction");
4444
        }
4434
        }
4445
    }
4435
    }
4446
}
4436
}
4447
 
4437
 
Line 4458... Line 4448...
4458
    if (!gOppo_paths_shown) {
4448
    if (!gOppo_paths_shown) {
4459
        NewTextHeadupSlot(4, 0, 2000, -1, "Show paths first (F5)");
4449
        NewTextHeadupSlot(4, 0, 2000, -1, "Show paths first (F5)");
4460
    } else if (gAlready_elasticating) {
4450
    } else if (gAlready_elasticating) {
4461
        NewTextHeadupSlot(4, 0, 2000, -1, "Not while you're creating a new section");
4451
        NewTextHeadupSlot(4, 0, 2000, -1, "Not while you're creating a new section");
4462
    } else {
4452
    } else {
4463
        section_no = FindNearestPathSection(&gSelf->t.t.translate.t,  &direction_v, &intersect, &distance);
4453
        section_no = FindNearestPathSection(&gSelf->t.t.translate.t, &direction_v, &intersect, &distance);
4464
        if (distance > 10.f) {
4454
        if (distance > 10.f) {
4465
            NewTextHeadupSlot(4, 0, 2000, -1, "Can't find any sections close enough");
4455
            NewTextHeadupSlot(4, 0, 2000, -1, "Can't find any sections close enough");
4466
        } else {
4456
        } else {
4467
            temp = gProgram_state.AI_vehicles.path_sections[section_no].node_indices[0];
4457
            temp = gProgram_state.AI_vehicles.path_sections[section_no].node_indices[0];
4468
            gProgram_state.AI_vehicles.path_sections[section_no].node_indices[0] =
-
 
4469
                gProgram_state.AI_vehicles.path_sections[section_no].node_indices[1];
4458
            gProgram_state.AI_vehicles.path_sections[section_no].node_indices[0] = gProgram_state.AI_vehicles.path_sections[section_no].node_indices[1];
4470
            gProgram_state.AI_vehicles.path_sections[section_no].node_indices[1] = temp;
4459
            gProgram_state.AI_vehicles.path_sections[section_no].node_indices[1] = temp;
4471
 
4460
 
4472
            speed_temp = gProgram_state.AI_vehicles.path_sections[section_no].min_speed[0];
4461
            speed_temp = gProgram_state.AI_vehicles.path_sections[section_no].min_speed[0];
4473
            gProgram_state.AI_vehicles.path_sections[section_no].min_speed[0] =
-
 
4474
                gProgram_state.AI_vehicles.path_sections[section_no].min_speed[1];
4462
            gProgram_state.AI_vehicles.path_sections[section_no].min_speed[0] = gProgram_state.AI_vehicles.path_sections[section_no].min_speed[1];
4475
            gProgram_state.AI_vehicles.path_sections[section_no].min_speed[1] = speed_temp;
4463
            gProgram_state.AI_vehicles.path_sections[section_no].min_speed[1] = speed_temp;
4476
 
4464
 
4477
            speed_temp = gProgram_state.AI_vehicles.path_sections[section_no].max_speed[0];
4465
            speed_temp = gProgram_state.AI_vehicles.path_sections[section_no].max_speed[0];
4478
            gProgram_state.AI_vehicles.path_sections[section_no].max_speed[0] =
-
 
4479
                gProgram_state.AI_vehicles.path_sections[section_no].max_speed[1];
4466
            gProgram_state.AI_vehicles.path_sections[section_no].max_speed[0] = gProgram_state.AI_vehicles.path_sections[section_no].max_speed[1];
4480
            gProgram_state.AI_vehicles.path_sections[section_no].max_speed[1] = speed_temp;
4467
            gProgram_state.AI_vehicles.path_sections[section_no].max_speed[1] = speed_temp;
4481
 
4468
 
4482
            ShowOppoPaths();
4469
            ShowOppoPaths();
4483
        }
4470
        }
4484
    }
4471
    }
Line 4500... Line 4487...
4500
    } else {
4487
    } else {
4501
        section_no = FindNearestPathSection(&gSelf->t.t.translate.t, &direction_v, &intersect, &distance);
4488
        section_no = FindNearestPathSection(&gSelf->t.t.translate.t, &direction_v, &intersect, &distance);
4502
        if (distance > 10.f) {
4489
        if (distance > 10.f) {
4503
            NewTextHeadupSlot(4, 0, 2000, -1, "Can't find any sections close enough");
4490
            NewTextHeadupSlot(4, 0, 2000, -1, "Can't find any sections close enough");
4504
        } else {
4491
        } else {
4505
            gProgram_state.AI_vehicles.path_sections[section_no].type =
-
 
4506
                (gProgram_state.AI_vehicles.path_sections[section_no].type + 1) % 3;
4492
            gProgram_state.AI_vehicles.path_sections[section_no].type = (gProgram_state.AI_vehicles.path_sections[section_no].type + 1) % 3;
4507
            sprintf(str, "%s section",  gPath_section_type_names[gProgram_state.AI_vehicles.path_sections[section_no].type]);
4493
            sprintf(str, "%s section", gPath_section_type_names[gProgram_state.AI_vehicles.path_sections[section_no].type]);
4508
            ShowOppoPaths();
4494
            ShowOppoPaths();
4509
            NewTextHeadupSlot(4, 0, 2000, -1, str);
4495
            NewTextHeadupSlot(4, 0, 2000, -1, str);
4510
        }
4496
        }
4511
    }
4497
    }
4512
}
4498
}
Line 4528... Line 4514...
4528
        if (distance > 10.f) {
4514
        if (distance > 10.f) {
4529
            NewTextHeadupSlot(4, 0, 2000, -1, "Can't find any sections close enough");
4515
            NewTextHeadupSlot(4, 0, 2000, -1, "Can't find any sections close enough");
4530
        } else {
4516
        } else {
4531
            if (gProgram_state.AI_vehicles.path_sections[section_no].one_way) {
4517
            if (gProgram_state.AI_vehicles.path_sections[section_no].one_way) {
4532
                gProgram_state.AI_vehicles.path_sections[section_no].one_way = 0;
4518
                gProgram_state.AI_vehicles.path_sections[section_no].one_way = 0;
4533
            }
-
 
4534
            else {
4519
            } else {
4535
                gProgram_state.AI_vehicles.path_sections[section_no].one_way = 1;
4520
                gProgram_state.AI_vehicles.path_sections[section_no].one_way = 1;
4536
            }
4521
            }
4537
            ShowOppoPaths();
4522
            ShowOppoPaths();
4538
            if (gProgram_state.AI_vehicles.path_sections[section_no].one_way) {
4523
            if (gProgram_state.AI_vehicles.path_sections[section_no].one_way) {
4539
                NewTextHeadupSlot(4, 0, 2000, -1, "ONE-WAY");
4524
                NewTextHeadupSlot(4, 0, 2000, -1, "ONE-WAY");
Line 4555... Line 4540...
4555
    LOG_TRACE("()");
4540
    LOG_TRACE("()");
4556
 
4541
 
4557
    closest = -1;
4542
    closest = -1;
4558
    closest_distance = FLT_MAX;
4543
    closest_distance = FLT_MAX;
4559
    if (!gOppo_paths_shown) {
4544
    if (!gOppo_paths_shown) {
4560
      NewTextHeadupSlot(4, 0, 2000, -1, "Show paths first (F5)");
4545
        NewTextHeadupSlot(4, 0, 2000, -1, "Show paths first (F5)");
4561
    } else {
4546
    } else {
4562
        for (i = 0; i < gProgram_state.AI_vehicles.number_of_cops; i++) {
4547
        for (i = 0; i < gProgram_state.AI_vehicles.number_of_cops; i++) {
4563
            BrVector3Sub(&car_to_point, &gSelf->t.t.translate.t, &gProgram_state.AI_vehicles.cop_start_points[i]);
4548
            BrVector3Sub(&car_to_point, &gSelf->t.t.translate.t, &gProgram_state.AI_vehicles.cop_start_points[i]);
4564
            distance = BrVector3LengthSquared(&car_to_point);
4549
            distance = BrVector3LengthSquared(&car_to_point);
4565
            if (distance < closest_distance) {
4550
            if (distance < closest_distance) {
Line 4640... Line 4625...
4640
}
4625
}
4641
 
4626
 
4642
// IDA: void __cdecl CycleCopStartPointType()
4627
// IDA: void __cdecl CycleCopStartPointType()
4643
void CycleCopStartPointType(void) {
4628
void CycleCopStartPointType(void) {
4644
    LOG_TRACE("()");
4629
    LOG_TRACE("()");
4645
 
-
 
4646
}
4630
}