diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm new file mode 100644 index 00000000000..f7ed7e253df --- /dev/null +++ b/code/__DEFINES/icon_smoothing.dm @@ -0,0 +1,101 @@ +/* smoothing_flags */ +#define SMOOTH_CORNERS (1<<0) //Smoothing system in where adjacencies are calculated and used to build an image by mounting each corner at runtime. +#define SMOOTH_DIAGONAL (1<<2) //if atom should smooth diagonally, this should be present in 'smoothing_flags' var +#define SMOOTH_BORDER (1<<3) //atom will smooth with the borders of the map +#define SMOOTH_QUEUED (1<<4) //atom is currently queued to smooth. +#define SMOOTH_OBJ (1<<5) //smooths with objects, and will thus need to scan turfs for contents. + + +/*smoothing macros*/ + +#define QUEUE_SMOOTH(thing_to_queue) if(thing_to_queue.smoothing_flags) {SSicon_smooth.add_to_queue(thing_to_queue)} + +#define QUEUE_SMOOTH_NEIGHBORS(thing_to_queue) for(var/neighbor in orange(1, thing_to_queue)) {var/atom/atom_neighbor = neighbor; QUEUE_SMOOTH(atom_neighbor)} + + +/**SMOOTHING GROUPS + * Groups of things to smooth with. + * * Contained in the `list/smoothing_groups` variable. + * * Matched with the `list/canSmoothWith` variable to check whether smoothing is possible or not. + */ + +#define S_TURF(num) ((24 * 0) + num) //Not any different from the number itself, but kept this way in case someone wants to expand it by adding stuff before it. +/* /turf only */ + +#define SMOOTH_GROUP_TURF_OPEN S_TURF(0) ///turf/open +#define SMOOTH_GROUP_TURF_CHASM S_TURF(1) ///turf/open/chasm, /turf/open/floor/fakepit +#define SMOOTH_GROUP_FLOOR_LAVA S_TURF(2) ///turf/open/lava/smooth +#define SMOOTH_GROUP_FLOOR_TRANSPARENT_GLASS S_TURF(3) ///turf/open/transparent/glass + +#define SMOOTH_GROUP_OPEN_FLOOR S_TURF(4) ///turf/open/floor + +#define SMOOTH_GROUP_FLOOR_ASH S_TURF(5) ///turf/open/floor/plating/ashplanet/ash +#define SMOOTH_GROUP_FLOOR_ASH_ROCKY S_TURF(6) ///turf/open/floor/plating/ashplanet/rocky +#define SMOOTH_GROUP_FLOOR_ICE S_TURF(7) ///turf/open/floor/plating/ice +#define SMOOTH_GROUP_FLOOR_SNOWED S_TURF(8) ///turf/open/floor/plating/snowed + +#define SMOOTH_GROUP_CARPET S_TURF(10) ///turf/open/floor/carpet +#define SMOOTH_GROUP_CARPET_BLACK S_TURF(11) ///turf/open/floor/carpet/black +#define SMOOTH_GROUP_CARPET_BLUE S_TURF(12) ///turf/open/floor/carpet/blue +#define SMOOTH_GROUP_CARPET_CYAN S_TURF(13) ///turf/open/floor/carpet/cyan +#define SMOOTH_GROUP_CARPET_GREEN S_TURF(14) ///turf/open/floor/carpet/green +#define SMOOTH_GROUP_CARPET_ORANGE S_TURF(15) ///turf/open/floor/carpet/orange +#define SMOOTH_GROUP_CARPET_PURPLE S_TURF(16) ///turf/open/floor/carpet/purple +#define SMOOTH_GROUP_CARPET_RED S_TURF(17) ///turf/open/floor/carpet/red +#define SMOOTH_GROUP_CARPET_ROYAL_BLACK S_TURF(18) ///turf/open/floor/carpet/royalblack +#define SMOOTH_GROUP_CARPET_ROYAL_BLUE S_TURF(19) ///turf/open/floor/carpet/royalblue + +#define SMOOTH_GROUP_CLOSED_TURFS S_TURF(24) ///turf/closed +#define SMOOTH_GROUP_MATERIAL_WALLS S_TURF(25) ///turf/closed/wall/material +#define SMOOTH_GROUP_SYNDICATE_WALLS S_TURF(26) ///turf/closed/wall/r_wall/syndicate +#define SMOOTH_GROUP_HOTEL_WALLS S_TURF(27) ///turf/closed/indestructible/hotelwall +#define SMOOTH_GROUP_MINERAL_WALLS S_TURF(28) ///turf/closed/mineral, /turf/closed/indestructible +#define SMOOTH_GROUP_BOSS_WALLS S_TURF(29) ///turf/closed/indestructible/riveted/boss +#define SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS S_TURF(30) ///turf/closed/wall/mineral/titanium/survival + +#define MAX_S_TURF SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS //Always match this value with the one above it. + + +#define S_OBJ(num) (MAX_S_TURF + 1 + num) +/* /obj included */ + +#define SMOOTH_GROUP_WALLS S_OBJ(0) ///turf/closed/wall, /obj/structure/falsewall +#define SMOOTH_GROUP_URANIUM_WALLS S_OBJ(1) ///turf/closed/wall/mineral/uranium, /obj/structure/falsewall/uranium +#define SMOOTH_GROUP_GOLD_WALLS S_OBJ(2) ///turf/closed/wall/mineral/gold, /obj/structure/falsewall/gold +#define SMOOTH_GROUP_SILVER_WALLS S_OBJ(3) ///turf/closed/wall/mineral/silver, /obj/structure/falsewall/silver +#define SMOOTH_GROUP_DIAMOND_WALLS S_OBJ(4) ///turf/closed/wall/mineral/diamond, /obj/structure/falsewall/diamond +#define SMOOTH_GROUP_PLASMA_WALLS S_OBJ(5) ///turf/closed/wall/mineral/plasma, /obj/structure/falsewall/plasma +#define SMOOTH_GROUP_BANANIUM_WALLS S_OBJ(6) ///turf/closed/wall/mineral/bananium, /obj/structure/falsewall/bananium +#define SMOOTH_GROUP_SANDSTONE_WALLS S_OBJ(7) ///turf/closed/wall/mineral/sandstone, /obj/structure/falsewall/sandstone +#define SMOOTH_GROUP_WOOD_WALLS S_OBJ(8) ///turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood +#define SMOOTH_GROUP_IRON_WALLS S_OBJ(9) ///turf/closed/wall/mineral/iron, /obj/structure/falsewall/iron +#define SMOOTH_GROUP_ABDUCTOR_WALLS S_OBJ(10) ///turf/closed/wall/mineral/abductor, /obj/structure/falsewall/abductor +#define SMOOTH_GROUP_TITANIUM_WALLS S_OBJ(11) ///turf/closed/wall/mineral/titanium, /obj/structure/falsewall/titanium +#define SMOOTH_GROUP_PLASTITANIUM_WALLS S_OBJ(13) ///turf/closed/wall/mineral/plastitanium, /obj/structure/falsewall/plastitanium +#define SMOOTH_GROUP_SURVIVAL_TIANIUM_POD S_OBJ(14) ///turf/closed/wall/mineral/titanium/survival/pod, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod + +#define SMOOTH_GROUP_PAPERFRAME S_OBJ(20) ///obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe + +#define SMOOTH_GROUP_WINDOW_FULLTILE S_OBJ(21) ///obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile + +#define SMOOTH_GROUP_LATTICE S_OBJ(30) ///obj/structure/lattice + +#define SMOOTH_GROUP_AIRLOCK S_OBJ(40) ///obj/machinery/door/airlock + +#define SMOOTH_GROUP_TABLES S_OBJ(50) ///obj/structure/table +#define SMOOTH_GROUP_WOOD_TABLES S_OBJ(51) ///obj/structure/table/wood +#define SMOOTH_GROUP_FANCY_WOOD_TABLES S_OBJ(52) ///obj/structure/table/wood/fancy +#define SMOOTH_GROUP_BRONZE_TABLES S_OBJ(53) ///obj/structure/table/bronze + +#define SMOOTH_GROUP_ALIEN_RESIN S_OBJ(60) ///obj/structure/alien/resin +#define SMOOTH_GROUP_ALIEN_WALLS S_OBJ(61) ///obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane +#define SMOOTH_GROUP_ALIEN_WEEDS S_OBJ(62) ///obj/structure/alien/weeds + +#define SMOOTH_GROUP_SECURITY_BARRICADE S_OBJ(63) ///obj/structure/barricade/security +#define SMOOTH_GROUP_SANDBAGS S_OBJ(64) ///obj/structure/barricade/sandbags + +#define SMOOTH_GROUP_HEDGE_FLUFF S_OBJ(65) ///obj/structure/fluff/hedge + +#define SMOOTH_GROUP_SHUTTLE_PARTS S_OBJ(66) ///obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater + +#define SMOOTH_GROUP_CLEANABLE_DIRT S_OBJ(67) ///obj/effect/decal/cleanable/dirt diff --git a/code/__HELPERS/bitflag_lists.dm b/code/__HELPERS/bitflag_lists.dm new file mode 100644 index 00000000000..a665d92cd41 --- /dev/null +++ b/code/__HELPERS/bitflag_lists.dm @@ -0,0 +1,25 @@ +GLOBAL_LIST_EMPTY(bitflag_lists) + +/** + * System for storing bitflags past the 24 limit, making use of an associative list. + * + * Macro converts a list of integers into an associative list of bitflag entries for quicker comparison. + * Example: list(0, 4, 26, 32)) => list( "0" = ( (1<<0) | (1<<4) ), "1" = ( (1<<2) | (1<<8) ) ) + * Lists are cached into a global list of lists to avoid identical duplicates. + * This system makes value comparisons faster than pairing every element of one list with every element of the other for evaluation. + * + * Arguments: + * * target - List of integers. + */ +#define SET_BITFLAG_LIST(target) \ + do { \ + var/txt_signature = target.Join("-"); \ + if(!GLOB.bitflag_lists[txt_signature]) { \ + var/list/new_bitflag_list = list(); \ + for(var/value in target) { \ + new_bitflag_list["[round(value / 24)]"] |= (1 << (value % 24)); \ + }; \ + GLOB.bitflag_lists[txt_signature] = new_bitflag_list; \ + }; \ + target = GLOB.bitflag_lists[txt_signature]; \ + } while (FALSE) diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index ca32a39883d..a565ce4701d 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -4,7 +4,8 @@ Each tile is divided in 4 corners, each corner has an appearance associated to it; the tile is then overlayed by these 4 appearances To use this, just set your atom's 'smoothing_flags' var to 1. If your atom can be moved/unanchored, set its 'can_be_unanchored' var to 1. If you don't want your atom's icon to smooth with anything but atoms of the same type, set the list 'canSmoothWith' to null; - Otherwise, put all types you want the atom icon to smooth with in 'canSmoothWith' INCLUDING THE TYPE OF THE ATOM ITSELF. + Otherwise, put all the smoothing groups you want the atom icon to smooth with in 'canSmoothWith', including the group of the atom itself. + Smoothing groups are just shared flags between objects. If one of the 'canSmoothWith' of A matches one of the `smoothing_groups` of B, then A will smooth with B. Each atom has its own icon file with all the possible corner states. See 'smooth_wall.dmi' for a template. @@ -24,104 +25,92 @@ */ //Redefinitions of the diagonal directions so they can be stored in one var without conflicts -#define N_NORTH (1<<1) -#define N_SOUTH (1<<2) -#define N_EAST (1<<4) -#define N_WEST (1<<8) -#define N_NORTHEAST (1<<5) -#define N_NORTHWEST (1<<9) +#define N_NORTH NORTH //(1<<0) +#define N_SOUTH SOUTH //(1<<1) +#define N_EAST EAST //(1<<2) +#define N_WEST WEST //(1<<3) +#define N_NORTHEAST (1<<4) +#define N_NORTHWEST (1<<5) #define N_SOUTHEAST (1<<6) -#define N_SOUTHWEST (1<<10) +#define N_SOUTHWEST (1<<7) -#define SMOOTH_TRUE (1<<0) //smooths with exact specified types or just itself -#define SMOOTH_MORE (1<<1) //smooths with all subtypes of specified types or just itself (this value can replace SMOOTH_TRUE) -#define SMOOTH_DIAGONAL (1<<2) //if atom should smooth diagonally, this should be present in 'smoothing_flags' var -#define SMOOTH_BORDER (1<<3) //atom will smooth with the borders of the map -#define SMOOTH_QUEUED (1<<4) //atom is currently queued to smooth. - -#define NULLTURF_BORDER 123456789 +#define NO_ADJ_FOUND 0 +#define ADJ_FOUND 1 +#define NULLTURF_BORDER 2 #define DEFAULT_UNDERLAY_ICON 'icons/turf/floors.dmi' #define DEFAULT_UNDERLAY_ICON_STATE "plating" -#define QUEUE_SMOOTH(thing_to_queue) if(thing_to_queue.smoothing_flags) {SSicon_smooth.add_to_queue(thing_to_queue)} +///Scans all adjacent turfs to find targets to smooth with. +/atom/proc/calculate_adjacencies() + . = NONE -#define QUEUE_SMOOTH_NEIGHBORS(thing_to_queue) for(var/neighbor in orange(1, thing_to_queue)) {var/atom/atom_neighbor = neighbor; QUEUE_SMOOTH(atom_neighbor)} - - -/proc/calculate_adjacencies(atom/A) - if(!A.loc) - return 0 - - var/adjacencies = 0 - - var/atom/movable/AM - if(ismovable(A)) - AM = A - if(AM.can_be_unanchored && !AM.anchored) - return 0 + if(!loc) + return for(var/direction in GLOB.cardinals) - AM = find_type_in_direction(A, direction) - if(AM == NULLTURF_BORDER) - if((A.smoothing_flags & SMOOTH_BORDER)) - adjacencies |= 1 << direction - else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) - adjacencies |= 1 << direction + switch(find_type_in_direction(direction)) + if(NULLTURF_BORDER) + if((smoothing_flags & SMOOTH_BORDER)) + . |= direction //BYOND and smooth dirs are the same for cardinals + if(ADJ_FOUND) + . |= direction //BYOND and smooth dirs are the same for cardinals - if(adjacencies & N_NORTH) - if(adjacencies & N_WEST) - AM = find_type_in_direction(A, NORTHWEST) - if(AM == NULLTURF_BORDER) - if((A.smoothing_flags & SMOOTH_BORDER)) - adjacencies |= N_NORTHWEST - else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) - adjacencies |= N_NORTHWEST - if(adjacencies & N_EAST) - AM = find_type_in_direction(A, NORTHEAST) - if(AM == NULLTURF_BORDER) - if((A.smoothing_flags & SMOOTH_BORDER)) - adjacencies |= N_NORTHEAST - else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) - adjacencies |= N_NORTHEAST + if(. & N_NORTH) + if(. & N_WEST) + switch(find_type_in_direction(NORTHWEST)) + if(NULLTURF_BORDER) + if((smoothing_flags & SMOOTH_BORDER)) + . |= N_NORTHWEST + if(ADJ_FOUND) + . |= N_NORTHWEST - if(adjacencies & N_SOUTH) - if(adjacencies & N_WEST) - AM = find_type_in_direction(A, SOUTHWEST) - if(AM == NULLTURF_BORDER) - if((A.smoothing_flags & SMOOTH_BORDER)) - adjacencies |= N_SOUTHWEST - else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) - adjacencies |= N_SOUTHWEST - if(adjacencies & N_EAST) - AM = find_type_in_direction(A, SOUTHEAST) - if(AM == NULLTURF_BORDER) - if((A.smoothing_flags & SMOOTH_BORDER)) - adjacencies |= N_SOUTHEAST - else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) - adjacencies |= N_SOUTHEAST + if(. & N_EAST) + switch(find_type_in_direction(NORTHEAST)) + if(NULLTURF_BORDER) + if((smoothing_flags & SMOOTH_BORDER)) + . |= N_NORTHEAST + if(ADJ_FOUND) + . |= N_NORTHEAST + + if(. & N_SOUTH) + if(. & N_WEST) + switch(find_type_in_direction(SOUTHWEST)) + if(NULLTURF_BORDER) + if((smoothing_flags & SMOOTH_BORDER)) + . |= N_SOUTHWEST + if(ADJ_FOUND) + . |= N_SOUTHWEST + + if(. & N_EAST) + switch(find_type_in_direction(SOUTHEAST)) + if(NULLTURF_BORDER) + if((smoothing_flags & SMOOTH_BORDER)) + . |= N_SOUTHEAST + if(ADJ_FOUND) + . |= N_SOUTHEAST + + +/atom/movable/calculate_adjacencies() + if(can_be_unanchored && !anchored) + return NONE + return ..() - return adjacencies //do not use, use QUEUE_SMOOTH(atom) -/proc/smooth_icon(atom/A) - if(!A || !A.smoothing_flags) - return - A.smoothing_flags &= ~SMOOTH_QUEUED - if (!A.z) - return - if(QDELETED(A)) - return - if(A.smoothing_flags & (SMOOTH_TRUE | SMOOTH_MORE)) - var/adjacencies = calculate_adjacencies(A) - - if(A.smoothing_flags & SMOOTH_DIAGONAL) - A.diagonal_smooth(adjacencies) +/atom/proc/smooth_icon() + smoothing_flags &= ~SMOOTH_QUEUED + if (!z) + CRASH("[type] called smooth_icon() without being on a z-level") + if(smoothing_flags & SMOOTH_CORNERS) + if(smoothing_flags & SMOOTH_DIAGONAL) + corners_diagonal_smooth(calculate_adjacencies()) else - cardinal_smooth(A, adjacencies) + corners_cardinal_smooth(calculate_adjacencies()) -/atom/proc/diagonal_smooth(adjacencies) + +/atom/proc/corners_diagonal_smooth(adjacencies) switch(adjacencies) if(N_NORTH|N_WEST) replace_smooth_overlays("d-se","d-se-0") @@ -142,45 +131,50 @@ replace_smooth_overlays("d-nw","d-nw-1") else - cardinal_smooth(src, adjacencies) - return + corners_cardinal_smooth(adjacencies) + return FALSE icon_state = "" - return adjacencies + return TRUE + //only walls should have a need to handle underlays -/turf/closed/wall/diagonal_smooth(adjacencies) - adjacencies = reverse_ndir(..()) - if(adjacencies) - var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, plane = FLOOR_PLANE) - var/list/U = list(underlay_appearance) - if(fixed_underlay) - if(fixed_underlay["space"]) - underlay_appearance.icon = 'icons/turf/space.dmi' - underlay_appearance.icon_state = SPACE_ICON_STATE - underlay_appearance.plane = PLANE_SPACE - else - underlay_appearance.icon = fixed_underlay["icon"] - underlay_appearance.icon_state = fixed_underlay["icon_state"] +/turf/closed/wall/corners_diagonal_smooth(adjacencies) + . = ..() + if(!.) + return + adjacencies = reverse_ndir(adjacencies) + if(adjacencies == NONE) + return + var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, plane = FLOOR_PLANE) + var/list/U = list(underlay_appearance) + if(fixed_underlay) + if(fixed_underlay["space"]) + underlay_appearance.icon = 'icons/turf/space.dmi' + underlay_appearance.icon_state = SPACE_ICON_STATE + underlay_appearance.plane = PLANE_SPACE else - var/turned_adjacency = turn(adjacencies, 180) - var/turf/T = get_step(src, turned_adjacency) - if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) - T = get_step(src, turn(adjacencies, 135)) - if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) - T = get_step(src, turn(adjacencies, 225)) - //if all else fails, ask our own turf - if(!T.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency) && !get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) - underlay_appearance.icon = DEFAULT_UNDERLAY_ICON - underlay_appearance.icon_state = DEFAULT_UNDERLAY_ICON_STATE - underlays = U + underlay_appearance.icon = fixed_underlay["icon"] + underlay_appearance.icon_state = fixed_underlay["icon_state"] + else + var/turned_adjacency = turn(adjacencies, 180) + var/turf/neighbor_turf = get_step(src, turned_adjacency) + if(!neighbor_turf.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) + neighbor_turf = get_step(src, turn(adjacencies, 135)) + if(!neighbor_turf.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) + neighbor_turf = get_step(src, turn(adjacencies, 225)) + //if all else fails, ask our own turf + if(!neighbor_turf.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency) && !get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) + underlay_appearance.icon = DEFAULT_UNDERLAY_ICON + underlay_appearance.icon_state = DEFAULT_UNDERLAY_ICON_STATE + underlays = U - // Drop posters which were previously placed on this wall. - for(var/obj/structure/sign/poster/P in src) - P.roll_and_drop(src) + // Drop posters which were previously placed on this wall. + for(var/obj/structure/sign/poster/wall_poster in src) + wall_poster.roll_and_drop(src) -/proc/cardinal_smooth(atom/A, adjacencies) +/atom/proc/corners_cardinal_smooth(adjacencies) //NW CORNER var/nw = "1-i" if((adjacencies & N_NORTH) && (adjacencies & N_WEST)) @@ -233,64 +227,67 @@ else if(adjacencies & N_EAST) se = "4-e" - var/list/New + var/list/new_overlays - if(A.top_left_corner != nw) - A.cut_overlay(A.top_left_corner) - A.top_left_corner = nw - LAZYADD(New, nw) + if(top_left_corner != nw) + cut_overlay(top_left_corner) + top_left_corner = nw + LAZYADD(new_overlays, nw) - if(A.top_right_corner != ne) - A.cut_overlay(A.top_right_corner) - A.top_right_corner = ne - LAZYADD(New, ne) + if(top_right_corner != ne) + cut_overlay(top_right_corner) + top_right_corner = ne + LAZYADD(new_overlays, ne) - if(A.bottom_right_corner != sw) - A.cut_overlay(A.bottom_right_corner) - A.bottom_right_corner = sw - LAZYADD(New, sw) + if(bottom_right_corner != sw) + cut_overlay(bottom_right_corner) + bottom_right_corner = sw + LAZYADD(new_overlays, sw) - if(A.bottom_left_corner != se) - A.cut_overlay(A.bottom_left_corner) - A.bottom_left_corner = se - LAZYADD(New, se) + if(bottom_left_corner != se) + cut_overlay(bottom_left_corner) + bottom_left_corner = se + LAZYADD(new_overlays, se) - if(New) - A.add_overlay(New) + if(new_overlays) + add_overlay(new_overlays) -/proc/find_type_in_direction(atom/source, direction) - var/turf/target_turf = get_step(source, direction) + +///Scans direction to find targets to smooth with. +/atom/proc/find_type_in_direction(direction) + var/turf/target_turf = get_step(src, direction) if(!target_turf) return NULLTURF_BORDER var/area/target_area = get_area(target_turf) - var/area/source_area = get_area(source) + var/area/source_area = get_area(src) if((source_area.area_limited_icon_smoothing || target_area.area_limited_icon_smoothing) && !istype(source_area, target_area.type) && !istype(target_area, source_area.type)) - return null + return NO_ADJ_FOUND - if(source.canSmoothWith) - var/atom/A - if(source.smoothing_flags & SMOOTH_MORE) - for(var/a_type in source.canSmoothWith) - if( istype(target_turf, a_type) ) - return target_turf - A = locate(a_type) in target_turf - if(A) - return A - return null + if(isnull(canSmoothWith)) //special case in which it will only smooth with itself + if(isturf(src)) + return (type == target_turf.type) ? ADJ_FOUND : NO_ADJ_FOUND + var/atom/matching_obj = locate(type) in target_turf + return (matching_obj && matching_obj.type == type) ? ADJ_FOUND : NO_ADJ_FOUND + + if(!isnull(target_turf.smoothing_groups)) + for(var/target in canSmoothWith) + if(!(canSmoothWith[target] & target_turf.smoothing_groups[target])) + continue + return ADJ_FOUND + + if(smoothing_flags & SMOOTH_OBJ) + for(var/am in target_turf) + var/atom/movable/thing = am + if(!thing.anchored || isnull(thing.smoothing_groups)) + continue + for(var/target in canSmoothWith) + if(!(canSmoothWith[target] & thing.smoothing_groups[target])) + continue + return ADJ_FOUND + + return NO_ADJ_FOUND - for(var/a_type in source.canSmoothWith) - if(a_type == target_turf.type) - return target_turf - A = locate(a_type) in target_turf - if(A && A.type == a_type) - return A - return null - else - if(isturf(source)) - return source.type == target_turf.type ? target_turf : null - var/atom/A = locate(source.type) in target_turf - return A && A.type == source.type ? A : null //Icon smoothing helpers /proc/smooth_zlevel(zlevel, now = FALSE) @@ -299,17 +296,18 @@ var/turf/T = V if(T.smoothing_flags) if(now) - smooth_icon(T) + T.smooth_icon() else QUEUE_SMOOTH(T) for(var/R in T) var/atom/A = R if(A.smoothing_flags) if(now) - smooth_icon(A) + A.smooth_icon() else QUEUE_SMOOTH(A) + /atom/proc/clear_smooth_overlays() cut_overlay(top_left_corner) top_left_corner = null @@ -320,6 +318,7 @@ cut_overlay(bottom_left_corner) bottom_left_corner = null + /atom/proc/replace_smooth_overlays(nw, ne, sw, se) clear_smooth_overlays() var/list/O = list() @@ -333,6 +332,7 @@ O += se add_overlay(O) + /proc/reverse_ndir(ndir) switch(ndir) if(N_NORTH) @@ -368,7 +368,7 @@ if(N_SOUTH|N_EAST|N_SOUTHEAST) return SOUTHEAST else - return 0 + return NONE //Example smooth wall @@ -376,5 +376,22 @@ name = "smooth wall" icon = 'icons/turf/smooth_wall.dmi' icon_state = "smooth" - smoothing_flags = SMOOTH_TRUE|SMOOTH_DIAGONAL|SMOOTH_BORDER + smoothing_flags = SMOOTH_CORNERS|SMOOTH_DIAGONAL|SMOOTH_BORDER + smoothing_groups = null canSmoothWith = null + +#undef N_NORTH +#undef N_SOUTH +#undef N_EAST +#undef N_WEST +#undef N_NORTHEAST +#undef N_NORTHWEST +#undef N_SOUTHEAST +#undef N_SOUTHWEST + +#undef NO_ADJ_FOUND +#undef ADJ_FOUND +#undef NULLTURF_BORDER + +#undef DEFAULT_UNDERLAY_ICON +#undef DEFAULT_UNDERLAY_ICON_STATE diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 676da9db96d..b60fe5dfe3b 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -176,8 +176,7 @@ GLOBAL_LIST_INIT(bitfields, list( "ZAP_MACHINE_EXPLOSIVE" = ZAP_MACHINE_EXPLOSIVE, ), "smooth" = list( - "SMOOTH_TRUE" = SMOOTH_TRUE, - "SMOOTH_MORE" = SMOOTH_MORE, + "SMOOTH_CORNERS" = SMOOTH_CORNERS, "SMOOTH_DIAGONAL" = SMOOTH_DIAGONAL, "SMOOTH_BORDER" = SMOOTH_BORDER, "SMOOTH_QUEUED" = SMOOTH_QUEUED, diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index 213301039d2..2979a2645e5 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -18,7 +18,7 @@ SUBSYSTEM_DEF(icon_smooth) if(QDELETED(smoothing_atom) || !(smoothing_atom.smoothing_flags & SMOOTH_QUEUED)) continue if(smoothing_atom.flags_1 & INITIALIZED_1) - smooth_icon(smoothing_atom) + smoothing_atom.smooth_icon() else deferred += smoothing_atom if (MC_TICK_CHECK) @@ -32,8 +32,8 @@ SUBSYSTEM_DEF(icon_smooth) can_fire = FALSE /datum/controller/subsystem/icon_smooth/Initialize() - smooth_zlevel(1,TRUE) - smooth_zlevel(2,TRUE) + smooth_zlevel(1, TRUE) + smooth_zlevel(2, TRUE) var/list/queue = smooth_queue smooth_queue = list() @@ -43,7 +43,7 @@ SUBSYSTEM_DEF(icon_smooth) queue.len-- if(QDELETED(smoothing_atom) || !(smoothing_atom.smoothing_flags & SMOOTH_QUEUED) || smoothing_atom.z <= 2) continue - smooth_icon(smoothing_atom) + smoothing_atom.smooth_icon() CHECK_TICK queue = blueprint_queue diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 102da993cfb..f846a28da22 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -122,7 +122,9 @@ var/bottom_left_corner ///Smoothing variable var/bottom_right_corner - ///Type path list this atom can smooth with. If this is null and atom is smooth, it smooths only with itself. + ///What smoothing groups does this atom belongs to, to match canSmoothWith. If null, nobody can smooth with it. + var/list/smoothing_groups = null + ///List of smoothing groups this atom can smooth with. If this is null and atom is smooth, it smooths only with itself. var/list/canSmoothWith = null @@ -206,8 +208,14 @@ var/turf/T = loc T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guaranteed to be on afterwards anyways. - if (canSmoothWith) - canSmoothWith = typelist("canSmoothWith", canSmoothWith) + if (length(smoothing_groups)) + sortTim(smoothing_groups) //In case it's not properly ordered, let's avoid duplicate entries with the same values. + SET_BITFLAG_LIST(smoothing_groups) + if (length(canSmoothWith)) + sortTim(canSmoothWith) + if(canSmoothWith[length(canSmoothWith)] > MAX_S_TURF) //If the last element is higher than the maximum turf-only value, then it must scan turf contents for smoothing targets. + smoothing_flags |= SMOOTH_OBJ + SET_BITFLAG_LIST(canSmoothWith) // apply materials properly from the default custom_materials value set_custom_materials(custom_materials) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 201732a6a27..62daed119ab 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -107,8 +107,9 @@ pass_flags = LETPASSTHROW bar_material = SAND climbable = TRUE - smoothing_flags = SMOOTH_TRUE - canSmoothWith = list(/obj/structure/barricade/sandbags, /turf/closed/wall, /turf/closed/wall/r_wall, /obj/structure/falsewall, /obj/structure/falsewall/reinforced, /turf/closed/wall/rust, /turf/closed/wall/r_wall/rust, /obj/structure/barricade/security) + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_SANDBAGS) + canSmoothWith = list(SMOOTH_GROUP_SANDBAGS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SECURITY_BARRICADE) /obj/structure/barricade/security diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index b6d2a3e2c16..f504e84acf2 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -53,8 +53,9 @@ name = "dirt" desc = "Someone should clean that up." icon_state = "dirt" - canSmoothWith = list(/obj/effect/decal/cleanable/dirt, /turf/closed/wall, /obj/structure/falsewall) smoothing_flags = NONE + smoothing_groups = list(SMOOTH_GROUP_CLEANABLE_DIRT) + canSmoothWith = list(SMOOTH_GROUP_CLEANABLE_DIRT, SMOOTH_GROUP_WALLS) mouse_opacity = MOUSE_OPACITY_TRANSPARENT beauty = -75 @@ -62,7 +63,7 @@ . = ..() var/turf/T = get_turf(src) if(T.tiled_dirt) - smoothing_flags = SMOOTH_MORE + smoothing_flags = SMOOTH_CORNERS icon = 'icons/effects/dirt.dmi' icon_state = "" QUEUE_SMOOTH(src) diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index aaec915bef8..bdde39827a1 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -57,9 +57,10 @@ density = TRUE opacity = 1 anchored = TRUE - canSmoothWith = list(/obj/structure/alien/resin) + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN) + canSmoothWith = list(SMOOTH_GROUP_ALIEN_RESIN) max_integrity = 200 - smoothing_flags = SMOOTH_TRUE var/resintype = null CanAtmosPass = ATMOS_PASS_DENSITY @@ -79,7 +80,8 @@ icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi' icon_state = "smooth" //same as resin, but consistency ho! resintype = "wall" - canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane) + smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN, SMOOTH_GROUP_ALIEN_WALLS) + canSmoothWith = list(SMOOTH_GROUP_ALIEN_WALLS) /obj/structure/alien/resin/wall/BlockSuperconductivity() return 1 @@ -92,7 +94,8 @@ opacity = 0 max_integrity = 160 resintype = "membrane" - canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane) + smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN, SMOOTH_GROUP_ALIEN_WALLS) + canSmoothWith = list(SMOOTH_GROUP_ALIEN_WALLS) /obj/structure/alien/resin/attack_paw(mob/user) return attack_hand(user) @@ -113,8 +116,9 @@ plane = FLOOR_PLANE icon_state = "weeds" max_integrity = 15 - canSmoothWith = list(/obj/structure/alien/weeds, /turf/closed/wall) - smoothing_flags = SMOOTH_MORE + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN, SMOOTH_GROUP_ALIEN_WEEDS) + canSmoothWith = list(SMOOTH_GROUP_ALIEN_WEEDS, SMOOTH_GROUP_WALLS) var/last_expand = 0 //last world.time this weed expanded var/growth_cooldown_low = 150 var/growth_cooldown_high = 200 diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 5f2d79e3b82..5389ab9de00 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -6,8 +6,8 @@ icon = 'icons/obj/smooth_structures/alien/nest.dmi' icon_state = "nest" max_integrity = 120 - smoothing_flags = SMOOTH_TRUE can_be_unanchored = FALSE + smoothing_flags = SMOOTH_CORNERS canSmoothWith = null buildstacktype = null flags_1 = NODECONSTRUCT_1 diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 70a088a8e1b..4228523ce95 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -11,15 +11,9 @@ density = TRUE opacity = 1 max_integrity = 100 - - canSmoothWith = list( - /turf/closed/wall, - /turf/closed/wall/r_wall, - /obj/structure/falsewall, - /obj/structure/falsewall/reinforced, - /turf/closed/wall/rust, - /turf/closed/wall/r_wall/rust) - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS) + canSmoothWith = list(SMOOTH_GROUP_WALLS) can_be_unanchored = FALSE CanAtmosPass = ATMOS_PASS_DENSITY flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1 @@ -70,7 +64,7 @@ else if(density) icon_state = initial(icon_state) - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS QUEUE_SMOOTH(src) else icon_state = "fwall_open" @@ -163,9 +157,10 @@ icon_state = "uranium" mineral = /obj/item/stack/sheet/mineral/uranium walltype = /turf/closed/wall/mineral/uranium + smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_URANIUM_WALLS) + canSmoothWith = list(SMOOTH_GROUP_URANIUM_WALLS) var/active = null var/last_event = 0 - canSmoothWith = list(/obj/structure/falsewall/uranium, /turf/closed/wall/mineral/uranium) /obj/structure/falsewall/uranium/attackby(obj/item/W, mob/user, params) radiate() @@ -197,7 +192,8 @@ icon_state = "gold" mineral = /obj/item/stack/sheet/mineral/gold walltype = /turf/closed/wall/mineral/gold - canSmoothWith = list(/obj/structure/falsewall/gold, /turf/closed/wall/mineral/gold) + smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_GOLD_WALLS) + canSmoothWith = list(SMOOTH_GROUP_GOLD_WALLS) /obj/structure/falsewall/silver name = "silver wall" @@ -206,7 +202,8 @@ icon_state = "silver" mineral = /obj/item/stack/sheet/mineral/silver walltype = /turf/closed/wall/mineral/silver - canSmoothWith = list(/obj/structure/falsewall/silver, /turf/closed/wall/mineral/silver) + smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SILVER_WALLS) + canSmoothWith = list(SMOOTH_GROUP_SILVER_WALLS) /obj/structure/falsewall/diamond name = "diamond wall" @@ -215,7 +212,8 @@ icon_state = "diamond" mineral = /obj/item/stack/sheet/mineral/diamond walltype = /turf/closed/wall/mineral/diamond - canSmoothWith = list(/obj/structure/falsewall/diamond, /turf/closed/wall/mineral/diamond) + smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_DIAMOND_WALLS) + canSmoothWith = list(SMOOTH_GROUP_DIAMOND_WALLS) max_integrity = 800 /obj/structure/falsewall/plasma @@ -225,7 +223,8 @@ icon_state = "plasma" mineral = /obj/item/stack/sheet/mineral/plasma walltype = /turf/closed/wall/mineral/plasma - canSmoothWith = list(/obj/structure/falsewall/plasma, /turf/closed/wall/mineral/plasma) + smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASMA_WALLS) + canSmoothWith = list(SMOOTH_GROUP_PLASMA_WALLS) /obj/structure/falsewall/plasma/attackby(obj/item/W, mob/user, params) if(W.get_temperature() > 300) @@ -253,7 +252,8 @@ icon_state = "bananium" mineral = /obj/item/stack/sheet/mineral/bananium walltype = /turf/closed/wall/mineral/bananium - canSmoothWith = list(/obj/structure/falsewall/bananium, /turf/closed/wall/mineral/bananium) + smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_BANANIUM_WALLS) + canSmoothWith = list(SMOOTH_GROUP_BANANIUM_WALLS) /obj/structure/falsewall/sandstone @@ -263,7 +263,8 @@ icon_state = "sandstone" mineral = /obj/item/stack/sheet/mineral/sandstone walltype = /turf/closed/wall/mineral/sandstone - canSmoothWith = list(/obj/structure/falsewall/sandstone, /turf/closed/wall/mineral/sandstone) + smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SANDSTONE_WALLS) + canSmoothWith = list(SMOOTH_GROUP_SANDSTONE_WALLS) /obj/structure/falsewall/wood name = "wooden wall" @@ -272,7 +273,8 @@ icon_state = "wood" mineral = /obj/item/stack/sheet/mineral/wood walltype = /turf/closed/wall/mineral/wood - canSmoothWith = list(/obj/structure/falsewall/wood, /turf/closed/wall/mineral/wood) + smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WOOD_WALLS) + canSmoothWith = list(SMOOTH_GROUP_WOOD_WALLS) /obj/structure/falsewall/iron name = "rough metal wall" @@ -282,7 +284,8 @@ mineral = /obj/item/stack/rods mineral_amount = 5 walltype = /turf/closed/wall/mineral/iron - canSmoothWith = list(/obj/structure/falsewall/iron, /turf/closed/wall/mineral/iron) + smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_IRON_WALLS) + canSmoothWith = list(SMOOTH_GROUP_IRON_WALLS) /obj/structure/falsewall/abductor name = "alien wall" @@ -291,7 +294,8 @@ icon_state = "abductor" mineral = /obj/item/stack/sheet/mineral/abductor walltype = /turf/closed/wall/mineral/abductor - canSmoothWith = list(/obj/structure/falsewall/abductor, /turf/closed/wall/mineral/abductor) + smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_ABDUCTOR_WALLS) + canSmoothWith = list(SMOOTH_GROUP_ABDUCTOR_WALLS) /obj/structure/falsewall/titanium name = "wall" @@ -300,8 +304,9 @@ icon_state = "shuttle" mineral = /obj/item/stack/sheet/mineral/titanium walltype = /turf/closed/wall/mineral/titanium - smoothing_flags = SMOOTH_MORE - canSmoothWith = list(/turf/closed/wall/mineral/titanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater) + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_TITANIUM_WALLS) + canSmoothWith = list(SMOOTH_GROUP_TITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS) /obj/structure/falsewall/plastitanium name = "wall" @@ -310,5 +315,6 @@ icon_state = "shuttle" mineral = /obj/item/stack/sheet/mineral/plastitanium walltype = /turf/closed/wall/mineral/plastitanium - smoothing_flags = SMOOTH_MORE - canSmoothWith = list(/turf/closed/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater) + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASTITANIUM_WALLS) + canSmoothWith = list(SMOOTH_GROUP_PLASTITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS) diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index f8082610ab2..11975c9b574 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -253,8 +253,9 @@ desc = "A large bushy hedge." icon = 'icons/obj/smooth_structures/hedge.dmi' icon_state = "hedge" - smoothing_flags = SMOOTH_TRUE - canSmoothWith = list(/obj/structure/fluff/hedge, /obj/structure/fluff/hedge/opaque) + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_HEDGE_FLUFF) + canSmoothWith = list(SMOOTH_GROUP_HEDGE_FLUFF) density = TRUE anchored = TRUE deconstructible = FALSE diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 8962f72dea7..5b8bde5001d 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -9,15 +9,13 @@ max_integrity = 50 layer = LATTICE_LAYER //under pipes plane = FLOOR_PLANE + obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_LATTICE) + canSmoothWith = list(SMOOTH_GROUP_LATTICE, SMOOTH_GROUP_OPEN_FLOOR, SMOOTH_GROUP_WALLS) var/number_of_mats = 1 var/build_material = /obj/item/stack/rods - canSmoothWith = list(/obj/structure/lattice, - /turf/open/floor, - /turf/closed/wall, - /obj/structure/falsewall) - smoothing_flags = SMOOTH_MORE - // flags = CONDUCT_1 - obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN + /obj/structure/lattice/examine(mob/user) . = ..() @@ -76,7 +74,8 @@ icon = 'icons/obj/smooth_structures/catwalk.dmi' icon_state = "catwalk" number_of_mats = 2 - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = null canSmoothWith = null obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP @@ -102,7 +101,8 @@ icon_state = "catwalk" number_of_mats = 1 color = "#5286b9ff" - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = null canSmoothWith = null obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP resistance_flags = FIRE_PROOF | LAVA_PROOF diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 081d31aaff1..93d6a851a15 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -32,8 +32,9 @@ custom_materials = list(/datum/material/iron = 2000) max_integrity = 100 integrity_failure = 0.33 - smoothing_flags = SMOOTH_TRUE - canSmoothWith = list(/obj/structure/table, /obj/structure/table/reinforced, /obj/structure/table/greyscale) + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_TABLES) + canSmoothWith = list(SMOOTH_GROUP_TABLES) /obj/structure/table/examine(mob/user) . = ..() @@ -266,7 +267,8 @@ desc = "An NT brand \"Rolly poly\" rolling table. It can and will move." anchored = FALSE smoothing_flags = NONE - canSmoothWith = list() + smoothing_groups = null + canSmoothWith = null icon = 'icons/obj/smooth_structures/rollingtable.dmi' icon_state = "rollingtable" var/list/attached_items = list() @@ -300,6 +302,7 @@ icon = 'icons/obj/smooth_structures/glass_table.dmi' icon_state = "glass_table" buildstack = /obj/item/stack/sheet/glass + smoothing_groups = null canSmoothWith = null max_integrity = 70 resistance_flags = ACID_PROOF @@ -382,9 +385,8 @@ buildstack = /obj/item/stack/sheet/mineral/wood resistance_flags = FLAMMABLE max_integrity = 70 - canSmoothWith = list(/obj/structure/table/wood, - /obj/structure/table/wood/poker, - /obj/structure/table/wood/bar) + smoothing_groups = list(SMOOTH_GROUP_WOOD_TABLES) //Don't smooth with SMOOTH_GROUP_TABLES + canSmoothWith = list(SMOOTH_GROUP_WOOD_TABLES) /obj/structure/table/wood/narsie_act(total_override = TRUE) if(!total_override) @@ -408,16 +410,8 @@ frame = /obj/structure/table_frame framestack = /obj/item/stack/rods buildstack = /obj/item/stack/tile/carpet - canSmoothWith = list(/obj/structure/table/wood/fancy, - /obj/structure/table/wood/fancy/black, - /obj/structure/table/wood/fancy/blue, - /obj/structure/table/wood/fancy/cyan, - /obj/structure/table/wood/fancy/green, - /obj/structure/table/wood/fancy/orange, - /obj/structure/table/wood/fancy/purple, - /obj/structure/table/wood/fancy/red, - /obj/structure/table/wood/fancy/royalblack, - /obj/structure/table/wood/fancy/royalblue) + smoothing_groups = list(SMOOTH_GROUP_FANCY_WOOD_TABLES) //Don't smooth with SMOOTH_GROUP_TABLES or SMOOTH_GROUP_WOOD_TABLES + canSmoothWith = list(SMOOTH_GROUP_FANCY_WOOD_TABLES) var/smooth_icon = 'icons/obj/smooth_structures/fancy_table.dmi' // see Initialize() /obj/structure/table/wood/fancy/Initialize() @@ -483,7 +477,6 @@ icon_state = "r_table" deconstruction_ready = 0 buildstack = /obj/item/stack/sheet/plasteel - canSmoothWith = list(/obj/structure/table/reinforced, /obj/structure/table, /obj/structure/table/reinforced/ctf) max_integrity = 200 integrity_failure = 0.25 armor = list("melee" = 10, "bullet" = 30, "laser" = 30, "energy" = 100, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) @@ -519,7 +512,8 @@ icon_state = "brass_table" resistance_flags = FIRE_PROOF | ACID_PROOF buildstack = /obj/item/stack/tile/bronze - canSmoothWith = list(/obj/structure/table/bronze) + smoothing_groups = list(SMOOTH_GROUP_BRONZE_TABLES) //Don't smooth with SMOOTH_GROUP_TABLES + canSmoothWith = list(SMOOTH_GROUP_BRONZE_TABLES) /obj/structure/table/bronze/tablepush(mob/living/user, mob/living/pushed_mob) ..() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 9c3248dfeca..c17fa75b456 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -590,8 +590,9 @@ max_integrity = 50 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smoothing_flags = SMOOTH_TRUE - canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile) + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) + canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE) glass_amount = 2 /obj/structure/window/fulltile/unanchored @@ -604,8 +605,9 @@ max_integrity = 300 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smoothing_flags = SMOOTH_TRUE - canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile) + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) + canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE) glass_amount = 2 /obj/structure/window/plasma/fulltile/unanchored @@ -619,7 +621,9 @@ max_integrity = 1000 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) + canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE) glass_amount = 2 /obj/structure/window/plasma/reinforced/fulltile/unanchored @@ -633,9 +637,10 @@ max_integrity = 150 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smoothing_flags = SMOOTH_TRUE state = RWINDOW_SECURE - canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile) + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) + canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE) glass_amount = 2 /obj/structure/window/reinforced/fulltile/unanchored @@ -648,15 +653,15 @@ dir = FULLTILE_WINDOW_DIR fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smoothing_flags = SMOOTH_TRUE - canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile) + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) + canSmoothWith = list(SMOOTH_GROUP_WINDOW_FULLTILE) glass_amount = 2 /obj/structure/window/reinforced/fulltile/ice icon = 'icons/obj/smooth_structures/rice_window.dmi' icon_state = "ice_window" max_integrity = 150 - canSmoothWith = list(/obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/plasma/reinforced/fulltile) glass_amount = 2 /obj/structure/window/shuttle @@ -672,7 +677,8 @@ reinf = TRUE heat_resistance = 1600 armor = list("melee" = 90, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS) canSmoothWith = null explosion_block = 3 glass_type = /obj/item/stack/sheet/titaniumglass @@ -700,7 +706,8 @@ flags_1 = PREVENT_CLICK_UNDER_1 heat_resistance = 1600 armor = list("melee" = 95, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) canSmoothWith = null explosion_block = 3 damage_deflection = 11 //The same as normal reinforced windows.3 @@ -722,8 +729,9 @@ max_integrity = 15 fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 - smoothing_flags = SMOOTH_TRUE - canSmoothWith = list(/obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe) + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_PAPERFRAME) + canSmoothWith = list(SMOOTH_GROUP_PAPERFRAME) glass_amount = 2 glass_type = /obj/item/stack/sheet/paperframes heat_resistance = 233 @@ -808,7 +816,8 @@ /obj/structure/window/bronze/fulltile icon_state = "clockwork_window" - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) canSmoothWith = null fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index 5a5582931c9..29c95e109a6 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -50,7 +50,7 @@ icon = 'icons/turf/walls/sandstone_wall.dmi' icon_state = "sandstone" baseturfs = /turf/closed/indestructible/sandstone - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS /turf/closed/indestructible/oldshuttle/corner icon_state = "corner" @@ -79,12 +79,14 @@ /turf/closed/indestructible/riveted icon = 'icons/turf/walls/riveted.dmi' icon_state = "riveted" - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS /turf/closed/indestructible/syndicate icon = 'icons/turf/walls/plastitanium_wall.dmi' icon_state = "map-shuttle" - smoothing_flags = SMOOTH_MORE + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SYNDICATE_WALLS) + canSmoothWith = list(SMOOTH_GROUP_SYNDICATE_WALLS, SMOOTH_GROUP_PLASTITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS) /turf/closed/indestructible/riveted/uranium icon = 'icons/turf/walls/uranium_wall.dmi' @@ -99,7 +101,9 @@ /turf/closed/indestructible/wood icon = 'icons/turf/walls/wood_wall.dmi' icon_state = "wood" - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WOOD_WALLS) + canSmoothWith = list(SMOOTH_GROUP_WOOD_WALLS) /turf/closed/indestructible/abductor icon_state = "alien1" @@ -111,7 +115,7 @@ name = "window" icon_state = "fake_window" opacity = 0 - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS icon = 'icons/obj/smooth_structures/reinforced_window.dmi' /turf/closed/indestructible/fakeglass/Initialize() @@ -124,7 +128,7 @@ name = "window" icon_state = "plastitanium_window" opacity = 0 - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS icon = 'icons/obj/smooth_structures/plastitanium_window.dmi' /turf/closed/indestructible/opsglass/Initialize() @@ -161,8 +165,8 @@ /turf/closed/indestructible/rock/snow/ice/ore icon = 'icons/turf/walls/icerock_wall.dmi' icon_state = "icerock" - smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER - canSmoothWith = list (/turf/closed) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER + canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS) pixel_x = -4 pixel_y = -4 @@ -191,7 +195,8 @@ desc = "A thick, seemingly indestructible stone wall." icon = 'icons/turf/walls/boss_wall.dmi' icon_state = "wall" - canSmoothWith = list(/turf/closed/indestructible/riveted/boss, /turf/closed/indestructible/riveted/boss/see_through) + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_BOSS_WALLS) + canSmoothWith = list(SMOOTH_GROUP_BOSS_WALLS) explosion_block = 50 baseturfs = /turf/closed/indestructible/riveted/boss diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index b63d2136db2..0dbb257ff07 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -5,8 +5,9 @@ icon = 'icons/turf/mining.dmi' icon_state = "rock" var/smooth_icon = 'icons/turf/smoothrocks.dmi' - smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER - canSmoothWith = null + smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_MINERAL_WALLS) + canSmoothWith = list(SMOOTH_GROUP_MINERAL_WALLS) baseturfs = /turf/open/floor/plating/asteroid/airless initial_gas_mix = AIRLESS_ATMOS opacity = 1 @@ -22,13 +23,12 @@ var/defer_change = 0 /turf/closed/mineral/Initialize() - if (!canSmoothWith) - canSmoothWith = list(/turf/closed/mineral, /turf/closed/indestructible) + . = ..() var/matrix/M = new M.Translate(-4, -4) transform = M icon = smooth_icon - . = ..() + /turf/closed/mineral/proc/Spread_Vein() var/spreadChance = initial(mineralType.spreadChance) @@ -254,8 +254,8 @@ icon = 'icons/turf/mining.dmi' smooth_icon = 'icons/turf/walls/mountain_wall.dmi' icon_state = "mountainrock" - smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER - canSmoothWith = list (/turf/closed) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER + canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS) defer_change = TRUE environment_type = "snow_cavern" turf_type = /turf/open/floor/plating/asteroid/snow/icemoon @@ -323,8 +323,8 @@ icon = 'icons/turf/mining.dmi' smooth_icon = 'icons/turf/walls/mountain_wall.dmi' icon_state = "mountainrock" - smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER - canSmoothWith = list (/turf/closed) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER + canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS) defer_change = TRUE environment_type = "snow" turf_type = /turf/open/floor/plating/asteroid/snow/icemoon @@ -574,8 +574,8 @@ icon = 'icons/turf/mining.dmi' smooth_icon = 'icons/turf/walls/rock_wall.dmi' icon_state = "rock2" - smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER - canSmoothWith = list (/turf/closed) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER + canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS) baseturfs = /turf/open/floor/plating/ashplanet/wateryrock initial_gas_mix = OPENTURF_LOW_PRESSURE environment_type = "waste" @@ -587,8 +587,8 @@ icon = 'icons/turf/mining.dmi' smooth_icon = 'icons/turf/walls/mountain_wall.dmi' icon_state = "mountainrock" - smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER - canSmoothWith = list (/turf/closed) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER + canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS) baseturfs = /turf/open/floor/plating/asteroid/snow initial_gas_mix = FROZEN_ATMOS environment_type = "snow" @@ -605,8 +605,7 @@ icon = 'icons/turf/mining.dmi' smooth_icon = 'icons/turf/walls/icerock_wall.dmi' icon_state = "icerock" - smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER - canSmoothWith = list (/turf/closed) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER baseturfs = /turf/open/floor/plating/asteroid/snow/ice environment_type = "snow_cavern" turf_type = /turf/open/floor/plating/asteroid/snow/ice diff --git a/code/game/turfs/closed/wall/material_walls.dm b/code/game/turfs/closed/wall/material_walls.dm index 16b835d5b20..bb98ab34cf5 100644 --- a/code/game/turfs/closed/wall/material_walls.dm +++ b/code/game/turfs/closed/wall/material_walls.dm @@ -3,8 +3,9 @@ desc = "A huge chunk of material used to separate rooms." icon = 'icons/turf/walls/materialwall.dmi' icon_state = "wall" - canSmoothWith = list(/turf/closed/wall/material) - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_MATERIAL_WALLS) + canSmoothWith = list(SMOOTH_GROUP_MATERIAL_WALLS) material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS /turf/closed/wall/material/break_wall() diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index 2bc0cdef4a0..e1eaf4cdda8 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -2,10 +2,10 @@ name = "mineral wall" desc = "This shouldn't exist" icon_state = "" + smoothing_flags = SMOOTH_CORNERS + canSmoothWith = null var/last_event = 0 var/active = null - canSmoothWith = null - smoothing_flags = SMOOTH_TRUE /turf/closed/wall/mineral/gold name = "gold wall" @@ -14,7 +14,8 @@ icon_state = "gold" sheet_type = /obj/item/stack/sheet/mineral/gold explosion_block = 0 //gold is a soft metal you dingus. - canSmoothWith = list(/turf/closed/wall/mineral/gold, /obj/structure/falsewall/gold) + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_GOLD_WALLS) + canSmoothWith = list(SMOOTH_GROUP_GOLD_WALLS) /turf/closed/wall/mineral/silver name = "silver wall" @@ -22,7 +23,8 @@ icon = 'icons/turf/walls/silver_wall.dmi' icon_state = "silver" sheet_type = /obj/item/stack/sheet/mineral/silver - canSmoothWith = list(/turf/closed/wall/mineral/silver, /obj/structure/falsewall/silver) + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SILVER_WALLS) + canSmoothWith = list(SMOOTH_GROUP_SILVER_WALLS) /turf/closed/wall/mineral/diamond name = "diamond wall" @@ -32,7 +34,8 @@ sheet_type = /obj/item/stack/sheet/mineral/diamond slicing_duration = 200 //diamond wall takes twice as much time to slice explosion_block = 3 - canSmoothWith = list(/turf/closed/wall/mineral/diamond, /obj/structure/falsewall/diamond) + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_DIAMOND_WALLS) + canSmoothWith = list(SMOOTH_GROUP_DIAMOND_WALLS) /turf/closed/wall/mineral/diamond/hulk_recoil(obj/item/bodypart/arm, mob/living/carbon/human/hulkman, damage = 41) return ..() @@ -43,7 +46,8 @@ icon = 'icons/turf/walls/bananium_wall.dmi' icon_state = "bananium" sheet_type = /obj/item/stack/sheet/mineral/bananium - canSmoothWith = list(/turf/closed/wall/mineral/bananium, /obj/structure/falsewall/bananium) + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_BANANIUM_WALLS) + canSmoothWith = list(SMOOTH_GROUP_BANANIUM_WALLS) /turf/closed/wall/mineral/sandstone name = "sandstone wall" @@ -52,7 +56,8 @@ icon_state = "sandstone" sheet_type = /obj/item/stack/sheet/mineral/sandstone explosion_block = 0 - canSmoothWith = list(/turf/closed/wall/mineral/sandstone, /obj/structure/falsewall/sandstone) + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SANDSTONE_WALLS) + canSmoothWith = list(SMOOTH_GROUP_SANDSTONE_WALLS) /turf/closed/wall/mineral/uranium article = "a" @@ -61,7 +66,8 @@ icon = 'icons/turf/walls/uranium_wall.dmi' icon_state = "uranium" sheet_type = /obj/item/stack/sheet/mineral/uranium - canSmoothWith = list(/turf/closed/wall/mineral/uranium, /obj/structure/falsewall/uranium) + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_URANIUM_WALLS) + canSmoothWith = list(SMOOTH_GROUP_URANIUM_WALLS) /turf/closed/wall/mineral/uranium/proc/radiate() if(!active) @@ -97,7 +103,8 @@ icon_state = "plasma" sheet_type = /obj/item/stack/sheet/mineral/plasma thermal_conductivity = 0.04 - canSmoothWith = list(/turf/closed/wall/mineral/plasma, /obj/structure/falsewall/plasma) + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASMA_WALLS) + canSmoothWith = list(SMOOTH_GROUP_PLASMA_WALLS) /turf/closed/wall/mineral/plasma/attackby(obj/item/W, mob/user, params) if(W.get_temperature() > 300)//If the temperature of the object is over 300, then ignite @@ -136,7 +143,8 @@ sheet_type = /obj/item/stack/sheet/mineral/wood hardness = 70 explosion_block = 0 - canSmoothWith = list(/turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood, /turf/closed/wall/mineral/wood/nonmetal) + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WOOD_WALLS) + canSmoothWith = list(SMOOTH_GROUP_WOOD_WALLS) /turf/closed/wall/mineral/wood/attackby(obj/item/W, mob/user) if(W.get_sharpness() && W.force) @@ -155,7 +163,6 @@ desc = "A solidly wooden wall. It's a bit weaker than a wall made with metal." girder_type = /obj/structure/barricade/wooden hardness = 50 - canSmoothWith = list(/turf/closed/wall/mineral/wood, /obj/structure/falsewall/wood, /turf/closed/wall/mineral/wood/nonmetal) /turf/closed/wall/mineral/iron name = "rough metal wall" @@ -163,7 +170,8 @@ icon = 'icons/turf/walls/iron_wall.dmi' icon_state = "iron" sheet_type = /obj/item/stack/rods - canSmoothWith = list(/turf/closed/wall/mineral/iron, /obj/structure/falsewall/iron) + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_IRON_WALLS) + canSmoothWith = list(SMOOTH_GROUP_IRON_WALLS) /turf/closed/wall/mineral/snow name = "packed snow wall" @@ -187,11 +195,12 @@ desc = "A wall with alien alloy plating." icon = 'icons/turf/walls/abductor_wall.dmi' icon_state = "abductor" - smoothing_flags = SMOOTH_TRUE|SMOOTH_DIAGONAL sheet_type = /obj/item/stack/sheet/mineral/abductor slicing_duration = 200 //alien wall takes twice as much time to slice explosion_block = 3 - canSmoothWith = list(/turf/closed/wall/mineral/abductor, /obj/structure/falsewall/abductor) + smoothing_flags = SMOOTH_CORNERS|SMOOTH_DIAGONAL + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_ABDUCTOR_WALLS) + canSmoothWith = list(SMOOTH_GROUP_ABDUCTOR_WALLS) /////////////////////Titanium walls///////////////////// @@ -204,14 +213,15 @@ flags_1 = CAN_BE_DIRTY_1 flags_ricochet = RICOCHET_SHINY | RICOCHET_HARD sheet_type = /obj/item/stack/sheet/mineral/titanium - smoothing_flags = SMOOTH_MORE|SMOOTH_DIAGONAL - canSmoothWith = list(/turf/closed/wall/mineral/titanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater, /obj/structure/falsewall/titanium) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_DIAGONAL + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_TITANIUM_WALLS) + canSmoothWith = list(SMOOTH_GROUP_TITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS) /turf/closed/wall/mineral/titanium/rust_heretic_act() return // titanium does not rust /turf/closed/wall/mineral/titanium/nodiagonal - smoothing_flags = SMOOTH_MORE + smoothing_flags = SMOOTH_CORNERS icon_state = "map-shuttle_nd" /turf/closed/wall/mineral/titanium/nosmooth @@ -251,14 +261,15 @@ desc = "An easily-compressable wall used for temporary shelter." icon = 'icons/turf/walls/survival_pod_walls.dmi' icon_state = "smooth" - smoothing_flags = SMOOTH_MORE|SMOOTH_DIAGONAL - canSmoothWith = list(/turf/closed/wall/mineral/titanium/survival, /obj/machinery/door/airlock, /obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/shuttle, /obj/structure/shuttle/engine) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_DIAGONAL + canSmoothWith = list(SMOOTH_GROUP_TITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_SHUTTLE_PARTS) /turf/closed/wall/mineral/titanium/survival/nodiagonal - smoothing_flags = SMOOTH_MORE + smoothing_flags = SMOOTH_CORNERS /turf/closed/wall/mineral/titanium/survival/pod - canSmoothWith = list(/turf/closed/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod) + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_TITANIUM_WALLS, SMOOTH_GROUP_SURVIVAL_TIANIUM_POD) + canSmoothWith = list(SMOOTH_GROUP_SURVIVAL_TIANIUM_POD) /////////////////////Plastitanium walls///////////////////// @@ -269,14 +280,15 @@ icon_state = "map-shuttle" explosion_block = 4 sheet_type = /obj/item/stack/sheet/mineral/plastitanium - smoothing_flags = SMOOTH_MORE|SMOOTH_DIAGONAL - canSmoothWith = list(/turf/closed/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plasma/reinforced/plastitanium, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_DIAGONAL + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_PLASTITANIUM_WALLS) + canSmoothWith = list(SMOOTH_GROUP_PLASTITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS) /turf/closed/wall/mineral/plastitanium/rust_heretic_act() return // plastitanium does not rust /turf/closed/wall/mineral/plastitanium/nodiagonal - smoothing_flags = SMOOTH_MORE + smoothing_flags = SMOOTH_CORNERS icon_state = "map-shuttle_nd" /turf/closed/wall/mineral/plastitanium/nosmooth diff --git a/code/game/turfs/closed/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm index af95e6c0a5f..22f8b8df858 100644 --- a/code/game/turfs/closed/wall/misc_walls.dm +++ b/code/game/turfs/closed/wall/misc_walls.dm @@ -3,8 +3,8 @@ desc = "A cold metal wall engraved with indecipherable symbols. Studying them causes your head to pound." icon = 'icons/turf/walls/cult_wall.dmi' icon_state = "cult" + smoothing_flags = SMOOTH_CORNERS canSmoothWith = null - smoothing_flags = SMOOTH_MORE sheet_type = /obj/item/stack/sheet/runed_metal sheet_amount = 1 girder_type = /obj/structure/girder/cult diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm index 2cc0dfdf421..8025493578d 100644 --- a/code/game/turfs/closed/wall/reinf_walls.dm +++ b/code/game/turfs/closed/wall/reinf_walls.dm @@ -199,7 +199,7 @@ smoothing_flags = NONE clear_smooth_overlays() else - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS QUEUE_SMOOTH_NEIGHBORS(src) QUEUE_SMOOTH(src) @@ -237,14 +237,15 @@ icon_state = "map-shuttle" explosion_block = 20 sheet_type = /obj/item/stack/sheet/mineral/plastitanium - smoothing_flags = SMOOTH_MORE|SMOOTH_DIAGONAL - canSmoothWith = list(/turf/closed/wall/r_wall/syndicate, /turf/closed/wall/mineral/plastitanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/plasma/reinforced/plastitanium, /obj/structure/shuttle/engine, /obj/structure/falsewall/plastitanium) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_DIAGONAL + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SYNDICATE_WALLS) + canSmoothWith = list(SMOOTH_GROUP_SYNDICATE_WALLS, SMOOTH_GROUP_PLASTITANIUM_WALLS, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS) /turf/closed/wall/r_wall/syndicate/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) return FALSE /turf/closed/wall/r_wall/syndicate/nodiagonal - smoothing_flags = SMOOTH_MORE + smoothing_flags = SMOOTH_CORNERS icon_state = "map-shuttle_nd" /turf/closed/wall/r_wall/syndicate/nosmooth diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index 1be5c53609a..34697e750b4 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -14,6 +14,10 @@ flags_ricochet = RICOCHET_HARD + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS) + canSmoothWith = list(SMOOTH_GROUP_WALLS) + ///lower numbers are harder. Used to determine the probability of a hulk smashing through. var/hardness = 40 var/slicing_duration = 100 //default time taken to slice the wall @@ -21,15 +25,6 @@ var/sheet_amount = 2 var/girder_type = /obj/structure/girder - canSmoothWith = list( - /turf/closed/wall, - /turf/closed/wall/r_wall, - /obj/structure/falsewall, - /obj/structure/falsewall/reinforced, - /turf/closed/wall/rust, - /turf/closed/wall/r_wall/rust) - smoothing_flags = SMOOTH_TRUE - var/list/dent_decals /turf/closed/wall/Initialize(mapload) diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index e878fe32c1e..dd2a714c55c 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -122,7 +122,7 @@ icon = 'icons/turf/floors/hierophant_floor.dmi' initial_gas_mix = LAVALAND_DEFAULT_ATMOS baseturfs = /turf/open/indestructible/hierophant - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS tiled_dirt = FALSE /turf/open/indestructible/hierophant/two diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index a5876adbac9..7775da838b7 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -3,10 +3,11 @@ name = "chasm" desc = "Watch your step." baseturfs = /turf/open/chasm - smoothing_flags = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE icon = 'icons/turf/floors/chasms.dmi' icon_state = "smooth" - canSmoothWith = list(/turf/open/floor/fakepit, /turf/open/chasm) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_TURF_CHASM) + canSmoothWith = list(SMOOTH_GROUP_TURF_CHASM) density = TRUE //This will prevent hostile mobs from pathing into chasms, while the canpass override will still let it function like an open turf bullet_bounce_sound = null //abandon all hope ye who enter diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index 8c9bfb728cd..e38b0fd8f6f 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -176,8 +176,9 @@ icon_state = "carpet" floor_tile = /obj/item/stack/tile/carpet broken_states = list("damaged") - smoothing_flags = SMOOTH_TRUE - canSmoothWith = list(/turf/open/floor/carpet, /turf/open/floor/carpet/airless) + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET) + canSmoothWith = list(SMOOTH_GROUP_CARPET) flags_1 = NONE bullet_bounce_sound = null footstep = FOOTSTEP_CARPET @@ -208,47 +209,56 @@ /turf/open/floor/carpet/black icon = 'icons/turf/floors/carpet_black.dmi' floor_tile = /obj/item/stack/tile/carpet/black - canSmoothWith = list(/turf/open/floor/carpet/black, /turf/open/floor/carpet/airless) + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_BLACK) + canSmoothWith = list(SMOOTH_GROUP_CARPET_BLACK) /turf/open/floor/carpet/blue icon = 'icons/turf/floors/carpet_blue.dmi' floor_tile = /obj/item/stack/tile/carpet/blue - canSmoothWith = list(/turf/open/floor/carpet/blue, /turf/open/floor/carpet/blue/airless) + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_BLUE) + canSmoothWith = list(SMOOTH_GROUP_CARPET_BLUE) /turf/open/floor/carpet/cyan icon = 'icons/turf/floors/carpet_cyan.dmi' floor_tile = /obj/item/stack/tile/carpet/cyan - canSmoothWith = list(/turf/open/floor/carpet/cyan, /turf/open/floor/carpet/cyan/airless) + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_CYAN) + canSmoothWith = list(SMOOTH_GROUP_CARPET_CYAN) /turf/open/floor/carpet/green icon = 'icons/turf/floors/carpet_green.dmi' floor_tile = /obj/item/stack/tile/carpet/green - canSmoothWith = list(/turf/open/floor/carpet/green, /turf/open/floor/carpet/green/airless) + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_GREEN) + canSmoothWith = list(SMOOTH_GROUP_CARPET_GREEN) /turf/open/floor/carpet/orange icon = 'icons/turf/floors/carpet_orange.dmi' floor_tile = /obj/item/stack/tile/carpet/orange - canSmoothWith = list(/turf/open/floor/carpet/orange, /turf/open/floor/carpet/orange/airless) + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_ORANGE) + canSmoothWith = list(SMOOTH_GROUP_CARPET_ORANGE) /turf/open/floor/carpet/purple icon = 'icons/turf/floors/carpet_purple.dmi' floor_tile = /obj/item/stack/tile/carpet/purple - canSmoothWith = list(/turf/open/floor/carpet/purple, /turf/open/floor/carpet/purple/airless) + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_PURPLE) + canSmoothWith = list(SMOOTH_GROUP_CARPET_PURPLE) /turf/open/floor/carpet/red icon = 'icons/turf/floors/carpet_red.dmi' floor_tile = /obj/item/stack/tile/carpet/red - canSmoothWith = list(/turf/open/floor/carpet/red, /turf/open/floor/carpet/red/airless) + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_RED) + canSmoothWith = list(SMOOTH_GROUP_CARPET_RED) /turf/open/floor/carpet/royalblack icon = 'icons/turf/floors/carpet_royalblack.dmi' floor_tile = /obj/item/stack/tile/carpet/royalblack - canSmoothWith = list(/turf/open/floor/carpet/royalblack, /turf/open/floor/carpet/royalblack/airless) + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_ROYAL_BLACK) + canSmoothWith = list(SMOOTH_GROUP_CARPET_ROYAL_BLACK) /turf/open/floor/carpet/royalblue icon = 'icons/turf/floors/carpet_royalblue.dmi' floor_tile = /obj/item/stack/tile/carpet/royalblue - canSmoothWith = list(/turf/open/floor/carpet/royalblue, /turf/open/floor/carpet/royalblue/airless) + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_ROYAL_BLUE) + canSmoothWith = list(SMOOTH_GROUP_CARPET_ROYAL_BLUE) //*****Airless versions of all of the above.***** /turf/open/floor/carpet/airless @@ -304,8 +314,9 @@ /turf/open/floor/fakepit desc = "A clever illusion designed to look like a bottomless pit." - smoothing_flags = SMOOTH_TRUE | SMOOTH_BORDER | SMOOTH_MORE - canSmoothWith = list(/turf/open/floor/fakepit) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_TURF_CHASM) + canSmoothWith = list(SMOOTH_GROUP_TURF_CHASM) icon = 'icons/turf/floors/Chasms.dmi' icon_state = "smooth" tiled_dirt = FALSE diff --git a/code/game/turfs/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm index f394f047bcb..b4cd7b5b823 100644 --- a/code/game/turfs/open/floor/plating/misc_plating.dm +++ b/code/game/turfs/open/floor/plating/misc_plating.dm @@ -47,7 +47,7 @@ gender = PLURAL name = "ash" icon_state = "ash" - smoothing_flags = SMOOTH_MORE|SMOOTH_BORDER + smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER var/smooth_icon = 'icons/turf/floors/ash.dmi' desc = "The ground is covered in volcanic ash." baseturfs = /turf/open/floor/plating/ashplanet/wateryrock //I assume this will be a chasm eventually, once this becomes an actual surface @@ -78,7 +78,8 @@ return /turf/open/floor/plating/ashplanet/ash - canSmoothWith = list(/turf/open/floor/plating/ashplanet/ash, /turf/closed) + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_ASH) + canSmoothWith = list(SMOOTH_GROUP_FLOOR_ASH, SMOOTH_GROUP_CLOSED_TURFS) layer = HIGH_TURF_LAYER slowdown = 1 @@ -88,7 +89,8 @@ icon_state = "rockyash" smooth_icon = 'icons/turf/floors/rocky_ash.dmi' layer = MID_TURF_LAYER - canSmoothWith = list(/turf/open/floor/plating/ashplanet/rocky, /turf/closed) + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_ASH_ROCKY) + canSmoothWith = list(SMOOTH_GROUP_FLOOR_ASH_ROCKY, SMOOTH_GROUP_CLOSED_TURFS) footstep = FOOTSTEP_FLOOR barefootstep = FOOTSTEP_HARD_BAREFOOT clawfootstep = FOOTSTEP_HARD_CLAW @@ -209,8 +211,9 @@ /turf/open/floor/plating/ice/smooth icon_state = "smooth" - smoothing_flags = SMOOTH_MORE | SMOOTH_BORDER - canSmoothWith = list(/turf/open/floor/plating/ice/smooth, /turf/open/floor/plating/ice, /turf/open/floor/plating/ice/colder) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_ICE) + canSmoothWith = list(SMOOTH_GROUP_FLOOR_ICE) /turf/open/floor/plating/ice/colder temperature = 140 @@ -249,8 +252,9 @@ initial_gas_mix = ICEMOON_DEFAULT_ATMOS /turf/open/floor/plating/snowed/smoothed - smoothing_flags = SMOOTH_MORE | SMOOTH_BORDER - canSmoothWith = list(/turf/open/floor/plating/snowed/smoothed, /turf/open/floor/plating/snowed) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_SNOWED) + canSmoothWith = list(SMOOTH_GROUP_FLOOR_SNOWED) planetary_atmos = TRUE icon = 'icons/turf/floors/snow_turf.dmi' icon_state = "smooth" diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 1f0bdc206b9..68048a2e70d 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -182,8 +182,9 @@ baseturfs = /turf/open/lava/smooth icon = 'icons/turf/floors/lava.dmi' icon_state = "unsmooth" - smoothing_flags = SMOOTH_MORE | SMOOTH_BORDER - canSmoothWith = list(/turf/open/lava/smooth) + smoothing_flags = SMOOTH_CORNERS | SMOOTH_BORDER + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_LAVA) + canSmoothWith = list(SMOOTH_GROUP_FLOOR_LAVA) /turf/open/lava/smooth/lava_land_surface initial_gas_mix = LAVALAND_DEFAULT_ATMOS diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index c614c834d2f..58ec9fee55b 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -41,6 +41,15 @@ stack_trace("Warning: [src]([type]) initialized multiple times!") flags_1 |= INITIALIZED_1 + if (length(smoothing_groups)) + sortTim(smoothing_groups) //In case it's not properly ordered, let's avoid duplicate entries with the same values. + SET_BITFLAG_LIST(smoothing_groups) + if (length(canSmoothWith)) + sortTim(canSmoothWith) + if(canSmoothWith[length(canSmoothWith)] > MAX_S_TURF) //If the last element is higher than the maximum turf-only value, then it must scan turf contents for smoothing targets. + smoothing_flags |= SMOOTH_OBJ + SET_BITFLAG_LIST(canSmoothWith) + var/area/A = loc if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A)) add_overlay(/obj/effect/fullbright) diff --git a/code/game/turfs/open/transparent.dm b/code/game/turfs/open/transparent.dm index c15d5ad7bc6..d49bba40a8e 100644 --- a/code/game/turfs/open/transparent.dm +++ b/code/game/turfs/open/transparent.dm @@ -56,8 +56,9 @@ desc = "Dont jump on it, or do, I'm not your mom." icon = 'icons/turf/floors/glass.dmi' icon_state = "floor_glass" - smoothing_flags = SMOOTH_MORE - canSmoothWith = list(/turf/open/transparent/glass, /turf/open/transparent/glass/reinforced) + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_TRANSPARENT_GLASS) + canSmoothWith = list(SMOOTH_GROUP_FLOOR_TRANSPARENT_GLASS) footstep = FOOTSTEP_PLATING barefootstep = FOOTSTEP_HARD_BAREFOOT clawfootstep = FOOTSTEP_HARD_CLAW diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index b31bfd21d2d..6f8e56141b8 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -61,8 +61,18 @@ GLOBAL_LIST_EMPTY(station_turfs) assemble_baseturfs() levelupdate() - if(smoothing_flags) + + if (length(smoothing_groups)) + sortTim(smoothing_groups) //In case it's not properly ordered, let's avoid duplicate entries with the same values. + SET_BITFLAG_LIST(smoothing_groups) + if (length(canSmoothWith)) + sortTim(canSmoothWith) + if(canSmoothWith[length(canSmoothWith)] > MAX_S_TURF) //If the last element is higher than the maximum turf-only value, then it must scan turf contents for smoothing targets. + smoothing_flags |= SMOOTH_OBJ + SET_BITFLAG_LIST(canSmoothWith) + if (smoothing_flags) QUEUE_SMOOTH(src) + visibilityChanged() for(var/atom/movable/AM in src) diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 5305642e847..10fbb10a58f 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -105,7 +105,7 @@ icon = 'icons/turf/floors/carpet.dmi' icon_state = "carpet" floor_tile = /obj/item/stack/tile/carpet - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS canSmoothWith = null bullet_bounce_sound = null tiled_dirt = FALSE diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index a5d7d54fddf..c79949f9a8d 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -87,8 +87,9 @@ name = "pod window" icon = 'icons/obj/smooth_structures/pod_window.dmi' icon_state = "smooth" - smoothing_flags = SMOOTH_MORE - canSmoothWith = list(/turf/closed/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod) + smoothing_flags = SMOOTH_CORNERS + smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS, SMOOTH_GROUP_SURVIVAL_TIANIUM_POD) + canSmoothWith = list(SMOOTH_GROUP_SURVIVAL_TIANIUM_POD) /obj/structure/window/shuttle/survival_pod/spawner/north dir = NORTH diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 2d5542c6887..8e52d7bf3f0 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -519,7 +519,7 @@ Difficulty: Hard icon_state = "wall" light_range = MINIMUM_USEFUL_LIGHT_RANGE duration = 100 - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS /obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caster) . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 5709b57ef15..3c2fab846d7 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -304,7 +304,7 @@ While using this makes the system rely on OnFire, it still gives options for tim icon = 'icons/turf/walls/hierophant_wall_temp.dmi' icon_state = "wall" duration = 50 - smoothing_flags = SMOOTH_TRUE + smoothing_flags = SMOOTH_CORNERS layer = BELOW_MOB_LAYER color = rgb(255,0,0) light_range = MINIMUM_USEFUL_LIGHT_RANGE diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 773d6f064a8..405e9da2dad 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -14,11 +14,11 @@ icon = 'icons/effects/spacevines.dmi' icon_state = "flower_bud" layer = SPACEVINE_MOB_LAYER - opacity = 0 - canSmoothWith = list() + opacity = FALSE + canSmoothWith = null smoothing_flags = NONE - /// The amount of time it takes to create a venus human trap, in deciseconds - var/growth_time = 1200 + /// The amount of time it takes to create a venus human trap. + var/growth_time = 120 SECONDS /obj/structure/alien/resin/flower_bud_enemy/Initialize() . = ..() diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index a89d6f62fed..33b5182877c 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -198,7 +198,8 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) name = "hotel wall" desc = "A wall designed to protect the security of the hotel's guests." icon_state = "hotelwall" - canSmoothWith = list(/turf/closed/indestructible/hotelwall) + smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_HOTEL_WALLS) + canSmoothWith = list(SMOOTH_GROUP_HOTEL_WALLS) explosion_block = INFINITY /turf/open/indestructible/hotelwood diff --git a/tgstation.dme b/tgstation.dme index 61234f49d88..1c96fa1a047 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -53,6 +53,7 @@ #include "code\__DEFINES\footsteps.dm" #include "code\__DEFINES\forensics.dm" #include "code\__DEFINES\hud.dm" +#include "code\__DEFINES\icon_smoothing.dm" #include "code\__DEFINES\interaction_flags.dm" #include "code\__DEFINES\inventory.dm" #include "code\__DEFINES\is_helpers.dm" @@ -127,6 +128,7 @@ #include "code\__HELPERS\_string_lists.dm" #include "code\__HELPERS\areas.dm" #include "code\__HELPERS\AStar.dm" +#include "code\__HELPERS\bitflag_lists.dm" #include "code\__HELPERS\chat.dm" #include "code\__HELPERS\cmp.dm" #include "code\__HELPERS\config.dm"