Security / PseudoCargo Expansion

This commit is contained in:
Mechoid
2019-11-24 14:22:25 -08:00
committed by VirgoBot
parent b34f14b3cc
commit 99bc3dcdbc
83 changed files with 2722 additions and 67 deletions
@@ -113,7 +113,7 @@
/obj/item/weapon/storage/belt/security,
/obj/item/device/flash,
/obj/item/weapon/melee/baton/loaded,
/obj/item/weapon/gun/energy/gun,
/obj/item/weapon/gun/magnetic/railgun/heater/pistol/hos,
/obj/item/weapon/cell/device/weapon,
/obj/item/clothing/accessory/holster/waist,
/obj/item/weapon/melee/telebaton,
@@ -223,6 +223,8 @@
starts_with += /obj/item/weapon/storage/backpack/satchel/sec
if(prob(50))
starts_with += /obj/item/weapon/storage/backpack/dufflebag/sec
if(prob(30))
starts_with += /obj/item/weapon/contraband/poster/nanotrasen
return ..()
/obj/structure/closet/secure_closet/security/cargo/Initialize()
@@ -271,6 +273,7 @@
/obj/item/weapon/reagent_containers/food/drinks/flask/detflask,
/obj/item/weapon/storage/briefcase/crimekit,
/obj/item/device/taperecorder,
/obj/item/weapon/storage/bag/detective,
/obj/item/device/tape/random = 3)
/obj/structure/closet/secure_closet/detective/update_icon()
@@ -305,6 +308,17 @@ GLOBAL_LIST_BOILERPLATE(all_brig_closets, /obj/structure/closet/secure_closet/br
/obj/item/clothing/under/color/prison,
/obj/item/clothing/shoes/orange)
/obj/structure/closet/secure_closet/posters
name = "morale storage"
req_access = list(access_security)
anchored = 1
starts_with = list(
/obj/item/weapon/contraband/poster/nanotrasen,
/obj/item/weapon/contraband/poster/nanotrasen,
/obj/item/weapon/contraband/poster/nanotrasen,
/obj/item/weapon/contraband/poster/nanotrasen,
/obj/item/weapon/contraband/poster/nanotrasen)
/obj/structure/closet/secure_closet/courtroom
name = "courtroom locker"
@@ -83,4 +83,13 @@
to_chat(user, "<span class='warning'>Another spirit appears to have gotten to \the [src] before you. Sorry.</span>")
return
create_occupant(user)
var/choice = input(user, "Are you certain you wish to activate this pod?", "Control Pod") as null|anything in list("Yes", "No")
if(!choice || choice == "No")
return
else if(used)
to_chat(user, "<span class='warning'>Another spirit appears to have gotten to \the [src] before you. Sorry.</span>")
return
create_occupant(user)
@@ -0,0 +1,246 @@
// Ghost variant.
/obj/structure/ghost_pod/ghost_activated/human
name = "mysterious cryopod"
desc = "This is a pod which appears to contain a body."
description_info = "This contains a body, which may wake at any time. The external controls\
seem to be malfunctioning."
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper_1"
icon_state_opened = "sleeper_0"
density = TRUE
ghost_query_type = /datum/ghost_query/stowaway
anchored = FALSE
var/occupant_type = "stowaway"
var/allow_appearance_change = TRUE
var/make_antag = MODE_STOWAWAY
var/start_injured = FALSE
var/spawn_with_emag = TRUE
var/list/clothing_possibilities
/obj/structure/ghost_pod/ghost_activated/human/Initialize()
..()
handle_clothing_setup()
/obj/structure/ghost_pod/ghost_activated/human/proc/handle_clothing_setup()
clothing_possibilities = list()
clothing_possibilities |= subtypesof(/obj/item/clothing/under/color)
clothing_possibilities |= subtypesof(/obj/item/clothing/head/soft)
clothing_possibilities |= /obj/item/clothing/shoes/black
clothing_possibilities |= /obj/item/device/radio/headset
/obj/structure/ghost_pod/ghost_activated/human/create_occupant(var/mob/M)
..()
var/turf/T = get_turf(src)
var/mob/living/carbon/human/H = new(src)
H.adjustCloneLoss(rand(1,5))
if(M.mind)
M.mind.transfer_to(H)
to_chat(M, "<span class='notice'>You are a [occupant_type]!</span>")
if(make_antag)
to_chat(M, "<span class='warning'>Your intent may not be completely beneficial.</span>")
H.ckey = M.ckey
visible_message("<span class='warning'>As \the [src] opens, the pipes on \the [src] surge, before it grows dark.</span>")
log_and_message_admins("successfully opened \a [src] and became a [occupant_type].")
var/list/uniform_options
var/list/shoe_options
var/list/head_options
var/list/headset_options
if(clothing_possibilities && clothing_possibilities.len)
for(var/path in clothing_possibilities)
if(ispath(path, /obj/item/clothing/under))
if(!uniform_options)
uniform_options = list()
uniform_options |= path
if(ispath(path, /obj/item/clothing/shoes))
if(!shoe_options)
shoe_options = list()
shoe_options |= path
if(ispath(path, /obj/item/clothing/head))
if(!head_options)
head_options = list()
head_options |= path
if(ispath(path, /obj/item/device/radio/headset))
if(!headset_options)
headset_options = list()
headset_options |= path
if(uniform_options && uniform_options.len)
var/newpath = pick(uniform_options)
var/obj/item/clothing/C = new newpath(H)
H.equip_to_appropriate_slot(C)
if(shoe_options && shoe_options.len)
var/newpath = pick(shoe_options)
var/obj/item/clothing/C = new newpath(H)
H.equip_to_appropriate_slot(C)
if(head_options && head_options.len)
var/newpath = pick(head_options)
var/obj/item/clothing/C = new newpath(H)
H.equip_to_appropriate_slot(C)
if(headset_options && headset_options.len)
var/newpath = pick(headset_options)
var/obj/item/C = new newpath(H)
H.equip_to_appropriate_slot(C)
if(spawn_with_emag)
var/obj/item/weapon/card/emag/E = new(H)
E.name = "broken card"
E.description_antag = "This is a 'disguised' emag, to make your escape from wherever you happen to be trapped."
H.equip_to_appropriate_slot(E)
var/newname = sanitize(input(H, "Your mind feels foggy, and you recall your name might be [H.real_name]. Would you like to change your name?", "Name change") as null|text, MAX_NAME_LEN)
if (newname)
H.real_name = newname
icon_state = icon_state_opened
H.forceMove(T)
if(make_antag)
var/datum/antagonist/antag = all_antag_types[make_antag]
if(antag)
if(antag.add_antagonist(H.mind, 1, 1, 0, 1, 1))
log_admin("\The [src] made [key_name(src)] into a [antag.role_text].")
if(start_injured) // Done 3 different times to disperse damage.
H.adjustBruteLoss(rand(1,20))
H.adjustBruteLoss(rand(1,20))
H.adjustBruteLoss(rand(1,20))
if(allow_appearance_change)
H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 1)
visible_message("<span class='aliem'>\The [src] [pick("gurgles", "seizes", "clangs")] before releasing \the [H]!</span>")
// Manual Variant
// This one lacks the emag option due to the fact someone has to activate it, and they will probably help the person.
/obj/structure/ghost_pod/manual/human
name = "mysterious cryopod"
desc = "This is a pod which appears to contain a body."
description_info = "This contains a body, which may wake at any time. The external controls\
seem to be functioning, though the warning lights that flash give no solace.."
icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "sleeper_1"
icon_state_opened = "sleeper_0"
density = TRUE
ghost_query_type = /datum/ghost_query/lost_passenger
anchored = FALSE
var/occupant_type = "lost passenger"
var/allow_appearance_change = TRUE
var/make_antag = MODE_STOWAWAY
var/start_injured = TRUE
var/list/clothing_possibilities
/obj/structure/ghost_pod/manual/human/Initialize()
..()
handle_clothing_setup()
/obj/structure/ghost_pod/manual/human/proc/handle_clothing_setup()
clothing_possibilities = list()
clothing_possibilities |= subtypesof(/obj/item/clothing/under/utility)
clothing_possibilities |= subtypesof(/obj/item/clothing/head/beret)
clothing_possibilities |= /obj/item/clothing/shoes/black
clothing_possibilities |= /obj/item/device/radio/headset
/obj/structure/ghost_pod/manual/human/create_occupant(var/mob/M)
..()
var/turf/T = get_turf(src)
var/mob/living/carbon/human/H = new(src)
H.adjustCloneLoss(rand(1,5))
if(M.mind)
M.mind.transfer_to(H)
to_chat(M, "<span class='notice'>You are a [occupant_type]!</span>")
if(make_antag)
to_chat(M, "<span class='warning'>Your intent may not be completely beneficial.</span>")
H.ckey = M.ckey
visible_message("<span class='warning'>As \the [src] opens, the pipes on \the [src] surge, before it grows dark.</span>")
log_and_message_admins("successfully opened \a [src] and got a [occupant_type].")
var/list/uniform_options
var/list/shoe_options
var/list/head_options
var/list/headset_options
if(clothing_possibilities && clothing_possibilities.len)
for(var/path in clothing_possibilities)
if(ispath(path, /obj/item/clothing/under))
if(!uniform_options)
uniform_options = list()
uniform_options |= path
if(ispath(path, /obj/item/clothing/shoes))
if(!shoe_options)
shoe_options = list()
shoe_options |= path
if(ispath(path, /obj/item/clothing/head))
if(!head_options)
head_options = list()
head_options |= path
if(ispath(path, /obj/item/device/radio/headset))
if(!headset_options)
headset_options = list()
headset_options |= path
if(uniform_options && uniform_options.len)
var/newpath = pick(uniform_options)
var/obj/item/clothing/C = new newpath(H)
H.equip_to_appropriate_slot(C)
if(shoe_options && shoe_options.len)
var/newpath = pick(shoe_options)
var/obj/item/clothing/C = new newpath(H)
H.equip_to_appropriate_slot(C)
if(head_options && head_options.len)
var/newpath = pick(head_options)
var/obj/item/clothing/C = new newpath(H)
H.equip_to_appropriate_slot(C)
if(headset_options && headset_options.len)
var/newpath = pick(headset_options)
var/obj/item/C = new newpath(H)
H.equip_to_appropriate_slot(C)
var/newname = sanitize(input(H, "Your mind feels foggy, and you recall your name might be [H.real_name]. Would you like to change your name?", "Name change") as null|text, MAX_NAME_LEN)
if (newname)
H.real_name = newname
icon_state = icon_state_opened
H.forceMove(T)
if(make_antag)
var/datum/antagonist/antag = all_antag_types[make_antag]
if(antag)
if(antag.add_antagonist(H.mind, 1, 1, 0, 1, 1))
log_admin("\The [src] made [key_name(src)] into a [antag.role_text].")
if(start_injured) // Done 3 different times to disperse damage.
H.adjustBruteLoss(rand(1,20))
H.adjustBruteLoss(rand(1,20))
H.adjustBruteLoss(rand(1,20))
if(allow_appearance_change)
H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 1)
visible_message("<span class='aliem'>\The [src] [pick("gurgles", "seizes", "clangs")] before releasing \the [H]!</span>")
@@ -58,4 +58,50 @@
R.ckey = M.ckey
visible_message("<span class='warning'>As \the [src] opens, the eyes of the robot flicker as it is activated.</span>")
R.Namepick()
..()
..()
/obj/structure/ghost_pod/ghost_activated/swarm_drone
name = "drone shell"
desc = "A heavy metallic ball."
icon = 'icons/mob/swarmbot.dmi'
icon_state = "swarmer_unactivated"
density = FALSE
anchored = FALSE
var/drone_class = "general"
var/drone_type = /mob/living/silicon/robot/drone/swarm
/obj/structure/ghost_pod/ghost_activated/swarm_drone/create_occupant(var/mob/M)
var/mob/living/silicon/robot/drone/swarm/R = new drone_type(get_turf(src))
if(M.mind)
M.mind.transfer_to(R)
to_chat(M, "<span class='cult'>You are <b>[R]</b>, the remnant of some distant species, mechanical or flesh, living or dead.</span>")
R.ckey = M.ckey
visible_message("<span class='cult'>As \the [src] shudders, it glows before lifting itself with three shimmering limbs!</span>")
spawn(3 SECONDS)
to_chat(R,"<span class='notice'>Many of your tools are standard drone devices, however others provide you with particular benefits.</span>")
to_chat(R,"<span class='notice'>Unlike standard drones, you are capable of utilizing 'zero point wells', found in your 'spells' tab.</span>")
to_chat(R,"<span class='notice'>Here you will also find your replication ability(s), depending on the type of drone you are.</span>")
to_chat(R,"<span class='notice'>Gunners have a special anti-personnel gun capable of shocking or punching through armor with low damage.</span>")
to_chat(R,"<span class='notice'>Impalers have an energy-lance.</span>")
to_chat(R,"<span class='notice'>General drones have the unique ability to produce one of each of these two types of shells per generation.</span>")
if(!QDELETED(src))
qdel(src)
/obj/structure/ghost_pod/ghost_activated/swarm_drone/event/Initialize()
..()
var/turf/T = get_turf(src)
say_dead_object("A <span class='notice'>[drone_class] swarm drone</span> shell is now available in \the [T.loc].", src)
/obj/structure/ghost_pod/ghost_activated/swarm_drone/event/gunner
name = "gunner shell"
drone_class = "gunner"
drone_type = /mob/living/silicon/robot/drone/swarm/gunner
/obj/structure/ghost_pod/ghost_activated/swarm_drone/event/melee
name = "impaler shell"
drone_class = "impaler"
drone_type = /mob/living/silicon/robot/drone/swarm/melee
+150
View File
@@ -0,0 +1,150 @@
/obj/structure/cult/pylon/swarm
name = "Swarm Construct"
desc = "A small pod."
icon = 'icons/mob/swarmbot.dmi'
icon_state = "pod"
light_color = "#00B2B2"
shatter_message = "The energetic field shatters!"
impact_sound = 'sound/effects/Glasshit.ogg'
shatter_sound = 'sound/effects/phasein.ogg'
var/list/active_beams
/obj/structure/cult/pylon/swarm/CanPass(atom/movable/mover, turf/target)
if(istype(mover, /mob/living))
var/mob/living/L = mover
if(L.faction == "swarmer")
return TRUE
else if(istype(mover, /obj/item/projectile))
var/obj/item/projectile/P = mover
if(istype(P.firer) && P.firer.faction == "swarmer")
return TRUE
return ..()
/obj/structure/cult/pylon/swarm/Initialize()
..()
active_beams = list()
/obj/structure/cult/pylon/swarm/Destroy()
for(var/datum/beam/B in active_beams)
QDEL_NULL(B)
active_beams = null
..()
/obj/structure/cult/pylon/swarm/pylonhit(var/damage)
if(!isbroken)
if(prob(1 + damage * 3))
visible_message("<span class='danger'>[shatter_message]</span>")
STOP_PROCESSING(SSobj, src)
playsound(get_turf(src),shatter_sound, 75, 1)
isbroken = 1
density = 0
icon_state = "[initial(icon_state)]-broken"
set_light(0)
/obj/structure/cult/pylon/swarm/attackpylon(mob/user as mob, var/damage)
if(!isbroken)
if(prob(1 + damage * 3))
user.visible_message(
"<span class='danger'>[user] smashed \the [src]!</span>",
"<span class='warning'>You hit \the [src], and its crystal breaks apart!</span>",
"You hear a tinkle of crystalline shards."
)
STOP_PROCESSING(SSobj, src)
user.do_attack_animation(src)
playsound(get_turf(src),shatter_sound, 75, 1)
isbroken = 1
density = 0
icon_state = "[initial(icon_state)]-broken"
set_light(0)
else
to_chat(user, "You hit \the [src]!")
playsound(get_turf(src),impact_sound, 75, 1)
else
if(prob(damage * 2))
to_chat(user, "You pulverize what was left of \the [src]!")
qdel(src)
else
to_chat(user, "You hit \the [src]!")
playsound(get_turf(src),impact_sound, 75, 1)
/obj/structure/cult/pylon/swarm/pylon_unique()
. = ..()
return .
/obj/structure/cult/pylon/swarm/zp_well
name = "Zero Point Well"
desc = "Infinite cosmic power, itty bitty usability."
icon_state = "trap"
description_info = "An infinitely small point in space that may or may not be used to supply power to some form of advanced machine."
activation_cooldown = 0 // These things run constantly.
/obj/structure/cult/pylon/swarm/zp_well/pylon_unique()
. = ..()
for(var/mob/living/silicon/robot/drone/swarm/S in view(3, src))
var/has_beam = FALSE
for(var/datum/beam/B in active_beams)
if(B.target == S)
has_beam = TRUE
break
if(!has_beam)
active_beams |= Beam(S,icon='icons/effects/beam.dmi',icon_state="holo_beam",time=3 SECONDS,maxdistance=3,beam_type = /obj/effect/ebeam,beam_sleep_time=2)
if(S.cell)
S.cell.give(rand(5, 30))
. = TRUE
return .
/obj/structure/cult/pylon/swarm/defender
name = "Zero Point Wall"
desc = "Infinite cosmic power, itty bitty passability."
icon_state = "barricade"
description_info = "An infinitely small point in space spread upon infinitely many finitely-bounded points in space. Nice."
/obj/structure/cult/pylon/swarm/defender/pylonhit(var/damage)
if(!isbroken)
if(prob(1 + damage * 3) && round(damage * 0.8) >= 30)
visible_message("<span class='danger'>[shatter_message]</span>")
STOP_PROCESSING(SSobj, src)
playsound(get_turf(src),shatter_sound, 75, 1)
isbroken = 1
density = 0
icon_state = "[initial(icon_state)]-broken"
set_light(0)
/obj/structure/cult/pylon/swarm/defender/attackpylon(mob/user as mob, var/damage)
if(!isbroken)
if(prob(1 + damage * 3) && round(damage * 0.8) >= 25)
user.visible_message(
"<span class='danger'>[user] smashed \the [src]!</span>",
"<span class='warning'>You hit \the [src], and its crystal breaks apart!</span>",
"You hear a tinkle of crystalline shards."
)
STOP_PROCESSING(SSobj, src)
user.do_attack_animation(src)
playsound(get_turf(src),shatter_sound, 75, 1)
isbroken = 1
density = 0
icon_state = "[initial(icon_state)]-broken"
set_light(0)
else
to_chat(user, "You hit \the [src]!")
playsound(get_turf(src),impact_sound, 75, 1)
else
if(prob(damage * 2))
to_chat(user, "You pulverize what was left of \the [src]!")
qdel(src)
else
to_chat(user, "You hit \the [src]!")
playsound(get_turf(src),impact_sound, 75, 1)