comparison src/train_cmd.cpp @ 8281:a3736272d02a draft

(svn r11845) -Codechange: simplify train collision detection a bit
author smatz <smatz@openttd.org>
date Sun, 13 Jan 2008 23:53:33 +0000
parents 359d451c24ef
children dca081896c52
comparison
equal deleted inserted replaced
8280:11c7596b14f3 8281:a3736272d02a
2803 return num; 2803 return num;
2804 } 2804 }
2805 2805
2806 struct TrainCollideChecker { 2806 struct TrainCollideChecker {
2807 Vehicle *v; 2807 Vehicle *v;
2808 const Vehicle *v_skip;
2809 uint num; 2808 uint num;
2810 }; 2809 };
2811 2810
2812 static void *FindTrainCollideEnum(Vehicle *v, void *data) 2811 static void *FindTrainCollideEnum(Vehicle *v, void *data)
2813 { 2812 {
2814 TrainCollideChecker* tcc = (TrainCollideChecker*)data; 2813 TrainCollideChecker* tcc = (TrainCollideChecker*)data;
2815 2814
2816 if (v != tcc->v && 2815 if (v->type != VEH_TRAIN) return NULL;
2817 v != tcc->v_skip && 2816
2818 v->type == VEH_TRAIN && 2817 /* get first vehicle now to make most usual checks faster */
2819 v->u.rail.track != TRACK_BIT_DEPOT && 2818 Vehicle *coll = v->First();
2819
2820 /* can't collide with own wagons && can't crash in depot && not too far */
2821 if (coll != tcc->v && v->u.rail.track != TRACK_BIT_DEPOT &&
2820 abs(v->z_pos - tcc->v->z_pos) < 6 && 2822 abs(v->z_pos - tcc->v->z_pos) < 6 &&
2821 abs(v->x_pos - tcc->v->x_pos) < 6 && 2823 abs(v->x_pos - tcc->v->x_pos) < 6 &&
2822 abs(v->y_pos - tcc->v->y_pos) < 6 ) { 2824 abs(v->y_pos - tcc->v->y_pos) < 6 ) {
2823
2824 Vehicle *coll = v->First();
2825
2826 /* it can't collide with its own wagons */
2827 if (tcc->v == coll ||
2828 (tcc->v->u.rail.track == TRACK_BIT_WORMHOLE && (tcc->v->direction & 2) != (v->direction & 2)))
2829 return NULL;
2830 2825
2831 /* two drivers + passengers killed in train tcc->v (if it was not crashed already) */ 2826 /* two drivers + passengers killed in train tcc->v (if it was not crashed already) */
2832 if (!(tcc->v->vehstatus & VS_CRASHED)) { 2827 if (!(tcc->v->vehstatus & VS_CRASHED)) {
2833 tcc->num += 2 + CountPassengersInTrain(tcc->v); 2828 tcc->num += 2 + CountPassengersInTrain(tcc->v);
2834 SetVehicleCrashed(tcc->v); 2829 SetVehicleCrashed(tcc->v);
2857 2852
2858 assert(v->u.rail.track == TRACK_BIT_WORMHOLE || TileVirtXY(v->x_pos, v->y_pos) == v->tile); 2853 assert(v->u.rail.track == TRACK_BIT_WORMHOLE || TileVirtXY(v->x_pos, v->y_pos) == v->tile);
2859 2854
2860 TrainCollideChecker tcc; 2855 TrainCollideChecker tcc;
2861 tcc.v = v; 2856 tcc.v = v;
2862 tcc.v_skip = v->Next();
2863 tcc.num = 0; 2857 tcc.num = 0;
2864 2858
2865 /* find colliding vehicles */ 2859 /* find colliding vehicles */
2866 if (v->u.rail.track == TRACK_BIT_WORMHOLE) { 2860 if (v->u.rail.track == TRACK_BIT_WORMHOLE) {
2867 VehicleFromPos(v->tile, &tcc, FindTrainCollideEnum); 2861 VehicleFromPos(v->tile, &tcc, FindTrainCollideEnum);