Files
VOREStation/code/game/objects/structures/simple_doors.dm
T
Cameron Lennox cbc4151bfb Radiation Refactor (#19270)
* Part 1

* WIP

* The rest of these

* More stuff

* Whoops, did that wrong

* typo

* gweeen

* This all works

* SHOWER

* Rads

* awa

* rad

* Update life.dm

* edits

* Makes lvl 3 rads give you a warning.

You should already know by this point, but this makes it EXTRA clear you're getting fucked

* Update vorestation.dme

* aaa

* propagate

* gwah

* more fixes

* AAA

* Update radiation.dm

* Update radiation.dm

* mobs rads

* rads

* fix this

* Update _reagents.dm

* these

* Get rid of these

* rad

* Update config.txt

* fixed

* Update radiation_effects.dm
2026-03-22 12:29:09 -04:00

360 lines
12 KiB
Plaintext

/obj/structure/simple_door
name = "door"
description_info = "If you hold left alt whilst left-clicking on a door, you can knock on it to announce your presence to anyone on the other side! Alternately if you are on HARM intent when doing this, you will bang loudly on the door!"
density = TRUE
anchored = TRUE
can_atmos_pass = ATMOS_PASS_DENSITY
breakable = TRUE
icon = 'icons/obj/doors/material_doors.dmi'
icon_state = "metal"
var/datum/material/material
var/state = 0 //closed, 1 == open
var/isSwitchingStates = 0
var/hardness = 1
var/oreAmount = 7
var/knock_sound = 'sound/machines/door/knock_glass.ogg'
var/knock_hammer_sound = 'sound/weapons/sonic_jackhammer.ogg'
var/locked = FALSE //has the door been locked?
var/lock_id = null //does the door have an associated key?
var/lock_type = "simple" //string matched to "pick_type" on /obj/item/lockpick
var/can_pick = TRUE //can it be picked/bypassed?
var/lock_difficulty = 1 //multiplier to picking/bypassing time
var/keysound = 'sound/items/toolbelt_equip.ogg'
rad_insulation = RAD_MEDIUM_INSULATION
/obj/structure/simple_door/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
TemperatureAct(exposed_temperature)
/obj/structure/simple_door/proc/TemperatureAct(temperature)
hardness -= material.combustion_effect(get_turf(src),temperature, 0.3)
CheckHardness()
/obj/structure/simple_door/Initialize(mapload, var/material_name)
. = ..()
set_material(material_name)
if(!material)
return INITIALIZE_HINT_QDEL
/obj/structure/simple_door/Destroy()
STOP_PROCESSING(SSobj, src)
update_nearby_tiles()
return ..()
/obj/structure/simple_door/proc/set_material(var/material_name)
if(!material_name)
material_name = MAT_STEEL
material = get_material_by_name(material_name)
if(!material)
return
hardness = max(1,round(material.integrity/10))
icon_state = material.door_icon_base
name = "[material.display_name] door"
color = material.icon_colour
if(material.opacity < 0.5)
set_opacity(0)
else
set_opacity(1)
if(material.products_need_process())
START_PROCESSING(SSobj, src)
update_nearby_tiles(need_rebuild=1)
/obj/structure/simple_door/get_material()
return material
/obj/structure/simple_door/Bumped(atom/user)
..()
if(!state)
return TryToSwitchState(user)
return
/obj/structure/simple_door/attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral
if(isAI(user)) //so the AI can't open it
return
else if(isrobot(user)) //but cyborgs can
if(get_dist(user,src) <= 1) //not remotely though
return TryToSwitchState(user)
/obj/structure/simple_door/attack_hand(mob/user as mob)
return TryToSwitchState(user)
/obj/structure/simple_door/click_alt(mob/user as mob)
. = ..()
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(!Adjacent(user))
return
else if(user.a_intent == I_HURT)
src.visible_message(span_warning("[user] hammers on \the [src]!"), span_warning("Someone hammers loudly on \the [src]!"))
src.add_fingerprint(user)
playsound(src, knock_hammer_sound, 50, 0, 3)
else if(user.a_intent == I_HELP)
src.visible_message("[user] knocks on \the [src].", "Someone knocks on \the [src].")
src.add_fingerprint(user)
playsound(src, knock_sound, 50, 0, 3)
return
/obj/structure/simple_door/CanPass(atom/movable/mover, turf/target)
if(istype(mover, /obj/effect/beam))
return !opacity
return !density
/obj/structure/simple_door/proc/TryToSwitchState(atom/user)
if(isSwitchingStates) return
if(ismob(user))
var/mob/M = user
if(!material.can_open_material_door(user))
return
if(locked && state == 0)
to_chat(M,span_warning("It's locked!"))
return
if(world.time - last_bumped <= 60)
return
if(M.client)
if(iscarbon(M))
var/mob/living/carbon/C = M
if(!C.handcuffed)
SwitchState()
else
SwitchState()
else if(istype(user, /obj/mecha))
SwitchState()
/obj/structure/simple_door/proc/SwitchState()
if(state)
Close()
else
Open()
/obj/structure/simple_door/proc/Open()
isSwitchingStates = 1
playsound(src, material.dooropen_noise, 100, 1)
flick("[material.door_icon_base]opening",src)
sleep(10)
density = FALSE
set_opacity(0)
state = 1
update_icon()
isSwitchingStates = 0
update_nearby_tiles()
/obj/structure/simple_door/proc/Close()
isSwitchingStates = 1
playsound(src, material.dooropen_noise, 100, 1)
flick("[material.door_icon_base]closing",src)
sleep(10)
density = TRUE
set_opacity(1)
state = 0
update_icon()
isSwitchingStates = 0
update_nearby_tiles()
/obj/structure/simple_door/update_icon()
if(state)
icon_state = "[material.door_icon_base]open"
else
icon_state = material.door_icon_base
/obj/structure/simple_door/attackby(obj/item/W as obj, mob/user as mob)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(istype(W,/obj/item/simple_key))
var/obj/item/simple_key/key = W
if(state)
to_chat(user,span_notice("\The [src] must be closed in order for you to lock it."))
else if(key.key_id != src.lock_id)
to_chat(user,span_warning("The [key] doesn't fit \the [src]'s lock!"))
else if(key.key_id == src.lock_id)
visible_message(span_notice("[user] [key.keyverb] \the [key] and [locked ? "unlocks" : "locks"] \the [src]."))
locked = !locked
playsound(src, keysound,100, 1)
return
if(istype(W,/obj/item/pickaxe) && breakable)
var/obj/item/pickaxe/digTool = W
visible_message(span_danger("[user] starts digging [src]!"))
if(do_after(user,digTool.digspeed*hardness, target = src) && src)
visible_message(span_danger("[user] finished digging [src]!"))
Dismantle()
else if(istype(W,/obj/item) && breakable) //not sure, can't not just weapons get passed to this proc?
hardness -= W.force/10
visible_message(span_danger("[user] hits [src] with [W]!"))
if(material == get_material_by_name(MAT_RESIN))
playsound(src, 'sound/effects/attackblob.ogg', 100, 1)
else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD) || get_material_by_name(MAT_HARDWOOD)))
playsound(src, 'sound/effects/woodcutting.ogg', 100, 1)
else
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
CheckHardness()
else if(W.has_tool_quality(TOOL_WELDER) && breakable)
var/obj/item/weldingtool/WT = W.get_welder()
if(material.ignition_point && WT.remove_fuel(0, user))
TemperatureAct(150)
else
attack_hand(user)
return
/obj/structure/simple_door/bullet_act(var/obj/item/projectile/Proj)
take_damage(Proj.damage/10)
CheckHardness()
/obj/structure/simple_door/take_damage(var/damage)
hardness -= damage/10
CheckHardness()
/obj/structure/simple_door/attack_generic(var/mob/user, var/damage, var/attack_verb)
visible_message(span_danger("[user] [attack_verb] the [src]!"))
if(material == get_material_by_name(MAT_RESIN))
playsound(src, 'sound/effects/attackblob.ogg', 100, 1)
else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD) || get_material_by_name(MAT_HARDWOOD)))
playsound(src, 'sound/effects/woodcutting.ogg', 100, 1)
else
playsound(src, 'sound/weapons/smash.ogg', 50, 1)
user.do_attack_animation(src)
hardness -= damage/10
CheckHardness()
/obj/structure/simple_door/proc/CheckHardness()
if(hardness <= 0)
Dismantle(1)
/obj/structure/simple_door/proc/Dismantle(devastated = 0)
material.place_dismantled_product(get_turf(src))
visible_message(span_danger("The [src] is destroyed!"))
qdel(src)
/obj/structure/simple_door/ex_act(severity = 1)
switch(severity)
if(1)
Dismantle(1)
if(2)
if(prob(20))
Dismantle(1)
else
hardness--
CheckHardness()
if(3)
hardness -= 0.1
CheckHardness()
return
/obj/structure/simple_door/process()
if(!material.radioactivity)
return
radiation_pulse(
src,
max_range = 5,
threshold = RAD_MEDIUM_INSULATION,
chance = round((material.radioactivity * 0.33), 0.1),
minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
strength = material.radioactivity
)
/obj/structure/simple_door/iron/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_IRON)
/obj/structure/simple_door/silver
rad_insulation = RAD_HEAVY_INSULATION
/obj/structure/simple_door/silver/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_SILVER)
/obj/structure/simple_door/gold
rad_insulation = RAD_HEAVY_INSULATION
/obj/structure/simple_door/gold/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_GOLD)
/obj/structure/simple_door/uranium
rad_insulation = RAD_NO_INSULATION
var/last_event = 0
/// Mutex to prevent infinite recursion when propagating radiation pulses
var/active = null
/obj/structure/simple_door/uranium/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_URANIUM)
START_PROCESSING(SSobj, src)
/obj/structure/simple_door/uranium/proc/radiate()
SIGNAL_HANDLER
if(active)
return
if(world.time <= last_event + 1.5 SECONDS)
return
active = TRUE
radiation_pulse(
src,
max_range = 3,
threshold = RAD_LIGHT_INSULATION,
chance = URANIUM_IRRADIATION_CHANCE,
minimum_exposure_time = URANIUM_RADIATION_MINIMUM_EXPOSURE_TIME,
strength = 5
)
last_event = world.time
active = FALSE
/obj/structure/simple_door/sandstone/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_SANDSTONE)
/obj/structure/simple_door/phoron/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_PHORON)
/obj/structure/simple_door/diamond
rad_insulation = RAD_EXTREME_INSULATION
/obj/structure/simple_door/diamond/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_DIAMOND)
//I was going to give wooden doors RAD_VERY_LIGHT_INSULATION but they need a proper parent instead of this garbage.
/obj/structure/simple_door/wood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_WOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/hardwood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_HARDWOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/sifwood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_SIFWOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/birchwood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_BIRCHWOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/pinewood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_PINEWOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/oakwood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_OAKWOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/acaciawood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_ACACIAWOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/redwood/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_REDWOOD)
knock_sound = 'sound/machines/door/knock_wood.wav'
/obj/structure/simple_door/resin/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_RESIN)
/obj/structure/simple_door/cult/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_CULT)
/obj/structure/simple_door/glamour/Initialize(mapload,var/material_name)
. = ..(mapload, material_name || MAT_GLAMOUR)
/obj/structure/simple_door/snowbrick/Initialize(mapload, var/material_name)
. = ..(mapload, material_name || MAT_SNOWBRICK)
/obj/structure/simple_door/cult/TryToSwitchState(atom/user)
if(isliving(user))
var/mob/living/L = user
if(!iscultist(L) && !istype(L, /mob/living/simple_mob/construct))
return
..()