From e3f8960df6134385badf3ff0b6069749efb2c729 Mon Sep 17 00:00:00 2001 From: uraniummeltdown Date: Wed, 29 Nov 2017 10:17:49 +0400 Subject: [PATCH 1/2] small icon smoothing optimization icon states for false walls --- code/__HELPERS/icon_smoothing.dm | 43 +++++++++++++-------- code/game/objects/structures/false_walls.dm | 21 +++++----- 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index d9b7091247f..40b521f051f 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -17,8 +17,8 @@ /atom/var/top_right_corner /atom/var/bottom_left_corner /atom/var/bottom_right_corner -/atom/var/can_be_unanchored = 0 /atom/var/list/canSmoothWith = null // TYPE PATHS I CAN SMOOTH WITH~~~~~ If this is null and atom is smooth, it smooths only with itself +/atom/movable/var/can_be_unanchored = 0 //generic (by snowflake) tile smoothing code; smooth your icons with this! /* @@ -36,25 +36,36 @@ var/adjacencies = 0 - if(A.can_be_unanchored) - var/atom/movable/AM = A - if(!AM.anchored) + var/atom/movable/AM + if(ismovableatom(A)) + AM = A + if(AM.can_be_unanchored && !AM.anchored) return 0 - for(var/direction in alldirs) - AM = find_type_in_direction(A, direction) - if(istype(AM)) - if(AM.anchored) - adjacencies |= 1 << direction + for(var/direction in cardinal) + AM = find_type_in_direction(A, direction) + if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) + adjacencies |= 1 << direction - else - if(AM) - adjacencies |= 1 << direction + if(adjacencies & N_NORTH) + if(adjacencies & N_WEST) + AM = find_type_in_direction(A, NORTHWEST) + if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) + adjacencies |= N_NORTHWEST + if(adjacencies & N_EAST) + AM = find_type_in_direction(A, NORTHEAST) + if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) + adjacencies |= N_NORTHEAST - else - for(var/direction in alldirs) - if(find_type_in_direction(A, direction)) - adjacencies |= 1 << direction + if(adjacencies & N_SOUTH) + if(adjacencies & N_WEST) + AM = find_type_in_direction(A, SOUTHWEST) + if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) + adjacencies |= N_SOUTHWEST + if(adjacencies & N_EAST) + AM = find_type_in_direction(A, SOUTHEAST) + if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) + adjacencies |= N_SOUTHEAST return adjacencies diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 399b23d85d4..aa661e57aa8 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -11,6 +11,7 @@ desc = "A huge chunk of metal used to seperate rooms." anchored = 1 icon = 'icons/turf/walls/wall.dmi' + icon_state = "wall" var/mineral = "metal" var/walltype = "metal" var/opening = 0 @@ -164,7 +165,7 @@ name = "uranium wall" desc = "A wall with uranium plating. This is probably a bad idea." icon = 'icons/turf/walls/uranium_wall.dmi' - icon_state = "" + icon_state = "uranium" mineral = "uranium" walltype = "uranium" var/active = null @@ -199,7 +200,7 @@ name = "gold wall" desc = "A wall with gold plating. Swag!" icon = 'icons/turf/walls/gold_wall.dmi' - icon_state = "" + icon_state = "gold" mineral = "gold" walltype = "gold" canSmoothWith = list(/obj/structure/falsewall/gold, /turf/simulated/wall/mineral/gold) @@ -208,7 +209,7 @@ name = "silver wall" desc = "A wall with silver plating. Shiny." icon = 'icons/turf/walls/silver_wall.dmi' - icon_state = "" + icon_state = "silver" mineral = "silver" walltype = "silver" canSmoothWith = list(/obj/structure/falsewall/silver, /turf/simulated/wall/mineral/silver) @@ -217,7 +218,7 @@ name = "diamond wall" desc = "A wall with diamond plating. You monster." icon = 'icons/turf/walls/diamond_wall.dmi' - icon_state = "" + icon_state = "diamond" mineral = "diamond" walltype = "diamond" canSmoothWith = list(/obj/structure/falsewall/diamond, /turf/simulated/wall/mineral/diamond) @@ -227,7 +228,7 @@ name = "plasma wall" desc = "A wall with plasma plating. This is definately a bad idea." icon = 'icons/turf/walls/plasma_wall.dmi' - icon_state = "" + icon_state = "plasma" mineral = "plasma" walltype = "plasma" canSmoothWith = list(/obj/structure/falsewall/plasma, /turf/simulated/wall/mineral/plasma, /turf/simulated/wall/mineral/alien) @@ -255,7 +256,7 @@ name = "alien wall" desc = "A strange-looking alien wall." icon = 'icons/turf/walls/plasma_wall.dmi' - icon_state = "" + icon_state = "plasma" mineral = "alien" walltype = "alien" canSmoothWith = list(/obj/structure/falsewall/alien, /turf/simulated/wall/mineral/alien) @@ -265,7 +266,7 @@ name = "bananium wall" desc = "A wall with bananium plating. Honk!" icon = 'icons/turf/walls/bananium_wall.dmi' - icon_state = "" + icon_state = "bananium" mineral = "clown" walltype = "clown" canSmoothWith = list(/obj/structure/falsewall/bananium, /turf/simulated/wall/mineral/bananium) @@ -273,7 +274,7 @@ /obj/structure/falsewall/sandstone name = "sandstone wall" desc = "A wall with sandstone plating." - icon_state = "" + icon_state = "sandstone" mineral = "sandstone" walltype = "sandstone" canSmoothWith = list(/obj/structure/falsewall/sandstone, /turf/simulated/wall/mineral/sandstone) @@ -282,7 +283,7 @@ name = "wooden wall" desc = "A wall with wooden plating. Stiff." icon = 'icons/turf/walls/wood_wall.dmi' - icon_state = "" + icon_state = "wood" mineral = "wood" walltype = "wood" canSmoothWith = list(/obj/structure/falsewall/wood, /turf/simulated/wall/mineral/wood) @@ -291,7 +292,7 @@ name = "rough metal wall" desc = "A wall with rough metal plating." icon = 'icons/turf/walls/iron_wall.dmi' - icon_state = "" + icon_state = "iron" mineral = "metal" walltype = "iron" canSmoothWith = list(/obj/structure/falsewall/iron, /turf/simulated/wall/mineral/iron) From 658bc95af00c2083923f14092b56da48bcbad74f Mon Sep 17 00:00:00 2001 From: uraniummeltdown Date: Wed, 29 Nov 2017 14:02:13 +0400 Subject: [PATCH 2/2] diagonal icon smoothing support added example diagonal smooth wall abductor and survival pod walls smooth diagonally new define for space icon state fixed abductor walls having no sheet_type --- code/__DEFINES/misc.dm | 3 + code/__HELPERS/icon_smoothing.dm | 311 +++++++++++++++------ code/game/turfs/simulated/floor/plating.dm | 2 +- code/game/turfs/simulated/walls_mineral.dm | 3 +- code/game/turfs/space/space.dm | 2 +- code/modules/mining/mine_items.dm | 2 +- icons/turf/smooth_wall.dmi | Bin 0 -> 952 bytes icons/turf/walls/abductor_wall.dmi | Bin 1977 -> 2606 bytes icons/turf/walls/survival_pod_walls.dmi | Bin 4113 -> 3647 bytes 9 files changed, 240 insertions(+), 83 deletions(-) create mode 100644 icons/turf/smooth_wall.dmi diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index a488d39f836..0fd0004fbf9 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -254,6 +254,9 @@ #define REGION_COMMAND 7 #define REGION_CENTCOMM 8 +//Just space +#define SPACE_ICON_STATE "[((x + y) ^ ~(x * y) + z) % 25]" + //used for maploader #define MAP_MINX 1 #define MAP_MINY 2 diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 40b521f051f..cc4b5459aa0 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -1,3 +1,28 @@ + +//generic (by snowflake) tile smoothing code; smooth your icons with this! +/* + Each tile is divided in 4 corners, each corner has an image associated to it; the tile is then overlayed by these 4 images + To use this, just set your atom's 'smooth' 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. + + Each atom has its own icon file with all the possible corner states. See 'smooth_wall.dmi' for a template. + + DIAGONAL SMOOTHING INSTRUCTIONS + To make your atom smooth diagonally you need all the proper icon states (see 'smooth_wall.dmi' for a template) and + to add the 'SMOOTH_DIAGONAL' flag to the atom's smooth var (in addition to either SMOOTH_TRUE or SMOOTH_MORE). + + For turfs, what appears under the diagonal corners depends on the turf that was in the same position previously: if you make a wall on + a plating floor, you will see plating under the diagonal wall corner, if it was space, you will see space. + + If you wish to map a diagonal wall corner with a fixed underlay, you must configure the turf's 'fixed_underlay' list var, like so: + fixed_underlay = list("icon"='icon_file.dmi', "icon_state"="iconstatename") + A non null 'fixed_underlay' list var will skip copying the previous turf appearance and always use the list. If the list is + not set properly, the underlay will default to regular floor plating. + + To see an example of a diagonal wall, see '/turf/simulated/wall/shuttle' and its subtypes. +*/ + //Redefinitions of the diagonal directions so they can be stored in one var without conflicts #define N_NORTH 2 #define N_SOUTH 4 @@ -10,7 +35,15 @@ #define SMOOTH_FALSE 0 //not smooth #define SMOOTH_TRUE 1 //smooths with exact specified types or just itself -#define SMOOTH_MORE 2 //smooths with all subtypes of specified types or just itself +#define SMOOTH_MORE 2 //smooths with all subtypes of specified types or just itself (this value can replace SMOOTH_TRUE) +#define SMOOTH_DIAGONAL 4 //if atom should smooth diagonally, this should be present in 'smooth' var +#define SMOOTH_BORDER 8 //atom will smooth with the borders of the map + +#define NULLTURF_BORDER 123456789 + +#define DEFAULT_UNDERLAY_ICON 'icons/turf/floors.dmi' +#define DEFAULT_UNDERLAY_ICON_STATE "plating" +#define DEFAULT_UNDERLAY_IMAGE image(DEFAULT_UNDERLAY_ICON, DEFAULT_UNDERLAY_ICON_STATE) /atom/var/smooth = SMOOTH_FALSE /atom/var/top_left_corner @@ -18,17 +51,8 @@ /atom/var/bottom_left_corner /atom/var/bottom_right_corner /atom/var/list/canSmoothWith = null // TYPE PATHS I CAN SMOOTH WITH~~~~~ If this is null and atom is smooth, it smooths only with itself -/atom/movable/var/can_be_unanchored = 0 - -//generic (by snowflake) tile smoothing code; smooth your icons with this! -/* - Each tile is divided in 4 corners, each corner has an image associated to it; the tile is then overlayed by these 4 images - To use this, just set your atom's 'smooth' 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. - - Each atom has its own icon file with all the possible corner states. See 'smooth_wall.dmi' for a template. -*/ +/atom/movable/var/can_be_unanchored = FALSE +/turf/var/list/fixed_underlay = null /proc/calculate_adjacencies(atom/A) if(!A.loc) @@ -44,27 +68,42 @@ for(var/direction in cardinal) AM = find_type_in_direction(A, direction) - if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) + if(AM == NULLTURF_BORDER) + if((A.smooth & SMOOTH_BORDER)) + adjacencies |= 1 << direction + else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) adjacencies |= 1 << direction if(adjacencies & N_NORTH) if(adjacencies & N_WEST) AM = find_type_in_direction(A, NORTHWEST) - if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) + if(AM == NULLTURF_BORDER) + if((A.smooth & 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 && !istype(AM)) || (istype(AM) && AM.anchored) ) + if(AM == NULLTURF_BORDER) + if((A.smooth & SMOOTH_BORDER)) + adjacencies |= N_NORTHEAST + else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) adjacencies |= N_NORTHEAST if(adjacencies & N_SOUTH) if(adjacencies & N_WEST) AM = find_type_in_direction(A, SOUTHWEST) - if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) + if(AM == NULLTURF_BORDER) + if((A.smooth & 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 && !istype(AM)) || (istype(AM) && AM.anchored) ) + if(AM == NULLTURF_BORDER) + if((A.smooth & SMOOTH_BORDER)) + adjacencies |= N_SOUTHEAST + else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) adjacencies |= N_SOUTHEAST return adjacencies @@ -72,80 +111,138 @@ /proc/smooth_icon(atom/A) if(qdeleted(A)) return - if(A && A.smooth) + if(A && (A.smooth & SMOOTH_TRUE) || (A.smooth & SMOOTH_MORE)) var/adjacencies = calculate_adjacencies(A) - - //NW CORNER - var/nw = "1-i" - if((adjacencies & N_NORTH) && (adjacencies & N_WEST)) - if(adjacencies & N_NORTHWEST) - nw = "1-f" - else - nw = "1-nw" + if(A.smooth & SMOOTH_DIAGONAL) + A.diagonal_smooth(adjacencies) else - if(adjacencies & N_NORTH) - nw = "1-n" - else if(adjacencies & N_WEST) - nw = "1-w" + cardinal_smooth(A, adjacencies) + +/atom/proc/diagonal_smooth(adjacencies) + switch(adjacencies) + if(N_NORTH|N_WEST) + replace_smooth_overlays("d-se","d-se-0") + if(N_NORTH|N_EAST) + replace_smooth_overlays("d-sw","d-sw-0") + if(N_SOUTH|N_WEST) + replace_smooth_overlays("d-ne","d-ne-0") + if(N_SOUTH|N_EAST) + replace_smooth_overlays("d-nw","d-nw-0") + + if(N_NORTH|N_WEST|N_NORTHWEST) + replace_smooth_overlays("d-se","d-se-1") + if(N_NORTH|N_EAST|N_NORTHEAST) + replace_smooth_overlays("d-sw","d-sw-1") + if(N_SOUTH|N_WEST|N_SOUTHWEST) + replace_smooth_overlays("d-ne","d-ne-1") + if(N_SOUTH|N_EAST|N_SOUTHEAST) + replace_smooth_overlays("d-nw","d-nw-1") - //NE CORNER - var/ne = "2-i" - if((adjacencies & N_NORTH) && (adjacencies & N_EAST)) - if(adjacencies & N_NORTHEAST) - ne = "2-f" - else - ne = "2-ne" else - if(adjacencies & N_NORTH) - ne = "2-n" - else if(adjacencies & N_EAST) - ne = "2-e" + cardinal_smooth(src, adjacencies) + return - //SW CORNER - var/sw = "3-i" - if((adjacencies & N_SOUTH) && (adjacencies & N_WEST)) - if(adjacencies & N_SOUTHWEST) - sw = "3-f" + icon_state = "" + return adjacencies + +//only walls should have a need to handle underlays +/turf/simulated/wall/diagonal_smooth(adjacencies) + adjacencies = reverse_ndir(..()) + if(adjacencies) + underlays.Cut() + if(fixed_underlay) + if(fixed_underlay["space"]) + underlays += image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER) else - sw = "3-sw" + underlays += image(fixed_underlay["icon"], fixed_underlay["icon_state"], layer=TURF_LAYER) else - if(adjacencies & N_SOUTH) - sw = "3-s" - else if(adjacencies & N_WEST) - sw = "3-w" + var/turf/T = get_step(src, turn(adjacencies, 180)) + if(T && (T.density || T.smooth)) + T = get_step(src, turn(adjacencies, 135)) + if(T && (T.density || T.smooth)) + T = get_step(src, turn(adjacencies, 225)) - //SE CORNER - var/se = "4-i" - if((adjacencies & N_SOUTH) && (adjacencies & N_EAST)) - if(adjacencies & N_SOUTHEAST) - se = "4-f" + if(istype(T, /turf/space) && !istype(T, /turf/space/transit)) + underlays += image('icons/turf/space.dmi', SPACE_ICON_STATE, layer=TURF_LAYER) + else if(T && !T.density && !T.smooth) + underlays += T + else if(baseturf && !initial(baseturf.density) && !initial(baseturf.smooth)) + underlays += image(initial(baseturf.icon), initial(baseturf.icon_state), layer=TURF_LAYER) else - se = "4-se" + underlays += DEFAULT_UNDERLAY_IMAGE + +/proc/cardinal_smooth(atom/A, adjacencies) + //NW CORNER + var/nw = "1-i" + if((adjacencies & N_NORTH) && (adjacencies & N_WEST)) + if(adjacencies & N_NORTHWEST) + nw = "1-f" else - if(adjacencies & N_SOUTH) - se = "4-s" - else if(adjacencies & N_EAST) - se = "4-e" + nw = "1-nw" + else + if(adjacencies & N_NORTH) + nw = "1-n" + else if(adjacencies & N_WEST) + nw = "1-w" - if(A.top_left_corner != nw) - A.overlays -= A.top_left_corner - A.top_left_corner = nw - A.overlays += nw + //NE CORNER + var/ne = "2-i" + if((adjacencies & N_NORTH) && (adjacencies & N_EAST)) + if(adjacencies & N_NORTHEAST) + ne = "2-f" + else + ne = "2-ne" + else + if(adjacencies & N_NORTH) + ne = "2-n" + else if(adjacencies & N_EAST) + ne = "2-e" - if(A.top_right_corner != ne) - A.overlays -= A.top_right_corner - A.top_right_corner = ne - A.overlays += ne + //SW CORNER + var/sw = "3-i" + if((adjacencies & N_SOUTH) && (adjacencies & N_WEST)) + if(adjacencies & N_SOUTHWEST) + sw = "3-f" + else + sw = "3-sw" + else + if(adjacencies & N_SOUTH) + sw = "3-s" + else if(adjacencies & N_WEST) + sw = "3-w" - if(A.bottom_right_corner != sw) - A.overlays -= A.bottom_right_corner - A.bottom_right_corner = sw - A.overlays += sw + //SE CORNER + var/se = "4-i" + if((adjacencies & N_SOUTH) && (adjacencies & N_EAST)) + if(adjacencies & N_SOUTHEAST) + se = "4-f" + else + se = "4-se" + else + if(adjacencies & N_SOUTH) + se = "4-s" + else if(adjacencies & N_EAST) + se = "4-e" - if(A.bottom_left_corner != se) - A.overlays -= A.bottom_left_corner - A.bottom_left_corner = se - A.overlays += se + if(A.top_left_corner != nw) + A.overlays -= A.top_left_corner + A.top_left_corner = nw + A.overlays += nw + + if(A.top_right_corner != ne) + A.overlays -= A.top_right_corner + A.top_right_corner = ne + A.overlays += ne + + if(A.bottom_right_corner != sw) + A.overlays -= A.bottom_right_corner + A.bottom_right_corner = sw + A.overlays += sw + + if(A.bottom_left_corner != se) + A.overlays -= A.bottom_left_corner + A.bottom_left_corner = se + A.overlays += se /proc/find_type_in_direction(atom/source, direction, range=1) var/x_offset = 0 @@ -163,10 +260,10 @@ var/turf/target_turf = locate(source.x + x_offset, source.y + y_offset, source.z) if(!target_turf) - return null + return NULLTURF_BORDER if(source.canSmoothWith) var/atom/A - if(source.smooth == SMOOTH_MORE) + if(source.smooth & SMOOTH_MORE) for(var/a_type in source.canSmoothWith) if( istype(target_turf, a_type) ) return target_turf @@ -216,3 +313,59 @@ bottom_right_corner = null overlays -= bottom_left_corner bottom_left_corner = null + +/atom/proc/replace_smooth_overlays(nw, ne, sw, se) + clear_smooth_overlays() + top_left_corner = nw + overlays += nw + top_right_corner = ne + overlays += ne + bottom_left_corner = sw + overlays += sw + bottom_right_corner = se + overlays += se + +/proc/reverse_ndir(ndir) + switch(ndir) + if(N_NORTH) + return NORTH + if(N_SOUTH) + return SOUTH + if(N_WEST) + return WEST + if(N_EAST) + return EAST + if(N_NORTHWEST) + return NORTHWEST + if(N_NORTHEAST) + return NORTHEAST + if(N_SOUTHEAST) + return SOUTHEAST + if(N_SOUTHWEST) + return SOUTHWEST + if(N_NORTH|N_WEST) + return NORTHWEST + if(N_NORTH|N_EAST) + return NORTHEAST + if(N_SOUTH|N_WEST) + return SOUTHWEST + if(N_SOUTH|N_EAST) + return SOUTHEAST + if(N_NORTH|N_WEST|N_NORTHWEST) + return NORTHWEST + if(N_NORTH|N_EAST|N_NORTHEAST) + return NORTHEAST + if(N_SOUTH|N_WEST|N_SOUTHWEST) + return SOUTHWEST + if(N_SOUTH|N_EAST|N_SOUTHEAST) + return SOUTHEAST + else + return 0 + +//Example smooth wall +/turf/simulated/wall/smooth + name = "smooth wall" + icon = 'icons/turf/smooth_wall.dmi' + icon_state = "smooth" + smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL|SMOOTH_BORDER + canSmoothWith = null diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 1e9d019ac59..53a043bd5e3 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -227,7 +227,7 @@ /turf/simulated/floor/plating/airless/catwalk/update_icon(var/propogate=1) underlays.Cut() - underlays += new /icon('icons/turf/space.dmi',"[((x + y) ^ ~(x * y) + z) % 25]") + underlays += new /icon('icons/turf/space.dmi',SPACE_ICON_STATE) var/dirs = 0 for(var/direction in cardinal) diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm index 5010fdfdd30..d2db056e824 100644 --- a/code/game/turfs/simulated/walls_mineral.dm +++ b/code/game/turfs/simulated/walls_mineral.dm @@ -126,7 +126,7 @@ desc = "A strange-looking alien wall." icon = 'icons/turf/walls/plasma_wall.dmi' icon_state = "plasma" - sheet_type = null + sheet_type = /obj/item/stack/sheet/mineral/abductor canSmoothWith = list(/turf/simulated/wall/mineral/alien, /obj/structure/falsewall/alien) /turf/simulated/wall/mineral/wood @@ -153,6 +153,7 @@ desc = "A wall with alien alloy plating." icon = 'icons/turf/walls/abductor_wall.dmi' icon_state = "abductor" + smooth = SMOOTH_TRUE|SMOOTH_DIAGONAL sheet_type = /obj/item/stack/sheet/mineral/abductor explosion_block = 3 canSmoothWith = list(/turf/simulated/wall/mineral/abductor, /obj/structure/falsewall/abductor) \ No newline at end of file diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 90454f9952b..7f185bf0e64 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -17,7 +17,7 @@ . = ..() if(!istype(src, /turf/space/transit)) - icon_state = "[((x + y) ^ ~(x * y) + z) % 25]" + icon_state = SPACE_ICON_STATE update_starlight() /turf/space/Destroy(force) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 0bca9688abb..e86be187329 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -368,7 +368,7 @@ desc = "An easily-compressable wall used for temporary shelter." icon = 'icons/turf/walls/survival_pod_walls.dmi' icon_state = "smooth" - smooth = SMOOTH_MORE // To Do: Add in Diagnaol Smooth Support + smooth = SMOOTH_MORE|SMOOTH_DIAGONAL canSmoothWith = list(/turf/simulated/wall/survival, /obj/machinery/door/airlock/survival_pod) //Door diff --git a/icons/turf/smooth_wall.dmi b/icons/turf/smooth_wall.dmi new file mode 100644 index 0000000000000000000000000000000000000000..afb5f9536aa69d4d6a387c323e26c72895ce4176 GIT binary patch literal 952 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvK8A$4HYMBD0cmjMvTn`*L@Snk$VP+bTk^fcT zGEkhcB*-tA!Qt7BG$7|R9SVUM#zuxyfo`p2)@yd~QIZp+qG++W|mwxZ{Jrr6=^N6W1>-UQxh-B~*4X~Jav z-glOt_4d^6lJfE{TADM3hd13!CdBIK%_^PQyI;v)X6|8=U^eh_JFxs*hG&ES+(08{ zJH8Jq=O;H5pZcrdBxtDQ(kZZ9G+>pnR07X|3)|kG3^$D4bdv9|NQ+{?F}Jjwl)tRG zH(4`Mjs!8y4pq=eJreZq{*SPp&maDNw-ZqdaS$>6f02QKsn*lQF(jk$?evYMuMK!y z6~*;zn%q8!#3`MXZwyXhxxO;!$8(n%pMs4X1Pu}!)O+js;+@?tZN1;^!PK^0N8xI5 zn3K!A=Py51Br-7nuyy#(%q(%>KX=9P|K}N}O#5(iGmzWOe2=gCM*}0zgYOLd$N$T7 z{wdwRQ2N8RCk$*KtROm0Gu(Ulr}#l{%jvy4IJ&z(GTUSy)ZZic!FM}f&05}?2U8pT zca=WM&Q*BW+EBi$^jWrV!`muBt^;LzIam{R$F(qRh}AzNH|tH6U|9nS@$LJ8b8``D zoEUGsb7tAADtSS^{@|5yXG0>(cm1Y>`8x$H(ssa}TT)-|>xUx?e)0 z--B!1F}e-?)x0sU?1TQ@`70f?*@rXXTz0wadC7?9?|B_^&L`iKeO+N*Z zcH)kMyRwfJa4&b>;k$^haj)VAbCz#y2kr?-@EAs#`*`m?@Wx(g>L2%(WodJ(7bWW( zd}n%lDLcDr)2UgHgv7+ePj1-3<9@W&PA5fG9kMR$45zj$^ So(;fU#^CAd=d#Wzp$Pzys-D{b literal 0 HcmV?d00001 diff --git a/icons/turf/walls/abductor_wall.dmi b/icons/turf/walls/abductor_wall.dmi index 5d0f47046b3c64a4fc54d49a738c33bac61d1edd..d1d8954bfb96d26ab45eb8f22ec24af4abf99834 100644 GIT binary patch literal 2606 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 F{tvku?dkvk literal 1977 zcmYLKdpy(o8{cMZlOgy@Jn#4WdEU?S&nJcC>xEP`Pz8ZNNbf!F ze!weOKX4`BJ_X4~0}qb$i@%3JATTj8v9hwlVzEn%Tm>lC!ongLMF@5ykjZ3)X|5tN zH$&qr27^JP(f0QCnLC3{=z1(Y&jW-bR)zyW9WdR`mke?p>pcww;%I*g-ThR=i3`*) zIyLk>2*k+G&gxQqWukMXLS}iguKjGcOA@^9Qaaz;VOvat)LV zs>t&Ft-6w}BL1rYD%$}0UXy?Ln0>KW<0qcsJ$y;*bVOJXL%+%N-nQQ#?Gq>6JoffL zc;@WN=?fqsNDXGIj|LTBgpZUK8*|fqK`6v@%0iec@j2>h25ZyqtC^QE7eNm&-cSJlS)E+FV`V>@HQ6m zXo=HO#KoTA(%Q&Bzu{V(dl}ue<<*3Jb*+wJ%N6wzk7pHfmkUGDb-Q%iJOr2S%z^4x z*@9sPZbfPt(kH&?qn<#R5LT=OGhYNlzb?_S?2hr!O2xeA2Rcb<`QxWIB9~7Hx|&VS z$5=4o^8`cQCyJ}z_3q(Mu|Y~fr4V8Gd_+jytGoCnXWIf-#R_wUuU&)QJ-sz#LVxZe4+;r6s~DCqFI@@$Y0X*EuA~z`*>=QKxI1X zdiX!VK8CVPy&nU!!A|ce@~|&l3Q{5)Ryn}tp%S_Jtb3#f{snsr!MJiy z7L9TZP`1s|bch1PXte@EWA)FYyrhIj8(TsY;laum`r-^l4uujb_Q}(!Mv-<{4|NR_ zRx;Vl%8o}z_Cz^AB^u%7oogQ{2+D~7W{3GSn-wpEsmPRg=A7V!?W{pxS0~MKXsjbx zMvpP$Bu0DF2(H$u6m3$QoftZUE_`t)E}P_&^|k%oUJUE?ybBj`fG`H#+UFRk?N_Sm z7>Jy7-kdwCx1&@UG++_WzXLpNc6-#*$5qTD0Jm)MxNGcDV!=r%qh)SK@Q9@ zSBv<~YLJiEfo4QM_bC~1GP5}VA~YL-Lek9!_72r(^Y-WTG&E@O%#W5%9a8X_po0_# zJbFJw%rl1f0Fwx#vE`mpXj#sEU_lUIL3T9Ch7&Z3&%X<6(NNz}XzkMU-U>1TPsJT~ zJ41LBgGFy=jW4H+uKtfMNp5X>JL#1?`g56a`icGY52>wOa)g#9YMq`m zxcY-TmeFeNH*0+KW-{JUP5siFV&b*}-}b#ja!fhyywCXgVxX`&INYRGI3(D~j(Irq zBYxuoi6M(?hpK#+U3Eo<$;`Ky>(+dS;L}DGb0;n z!Iys+3CNmk?AbzxA+m|wF;f$pP3_ML3OtPDq-UF}R9GBySp7-2fU zE^jd5kaODeGVa7*G#9^%m!7ltLfIO%yoHu=wU!KQ@BUGYpb)t-^wF1`E^XT&zY<`; zq|uqY^Ll{g2eG~oab+rBB`wMNoA^jnLxv9c%l`rMx`qYtU%Ht|@;?vv4!ZfhI|y&fNV5~F0RkAAZDRk%@sO>SE_!~`b4cw>!wbp z5320B#5F@$Q!ENrKGv{m+MW%8+@lWLxjD`6SMso94r*Gp}7l?>cNQrFtVX+@mtpzth8`W6mt5tNIk-QfdHGmV6fe zAdH(g@9oT8m#>;a%p3~eIEHssbdA6&QFhrD47-38dhMbzLF&_5BUv7M@;Uaw^!F(W zMz$Z>ZyD4ZU0NSnG`HY6Y`$8s-ZX&!{LssnYZbpg{S}Lfl_{XiSA|5^$QxdrYcZ0+ zP(8V|0PI(>ZAp!$7X@YRd8pC#FBSz2dB|zs6nSG1lK9Q4%Baa^1}-7FZ_b?jZ#u_1 zu*&R@^@P7y-VBfk^KCS{zd@o))r)e6kFy!>o5|mREbm!PwMw6dF+Q)98c`iMy0NOB zUEK^Mq(ZpP`^40##!n5NZN@FB1$%W|a<|7~16L9rE}EHH_fX>+0J^Acn`px!(@k&I lV(VI_z`8bn-Lk1r!0g2x`g%^UVZgTu^7im`FLyhd@HdK8!RY`1 diff --git a/icons/turf/walls/survival_pod_walls.dmi b/icons/turf/walls/survival_pod_walls.dmi index 12dc44e9ea2da0284ca38b30aec1adf650324d57..d6a8b097ce3251197f4fcfa0159cf0abcaa08611 100644 GIT binary patch literal 3647 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