Introduced optional light effects for vehicles at night. (#10970)

This commit is contained in:
WantDiscussion 2020-03-20 21:47:31 +11:00 committed by GitHub
parent ba8a4e6183
commit 828eef7411
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 173 additions and 159 deletions

View File

@ -3674,6 +3674,8 @@ STR_6357 :{SMALLFONT}{BLACK}Removes all ducks from the map
STR_6358 :Page {UINT16} STR_6358 :Page {UINT16}
STR_6359 :{POP16}{POP16}Page {UINT16} STR_6359 :{POP16}{POP16}Page {UINT16}
STR_6360 :{SMALLFONT}{BLACK}{COMMA32} STR_6360 :{SMALLFONT}{BLACK}{COMMA32}
STR_6361 :Enable lighting effects on rides (experimental)
STR_6362 :{SMALLFONT}{BLACK}If enabled, vehicles for tracked rides will be lit up at night.
############# #############
# Scenarios # # Scenarios #

View File

@ -41,6 +41,7 @@
- Improved: [#682] The staff patrol area is now drawn on the water, instead of on the surface under water. - Improved: [#682] The staff patrol area is now drawn on the water, instead of on the surface under water.
- Improved: [#10858] Added horizontal grid lines to finance charts. - Improved: [#10858] Added horizontal grid lines to finance charts.
- Improved: [#10884] Added y-axes and labels to park window charts. - Improved: [#10884] Added y-axes and labels to park window charts.
- Improved: [#10970] Introduced optional light effects for vehicles at night.
- Removed: [#6898] LOADMM and LOADRCT1 title sequence commands (use LOADSC instead). - Removed: [#6898] LOADMM and LOADRCT1 title sequence commands (use LOADSC instead).
0.2.4 (2019-10-28) 0.2.4 (2019-10-28)

View File

@ -105,6 +105,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX {
WIDX_EFFECTS_GROUP, WIDX_EFFECTS_GROUP,
WIDX_DAY_NIGHT_CHECKBOX, WIDX_DAY_NIGHT_CHECKBOX,
WIDX_ENABLE_LIGHT_FX_CHECKBOX, WIDX_ENABLE_LIGHT_FX_CHECKBOX,
WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX,
WIDX_RENDER_WEATHER_EFFECTS_CHECKBOX, WIDX_RENDER_WEATHER_EFFECTS_CHECKBOX,
WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX, WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX,
@ -259,11 +260,12 @@ static rct_widget window_options_rendering_widgets[] = {
{ WWT_BUTTON, 1, 288, 298, FRAME_RENDERING_START + 91, FRAME_RENDERING_START + 100, STR_DROPDOWN_GLYPH, STR_VIRTUAL_FLOOR_STYLE_TIP }, // Virtual floor dropdown { WWT_BUTTON, 1, 288, 298, FRAME_RENDERING_START + 91, FRAME_RENDERING_START + 100, STR_DROPDOWN_GLYPH, STR_VIRTUAL_FLOOR_STYLE_TIP }, // Virtual floor dropdown
#undef FRAME_RENDERING_START #undef FRAME_RENDERING_START
#define FRAME_EFFECTS_START 163 #define FRAME_EFFECTS_START 163
{ WWT_GROUPBOX, 1, 5, 304, FRAME_EFFECTS_START + 0, FRAME_EFFECTS_START + 78, STR_EFFECTS_GROUP, STR_NONE }, // Rendering group { WWT_GROUPBOX, 1, 5, 304, FRAME_EFFECTS_START + 0, FRAME_EFFECTS_START + 93, STR_EFFECTS_GROUP, STR_NONE }, // Rendering group
{ WWT_CHECKBOX, 1, 10, 290, FRAME_EFFECTS_START + 15, FRAME_EFFECTS_START + 26, STR_CYCLE_DAY_NIGHT, STR_CYCLE_DAY_NIGHT_TIP }, // Cycle day-night { WWT_CHECKBOX, 1, 10, 290, FRAME_EFFECTS_START + 15, FRAME_EFFECTS_START + 26, STR_CYCLE_DAY_NIGHT, STR_CYCLE_DAY_NIGHT_TIP }, // Cycle day-night
{ WWT_CHECKBOX, 1, 25, 290, FRAME_EFFECTS_START + 30, FRAME_EFFECTS_START + 41, STR_ENABLE_LIGHTING_EFFECTS, STR_ENABLE_LIGHTING_EFFECTS_TIP }, // Enable light fx { WWT_CHECKBOX, 1, 25, 290, FRAME_EFFECTS_START + 30, FRAME_EFFECTS_START + 41, STR_ENABLE_LIGHTING_EFFECTS, STR_ENABLE_LIGHTING_EFFECTS_TIP }, // Enable light fx
{ WWT_CHECKBOX, 1, 10, 290, FRAME_EFFECTS_START + 45, FRAME_EFFECTS_START + 56, STR_RENDER_WEATHER_EFFECTS, STR_RENDER_WEATHER_EFFECTS_TIP }, // Render weather effects { WWT_CHECKBOX, 1, 40, 290, FRAME_EFFECTS_START + 45, FRAME_EFFECTS_START + 56, STR_ENABLE_LIGHTING_VEHICLES, STR_ENABLE_LIGHTING_VEHICLES_TIP }, // Enable light fx for vehicles
{ WWT_CHECKBOX, 1, 25, 290, FRAME_EFFECTS_START + 60, FRAME_EFFECTS_START + 71, STR_DISABLE_LIGHTNING_EFFECT, STR_DISABLE_LIGHTNING_EFFECT_TIP }, // Disable lightning effect { WWT_CHECKBOX, 1, 10, 290, FRAME_EFFECTS_START + 60, FRAME_EFFECTS_START + 71, STR_RENDER_WEATHER_EFFECTS, STR_RENDER_WEATHER_EFFECTS_TIP }, // Render weather effects
{ WWT_CHECKBOX, 1, 25, 290, FRAME_EFFECTS_START + 75, FRAME_EFFECTS_START + 86, STR_DISABLE_LIGHTNING_EFFECT, STR_DISABLE_LIGHTNING_EFFECT_TIP }, // Disable lightning effect
#undef FRAME_EFFECTS_START #undef FRAME_EFFECTS_START
{ WIDGETS_END }, { WIDGETS_END },
}; };
@ -546,6 +548,7 @@ static uint64_t window_options_page_enabled_widgets[] = {
(1 << WIDX_VIRTUAL_FLOOR_DROPDOWN) | (1 << WIDX_VIRTUAL_FLOOR_DROPDOWN) |
(1 << WIDX_DAY_NIGHT_CHECKBOX) | (1 << WIDX_DAY_NIGHT_CHECKBOX) |
(1 << WIDX_ENABLE_LIGHT_FX_CHECKBOX) | (1 << WIDX_ENABLE_LIGHT_FX_CHECKBOX) |
(1 << WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX) |
(1 << WIDX_RENDER_WEATHER_EFFECTS_CHECKBOX) | (1 << WIDX_RENDER_WEATHER_EFFECTS_CHECKBOX) |
(1 << WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX), (1 << WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX),
@ -749,6 +752,11 @@ static void window_options_mouseup(rct_window* w, rct_widgetindex widgetIndex)
config_save_default(); config_save_default();
w->Invalidate(); w->Invalidate();
break; break;
case WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX:
gConfigGeneral.enable_light_fx_for_vehicles ^= 1;
config_save_default();
w->Invalidate();
break;
case WIDX_UPPER_CASE_BANNERS_CHECKBOX: case WIDX_UPPER_CASE_BANNERS_CHECKBOX:
gConfigGeneral.upper_case_banners ^= 1; gConfigGeneral.upper_case_banners ^= 1;
config_save_default(); config_save_default();
@ -1770,6 +1778,18 @@ static void window_options_invalidate(rct_window* w)
w->disabled_widgets |= (1 << WIDX_ENABLE_LIGHT_FX_CHECKBOX); w->disabled_widgets |= (1 << WIDX_ENABLE_LIGHT_FX_CHECKBOX);
} }
widget_set_checkbox_value(
w, WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX, gConfigGeneral.enable_light_fx_for_vehicles);
if (gConfigGeneral.day_night_cycle && gConfigGeneral.drawing_engine == DRAWING_ENGINE_SOFTWARE_WITH_HARDWARE_DISPLAY
&& gConfigGeneral.enable_light_fx)
{
w->disabled_widgets &= ~(1 << WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX);
}
else
{
w->disabled_widgets |= (1 << WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX);
}
widget_set_checkbox_value( widget_set_checkbox_value(
w, WIDX_RENDER_WEATHER_EFFECTS_CHECKBOX, w, WIDX_RENDER_WEATHER_EFFECTS_CHECKBOX,
gConfigGeneral.render_weather_effects || gConfigGeneral.render_weather_gloom); gConfigGeneral.render_weather_effects || gConfigGeneral.render_weather_gloom);

View File

@ -183,6 +183,7 @@ namespace Config
model->day_night_cycle = reader->GetBoolean("day_night_cycle", false); model->day_night_cycle = reader->GetBoolean("day_night_cycle", false);
model->enable_light_fx = reader->GetBoolean("enable_light_fx", false); model->enable_light_fx = reader->GetBoolean("enable_light_fx", false);
model->enable_light_fx_for_vehicles = reader->GetBoolean("enable_light_fx_for_vehicles", false);
model->upper_case_banners = reader->GetBoolean("upper_case_banners", false); model->upper_case_banners = reader->GetBoolean("upper_case_banners", false);
model->disable_lightning_effect = reader->GetBoolean("disable_lightning_effect", false); model->disable_lightning_effect = reader->GetBoolean("disable_lightning_effect", false);
model->allow_loading_with_incorrect_checksum = reader->GetBoolean("allow_loading_with_incorrect_checksum", true); model->allow_loading_with_incorrect_checksum = reader->GetBoolean("allow_loading_with_incorrect_checksum", true);
@ -256,6 +257,7 @@ namespace Config
writer->WriteBoolean("minimize_fullscreen_focus_loss", model->minimize_fullscreen_focus_loss); writer->WriteBoolean("minimize_fullscreen_focus_loss", model->minimize_fullscreen_focus_loss);
writer->WriteBoolean("day_night_cycle", model->day_night_cycle); writer->WriteBoolean("day_night_cycle", model->day_night_cycle);
writer->WriteBoolean("enable_light_fx", model->enable_light_fx); writer->WriteBoolean("enable_light_fx", model->enable_light_fx);
writer->WriteBoolean("enable_light_fx_for_vehicles", model->enable_light_fx_for_vehicles);
writer->WriteBoolean("upper_case_banners", model->upper_case_banners); writer->WriteBoolean("upper_case_banners", model->upper_case_banners);
writer->WriteBoolean("disable_lightning_effect", model->disable_lightning_effect); writer->WriteBoolean("disable_lightning_effect", model->disable_lightning_effect);
writer->WriteBoolean("allow_loading_with_incorrect_checksum", model->allow_loading_with_incorrect_checksum); writer->WriteBoolean("allow_loading_with_incorrect_checksum", model->allow_loading_with_incorrect_checksum);

View File

@ -41,6 +41,7 @@ struct GeneralConfiguration
int32_t virtual_floor_style; int32_t virtual_floor_style;
bool day_night_cycle; bool day_night_cycle;
bool enable_light_fx; bool enable_light_fx;
bool enable_light_fx_for_vehicles;
bool upper_case_banners; bool upper_case_banners;
bool render_weather_effects; bool render_weather_effects;
bool render_weather_gloom; bool render_weather_gloom;

View File

@ -128,6 +128,11 @@ bool lightfx_is_available()
return _lightfxAvailable && gConfigGeneral.enable_light_fx != 0; return _lightfxAvailable && gConfigGeneral.enable_light_fx != 0;
} }
bool lightfx_for_vehicles_is_available()
{
return lightfx_is_available() && gConfigGeneral.enable_light_fx_for_vehicles != 0;
}
void lightfx_init() void lightfx_init()
{ {
_LightListBack = _LightListA; _LightListBack = _LightListA;
@ -685,165 +690,136 @@ uint32_t lightfx_get_light_polution()
return _lightPolution_front; return _lightPolution_front;
} }
void lightfx_add_lights_magic_vehicles() void lightfx_add_lights_magic_vehicle(const Vehicle* vehicle)
{ {
uint16_t spriteIndex = gSpriteListHead[SPRITE_LIST_VEHICLE_HEAD]; uint16_t vehicleID = vehicle->sprite_index;
while (spriteIndex != SPRITE_INDEX_NULL)
int16_t place_x, place_y, place_z;
place_x = vehicle->x;
place_y = vehicle->y;
place_z = vehicle->z;
static constexpr const int16_t offsetLookup[] = {
10, 10, 9, 8, 7, 6, 4, 2, 0, -2, -4, -6, -7, -8, -9, -10, -10, -10, -9, -8, -7, -6, -4, -2, 0, 2, 4, 6, 7, 8, 9, 10,
};
auto ride = get_ride(vehicle->ride);
switch (ride->type)
{ {
Vehicle* vehicle = &(get_sprite(spriteIndex)->vehicle); case RIDE_TYPE_OBSERVATION_TOWER:
uint16_t vehicleID = spriteIndex; lightfx_add_3d_light(
spriteIndex = vehicle->next; vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x, vehicle->y + 16, vehicle->z,
LIGHTFX_LIGHT_TYPE_SPOT_3);
Vehicle* mother_vehicle = vehicle; lightfx_add_3d_light(
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x + 16, vehicle->y, vehicle->z,
if (mother_vehicle->ride_subtype == RIDE_ENTRY_INDEX_NULL) LIGHTFX_LIGHT_TYPE_SPOT_3);
{ lightfx_add_3d_light(
continue; vehicleID, 0x0200 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x - 16, vehicle->y, vehicle->z,
} LIGHTFX_LIGHT_TYPE_SPOT_3);
lightfx_add_3d_light(
for (uint16_t q = vehicleID; q != SPRITE_INDEX_NULL;) vehicleID, 0x0300 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x, vehicle->y - 16, vehicle->z,
{ LIGHTFX_LIGHT_TYPE_SPOT_3);
vehicle = GET_VEHICLE(q); break;
case RIDE_TYPE_MINE_TRAIN_COASTER:
vehicleID = q; case RIDE_TYPE_GHOST_TRAIN:
if (vehicle->next_vehicle_on_train == q) if (vehicle == vehicle_get_head(vehicle))
break;
q = vehicle->next_vehicle_on_train;
int16_t place_x, place_y, place_z;
place_x = vehicle->x;
place_y = vehicle->y;
place_z = vehicle->z;
static constexpr const int16_t offsetLookup[] = {
10, 10, 9, 8, 7, 6, 4, 2, 0, -2, -4, -6, -7, -8, -9, -10,
-10, -10, -9, -8, -7, -6, -4, -2, 0, 2, 4, 6, 7, 8, 9, 10,
};
auto ride = get_ride(vehicle->ride);
if (ride == nullptr)
continue;
switch (ride->type)
{ {
case RIDE_TYPE_OBSERVATION_TOWER: place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
lightfx_add_3d_light( place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x, vehicle->y + 16, vehicle->z, lightfx_add_3d_light(
LIGHTFX_LIGHT_TYPE_SPOT_3); vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z, LIGHTFX_LIGHT_TYPE_SPOT_3);
lightfx_add_3d_light( }
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x + 16, vehicle->y, vehicle->z, break;
LIGHTFX_LIGHT_TYPE_SPOT_3); case RIDE_TYPE_CHAIRLIFT:
lightfx_add_3d_light( lightfx_add_3d_light(
vehicleID, 0x0200 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x - 16, vehicle->y, vehicle->z, vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z - 16,
LIGHTFX_LIGHT_TYPE_SPOT_3); LIGHTFX_LIGHT_TYPE_LANTERN_2);
lightfx_add_3d_light( break;
vehicleID, 0x0300 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x, vehicle->y - 16, vehicle->z, case RIDE_TYPE_BOAT_HIRE:
LIGHTFX_LIGHT_TYPE_SPOT_3); case RIDE_TYPE_CAR_RIDE:
break; case RIDE_TYPE_GO_KARTS:
case RIDE_TYPE_MINE_TRAIN_COASTER: case RIDE_TYPE_DODGEMS:
case RIDE_TYPE_GHOST_TRAIN: case RIDE_TYPE_MINI_HELICOPTERS:
if (vehicle == vehicle_get_head(vehicle)) case RIDE_TYPE_MONORAIL_CYCLES:
{ case RIDE_TYPE_SUBMARINE_RIDE:
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2; case RIDE_TYPE_SPLASH_BOATS:
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2; case RIDE_TYPE_WATER_COASTER:
lightfx_add_3d_light( {
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z, Vehicle* vehicle_draw = vehicle_get_head(vehicle);
LIGHTFX_LIGHT_TYPE_SPOT_3); if (vehicle_draw->next_vehicle_on_train != SPRITE_INDEX_NULL)
} {
break; vehicle_draw = GET_VEHICLE(vehicle_draw->next_vehicle_on_train);
case RIDE_TYPE_CHAIRLIFT: }
lightfx_add_3d_light( place_x = vehicle_draw->x;
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z - 16, place_y = vehicle_draw->y;
LIGHTFX_LIGHT_TYPE_LANTERN_2); place_z = vehicle_draw->z;
break; place_x -= offsetLookup[(vehicle_draw->sprite_direction + 0) % 32];
case RIDE_TYPE_BOAT_HIRE: place_y -= offsetLookup[(vehicle_draw->sprite_direction + 8) % 32];
case RIDE_TYPE_CAR_RIDE: lightfx_add_3d_light(
case RIDE_TYPE_GO_KARTS: vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z, LIGHTFX_LIGHT_TYPE_SPOT_2);
case RIDE_TYPE_DODGEMS: place_x -= offsetLookup[(vehicle_draw->sprite_direction + 0) % 32];
case RIDE_TYPE_MINI_HELICOPTERS: place_y -= offsetLookup[(vehicle_draw->sprite_direction + 8) % 32];
case RIDE_TYPE_MONORAIL_CYCLES: lightfx_add_3d_light(
case RIDE_TYPE_SUBMARINE_RIDE: vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z, LIGHTFX_LIGHT_TYPE_SPOT_2);
case RIDE_TYPE_SPLASH_BOATS: break;
case RIDE_TYPE_WATER_COASTER:
{
Vehicle* vehicle_draw = vehicle_get_head(vehicle);
if (vehicle_draw->next_vehicle_on_train != SPRITE_INDEX_NULL)
{
vehicle_draw = GET_VEHICLE(vehicle_draw->next_vehicle_on_train);
}
place_x = vehicle_draw->x;
place_y = vehicle_draw->y;
place_z = vehicle_draw->z;
place_x -= offsetLookup[(vehicle_draw->sprite_direction + 0) % 32];
place_y -= offsetLookup[(vehicle_draw->sprite_direction + 8) % 32];
lightfx_add_3d_light(
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z,
LIGHTFX_LIGHT_TYPE_SPOT_2);
place_x -= offsetLookup[(vehicle_draw->sprite_direction + 0) % 32];
place_y -= offsetLookup[(vehicle_draw->sprite_direction + 8) % 32];
lightfx_add_3d_light(
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z,
LIGHTFX_LIGHT_TYPE_SPOT_2);
break;
}
case RIDE_TYPE_MONORAIL:
lightfx_add_3d_light(
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x, vehicle->y, vehicle->z + 12,
LIGHTFX_LIGHT_TYPE_SPOT_2);
if (vehicle == vehicle_get_head(vehicle))
{
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
lightfx_add_3d_light(
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
LIGHTFX_LIGHT_TYPE_LANTERN_3);
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 3;
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 3;
lightfx_add_3d_light(
vehicleID, 0x0200 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 2,
LIGHTFX_LIGHT_TYPE_LANTERN_3);
}
if (vehicle == vehicle_get_tail(vehicle))
{
place_x += offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
place_y += offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
lightfx_add_3d_light(
vehicleID, 0x0300 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
LIGHTFX_LIGHT_TYPE_LANTERN_3);
place_x += offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
place_y += offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
lightfx_add_3d_light(
vehicleID, 0x0400 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 2,
LIGHTFX_LIGHT_TYPE_LANTERN_3);
}
break;
case RIDE_TYPE_MINIATURE_RAILWAY:
if (vehicle == vehicle_get_head(vehicle))
{
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
lightfx_add_3d_light(
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
LIGHTFX_LIGHT_TYPE_LANTERN_3);
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
lightfx_add_3d_light(
vehicleID, 0x0200 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 2,
LIGHTFX_LIGHT_TYPE_LANTERN_3);
}
else
{
lightfx_add_3d_light(
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
LIGHTFX_LIGHT_TYPE_LANTERN_3);
}
break;
default:
break;
};
} }
} case RIDE_TYPE_MONORAIL:
lightfx_add_3d_light(
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x, vehicle->y, vehicle->z + 12,
LIGHTFX_LIGHT_TYPE_SPOT_2);
if (vehicle == vehicle_get_head(vehicle))
{
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
lightfx_add_3d_light(
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
LIGHTFX_LIGHT_TYPE_LANTERN_3);
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 3;
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 3;
lightfx_add_3d_light(
vehicleID, 0x0200 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 2,
LIGHTFX_LIGHT_TYPE_LANTERN_3);
}
if (vehicle == vehicle_get_tail(vehicle))
{
place_x += offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
place_y += offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
lightfx_add_3d_light(
vehicleID, 0x0300 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
LIGHTFX_LIGHT_TYPE_LANTERN_3);
place_x += offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
place_y += offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
lightfx_add_3d_light(
vehicleID, 0x0400 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 2,
LIGHTFX_LIGHT_TYPE_LANTERN_3);
}
break;
case RIDE_TYPE_MINIATURE_RAILWAY:
if (vehicle == vehicle_get_head(vehicle))
{
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
lightfx_add_3d_light(
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
LIGHTFX_LIGHT_TYPE_LANTERN_3);
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
lightfx_add_3d_light(
vehicleID, 0x0200 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 2,
LIGHTFX_LIGHT_TYPE_LANTERN_3);
}
else
{
lightfx_add_3d_light(
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
LIGHTFX_LIGHT_TYPE_LANTERN_3);
}
break;
default:
break;
};
} }
void lightfx_apply_palette_filter(uint8_t i, uint8_t* r, uint8_t* g, uint8_t* b) void lightfx_apply_palette_filter(uint8_t i, uint8_t* r, uint8_t* g, uint8_t* b)

View File

@ -15,6 +15,7 @@
# include "../common.h" # include "../common.h"
struct CoordsXY; struct CoordsXY;
struct Vehicle;
struct rct_drawpixelinfo; struct rct_drawpixelinfo;
struct rct_palette; struct rct_palette;
@ -44,6 +45,7 @@ enum LIGHTFX_LIGHT_QUALIFIER
void lightfx_set_available(bool available); void lightfx_set_available(bool available);
bool lightfx_is_available(); bool lightfx_is_available();
bool lightfx_for_vehicles_is_available();
void lightfx_init(); void lightfx_init();
@ -62,7 +64,7 @@ void lightfx_add_3d_light(uint32_t lightID, uint16_t lightIDqualifier, int16_t x
void lightfx_add_3d_light_magic_from_drawing_tile( void lightfx_add_3d_light_magic_from_drawing_tile(
const CoordsXY& mapPosition, int16_t offsetX, int16_t offsetY, int16_t offsetZ, uint8_t lightType); const CoordsXY& mapPosition, int16_t offsetX, int16_t offsetY, int16_t offsetZ, uint8_t lightType);
void lightfx_add_lights_magic_vehicles(); void lightfx_add_lights_magic_vehicle(const Vehicle* vehicle);
uint32_t lightfx_get_light_polution(); uint32_t lightfx_get_light_polution();

View File

@ -3906,6 +3906,9 @@ enum
STR_GRAPH_AXIS_LABEL = 6360, STR_GRAPH_AXIS_LABEL = 6360,
STR_ENABLE_LIGHTING_VEHICLES = 6361,
STR_ENABLE_LIGHTING_VEHICLES_TIP = 6362,
// Have to include resource strings (from scenarios and objects) for the time being now that language is partially working // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working
STR_COUNT = 32768 STR_COUNT = 32768
}; };

View File

@ -10,6 +10,7 @@
#include "Paint.Sprite.h" #include "Paint.Sprite.h"
#include "../../drawing/Drawing.h" #include "../../drawing/Drawing.h"
#include "../../drawing/LightFX.h"
#include "../../interface/Viewport.h" #include "../../interface/Viewport.h"
#include "../../peep/Staff.h" #include "../../peep/Staff.h"
#include "../../ride/RideData.h" #include "../../ride/RideData.h"
@ -111,6 +112,12 @@ void sprite_paint_setup(paint_session* session, const uint16_t x, const uint16_t
{ {
case SPRITE_IDENTIFIER_VEHICLE: case SPRITE_IDENTIFIER_VEHICLE:
vehicle_paint(session, (Vehicle*)spr, image_direction); vehicle_paint(session, (Vehicle*)spr, image_direction);
#ifdef __ENABLE_LIGHTFX__
if (lightfx_for_vehicles_is_available())
{
lightfx_add_lights_magic_vehicle(reinterpret_cast<Vehicle*>(const_cast<rct_sprite*>(spr)));
}
#endif
break; break;
case SPRITE_IDENTIFIER_PEEP: case SPRITE_IDENTIFIER_PEEP:
peep_paint(session, (Peep*)spr, image_direction); peep_paint(session, (Peep*)spr, image_direction);