mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-07 23:42:44 +00:00
Implements the Modernizing radiation design document ( https://hackmd.io/@tgstation/rJNIyeBHt ) and replaces the current radiation sources with the new system, as well as replacing/removing a bunch of old consumers of radiation that either had no reason to exist, or could be replaced by something else. Diverges from the doc in that items radiation don't go up like explained. I was going to, but items get irradiated so easily that it just feels pretty lame. Items still get irradiated, but it's mostly just so that radiation sources look cooler (wow, lots of stuff around going green), and for things like the geiger counter. Instead of the complicated radiation_wave system, radiation now just checks everything between the radiation source and the potential target, losing power along the way based on the radiation insulation of whats in between. If this reaches too low a point (specified by radiation_pulse consumers), then the radiation will not pass. Otherwise, will roll a chance to irradiate. Uranium structures allow a delay before irradiating, so stay away!
127 lines
4.0 KiB
Plaintext
127 lines
4.0 KiB
Plaintext
/obj/structure/railing
|
|
name = "railing"
|
|
desc = "Basic railing meant to protect idiots like you from falling."
|
|
icon = 'icons/obj/fluff.dmi'
|
|
icon_state = "railing"
|
|
flags_1 = ON_BORDER_1
|
|
density = TRUE
|
|
anchored = TRUE
|
|
pass_flags_self = LETPASSTHROW|PASSSTRUCTURE
|
|
/// armor more or less consistent with grille. max_integrity about one time and a half that of a grille.
|
|
armor = list(MELEE = 50, BULLET = 70, LASER = 70, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 0, ACID = 0)
|
|
max_integrity = 75
|
|
|
|
var/climbable = TRUE
|
|
///Initial direction of the railing.
|
|
var/ini_dir
|
|
|
|
/obj/structure/railing/corner //aesthetic corner sharp edges hurt oof ouch
|
|
icon_state = "railing_corner"
|
|
density = FALSE
|
|
climbable = FALSE
|
|
|
|
/obj/structure/railing/Initialize(mapload)
|
|
. = ..()
|
|
ini_dir = dir
|
|
if(climbable)
|
|
AddElement(/datum/element/climbable)
|
|
|
|
if(density && flags_1 & ON_BORDER_1) // blocks normal movement from and to the direction it's facing.
|
|
var/static/list/loc_connections = list(
|
|
COMSIG_ATOM_EXIT = .proc/on_exit,
|
|
)
|
|
AddElement(/datum/element/connect_loc, loc_connections)
|
|
|
|
AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ,null,CALLBACK(src, .proc/can_be_rotated),CALLBACK(src,.proc/after_rotation))
|
|
|
|
/obj/structure/railing/attackby(obj/item/I, mob/living/user, params)
|
|
..()
|
|
add_fingerprint(user)
|
|
|
|
if(I.tool_behaviour == TOOL_WELDER && !user.combat_mode)
|
|
if(atom_integrity < max_integrity)
|
|
if(!I.tool_start_check(user, amount=0))
|
|
return
|
|
|
|
to_chat(user, span_notice("You begin repairing [src]..."))
|
|
if(I.use_tool(src, user, 40, volume=50))
|
|
atom_integrity = max_integrity
|
|
to_chat(user, span_notice("You repair [src]."))
|
|
else
|
|
to_chat(user, span_warning("[src] is already in good condition!"))
|
|
return
|
|
|
|
/obj/structure/railing/wirecutter_act(mob/living/user, obj/item/I)
|
|
. = ..()
|
|
if(!anchored)
|
|
to_chat(user, span_warning("You cut apart the railing."))
|
|
I.play_tool_sound(src, 100)
|
|
deconstruct()
|
|
return TRUE
|
|
|
|
/obj/structure/railing/deconstruct(disassembled)
|
|
if(!(flags_1 & NODECONSTRUCT_1))
|
|
var/obj/item/stack/rods/rod = new /obj/item/stack/rods(drop_location(), 3)
|
|
transfer_fingerprints_to(rod)
|
|
return ..()
|
|
|
|
///Implements behaviour that makes it possible to unanchor the railing.
|
|
/obj/structure/railing/wrench_act(mob/living/user, obj/item/I)
|
|
. = ..()
|
|
if(flags_1&NODECONSTRUCT_1)
|
|
return
|
|
to_chat(user, span_notice("You begin to [anchored ? "unfasten the railing from":"fasten the railing to"] the floor..."))
|
|
if(I.use_tool(src, user, volume = 75, extra_checks = CALLBACK(src, .proc/check_anchored, anchored)))
|
|
set_anchored(!anchored)
|
|
to_chat(user, span_notice("You [anchored ? "fasten the railing to":"unfasten the railing from"] the floor."))
|
|
return TRUE
|
|
|
|
/obj/structure/railing/CanPass(atom/movable/mover, border_dir)
|
|
. = ..()
|
|
if(border_dir & dir)
|
|
return . || mover.throwing || mover.movement_type & (FLYING | FLOATING)
|
|
return TRUE
|
|
|
|
/obj/structure/railing/proc/on_exit(datum/source, atom/movable/leaving, direction)
|
|
SIGNAL_HANDLER
|
|
|
|
if(leaving == src)
|
|
return // Let's not block ourselves.
|
|
|
|
if(!(direction & dir))
|
|
return
|
|
|
|
if (!density)
|
|
return
|
|
|
|
if (leaving.throwing)
|
|
return
|
|
|
|
if (leaving.movement_type & (PHASING | FLYING | FLOATING))
|
|
return
|
|
|
|
if (leaving.move_force >= MOVE_FORCE_EXTREMELY_STRONG)
|
|
return
|
|
|
|
leaving.Bump(src)
|
|
return COMPONENT_ATOM_BLOCK_EXIT
|
|
|
|
/obj/structure/railing/proc/can_be_rotated(mob/user,rotation_type)
|
|
if(anchored)
|
|
to_chat(user, span_warning("[src] cannot be rotated while it is fastened to the floor!"))
|
|
return FALSE
|
|
|
|
var/target_dir = turn(dir, rotation_type == ROTATION_CLOCKWISE ? -90 : 90)
|
|
|
|
if(!valid_window_location(loc, target_dir, is_fulltile = FALSE)) //Expanded to include rails, as well!
|
|
to_chat(user, span_warning("[src] cannot be rotated in that direction!"))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/obj/structure/railing/proc/check_anchored(checked_anchored)
|
|
if(anchored == checked_anchored)
|
|
return TRUE
|
|
|
|
/obj/structure/railing/proc/after_rotation(mob/user,rotation_type)
|
|
add_fingerprint(user)
|