mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-01-03 22:22:31 +00:00
441 lines
12 KiB
Plaintext
441 lines
12 KiB
Plaintext
/obj/machinery/door/window
|
|
name = "interior door"
|
|
desc = "A strong door."
|
|
icon = 'icons/obj/doors/windoor.dmi'
|
|
icon_state = "left"
|
|
var/base_state = "left"
|
|
var/health = 150.0 //If you change this, consider changing ../door/window/brigdoor/ health at the bottom of this .dm file
|
|
visible = 0.0
|
|
flags = ON_BORDER
|
|
opacity = 0
|
|
var/obj/item/weapon/airlock_electronics/electronics = null
|
|
|
|
/obj/machinery/door/window/New()
|
|
..()
|
|
|
|
if (src.req_access && src.req_access.len)
|
|
src.icon_state = "[src.icon_state]"
|
|
src.base_state = src.icon_state
|
|
|
|
if(!color)
|
|
color = color_windows(src)
|
|
return
|
|
|
|
/obj/machinery/door/window/Destroy()
|
|
density = 0
|
|
if(health == 0)
|
|
playsound(src, "shatter", 70, 1)
|
|
if(electronics)
|
|
qdel(electronics)
|
|
electronics = null
|
|
return ..()
|
|
|
|
|
|
/obj/machinery/door/window/proc/open_and_close()
|
|
open()
|
|
if(src.check_access(null))
|
|
sleep(50)
|
|
else //secure doors close faster
|
|
sleep(20)
|
|
close()
|
|
|
|
/obj/machinery/door/window/Bumped(atom/movable/AM as mob|obj)
|
|
if( operating || !src.density )
|
|
return
|
|
if (!( ismob(AM) ))
|
|
var/obj/machinery/bot/bot = AM
|
|
if(istype(bot))
|
|
if(src.check_access(bot.botcard))
|
|
open_and_close()
|
|
else
|
|
flick(text("[]deny", src.base_state), src)
|
|
else if(istype(AM, /obj/mecha))
|
|
var/obj/mecha/mecha = AM
|
|
if(mecha.occupant && src.allowed(mecha.occupant))
|
|
open_and_close()
|
|
else
|
|
flick(text("[]deny", src.base_state), src)
|
|
return
|
|
if (!( ticker ))
|
|
return
|
|
var/mob/M = AM
|
|
if(!M.restrained() && !M.small)
|
|
bumpopen(M)
|
|
return
|
|
|
|
/obj/machinery/door/window/bumpopen(mob/user as mob)
|
|
if( operating || !src.density )
|
|
return
|
|
src.add_fingerprint(user)
|
|
if(!src.requiresID())
|
|
user = null
|
|
|
|
if(allowed(user))
|
|
open_and_close()
|
|
else
|
|
flick(text("[]deny", src.base_state), src)
|
|
return
|
|
|
|
/obj/machinery/door/window/CanPass(atom/movable/mover, turf/target, height=0)
|
|
if(istype(mover) && mover.checkpass(PASSGLASS))
|
|
return 1
|
|
if(get_dir(loc, target) == dir) //Make sure looking at appropriate border
|
|
return !density
|
|
else
|
|
return 1
|
|
|
|
/obj/machinery/door/window/CanAtmosPass(var/turf/T)
|
|
if(get_dir(loc, T) == dir)
|
|
return !density
|
|
else
|
|
return 1
|
|
|
|
//used in the AStar algorithm to determinate if the turf the door is on is passable
|
|
/obj/machinery/door/window/CanAStarPass(var/obj/item/weapon/card/id/ID, var/to_dir)
|
|
return !density || (dir != to_dir) || check_access(ID)
|
|
|
|
/obj/machinery/door/window/CheckExit(atom/movable/mover as mob|obj, turf/target as turf)
|
|
if(istype(mover) && mover.checkpass(PASSGLASS))
|
|
return 1
|
|
if(get_dir(loc, target) == dir)
|
|
return !density
|
|
else
|
|
return 1
|
|
|
|
/obj/machinery/door/window/open(var/forced=0)
|
|
if (src.operating == 1) //doors can still open when emag-disabled
|
|
return 0
|
|
if (!ticker)
|
|
return 0
|
|
if(!forced)
|
|
if(stat & NOPOWER)
|
|
return 0
|
|
if(forced < 2)
|
|
if(emagged)
|
|
return 0
|
|
if(!src.operating) //in case of emag
|
|
src.operating = 1
|
|
flick(text("[]opening", src.base_state), src)
|
|
playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1)
|
|
src.icon_state = text("[]open", src.base_state)
|
|
sleep(10)
|
|
|
|
src.density = 0
|
|
// src.sd_set_opacity(0) //TODO: why is this here? Opaque windoors? ~Carn
|
|
air_update_turf(1)
|
|
update_freelok_sight()
|
|
|
|
if(operating == 1) //emag again
|
|
src.operating = 0
|
|
return 1
|
|
|
|
/obj/machinery/door/window/close(var/forced=0)
|
|
if (src.operating)
|
|
return 0
|
|
if(!forced)
|
|
if(stat & NOPOWER)
|
|
return 0
|
|
if(forced < 2)
|
|
if(emagged)
|
|
return 0
|
|
src.operating = 1
|
|
flick(text("[]closing", src.base_state), src)
|
|
playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1)
|
|
src.icon_state = src.base_state
|
|
|
|
src.density = 1
|
|
// if(src.visible)
|
|
// set_opacity(1) //TODO: why is this here? Opaque windoors? ~Carn
|
|
air_update_turf(1)
|
|
update_freelok_sight()
|
|
sleep(10)
|
|
|
|
src.operating = 0
|
|
return 1
|
|
|
|
/obj/machinery/door/window/proc/take_damage(var/damage)
|
|
src.health = max(0, src.health - damage)
|
|
if (src.health <= 0)
|
|
var/debris = list(
|
|
new /obj/item/weapon/shard(src.loc),
|
|
new /obj/item/weapon/shard(src.loc),
|
|
new /obj/item/stack/rods(src.loc, 2),
|
|
new /obj/item/stack/cable_coil(src.loc, 2)
|
|
)
|
|
for(var/obj/fragment in debris)
|
|
transfer_fingerprints_to(fragment)
|
|
src.density = 0
|
|
qdel(src)
|
|
return
|
|
|
|
/obj/machinery/door/window/bullet_act(var/obj/item/projectile/Proj)
|
|
if(Proj.damage)
|
|
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
|
take_damage(round(Proj.damage / 2))
|
|
..()
|
|
|
|
//When an object is thrown at the window
|
|
/obj/machinery/door/window/hitby(AM as mob|obj)
|
|
|
|
..()
|
|
var/tforce = 0
|
|
if(ismob(AM))
|
|
tforce = 40
|
|
else
|
|
tforce = AM:throwforce
|
|
playsound(src.loc, 'sound/effects/Glasshit.ogg', 100, 1)
|
|
take_damage(tforce)
|
|
//..() //Does this really need to be here twice? The parent proc doesn't even do anything yet. - Nodrak
|
|
return
|
|
|
|
/obj/machinery/door/window/mech_melee_attack(obj/mecha/M)
|
|
if(M.damtype == "brute")
|
|
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
|
|
M.occupant_message("<span class='danger'>You hit [src].</span>")
|
|
visible_message("<span class='danger'>[src] has been hit by [M.name].</span>")
|
|
take_damage(M.force)
|
|
return
|
|
|
|
/obj/machinery/door/window/attack_ai(mob/user as mob)
|
|
return src.attack_hand(user)
|
|
|
|
/obj/machinery/door/window/proc/attack_generic(mob/user as mob, damage = 0)
|
|
if(src.operating)
|
|
return
|
|
user.changeNext_move(CLICK_CD_MELEE)
|
|
user.do_attack_animation(src)
|
|
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
|
|
user.visible_message("<span class='danger'>[user] smashes against the [src.name].</span>", \
|
|
"<span class='userdanger'>[user] smashes against the [src.name].</span>")
|
|
take_damage(damage)
|
|
|
|
/obj/machinery/door/window/attack_alien(mob/living/user as mob)
|
|
|
|
if(islarva(user))
|
|
return
|
|
attack_generic(user, 25)
|
|
|
|
/obj/machinery/door/window/attack_animal(mob/living/user as mob)
|
|
if(!isanimal(user))
|
|
return
|
|
var/mob/living/simple_animal/M = user
|
|
if(M.melee_damage_upper <= 0)
|
|
return
|
|
attack_generic(M, M.melee_damage_upper)
|
|
|
|
|
|
/obj/machinery/door/window/attack_slime(mob/living/carbon/slime/user as mob)
|
|
if(!user.is_adult)
|
|
return
|
|
attack_generic(user, 25)
|
|
|
|
|
|
/obj/machinery/door/window/attack_hand(mob/user as mob)
|
|
return src.attackby(user, user)
|
|
|
|
/obj/machinery/door/window/emag_act(user as mob, weapon as obj)
|
|
if(density)
|
|
src.operating = -1
|
|
flick("[src.base_state]spark", src)
|
|
sleep(6)
|
|
desc += "<BR><span class='warning'>Its access panel is smoking slightly.</span>"
|
|
if(istype(weapon, /obj/item/weapon/melee/energy/blade))
|
|
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
|
spark_system.set_up(5, 0, src.loc)
|
|
spark_system.start()
|
|
playsound(src.loc, "sparks", 50, 1)
|
|
playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
|
visible_message("<span class='warning'> The glass door was sliced open by [user]!</span>")
|
|
open(2)
|
|
emagged = 1
|
|
return 1
|
|
open()
|
|
emagged = 1
|
|
return 1
|
|
|
|
/obj/machinery/door/window/attackby(obj/item/weapon/I as obj, mob/living/user as mob, params)
|
|
|
|
//If it's in the process of opening/closing, ignore the click
|
|
if (src.operating)
|
|
return
|
|
|
|
add_fingerprint(user)
|
|
|
|
//Ninja swords? You may pass.
|
|
if (src.density && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade)))
|
|
emag_act(user,I)
|
|
return 1
|
|
|
|
if(istype(I, /obj/item/weapon/screwdriver))
|
|
if(src.density || src.operating)
|
|
user << "<span class='warning'>You need to open the door to access the maintenance panel.</span>"
|
|
return
|
|
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
|
|
src.p_open = !( src.p_open )
|
|
user << "<span class='notice'>You [p_open ? "open":"close"] the maintenance panel of the [src.name].</span>"
|
|
return
|
|
|
|
if(istype(I, /obj/item/weapon/crowbar))
|
|
if(p_open && !src.density && !src.operating)
|
|
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
|
|
user.visible_message("<span class='warning'>[user] removes the electronics from the [src.name].</span>", \
|
|
"You start to remove electronics from the [src.name].")
|
|
if(do_after(user,40))
|
|
if(src.p_open && !src.density && !src.operating && src.loc)
|
|
var/obj/structure/windoor_assembly/WA = new /obj/structure/windoor_assembly(src.loc)
|
|
switch(base_state)
|
|
if("left")
|
|
WA.facing = "l"
|
|
if("right")
|
|
WA.facing = "r"
|
|
if("leftsecure")
|
|
WA.facing = "l"
|
|
WA.secure = 1
|
|
if("rightsecure")
|
|
WA.facing = "r"
|
|
WA.secure = 1
|
|
WA.anchored = 1
|
|
WA.state= "02"
|
|
WA.dir = src.dir
|
|
WA.ini_dir = src.dir
|
|
WA.update_icon()
|
|
WA.created_name = src.name
|
|
|
|
if(emagged)
|
|
user << "<span class='warning'>You discard the damaged electronics.</span>"
|
|
qdel(src)
|
|
return
|
|
|
|
user << "<span class='notice'>You removed the airlock electronics!</span>"
|
|
|
|
var/obj/item/weapon/airlock_electronics/ae
|
|
if(!electronics)
|
|
ae = new/obj/item/weapon/airlock_electronics( src.loc )
|
|
if(!src.req_access)
|
|
src.check_access()
|
|
if(src.req_access.len)
|
|
ae.conf_access = src.req_access
|
|
else if (src.req_one_access.len)
|
|
ae.conf_access = src.req_one_access
|
|
ae.one_access = 1
|
|
else
|
|
ae = electronics
|
|
electronics = null
|
|
ae.loc = src.loc
|
|
|
|
qdel(src)
|
|
return
|
|
|
|
|
|
//If windoor is unpowered, crowbar, fireaxe and armblade can force it.
|
|
if(istype(I, /obj/item/weapon/crowbar) || istype(I, /obj/item/weapon/twohanded/fireaxe))
|
|
if(stat & NOPOWER)
|
|
if(src.density)
|
|
open(2)
|
|
else
|
|
close(2)
|
|
return
|
|
|
|
//If it's a weapon, smash windoor. Unless it's an id card, agent card, ect.. then ignore it (Cards really shouldnt damage a door anyway)
|
|
if(src.density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card) )
|
|
user.changeNext_move(CLICK_CD_MELEE)
|
|
user.do_attack_animation(src)
|
|
if( (I.flags&NOBLUDGEON) || !I.force )
|
|
return
|
|
var/aforce = I.force
|
|
playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
|
|
visible_message("<span class='danger'>\The [src] has been hit by [user] with [I].</span>")
|
|
if(I.damtype == BURN || I.damtype == BRUTE)
|
|
take_damage(aforce)
|
|
return
|
|
|
|
if (!src.requiresID())
|
|
//don't care who they are or what they have, act as if they're NOTHING
|
|
user = null
|
|
|
|
if (src.allowed(user))
|
|
if (src.density)
|
|
open()
|
|
else
|
|
close()
|
|
|
|
else if (src.density)
|
|
flick(text("[]deny", src.base_state), src)
|
|
|
|
return
|
|
|
|
|
|
|
|
/obj/machinery/door/window/brigdoor
|
|
name = "secure door"
|
|
icon = 'icons/obj/doors/windoor.dmi'
|
|
icon_state = "leftsecure"
|
|
base_state = "leftsecure"
|
|
var/id = null
|
|
health = 300.0 //Stronger doors for prison (regular window door health is 200)
|
|
|
|
|
|
/obj/machinery/door/window/northleft
|
|
dir = NORTH
|
|
|
|
/obj/machinery/door/window/eastleft
|
|
dir = EAST
|
|
|
|
/obj/machinery/door/window/westleft
|
|
dir = WEST
|
|
|
|
/obj/machinery/door/window/southleft
|
|
dir = SOUTH
|
|
|
|
/obj/machinery/door/window/northright
|
|
dir = NORTH
|
|
icon_state = "right"
|
|
base_state = "right"
|
|
|
|
/obj/machinery/door/window/eastright
|
|
dir = EAST
|
|
icon_state = "right"
|
|
base_state = "right"
|
|
|
|
/obj/machinery/door/window/westright
|
|
dir = WEST
|
|
icon_state = "right"
|
|
base_state = "right"
|
|
|
|
/obj/machinery/door/window/southright
|
|
dir = SOUTH
|
|
icon_state = "right"
|
|
base_state = "right"
|
|
|
|
/obj/machinery/door/window/brigdoor/northleft
|
|
dir = NORTH
|
|
|
|
/obj/machinery/door/window/brigdoor/eastleft
|
|
dir = EAST
|
|
|
|
/obj/machinery/door/window/brigdoor/westleft
|
|
dir = WEST
|
|
|
|
/obj/machinery/door/window/brigdoor/southleft
|
|
dir = SOUTH
|
|
|
|
/obj/machinery/door/window/brigdoor/northright
|
|
dir = NORTH
|
|
icon_state = "rightsecure"
|
|
base_state = "rightsecure"
|
|
|
|
/obj/machinery/door/window/brigdoor/eastright
|
|
dir = EAST
|
|
icon_state = "rightsecure"
|
|
base_state = "rightsecure"
|
|
|
|
/obj/machinery/door/window/brigdoor/westright
|
|
dir = WEST
|
|
icon_state = "rightsecure"
|
|
base_state = "rightsecure"
|
|
|
|
/obj/machinery/door/window/brigdoor/southright
|
|
dir = SOUTH
|
|
icon_state = "rightsecure"
|
|
base_state = "rightsecure"
|