train_cmd.c
changeset 2519 beb11a5ac48c
parent 2510 0008aad5d311
child 2522 c250fcafaba6
equal deleted inserted replaced
2518:bec1f669b1ff 2519:beb11a5ac48c
   289 		}
   289 		}
   290 	}
   290 	}
   291 
   291 
   292 	v->max_speed = max_speed;
   292 	v->max_speed = max_speed;
   293 
   293 
   294 	if (v->u.rail.railtype != 2) {
   294 	if (v->u.rail.railtype != RAILTYPE_MAGLEV) {
   295 		resistance = 13 * mass / 10;
   295 		resistance = 13 * mass / 10;
   296 		resistance += 60 * num;
   296 		resistance += 60 * num;
   297 		resistance += friction * mass * speed / 1000;
   297 		resistance += friction * mass * speed / 1000;
   298 		resistance += (area * drag_coeff * speed * speed) / 10000;
   298 		resistance += (area * drag_coeff * speed * speed) / 10000;
   299 	} else
   299 	} else
   301 	resistance += incl;
   301 	resistance += incl;
   302 	resistance *= 4; //[N]
   302 	resistance *= 4; //[N]
   303 
   303 
   304 	if (speed > 0) {
   304 	if (speed > 0) {
   305 		switch (v->u.rail.railtype) {
   305 		switch (v->u.rail.railtype) {
   306 			case 0:
   306 			case RAILTYPE_RAIL:
   307 			case 1:
   307 			case RAILTYPE_MONO:
   308 				force = power / speed; //[N]
   308 				force = power / speed; //[N]
   309 				force *= 22;
   309 				force *= 22;
   310 				force /= 10;
   310 				force /= 10;
   311 				break;
   311 				break;
   312 
   312 
   313 			case 2:
   313 			case RAILTYPE_MAGLEV:
   314 				force = power / 25;
   314 				force = power / 25;
   315 				break;
   315 				break;
   316 		}
   316 		}
   317 	} else {
   317 	} else {
   318 		//"kickoff" acceleration
   318 		//"kickoff" acceleration
   319 		force = (mass * 8) + resistance;
   319 		force = (mass * 8) + resistance;
   320 	}
   320 	}
   321 
   321 
   322 	if (force <= 0) force = 10000;
   322 	if (force <= 0) force = 10000;
   323 
   323 
   324 	if (v->u.rail.railtype != 2) force = min(force, mass * 10 * 200);
   324 	if (v->u.rail.railtype != RAILTYPE_MAGLEV) force = min(force, mass * 10 * 200);
   325 
   325 
   326 	if (mode == AM_ACCEL) {
   326 	if (mode == AM_ACCEL) {
   327 		return (force - resistance) / (mass * 4);
   327 		return (force - resistance) / (mass * 4);
   328 	} else {
   328 	} else {
   329 		return min((-force - resistance) / (mass * 4), 10000 / (mass * 4));
   329 		return min((-force - resistance) / (mass * 4), 10000 / (mass * 4));
  1741 	do {
  1741 	do {
  1742 		EngineID engtype = v->engine_type;
  1742 		EngineID engtype = v->engine_type;
  1743 
  1743 
  1744 		// no smoke?
  1744 		// no smoke?
  1745 		if (RailVehInfo(engtype)->flags & 2 ||
  1745 		if (RailVehInfo(engtype)->flags & 2 ||
  1746 				GetEngine(engtype)->railtype > 0 ||
  1746 				GetEngine(engtype)->railtype > RAILTYPE_RAIL ||
  1747 				(v->vehstatus & VS_HIDDEN) || (v->u.rail.track & 0xC0))
  1747 				(v->vehstatus & VS_HIDDEN) || (v->u.rail.track & 0xC0))
  1748 			continue;
  1748 			continue;
  1749 
  1749 
  1750 		switch (RailVehInfo(engtype)->engclass) {
  1750 		switch (RailVehInfo(engtype)->engclass) {
  1751 		case 0:
  1751 		case 0:
  1786 	};
  1786 	};
  1787 
  1787 
  1788 	EngineID engtype = v->engine_type;
  1788 	EngineID engtype = v->engine_type;
  1789 
  1789 
  1790 	switch (GetEngine(engtype)->railtype) {
  1790 	switch (GetEngine(engtype)->railtype) {
  1791 		case 0:
  1791 		case RAILTYPE_RAIL:
  1792 			SndPlayVehicleFx(sfx[RailVehInfo(engtype)->engclass], v);
  1792 			SndPlayVehicleFx(sfx[RailVehInfo(engtype)->engclass], v);
  1793 			break;
  1793 			break;
  1794 		case 1:
  1794 
       
  1795 		case RAILTYPE_MONO:
  1795 			SndPlayVehicleFx(SND_47_MAGLEV_2, v);
  1796 			SndPlayVehicleFx(SND_47_MAGLEV_2, v);
  1796 			break;
  1797 			break;
  1797 		case 2:
  1798 
       
  1799 		case RAILTYPE_MAGLEV:
  1798 			SndPlayVehicleFx(SND_41_MAGLEV, v);
  1800 			SndPlayVehicleFx(SND_41_MAGLEV, v);
  1799 			break;
  1801 			break;
  1800 	}
  1802 	}
  1801 }
  1803 }
  1802 
  1804