train_cmd.c
changeset 2595 1c5db200577c
parent 2587 31647a23da0b
child 2599 ad75080afea4
equal deleted inserted replaced
2594:0e76c769f002 2595:1c5db200577c
    93 		u->u.rail.first_engine = (v == u) ? INVALID_VEHICLE : first_engine;
    93 		u->u.rail.first_engine = (v == u) ? INVALID_VEHICLE : first_engine;
    94 
    94 
    95 		// power is the sum of the powers of all engines and powered wagons in the consist
    95 		// power is the sum of the powers of all engines and powered wagons in the consist
    96 		power += rvi_u->power;
    96 		power += rvi_u->power;
    97 
    97 
       
    98 		if (rvi_u->visual_effect != 0) {
       
    99 			u->u.rail.cached_vis_effect = rvi_u->visual_effect;
       
   100 		} else {
       
   101 			if (rvi_u->flags & RVI_WAGON) {
       
   102 				// Wagons have no effect by default
       
   103 				u->u.rail.cached_vis_effect = 0x40;
       
   104 			} else if (rvi_u->engclass == 0) {
       
   105 				// Steam is offset by -4 units
       
   106 				u->u.rail.cached_vis_effect = 4;
       
   107 			} else {
       
   108 				// Diesel fumes and sparks come from the centre
       
   109 				u->u.rail.cached_vis_effect = 8;
       
   110 			}
       
   111 		}
       
   112 
    98 		// check if its a powered wagon
   113 		// check if its a powered wagon
    99 		CLRBIT(u->u.rail.flags, VRF_POWEREDWAGON);
   114 		CLRBIT(u->u.rail.flags, VRF_POWEREDWAGON);
   100 		if ((rvi_v->pow_wag_power != 0) && (rvi_u->flags & RVI_WAGON) && UsesWagonOverride(u)) {
   115 		if ((rvi_v->pow_wag_power != 0) && (rvi_u->flags & RVI_WAGON) && UsesWagonOverride(u)) {
   101 			uint16 callback = CALLBACK_FAILED;
   116 			if (HASBIT(rvi_u->callbackmask, CBM_WAGON_POWER)) {
   102 
   117 				uint16 callback = GetCallBackResult(CBID_WAGON_POWER,  u->engine_type, u);
   103 			if (HASBIT(rvi_u->callbackmask, CBM_WAGON_POWER))
   118 
   104 				callback = GetCallBackResult(CBID_WAGON_POWER,  u->engine_type, u);
   119 				if (callback != CALLBACK_FAILED)
   105 
   120 					u->u.rail.cached_vis_effect = callback;
   106 			if (callback == CALLBACK_FAILED)
   121 			}
   107 				callback = rvi_u->visual_effect;
   122 
   108 
   123 			if (u->u.rail.cached_vis_effect < 0x40) {
   109 			if (callback < 0x40) {
       
   110 				/* wagon is powered */
   124 				/* wagon is powered */
   111 				SETBIT(u->u.rail.flags, VRF_POWEREDWAGON); // cache 'powered' status
   125 				SETBIT(u->u.rail.flags, VRF_POWEREDWAGON); // cache 'powered' status
   112 				power += rvi_v->pow_wag_power;
   126 				power += rvi_v->pow_wag_power;
   113 			}
   127 			}
   114 		}
   128 		}
  1715 void OnTick_Train(void)
  1729 void OnTick_Train(void)
  1716 {
  1730 {
  1717 	_age_cargo_skip_counter = (_age_cargo_skip_counter == 0) ? 184 : (_age_cargo_skip_counter - 1);
  1731 	_age_cargo_skip_counter = (_age_cargo_skip_counter == 0) ? 184 : (_age_cargo_skip_counter - 1);
  1718 }
  1732 }
  1719 
  1733 
  1720 static const int8 _vehicle_smoke_pos[16] = {
  1734 static const int8 _vehicle_smoke_pos[8] = {
  1721 	-4, -4, -4, 0, 4, 4, 4, 0,
  1735 	1, 1, 1, 0, -1, -1, -1, 0
  1722 	-4,  0,  4, 4, 4, 0,-4,-4,
       
  1723 };
  1736 };
  1724 
  1737 
  1725 static void HandleLocomotiveSmokeCloud(Vehicle *v)
  1738 static void HandleLocomotiveSmokeCloud(Vehicle *v)
  1726 {
  1739 {
  1727 	Vehicle *u;
  1740 	Vehicle *u;
  1731 
  1744 
  1732 	u = v;
  1745 	u = v;
  1733 
  1746 
  1734 	do {
  1747 	do {
  1735 		EngineID engtype = v->engine_type;
  1748 		EngineID engtype = v->engine_type;
       
  1749 		int effect_offset = GB(v->u.rail.cached_vis_effect, 0, 4) - 8;
       
  1750 		byte effect_type = GB(v->u.rail.cached_vis_effect, 4, 2);
       
  1751 		bool disable_effect = HASBIT(v->u.rail.cached_vis_effect, 6);
       
  1752 		int x, y;
  1736 
  1753 
  1737 		// no smoke?
  1754 		// no smoke?
  1738 		if (RailVehInfo(engtype)->flags & 2 ||
  1755 		if ((RailVehInfo(engtype)->flags & RVI_WAGON && effect_type == 0) ||
       
  1756 				disable_effect ||
  1739 				GetEngine(engtype)->railtype > RAILTYPE_RAIL ||
  1757 				GetEngine(engtype)->railtype > RAILTYPE_RAIL ||
  1740 				(v->vehstatus & VS_HIDDEN) || (v->u.rail.track & 0xC0))
  1758 				(v->vehstatus & VS_HIDDEN) || (v->u.rail.track & 0xC0))
  1741 			continue;
  1759 			continue;
  1742 
  1760 
  1743 		switch (RailVehInfo(engtype)->engclass) {
  1761 		if (effect_type == 0) {
       
  1762 			// Use default effect type for engine class.
       
  1763 			effect_type = RailVehInfo(engtype)->engclass;
       
  1764 		} else {
       
  1765 			effect_type--;
       
  1766 		}
       
  1767 
       
  1768 		x = _vehicle_smoke_pos[v->direction] * effect_offset;
       
  1769 		y = _vehicle_smoke_pos[(v->direction + 2) % 8] * effect_offset;
       
  1770 
       
  1771 		switch (effect_type) {
  1744 		case 0:
  1772 		case 0:
  1745 			// steam smoke.
  1773 			// steam smoke.
  1746 			if ( (v->tick_counter&0xF) == 0 && !IsTileDepotType(v->tile, TRANSPORT_RAIL) && !IsTunnelTile(v->tile)) {
  1774 			if ( (v->tick_counter&0xF) == 0 && !IsTileDepotType(v->tile, TRANSPORT_RAIL) && !IsTunnelTile(v->tile)) {
  1747 				CreateEffectVehicleRel(v,
  1775 				CreateEffectVehicleRel(v, x, y, 10, EV_STEAM_SMOKE);
  1748 					(_vehicle_smoke_pos[v->direction]),
       
  1749 					(_vehicle_smoke_pos[v->direction+8]),
       
  1750 					10,
       
  1751 					EV_STEAM_SMOKE);
       
  1752 			}
  1776 			}
  1753 			break;
  1777 			break;
  1754 
  1778 
  1755 		case 1:
  1779 		case 1:
  1756 			// diesel smoke
  1780 			// diesel smoke