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 d9b7091247f..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,25 +35,24 @@ #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 /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 - -//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) @@ -36,105 +60,189 @@ 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 - - else - if(AM) - adjacencies |= 1 << direction - - else - for(var/direction in alldirs) - if(find_type_in_direction(A, direction)) + for(var/direction in cardinal) + AM = find_type_in_direction(A, direction) + 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 == 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 == 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 == 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 == NULLTURF_BORDER) + if((A.smooth & SMOOTH_BORDER)) + adjacencies |= N_SOUTHEAST + else if( (AM && !istype(AM)) || (istype(AM) && AM.anchored) ) + adjacencies |= N_SOUTHEAST return adjacencies /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 @@ -152,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 @@ -205,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/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) 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 00000000000..afb5f9536aa Binary files /dev/null and b/icons/turf/smooth_wall.dmi differ diff --git a/icons/turf/walls/abductor_wall.dmi b/icons/turf/walls/abductor_wall.dmi index 5d0f47046b3..d1d8954bfb9 100644 Binary files a/icons/turf/walls/abductor_wall.dmi and b/icons/turf/walls/abductor_wall.dmi differ diff --git a/icons/turf/walls/survival_pod_walls.dmi b/icons/turf/walls/survival_pod_walls.dmi index 12dc44e9ea2..d6a8b097ce3 100644 Binary files a/icons/turf/walls/survival_pod_walls.dmi and b/icons/turf/walls/survival_pod_walls.dmi differ