Files
SmArtKarandGitHub 49c373da34 Resprites boulder platforms and adds smoothing to them (#93588)
## About The Pull Request

Changes platforms to a more topdown perspective to be in line with lava
turfs and adds smoothing to them, ensuring that they always take up all
the space on their lava tile but don't go onto basalt

<img width="860" height="653" alt="dreamseeker_07DHZsrM1C"
src="https://github.com/user-attachments/assets/4522d3e4-27e0-4866-aa07-93d7eeb0f5e1"
/>

## Why It's Good For The Game
Currently large sections of platforms look a bit jank, as can be seen in
the original vent platform PR

<img width="923" height="784"
alt="489234293-9c222c28-f63a-4955-b4b4-c600e934c0c9"
src="https://github.com/user-attachments/assets/91b32618-2496-494e-ac3e-737d8ca999cc"
/>

This should make it much easier to discern which tiles are safe to step
on during hectic combat of vent defense

## Changelog
🆑
image: Boulder platforms spawned by throwing boulders on lava or
activating vents now have new sprites that smooth together
/🆑
2025-10-25 02:17:59 +02:00

240 lines
9.0 KiB
Plaintext

/obj/structure/lattice
name = "lattice"
desc = "A lightweight support lattice. These hold our station together."
icon = 'icons/obj/smooth_structures/lattice.dmi'
icon_state = "lattice-255"
base_icon_state = "lattice"
density = FALSE
anchored = TRUE
armor_type = /datum/armor/structure_lattice
max_integrity = 50
layer = LATTICE_LAYER //under pipes
plane = FLOOR_PLANE
obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = SMOOTH_GROUP_LATTICE
canSmoothWith = SMOOTH_GROUP_LATTICE + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_OPEN_FLOOR
var/number_of_mats = 1
var/build_material = /obj/item/stack/rods
var/list/give_turf_traits = list(TRAIT_CHASM_STOPPED, TRAIT_HYPERSPACE_STOPPED)
/obj/structure/lattice/Initialize(mapload)
. = ..()
if (length(give_turf_traits))
give_turf_traits = string_list(give_turf_traits)
AddElement(/datum/element/give_turf_traits, give_turf_traits)
AddElement(/datum/element/footstep_override, footstep = FOOTSTEP_CATWALK)
// We check for objects in non-nearspace space in both linters and tests, so we can ignore these checks on mapload for performance
if (mapload || !isspaceturf(loc))
return
var/area/new_turf_area = get_area(loc)
if (istype(new_turf_area, /area/space) && !istype(new_turf_area, /area/space/nearstation))
set_turf_to_area(loc, GLOB.areas_by_type[/area/space/nearstation])
/datum/armor/structure_lattice
melee = 50
fire = 80
acid = 50
/obj/structure/lattice/examine(mob/user)
. = ..()
. += deconstruction_hints(user)
/obj/structure/lattice/Destroy(force) // so items on the lattice fall when the lattice is destroyed
var/turf/turfloc = loc
. = ..()
if(isturf(turfloc))
for(var/thing_that_falls in turfloc)
turfloc.zFall(thing_that_falls)
/obj/structure/lattice/proc/deconstruction_hints(mob/user)
return span_notice("The rods look like they could be <b>cut</b>. There's space for more <i>rods</i> or a <i>tile</i>.")
/obj/structure/lattice/Initialize(mapload)
. = ..()
for(var/obj/structure/lattice/LAT in loc)
if(LAT == src)
continue
log_mapping("multiple lattices found in ([loc.x], [loc.y], [loc.z], [get_area(LAT)])")
return INITIALIZE_HINT_QDEL
/obj/structure/lattice/blob_act(obj/structure/blob/B)
return
/obj/structure/lattice/attackby(obj/item/C, mob/user, list/modifiers, list/attack_modifiers)
if(resistance_flags & INDESTRUCTIBLE)
return
if(C.tool_behaviour == TOOL_WIRECUTTER)
to_chat(user, span_notice("Slicing [name] joints ..."))
deconstruct()
else
var/turf/T = get_turf(src)
return T.attackby(C, user) //hand this off to the turf instead (for building plating, catwalks, etc)
/obj/structure/lattice/atom_deconstruct(disassembled = TRUE)
if(!isnull(build_material) && number_of_mats >= 1)
new build_material(get_turf(src), number_of_mats)
/obj/structure/lattice/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
if(the_rcd.mode == RCD_TURF)
return list("delay" = 0, "cost" = the_rcd.rcd_design_path == /obj/structure/lattice/catwalk ? 2 : 1)
return FALSE
/obj/structure/lattice/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, list/rcd_data)
if(rcd_data["[RCD_DESIGN_MODE]"] == RCD_TURF)
var/design_structure = rcd_data["[RCD_DESIGN_PATH]"]
if(design_structure == /turf/open/floor/plating/rcd)
var/turf/T = src.loc
if(isgroundlessturf(T))
T.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
qdel(src)
return TRUE
if(design_structure == /obj/structure/lattice/catwalk)
replace_with_catwalk()
return TRUE
return FALSE
/obj/structure/lattice/singularity_pull(atom/singularity, current_size)
if(current_size >= STAGE_FOUR)
deconstruct()
/obj/structure/lattice/proc/replace_with_catwalk()
var/list/post_replacement_callbacks = list()
SEND_SIGNAL(src, COMSIG_LATTICE_PRE_REPLACE_WITH_CATWALK, post_replacement_callbacks)
var/turf/turf = loc
qdel(src)
var/new_catwalk = new /obj/structure/lattice/catwalk(turf)
for(var/datum/callback/callback as anything in post_replacement_callbacks)
callback.Invoke(new_catwalk)
/obj/structure/lattice/catwalk
name = "catwalk"
desc = "A catwalk for easier EVA maneuvering and cable placement."
icon = 'icons/obj/smooth_structures/catwalk.dmi'
icon_state = "catwalk-0"
base_icon_state = "catwalk"
number_of_mats = 2
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = SMOOTH_GROUP_CATWALK + SMOOTH_GROUP_LATTICE + SMOOTH_GROUP_OPEN_FLOOR
canSmoothWith = SMOOTH_GROUP_CATWALK
obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP
give_turf_traits = list(TRAIT_TURF_IGNORE_SLOWDOWN, TRAIT_LAVA_STOPPED, TRAIT_CHASM_STOPPED, TRAIT_IMMERSE_STOPPED, TRAIT_HYPERSPACE_STOPPED)
/obj/structure/lattice/catwalk/deconstruction_hints(mob/user)
return span_notice("The supporting rods look like they could be <b>cut</b>.")
/obj/structure/lattice/catwalk/Move()
var/turf/T = loc
for(var/obj/structure/cable/C in T)
C.deconstruct()
..()
/obj/structure/lattice/catwalk/atom_deconstruct(disassembled = TRUE)
..()
var/turf/T = loc
for(var/obj/structure/cable/C in T)
C.deconstruct()
/obj/structure/lattice/catwalk/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
if(the_rcd.mode == RCD_DECONSTRUCT)
return list("mode" = RCD_DECONSTRUCT, "delay" = 1 SECONDS, "cost" = 5)
return FALSE
/obj/structure/lattice/catwalk/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode)
if(passed_mode == RCD_DECONSTRUCT)
var/turf/turf = loc
for(var/obj/structure/cable/cable_coil in turf)
cable_coil.deconstruct()
qdel(src)
return TRUE
/obj/structure/lattice/catwalk/mining
name = "reinforced catwalk"
desc = "A heavily reinforced catwalk used to build bridges in hostile environments. It doesn't look like anything could make this budge."
resistance_flags = INDESTRUCTIBLE
/obj/structure/lattice/catwalk/mining/attackby(obj/item/C, mob/user, list/modifiers, list/attack_modifiers)
// Allow cable placement even though we're indestructible
if(istype(C, /obj/item/stack/cable_coil))
var/turf/T = get_turf(src)
return T.attackby(C, user)
return ..()
/obj/structure/lattice/catwalk/mining/deconstruction_hints(mob/user)
return
/obj/structure/lattice/catwalk/lava
name = "heatproof catwalk"
desc = "A specialized catwalk for building across lava. Watch your step."
icon = 'icons/obj/smooth_structures/catwalk.dmi'
icon_state = "catwalk-0"
base_icon_state = "catwalk"
number_of_mats = 1
color = "#5286b9ff"
resistance_flags = FIRE_PROOF | LAVA_PROOF
/obj/structure/lattice/catwalk/lava/deconstruction_hints(mob/user)
return span_notice("The rods look like they could be <b>cut</b>, but the <i>heat treatment will shatter off</i>. There's space for a <i>tile</i>.")
/obj/structure/lattice/catwalk/lava/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!ismetaltile(attacking_item))
return
var/obj/item/stack/tile/iron/attacking_tiles = attacking_item
if(!attacking_tiles.use(1))
to_chat(user, span_warning("You need one floor tile to build atop [src]."))
return
to_chat(user, span_notice("You construct new plating with [src] as support."))
playsound(src, 'sound/items/weapons/genhit.ogg', 50, TRUE)
var/turf/turf_we_place_on = get_turf(src)
turf_we_place_on.place_on_top(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
qdel(src)
/obj/structure/lattice/catwalk/boulder
name = "boulder platform"
desc = "A boulder, floating on the molten hot deadly lava. More like a BOATlder."
icon = 'icons/obj/smooth_structures/boulder_platform.dmi'
icon_state = "boulder_platform-0"
base_icon_state = "boulder_platform"
smoothing_groups = SMOOTH_GROUP_BOULDER_PLATFORM
canSmoothWith = SMOOTH_GROUP_BOULDER_PLATFORM + SMOOTH_GROUP_FLOOR_LAVA
build_material = null
/// The type of particle to make before the platform collapses.
var/warning_particle = /particles/smoke/ash
/obj/structure/lattice/catwalk/boulder/Initialize(mapload)
. = ..()
fast_emissive_blocker(src)
AddElement(/datum/element/elevation, pixel_shift = 8)
/obj/structure/lattice/catwalk/boulder/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(ismetaltile(attacking_item))
balloon_alert(user, "too unstable!")
return FALSE
return ..()
/obj/structure/lattice/catwalk/boulder/CanAllowThrough(atom/movable/mover, border_dir)
if(istype(mover, /obj/structure/ore_box))
self_destruct()
return TRUE
. = ..()
/obj/structure/lattice/catwalk/boulder/proc/pre_self_destruct()
var/mutable_appearance/cracks_overlay = mutable_appearance('icons/obj/ore.dmi', istype(loc, /turf/open/lava/plasma) ? "plasma_cracks" : "lava_cracks", src)
cracks_overlay.blend_mode = BLEND_INSET_OVERLAY
add_overlay(cracks_overlay)
animate(src, alpha = 0, time = 2 SECONDS, pixel_y = -16, easing = QUAD_EASING|EASE_IN)
addtimer(CALLBACK(src, PROC_REF(self_destruct)), 2 SECONDS)
/**
* Handles platforms deleting themselves with a visual effect and message.
*/
/obj/structure/lattice/catwalk/boulder/proc/self_destruct()
visible_message(span_notice("\The [src] sinks and dissapears!"))
playsound(src, 'sound/effects/gas_hissing.ogg', 20)
remove_shared_particles(warning_particle)
deconstruct()