mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-07-12 00:32:44 +01:00
Security / PseudoCargo Expansion (#6482)
* Security Expansion work. * Weaponized Racism, Stowaways, Meteors * Fix Fix. Prep modular armor for addition. * Fix the boots. * More modular armor work. Now in cargo! * Fixfix * Fixfix * Thank you anxiety very cool. * Make a Stowaway Antag * FixFix
This commit is contained in:
@@ -12,14 +12,16 @@
|
||||
name = "rolled-up poster"
|
||||
desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface."
|
||||
icon_state = "rolled_poster"
|
||||
var/serial_number = 0
|
||||
var/serial_number = null
|
||||
|
||||
var/poster_type = /obj/structure/sign/poster
|
||||
|
||||
/obj/item/weapon/contraband/poster/New(turf/loc, var/given_serial = 0)
|
||||
if(given_serial == 0)
|
||||
serial_number = rand(1, poster_designs.len)
|
||||
else
|
||||
serial_number = given_serial
|
||||
if(!serial_number)
|
||||
if(given_serial == 0)
|
||||
serial_number = rand(1, poster_designs.len)
|
||||
else
|
||||
serial_number = given_serial
|
||||
name += " - No. [serial_number]"
|
||||
..(loc)
|
||||
|
||||
@@ -57,7 +59,7 @@
|
||||
|
||||
user << "<span class='notice'>You start placing the poster on the wall...</span>" //Looks like it's uncluttered enough. Place the poster.
|
||||
|
||||
var/obj/structure/sign/poster/P = new(user.loc, placement_dir=get_dir(user, W), serial=serial_number)
|
||||
var/obj/structure/sign/poster/P = new poster_type(user.loc, placement_dir=get_dir(user, W), serial=serial_number, itemtype = src.type)
|
||||
|
||||
flick("poster_being_set", P)
|
||||
//playsound(W, 'sound/items/poster_being_created.ogg', 100, 1) //why the hell does placing a poster make printer sounds?
|
||||
@@ -74,6 +76,18 @@
|
||||
|
||||
qdel(oldsrc) //delete it now to cut down on sanity checks afterwards. Agouri's code supports rerolling it anyway
|
||||
|
||||
//NT subtype
|
||||
/obj/item/weapon/contraband/poster/nanotrasen
|
||||
icon_state = "rolled_poster_nt"
|
||||
poster_type = /obj/structure/sign/poster/nanotrasen
|
||||
|
||||
/obj/item/weapon/contraband/poster/nanotrasen/New(turf/loc, var/given_serial = 0)
|
||||
if(given_serial == 0)
|
||||
serial_number = rand(1, NT_poster_designs.len)
|
||||
else
|
||||
serial_number = given_serial
|
||||
..(loc)
|
||||
|
||||
//############################## THE ACTUAL DECALS ###########################
|
||||
|
||||
/obj/structure/sign/poster
|
||||
@@ -85,15 +99,22 @@
|
||||
var/poster_type //So mappers can specify a desired poster
|
||||
var/ruined = 0
|
||||
|
||||
/obj/structure/sign/poster/New(var/newloc, var/placement_dir=null, var/serial=null)
|
||||
var/roll_type
|
||||
var/poster_set = FALSE
|
||||
|
||||
/obj/structure/sign/poster/New(var/newloc, var/placement_dir=null, var/serial=null, var/itemtype = /obj/item/weapon/contraband/poster)
|
||||
..(newloc)
|
||||
|
||||
if(!serial)
|
||||
serial = rand(1, poster_designs.len) //use a random serial if none is given
|
||||
|
||||
serial_number = serial
|
||||
var/datum/poster/design = poster_designs[serial_number]
|
||||
set_poster(design)
|
||||
if(!poster_set)
|
||||
serial_number = serial
|
||||
var/datum/poster/design = poster_designs[serial_number]
|
||||
set_poster(design)
|
||||
|
||||
if(itemtype || !roll_type)
|
||||
roll_type = itemtype
|
||||
|
||||
switch (placement_dir)
|
||||
if (NORTH)
|
||||
@@ -121,6 +142,8 @@
|
||||
desc = "[initial(desc)] [design.desc]"
|
||||
icon_state = design.icon_state // poster[serial_number]
|
||||
|
||||
poster_set = TRUE
|
||||
|
||||
/obj/structure/sign/poster/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(W.is_wirecutter())
|
||||
playsound(src.loc, W.usesound, 100, 1)
|
||||
@@ -132,7 +155,6 @@
|
||||
roll_and_drop(user.loc)
|
||||
return
|
||||
|
||||
|
||||
/obj/structure/sign/poster/attack_hand(mob/user as mob)
|
||||
|
||||
if(ruined)
|
||||
@@ -152,7 +174,7 @@
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/structure/sign/poster/proc/roll_and_drop(turf/newloc)
|
||||
var/obj/item/weapon/contraband/poster/P = new(src, serial_number)
|
||||
var/obj/item/weapon/contraband/poster/P = new roll_type(src, serial_number)
|
||||
P.loc = newloc
|
||||
src.loc = P
|
||||
qdel(src)
|
||||
@@ -163,3 +185,17 @@
|
||||
// Description suffix
|
||||
var/desc=""
|
||||
var/icon_state=""
|
||||
|
||||
// NT poster subtype.
|
||||
/obj/structure/sign/poster/nanotrasen
|
||||
roll_type = /obj/item/weapon/contraband/poster/nanotrasen
|
||||
|
||||
/obj/structure/sign/poster/nanotrasen/New(var/newloc, var/placement_dir=null, var/serial=null, var/itemtype = /obj/item/weapon/contraband/poster/nanotrasen)
|
||||
if(!serial)
|
||||
serial = rand(1, NT_poster_designs.len)
|
||||
|
||||
serial_number = serial
|
||||
var/datum/poster/design = NT_poster_designs[serial_number]
|
||||
set_poster(design)
|
||||
|
||||
..(newloc, placement_dir, serial, itemtype)
|
||||
|
||||
@@ -43,4 +43,171 @@
|
||||
name = "Airlock Maintenance Reference"
|
||||
desc = "This poster appears to be reference material for maintenance personnel, instructing to always wear insulated gloves, that wirecutters and \
|
||||
a multitool are the optimal tools to use, and where to find the maintenance panel on most airlocks. Unfortunately, the poster does not mention any \
|
||||
wire codes."
|
||||
wire codes."
|
||||
|
||||
/datum/poster/pol_10
|
||||
icon_state="polposter9"
|
||||
name = "orchid"
|
||||
desc = "This poster appears strangely familiar, depicting the flower of a tree native to the planet Earth."
|
||||
|
||||
// A new subset of poster datum for Security posters.
|
||||
/datum/poster/nanotrasen
|
||||
icon_state = "polposter1"
|
||||
name = "Safety!"
|
||||
desc = "A poster advising you to learn how to put on your internals at a moment's notice."
|
||||
|
||||
/datum/poster/nanotrasen/pol_2
|
||||
icon_state="polposter2"
|
||||
name = "Safety!"
|
||||
desc = "A blue and white colored poster. This one advises you to wear your safety goggles when handling chemicals."
|
||||
|
||||
/datum/poster/nanotrasen/pol_3
|
||||
icon_state="polposter3"
|
||||
name = "Safety!"
|
||||
desc = "A safety poster instructing you to comply with the authorities, especially in an emergency."
|
||||
|
||||
/datum/poster/nanotrasen/pol_4
|
||||
icon_state="polposter4"
|
||||
name = "Clean Hands Save Lives"
|
||||
desc = "A safety poster reminding you to wash your hands."
|
||||
|
||||
/datum/poster/nanotrasen/pol_5
|
||||
icon_state="polposter5"
|
||||
name = "Help!"
|
||||
desc = "This poster depicts a man helping another man get up."
|
||||
|
||||
/datum/poster/nanotrasen/pol_6
|
||||
icon_state="polposter6"
|
||||
name = "Walk!"
|
||||
desc = "This poster depicts a man walking, presumably to encourage you not to run in the halls."
|
||||
|
||||
/datum/poster/nanotrasen/pol_7
|
||||
icon_state="polposter7"
|
||||
name = "Place your signs!"
|
||||
desc = "A safety poster reminding custodial staff to place wet floor signs where needed. This reminder's rarely heeded."
|
||||
|
||||
/datum/poster/nanotrasen/pol_8
|
||||
icon_state="polposter8"
|
||||
name = "Safety!"
|
||||
desc = "An advertisement / safety poster for EVA training and certification. Training is available at your local Central Command."
|
||||
|
||||
/datum/poster/nanotrasen/pol_9
|
||||
icon_state="poster10"
|
||||
name = "Airlock Maintenance Reference"
|
||||
desc = "This poster appears to be reference material for maintenance personnel, instructing to always wear insulated gloves, that wirecutters and \
|
||||
a multitool are the optimal tools to use, and where to find the maintenance panel on most airlocks. Unfortunately, the poster does not mention any \
|
||||
wire codes."
|
||||
|
||||
/datum/poster/nanotrasen/pol_10
|
||||
icon_state="polposter9"
|
||||
name = "orchid"
|
||||
desc = "This poster suggests a feeling of peace. It depicts the flower of a tree native to the planet Earth."
|
||||
|
||||
/datum/poster/nanotrasen/bay_9
|
||||
icon_state="bsposter9"
|
||||
name = "Pinup Girl Amy"
|
||||
desc = "This particular one is of Amy, the nymphomaniac urban legend of deep space. How this photograph came to be is not known."
|
||||
|
||||
/datum/poster/nanotrasen/bay_21
|
||||
icon_state="bsposter21"
|
||||
name = "Join the Fuzz!"
|
||||
desc = "It's a nice recruitment poster of a white haired Chinese woman that says; \"Big Guns, Hot Women, Good Times. Security. We get it done.\""
|
||||
|
||||
/datum/poster/nanotrasen/bay_22
|
||||
icon_state="bsposter22"
|
||||
name = "Looking for a career with excitement?"
|
||||
desc = "A recruitment poster starring a dark haired woman with glasses and a purple shirt that has \"Got Brains? Got Talent? Not afraid of electric flying monsters that want to suck the soul out of you? Then Xenobiology could use someone like you!\" written on the bottom."
|
||||
|
||||
/datum/poster/nanotrasen/bay_23
|
||||
icon_state="bsposter23"
|
||||
name = "Safety first: because electricity doesn't wait!"
|
||||
desc = "A safety poster starring a clueless looking redhead with frazzled hair. \"Every year, hundreds of NT employees expose themselves to electric shock. Play it safe. Avoid suspicious doors after electrical storms, and always wear protection when doing electric maintenance.\""
|
||||
|
||||
/datum/poster/nanotrasen/bay_24
|
||||
icon_state="bsposter24"
|
||||
name = "Responsible medbay habits, No #259"
|
||||
desc = "A poster with a nervous looking geneticist on it states; \"Friends Tell Friends They're Clones. It can cause severe and irreparable emotional trauma if a person is not properly informed of their recent demise. Always follow your contractual obligation and inform them of their recent rejuvenation.\""
|
||||
|
||||
/datum/poster/nanotrasen/bay_25
|
||||
icon_state="bsposter25"
|
||||
name = "Irresponsible medbay habits, No #2"
|
||||
desc = "This is a safety poster starring a perverted looking naked doctor. \"Sexual harassment is never okay. REPORT any acts of sexual deviance or harassment that disrupt a healthy working environment.\""
|
||||
|
||||
/datum/poster/nanotrasen/bay_49
|
||||
icon_state="bsposter49"
|
||||
name = "Engineering recruitment"
|
||||
desc = "This is a poster showing an engineer relaxing by a computer, the text states \"Living the life! Join Engineering today!\""
|
||||
|
||||
/datum/poster/nanotrasen/bay_52
|
||||
icon_state="bsposter52"
|
||||
name = "fire safety poster"
|
||||
desc = "This is a poster reminding you of what you should do if you are on fire, or if you are at a dance party."
|
||||
|
||||
/datum/poster/nanotrasen/bay_53
|
||||
icon_state="bsposter53"
|
||||
name = "fire extinguisher poster"
|
||||
desc = "This is a poster reminding you of what you should use to put out a fire."
|
||||
|
||||
/datum/poster/nanotrasen/bay_54
|
||||
icon_state="bsposter54"
|
||||
name = "firefighter poster"
|
||||
desc = "This is a poster of a particularly stern looking firefighter. The caption reads, \"Only you can prevent space fires.\""
|
||||
|
||||
/datum/poster/nanotrasen/bay_57
|
||||
icon_state="bsposter57"
|
||||
name = "space carp warning poster"
|
||||
desc = "This poster tells of the dangers of space carp infestations."
|
||||
|
||||
/datum/poster/nanotrasen/bay_58
|
||||
icon_state="bsposter58"
|
||||
name = "space carp information poster"
|
||||
desc = "This poster showcases an old spacer saying on the dangers of migrant space carp."
|
||||
|
||||
/datum/poster/nanotrasen/nt_1
|
||||
icon_state = "ntposter01"
|
||||
name = "Security recruitment"
|
||||
desc = "This poster showcases an NT security guard in an excited pose, with a small blurb about the importance of Security."
|
||||
|
||||
/datum/poster/nanotrasen/nt_2
|
||||
icon_state = "ntposter02"
|
||||
name = "Security recruitment"
|
||||
desc = "This poster showcases an NT security guard in an excited pose, with a small blurb about Security Employee benefits."
|
||||
|
||||
/datum/poster/nanotrasen/nt_3
|
||||
icon_state = "ntposter03"
|
||||
name = "Mechatronic Safety"
|
||||
desc = "This poster displays three cutting-edge gygaxes standing in line in front of a man in plain clothes.\
|
||||
The poster's captions explain the importance of knowing how to operate a mechatronic vehicle safely, especially near other personnel.\
|
||||
The image seems important."
|
||||
|
||||
/datum/poster/nanotrasen/nt_4
|
||||
icon_state = "ntposter04"
|
||||
name = "Beware Aetotheans"
|
||||
desc = "This poster displays a distinctly hostile-looking red Promethean in a black coat. The fine-print around the edges warns the reader about the dangers posed by Almachi Prometheans."
|
||||
|
||||
/datum/poster/nanotrasen/nt_5
|
||||
icon_state = "ntposter05"
|
||||
name = "Promethean"
|
||||
desc = "This poster displays a friendly-looking green Promethean in a labcoat. The fine-print around the edges talks about the benefits Prometheans give in laboratories."
|
||||
|
||||
/datum/poster/nanotrasen/nt_6
|
||||
icon_state = "ntposter06"
|
||||
name = "NanoTrasen"
|
||||
desc = "This poster showcases an NT emblem. There is writing in the ring around the inner points, probably some sort of slogan no one bothers to memorize."
|
||||
|
||||
/datum/poster/nanotrasen/nt_7
|
||||
icon_state = "ntposter07"
|
||||
name = "SolGov"
|
||||
desc = "This poster showcases an SCG emblem. The outer ring reads,\
|
||||
\"<font face='times new roman ms'>NIL MORTALIBUS ARDUI EST</font>\".\
|
||||
Solar Confederate Government."
|
||||
|
||||
/datum/poster/nanotrasen/nt_8
|
||||
icon_state = "ntposter08"
|
||||
name = "wildlife hazard"
|
||||
desc = "This poster warns against attempting to kill a fully grown giant spider or other hostile life-form alone."
|
||||
|
||||
/datum/poster/nanotrasen/nt_9
|
||||
icon_state = "ntposter09"
|
||||
name = "Regulations and You"
|
||||
desc = "This poster showcases an NT security guard reading from her PDA. The blurb advocates for the reader to keep corporate regulations in mind at all times, as an emergency can occur at any time."
|
||||
|
||||
@@ -134,6 +134,8 @@
|
||||
var/travelling_in_vent = 0
|
||||
var/list/grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/nurse, /mob/living/simple_mob/animal/giant_spider/hunter)
|
||||
|
||||
var/stunted = FALSE
|
||||
|
||||
/obj/effect/spider/spiderling/frost
|
||||
grow_as = list(/mob/living/simple_mob/animal/giant_spider/frost)
|
||||
|
||||
@@ -253,9 +255,17 @@
|
||||
break
|
||||
if(amount_grown >= 100)
|
||||
var/spawn_type = pick(grow_as)
|
||||
new spawn_type(src.loc, src)
|
||||
var/mob/living/simple_mob/animal/giant_spider/GS = new spawn_type(src.loc, src)
|
||||
if(stunted)
|
||||
spawn(2)
|
||||
GS.make_spiderling()
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spider/spiderling/stunted
|
||||
stunted = TRUE
|
||||
|
||||
grow_as = list(/mob/living/simple_mob/animal/giant_spider, /mob/living/simple_mob/animal/giant_spider/hunter)
|
||||
|
||||
/obj/effect/decal/cleanable/spiderling_remains
|
||||
name = "spiderling remains"
|
||||
desc = "Green squishy mess."
|
||||
|
||||
@@ -243,6 +243,13 @@
|
||||
electric_cost_coefficent = 41.66 // Twice as efficent, out of pity.
|
||||
toolspeed = 0.5 // Twice as fast, since borg versions typically have this.
|
||||
|
||||
/obj/item/weapon/rcd/electric/mounted/borg/swarm
|
||||
can_remove_rwalls = FALSE
|
||||
name = "Rapid Assimilation Device"
|
||||
ranged = TRUE
|
||||
toolspeed = 0.7
|
||||
material_to_use = MAT_STEELHULL
|
||||
|
||||
/obj/item/weapon/rcd/electric/mounted/borg/lesser
|
||||
can_remove_rwalls = FALSE
|
||||
|
||||
|
||||
@@ -197,6 +197,9 @@ var/last_chew = 0
|
||||
breakouttime = 200
|
||||
cuff_type = "duct tape"
|
||||
|
||||
/obj/item/weapon/handcuffs/cable/tape/cyborg
|
||||
dispenser = TRUE
|
||||
|
||||
//Legcuffs. Not /really/ handcuffs, but its close enough.
|
||||
/obj/item/weapon/handcuffs/legcuffs
|
||||
name = "legcuffs"
|
||||
|
||||
@@ -368,6 +368,13 @@
|
||||
target.taunt(user)
|
||||
target.adjustFireLoss(force * 6) // 30 Burn, for 50 total.
|
||||
|
||||
/obj/item/weapon/melee/energy/sword/ionic_rapier/lance
|
||||
name = "zero-point lance"
|
||||
desc = "Designed specifically for disrupting electronics at relatively close range, however it is still capable of dealing some damage to living beings."
|
||||
active_force = 20
|
||||
armor_penetration = 15
|
||||
reach = 2
|
||||
|
||||
/*
|
||||
* Charge blade. Uses a cell, and costs energy per strike.
|
||||
*/
|
||||
|
||||
@@ -373,3 +373,17 @@
|
||||
max_w_class = ITEMSIZE_NORMAL
|
||||
w_class = ITEMSIZE_SMALL
|
||||
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks,/obj/item/weapon/reagent_containers/food/condiment)
|
||||
|
||||
// -----------------------------
|
||||
// Evidence Bag
|
||||
// -----------------------------
|
||||
/obj/item/weapon/storage/bag/detective
|
||||
name = "secure satchel"
|
||||
icon = 'icons/obj/storage.dmi'
|
||||
icon_state = "detbag"
|
||||
desc = "A bag for storing investigation things. You know, securely."
|
||||
max_storage_space = ITEMSIZE_COST_NORMAL * 15
|
||||
max_w_class = ITEMSIZE_NORMAL
|
||||
w_class = ITEMSIZE_SMALL
|
||||
can_hold = list(/obj/item/weapon/forensics/swab,/obj/item/weapon/sample/print,/obj/item/weapon/sample/fibers,/obj/item/weapon/evidencebag)
|
||||
|
||||
|
||||
@@ -109,7 +109,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,
|
||||
@@ -219,6 +219,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()
|
||||
@@ -267,6 +269,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()
|
||||
@@ -301,6 +304,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
|
||||
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user