mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-14 10:53:42 +00:00
Speeds up gas movement significantly Documents the intent and finer details of the atmos system (Thanks dunc) Fixes excited groups constantly rebuilding, this broke 4 years ago Fixes superconductors just straight up not working Allows turfs to sleep while inside an excited group Adds a new subprocess to SSAir to support rebuilding in this state Most heat based behavior no longer relies on being inside a fire Adds a new element to support doing this cleanly Adds a new subprocess to SSAir to support doing this while a turf is asleep Refactors air_update_turf to allow for finer control Makes apcs take damage in heat to prevent infinite plasma fire diffs Cleans up immutable gas mixtures to make them work properly when the mix has gas in it Planetary turfs no longer create a new copy of themselves each time they process. We instead use a global immutable mix Cleans up a typed for loop in reactions Canisters will take damage from outside heat now Speeds up excited group dismantle Increases the superconductor threshold by 200k Cleans up some roundstart ATs on some ruins Uses /turf/open/var/excited to track if a turf is actively processing, preventing a |= Prevents openspace from trying to melt Tweaks a canister examine line Makes planetary turfs reset to base when broken down as part of an excited group Makes it impossible for planetary turfs to rebuild, just like space tiles Fixes closed turfs not activating their replacement when destroyed by moving closed -> open turf activation to the adjacent air subsystem. They were activating and then going back to sleep before adjacent air got a chance to tick. Fire alarms will trigger when the area gets too cold for humans
206 lines
6.6 KiB
Plaintext
206 lines
6.6 KiB
Plaintext
|
|
//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, FIRE = 20, ACID = 20)
|
|
var/obj/item/holosign_creator/projector
|
|
|
|
/obj/structure/holosign/Initialize(loc, source_projector)
|
|
. = ..()
|
|
alpha = 0
|
|
SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, plane, dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it
|
|
if(source_projector)
|
|
projector = source_projector
|
|
LAZYADD(projector.signs, src)
|
|
|
|
/obj/structure/holosign/Destroy()
|
|
if(projector)
|
|
LAZYREMOVE(projector.signs, src)
|
|
projector = null
|
|
return ..()
|
|
|
|
/obj/structure/holosign/attack_hand(mob/living/user)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
|
|
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, TRUE)
|
|
if(BURN)
|
|
playsound(loc, 'sound/weapons/egloves.ogg', 80, TRUE)
|
|
|
|
/obj/structure/holosign/wetsign
|
|
name = "wet floor sign"
|
|
desc = "The words flicker as if they mean nothing."
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "holosign"
|
|
|
|
/obj/structure/holosign/barrier
|
|
name = "holobarrier"
|
|
desc = "A short holographic barrier which can only be passed by walking."
|
|
icon_state = "holosign_sec"
|
|
pass_flags_self = PASSTABLE | PASSGRILLE | PASSGLASS | LETPASSTHROW
|
|
density = TRUE
|
|
max_integrity = 20
|
|
var/allow_walk = TRUE //can we pass through it on walk intent
|
|
|
|
/obj/structure/holosign/barrier/CanAllowThrough(atom/movable/mover, turf/target)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
if(iscarbon(mover))
|
|
var/mob/living/carbon/C = mover
|
|
if(C.stat) // Lets not prevent dragging unconscious/dead people.
|
|
return TRUE
|
|
if(allow_walk && C.m_intent == MOVE_INTENT_WALK)
|
|
return TRUE
|
|
|
|
/obj/structure/holosign/barrier/wetsign
|
|
name = "wet floor holobarrier"
|
|
desc = "When it says walk it means walk."
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "holosign"
|
|
|
|
/obj/structure/holosign/barrier/wetsign/CanAllowThrough(atom/movable/mover, turf/target)
|
|
. = ..()
|
|
if(iscarbon(mover))
|
|
var/mob/living/carbon/C = mover
|
|
if(C.stat) // Lets not prevent dragging unconscious/dead people.
|
|
return TRUE
|
|
if(allow_walk && C.m_intent != MOVE_INTENT_WALK)
|
|
return FALSE
|
|
|
|
/obj/structure/holosign/barrier/engineering
|
|
icon_state = "holosign_engi"
|
|
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
|
rad_insulation = RAD_LIGHT_INSULATION
|
|
|
|
/obj/structure/holosign/barrier/atmos
|
|
name = "holofirelock"
|
|
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
|
|
anchored = TRUE
|
|
CanAtmosPass = ATMOS_PASS_NO
|
|
alpha = 150
|
|
flags_1 = RAD_PROTECT_CONTENTS_1 | RAD_NO_CONTAMINATE_1
|
|
rad_insulation = RAD_LIGHT_INSULATION
|
|
|
|
/obj/structure/holosign/barrier/atmos/Initialize()
|
|
. = ..()
|
|
air_update_turf(TRUE, TRUE)
|
|
|
|
/obj/structure/holosign/barrier/atmos/BlockSuperconductivity() //Didn't used to do this, but it's "normal", and will help ease heat flow transitions with the players.
|
|
return TRUE
|
|
|
|
/obj/structure/holosign/barrier/atmos/Destroy()
|
|
. = ..()
|
|
air_update_turf(TRUE, FALSE)
|
|
|
|
/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/projectile/P)
|
|
take_damage((P.damage / 5) , BRUTE, MELEE, 1) //Doesn't really matter what damage flag it is.
|
|
if(istype(P, /obj/projectile/energy/electrode))
|
|
take_damage(10, BRUTE, MELEE, 1) //Tasers aren't harmful.
|
|
if(istype(P, /obj/projectile/beam/disabler))
|
|
take_damage(5, BRUTE, MELEE, 1) //Disablers aren't harmful.
|
|
return BULLET_ACT_HIT
|
|
|
|
/obj/structure/holosign/barrier/medical
|
|
name = "\improper PENLITE holobarrier"
|
|
desc = "A holobarrier that uses biometrics to detect human viruses. Denies passing to personnel with easily-detected, malicious viruses. Good for quarantines."
|
|
icon_state = "holo_medical"
|
|
alpha = 125 //lazy :)
|
|
var/force_allaccess = FALSE
|
|
var/buzzcd = 0
|
|
|
|
/obj/structure/holosign/barrier/medical/examine(mob/user)
|
|
. = ..()
|
|
. += "<span class='notice'>The biometric scanners are <b>[force_allaccess ? "off" : "on"]</b>.</span>"
|
|
|
|
/obj/structure/holosign/barrier/medical/CanAllowThrough(atom/movable/mover, turf/target)
|
|
. = ..()
|
|
if(force_allaccess)
|
|
return TRUE
|
|
if(istype(mover, /obj/vehicle/ridden))
|
|
for(var/M in mover.buckled_mobs)
|
|
if(ishuman(M))
|
|
if(!CheckHuman(M))
|
|
return FALSE
|
|
if(ishuman(mover))
|
|
return CheckHuman(mover)
|
|
return TRUE
|
|
|
|
/obj/structure/holosign/barrier/medical/Bumped(atom/movable/AM)
|
|
. = ..()
|
|
icon_state = "holo_medical"
|
|
if(ishuman(AM) && !CheckHuman(AM))
|
|
if(buzzcd < world.time)
|
|
playsound(get_turf(src),'sound/machines/buzz-sigh.ogg',65,TRUE,4)
|
|
buzzcd = (world.time + 60)
|
|
icon_state = "holo_medical-deny"
|
|
|
|
/obj/structure/holosign/barrier/medical/proc/CheckHuman(mob/living/carbon/human/sickboi)
|
|
var/threat = sickboi.check_virus()
|
|
if(get_disease_severity_value(threat) > get_disease_severity_value(DISEASE_SEVERITY_MINOR))
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/obj/structure/holosign/barrier/medical/attack_hand(mob/living/user)
|
|
if(CanPass(user) && user.a_intent == INTENT_HELP)
|
|
force_allaccess = !force_allaccess
|
|
to_chat(user, "<span class='warning'>You [force_allaccess ? "deactivate" : "activate"] the biometric scanners.</span>") //warning spans because you can make the station sick!
|
|
else
|
|
return ..()
|
|
|
|
/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/projectile/P)
|
|
take_damage(P.damage, BRUTE, MELEE, 1) //Yeah no this doesn't get projectile resistance.
|
|
return BULLET_ACT_HIT
|
|
|
|
/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")
|
|
shockcd = TRUE
|
|
addtimer(CALLBACK(src, .proc/cooldown), 5)
|
|
|
|
/obj/structure/holosign/barrier/cyborg/hacked/Bumped(atom/movable/AM)
|
|
if(shockcd)
|
|
return
|
|
|
|
if(!ismob(AM))
|
|
return
|
|
|
|
var/mob/living/M = AM
|
|
M.electrocute_act(15,"Energy Barrier")
|
|
shockcd = TRUE
|
|
addtimer(CALLBACK(src, .proc/cooldown), 5)
|