(svn r99) Fix: [992726] No tunnel crash (Celestar)
authordominik
Sat, 21 Aug 2004 09:57:02 +0000
changeset 98 91d63b83cece
parent 97 2f77b20bb0e4
child 99 66c0918845af
(svn r99) Fix: [992726] No tunnel crash (Celestar)
data/opntitle.dat
train_cmd.c
tunnelbridge_cmd.c
Binary file data/opntitle.dat has changed
--- a/train_cmd.c	Fri Aug 20 21:50:54 2004 +0000
+++ b/train_cmd.c	Sat Aug 21 09:57:02 2004 +0000
@@ -1931,27 +1931,29 @@
 static void CheckTrainCollision(Vehicle *v)
 {
 	TrainCollideChecker tcc;
-	Vehicle *coll;
+	Vehicle *coll,*realcoll;
 	int num;
 
 	/* can't collide in depot */
 	if (v->u.rail.track == 0x80)
 		return;
 	
-	assert((uint)TILE_FROM_XY(v->x_pos, v->y_pos) == v->tile);
+	if ( !(v->u.rail.track == 0x40) ) 
+		assert((uint)TILE_FROM_XY(v->x_pos, v->y_pos) == v->tile);
 
 	tcc.v = v;
 	tcc.v_skip = v->next;
 
 	/* find colliding vehicle */
-	coll = VehicleFromPos(v->tile, &tcc, (VehicleFromPosProc*)FindTrainCollideEnum);
+	realcoll = coll = VehicleFromPos(TILE_FROM_XY(v->x_pos, v->y_pos), &tcc, (VehicleFromPosProc*)FindTrainCollideEnum);
 	if (coll == NULL)
 		return;
+		
 	
 	coll = GetFirstVehicleInChain(coll);
 	
 	/* it can't collide with its own wagons */
-	if (v == coll)
+	if ( (v == coll) || ( (v->u.rail.track & 0x40) && ( (v->direction & 2) != (realcoll->direction & 2) ) ) )
 		return;
 
 	//two drivers + passangers killed in train v 
@@ -1963,7 +1965,7 @@
 	SetVehicleCrashed(v);
 	if (coll->subtype == 0)
 		SetVehicleCrashed(coll);
-
+	
 	
 	SET_DPARAM16(0, num);
 	
@@ -2112,6 +2114,8 @@
 			v->x_pos = gp.x;
 			v->y_pos = gp.y;
 			VehiclePositionChanged(v);
+			if (prev == NULL)
+				CheckTrainCollision(v);
 			goto next_vehicle;
 		}
 common:;
@@ -2180,6 +2184,8 @@
 
 }
 
+extern uint CheckTunnelBusy(uint tile, int *length);
+
 static void DeleteLastWagon(Vehicle *v)
 {
 	Vehicle *u = v;
@@ -2203,6 +2209,17 @@
 	if (!((t=v->u.rail.track) & 0xC0)) {
 		SetSignalsOnBothDir(v->tile, FIND_FIRST_BIT(t));
 	}
+	
+	if (v->u.rail.track == 0x40) {
+		int length;
+		TileIndex endtile = CheckTunnelBusy(v->tile, &length);
+		if ((v->direction == 1) || (v->direction == 5) )
+			SetSignalsOnBothDir(v->tile,0);
+			SetSignalsOnBothDir(endtile,0);
+		if ((v->direction == 3) || (v->direction == 7) )
+			SetSignalsOnBothDir(v->tile,1);
+			SetSignalsOnBothDir(endtile,1);
+	}
 }
 
 static void ChangeTrainDirRandomly(Vehicle *v)
@@ -2210,7 +2227,9 @@
 	static int8 _random_dir_change[4] = { -1, 0, 0, 1};
 	
 	do {
-		v->direction = (v->direction + _random_dir_change[Random()&3]) & 7;
+		//I need to buffer the train direction
+		if (!v->u.rail.track & 0x40) 
+			v->direction = (v->direction + _random_dir_change[Random()&3]) & 7;
 		if (!(v->vehstatus & VS_HIDDEN)) {
 			BeginVehicleMove(v);
 			UpdateTrainDeltaXY(v, v->direction);
@@ -2226,7 +2245,7 @@
 	uint32 r;
 	Vehicle *u;
 	
-	if (state == 4) {
+	if ( (state == 4) && (v->u.rail.track != 0x40) ) {
 		CreateEffectVehicleRel(v, 4, 4, 8, EV_CRASHED_SMOKE);
 	}
 
--- a/tunnelbridge_cmd.c	Fri Aug 20 21:50:54 2004 +0000
+++ b/tunnelbridge_cmd.c	Sat Aug 21 09:57:02 2004 +0000
@@ -581,7 +581,7 @@
 
 static const byte _updsignals_tunnel_dir[4] = { 5, 7, 1, 3};
 
-static uint CheckTunnelBusy(uint tile, int *length)
+uint CheckTunnelBusy(uint tile, int *length)
 {
 	int z = GetTileZ(tile);
 	byte m5 = _map5[tile];