mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-15 17:13:46 +01:00
fixes merge conflict
This commit is contained in:
@@ -13,6 +13,27 @@
|
||||
|
||||
/obj/structure/alien
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
max_integrity = 100
|
||||
|
||||
/obj/structure/alien/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
|
||||
if(damage_flag == "melee")
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
damage_amount *= 0.25
|
||||
if(BURN)
|
||||
damage_amount *= 2
|
||||
. = ..()
|
||||
|
||||
/obj/structure/alien/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
if(damage_amount)
|
||||
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
|
||||
else
|
||||
playsound(src, 'sound/weapons/tap.ogg', 50, 1)
|
||||
if(BURN)
|
||||
if(damage_amount)
|
||||
playsound(loc, 'sound/items/welder.ogg', 100, 1)
|
||||
|
||||
/*
|
||||
* Resin
|
||||
@@ -22,15 +43,15 @@
|
||||
desc = "Looks like some kind of thick resin."
|
||||
icon = 'icons/obj/smooth_structures/alien/resin_wall.dmi'
|
||||
icon_state = "resin"
|
||||
density = 1
|
||||
opacity = 1
|
||||
anchored = 1
|
||||
density = TRUE
|
||||
opacity = TRUE
|
||||
anchored = TRUE
|
||||
canSmoothWith = list(/obj/structure/alien/resin)
|
||||
var/health = 200
|
||||
var/resintype = null
|
||||
max_integrity = 200
|
||||
smooth = SMOOTH_TRUE
|
||||
var/resintype = null
|
||||
|
||||
/obj/structure/alien/resin/initialize()
|
||||
/obj/structure/alien/resin/Initialize()
|
||||
air_update_turf(1)
|
||||
..()
|
||||
|
||||
@@ -60,7 +81,7 @@
|
||||
/obj/structure/alien/resin/wall/shadowling //For chrysalis
|
||||
name = "chrysalis wall"
|
||||
desc = "Some sort of purple substance in an egglike shape. It pulses and throbs from within and seems impenetrable."
|
||||
health = INFINITY
|
||||
max_integrity = INFINITY
|
||||
|
||||
/obj/structure/alien/resin/membrane
|
||||
name = "resin membrane"
|
||||
@@ -68,80 +89,11 @@
|
||||
icon = 'icons/obj/smooth_structures/alien/resin_membrane.dmi'
|
||||
icon_state = "membrane0"
|
||||
opacity = 0
|
||||
health = 120
|
||||
max_integrity = 160
|
||||
resintype = "membrane"
|
||||
canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane)
|
||||
|
||||
/obj/structure/alien/resin/proc/healthcheck()
|
||||
if(health <=0)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/structure/alien/resin/bullet_act(obj/item/projectile/Proj)
|
||||
if(Proj.damage_type == BRUTE || Proj.damage_type == BURN)
|
||||
health -= Proj.damage
|
||||
..()
|
||||
healthcheck()
|
||||
|
||||
|
||||
/obj/structure/alien/resin/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1)
|
||||
health -= 150
|
||||
if(2)
|
||||
health -= 100
|
||||
if(3)
|
||||
health -= 50
|
||||
healthcheck()
|
||||
|
||||
|
||||
/obj/structure/alien/resin/blob_act()
|
||||
health -= 50
|
||||
healthcheck()
|
||||
|
||||
|
||||
/obj/structure/alien/resin/hitby(atom/movable/AM)
|
||||
..()
|
||||
var/tforce = 0
|
||||
if(ismob(AM))
|
||||
tforce = 10
|
||||
else if(isobj(AM))
|
||||
var/obj/O = AM
|
||||
tforce = O.throwforce
|
||||
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
|
||||
health -= tforce
|
||||
healthcheck()
|
||||
|
||||
/obj/structure/alien/resin/attack_hand(mob/living/user)
|
||||
if(HULK in user.mutations)
|
||||
user.do_attack_animation(src)
|
||||
user.visible_message("<span class='danger'>[user] destroys [src]!</span>")
|
||||
health = 0
|
||||
healthcheck()
|
||||
|
||||
|
||||
/obj/structure/alien/resin/attack_alien(mob/living/user)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
if(islarva(user))
|
||||
return
|
||||
user.visible_message("<span class='danger'>[user] claws at the resin!</span>")
|
||||
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
|
||||
health -= 50
|
||||
if(health <= 0)
|
||||
user.visible_message("<span class='danger'>[user] slices the [name] apart!</span>")
|
||||
healthcheck()
|
||||
|
||||
|
||||
/obj/structure/alien/resin/attackby(obj/item/I, mob/living/user, params)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
health -= I.force
|
||||
playsound(loc, 'sound/effects/attackblob.ogg', 100, 1)
|
||||
healthcheck()
|
||||
..()
|
||||
|
||||
|
||||
/obj/structure/alien/resin/CanPass(atom/movable/mover, turf/target, height=0)
|
||||
/obj/structure/alien/resin/CanPass(atom/movable/mover, turf/target)
|
||||
if(istype(mover) && mover.checkpass(PASSGLASS))
|
||||
return !opacity
|
||||
return !density
|
||||
@@ -157,11 +109,11 @@
|
||||
gender = PLURAL
|
||||
name = "resin floor"
|
||||
desc = "A thick resin surface covers the floor."
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
layer = TURF_LAYER
|
||||
icon_state = "weeds"
|
||||
anchored = 1
|
||||
density = 0
|
||||
layer = 2
|
||||
var/health = 15
|
||||
max_integrity = 15
|
||||
var/obj/structure/alien/weeds/node/linked_node = null
|
||||
var/static/list/weedImageCache
|
||||
|
||||
@@ -204,39 +156,9 @@
|
||||
|
||||
new /obj/structure/alien/weeds(T, linked_node)
|
||||
|
||||
|
||||
/obj/structure/alien/weeds/ex_act(severity)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/structure/alien/weeds/attackby(obj/item/I, mob/user, params)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
if(I.attack_verb.len)
|
||||
visible_message("<span class='danger'>[user] has [pick(I.attack_verb)] [src] with [I]!</span>")
|
||||
else
|
||||
visible_message("<span class='danger'>[user] has attacked [src] with [I]!</span>")
|
||||
|
||||
var/damage = I.force / 4
|
||||
if(istype(I, /obj/item/weldingtool))
|
||||
var/obj/item/weldingtool/WT = I
|
||||
if(WT.remove_fuel(0, user))
|
||||
damage = 15
|
||||
playsound(loc, WT.usesound, 100, 1)
|
||||
|
||||
health -= damage
|
||||
healthcheck()
|
||||
|
||||
|
||||
/obj/structure/alien/weeds/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/obj/structure/alien/weeds/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > 300)
|
||||
health -= 5
|
||||
healthcheck()
|
||||
|
||||
take_damage(5, BURN, 0, 0)
|
||||
|
||||
/obj/structure/alien/weeds/proc/updateWeedOverlays()
|
||||
|
||||
@@ -303,9 +225,10 @@
|
||||
name = "egg"
|
||||
desc = "A large mottled egg."
|
||||
icon_state = "egg_growing"
|
||||
density = 0
|
||||
anchored = 1
|
||||
var/health = 100
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
max_integrity = 100
|
||||
integrity_failure = 5
|
||||
var/status = GROWING //can be GROWING, GROWN or BURST; all mutually exclusive
|
||||
layer = MOB_LAYER
|
||||
|
||||
@@ -315,6 +238,8 @@
|
||||
..()
|
||||
spawn(rand(MIN_GROWTH_TIME, MAX_GROWTH_TIME))
|
||||
Grow()
|
||||
if(status == BURST)
|
||||
obj_integrity = integrity_failure
|
||||
|
||||
/obj/structure/alien/egg/attack_alien(mob/living/carbon/alien/user)
|
||||
return attack_hand(user)
|
||||
@@ -346,7 +271,7 @@
|
||||
icon_state = "egg"
|
||||
status = GROWN
|
||||
|
||||
/obj/structure/alien/egg/proc/Burst(kill = 1) //drops and kills the hugger if any is remaining
|
||||
/obj/structure/alien/egg/proc/Burst(kill = TRUE) //drops and kills the hugger if any is remaining
|
||||
if(status == GROWN || status == GROWING)
|
||||
icon_state = "egg_hatched"
|
||||
flick("egg_opening", src)
|
||||
@@ -364,45 +289,13 @@
|
||||
child.Attach(M)
|
||||
break
|
||||
|
||||
/obj/structure/alien/egg/bullet_act(obj/item/projectile/Proj)
|
||||
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
health -= Proj.damage
|
||||
..()
|
||||
healthcheck()
|
||||
|
||||
|
||||
/obj/structure/alien/egg/attackby(obj/item/I, mob/user, params)
|
||||
if(I.attack_verb.len)
|
||||
visible_message("<span class='danger'>[user] has [pick(I.attack_verb)] [src] with [I]!</span>")
|
||||
else
|
||||
visible_message("<span class='danger'>[user] has attacked [src] with [I]!</span>")
|
||||
|
||||
var/damage = I.force / 4
|
||||
if(istype(I, /obj/item/weldingtool))
|
||||
var/obj/item/weldingtool/WT = I
|
||||
|
||||
if(WT.remove_fuel(0, user))
|
||||
damage = 15
|
||||
playsound(loc, WT.usesound, 100, 1)
|
||||
|
||||
health -= damage
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
healthcheck()
|
||||
|
||||
|
||||
/obj/structure/alien/egg/proc/healthcheck()
|
||||
if(health <= 0)
|
||||
if(status != BURST && status != BURSTING)
|
||||
Burst()
|
||||
else if(status == BURST && prob(50))
|
||||
qdel(src) //Remove the egg after it has been hit after bursting.
|
||||
|
||||
/obj/structure/alien/egg/obj_break(damage_flag)
|
||||
if(status != BURST)
|
||||
Burst(kill = TRUE)
|
||||
|
||||
/obj/structure/alien/egg/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > 500)
|
||||
health -= 5
|
||||
healthcheck()
|
||||
|
||||
take_damage(5, BURN, 0, 0)
|
||||
|
||||
/obj/structure/alien/egg/HasProximity(atom/movable/AM)
|
||||
if(status == GROWN)
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
to_chat(user, "<span class='warning'>Nothing interesting happens!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You emag the barsign. Takeover in progress...</span>")
|
||||
addtimer(src, "post_emag", 100)
|
||||
addtimer(CALLBACK(src, .proc/post_emag), 100)
|
||||
|
||||
/obj/structure/sign/barsign/proc/post_emag()
|
||||
if(broken || emagged)
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
new /obj/item/clothing/suit/storage/hazardvest(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/multitool(src)
|
||||
new /obj/item/holosign_creator/engineering(src)
|
||||
new /obj/item/flash(src)
|
||||
new /obj/item/taperoll/engineering(src)
|
||||
new /obj/item/clothing/head/beret/eng(src)
|
||||
new /obj/item/door_remote/chief_engineer(src)
|
||||
new /obj/item/rpd(src)
|
||||
@@ -102,6 +102,7 @@
|
||||
new /obj/item/storage/backpack/satchel_eng(src)
|
||||
new /obj/item/storage/backpack/duffel/engineering(src)
|
||||
new /obj/item/storage/toolbox/mechanical(src)
|
||||
new /obj/item/holosign_creator/engineering(src)
|
||||
new /obj/item/radio/headset/headset_eng(src)
|
||||
new /obj/item/clothing/under/rank/engineer(src)
|
||||
new /obj/item/clothing/under/rank/engineer/skirt(src)
|
||||
@@ -109,7 +110,6 @@
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/clothing/glasses/meson(src)
|
||||
new /obj/item/cartridge/engineering(src)
|
||||
new /obj/item/taperoll/engineering(src)
|
||||
new /obj/item/clothing/head/beret/eng(src)
|
||||
|
||||
|
||||
@@ -128,7 +128,6 @@
|
||||
new /obj/item/radio/headset/headset_eng(src)
|
||||
new /obj/item/cartridge/atmos(src)
|
||||
new /obj/item/storage/toolbox/mechanical(src)
|
||||
new /obj/item/taperoll/engineering(src)
|
||||
if(prob(50))
|
||||
new /obj/item/storage/backpack/industrial(src)
|
||||
else
|
||||
@@ -138,6 +137,7 @@
|
||||
new /obj/item/clothing/suit/storage/hazardvest(src)
|
||||
new /obj/item/clothing/mask/gas(src)
|
||||
new /obj/item/tank/emergency_oxygen/engi(src)
|
||||
new /obj/item/holosign_creator/atmos(src)
|
||||
new /obj/item/watertank/atmos(src)
|
||||
new /obj/item/clothing/suit/fire/atmos(src)
|
||||
new /obj/item/clothing/head/hardhat/atmos(src)
|
||||
|
||||
@@ -115,11 +115,11 @@
|
||||
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
|
||||
new /obj/item/storage/lockbox/mindshield(src)
|
||||
new /obj/item/storage/box/flashbangs(src)
|
||||
new /obj/item/holosign_creator/security(src)
|
||||
new /obj/item/clothing/mask/gas/sechailer/hos(src)
|
||||
new /obj/item/shield/riot/tele(src)
|
||||
new /obj/item/melee/baton/loaded(src)
|
||||
new /obj/item/storage/belt/security/sec(src)
|
||||
new /obj/item/taperoll/police(src)
|
||||
new /obj/item/gun/energy/gun/hos(src)
|
||||
new /obj/item/door_remote/head_of_security(src)
|
||||
new /obj/item/reagent_containers/food/drinks/mug/hos(src)
|
||||
@@ -151,8 +151,8 @@
|
||||
new /obj/item/clothing/under/rank/warden/corp(src)
|
||||
new /obj/item/clothing/under/rank/warden/skirt(src)
|
||||
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
|
||||
new /obj/item/holosign_creator/security(src)
|
||||
new /obj/item/clothing/mask/gas/sechailer/warden(src)
|
||||
new /obj/item/taperoll/police(src)
|
||||
new /obj/item/storage/box/zipties(src)
|
||||
new /obj/item/storage/box/flashbangs(src)
|
||||
new /obj/item/reagent_containers/spray/pepper(src)
|
||||
@@ -186,11 +186,11 @@
|
||||
new /obj/item/flash(src)
|
||||
new /obj/item/grenade/flashbang(src)
|
||||
new /obj/item/storage/belt/security/sec(src)
|
||||
new /obj/item/holosign_creator/security(src)
|
||||
new /obj/item/clothing/mask/gas/sechailer(src)
|
||||
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
|
||||
new /obj/item/clothing/head/helmet(src)
|
||||
new /obj/item/melee/baton/loaded(src)
|
||||
new /obj/item/taperoll/police(src)
|
||||
|
||||
|
||||
/obj/structure/closet/secure_closet/brigdoc
|
||||
@@ -344,10 +344,10 @@
|
||||
new /obj/item/ammo_box/c38(src)
|
||||
new /obj/item/ammo_box/c38(src)
|
||||
new /obj/item/gun/projectile/revolver/detective(src)
|
||||
new /obj/item/taperoll/police(src)
|
||||
new /obj/item/clothing/accessory/holster/armpit(src)
|
||||
new /obj/item/clothing/glasses/sunglasses/yeah(src)
|
||||
new /obj/item/flashlight/seclite(src)
|
||||
new /obj/item/holosign_creator/security(src)
|
||||
new /obj/item/clothing/accessory/black(src)
|
||||
new /obj/item/taperecorder(src)
|
||||
new /obj/item/storage/box/tapes(src)
|
||||
|
||||
@@ -295,7 +295,7 @@ var/global/list/captain_display_cases = list()
|
||||
else
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
user.do_attack_animation(src, ATTACK_EFFECT_KICK)
|
||||
user.visible_message("<span class='danger'>[user.name] kicks \the [src]!</span>", \
|
||||
"<span class='danger'>You kick \the [src]!</span>", \
|
||||
"You hear glass crack.")
|
||||
@@ -321,7 +321,7 @@ var/global/list/captain_display_cases = list()
|
||||
to_chat(src, "[bicon(src)] <span class='warning'>\The [src] is empty!</span>")
|
||||
else
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.visible_message("[user.name] gently runs \his hands over [src] in appreciation of its contents.", \
|
||||
user.visible_message("[user.name] gently runs [user.p_their()] hands over [src] in appreciation of its contents.", \
|
||||
"You gently run your hands over [src] in appreciation of its contents.", \
|
||||
"You hear someone streaking glass with their greasy hands.")
|
||||
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
var/obj/item/storage/toolbox/mechanical/mybluetoolbox = null
|
||||
var/obj/item/storage/toolbox/electrical/myyellowtoolbox = null
|
||||
var/obj/item/storage/toolbox/emergency/myredtoolbox = null
|
||||
var/obj/item/taperoll/engineering/myengitape = null
|
||||
|
||||
/obj/structure/engineeringcart/Destroy()
|
||||
QDEL_NULL(myglass)
|
||||
@@ -22,7 +21,6 @@
|
||||
QDEL_NULL(mybluetoolbox)
|
||||
QDEL_NULL(myyellowtoolbox)
|
||||
QDEL_NULL(myredtoolbox)
|
||||
QDEL_NULL(myengitape)
|
||||
return ..()
|
||||
|
||||
/obj/structure/engineeringcart/proc/put_in_cart(obj/item/I, mob/user)
|
||||
@@ -83,13 +81,6 @@
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, fail_msg)
|
||||
else if(istype(I, /obj/item/taperoll/engineering/))
|
||||
if(!myengitape)
|
||||
put_in_cart(I, user)
|
||||
myengitape=I
|
||||
update_icon()
|
||||
else
|
||||
to_chat(user, fail_msg)
|
||||
else if(istype(I, /obj/item/wrench))
|
||||
if(!anchored && !isinspace())
|
||||
playsound(src.loc, I.usesound, 50, 1)
|
||||
@@ -125,8 +116,6 @@
|
||||
dat += "<a href='?src=[UID()];redtoolbox=1'>[myredtoolbox.name]</a><br>"
|
||||
if(myyellowtoolbox)
|
||||
dat += "<a href='?src=[UID()];yellowtoolbox=1'>[myyellowtoolbox.name]</a><br>"
|
||||
if(myengitape)
|
||||
dat += "<a href='?src=[UID()];engitape=1'>[myengitape.name]</a><br>"
|
||||
var/datum/browser/popup = new(user, "engicart", name, 240, 160)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
@@ -171,16 +160,12 @@
|
||||
user.put_in_hands(myyellowtoolbox)
|
||||
to_chat(user, "<span class='notice'>You take [myyellowtoolbox] from [src].</span>")
|
||||
myyellowtoolbox = null
|
||||
if(href_list["engitape"])
|
||||
if(myengitape)
|
||||
user.put_in_hands(myengitape)
|
||||
to_chat(user, "<span class='notice'>You take [myengitape] from [src].</span>")
|
||||
myengitape = null
|
||||
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/structure/engineeringcart/update_icon()
|
||||
overlays = null
|
||||
overlays.Cut()
|
||||
if(myglass)
|
||||
overlays += "cart_glass"
|
||||
if(mymetal)
|
||||
@@ -194,6 +179,4 @@
|
||||
if(myredtoolbox)
|
||||
overlays += "cart_redtoolbox"
|
||||
if(myyellowtoolbox)
|
||||
overlays += "cart_yellowtoolbox"
|
||||
if(myengitape)
|
||||
overlays += "cart_engitape"
|
||||
overlays += "cart_yellowtoolbox"
|
||||
@@ -1,116 +0,0 @@
|
||||
/obj/structure/window/full
|
||||
sheets = 2
|
||||
dir=SOUTHWEST
|
||||
level = 3
|
||||
|
||||
/obj/structure/window/full/CheckExit(atom/movable/O as mob|obj, target as turf)
|
||||
return 1
|
||||
|
||||
/obj/structure/window/full/CanPass(atom/movable/mover, turf/target, height=0)
|
||||
if(istype(mover) && mover.checkpass(PASSGLASS))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/structure/window/full/is_fulltile()
|
||||
return 1
|
||||
|
||||
//merges adjacent full-tile windows into one (blatant ripoff from game/smoothwall.dm)
|
||||
/obj/structure/window/full/update_icon()
|
||||
//A little cludge here, since I don't know how it will work with slim windows. Most likely VERY wrong.
|
||||
//this way it will only update full-tile ones
|
||||
//This spawn is here so windows get properly updated when one gets deleted.
|
||||
spawn(2)
|
||||
if(!src) return
|
||||
if(!is_fulltile())
|
||||
return
|
||||
var/junction = 0 //will be used to determine from which side the window is connected to other windows
|
||||
if(anchored)
|
||||
for(var/obj/structure/window/full/W in orange(src,1))
|
||||
if(W.anchored && W.density) //Only counts anchored, not-destroyed full-tile windows.
|
||||
if(abs(x-W.x)-abs(y-W.y) ) //doesn't count windows, placed diagonally to src
|
||||
junction |= get_dir(src,W)
|
||||
icon_state = "[basestate][junction]"
|
||||
return
|
||||
|
||||
/obj/structure/window/full/basic
|
||||
desc = "It looks thin and flimsy. A few knocks with... anything, really should shatter it."
|
||||
icon_state = "window"
|
||||
basestate = "window"
|
||||
|
||||
/obj/structure/window/full/plasmabasic
|
||||
name = "plasma window"
|
||||
desc = "A plasma-glass alloy window. It looks insanely tough to break. It appears it's also insanely tough to burn through."
|
||||
basestate = "plasmawindow"
|
||||
icon_state = "plasmawindow"
|
||||
shardtype = /obj/item/shard/plasma
|
||||
glasstype = /obj/item/stack/sheet/plasmaglass
|
||||
health = 240
|
||||
|
||||
/obj/structure/window/full/plasmabasic/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
if(exposed_temperature > T0C + 32000)
|
||||
hit(round(exposed_volume / 1000), 0)
|
||||
..()
|
||||
|
||||
/obj/structure/window/full/plasmareinforced
|
||||
name = "reinforced plasma window"
|
||||
desc = "A plasma-glass alloy window, with rods supporting it. It looks hopelessly tough to break. It also looks completely fireproof, considering how basic plasma windows are insanely fireproof."
|
||||
basestate = "plasmarwindow"
|
||||
icon_state = "plasmarwindow"
|
||||
shardtype = /obj/item/shard/plasma
|
||||
glasstype = /obj/item/stack/sheet/plasmaglass
|
||||
reinf = 1
|
||||
health = 320
|
||||
|
||||
/obj/structure/window/full/plasmareinforced/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
return
|
||||
|
||||
/obj/structure/window/full/reinforced
|
||||
name = "reinforced window"
|
||||
desc = "It looks rather strong. Might take a few good hits to shatter it."
|
||||
icon_state = "rwindow"
|
||||
basestate = "rwindow"
|
||||
health = 80
|
||||
reinf = 1
|
||||
|
||||
/obj/structure/window/full/reinforced/tinted
|
||||
name = "tinted window"
|
||||
desc = "It looks rather strong and opaque. Might take a few good hits to shatter it."
|
||||
icon_state = "twindow"
|
||||
basestate = "twindow"
|
||||
opacity = 1
|
||||
|
||||
/obj/structure/window/full/reinforced/tinted/frosted
|
||||
name = "frosted window"
|
||||
desc = "It looks rather strong and frosted over. Looks like it might take a few less hits then a normal reinforced window."
|
||||
icon_state = "fwindow"
|
||||
basestate = "fwindow"
|
||||
health = 60
|
||||
|
||||
/obj/structure/window/full/shuttle
|
||||
name = "shuttle window"
|
||||
desc = "It looks rather strong. Might take a few good hits to shatter it."
|
||||
icon = 'icons/obj/podwindows.dmi'
|
||||
icon_state = "window"
|
||||
basestate = "window"
|
||||
health = 160
|
||||
reinf = 1
|
||||
explosion_block = 3
|
||||
armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100)
|
||||
|
||||
/obj/structure/window/full/shuttle/New()
|
||||
..()
|
||||
color = null
|
||||
|
||||
/obj/structure/window/full/shuttle/update_icon() //icon_state has to be set manually
|
||||
return
|
||||
|
||||
/obj/structure/window/full/shuttle/shuttleRotate(rotation)
|
||||
..()
|
||||
var/matrix/M = transform
|
||||
M.Turn(rotation)
|
||||
transform = M
|
||||
|
||||
/obj/structure/window/full/shuttle/dark
|
||||
icon = 'icons/turf/shuttle.dmi'
|
||||
icon_state = "window5"
|
||||
basestate = "window5"
|
||||
@@ -69,18 +69,23 @@
|
||||
if(ismob(user))
|
||||
shock(user, 70)
|
||||
|
||||
/obj/structure/grille/attack_hand(mob/living/user)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
user.visible_message("<span class='warning'>[user] kicks [src].</span>", \
|
||||
"<span class='warning'>You kick [src].</span>", \
|
||||
"You hear twisting metal.")
|
||||
/obj/structure/grille/hulk_damage()
|
||||
return 60
|
||||
|
||||
if(shock(user, 70))
|
||||
/obj/structure/grille/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
if(!shock(user, 70))
|
||||
..(user, TRUE)
|
||||
return TRUE
|
||||
|
||||
/obj/structure/grille/attack_hand(mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(HULK in user.mutations)
|
||||
take_damage(60, BRUTE, "melee", 1)
|
||||
else
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src, ATTACK_EFFECT_KICK)
|
||||
user.visible_message("<span class='warning'>[user] hits [src].</span>")
|
||||
if(!shock(user, 70))
|
||||
take_damage(rand(5,10), BRUTE, "melee", 1)
|
||||
|
||||
/obj/structure/grille/attack_alien(mob/living/user)
|
||||
@@ -137,7 +142,7 @@
|
||||
return
|
||||
|
||||
//window placing begin
|
||||
else if(istype(W,/obj/item/stack/sheet/rglass) || istype(W,/obj/item/stack/sheet/glass) || istype(W,/obj/item/stack/sheet/plasmaglass) || istype(W,/obj/item/stack/sheet/plasmarglass))
|
||||
else if(is_glass_sheet(W))
|
||||
build_window(W, user)
|
||||
return
|
||||
//window placing end
|
||||
@@ -146,6 +151,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/structure/grille/proc/build_window(obj/item/stack/sheet/S, mob/user)
|
||||
var/dir_to_set = NORTH
|
||||
if(!istype(S) || !user)
|
||||
return
|
||||
if(broken)
|
||||
@@ -160,59 +166,40 @@
|
||||
if(!getRelativeDirection(src, user) && (user.loc != loc)) //essentially a cardinal direction adjacent or sharing same loc check
|
||||
to_chat(user, "<span class='warning'>You can't reach.</span>")
|
||||
return
|
||||
if(/obj/structure/window/full in loc) //check for a full window already present (blocks the whole tile)
|
||||
to_chat(user, "<span class='warning'>There is already a full window there.</span>")
|
||||
return
|
||||
var/selection = alert(user, "What type of window would you like to place?", "Window Construction", "One Direction", "Full", "Cancel")
|
||||
if(selection == "Cancel")
|
||||
return
|
||||
if(selection == "Full")
|
||||
if(S.get_amount() < 2)
|
||||
to_chat(user, "<span class='warning'>You need at least two sheets of glass for that!</span>")
|
||||
if(loc == user.loc)
|
||||
dir_to_set = user.dir
|
||||
else
|
||||
if(x == user.x)
|
||||
if(y > user.y)
|
||||
dir_to_set = SOUTH
|
||||
else
|
||||
dir_to_set = NORTH
|
||||
else if(y == user.y)
|
||||
if(x > user.x)
|
||||
dir_to_set = WEST
|
||||
else
|
||||
dir_to_set = EAST
|
||||
for(var/obj/structure/window/WINDOW in loc)
|
||||
if(WINDOW.dir == dir_to_set)
|
||||
to_chat(user, "<span class='notice'>There is already a window facing this way there.</span>")
|
||||
return
|
||||
if(do_after(user, 20, target = src)) //glass doesn't have a toolspeed, so no multiplier
|
||||
if(broken || !anchored || !src) //make sure the grille is still intact, anchored, and exists!
|
||||
return
|
||||
if(S.get_amount() < 2) //make sure we still have enough for this!
|
||||
return
|
||||
if(!getRelativeDirection(src, user) && (user.loc != loc)) //make sure we can still do this from our location
|
||||
return
|
||||
var/obj/structure/window/W = new S.full_window(get_turf(src))
|
||||
S.use(2)
|
||||
W.anchored = 0
|
||||
W.state = 0
|
||||
to_chat(user, "<span class='notice'>You place [W] on [src].</span>")
|
||||
W.update_icon()
|
||||
return
|
||||
if(selection == "One Direction")
|
||||
var/dir_selection = input("Which direction will this window face?", "Direction") as null|anything in list("north", "east", "south", "west")
|
||||
if(!dir_selection)
|
||||
to_chat(user, "<span class='notice'>You start placing the window...</span>")
|
||||
if(do_after(user, 20, target = src))
|
||||
if(!loc || !anchored) //Grille destroyed or unanchored while waiting
|
||||
return
|
||||
var/temp_dir = text2dir(dir_selection)
|
||||
for(var/obj/structure/window/W in loc)
|
||||
if(istype(W, /obj/structure/window/full)) //double checking in case a full window was created while selecting direction
|
||||
to_chat(user, "<span class='warning'>There is already a full window there.</span>")
|
||||
for(var/obj/structure/window/WINDOW in loc)
|
||||
if(WINDOW.dir == dir_to_set)//checking this for a 2nd time to check if a window was made while we were waiting.
|
||||
to_chat(user, "<span class='notice'>There is already a window facing this way there.</span>")
|
||||
return
|
||||
if(W.dir == temp_dir) //to avoid building a window on top of an existing window
|
||||
to_chat(user, "<span class='warning'>There is already a window facing this direction there.</span>")
|
||||
return
|
||||
if(do_after(user, 20, target = src))
|
||||
if(broken || !anchored || !src) //make sure the grille is still intact, anchored, and exists!
|
||||
return
|
||||
if(S.get_amount() < 1) //make sure we still have enough fir this!
|
||||
to_chat(user, "<span class='warning'>You need at least one sheet of glass for that!</span>")
|
||||
return
|
||||
if(!getRelativeDirection(src, user) && (user.loc != loc)) //make sure we can still do this from our location
|
||||
return
|
||||
var/obj/structure/window/W = new S.created_window(get_turf(src))
|
||||
S.use(1)
|
||||
W.setDir(temp_dir)
|
||||
W.ini_dir = temp_dir
|
||||
W.anchored = 0
|
||||
W.state = 0
|
||||
to_chat(user, "<span class='notice'>You place [W] on [src].</span>")
|
||||
W.update_icon()
|
||||
return
|
||||
var/obj/structure/window/W = new S.created_window(get_turf(src))
|
||||
S.use(1)
|
||||
W.setDir(dir_to_set)
|
||||
W.ini_dir = dir_to_set
|
||||
W.anchored = FALSE
|
||||
W.state = WINDOW_OUT_OF_FRAME
|
||||
to_chat(user, "<span class='notice'>You place the [W] on [src].</span>")
|
||||
W.update_nearby_icons()
|
||||
return
|
||||
|
||||
/obj/structure/grille/attacked_by(obj/item/I, mob/living/user)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
|
||||
@@ -0,0 +1,235 @@
|
||||
#define GUILLOTINE_BLADE_MAX_SHARP 10 // This is maxiumum sharpness that will decapitate without failure
|
||||
#define GUILLOTINE_DECAP_MIN_SHARP 7 // Minimum amount of sharpness for decapitation. Any less and it will just deal brute damage
|
||||
#define GUILLOTINE_ANIMATION_LENGTH 9 // How many deciseconds the animation is
|
||||
#define GUILLOTINE_BLADE_RAISED 1
|
||||
#define GUILLOTINE_BLADE_MOVING 2
|
||||
#define GUILLOTINE_BLADE_DROPPED 3
|
||||
#define GUILLOTINE_BLADE_SHARPENING 4
|
||||
#define GUILLOTINE_HEAD_OFFSET 16 // How much we need to move the player to center their head
|
||||
#define GUILLOTINE_LAYER_DIFF 1.2 // How much to increase/decrease a head when it's buckled/unbuckled
|
||||
#define GUILLOTINE_ACTIVATE_DELAY 30 // Delay for executing someone
|
||||
#define GUILLOTINE_WRENCH_DELAY 10
|
||||
#define GUILLOTINE_ACTION_INUSE 5
|
||||
#define GUILLOTINE_ACTION_WRENCH 6
|
||||
|
||||
/obj/structure/guillotine
|
||||
name = "guillotine"
|
||||
desc = "A large structure used to remove the heads of traitors and treasonists."
|
||||
icon = 'icons/obj/guillotine.dmi'
|
||||
icon_state = "guillotine_raised"
|
||||
can_buckle = TRUE
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
buckle_lying = FALSE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
var/blade_status = GUILLOTINE_BLADE_RAISED
|
||||
var/blade_sharpness = GUILLOTINE_BLADE_MAX_SHARP // How sharp the blade is
|
||||
var/kill_count = 0
|
||||
var/force_clap = FALSE //You WILL clap if I want you to
|
||||
var/current_action = 0 // What's currently happening to the guillotine
|
||||
|
||||
/obj/structure/guillotine/examine(mob/user)
|
||||
..()
|
||||
|
||||
var/msg = ""
|
||||
|
||||
msg += "It is [anchored ? "wrenched to the floor." : "unsecured. A wrench should fix that."]<br/>"
|
||||
|
||||
if(blade_status == GUILLOTINE_BLADE_RAISED)
|
||||
msg += "The blade is raised, ready to fall, and"
|
||||
|
||||
if(blade_sharpness >= GUILLOTINE_DECAP_MIN_SHARP)
|
||||
msg += " looks sharp enough to decapitate without any resistance."
|
||||
else
|
||||
msg += " doesn't look particularly sharp. Perhaps a whetstone can be used to sharpen it."
|
||||
else
|
||||
msg += "The blade is hidden inside the stocks."
|
||||
|
||||
if(has_buckled_mobs())
|
||||
msg += "<br/>"
|
||||
msg += "Someone appears to be strapped in. You can help them out, or you can harm them by activating the guillotine."
|
||||
|
||||
to_chat(user, msg)
|
||||
|
||||
return msg
|
||||
|
||||
/obj/structure/guillotine/attack_hand(mob/user)
|
||||
add_fingerprint(user)
|
||||
|
||||
// Currently being used by something
|
||||
if(current_action)
|
||||
return
|
||||
|
||||
switch(blade_status)
|
||||
if(GUILLOTINE_BLADE_MOVING)
|
||||
return
|
||||
if(GUILLOTINE_BLADE_DROPPED)
|
||||
blade_status = GUILLOTINE_BLADE_MOVING
|
||||
icon_state = "guillotine_raise"
|
||||
addtimer(CALLBACK(src, .proc/raise_blade), GUILLOTINE_ANIMATION_LENGTH)
|
||||
return
|
||||
if(GUILLOTINE_BLADE_RAISED)
|
||||
if(has_buckled_mobs())
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
user.visible_message("<span class='warning'>[user] begins to pull the lever!</span>",
|
||||
"<span class='warning'>You begin to the pull the lever.</span>")
|
||||
current_action = GUILLOTINE_ACTION_INUSE
|
||||
|
||||
if(do_after(user, GUILLOTINE_ACTIVATE_DELAY, target = src) && blade_status == GUILLOTINE_BLADE_RAISED)
|
||||
current_action = 0
|
||||
blade_status = GUILLOTINE_BLADE_MOVING
|
||||
icon_state = "guillotine_drop"
|
||||
playsound(src, 'sound/items/unsheath.ogg', 100, 1)
|
||||
addtimer(CALLBACK(src, .proc/drop_blade, user), GUILLOTINE_ANIMATION_LENGTH - 2) // Minus two so we play the sound and decap faster
|
||||
else
|
||||
current_action = 0
|
||||
else
|
||||
unbuckle_mob()
|
||||
else
|
||||
blade_status = GUILLOTINE_BLADE_MOVING
|
||||
icon_state = "guillotine_drop"
|
||||
playsound(src, 'sound/items/unsheath.ogg', 100, 1)
|
||||
addtimer(CALLBACK(src, .proc/drop_blade), GUILLOTINE_ANIMATION_LENGTH)
|
||||
|
||||
/obj/structure/guillotine/proc/raise_blade()
|
||||
blade_status = GUILLOTINE_BLADE_RAISED
|
||||
icon_state = "guillotine_raised"
|
||||
|
||||
/obj/structure/guillotine/proc/drop_blade(mob/user)
|
||||
if(has_buckled_mobs() && blade_sharpness)
|
||||
var/mob/living/carbon/human/H = buckled_mob
|
||||
|
||||
if(!H)
|
||||
blade_status = GUILLOTINE_BLADE_DROPPED
|
||||
icon_state = "guillotine"
|
||||
return
|
||||
|
||||
var/obj/item/organ/external/head/head = H.get_organ("head")
|
||||
|
||||
if(QDELETED(head))
|
||||
blade_status = GUILLOTINE_BLADE_DROPPED
|
||||
icon_state = "guillotine"
|
||||
return
|
||||
|
||||
playsound(src, 'sound/weapons/bladeslice.ogg', 100, 1)
|
||||
if(blade_sharpness >= GUILLOTINE_DECAP_MIN_SHARP || head.brute_dam >= 100)
|
||||
head.droplimb()
|
||||
add_attack_logs(user, H, "beheaded with [src]")
|
||||
H.regenerate_icons()
|
||||
unbuckle_mob()
|
||||
kill_count += 1
|
||||
|
||||
var/blood_overlay = "bloody"
|
||||
|
||||
if(kill_count == 2)
|
||||
blood_overlay = "bloodier"
|
||||
else if(kill_count > 2)
|
||||
blood_overlay = "bloodiest"
|
||||
|
||||
blood_overlay = "guillotine_" + blood_overlay + "_overlay"
|
||||
overlays.Cut()
|
||||
overlays += mutable_appearance(icon, blood_overlay)
|
||||
|
||||
if(force_clap)
|
||||
// The crowd is pleased
|
||||
// The delay is to make large crowds have a longer lasting applause
|
||||
var/delay_offset = 0
|
||||
for(var/mob/living/carbon/human/HM in viewers(src, 7))
|
||||
addtimer(CALLBACK(HM, /mob/.proc/emote, "clap"), delay_offset * 0.3)
|
||||
delay_offset++
|
||||
else
|
||||
H.apply_damage(15 * blade_sharpness, BRUTE, head)
|
||||
add_attack_logs(user, H, "non-fatally dropped the blade on with [src]")
|
||||
H.emote("scream")
|
||||
|
||||
if(blade_sharpness > 1)
|
||||
blade_sharpness -= 1
|
||||
|
||||
blade_status = GUILLOTINE_BLADE_DROPPED
|
||||
icon_state = "guillotine"
|
||||
|
||||
/obj/structure/guillotine/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/whetstone))
|
||||
add_fingerprint(user)
|
||||
if(blade_status == GUILLOTINE_BLADE_SHARPENING)
|
||||
return
|
||||
|
||||
if(blade_status == GUILLOTINE_BLADE_RAISED)
|
||||
if(blade_sharpness < GUILLOTINE_BLADE_MAX_SHARP)
|
||||
blade_status = GUILLOTINE_BLADE_SHARPENING
|
||||
if(do_after(user, 7, target = src))
|
||||
blade_status = GUILLOTINE_BLADE_RAISED
|
||||
user.visible_message("<span class='notice'>[user] sharpens the large blade of the guillotine.</span>",
|
||||
"<span class='notice'>You sharpen the large blade of the guillotine.</span>")
|
||||
blade_sharpness += 1
|
||||
playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
|
||||
return
|
||||
else
|
||||
blade_status = GUILLOTINE_BLADE_RAISED
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='warning'>The blade is sharp enough!</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to raise the blade in order to sharpen it!</span>")
|
||||
return
|
||||
if(iswrench(W))
|
||||
if(current_action)
|
||||
return
|
||||
|
||||
current_action = GUILLOTINE_ACTION_WRENCH
|
||||
|
||||
if(do_after(user, GUILLOTINE_WRENCH_DELAY, target = src))
|
||||
current_action = 0
|
||||
if(has_buckled_mobs())
|
||||
to_chat(user, "<span class='warning'>Can't unfasten, someone's strapped in!</span>")
|
||||
return
|
||||
|
||||
if(current_action)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [src].</span>")
|
||||
anchored = !anchored
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
dir = SOUTH
|
||||
return TRUE
|
||||
else
|
||||
current_action = 0
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/structure/guillotine/buckle_mob(mob/living/M, force = 0)
|
||||
if(!anchored)
|
||||
to_chat(usr, "<span class='warning'>The [src] needs to be wrenched to the floor!</span>")
|
||||
return FALSE
|
||||
|
||||
if(!ishuman(M))
|
||||
to_chat(usr, "<span class='warning'>It doesn't look like [M.p_they()] can fit into this properly!</span>")
|
||||
return FALSE // Can't decapitate non-humans
|
||||
|
||||
if(blade_status != GUILLOTINE_BLADE_RAISED)
|
||||
to_chat(usr, "<span class='warning'>You need to raise the blade before buckling someone in!</span>")
|
||||
return FALSE
|
||||
|
||||
if(..())
|
||||
M.pixel_y -= GUILLOTINE_HEAD_OFFSET // Offset their body so it looks like they're in the guillotine
|
||||
M.layer += GUILLOTINE_LAYER_DIFF
|
||||
|
||||
/obj/structure/guillotine/unbuckle_mob(force = 0)
|
||||
if(buckled_mob)
|
||||
buckled_mob.pixel_y += GUILLOTINE_HEAD_OFFSET // Move their body back
|
||||
buckled_mob.layer -= GUILLOTINE_LAYER_DIFF
|
||||
. = ..()
|
||||
|
||||
#undef GUILLOTINE_BLADE_MAX_SHARP
|
||||
#undef GUILLOTINE_DECAP_MIN_SHARP
|
||||
#undef GUILLOTINE_ANIMATION_LENGTH
|
||||
#undef GUILLOTINE_BLADE_RAISED
|
||||
#undef GUILLOTINE_BLADE_MOVING
|
||||
#undef GUILLOTINE_BLADE_DROPPED
|
||||
#undef GUILLOTINE_BLADE_SHARPENING
|
||||
#undef GUILLOTINE_HEAD_OFFSET
|
||||
#undef GUILLOTINE_LAYER_DIFF
|
||||
#undef GUILLOTINE_ACTIVATE_DELAY
|
||||
#undef GUILLOTINE_WRENCH_DELAY
|
||||
#undef GUILLOTINE_ACTION_INUSE
|
||||
#undef GUILLOTINE_ACTION_WRENCH
|
||||
@@ -0,0 +1,135 @@
|
||||
|
||||
//holographic signs and barriers
|
||||
|
||||
/obj/structure/holosign
|
||||
name = "holo sign"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
anchored = TRUE
|
||||
max_integrity = 1
|
||||
armor = list("melee" = 0, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 0, "bio" = 0, "rad" = 0)
|
||||
var/obj/item/holosign_creator/projector
|
||||
|
||||
/obj/structure/holosign/New(loc, source_projector)
|
||||
if(source_projector)
|
||||
projector = source_projector
|
||||
projector.signs += src
|
||||
..()
|
||||
|
||||
/obj/structure/holosign/Destroy()
|
||||
if(projector)
|
||||
projector.signs -= src
|
||||
projector = null
|
||||
return ..()
|
||||
|
||||
/obj/structure/holosign/attack_hand(mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
user.do_attack_animation(src)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
take_damage(5 , BRUTE, "melee", 1)
|
||||
|
||||
/obj/structure/holosign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
playsound(loc, 'sound/weapons/egloves.ogg', 80, 1)
|
||||
if(BURN)
|
||||
playsound(loc, 'sound/weapons/egloves.ogg', 80, 1)
|
||||
|
||||
/obj/structure/holosign/wetsign
|
||||
name = "wet floor sign"
|
||||
desc = "The words flicker as if they mean nothing."
|
||||
icon_state = "holosign"
|
||||
|
||||
/obj/structure/holosign/barrier
|
||||
name = "holo barrier"
|
||||
desc = "A short holographic barrier which can only be passed by walking."
|
||||
icon_state = "holosign_sec"
|
||||
pass_flags = LETPASSTHROW
|
||||
density = TRUE
|
||||
max_integrity = 20
|
||||
var/allow_walk = TRUE //can we pass through it on walk intent
|
||||
|
||||
/obj/structure/holosign/barrier/CanPass(atom/movable/mover, turf/target)
|
||||
if(!density)
|
||||
return TRUE
|
||||
if(mover.pass_flags & (PASSGLASS|PASSTABLE|PASSGRILLE))
|
||||
return TRUE
|
||||
if(iscarbon(mover))
|
||||
var/mob/living/carbon/C = mover
|
||||
if(allow_walk && C.m_intent == MOVE_INTENT_WALK)
|
||||
return TRUE
|
||||
|
||||
/obj/structure/holosign/barrier/engineering
|
||||
icon_state = "holosign_engi"
|
||||
|
||||
/obj/structure/holosign/barrier/atmos
|
||||
name = "holo firelock"
|
||||
desc = "A holographic barrier resembling a firelock. Though it does not prevent solid objects from passing through, gas is kept out."
|
||||
icon_state = "holo_firelock"
|
||||
density = FALSE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
anchored = TRUE
|
||||
layer = ABOVE_MOB_LAYER
|
||||
alpha = 150
|
||||
|
||||
/obj/structure/holosign/barrier/atmos/New()
|
||||
..()
|
||||
air_update_turf(TRUE)
|
||||
|
||||
/obj/structure/holosign/barrier/atmos/CanAtmosPass(turf/T)
|
||||
return FALSE
|
||||
|
||||
/obj/structure/holosign/barrier/atmos/Destroy()
|
||||
var/turf/T = get_turf(src)
|
||||
T.air_update_turf(TRUE)
|
||||
return ..()
|
||||
|
||||
/obj/structure/holosign/barrier/cyborg
|
||||
name = "Energy Field"
|
||||
desc = "A fragile energy field that blocks movement. Excels at blocking lethal projectiles."
|
||||
density = TRUE
|
||||
max_integrity = 10
|
||||
allow_walk = FALSE
|
||||
|
||||
/obj/structure/holosign/barrier/cyborg/bullet_act(obj/item/projectile/P)
|
||||
take_damage((P.damage / 5) , BRUTE, "melee", 1) //Doesn't really matter what damage flag it is.
|
||||
if(istype(P, /obj/item/projectile/energy/electrode))
|
||||
take_damage(10, BRUTE, "melee", 1) //Tasers aren't harmful.
|
||||
if(istype(P, /obj/item/projectile/beam/disabler))
|
||||
take_damage(5, BRUTE, "melee", 1) //Disablers aren't harmful.
|
||||
|
||||
/obj/structure/holosign/barrier/cyborg/hacked
|
||||
name = "Charged Energy Field"
|
||||
desc = "A powerful energy field that blocks movement. Energy arcs off it."
|
||||
max_integrity = 20
|
||||
var/shockcd = 0
|
||||
|
||||
/obj/structure/holosign/barrier/cyborg/hacked/bullet_act(obj/item/projectile/P)
|
||||
take_damage(P.damage, BRUTE, "melee", 1) //Yeah no this doesn't get projectile resistance.
|
||||
|
||||
/obj/structure/holosign/barrier/cyborg/hacked/proc/cooldown()
|
||||
shockcd = FALSE
|
||||
|
||||
/obj/structure/holosign/barrier/cyborg/hacked/attack_hand(mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(!shockcd)
|
||||
if(ismob(user))
|
||||
var/mob/living/M = user
|
||||
M.electrocute_act(15,"Energy Barrier", safety=1)
|
||||
shockcd = TRUE
|
||||
addtimer(CALLBACK(src, .proc/cooldown), 5)
|
||||
|
||||
/obj/structure/holosign/barrier/cyborg/hacked/Bumped(atom/movable/AM)
|
||||
if(shockcd)
|
||||
return
|
||||
|
||||
if(!isliving(AM))
|
||||
return
|
||||
|
||||
var/mob/living/M = AM
|
||||
M.electrocute_act(15, "Energy Barrier", safety = 1)
|
||||
shockcd = TRUE
|
||||
addtimer(CALLBACK(src, .proc/cooldown), 5)
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
var/health = 50.0
|
||||
|
||||
/obj/structure/inflatable/initialize(location)
|
||||
/obj/structure/inflatable/Initialize(location)
|
||||
..()
|
||||
air_update_turf(1)
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
..()
|
||||
initial_state = icon_state
|
||||
|
||||
/obj/structure/mineral_door/initialize()
|
||||
/obj/structure/mineral_door/Initialize()
|
||||
..()
|
||||
air_update_turf(1)
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
var/atom/attack_atom
|
||||
|
||||
|
||||
/obj/structure/ghost_beacon/initialize()
|
||||
/obj/structure/ghost_beacon/Initialize()
|
||||
. = ..()
|
||||
last_ghost_alert = world.time
|
||||
attack_atom = src
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
anchored = 1.0
|
||||
var/open_sound = 'sound/items/Deconstruct.ogg'
|
||||
|
||||
/obj/structure/morgue/initialize()
|
||||
/obj/structure/morgue/Initialize()
|
||||
. = ..()
|
||||
update()
|
||||
|
||||
|
||||
@@ -295,7 +295,7 @@
|
||||
QDEL_NULL(song)
|
||||
return ..()
|
||||
|
||||
/obj/structure/piano/initialize()
|
||||
/obj/structure/piano/Initialize()
|
||||
song.tempo = song.sanitize_tempo(song.tempo) // tick_lag isn't set when the map is loaded
|
||||
..()
|
||||
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
anchored = 1
|
||||
var/notices = 0
|
||||
|
||||
/obj/structure/noticeboard/initialize()
|
||||
/obj/structure/noticeboard/Initialize()
|
||||
..()
|
||||
for(var/obj/item/I in loc)
|
||||
if(notices > 4) break
|
||||
if(istype(I, /obj/item/paper))
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
name = "airtight plastic flaps"
|
||||
desc = "Heavy duty, airtight, plastic flaps."
|
||||
|
||||
/obj/structure/plasticflaps/mining/initialize()
|
||||
/obj/structure/plasticflaps/mining/Initialize()
|
||||
air_update_turf(1)
|
||||
..()
|
||||
|
||||
|
||||
@@ -30,7 +30,8 @@ FLOOR SAFES
|
||||
tumbler_2_open = rand(0, 71)
|
||||
|
||||
|
||||
/obj/structure/safe/initialize()
|
||||
/obj/structure/safe/Initialize()
|
||||
..()
|
||||
for(var/obj/item/I in loc)
|
||||
if(space >= maxspace)
|
||||
return
|
||||
@@ -178,7 +179,7 @@ obj/structure/safe/ex_act(severity)
|
||||
layer = 2.5
|
||||
|
||||
|
||||
/obj/structure/safe/floor/initialize()
|
||||
/obj/structure/safe/floor/Initialize()
|
||||
..()
|
||||
var/turf/T = loc
|
||||
hide(T.intact)
|
||||
|
||||
@@ -83,14 +83,7 @@
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/table/attack_hand(mob/living/user)
|
||||
if(HULK in user.mutations)
|
||||
user.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
|
||||
playsound(loc, 'sound/effects/bang.ogg', 50, 1)
|
||||
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
|
||||
deconstruct(FALSE)
|
||||
else
|
||||
..()
|
||||
..()
|
||||
if(climber)
|
||||
climber.Weaken(2)
|
||||
climber.visible_message("<span class='warning'>[climber.name] has been knocked off the table", "You've been knocked off the table", "You see [climber.name] get knocked off the table</span>")
|
||||
@@ -376,7 +369,7 @@
|
||||
return
|
||||
// Don't break if they're just flying past
|
||||
if(AM.throwing)
|
||||
addtimer(src, "throw_check", 5, FALSE, AM)
|
||||
addtimer(CALLBACK(src, .proc/throw_check, AM), 5)
|
||||
else
|
||||
check_break(AM)
|
||||
|
||||
@@ -616,7 +609,7 @@
|
||||
if(user.weakened || user.resting || user.lying)
|
||||
return
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
user.do_attack_animation(src, ATTACK_EFFECT_KICK)
|
||||
user.visible_message("<span class='warning'>[user] kicks [src].</span>", \
|
||||
"<span class='danger'>You kick [src].</span>")
|
||||
take_damage(rand(4,8), BRUTE, "melee", 1)
|
||||
|
||||
@@ -249,9 +249,11 @@
|
||||
var/ismist = 0 //needs a var so we can make it linger~
|
||||
var/watertemp = "normal" //freezing, normal, or boiling
|
||||
var/mobpresent = 0 //true if there is a mob on the shower's loc, this is to ease process()
|
||||
var/datum/looping_sound/showering/soundloop
|
||||
|
||||
/obj/machinery/shower/New(turf/T, newdir = SOUTH, building = FALSE)
|
||||
..()
|
||||
soundloop = new(list(src), FALSE)
|
||||
if(building)
|
||||
dir = newdir
|
||||
pixel_x = 0
|
||||
@@ -264,8 +266,8 @@
|
||||
layer = FLY_LAYER
|
||||
|
||||
/obj/machinery/shower/Destroy()
|
||||
if(mymist)
|
||||
QDEL_NULL(mymist)
|
||||
QDEL_NULL(mymist)
|
||||
QDEL_NULL(soundloop)
|
||||
return ..()
|
||||
|
||||
//add heat controls? when emagged, you can freeze to death in it?
|
||||
@@ -282,6 +284,7 @@
|
||||
on = !on
|
||||
update_icon()
|
||||
if(on)
|
||||
soundloop.start()
|
||||
if(M.loc == loc)
|
||||
wash(M)
|
||||
check_heat(M)
|
||||
@@ -289,6 +292,8 @@
|
||||
for(var/atom/movable/G in src.loc)
|
||||
G.clean_blood()
|
||||
G.water_act(100, convertHeat(), src)
|
||||
else
|
||||
soundloop.stop()
|
||||
|
||||
/obj/machinery/shower/attackby(obj/item/I as obj, mob/user as mob, params)
|
||||
if(I.type == /obj/item/analyzer)
|
||||
@@ -338,9 +343,9 @@
|
||||
mist_time = 70 //7 seconds on freezing temperature to disperse existing mist
|
||||
if(watertemp == "boiling")
|
||||
mist_time = 20 //2 seconds on boiling temperature to build up mist
|
||||
addtimer(src, "update_mist", mist_time)
|
||||
addtimer(CALLBACK(src, .proc/update_mist), mist_time)
|
||||
else
|
||||
addtimer(src, "update_mist", 250) //25 seconds for mist to disperse after being turned off
|
||||
addtimer(CALLBACK(src, .proc/update_mist), 250) //25 seconds for mist to disperse after being turned off
|
||||
|
||||
/obj/machinery/shower/proc/update_mist()
|
||||
if(on)
|
||||
@@ -543,7 +548,7 @@
|
||||
var/washing_face = 0
|
||||
if(selected_area in list("head", "mouth", "eyes"))
|
||||
washing_face = 1
|
||||
user.visible_message("<span class='notice'>[user] starts washing their [washing_face ? "face" : "hands"]...</span>", \
|
||||
user.visible_message("<span class='notice'>[user] starts washing [user.p_their()] [washing_face ? "face" : "hands"]...</span>", \
|
||||
"<span class='notice'>You start washing your [washing_face ? "face" : "hands"]...</span>")
|
||||
busy = 1
|
||||
|
||||
@@ -553,7 +558,7 @@
|
||||
|
||||
busy = 0
|
||||
|
||||
user.visible_message("<span class='notice'>[user] washes their [washing_face ? "face" : "hands"] using [src].</span>", \
|
||||
user.visible_message("<span class='notice'>[user] washes [user.p_their()] [washing_face ? "face" : "hands"] using [src].</span>", \
|
||||
"<span class='notice'>You wash your [washing_face ? "face" : "hands"] using [src].</span>")
|
||||
if(washing_face)
|
||||
if(ishuman(user))
|
||||
|
||||
@@ -27,6 +27,10 @@
|
||||
var/secure = FALSE //Whether or not this creates a secure windoor
|
||||
var/state = "01" //How far the door assembly has progressed
|
||||
|
||||
/obj/structure/windoor_assembly/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Alt-click to rotate it clockwise.</span>")
|
||||
|
||||
obj/structure/windoor_assembly/New(loc, set_dir)
|
||||
..()
|
||||
if(set_dir)
|
||||
@@ -42,7 +46,7 @@ obj/structure/windoor_assembly/Destroy()
|
||||
|
||||
/obj/structure/windoor_assembly/Move()
|
||||
var/turf/T = loc
|
||||
. = ..()
|
||||
..()
|
||||
setDir(ini_dir)
|
||||
move_update_air(T)
|
||||
|
||||
@@ -54,8 +58,17 @@ obj/structure/windoor_assembly/Destroy()
|
||||
return 1
|
||||
if(get_dir(loc, target) == dir) //Make sure looking at appropriate border
|
||||
return !density
|
||||
else
|
||||
return 1
|
||||
if(istype(mover, /obj/structure/window))
|
||||
var/obj/structure/window/W = mover
|
||||
if(!valid_window_location(loc, W.ini_dir))
|
||||
return FALSE
|
||||
else if(istype(mover, /obj/structure/windoor_assembly))
|
||||
var/obj/structure/windoor_assembly/W = mover
|
||||
if(!valid_window_location(loc, W.ini_dir))
|
||||
return FALSE
|
||||
else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir))
|
||||
return FALSE
|
||||
return 1
|
||||
|
||||
/obj/structure/windoor_assembly/CanAtmosPass(turf/T)
|
||||
if(get_dir(loc, T) == dir)
|
||||
@@ -317,9 +330,16 @@ obj/structure/windoor_assembly/Destroy()
|
||||
if(usr.stat || !usr.canmove || usr.restrained())
|
||||
return
|
||||
if(anchored)
|
||||
to_chat(usr, "It is fastened to the floor; therefore, you can't rotate it!")
|
||||
return 0
|
||||
setDir(turn(dir, 270))
|
||||
to_chat(usr, "<span class='warning'>[src] cannot be rotated while it is fastened to the floor!</span>")
|
||||
return FALSE
|
||||
var/target_dir = turn(dir, 270)
|
||||
|
||||
if(!valid_window_location(loc, target_dir))
|
||||
to_chat(usr, "<span class='warning'>[src] cannot be rotated in that direction!</span>")
|
||||
return FALSE
|
||||
|
||||
setDir(target_dir)
|
||||
|
||||
ini_dir = dir
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user