mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-05-18 12:50:29 +01:00
cbc4151bfb
* 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
360 lines
12 KiB
Plaintext
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
|
|
..()
|