mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-01-27 17:53:01 +00:00
316 lines
10 KiB
Plaintext
316 lines
10 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
|
|
|
|
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'
|
|
|
|
/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)
|
|
|
|
/* // CHOMPEDIT: disabling becaue alt-clicking to view a turf is pretty important.
|
|
/obj/structure/simple_door/AltClick(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) && 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
|
|
SSradiation.radiate(src, round(material.radioactivity/3))
|
|
|
|
/obj/structure/simple_door/iron/Initialize(mapload,var/material_name)
|
|
..(mapload, material_name || MAT_IRON)
|
|
|
|
/obj/structure/simple_door/silver/Initialize(mapload,var/material_name)
|
|
..(mapload, material_name || MAT_SILVER)
|
|
|
|
/obj/structure/simple_door/gold/Initialize(mapload,var/material_name)
|
|
..(mapload, material_name || MAT_GOLD)
|
|
|
|
/obj/structure/simple_door/uranium/Initialize(mapload,var/material_name)
|
|
..(mapload, material_name || MAT_URANIUM)
|
|
|
|
/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/Initialize(mapload,var/material_name)
|
|
..(mapload, material_name || MAT_DIAMOND)
|
|
|
|
/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)
|
|
|
|
/obj/structure/simple_door/sifwood/Initialize(mapload,var/material_name)
|
|
..(mapload, material_name || MAT_SIFWOOD)
|
|
|
|
/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/cult/TryToSwitchState(atom/user)
|
|
if(isliving(user))
|
|
var/mob/living/L = user
|
|
if(!iscultist(L) && !istype(L, /mob/living/simple_mob/construct))
|
|
return
|
|
..()
|
|
|
|
// CHOMPedit start: Allows removing resin doors.
|
|
/obj/structure/simple_door/resin/attack_hand(mob/user as mob)
|
|
usr.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
|
|
if (HULK in usr.mutations)
|
|
visible_message(span_warning("[usr] destroys the [name]!"))
|
|
hardness = 0
|
|
else
|
|
|
|
// Carbons can get straight through these.
|
|
if(istype(usr,/mob/living/carbon))
|
|
if(user.a_intent == I_HURT)
|
|
var/mob/living/carbon/M = usr
|
|
if(locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)
|
|
visible_message (span_warning("[usr] strokes the [name] and it melts away!"), 1)
|
|
hardness = 0
|
|
CheckHardness()
|
|
return
|
|
else
|
|
visible_message(span_warning("[usr] tears at the [name]!"))
|
|
hardness -= 2
|
|
CheckHardness()
|
|
return
|
|
CheckHardness()
|
|
TryToSwitchState(user)
|
|
return
|
|
// CHOMPedit end.
|