Label fence offsets

This commit is contained in:
duncanspumpkin 2017-02-19 11:03:05 +00:00
parent 50e1c831a6
commit 133266deb0
10 changed files with 61 additions and 56 deletions

View File

@ -492,7 +492,7 @@ static void viewport_interaction_remove_park_wall(rct_map_element *mapElement, s
{
rct_scenery_entry *sceneryEntry = get_wall_entry(mapElement->properties.fence.type);
if (sceneryEntry->wall.scrolling_mode != 0xFF){
window_sign_small_open(mapElement->properties.fence.item[0]);
window_sign_small_open(mapElement->properties.fence.banner_index);
} else {
gGameCommandErrorTitle = STR_CANT_REMOVE_THIS;
game_do_command(

View File

@ -145,18 +145,18 @@ void fence_paint(uint8 direction, sint32 height, rct_map_element * map_element)
}
sint32 primaryColour = map_element->properties.fence.item[1] & 0x1F;
sint32 primaryColour = map_element->properties.fence.colour_1 & 0x1F;
uint32 imageColourFlags = primaryColour << 19 | 0x20000000;
uint32 dword_141F718 = imageColourFlags + 0x23800006;
if (sceneryEntry->wall.flags & WALL_SCENERY_HAS_SECONDARY_COLOUR) {
uint8 secondaryColour = (map_element->properties.fence.item[1] >> 5) | ((map_element->flags & 0x60) >> 2);
uint8 secondaryColour = (map_element->properties.fence.colour_1 >> 5) | ((map_element->flags & 0x60) >> 2);
imageColourFlags |= secondaryColour << 24 | 0x80000000;
}
uint32 tertiaryColour = 0;
if (sceneryEntry->wall.flags & WALL_SCENERY_HAS_TERNARY_COLOUR) {
tertiaryColour = map_element->properties.fence.item[0];
tertiaryColour = map_element->properties.fence.colour_3;
imageColourFlags &= 0x0DFFFFFFF;
}
@ -184,7 +184,7 @@ void fence_paint(uint8 direction, sint32 height, rct_map_element * map_element)
rct_xyz16 boundsR1, boundsR1_, boundsR2, boundsR2_, boundsL1, boundsL1_;
uint8 animationFrame = fence_get_animation_frame(map_element);
// Add the direction as well
animationFrame |= (map_element->properties.fence.item[2] & 0x80) >> 3;
animationFrame |= (map_element->properties.fence.animation & 0x80) >> 3;
uint32 imageId;
switch (direction) {
case 0:
@ -345,21 +345,21 @@ void fence_paint(uint8 direction, sint32 height, rct_map_element * map_element)
set_format_arg(0, uint32, 0);
set_format_arg(4, uint32, 0);
uint8 al_2 = map_element->properties.fence.item[1] >> 5 | (map_element->flags & 0x60) >> 2;
uint8 secondaryColour = map_element->properties.fence.colour_1 >> 5 | (map_element->flags & 0x60) >> 2;
if (dword_141F710 != 0) {
al_2 = COLOUR_GREY;
secondaryColour = COLOUR_GREY;
}
if (direction == 0) {
al_2 |= 0x80;
secondaryColour |= 0x80;
}
set_format_arg(7, uint8, al_2);
set_format_arg(7, uint8, secondaryColour);
uint16 scrollingMode = sceneryEntry->wall.scrolling_mode + ((direction + 1) & 0x3);
uint8 bannerIndex = map_element->properties.fence.item[0];
uint8 bannerIndex = map_element->properties.fence.banner_index;
rct_banner * banner = &gBanners[bannerIndex];
set_format_arg(0, rct_string_id, banner->string_idx);
@ -386,5 +386,5 @@ void fence_paint(uint8 direction, sint32 height, rct_map_element * map_element)
}
uint8 fence_get_animation_frame(rct_map_element *fenceElement) {
return (fenceElement->properties.fence.item[2] >> 3) & 0xF;
return (fenceElement->properties.fence.animation >> 3) & 0xF;
}

View File

@ -411,9 +411,9 @@ private:
break;
case MAP_ELEMENT_TYPE_FENCE:
{
uint8 var_05 = mapElement->properties.fence.item[0];
uint16 var_06 = mapElement->properties.fence.item[1] |
(mapElement->properties.fence.item[2] << 8);
uint8 var_05 = mapElement->properties.fence.colour_3;
uint16 var_06 = mapElement->properties.fence.colour_1 |
(mapElement->properties.fence.animation << 8);
for (sint32 edge = 0; edge < 4; edge++)
{
@ -2209,9 +2209,9 @@ private:
rct_map_element originalMapElement = *mapElement;
map_element_remove(mapElement);
uint8 var_05 = originalMapElement.properties.fence.item[0];
uint16 var_06 = originalMapElement.properties.fence.item[1] |
(originalMapElement.properties.fence.item[2] << 8);
uint8 var_05 = originalMapElement.properties.fence.colour_3;
uint16 var_06 = originalMapElement.properties.fence.colour_1 |
(originalMapElement.properties.fence.animation << 8);
for (sint32 edge = 0; edge < 4; edge++)
{

View File

@ -337,10 +337,10 @@ static void track_design_save_add_wall(sint32 x, sint32 y, rct_map_element *mapE
uint8 flags = 0;
flags |= mapElement->type & 3;
flags |= mapElement->properties.fence.item[0] << 2;
flags |= mapElement->properties.fence.colour_3 << 2;
uint8 secondaryColour = ((mapElement->flags & 0x60) >> 2) | (mapElement->properties.fence.item[1] >> 5);
uint8 primaryColour = mapElement->properties.fence.item[1] & 0x1F;
uint8 secondaryColour = ((mapElement->flags & 0x60) >> 2) | (mapElement->properties.fence.colour_1 >> 5);
uint8 primaryColour = mapElement->properties.fence.colour_1 & 0x1F;
track_design_save_push_map_element(x, y, mapElement);
track_design_save_push_map_element_desc(entry, x, y, mapElement->base_height, flags, primaryColour, secondaryColour);
@ -520,10 +520,10 @@ static void track_design_save_remove_wall(sint32 x, sint32 y, rct_map_element *m
uint8 flags = 0;
flags |= mapElement->type & 3;
flags |= mapElement->properties.fence.item[0] << 2;
flags |= mapElement->properties.fence.colour_3 << 2;
uint8 secondaryColour = ((mapElement->flags & 0x60) >> 2) | (mapElement->properties.fence.item[1] >> 5);
uint8 primaryColour = mapElement->properties.fence.item[1] & 0x1F;
uint8 secondaryColour = ((mapElement->flags & 0x60) >> 2) | (mapElement->properties.fence.colour_1 >> 5);
uint8 primaryColour = mapElement->properties.fence.colour_1 & 0x1F;
track_design_save_pop_map_element(x, y, mapElement);
track_design_save_pop_map_element_desc(entry, x, y, mapElement->base_height, flags, primaryColour, secondaryColour);

View File

@ -6853,13 +6853,13 @@ static void vehicle_update_scenery_door(rct_vehicle *vehicle)
}
if (vehicle->next_vehicle_on_train != SPRITE_INDEX_NULL) {
mapElement->properties.fence.item[2] &= 7;
mapElement->properties.fence.item[2] |= 8;
mapElement->properties.fence.animation &= 7;
mapElement->properties.fence.animation |= 8;
map_animation_create(MAP_ANIMATION_TYPE_WALL_DOOR, x, y, z);
vehicle_play_scenery_door_open_sound(vehicle, mapElement);
} else {
mapElement->properties.fence.item[2] &= 7;
mapElement->properties.fence.item[2] |= 0x30;
mapElement->properties.fence.animation &= 7;
mapElement->properties.fence.animation |= 0x30;
vehicle_play_scenery_door_close_sound(vehicle, mapElement);
}
}
@ -6936,13 +6936,13 @@ static void sub_6DEDE8(rct_vehicle *vehicle)
}
if (vehicle->next_vehicle_on_train != SPRITE_INDEX_NULL) {
mapElement->properties.fence.item[2] &= 7;
mapElement->properties.fence.item[2] |= 0x88;
mapElement->properties.fence.animation &= 7;
mapElement->properties.fence.animation |= 0x88;
map_animation_create(MAP_ANIMATION_TYPE_WALL_DOOR, x, y, z);
vehicle_play_scenery_door_open_sound(vehicle, mapElement);
} else {
mapElement->properties.fence.item[2] &= 7;
mapElement->properties.fence.item[2] |= 0xB0;
mapElement->properties.fence.animation &= 7;
mapElement->properties.fence.animation |= 0xB0;
vehicle_play_scenery_door_close_sound(vehicle, mapElement);
}
}

View File

@ -437,7 +437,7 @@ void window_sign_small_open(rct_windownumber number){
if (map_element_get_type(map_element) == MAP_ELEMENT_TYPE_FENCE) {
rct_scenery_entry* scenery_entry = get_wall_entry(map_element->properties.fence.type);
if (scenery_entry->wall.scrolling_mode != 0xFF){
if (map_element->properties.fence.item[0] == w->number)
if (map_element->properties.fence.banner_index == w->number)
break;
}
}
@ -447,9 +447,9 @@ void window_sign_small_open(rct_windownumber number){
sint32 view_z = map_element->base_height << 3;
w->frame_no = view_z;
w->list_information_type = map_element->properties.fence.item[1] & 0x1F;
w->list_information_type = map_element->properties.fence.colour_1 & 0x1F;
w->var_492 =
((map_element->properties.fence.item[1] >> 5) | ((map_element->flags & 0x60) >> 2));
((map_element->properties.fence.colour_1 >> 5) | ((map_element->flags & 0x60) >> 2));
w->var_48C = map_element->properties.fence.type;
view_x += 16;
@ -499,7 +499,7 @@ static void window_sign_small_mouseup(rct_window *w, sint32 widgetIndex)
if (map_element_get_type(map_element) == MAP_ELEMENT_TYPE_FENCE) {
rct_scenery_entry* scenery_entry = get_wall_entry(map_element->properties.fence.type);
if (scenery_entry->wall.scrolling_mode != 0xFF){
if (map_element->properties.fence.item[0] == w->number)
if (map_element->properties.fence.banner_index == w->number)
break;
}
}

View File

@ -1840,7 +1840,7 @@ static void window_tile_inspector_paint(rct_window *w, rct_drawpixelinfo *dpi)
// Banner info
rct_wall_scenery_entry fenceEntry = get_wall_entry(fenceType)->wall;
if (fenceEntry.flags & WALL_SCENERY_IS_BANNER) {
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_TEXT, &gBanners[mapElement->properties.fence.item[0]].string_idx, COLOUR_DARK_GREEN, x, y + 11);
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_TEXT, &gBanners[mapElement->properties.fence.banner_index].string_idx, COLOUR_DARK_GREEN, x, y + 11);
}
else {
gfx_draw_string_left(dpi, STR_TILE_INSPECTOR_ENTRY_BANNER_NONE, NULL, COLOUR_DARK_GREEN, x, y + 11);

View File

@ -128,7 +128,7 @@ rct_xyz16 gCommandPosition;
uint8 gUnk9E2E28;
static uint8 _unk141F725;
static bool gWallAcrossTrack;
static void map_update_grass_length(sint32 x, sint32 y, rct_map_element *mapElement);
static void map_set_grass_length(sint32 x, sint32 y, rct_map_element *mapElement, sint32 length);
@ -1244,15 +1244,15 @@ void game_command_set_fence_colour(sint32* eax, sint32* ebx, sint32* ecx, sint32
if(flags & GAME_COMMAND_FLAG_APPLY){
rct_scenery_entry* scenery_entry = get_wall_entry(map_element->properties.fence.type);
map_element->properties.fence.item[1] &= 0xE0;
map_element->properties.fence.item[1] |= colour1;
map_element->properties.fence.item[1] &= 0x1F;
map_element->properties.fence.colour_1 &= 0xE0;
map_element->properties.fence.colour_1 |= colour1;
map_element->properties.fence.colour_1 &= 0x1F;
map_element->flags &= 0x9F;
map_element->properties.fence.item[1] |= (colour2 & 0x7) * 32;
map_element->properties.fence.colour_1 |= (colour2 & 0x7) * 32;
map_element->flags |= (colour2 & 0x18) * 4;
if(scenery_entry->wall.flags & WALL_SCENERY_HAS_TERNARY_COLOUR){
map_element->properties.fence.item[0] = colour3;
map_element->properties.fence.colour_3 = colour3;
}
map_invalidate_tile_zoom1(x, y, z, z + 72);
}
@ -3329,7 +3329,7 @@ static bool map_place_fence_check_obstruction_with_track(rct_scenery_entry *wall
return false;
}
_unk141F725 |= 1;
gWallAcrossTrack = true;
if (z0 & 1) {
return false;
}
@ -3393,7 +3393,7 @@ static bool map_place_fence_check_obstruction(rct_scenery_entry *wall, sint32 x,
rct_scenery_entry *entry;
rct_large_scenery_tile *tile;
_unk141F725 = 0;
gWallAcrossTrack = false;
gMapGroundFlags = ELEMENT_IS_ABOVE_GROUND;
if (map_is_location_at_edge(x, y)) {
gGameCommandErrorText = STR_OFF_EDGE_OF_MAP;
@ -3717,21 +3717,21 @@ void game_command_place_fence(sint32* eax, sint32* ebx, sint32* ecx, sint32* edx
map_element->type = bp | edge | MAP_ELEMENT_TYPE_FENCE;
map_element->properties.fence.item[1] = primary_colour;
map_element->properties.fence.item[1] |= (secondary_colour & 7) << 5;
map_element->properties.fence.colour_1 = primary_colour;
map_element->properties.fence.colour_1 |= (secondary_colour & 7) << 5;
map_element->flags |= (secondary_colour & 0x18) << 2;
if (_unk141F725 & 1) {
map_element->properties.fence.item[2] |= (1 << 2);
if (gWallAcrossTrack) {
map_element->properties.fence.animation |= (1 << 2);
}
map_element->properties.fence.type = fence_type;
if (banner_index != 0xFF){
map_element->properties.fence.item[0] = banner_index;
map_element->properties.fence.banner_index = banner_index;
}
if (fence->wall.flags & WALL_SCENERY_HAS_TERNARY_COLOUR){
map_element->properties.fence.item[0] = tertiary_colour;
map_element->properties.fence.colour_3 = tertiary_colour;
}
if (flags & (1 << 6)){
@ -4637,7 +4637,7 @@ sint32 map_element_get_banner_index(rct_map_element *mapElement)
if (sceneryEntry->wall.scrolling_mode == 0xFF)
return -1;
return mapElement->properties.fence.item[0];
return mapElement->properties.fence.banner_index;
case MAP_ELEMENT_TYPE_BANNER:
return mapElement->properties.banner.index;
default:
@ -5594,7 +5594,7 @@ void game_command_set_sign_style(sint32* eax, sint32* ebx, sint32* ecx, sint32*
rct_scenery_entry* scenery_entry = get_wall_entry(map_element->properties.fence.type);
if (scenery_entry->wall.scrolling_mode == 0xFF)
continue;
if (map_element->properties.fence.item[0] != bannerId)
if (map_element->properties.fence.banner_index != bannerId)
continue;
fence_found = true;
break;
@ -5611,7 +5611,7 @@ void game_command_set_sign_style(sint32* eax, sint32* ebx, sint32* ecx, sint32*
}
map_element->flags &= 0x9F;
map_element->properties.fence.item[1] =
map_element->properties.fence.colour_1 =
mainColour |
((textColour & 0x7) << 5);
map_element->flags |= ((textColour & 0x18) << 2);

View File

@ -70,7 +70,12 @@ assert_struct_size(rct_map_element_entrance_properties, 4);
typedef struct rct_map_element_fence_properties {
uint8 type; //4
uint8 item[3]; //5
union {
uint8 colour_3; //5
uint8 banner_index; //5
};
uint8 colour_1; //6 0b_2221_1111 2 = colour_2 (uses flags for rest of colour2), 1 = colour_1
uint8 animation; //7 0b_dfff_ft00 d = direction, f = frame num, t = across track flag (not used)
} rct_map_element_fence_properties;
assert_struct_size(rct_map_element_fence_properties, 4);

View File

@ -473,7 +473,7 @@ static bool map_animation_invalidate_wall_door(sint32 x, sint32 y, sint32 baseZ)
}
bool invalidate = false;
uint8 bl = mapElement->properties.fence.item[2] & 0x87;
uint8 bl = mapElement->properties.fence.animation & 0x87;
uint8 currentFrame = fence_get_animation_frame(mapElement);
if (currentFrame != 0) {
if (currentFrame == 15) {
@ -491,7 +491,7 @@ static bool map_animation_invalidate_wall_door(sint32 x, sint32 y, sint32 baseZ)
}
bl |= currentFrame << 3;
mapElement->properties.fence.item[2] = bl;
mapElement->properties.fence.animation = bl;
if (invalidate) {
sint32 z = mapElement->base_height * 8;
map_invalidate_tile_zoom1(x, y, z, z + 32);