Files
Bubberstation/code/game/objects/structures/holosign.dm
jimmyl 089059d7d3 atmospherics shield generator (#91055)
## About The Pull Request

(old video)


https://github.com/user-attachments/assets/4b04c372-05a2-4bab-b4a4-1b2c965061e5

unlocked by holographics research
put two facing eachother and turn one on to make a field that blocks
atmos, if not obstructed by wall
fields cannot be broken or clicked but the generators may (theyre
relatively weak)
requires external airlock access or apc access
uses area power, environmental channel
may be locked
may be screwed open to access wiring, has 1 wire that just toggles it

changes tiny fans on stations to use those

## Why It's Good For The Game

a better and rebuildable alternative to magic tiny fans 

## Changelog
🆑
add: atmospherics shield generator, unlocked by Holographics research
/🆑

---------

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2025-06-10 15:31:43 +02:00

308 lines
9.3 KiB
Plaintext

//holographic signs and barriers
/obj/structure/holosign
name = "holo sign"
icon = 'icons/effects/holosigns.dmi'
anchored = TRUE
max_integrity = 1
armor_type = /datum/armor/structure_holosign
// How can you freeze a trick of the light?
resistance_flags = FREEZE_PROOF
var/obj/item/holosign_creator/projector
var/use_vis_overlay = TRUE
/datum/armor/structure_holosign
bullet = 50
laser = 50
energy = 50
fire = 20
acid = 20
/obj/structure/holosign/Initialize(mapload, source_projector)
. = ..()
AddComponent(/datum/component/holographic_nature)
create_vis_overlay()
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, list/modifiers)
. = ..()
if(.)
return
attack_holosign(user, modifiers)
/obj/structure/holosign/CanAllowThrough(atom/movable/mover, border_dir)
. = ..()
if(!. && isprojectile(mover)) // Its short enough to be shot over
return TRUE
/obj/structure/holosign/proc/attack_holosign(mob/living/user, list/modifiers)
user.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
user.changeNext_move(CLICK_CD_MELEE)
take_damage(5 , BRUTE, MELEE, 1)
log_combat(user, src, "swatted")
/obj/structure/holosign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
playsound(loc, 'sound/items/weapons/egloves.ogg', 80, TRUE)
if(BURN)
playsound(loc, 'sound/items/weapons/egloves.ogg', 80, TRUE)
/obj/structure/holosign/proc/create_vis_overlay()
var/turf/our_turf = get_turf(src)
if(use_vis_overlay)
alpha = 0
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, MUTATE_PLANE(GAME_PLANE, our_turf), dir, add_appearance_flags = RESET_ALPHA) //you see mobs under it, but you hit them like they are above it
/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 = "security holobarrier"
desc = "A strong short security holographic barrier used for crowd control and blocking crime scenes. Can only be passed by walking."
icon_state = "holosign_sec"
base_icon_state = "holosign_sec"
pass_flags_self = PASSTABLE | PASSGRILLE | PASSGLASS | LETPASSTHROW
density = TRUE
max_integrity = 20
COOLDOWN_DECLARE(cooldown_open)
///Can we pass through it on walk intent?
var/allow_walk = TRUE
///Can it be temporarily opened with the holosign projector?
var/openable = TRUE
///Is it opened?
var/opened = FALSE
///What is the icon of opened holobarrier?
var/pass_icon_state = "holosign_pass"
/obj/structure/holosign/barrier/CanAllowThrough(atom/movable/mover, border_dir)
. = ..()
if(.)
return
if(opened)
return TRUE
if(iscarbon(mover))
var/mob/living/carbon/moving_carbon = mover
if(moving_carbon.stat) // Lets not prevent dragging unconscious/dead people.
return TRUE
if(allow_walk && moving_carbon.move_intent == MOVE_INTENT_WALK)
return TRUE
/obj/structure/holosign/barrier/ranged_item_interaction(mob/living/user, obj/item/tool, list/modifiers)
. = ..()
if(tool != projector)
return
if(openable)
open(user)
/obj/structure/holosign/barrier/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
. = ..()
if(tool != projector)
return
qdel(src)
/obj/structure/holosign/barrier/update_icon_state()
if(!opened)
icon_state = base_icon_state
else
icon_state = pass_icon_state
create_vis_overlay()
. = ..()
/obj/structure/holosign/barrier/proc/open(user)
if(!openable)
balloon_alert(user, "unable!")
return
if(!COOLDOWN_FINISHED(src, cooldown_open))
balloon_alert(user, "on cooldown!")
return
if(!opened)
density = FALSE
opened = TRUE
playsound(src, 'sound/machines/door/door_open.ogg', 50, TRUE)
else
density = TRUE
opened = FALSE
playsound(src, 'sound/machines/door/door_close.ogg', 50, TRUE)
update_icon_state()
COOLDOWN_START(src, cooldown_open, 1 SECONDS)
/obj/structure/holosign/barrier/wetsign
name = "wet floor holobarrier"
desc = "When it says walk it means <b>WALK!</b>"
icon_state = "holosign_dense"
max_integrity = 1
openable = FALSE
/obj/structure/holosign/barrier/wetsign/CanAllowThrough(atom/movable/mover, border_dir)
. = ..()
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.move_intent != MOVE_INTENT_WALK)
return FALSE
/obj/structure/holosign/barrier/engineering
name = "engineering holobarrier"
desc = "A short engineering holographic barrier used for designating hazardous zones, slightly blocks radiation. Can only be passed by walking."
icon_state = "holosign_engi"
base_icon_state = "holosign_engi"
rad_insulation = RAD_LIGHT_INSULATION
max_integrity = 1
/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"
openable = FALSE
density = FALSE
anchored = TRUE
can_atmos_pass = ATMOS_PASS_NO
alpha = 150
rad_insulation = RAD_LIGHT_INSULATION
resistance_flags = FIRE_PROOF | FREEZE_PROOF
/obj/structure/holosign/barrier/atmos/proc/clearview_transparency()
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
alpha = 25
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
var/turf/our_turf = get_turf(src)
SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, MUTATE_PLANE(GAME_PLANE, our_turf), dir)
/obj/structure/holosign/barrier/atmos/proc/reset_transparency()
mouse_opacity = initial(mouse_opacity)
alpha = initial(alpha)
SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays)
var/turf/our_turf = get_turf(src)
SSvis_overlays.add_vis_overlay(src, icon, icon_state, ABOVE_MOB_LAYER, MUTATE_PLANE(GAME_PLANE, our_turf), dir, add_appearance_flags = RESET_ALPHA)
/obj/structure/holosign/barrier/atmos/sturdy
name = "sturdy holofirelock"
max_integrity = 150
openable = FALSE
/obj/structure/holosign/barrier/atmos/tram
name = "tram atmos barrier"
max_integrity = 150
icon_state = "holo_tram"
openable = FALSE
/obj/structure/holosign/barrier/atmos/Initialize(mapload)
. = ..()
air_update_turf(TRUE, TRUE)
AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_FIREDOOR_STOP)))
/obj/structure/holosign/barrier/atmos/block_superconductivity() //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)
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
armor_type = /datum/armor/structure_holosign/cyborg_barrier // Gets a special armor subtype which is extra good at defense.
/datum/armor/structure_holosign/cyborg_barrier
bullet = 80
laser = 80
energy = 80
melee = 20
/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"
base_icon_state = "holo_medical"
max_integrity = 1
openable = FALSE
COOLDOWN_DECLARE(virus_detected)
/obj/structure/holosign/barrier/medical/CanAllowThrough(atom/movable/mover, border_dir)
. = ..()
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 = base_icon_state
update_icon_state()
if(!ishuman(AM) && CheckHuman(AM))
return
if(!COOLDOWN_FINISHED(src, virus_detected))
return
playsound(get_turf(src),'sound/machines/buzz/buzz-sigh.ogg', 65, TRUE, 4)
COOLDOWN_START(src, virus_detected, 1 SECONDS)
icon_state = "holo_medical-deny"
update_icon_state()
/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/cyborg/hacked
name = "Charged Energy Field"
desc = "A powerful energy field that blocks movement. Energy arcs off it."
max_integrity = 20
armor_type = /datum/armor/structure_holosign //Yeah no this doesn't get projectile resistance.
var/shockcd = 0
/obj/structure/holosign/barrier/cyborg/hacked/proc/cooldown()
shockcd = FALSE
/obj/structure/holosign/barrier/cyborg/hacked/attack_hand(mob/living/user, list/modifiers)
. = ..()
if(.)
return
if(!shockcd)
if(ismob(user))
var/mob/living/M = user
M.electrocute_act(15,"Energy Barrier")
shockcd = TRUE
addtimer(CALLBACK(src, PROC_REF(cooldown)), 0.5 SECONDS)
/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_REF(cooldown)), 0.5 SECONDS)