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 |