Mercurial > hg > openttd
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); |