mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-20 20:45:28 +01:00
[MIRROR] Super Mega Mob Spawn Refactor [MDB IGNORE] (#10075)
* Super Mega Mob Spawn Refactor * Super Mega Mob Spawn Refactor * Update modular changes * update kilo * i wish unit tests would work on my machine * fix kilo...? Co-authored-by: tralezab <40974010+tralezab@users.noreply.github.com> Co-authored-by: Tom <8881105+tf-4@users.noreply.github.com> Co-authored-by: Gandalf <jzo123@hotmail.com>
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
|
||||
//jobs from ss13 but DEAD.
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/cargo_tech
|
||||
name = "Cargo Tech"
|
||||
outfit = /datum/outfit/job/cargo_tech
|
||||
icon_state = "corpsecargotech"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/cook
|
||||
name = "Cook"
|
||||
outfit = /datum/outfit/job/cook
|
||||
icon_state = "corpsecook"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/doctor
|
||||
name = "Doctor"
|
||||
outfit = /datum/outfit/job/doctor
|
||||
icon_state = "corpsedoctor"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/geneticist
|
||||
name = "Geneticist"
|
||||
outfit = /datum/outfit/job/geneticist
|
||||
icon_state = "corpsescientist"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/engineer
|
||||
name = "Engineer"
|
||||
outfit = /datum/outfit/job/engineer/gloved
|
||||
icon_state = "corpseengineer"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/engineer/rig
|
||||
outfit = /datum/outfit/job/engineer/gloved/rig
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/engineer/rig/gunner
|
||||
outfit = /datum/outfit/job/engineer/gloved/rig/gunner
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/clown
|
||||
name = "Clown"
|
||||
outfit = /datum/outfit/job/clown
|
||||
icon_state = "corpseclown"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/scientist
|
||||
name = "Scientist"
|
||||
outfit = /datum/outfit/job/scientist
|
||||
icon_state = "corpsescientist"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/miner
|
||||
name = "Shaft Miner"
|
||||
outfit = /datum/outfit/job/miner
|
||||
icon_state = "corpseminer"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/miner/rig
|
||||
outfit = /datum/outfit/job/miner/equipped/hardsuit
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/miner/explorer
|
||||
outfit = /datum/outfit/job/miner/equipped
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/plasmaman
|
||||
mob_species = /datum/species/plasmaman
|
||||
outfit = /datum/outfit/plasmaman
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/assistant
|
||||
name = "Assistant"
|
||||
outfit = /datum/outfit/job/assistant
|
||||
icon_state = "corpsegreytider"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/assistant/beesease_infection/special(mob/living/spawned_mob)
|
||||
. = ..()
|
||||
spawned_mob.ForceContractDisease(new /datum/disease/beesease)
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/assistant/brainrot_infection/special(mob/living/spawned_mob)
|
||||
. = ..()
|
||||
spawned_mob.ForceContractDisease(new /datum/disease/brainrot)
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/assistant/spanishflu_infection/special(mob/living/spawned_mob)
|
||||
. = ..()
|
||||
spawned_mob.ForceContractDisease(new /datum/disease/fluspanish)
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/bartender
|
||||
name = "Bartender"
|
||||
outfit = /datum/outfit/spacebartender
|
||||
@@ -171,7 +171,7 @@
|
||||
if(prob(50))
|
||||
neck = /obj/item/bedsheet/rd/royal_cape
|
||||
if(prob(10) && !visualsOnly) //visualsonly = not a golem = can't put things in the pockets without a jumpsuit
|
||||
l_pocket = pick(list(/obj/item/crowbar/power, /obj/item/screwdriver/power, /obj/item/weldingtool/experimental))
|
||||
l_pocket = pick(list(/obj/item/crowbar/power, /obj/item/screwdriver/power, /obj/item/weldingtool/electric)) // SKYRAT EDIT CHANGE FROM /obj/item/weldingtool/experimental
|
||||
|
||||
//this is so pointlessly gendered but whatever bro i'm here to refactor not judge
|
||||
/datum/outfit/consumed_dame
|
||||
|
||||
@@ -0,0 +1,229 @@
|
||||
|
||||
///all the corpses meant as mob drops yes, these definitely could be sorted properly. i invite (you) to do it!!
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/syndicatesoldier
|
||||
name = "Syndicate Operative"
|
||||
hairstyle = "Bald"
|
||||
facial_hairstyle = "Shaved"
|
||||
outfit = /datum/outfit/syndicatesoldiercorpse
|
||||
|
||||
/datum/outfit/syndicatesoldiercorpse
|
||||
name = "Syndicate Operative Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
|
||||
ears = /obj/item/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas
|
||||
head = /obj/item/clothing/head/helmet/swat
|
||||
back = /obj/item/storage/backpack
|
||||
id = /obj/item/card/id/advanced/chameleon
|
||||
id_trim = /datum/id_trim/chameleon/operative
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/syndicatecommando
|
||||
name = "Syndicate Commando"
|
||||
hairstyle = "Bald"
|
||||
facial_hairstyle = "Shaved"
|
||||
outfit = /datum/outfit/syndicatecommandocorpse
|
||||
|
||||
/datum/outfit/syndicatecommandocorpse
|
||||
name = "Syndicate Commando Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
|
||||
ears = /obj/item/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas/syndicate
|
||||
back = /obj/item/tank/jetpack/oxygen
|
||||
r_pocket = /obj/item/tank/internals/emergency_oxygen
|
||||
id = /obj/item/card/id/advanced/chameleon
|
||||
id_trim = /datum/id_trim/chameleon/operative
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/syndicatestormtrooper
|
||||
name = "Syndicate Stormtrooper"
|
||||
hairstyle = "Bald"
|
||||
facial_hairstyle = "Shaved"
|
||||
outfit = /datum/outfit/syndicatestormtroopercorpse
|
||||
|
||||
/datum/outfit/syndicatestormtroopercorpse
|
||||
name = "Syndicate Stormtrooper Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/tackler/combat
|
||||
ears = /obj/item/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas/syndicate
|
||||
back = /obj/item/tank/jetpack/oxygen/harness
|
||||
id = /obj/item/card/id/advanced/chameleon
|
||||
id_trim = /datum/id_trim/chameleon/operative
|
||||
|
||||
/obj/effect/mob_spawn/human/clown/corpse
|
||||
skin_tone = "caucasian1"
|
||||
hairstyle = "Bald"
|
||||
facial_hairstyle = "Shaved"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/pirate
|
||||
name = "Pirate"
|
||||
skin_tone = "caucasian1" //all pirates are white because it's easier that way
|
||||
outfit = /datum/outfit/piratecorpse
|
||||
hairstyle = "Bald"
|
||||
facial_hairstyle = "Shaved"
|
||||
|
||||
/datum/outfit/piratecorpse
|
||||
name = "Pirate Corpse"
|
||||
uniform = /obj/item/clothing/under/costume/pirate
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
glasses = /obj/item/clothing/glasses/eyepatch
|
||||
head = /obj/item/clothing/head/bandana
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/pirate/ranged
|
||||
name = "Pirate Gunner"
|
||||
outfit = /datum/outfit/piratecorpse/ranged
|
||||
|
||||
/datum/outfit/piratecorpse/ranged
|
||||
name = "Pirate Gunner Corpse"
|
||||
suit = /obj/item/clothing/suit/pirate
|
||||
head = /obj/item/clothing/head/pirate
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/russian
|
||||
name = "Russian"
|
||||
outfit = /datum/outfit/russiancorpse
|
||||
hairstyle = "Bald"
|
||||
facial_hairstyle = "Shaved"
|
||||
|
||||
/datum/outfit/russiancorpse
|
||||
name = "Russian Corpse"
|
||||
uniform = /obj/item/clothing/under/costume/soviet
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
head = /obj/item/clothing/head/bearpelt
|
||||
gloves = /obj/item/clothing/gloves/color/black
|
||||
mask = /obj/item/clothing/mask/gas
|
||||
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/russian/ranged
|
||||
outfit = /datum/outfit/russiancorpse/ranged
|
||||
|
||||
/datum/outfit/russiancorpse/ranged
|
||||
name = "Ranged Russian Corpse"
|
||||
head = /obj/item/clothing/head/ushanka
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/russian/ranged/trooper
|
||||
outfit = /datum/outfit/russiancorpse/ranged/trooper
|
||||
|
||||
/datum/outfit/russiancorpse/ranged/trooper
|
||||
name = "Ranged Russian Trooper Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate/camo
|
||||
suit = /obj/item/clothing/suit/armor/bulletproof
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/tackler/combat
|
||||
ears = /obj/item/radio/headset
|
||||
head = /obj/item/clothing/head/helmet/alt
|
||||
mask = /obj/item/clothing/mask/balaclava
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/russian/ranged/officer
|
||||
name = "Russian Officer"
|
||||
outfit = /datum/outfit/russiancorpse/officer
|
||||
|
||||
/datum/outfit/russiancorpse/officer
|
||||
name = "Russian Officer Corpse"
|
||||
uniform = /obj/item/clothing/under/costume/russian_officer
|
||||
suit = /obj/item/clothing/suit/security/officer/russian
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
ears = /obj/item/radio/headset
|
||||
head = /obj/item/clothing/head/ushanka
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/wizard
|
||||
name = "Space Wizard Corpse"
|
||||
outfit = /datum/outfit/wizardcorpse
|
||||
hairstyle = "Bald"
|
||||
facial_hairstyle = "Beard (Very Long)"
|
||||
facial_haircolor = COLOR_WHITE
|
||||
skin_tone = "caucasian1"
|
||||
|
||||
/datum/outfit/wizardcorpse
|
||||
name = "Space Wizard Corpse"
|
||||
uniform = /obj/item/clothing/under/color/lightpurple
|
||||
suit = /obj/item/clothing/suit/wizrobe
|
||||
shoes = /obj/item/clothing/shoes/sandal/magic
|
||||
head = /obj/item/clothing/head/wizard
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/nanotrasensoldier
|
||||
name = "\improper Nanotrasen Private Security Officer"
|
||||
outfit = /datum/outfit/nanotrasensoldiercorpse2
|
||||
hairstyle = "Bald"
|
||||
facial_hairstyle = "Shaved"
|
||||
|
||||
/datum/outfit/nanotrasensoldiercorpse2
|
||||
name = "NT Private Security Officer Corpse"
|
||||
uniform = /obj/item/clothing/under/rank/security/officer
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/tackler/combat
|
||||
ears = /obj/item/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas/sechailer/swat
|
||||
head = /obj/item/clothing/head/helmet/swat/nanotrasen
|
||||
back = /obj/item/storage/backpack/security
|
||||
id = /obj/item/card/id/advanced/centcom
|
||||
id_trim = /datum/id_trim/centcom/corpse/private_security/tradepost_officer
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier
|
||||
name = "Nanotrasen Private Security Officer"
|
||||
outfit = /datum/outfit/nanotrasenassaultsoldiercorpse
|
||||
hairstyle = "Bald"
|
||||
facial_hairstyle = "Shaved"
|
||||
|
||||
/datum/outfit/nanotrasenassaultsoldiercorpse
|
||||
name = "NT Assault Officer Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
ears = /obj/item/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas/sechailer/swat
|
||||
head = /obj/item/clothing/head/helmet/swat/nanotrasen
|
||||
back = /obj/item/storage/backpack/security
|
||||
id = /obj/item/card/id/advanced/centcom
|
||||
id_trim = /datum/id_trim/centcom/corpse/assault
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/cat_butcher
|
||||
name = "The Cat Surgeon"
|
||||
hairstyle = "Cut Hair"
|
||||
facial_hairstyle = "Watson Mustache"
|
||||
skin_tone = "caucasian1"
|
||||
outfit = /datum/outfit/cat_butcher
|
||||
|
||||
/datum/outfit/cat_butcher
|
||||
name = "Cat Butcher Uniform"
|
||||
uniform = /obj/item/clothing/under/rank/medical/doctor/green
|
||||
suit = /obj/item/clothing/suit/apron/surgical
|
||||
shoes = /obj/item/clothing/shoes/sneakers/white
|
||||
gloves = /obj/item/clothing/gloves/color/latex/nitrile
|
||||
ears = /obj/item/radio/headset
|
||||
back = /obj/item/storage/backpack/satchel/med
|
||||
id = /obj/item/card/id/advanced
|
||||
glasses = /obj/item/clothing/glasses/hud/health
|
||||
id_trim = /datum/id_trim/away/cat_surgeon
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/bee_terrorist
|
||||
name = "BLF Operative"
|
||||
outfit = /datum/outfit/bee_terrorist
|
||||
|
||||
/datum/outfit/bee_terrorist
|
||||
name = "BLF Operative"
|
||||
uniform = /obj/item/clothing/under/color/yellow
|
||||
suit = /obj/item/clothing/suit/hooded/bee_costume
|
||||
shoes = /obj/item/clothing/shoes/sneakers/yellow
|
||||
gloves = /obj/item/clothing/gloves/color/yellow
|
||||
ears = /obj/item/radio/headset
|
||||
belt = /obj/item/storage/belt/fannypack/yellow/bee_terrorist
|
||||
id = /obj/item/card/id/advanced
|
||||
l_pocket = /obj/item/paper/fluff/bee_objectives
|
||||
mask = /obj/item/clothing/mask/animal/rat/bee
|
||||
@@ -0,0 +1,60 @@
|
||||
|
||||
//generally nanotrasen themed corpses
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/bridgeofficer
|
||||
name = "Bridge Officer"
|
||||
outfit = /datum/outfit/nanotrasenbridgeofficer
|
||||
|
||||
/datum/outfit/nanotrasenbridgeofficer
|
||||
name = "Bridge Officer"
|
||||
ears = /obj/item/radio/headset/heads/hop
|
||||
uniform = /obj/item/clothing/under/rank/centcom/officer
|
||||
suit = /obj/item/clothing/suit/armor/bulletproof
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
id = /obj/item/card/id/advanced/centcom
|
||||
id_trim = /datum/id_trim/centcom/corpse/bridge_officer
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/commander
|
||||
name = "Commander"
|
||||
outfit = /datum/outfit/nanotrasencommander
|
||||
|
||||
/datum/outfit/nanotrasencommander
|
||||
name = "\improper Nanotrasen Private Security Commander"
|
||||
uniform = /obj/item/clothing/under/rank/centcom/commander
|
||||
suit = /obj/item/clothing/suit/armor/bulletproof
|
||||
ears = /obj/item/radio/headset/heads/captain
|
||||
glasses = /obj/item/clothing/glasses/eyepatch
|
||||
mask = /obj/item/clothing/mask/cigarette/cigar/cohiba
|
||||
head = /obj/item/clothing/head/centhat
|
||||
gloves = /obj/item/clothing/gloves/tackler/combat
|
||||
shoes = /obj/item/clothing/shoes/combat/swat
|
||||
r_pocket = /obj/item/lighter
|
||||
id = /obj/item/card/id/advanced/centcom
|
||||
id_trim = /datum/id_trim/centcom/corpse/commander
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/nanotrasensoldier
|
||||
name = "\improper Nanotrasen Private Security Officer"
|
||||
outfit = /datum/outfit/nanotrasensoldier
|
||||
|
||||
/datum/outfit/nanotrasensoldier
|
||||
name = "NT Private Security Officer"
|
||||
uniform = /obj/item/clothing/under/rank/security/officer
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/tackler/combat
|
||||
mask = /obj/item/clothing/mask/gas/sechailer/swat
|
||||
head = /obj/item/clothing/head/helmet/swat/nanotrasen
|
||||
back = /obj/item/storage/backpack/security
|
||||
id = /obj/item/card/id/advanced
|
||||
id_trim = /datum/id_trim/centcom/corpse/private_security
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/intern //this is specifically the comms intern from the event
|
||||
name = "CentCom Intern"
|
||||
outfit = /datum/outfit/centcom/centcom_intern/unarmed
|
||||
mob_name = "Nameless Intern"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/intern/special(mob/living/carbon/human/spawned_human)
|
||||
. = ..()
|
||||
spawned_human.gender = MALE //we're making it canon babies
|
||||
spawned_human.update_body()
|
||||
@@ -0,0 +1,40 @@
|
||||
|
||||
//full of weird and wacky mob spawns. this is probably the darkest corner of mob spawns even after cleanup so be ready for shitcode
|
||||
|
||||
///dead ai, blue screen and everything.
|
||||
/obj/effect/mob_spawn/corpse/ai
|
||||
mob_type = /mob/living/silicon/ai/spawned
|
||||
|
||||
/obj/effect/mob_spawn/corpse/ai/create(mob/user, newname)
|
||||
var/ai_already_present = locate(/mob/living/silicon/ai) in loc
|
||||
if(ai_already_present)
|
||||
return
|
||||
. = ..()
|
||||
|
||||
/obj/effect/mob_spawn/corpse/ai/special(mob/living/silicon/ai/spawned/dead_ai)
|
||||
. = ..()
|
||||
dead_ai.name = src.name
|
||||
dead_ai.real_name = src.name
|
||||
dead_ai.aiPDA.toff = TRUE //turns the AI's PDA messenger off, stopping it showing up on player PDAs
|
||||
|
||||
///dead slimes, with a var for whatever color you want.
|
||||
/obj/effect/mob_spawn/corpse/slime
|
||||
mob_type = /mob/living/simple_animal/slime
|
||||
icon = 'icons/mob/slimes.dmi'
|
||||
icon_state = "grey baby slime" //sets the icon in the map editor
|
||||
///the color of the slime you're spawning.
|
||||
var/slime_species = "grey"
|
||||
|
||||
/obj/effect/mob_spawn/corpse/slime/special(mob/living/simple_animal/slime/spawned_slime)
|
||||
. = ..()
|
||||
spawned_slime.set_colour(slime_species)
|
||||
|
||||
///dead facehuggers, great for xeno ruins so you can have a cool ruin without spiraling the entire round into xenomorph hell. also, this is a terrible terrible artifact of time
|
||||
/obj/effect/mob_spawn/corpse/facehugger
|
||||
//mostly for unit tests to not get alarmed (which by all means it should because this is a mess)
|
||||
mob_type = /obj/item/clothing/mask/facehugger
|
||||
|
||||
/obj/effect/mob_spawn/corpse/facehugger/create(mob/user)
|
||||
var/obj/item/clothing/mask/facehugger/spawned_facehugger = new mob_type(loc)
|
||||
spawned_facehugger.Die()
|
||||
qdel(src)
|
||||
@@ -0,0 +1,19 @@
|
||||
|
||||
//corpses that only differentiate themselves by representing a species
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/skeleton
|
||||
mob_species = /datum/species/skeleton
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/zombie
|
||||
mob_species = /datum/species/zombie
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/abductor
|
||||
name = "abductor"
|
||||
mob_name = "alien"
|
||||
mob_species = /datum/species/abductor
|
||||
outfit = /datum/outfit/abductorcorpse
|
||||
|
||||
/datum/outfit/abductorcorpse
|
||||
name = "Abductor Corpse"
|
||||
uniform = /obj/item/clothing/under/color/grey
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
@@ -0,0 +1,35 @@
|
||||
|
||||
//roles found on away missions, if you can remember to put them here.
|
||||
|
||||
//undead that protect a zlevel
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/skeleton
|
||||
name = "skeletal remains"
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "remains"
|
||||
mob_name = "skeleton"
|
||||
prompt_name = "a skeletal guardian"
|
||||
you_are_text = "By unknown powers, your skeletal remains have been reanimated!"
|
||||
flavour_text = "Walk this mortal plane and terrorize all living adventurers who dare cross your path."
|
||||
spawner_job_path = /datum/job/skeleton
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/skeleton/special(mob/living/new_spawn)
|
||||
. = ..()
|
||||
to_chat(new_spawn, "<b>You have this horrible lurching feeling deep down that your binding to this world will fail if you abandon this zone... Were you reanimated to protect something?</b>")
|
||||
new_spawn.AddComponent(/datum/component/stationstuck, PUNISHMENT_MURDER, "You experience a feeling like a stressed twine being pulled until it snaps. Then, merciful nothing.")
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/zombie
|
||||
name = "rotting corpse"
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "remains"
|
||||
mob_name = "zombie"
|
||||
prompt_name = "an undead guardian"
|
||||
mob_species = /datum/species/zombie
|
||||
spawner_job_path = /datum/job/zombie
|
||||
you_are_text = "By unknown powers, your rotting remains have been resurrected!"
|
||||
flavour_text = "Walk this mortal plane and terrorize all living adventurers who dare cross your path."
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/zombie/special(mob/living/new_spawn)
|
||||
. = ..()
|
||||
to_chat(new_spawn, "<b>You have this horrible lurching feeling deep down that your binding to this world will fail if you abandon this zone... Were you reanimated to protect something?</b>")
|
||||
new_spawn.AddComponent(/datum/component/stationstuck, PUNISHMENT_MURDER, "You experience a feeling like a stressed twine being pulled until it snaps. Then, merciful nothing.")
|
||||
@@ -0,0 +1,67 @@
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/fugitive
|
||||
spawner_job_path = /datum/job/fugitive_hunter
|
||||
prompt_name = "Write me some god damn prompt names!"
|
||||
you_are_text = "Write me some god damn you are text!"
|
||||
flavour_text = "Write me some god damn flavor text!" //the flavor text will be the backstory argument called on the antagonist's greet, see hunter.dm for details
|
||||
show_flavor = FALSE
|
||||
var/back_story = "error"
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/fugitive/Initialize(mapload)
|
||||
. = ..()
|
||||
notify_ghosts("Hunters are waking up looking for refugees!", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_FUGITIVE)
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/fugitive/special(mob/living/carbon/human/spawned_human)
|
||||
. = ..()
|
||||
var/datum/antagonist/fugitive_hunter/fughunter = new
|
||||
fughunter.backstory = back_story
|
||||
spawned_human.mind.add_antag_datum(fughunter)
|
||||
fughunter.greet()
|
||||
message_admins("[ADMIN_LOOKUPFLW(spawned_human)] has been made into a Fugitive Hunter by an event.")
|
||||
log_game("[key_name(spawned_human)] was spawned as a Fugitive Hunter by an event.")
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/fugitive/spacepol
|
||||
name = "police pod"
|
||||
desc = "A small sleeper typically used to put people to sleep for briefing on the mission."
|
||||
prompt_name = "a spacepol officer"
|
||||
you_are_text = "I am a member of the Spacepol!"
|
||||
flavour_text = "Justice has arrived. We must capture those fugitives lurking on that station!"
|
||||
back_story = "space cop"
|
||||
outfit = /datum/outfit/spacepol
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/fugitive/russian
|
||||
name = "russian pod"
|
||||
prompt_name = "a russian"
|
||||
you_are_text = "Ay blyat. I am a space-russian smuggler!"
|
||||
flavour_text = "We were mid-flight when our cargo was beamed off our ship!"
|
||||
back_story = "russian"
|
||||
desc = "A small sleeper typically used to make long distance travel a bit more bearable."
|
||||
outfit = /datum/outfit/russiancorpse/hunter
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty
|
||||
name = "bounty hunter pod"
|
||||
prompt_name = "a bounty hunter"
|
||||
you_are_text = "I'm a bounty hunter."
|
||||
flavour_text = "We got a new bounty on some fugitives, dead or alive."
|
||||
back_story = "bounty hunters"
|
||||
desc = "A small sleeper typically used to make long distance travel a bit more bearable."
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/Destroy()
|
||||
var/obj/structure/fluff/empty_sleeper/S = new(drop_location())
|
||||
S.setDir(dir)
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/armor
|
||||
outfit = /datum/outfit/bountyarmor
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/hook
|
||||
outfit = /datum/outfit/bountyhook
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/synth
|
||||
outfit = /datum/outfit/bountysynth
|
||||
@@ -0,0 +1,97 @@
|
||||
|
||||
//reserved file just for golems since they're such a big thing, available on lavaland and from the station
|
||||
|
||||
//Golem shells: Spawns in Free Golem ships in lavaland. Ghosts become mineral golems and are advised to spread personal freedom.
|
||||
/obj/effect/mob_spawn/ghost_role/human/golem
|
||||
name = "inert free golem shell"
|
||||
desc = "A humanoid shape, empty, lifeless, and full of potential."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "construct"
|
||||
mob_species = /datum/species/golem
|
||||
anchored = FALSE
|
||||
move_resist = MOVE_FORCE_NORMAL
|
||||
density = FALSE
|
||||
prompt_name = "a free golem"
|
||||
you_are_text = "You are a Free Golem. Your family worships The Liberator."
|
||||
flavour_text = "In his infinite and divine wisdom, he set your clan free to travel the stars with a single declaration: \"Yeah go do whatever.\""
|
||||
var/has_owner = FALSE
|
||||
var/can_transfer = TRUE //if golems can switch bodies to this new shell
|
||||
var/mob/living/owner = null //golem's owner if it has one
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/golem/Initialize(mapload, datum/species/golem/species = null, mob/creator = null)
|
||||
if(species) //spawners list uses object name to register so this goes before ..()
|
||||
name += " ([initial(species.prefix)])"
|
||||
mob_species = species
|
||||
. = ..()
|
||||
var/area/init_area = get_area(src)
|
||||
if(!mapload && init_area)
|
||||
notify_ghosts("\A [initial(species.prefix)] golem shell has been completed in \the [init_area.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_GOLEM)
|
||||
if(has_owner && creator)
|
||||
you_are_text = "You are a golem."
|
||||
flavour_text = "You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools."
|
||||
important_text = "Serve [creator], and assist [creator.p_them()] in completing [creator.p_their()] goals at any cost."
|
||||
owner = creator
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/golem/special(mob/living/new_spawn, name)
|
||||
. = ..()
|
||||
var/datum/species/golem/X = mob_species
|
||||
to_chat(new_spawn, "[initial(X.info_text)]")
|
||||
if(!owner)
|
||||
var/policy = get_policy(ROLE_FREE_GOLEM)
|
||||
if (policy)
|
||||
to_chat(new_spawn, policy)
|
||||
to_chat(new_spawn, "Build golem shells in the autolathe, and feed refined mineral sheets to the shells to bring them to life! You are generally a peaceful group unless provoked.")
|
||||
else
|
||||
new_spawn.mind.enslave_mind_to_creator(owner)
|
||||
log_game("[key_name(new_spawn)] possessed a golem shell enslaved to [key_name(owner)].")
|
||||
log_admin("[key_name(new_spawn)] possessed a golem shell enslaved to [key_name(owner)].")
|
||||
if(ishuman(new_spawn))
|
||||
var/mob/living/carbon/human/H = new_spawn
|
||||
if(has_owner)
|
||||
var/datum/species/golem/G = H.dna.species
|
||||
G.owner = owner
|
||||
H.set_cloned_appearance()
|
||||
if(!name)
|
||||
if(has_owner)
|
||||
H.fully_replace_character_name(null, "[initial(X.prefix)] Golem ([rand(1,999)])")
|
||||
else
|
||||
H.fully_replace_character_name(null, H.dna.species.random_name())
|
||||
else
|
||||
H.fully_replace_character_name(null, name)
|
||||
if(has_owner)
|
||||
new_spawn.mind.set_assigned_role(SSjob.GetJobType(/datum/job/servant_golem))
|
||||
else
|
||||
new_spawn.mind.set_assigned_role(SSjob.GetJobType(/datum/job/free_golem))
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/golem/attack_hand(mob/user, list/modifiers)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(isgolem(user) && can_transfer)
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/transfer_choice = tgui_alert(usr, "Transfer your soul to [src]? (Warning, your old body will die!)",,list("Yes","No"))
|
||||
if(transfer_choice != "Yes")
|
||||
return
|
||||
if(QDELETED(src) || uses <= 0)
|
||||
return
|
||||
log_game("[key_name(H)] golem-swapped into [src]")
|
||||
H.visible_message(span_notice("A faint light leaves [H], moving to [src] and animating it!"),span_notice("You leave your old body behind, and transfer into [src]!"))
|
||||
show_flavor = FALSE
|
||||
var/mob/living/carbon/human/newgolem = create(newname = H.real_name)
|
||||
H.transfer_trait_datums(newgolem)
|
||||
H.mind.transfer_to(newgolem)
|
||||
H.death()
|
||||
return
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/golem/servant
|
||||
has_owner = TRUE
|
||||
name = "inert servant golem shell"
|
||||
prompt_name = "servant golem"
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/golem/adamantine
|
||||
name = "dust-caked free golem shell"
|
||||
desc = "A humanoid shape, empty, lifeless, and full of potential."
|
||||
prompt_name = "free golem"
|
||||
can_transfer = FALSE
|
||||
mob_species = /datum/species/golem/adamantine
|
||||
@@ -0,0 +1,316 @@
|
||||
|
||||
//lava hermit
|
||||
|
||||
//Malfunctioning cryostasis sleepers: Spawns in makeshift shelters in lavaland. Ghosts become hermits with knowledge of how they got to where they are now.
|
||||
/obj/effect/mob_spawn/ghost_role/human/hermit
|
||||
name = "malfunctioning cryostasis sleeper"
|
||||
desc = "A humming sleeper with a silhouetted occupant inside. Its stasis function is broken and it's likely being used as a bed."
|
||||
prompt_name = "a stranded hermit"
|
||||
icon = 'icons/obj/lavaland/spawners.dmi'
|
||||
icon_state = "cryostasis_sleeper"
|
||||
outfit = /datum/outfit/hermit
|
||||
you_are_text = "You've been stranded in this godless prison of a planet for longer than you can remember."
|
||||
flavour_text = "Each day you barely scrape by, and between the terrible conditions of your makeshift shelter, \
|
||||
the hostile creatures, and the ash drakes swooping down from the cloudless skies, all you can wish for is the feel of soft grass between your toes and \
|
||||
the fresh air of Earth. These thoughts are dispelled by yet another recollection of how you got here... "
|
||||
spawner_job_path = /datum/job/hermit
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/hermit/Initialize(mapload)
|
||||
. = ..()
|
||||
outfit = new outfit //who cares equip outfit works with outfit as a path or an instance
|
||||
var/arrpee = rand(1,4)
|
||||
switch(arrpee)
|
||||
if(1)
|
||||
flavour_text += "you were a [pick("arms dealer", "shipwright", "docking manager")]'s assistant on a small trading station several sectors from here. Raiders attacked, and there was \
|
||||
only one pod left when you got to the escape bay. You took it and launched it alone, and the crowd of terrified faces crowding at the airlock door as your pod's engines burst to \
|
||||
life and sent you to this hell are forever branded into your memory."
|
||||
outfit.uniform = /obj/item/clothing/under/misc/assistantformal
|
||||
if(2)
|
||||
flavour_text += "you're an exile from the Tiger Cooperative. Their technological fanaticism drove you to question the power and beliefs of the Exolitics, and they saw you as a \
|
||||
heretic and subjected you to hours of horrible torture. You were hours away from execution when a high-ranking friend of yours in the Cooperative managed to secure you a pod, \
|
||||
scrambled its destination's coordinates, and launched it. You awoke from stasis when you landed and have been surviving - barely - ever since."
|
||||
outfit.uniform = /obj/item/clothing/under/rank/prisoner
|
||||
outfit.shoes = /obj/item/clothing/shoes/sneakers/orange
|
||||
if(3)
|
||||
flavour_text += "you were a doctor on one of Nanotrasen's space stations, but you left behind that damn corporation's tyranny and everything it stood for. From a metaphorical hell \
|
||||
to a literal one, you find yourself nonetheless missing the recycled air and warm floors of what you left behind... but you'd still rather be here than there."
|
||||
outfit.uniform = /obj/item/clothing/under/rank/medical/doctor
|
||||
outfit.suit = /obj/item/clothing/suit/toggle/labcoat
|
||||
outfit.back = /obj/item/storage/backpack/medic
|
||||
if(4)
|
||||
flavour_text += "you were always joked about by your friends for \"not playing with a full deck\", as they so kindly put it. It seems that they were right when you, on a tour \
|
||||
at one of Nanotrasen's state-of-the-art research facilities, were in one of the escape pods alone and saw the red button. It was big and shiny, and it caught your eye. You pressed \
|
||||
it, and after a terrifying and fast ride for days, you landed here. You've had time to wisen up since then, and you think that your old friends wouldn't be laughing now."
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/hermit/Destroy()
|
||||
new/obj/structure/fluff/empty_cryostasis_sleeper(get_turf(src))
|
||||
return ..()
|
||||
|
||||
/datum/outfit/hermit
|
||||
name = "Lavaland hermit"
|
||||
uniform = /obj/item/clothing/under/color/grey/ancient
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
back = /obj/item/storage/backpack
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
l_pocket = /obj/item/tank/internals/emergency_oxygen
|
||||
r_pocket = /obj/item/flashlight/glowstick
|
||||
|
||||
//Icebox version of hermit
|
||||
/obj/effect/mob_spawn/ghost_role/human/hermit/icemoon
|
||||
name = "cryostasis bed"
|
||||
desc = "A humming sleeper with a silhouetted occupant inside. Its stasis function is broken and it's likely being used as a bed."
|
||||
prompt_name = "a grumpy old man"
|
||||
icon = 'icons/obj/lavaland/spawners.dmi'
|
||||
icon_state = "cryostasis_sleeper"
|
||||
outfit = /datum/outfit/hermit
|
||||
you_are_text = "You've been hunting polar bears for 40 years now! What do these 'NaniteTrans' newcomers want?"
|
||||
flavour_text = "You were fine hunting polar bears and taming wolves out here on your own, \
|
||||
but now that there are corporate stooges around, you need to watch your step. "
|
||||
spawner_job_path = /datum/job/hermit
|
||||
|
||||
//beach dome
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/beach
|
||||
prompt_name = "a beach bum"
|
||||
name = "beach bum sleeper"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
you_are_text = "You're, like, totally a dudebro, bruh."
|
||||
flavour_text = "Ch'yea. You came here, like, on spring break, hopin' to pick up some bangin' hot chicks, y'knaw?"
|
||||
spawner_job_path = /datum/job/beach_bum
|
||||
outfit = /datum/outfit/beachbum
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/beach/lifeguard
|
||||
you_are_text = "You're a spunky lifeguard!"
|
||||
flavour_text = "It's up to you to make sure nobody drowns or gets eaten by sharks and stuff."
|
||||
name = "lifeguard sleeper"
|
||||
outfit = /datum/outfit/beachbum/lifeguard
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/beach/lifeguard/special(mob/living/carbon/human/lifeguard, mob/mob_possessor)
|
||||
. = ..()
|
||||
lifeguard.gender = FEMALE
|
||||
lifeguard.update_body()
|
||||
|
||||
/datum/outfit/beachbum
|
||||
name = "Beach Bum"
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
r_pocket = /obj/item/storage/wallet/random
|
||||
l_pocket = /obj/item/food/pizzaslice/dank
|
||||
uniform = /obj/item/clothing/under/pants/youngfolksjeans
|
||||
id = /obj/item/card/id/advanced
|
||||
|
||||
/datum/outfit/beachbum/post_equip(mob/living/carbon/human/bum, visualsOnly = FALSE)
|
||||
. = ..()
|
||||
if(visualsOnly)
|
||||
return
|
||||
bum.dna.add_mutation(STONER)
|
||||
|
||||
/datum/outfit/beachbum/lifeguard
|
||||
name = "Beach Lifeguard"
|
||||
uniform = /obj/item/clothing/under/shorts/red
|
||||
id_trim = /datum/id_trim/lifeguard
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/bartender
|
||||
name = "bartender sleeper"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
prompt_name = "a space bartender"
|
||||
you_are_text = "You are a space bartender!"
|
||||
flavour_text = "Time to mix drinks and change lives. Smoking space drugs makes it easier to understand your patrons' odd dialect."
|
||||
spawner_job_path = /datum/job/space_bartender
|
||||
outfit = /datum/outfit/spacebartender
|
||||
|
||||
/datum/outfit/spacebartender
|
||||
name = "Space Bartender"
|
||||
uniform = /obj/item/clothing/under/rank/civilian/bartender
|
||||
back = /obj/item/storage/backpack
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/reagent
|
||||
id = /obj/item/card/id/advanced
|
||||
id_trim = /datum/id_trim/space_bartender
|
||||
|
||||
/datum/outfit/spacebartender/post_equip(mob/living/carbon/human/bartender, visualsOnly = FALSE)
|
||||
. = ..()
|
||||
var/obj/item/card/id/id_card = bartender.wear_id
|
||||
if(bartender.age < AGE_MINOR)
|
||||
id_card.registered_age = AGE_MINOR
|
||||
to_chat(bartender, span_notice("You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!"))
|
||||
|
||||
//Preserved terrarium/seed vault: Spawns in seed vault structures in lavaland. Ghosts become plantpeople and are advised to begin growing plants in the room near them.
|
||||
/obj/effect/mob_spawn/ghost_role/human/seed_vault
|
||||
name = "preserved terrarium"
|
||||
desc = "An ancient machine that seems to be used for storing plant matter. The glass is obstructed by a mat of vines."
|
||||
prompt_name = "lifebringer"
|
||||
icon = 'icons/obj/lavaland/spawners.dmi'
|
||||
icon_state = "terrarium"
|
||||
density = TRUE
|
||||
mob_species = /datum/species/pod
|
||||
you_are_text = "You are a sentient ecosystem, an example of the mastery over life that your creators possessed."
|
||||
flavour_text = "Your masters, benevolent as they were, created uncounted seed vaults and spread them across \
|
||||
the universe to every planet they could chart. You are in one such seed vault. \
|
||||
Your goal is to protect the vault you are assigned to, cultivate the seeds passed onto you, \
|
||||
and eventually bring life to this desolate planet while waiting for contact from your creators. \
|
||||
Estimated time of last contact: Deployment, 5000 millennia ago."
|
||||
spawner_job_path = /datum/job/lifebringer
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/seed_vault/Initialize(mapload)
|
||||
. = ..()
|
||||
mob_name = pick("Tomato", "Potato", "Broccoli", "Carrot", "Ambrosia", "Pumpkin", "Ivy", "Kudzu", "Banana", "Moss", "Flower", "Bloom", "Root", "Bark", "Glowshroom", "Petal", "Leaf", \
|
||||
"Venus", "Sprout","Cocoa", "Strawberry", "Citrus", "Oak", "Cactus", "Pepper", "Juniper")
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/seed_vault/Destroy()
|
||||
new/obj/structure/fluff/empty_terrarium(get_turf(src))
|
||||
return ..()
|
||||
|
||||
//Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers.
|
||||
|
||||
/obj/structure/ash_walker_eggshell
|
||||
name = "ash walker egg"
|
||||
desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within. The egg shell looks resistant to temperature but otherwise rather brittle."
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "large_egg"
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | FREEZE_PROOF
|
||||
max_integrity = 80
|
||||
var/obj/effect/mob_spawn/ghost_role/human/ash_walker/egg
|
||||
|
||||
/obj/structure/ash_walker_eggshell/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) //lifted from xeno eggs
|
||||
switch(damage_type)
|
||||
if(BRUTE)
|
||||
if(damage_amount)
|
||||
playsound(loc, 'sound/effects/attackblob.ogg', 100, TRUE)
|
||||
else
|
||||
playsound(src, 'sound/weapons/tap.ogg', 50, TRUE)
|
||||
if(BURN)
|
||||
if(damage_amount)
|
||||
playsound(loc, 'sound/items/welder.ogg', 100, TRUE)
|
||||
|
||||
/obj/structure/ash_walker_eggshell/attack_ghost(mob/user) //Pass on ghost clicks to the mob spawner
|
||||
if(egg)
|
||||
egg.attack_ghost(user)
|
||||
. = ..()
|
||||
|
||||
/obj/structure/ash_walker_eggshell/Destroy()
|
||||
if(!egg)
|
||||
return ..()
|
||||
var/mob/living/carbon/human/yolk = new /mob/living/carbon/human/(get_turf(src))
|
||||
yolk.fully_replace_character_name(null,random_unique_lizard_name(gender))
|
||||
yolk.set_species(/datum/species/lizard/ashwalker)
|
||||
yolk.underwear = "Nude"
|
||||
yolk.equipOutfit(/datum/outfit/ashwalker)//this is an authentic mess we're making
|
||||
yolk.update_body()
|
||||
yolk.gib()
|
||||
QDEL_NULL(egg)
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/ash_walker
|
||||
name = "ash walker egg"
|
||||
desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within."
|
||||
prompt_name = "necropolis ash walker"
|
||||
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
|
||||
icon_state = "large_egg"
|
||||
mob_species = /datum/species/lizard/ashwalker
|
||||
outfit = /datum/outfit/ashwalker
|
||||
move_resist = MOVE_FORCE_NORMAL
|
||||
density = FALSE
|
||||
you_are_text = "You are an ash walker. Your tribe worships the Necropolis."
|
||||
flavour_text = "The wastes are sacred ground, its monsters a blessed bounty. \
|
||||
You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. \
|
||||
Fresh sacrifices for your nest."
|
||||
spawner_job_path = /datum/job/ash_walker
|
||||
var/datum/team/ashwalkers/team
|
||||
var/obj/structure/ash_walker_eggshell/eggshell
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/ash_walker/Destroy()
|
||||
eggshell = null
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/ash_walker/allow_spawn(mob/user, silent = FALSE)
|
||||
if(!(user.key in team.players_spawned))//one per person unless you get a bonus spawn
|
||||
return TRUE
|
||||
to_chat(user, span_warning("<b>You have exhausted your usefulness to the Necropolis</b>."))
|
||||
return FALSE
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/ash_walker/special(mob/living/carbon/human/spawned_human)
|
||||
. = ..()
|
||||
//spawned_human.fully_replace_character_name(null,random_unique_lizard_name(gender)) // ORIGINAL
|
||||
// SKYRAT EDIT CHANGE START
|
||||
if(!is_pref_char)
|
||||
spawned_human.fully_replace_character_name(null,random_unique_lizard_name(gender))
|
||||
// SKYRAT EDIT CHANGE END
|
||||
to_chat(spawned_human, "<b>Drag the corpses of men and beasts to your nest. It will absorb them to create more of your kind. Invade the strange structure of the outsiders if you must. Do not cause unnecessary destruction, as littering the wastes with ugly wreckage is certain to not gain you favor. Glory to the Necropolis!</b>")
|
||||
|
||||
spawned_human.mind.add_antag_datum(/datum/antagonist/ashwalker, team)
|
||||
|
||||
ADD_TRAIT(spawned_human, TRAIT_PRIMITIVE, ROUNDSTART_TRAIT)
|
||||
spawned_human.remove_language(/datum/language/common)
|
||||
team.players_spawned += (spawned_human.key)
|
||||
eggshell.egg = null
|
||||
QDEL_NULL(eggshell)
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/ash_walker/Initialize(mapload, datum/team/ashwalkers/ashteam)
|
||||
. = ..()
|
||||
var/area/spawner_area = get_area(src)
|
||||
team = ashteam
|
||||
eggshell = new /obj/structure/ash_walker_eggshell(get_turf(loc))
|
||||
eggshell.egg = src
|
||||
src.forceMove(eggshell)
|
||||
if(spawner_area)
|
||||
notify_ghosts("An ash walker egg is ready to hatch in \the [spawner_area.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER)
|
||||
|
||||
/datum/outfit/ashwalker
|
||||
name ="Ashwalker"
|
||||
head = /obj/item/clothing/head/helmet/gladiator
|
||||
uniform = /obj/item/clothing/under/costume/gladiator/ash_walker
|
||||
|
||||
///Syndicate Listening Post
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate
|
||||
name = "Syndicate Bioweapon Scientist"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper_s"
|
||||
prompt_name = "a syndicate science technician"
|
||||
you_are_text = "You are a syndicate science technician, employed in a top secret research facility developing biological weapons."
|
||||
flavour_text = "Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile."
|
||||
important_text = "The base is rigged with explosives, DO NOT abandon it or let it fall into enemy hands!"
|
||||
outfit = /datum/outfit/lavaland_syndicate
|
||||
spawner_job_path = /datum/job/lavaland_syndicate
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/special(mob/living/new_spawn)
|
||||
. = ..()
|
||||
new_spawn.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND)
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms
|
||||
name = "Syndicate Comms Agent"
|
||||
prompt_name = "a syndicate comms agent"
|
||||
you_are_text = "You are a syndicate comms agent, employed in a top secret research facility developing biological weapons."
|
||||
flavour_text = "Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!"
|
||||
important_text = "DO NOT abandon the base."
|
||||
outfit = /datum/outfit/lavaland_syndicate/comms
|
||||
|
||||
/datum/outfit/lavaland_syndicate
|
||||
name = "Lavaland Syndicate Agent"
|
||||
r_hand = /obj/item/gun/ballistic/automatic/sniper_rifle
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/toggle/labcoat
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
|
||||
ears = /obj/item/radio/headset/syndicate/alt
|
||||
back = /obj/item/storage/backpack
|
||||
r_pocket = /obj/item/gun/ballistic/automatic/pistol
|
||||
id = /obj/item/card/id/advanced/chameleon
|
||||
implants = list(/obj/item/implant/weapons_auth)
|
||||
id_trim = /datum/id_trim/chameleon/operative
|
||||
|
||||
/datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/syndicate, visualsOnly = FALSE)
|
||||
syndicate.faction |= ROLE_SYNDICATE
|
||||
|
||||
/datum/outfit/lavaland_syndicate/comms
|
||||
name = "Lavaland Syndicate Comms Agent"
|
||||
r_hand = /obj/item/melee/energy/sword/saber
|
||||
mask = /obj/item/clothing/mask/chameleon/gps
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
|
||||
/obj/item/clothing/mask/chameleon/gps/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/gps, "Encrypted Signal")
|
||||
@@ -0,0 +1,90 @@
|
||||
|
||||
//space pirates from the pirate event.
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate
|
||||
name = "space pirate sleeper"
|
||||
desc = "A cryo sleeper smelling faintly of rum."
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
prompt_name = "a space pirate"
|
||||
outfit = /datum/outfit/pirate/space
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
show_flavor = FALSE //Flavour only exists for spawners menu
|
||||
you_are_text = "You are a space pirate."
|
||||
flavour_text = "The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot."
|
||||
spawner_job_path = /datum/job/space_pirate
|
||||
///Rank of the pirate on the ship, it's used in generating pirate names!
|
||||
var/rank = "Deserter"
|
||||
///Whether or not it will spawn a fluff structure upon opening.
|
||||
var/spawn_oldpod = TRUE
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/special(mob/living/spawned_mob, mob/mob_possessor)
|
||||
. = ..()
|
||||
mob_possessor.fully_replace_character_name(mob_possessor.real_name, generate_pirate_name(mob_possessor.gender))
|
||||
mob_possessor.mind.add_antag_datum(/datum/antagonist/pirate)
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/proc/generate_pirate_name(spawn_gender)
|
||||
var/beggings = strings(PIRATE_NAMES_FILE, "beginnings")
|
||||
var/endings = strings(PIRATE_NAMES_FILE, "endings")
|
||||
return "[rank] [pick(beggings)][pick(endings)]"
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/Destroy()
|
||||
if(spawn_oldpod)
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/captain
|
||||
rank = "Renegade Leader"
|
||||
outfit = /datum/outfit/pirate/space/captain
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/gunner
|
||||
rank = "Rogue"
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton
|
||||
name = "pirate remains"
|
||||
desc = "Some unanimated bones. They feel like they could spring to life any moment!"
|
||||
density = FALSE
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "remains"
|
||||
spawn_oldpod = FALSE
|
||||
prompt_name = "a skeleton pirate"
|
||||
mob_species = /datum/species/skeleton
|
||||
outfit = /datum/outfit/pirate
|
||||
rank = "Mate"
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton/captain
|
||||
rank = "Captain"
|
||||
outfit = /datum/outfit/pirate/captain
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton/gunner
|
||||
rank = "Gunner"
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/silverscale
|
||||
name = "elegant sleeper"
|
||||
desc = "Cozy. You get the feeling you aren't supposed to be here, though..."
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
prompt_name = "a silverscale"
|
||||
mob_species = /datum/species/lizard/silverscale
|
||||
outfit = /datum/outfit/pirate/silverscale
|
||||
rank = "High-born"
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/silverscale/generate_pirate_name(spawn_gender)
|
||||
var/first_name
|
||||
switch(gender)
|
||||
if(MALE)
|
||||
first_name = pick(GLOB.lizard_names_male)
|
||||
if(FEMALE)
|
||||
first_name = pick(GLOB.lizard_names_female)
|
||||
else
|
||||
first_name = pick(GLOB.lizard_names_male + GLOB.lizard_names_female)
|
||||
|
||||
return "[rank] [first_name]-Silverscale"
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/silverscale/captain
|
||||
rank = "Old-guard"
|
||||
outfit = /datum/outfit/pirate/silverscale/captain
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/pirate/silverscale/gunner
|
||||
rank = "Top-drawer"
|
||||
@@ -0,0 +1,94 @@
|
||||
|
||||
//Ancient cryogenic sleepers. Players become NT crewmen from a hundred year old space station, now on the verge of collapse.
|
||||
/obj/effect/mob_spawn/ghost_role/human/oldsec
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise a security uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
prompt_name = "a security officer"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
mob_species = /datum/species/human
|
||||
you_are_text = "You are a security officer working for Nanotrasen, stationed onboard a state of the art research station."
|
||||
flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. \
|
||||
The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod."
|
||||
important_text = "Work as a team with your fellow survivors and do not abandon them."
|
||||
outfit = /datum/outfit/oldsec
|
||||
spawner_job_path = /datum/job/ancient_crew
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/oldsec/Destroy()
|
||||
new/obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/datum/outfit/oldsec
|
||||
name = "Ancient Security"
|
||||
uniform = /obj/item/clothing/under/rank/security/officer
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
id = /obj/item/card/id/away/old/sec
|
||||
r_pocket = /obj/item/restraints/handcuffs
|
||||
l_pocket = /obj/item/assembly/flash/handheld
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/oldeng
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise an engineering uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
prompt_name = "an engineer"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
mob_species = /datum/species/human
|
||||
you_are_text = "You are an engineer working for Nanotrasen, stationed onboard a state of the art research station."
|
||||
flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. The last thing \
|
||||
you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod."
|
||||
important_text = "Work as a team with your fellow survivors and do not abandon them."
|
||||
outfit = /datum/outfit/oldeng
|
||||
spawner_job_path = /datum/job/ancient_crew
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/oldeng/Destroy()
|
||||
new/obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/datum/outfit/oldeng
|
||||
name = "Ancient Engineer"
|
||||
uniform = /obj/item/clothing/under/rank/engineering/engineer
|
||||
shoes = /obj/item/clothing/shoes/workboots
|
||||
id = /obj/item/card/id/away/old/eng
|
||||
gloves = /obj/item/clothing/gloves/color/fyellow/old
|
||||
l_pocket = /obj/item/tank/internals/emergency_oxygen
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/oldsci
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise a science uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
prompt_name = "a scientist"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
mob_species = /datum/species/human
|
||||
you_are_text = "You are a scientist working for Nanotrasen, stationed onboard a state of the art research station."
|
||||
flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. \
|
||||
The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod."
|
||||
important_text = "Work as a team with your fellow survivors and do not abandon them."
|
||||
outfit = /datum/outfit/oldsci
|
||||
spawner_job_path = /datum/job/ancient_crew
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/oldsci/Destroy()
|
||||
new/obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/datum/outfit/oldsci
|
||||
name = "Ancient Scientist"
|
||||
uniform = /obj/item/clothing/under/rank/rnd/scientist
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
id = /obj/item/card/id/away/old/sci
|
||||
l_pocket = /obj/item/stack/medical/bruise_pack
|
||||
|
||||
///asteroid comms agent
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms/space
|
||||
you_are_text = "You are a syndicate agent, assigned to a small listening post station situated near your hated enemy's top secret research facility: Space Station 13."
|
||||
flavour_text = "Monitor enemy activity as best you can, and try to keep a low profile. Monitor enemy activity as best you can, and try to keep a low profile. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!"
|
||||
important_text = "DO NOT abandon the base."
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms/space/Initialize(mapload)
|
||||
. = ..()
|
||||
if(prob(90)) //only has a 10% chance of existing, otherwise it'll just be a NPC syndie.
|
||||
new /mob/living/simple_animal/hostile/syndicate/ranged(get_turf(src))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
@@ -0,0 +1,171 @@
|
||||
/obj/structure/spider/eggcluster
|
||||
name = "egg cluster"
|
||||
desc = "They seem to pulse slightly with an inner life."
|
||||
icon_state = "eggs"
|
||||
/// Mob spawner handling the actual spawn of the spider
|
||||
var/obj/effect/mob_spawn/ghost_role/spider/spawner
|
||||
|
||||
/obj/structure/spider/eggcluster/Initialize(mapload)
|
||||
pixel_x = base_pixel_x + rand(3,-3)
|
||||
pixel_y = base_pixel_y + rand(3,-3)
|
||||
return ..()
|
||||
|
||||
/obj/structure/spider/eggcluster/Destroy()
|
||||
if(spawner)
|
||||
QDEL_NULL(spawner)
|
||||
return ..()
|
||||
|
||||
/obj/structure/spider/eggcluster/attack_ghost(mob/user)
|
||||
if(spawner)
|
||||
spawner.attack_ghost(user)
|
||||
return ..()
|
||||
|
||||
/obj/structure/spider/eggcluster/enriched
|
||||
name = "enriched egg cluster"
|
||||
color = rgb(148, 0, 211)
|
||||
|
||||
/obj/structure/spider/eggcluster/bloody
|
||||
name = "bloody egg cluster"
|
||||
color = rgb(255, 0, 0)
|
||||
|
||||
/obj/structure/spider/eggcluster/midwife
|
||||
name = "midwife egg cluster"
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/spider
|
||||
name = "egg cluster"
|
||||
desc = "They seem to pulse slightly with an inner life."
|
||||
mob_name = "a spider"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "eggs"
|
||||
move_resist = MOVE_FORCE_NORMAL
|
||||
density = FALSE
|
||||
show_flavor = FALSE
|
||||
you_are_text = "You are a spider."
|
||||
flavour_text = "For the hive! Choose a spider and fulfill your role to take over the station... if that is within your directives, of course."
|
||||
important_text = "Follow your directives at all costs."
|
||||
faction = list("spiders")
|
||||
spawner_job_path = /datum/job/spider
|
||||
role_ban = ROLE_ALIEN
|
||||
prompt_ghost = FALSE
|
||||
/// Prevents spawning from this mob_spawn until TRUE, set by the egg growing
|
||||
var/ready = FALSE
|
||||
/// The amount the egg cluster has grown. Is able to produce a spider when it hits 100.
|
||||
var/amount_grown = 0
|
||||
/// The mother's directive at the time the egg was produced. Passed onto the child.
|
||||
var/directive = ""
|
||||
/// Type of the cluster that the spawner spawns
|
||||
var/cluster_type = /obj/structure/spider/eggcluster
|
||||
/// Physical structure housing the spawner
|
||||
var/obj/structure/spider/eggcluster/egg
|
||||
/// The types of spiders that the spawner can produce
|
||||
var/list/potentialspawns = list(
|
||||
/mob/living/simple_animal/hostile/giant_spider,
|
||||
/mob/living/simple_animal/hostile/giant_spider/hunter,
|
||||
/mob/living/simple_animal/hostile/giant_spider/nurse,
|
||||
)
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/spider/Initialize(mapload)
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
potentialspawns = string_list(potentialspawns)
|
||||
egg = new cluster_type(get_turf(loc))
|
||||
egg.spawner = src
|
||||
forceMove(egg)
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/spider/Destroy()
|
||||
egg = null
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/spider/process(delta_time)
|
||||
amount_grown += rand(0, 1) * delta_time
|
||||
if(amount_grown >= 100 && !ready)
|
||||
ready = TRUE
|
||||
notify_ghosts("[src] is ready to hatch!", null, enter_link = "<a href=?src=[REF(src)];activate=1>(Click to play)</a>", source = src, action = NOTIFY_ORBIT, ignore_key = POLL_IGNORE_SPIDER)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/spider/Topic(href, href_list)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(href_list["activate"])
|
||||
var/mob/dead/observer/ghost = usr
|
||||
if(istype(ghost))
|
||||
ghost.ManualFollow(src)
|
||||
attack_ghost(ghost)
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/spider/allow_spawn(mob/user, silent = FALSE)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return FALSE
|
||||
if(!ready)
|
||||
if(!silent)
|
||||
to_chat(user, span_warning("\The [src] is not ready to hatch yet!"))
|
||||
return FALSE
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/spider/equip(mob/living/simple_animal/hostile/giant_spider/spawned_spider)
|
||||
if(spawned_spider)
|
||||
spawned_spider.directive = directive
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/spider/special(mob/user)
|
||||
. = ..()
|
||||
egg.spawner = null
|
||||
QDEL_NULL(egg)
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/spider/enriched
|
||||
name = "enriched egg cluster"
|
||||
color = rgb(148, 0, 211)
|
||||
you_are_text = "You are an enriched spider."
|
||||
cluster_type = /obj/structure/spider/eggcluster/enriched
|
||||
potentialspawns = list(
|
||||
/mob/living/simple_animal/hostile/giant_spider/tarantula,
|
||||
/mob/living/simple_animal/hostile/giant_spider/viper,
|
||||
/mob/living/simple_animal/hostile/giant_spider/midwife,
|
||||
)
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/spider/bloody
|
||||
name = "bloody egg cluster"
|
||||
color = rgb(255, 0, 0)
|
||||
you_are_text = "You are a bloody spider."
|
||||
flavour_text = "An abomination of nature set upon the station by changelings. Your only goal is to kill, terrorize, and survive."
|
||||
directive = "You are the spawn of a vicious changeling. You have no ambitions except to wreak havoc and ensure your own survival. You are aggressive to all living beings outside of your species, including changelings."
|
||||
cluster_type = /obj/structure/spider/eggcluster/bloody
|
||||
potentialspawns = list(
|
||||
/mob/living/simple_animal/hostile/giant_spider/hunter/flesh,
|
||||
)
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/spider/midwife
|
||||
name = "midwife egg cluster"
|
||||
you_are_text = "You are a midwife spider."
|
||||
flavour_text = "The crux of the spider horde. You have the ability to reproduce and create more spiders, and turn victims into special spider eggs."
|
||||
directive = "Ensure the survival of the spider species and overtake whatever structure you find yourself in."
|
||||
cluster_type = /obj/structure/spider/eggcluster/midwife
|
||||
potentialspawns = list(
|
||||
/mob/living/simple_animal/hostile/giant_spider/midwife,
|
||||
)
|
||||
|
||||
/**
|
||||
* Makes a ghost into a spider based on the type of egg cluster.
|
||||
*
|
||||
* Allows a ghost to get a prompt to use the egg cluster to become a spider.
|
||||
*
|
||||
* Arguments:
|
||||
* * user - The ghost attempting to become a spider
|
||||
* * newname - If set, renames the mob to this name
|
||||
*/
|
||||
/obj/effect/mob_spawn/ghost_role/spider/create(mob/user, newname)
|
||||
var/list/spider_list = list()
|
||||
var/list/display_spiders = list()
|
||||
for(var/choice in potentialspawns)
|
||||
var/mob/living/simple_animal/hostile/giant_spider/spider = choice
|
||||
spider_list[initial(spider.name)] = choice
|
||||
var/datum/radial_menu_choice/option = new
|
||||
option.image = image(icon = initial(spider.icon), icon_state = initial(spider.icon_state))
|
||||
option.info = span_boldnotice("[initial(spider.menu_description)]")
|
||||
display_spiders[initial(spider.name)] = option
|
||||
sort_list(display_spiders)
|
||||
var/chosen_spider = show_radial_menu(user, egg, display_spiders, radius = 38)
|
||||
chosen_spider = spider_list[chosen_spider]
|
||||
if(QDELETED(src) || QDELETED(user) || !chosen_spider)
|
||||
return FALSE
|
||||
mob_type = chosen_spider
|
||||
return ..()
|
||||
@@ -0,0 +1,395 @@
|
||||
|
||||
//i couldn't find any map that uses these, so they're delegated to admin events for now.
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/prisoner_transport
|
||||
name = "prisoner containment sleeper"
|
||||
desc = "A sleeper designed to put its occupant into a deep coma, unbreakable until the sleeper turns off. This one's glass is cracked and you can see a pale, sleeping face staring out."
|
||||
prompt_name = "an escaped prisoner"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper_s"
|
||||
outfit = /datum/outfit/lavalandprisoner
|
||||
you_are_text = "You're a prisoner, sentenced to hard work in one of Nanotrasen's labor camps, but it seems as \
|
||||
though fate has other plans for you."
|
||||
flavour_text = "Good. It seems as though your ship crashed. You remember that you were convicted of "
|
||||
spawner_job_path = /datum/job/escaped_prisoner
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/prisoner_transport/Initialize(mapload)
|
||||
. = ..()
|
||||
var/list/crimes = list("murder", "larceny", "embezzlement", "unionization", "dereliction of duty", "kidnapping", "gross incompetence", "grand theft", "collaboration with the Syndicate", \
|
||||
"worship of a forbidden deity", "interspecies relations", "mutiny")
|
||||
flavour_text += "[pick(crimes)]. but regardless of that, it seems like your crime doesn't matter now. You don't know where you are, but you know that it's out to kill you, and you're not going \
|
||||
to lose this opportunity. Find a way to get out of this mess and back to where you rightfully belong - your [pick("house", "apartment", "spaceship", "station")]."
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/prisoner_transport/Destroy()
|
||||
new /obj/structure/fluff/empty_sleeper/syndicate(get_turf(src))
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/prisoner_transport/special(mob/living/carbon/human/spawned_human)
|
||||
. = ..()
|
||||
spawned_human.fully_replace_character_name(null, "NTP #LL-0[rand(111,999)]") //Nanotrasen Prisoner #Lavaland-(numbers)
|
||||
|
||||
/datum/outfit/lavalandprisoner
|
||||
name = "Lavaland Prisoner"
|
||||
uniform = /obj/item/clothing/under/rank/prisoner
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
shoes = /obj/item/clothing/shoes/sneakers/orange
|
||||
r_pocket = /obj/item/tank/internals/emergency_oxygen
|
||||
|
||||
|
||||
//spawners for the space hotel, which isn't currently in the code but heyoo secret away missions or something
|
||||
|
||||
//Space Hotel Staff
|
||||
|
||||
// SKYRAT EDIT ADD - BEGIN
|
||||
/obj/effect/mob_spawn/ghost_role/human/hotel_staff/manager
|
||||
name = "staff manager sleeper"
|
||||
mob_name = "hotel staff manager"
|
||||
outfit = /datum/outfit/hotelstaff/manager
|
||||
you_are_text = "You are the manager of a top-of-the-line space hotel!"
|
||||
flavour_text = "You are the manager of a top-of-the-line space hotel! Make sure the guests are looked after, the hotel is advertised, and your employees aren't slacking off!"
|
||||
|
||||
/datum/outfit/hotelstaff/manager
|
||||
name = "Hotel Staff Manager"
|
||||
uniform = /obj/item/clothing/under/suit/red
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
r_pocket = /obj/item/radio/off
|
||||
back = /obj/item/storage/backpack
|
||||
implants = list(/obj/item/implant/mindshield, /obj/item/implant/exile/noteleport)
|
||||
// SKYRAT EDIT ADD - END
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/hotel_staff //not free antag u little shits
|
||||
name = "staff sleeper"
|
||||
desc = "A sleeper designed for long-term stasis between guest visits."
|
||||
prompt_name = "a hotel staff member"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper_s"
|
||||
outfit = /datum/outfit/hotelstaff
|
||||
you_are_text = "You are a staff member of a top-of-the-line space hotel!"
|
||||
flavour_text = "Cater to visiting guests with your fellow staff, advertise the hotel, and make sure the manager doesn't fire you. Remember, the customer is always right!"
|
||||
important_text = "Do NOT leave the hotel, as that is grounds for contract termination."
|
||||
spawner_job_path = /datum/job/hotel_staff
|
||||
|
||||
/datum/outfit/hotelstaff
|
||||
name = "Hotel Staff"
|
||||
uniform = /obj/item/clothing/under/misc/assistantformal
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
r_pocket = /obj/item/radio/off
|
||||
back = /obj/item/storage/backpack
|
||||
implants = list(/obj/item/implant/mindshield, /obj/item/implant/exile/noteleport)
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/hotel_staff/security
|
||||
name = "hotel security sleeper"
|
||||
prompt_name = "a hotel security member"
|
||||
outfit = /datum/outfit/hotelstaff/security
|
||||
you_are_text = "You are a peacekeeper."
|
||||
flavour_text = "You have been assigned to this hotel to protect the interests of the company while keeping the peace between \
|
||||
guests and the staff."
|
||||
important_text = "Do NOT leave the hotel, as that is grounds for contract termination."
|
||||
|
||||
/datum/outfit/hotelstaff/security
|
||||
name = "Hotel Security"
|
||||
uniform = /obj/item/clothing/under/rank/security/officer/blueshirt
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
suit = /obj/item/clothing/suit/armor/vest/blueshirt
|
||||
head = /obj/item/clothing/head/helmet/blueshirt
|
||||
back = /obj/item/storage/backpack/security
|
||||
belt = /obj/item/storage/belt/security/full
|
||||
r_hand = /obj/item/gun/energy/laser/scatter/shotty // SKYRAT EDIT ADD - SPAWNS IN HAND INSTEAD OF ON MAP
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/hotel_staff/Destroy()
|
||||
new/obj/structure/fluff/empty_sleeper/syndicate(get_turf(src))
|
||||
return ..()
|
||||
|
||||
//battlecruiser stuff, i suppose
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser
|
||||
name = "Syndicate Battlecruiser Ship Operative"
|
||||
you_are_text = "You are a crewmember aboard the syndicate flagship: the SBC Starfury."
|
||||
flavour_text = "Your job is to follow your captain's orders, maintain the ship, and keep the engine running. If you are not familiar with how the supermatter engine functions: do not attempt to start it."
|
||||
important_text = "The armory is not a candy store, and your role is not to assault the station directly, leave that work to the assault operatives."
|
||||
prompt_name = "a battlecruiser crewmember"
|
||||
outfit = /datum/outfit/syndicate_empty/battlecruiser
|
||||
|
||||
/datum/outfit/syndicate_empty/battlecruiser
|
||||
name = "Syndicate Battlecruiser Ship Operative"
|
||||
l_pocket = /obj/item/gun/ballistic/automatic/pistol
|
||||
r_pocket = /obj/item/knife/combat/survival
|
||||
belt = /obj/item/storage/belt/military/assault
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser/assault
|
||||
name = "Syndicate Battlecruiser Assault Operative"
|
||||
you_are_text = "You are an assault operative aboard the syndicate flagship: the SBC Starfury."
|
||||
flavour_text = "Your job is to follow your captain's orders, keep intruders out of the ship, and assault Space Station 13. There is an armory, multiple assault ships, and beam cannons to attack the station with."
|
||||
important_text = "Work as a team with your fellow operatives and work out a plan of attack. If you are overwhelmed, escape back to your ship!"
|
||||
prompt_name = "a battlecruiser operative"
|
||||
outfit = /datum/outfit/syndicate_empty/battlecruiser/assault
|
||||
|
||||
/datum/outfit/syndicate_empty/battlecruiser/assault
|
||||
name = "Syndicate Battlecruiser Assault Operative"
|
||||
uniform = /obj/item/clothing/under/syndicate/combat
|
||||
l_pocket = /obj/item/ammo_box/magazine/m9mm
|
||||
r_pocket = /obj/item/knife/combat/survival
|
||||
belt = /obj/item/storage/belt/military
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
suit_store = /obj/item/gun/ballistic/automatic/pistol
|
||||
back = /obj/item/storage/backpack/security
|
||||
mask = /obj/item/clothing/mask/gas/syndicate
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser/captain
|
||||
name = "Syndicate Battlecruiser Captain"
|
||||
you_are_text = "You are the captain aboard the syndicate flagship: the SBC Starfury."
|
||||
flavour_text = "Your job is to oversee your crew, defend the ship, and destroy Space Station 13. The ship has an armory, multiple ships, beam cannons, and multiple crewmembers to accomplish this goal."
|
||||
important_text = "As the captain, this whole operation falls on your shoulders. You do not need to nuke the station, causing sufficient damage and preventing your ship from being destroyed will be enough."
|
||||
prompt_name = "a battlecruiser captain"
|
||||
outfit = /datum/outfit/syndicate_empty/battlecruiser/assault/captain
|
||||
|
||||
/datum/outfit/syndicate_empty/battlecruiser/assault/captain
|
||||
name = "Syndicate Battlecruiser Captain"
|
||||
l_pocket = /obj/item/melee/energy/sword/saber/red
|
||||
r_pocket = /obj/item/melee/baton/telescopic
|
||||
suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate
|
||||
suit_store = /obj/item/gun/ballistic/revolver/mateba
|
||||
back = /obj/item/storage/backpack/satchel/leather
|
||||
head = /obj/item/clothing/head/hos/syndicate
|
||||
mask = /obj/item/clothing/mask/cigarette/cigar/havana
|
||||
glasses = /obj/item/clothing/glasses/thermal/eyepatch
|
||||
id_trim = /datum/id_trim/battlecruiser/captain
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/syndicate
|
||||
name = "Syndicate Operative"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper_s"
|
||||
prompt_name = "a syndicate operative"
|
||||
you_are_text = "You are a syndicate operative."
|
||||
flavour_text = "You have awoken, without instruction. Death to Nanotrasen! If there are some clues around as to what you're supposed to be doing, you best follow those."
|
||||
outfit = /datum/outfit/syndicate_empty
|
||||
spawner_job_path = /datum/job/space_syndicate
|
||||
|
||||
/datum/outfit/syndicate_empty
|
||||
name = "Syndicate Operative Empty"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
|
||||
ears = /obj/item/radio/headset/syndicate/alt
|
||||
back = /obj/item/storage/backpack
|
||||
implants = list(/obj/item/implant/weapons_auth)
|
||||
id = /obj/item/card/id/advanced/chameleon
|
||||
id_trim = /datum/id_trim/chameleon/operative
|
||||
|
||||
/datum/outfit/syndicate_empty/post_equip(mob/living/carbon/human/H)
|
||||
H.faction |= ROLE_SYNDICATE
|
||||
|
||||
//For ghost bar.
|
||||
/obj/effect/mob_spawn/ghost_role/human/space_bar_patron
|
||||
name = "bar cryogenics"
|
||||
uses = INFINITY
|
||||
prompt_name = "a space bar patron"
|
||||
you_are_text = "You're a patron!"
|
||||
flavour_text = "Hang out at the bar and chat with your buddies. Feel free to hop back in the cryogenics when you're done chatting."
|
||||
outfit = /datum/outfit/cryobartender
|
||||
spawner_job_path = /datum/job/space_bar_patron
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/space_bar_patron/attack_hand(mob/user, list/modifiers)
|
||||
var/despawn = tgui_alert(usr, "Return to cryosleep? (Warning, Your mob will be deleted!)", null, list("Yes", "No"))
|
||||
if(despawn == "No" || !loc || !Adjacent(user))
|
||||
return
|
||||
user.visible_message(span_notice("[user.name] climbs back into cryosleep..."))
|
||||
qdel(user)
|
||||
|
||||
/datum/outfit/cryobartender
|
||||
name = "Cryogenic Bartender"
|
||||
uniform = /obj/item/clothing/under/rank/civilian/bartender
|
||||
back = /obj/item/storage/backpack
|
||||
shoes = /obj/item/clothing/shoes/sneakers/black
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/reagent
|
||||
|
||||
//Timeless prisons: Spawns in Wish Granter prisons in lavaland. Ghosts become age-old users of the Wish Granter and are advised to seek repentance for their past.
|
||||
/obj/effect/mob_spawn/ghost_role/human/exile
|
||||
name = "timeless prison"
|
||||
desc = "Although this stasis pod looks medicinal, it seems as though it's meant to preserve something for a very long time."
|
||||
prompt_name = "a penitent exile"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
mob_species = /datum/species/shadow
|
||||
you_are_text = "You are cursed."
|
||||
flavour_text = "Years ago, you sacrificed the lives of your trusted friends and the humanity of yourself to reach the Wish Granter. Though you \
|
||||
did so, it has come at a cost: your very body rejects the light, dooming you to wander endlessly in this horrible wasteland."
|
||||
spawner_job_path = /datum/job/exile
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/exile/Destroy()
|
||||
new/obj/structure/fluff/empty_sleeper(get_turf(src))
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/exile/special(mob/living/new_spawn)
|
||||
. = ..()
|
||||
new_spawn.fully_replace_character_name(null,"Wish Granter's Victim ([rand(1,999)])")
|
||||
var/wish = rand(1,4)
|
||||
var/message = ""
|
||||
switch(wish)
|
||||
if(1)
|
||||
message = "<b>You wished to kill, and kill you did. You've lost track of how many, but the spark of excitement that murder once held has winked out. You feel only regret.</b>"
|
||||
if(2)
|
||||
message = "<b>You wished for unending wealth, but no amount of money was worth this existence. Maybe charity might redeem your soul?</b>"
|
||||
if(3)
|
||||
message = "<b>You wished for power. Little good it did you, cast out of the light. You are the [gender == MALE ? "king" : "queen"] of a hell that holds no subjects. You feel only remorse.</b>"
|
||||
if(4)
|
||||
message = "<b>You wished for immortality, even as your friends lay dying behind you. No matter how many times you cast yourself into the lava, you awaken in this room again within a few days. There is no escape.</b>"
|
||||
to_chat(new_spawn, "<span class='infoplain'>[message]</span>")
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/nanotrasensoldier
|
||||
name = "sleeper"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
faction = list("nanotrasenprivate")
|
||||
prompt_name = "a private security officer"
|
||||
you_are_text = "You are a Nanotrasen Private Security Officer!"
|
||||
flavour_text = "If higher command has an assignment for you, it's best you follow that. Otherwise, death to The Syndicate."
|
||||
outfit = /datum/outfit/nanotrasensoldier
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/commander
|
||||
name = "sleeper"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
prompt_name = "a nanotrasen commander"
|
||||
you_are_text = "You are a Nanotrasen Commander!"
|
||||
flavour_text = "Upper-crusty of Nanotrasen. You should be given the respect you're owed."
|
||||
outfit = /datum/outfit/nanotrasencommander
|
||||
|
||||
//space doctor, a rat with cancer, and bessie from an old removed lavaland ruin.
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/doctor
|
||||
name = "sleeper"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
prompt_name = "a space doctor"
|
||||
you_are_text = "You are a space doctor!"
|
||||
flavour_text = "It's your job- no, your duty as a doctor, to care and heal those in need."
|
||||
outfit = /datum/outfit/job/doctor
|
||||
spawner_job_path = /datum/job/space_doctor
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/doctor/alive/equip(mob/living/carbon/human/doctor)
|
||||
. = ..()
|
||||
// Remove radio and PDA so they wouldn't annoy station crew.
|
||||
var/list/del_types = list(/obj/item/pda, /obj/item/radio/headset)
|
||||
for(var/del_type in del_types)
|
||||
var/obj/item/unwanted_item = locate(del_type) in doctor
|
||||
qdel(unwanted_item)
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/mouse
|
||||
name = "sleeper"
|
||||
mob_type = /mob/living/simple_animal/mouse
|
||||
prompt_name = "a mouse"
|
||||
you_are_text = "You're a mouse!"
|
||||
flavour_text = "Uh... yep! Squeak squeak, motherfucker."
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/cow
|
||||
name = "sleeper"
|
||||
mob_name = "Bessie"
|
||||
mob_type = /mob/living/basic/cow
|
||||
prompt_name = "a cow"
|
||||
you_are_text = "You're a cow!"
|
||||
flavour_text = "Go graze some grass, stinky."
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
|
||||
/obj/effect/mob_spawn/cow/special(mob/living/spawned_mob)
|
||||
. = ..()
|
||||
gender = FEMALE
|
||||
|
||||
// snow operatives on snowdin - unfortunately seemingly removed in a map remake womp womp
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/snow_operative
|
||||
name = "sleeper"
|
||||
prompt_name = "a snow operative"
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
faction = list(ROLE_SYNDICATE)
|
||||
outfit = /datum/outfit/snowsyndie
|
||||
you_are_text = "You are a syndicate operative recently awoken from cryostasis in an underground outpost."
|
||||
flavour_text = "Monitor Nanotrasen communications and record information. All intruders should be disposed of \
|
||||
swiftly to assure no gathered information is stolen or lost. Try not to wander too far from the outpost as the \
|
||||
caves can be a deadly place even for a trained operative such as yourself."
|
||||
|
||||
/datum/outfit/snowsyndie
|
||||
name = "Syndicate Snow Operative"
|
||||
uniform = /obj/item/clothing/under/syndicate/coldres
|
||||
shoes = /obj/item/clothing/shoes/combat/coldres
|
||||
ears = /obj/item/radio/headset/syndicate/alt
|
||||
r_pocket = /obj/item/gun/ballistic/automatic/pistol
|
||||
id = /obj/item/card/id/advanced/chameleon
|
||||
implants = list(/obj/item/implant/exile)
|
||||
id_trim = /datum/id_trim/chameleon/operative
|
||||
|
||||
//Forgotten syndicate ship
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/syndicatespace
|
||||
name = "Syndicate Ship Crew Member"
|
||||
show_flavor = FALSE
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper_s"
|
||||
prompt_name = "cybersun crew"
|
||||
you_are_text = "You are a syndicate operative on old ship, stuck in hostile space."
|
||||
flavour_text = "Your ship docks after a long time somewhere in hostile space, reporting a malfunction. You are stuck here, with Nanotrasen station nearby. Fix the ship, find a way to power it and follow your captain's orders."
|
||||
important_text = "Obey orders given by your captain. DO NOT let the ship fall into enemy hands."
|
||||
outfit = /datum/outfit/syndicatespace/syndicrew
|
||||
spawner_job_path = /datum/job/syndicate_cybersun
|
||||
|
||||
/datum/outfit/syndicatespace/syndicrew/post_equip(mob/living/carbon/human/H)
|
||||
H.faction |= ROLE_SYNDICATE
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/syndicatespace/special(mob/living/new_spawn)
|
||||
. = ..()
|
||||
new_spawn.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND)
|
||||
var/datum/job/spawn_job = SSjob.GetJobType(spawner_job_path)
|
||||
var/policy = get_policy(spawn_job.policy_index)
|
||||
if(policy)
|
||||
to_chat(new_spawn, span_bold("[policy]"))
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/syndicatespace/captain
|
||||
name = "Syndicate Ship Captain"
|
||||
prompt_name = "a cybersun captain"
|
||||
you_are_text = "You are the captain of an old ship, stuck in hostile space."
|
||||
flavour_text = "Your ship docks after a long time somewhere in hostile space, reporting a malfunction. You are stuck here, with Nanotrasen station nearby. Command your crew and turn your ship into the most protected fortress."
|
||||
important_text = "Protect the ship and secret documents in your backpack with your own life."
|
||||
outfit = /datum/outfit/syndicatespace/syndicaptain
|
||||
spawner_job_path = /datum/job/syndicate_cybersun_captain
|
||||
|
||||
/datum/outfit/syndicatespace/syndicaptain/post_equip(mob/living/carbon/human/H)
|
||||
H.faction |= ROLE_SYNDICATE
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/syndicatespace/captain/Destroy()
|
||||
new /obj/structure/fluff/empty_sleeper/syndicate/captain(get_turf(src))
|
||||
return ..()
|
||||
|
||||
/datum/outfit/syndicatespace/syndicrew
|
||||
name = "Syndicate Ship Crew Member"
|
||||
uniform = /obj/item/clothing/under/syndicate/combat
|
||||
glasses = /obj/item/clothing/glasses/night
|
||||
mask = /obj/item/clothing/mask/gas/syndicate
|
||||
ears = /obj/item/radio/headset/syndicate/alt
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
back = /obj/item/storage/backpack
|
||||
l_pocket = /obj/item/gun/ballistic/automatic/pistol
|
||||
r_pocket = /obj/item/knife/combat/survival
|
||||
belt = /obj/item/storage/belt/military/assault
|
||||
id = /obj/item/card/id/advanced/black/syndicate_command/crew_id
|
||||
implants = list(/obj/item/implant/weapons_auth)
|
||||
|
||||
/datum/outfit/syndicatespace/syndicaptain
|
||||
name = "Syndicate Ship Captain"
|
||||
uniform = /obj/item/clothing/under/syndicate/combat
|
||||
suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate
|
||||
head = /obj/item/clothing/head/hos/beret/syndicate
|
||||
ears = /obj/item/radio/headset/syndicate/alt/leader
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
back = /obj/item/storage/backpack
|
||||
r_pocket = /obj/item/knife/combat/survival
|
||||
belt = /obj/item/storage/belt/military/assault
|
||||
id = /obj/item/card/id/advanced/black/syndicate_command/captain_id
|
||||
implants = list(/obj/item/implant/weapons_auth)
|
||||
backpack_contents = list(/obj/item/documents/syndicate/red, /obj/item/paper/fluff/ruins/forgottenship/password, /obj/item/gun/ballistic/automatic/pistol/aps)
|
||||
@@ -0,0 +1,394 @@
|
||||
/obj/effect/mob_spawn
|
||||
name = "Mob Spawner"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
//So it shows up in the map editor
|
||||
icon = 'icons/effects/mapping_helpers.dmi'
|
||||
icon_state = "mobspawner"
|
||||
///A forced name of the mob, though can be overridden if a special name is passed as an argument
|
||||
var/mob_name
|
||||
///the type of the mob, you best inherit this
|
||||
var/mob_type = /mob/living/basic/cockroach
|
||||
///Lazy string list of factions that the spawned mob will be in upon spawn
|
||||
var/list/faction
|
||||
|
||||
////Human specific stuff. Don't set these if you aren't using a human, the unit tests will put a stop to your sinful hand.
|
||||
|
||||
///sets the human as a species, use a typepath (example: /datum/species/skeleton)
|
||||
var/mob_species
|
||||
///equips the human with an outfit.
|
||||
var/datum/outfit/outfit
|
||||
///for mappers to override parts of the outfit. really only in here for secret away missions, please try to refrain from using this out of laziness
|
||||
var/list/outfit_override
|
||||
///sets a human's hairstyle
|
||||
var/hairstyle
|
||||
///sets a human's facial hair
|
||||
var/facial_hairstyle
|
||||
///sets a human's hair color (use special for gradients, sorry)
|
||||
var/haircolor
|
||||
///sets a human's facial hair color
|
||||
var/facial_haircolor
|
||||
///sets a human's skin tone
|
||||
var/skin_tone
|
||||
|
||||
/obj/effect/mob_spawn/Initialize(mapload)
|
||||
. = ..()
|
||||
if(faction)
|
||||
faction = string_list(faction)
|
||||
|
||||
///obj/effect/mob_spawn/proc/create(mob/mob_possessor, newname) // ORIGINAL
|
||||
/obj/effect/mob_spawn/proc/create(mob/mob_possessor, newname, ckey) // SKYRAT EDIT CHANGE
|
||||
var/mob/living/spawned_mob = new mob_type(get_turf(src)) //living mobs only // ORIGINAL
|
||||
//var/mob/living/spawned_mob = new create_mob(user, newname) // SKYRAT EDIT CHANGE
|
||||
name_mob(spawned_mob, newname)
|
||||
special(spawned_mob, mob_possessor)
|
||||
equip(spawned_mob)
|
||||
return spawned_mob
|
||||
|
||||
/obj/effect/mob_spawn/proc/special(mob/living/spawned_mob)
|
||||
SHOULD_CALL_PARENT(TRUE)
|
||||
if(faction)
|
||||
spawned_mob.faction = faction
|
||||
if(ishuman(spawned_mob))
|
||||
var/mob/living/carbon/human/spawned_human = spawned_mob
|
||||
if(mob_species)
|
||||
spawned_human.set_species(mob_species)
|
||||
spawned_human.underwear = "Nude"
|
||||
spawned_human.undershirt = "Nude"
|
||||
spawned_human.socks = "Nude"
|
||||
if(hairstyle)
|
||||
spawned_human.hairstyle = hairstyle
|
||||
else
|
||||
spawned_human.hairstyle = random_hairstyle(spawned_human.gender)
|
||||
if(facial_hairstyle)
|
||||
spawned_human.facial_hairstyle = facial_hairstyle
|
||||
else
|
||||
spawned_human.facial_hairstyle = random_facial_hairstyle(spawned_human.gender)
|
||||
if(haircolor)
|
||||
spawned_human.hair_color = haircolor
|
||||
else
|
||||
spawned_human.hair_color = "#[random_color()]"
|
||||
if(facial_haircolor)
|
||||
spawned_human.facial_hair_color = facial_haircolor
|
||||
else
|
||||
spawned_human.facial_hair_color = "#[random_color()]"
|
||||
if(skin_tone)
|
||||
spawned_human.skin_tone = skin_tone
|
||||
else
|
||||
spawned_human.skin_tone = random_skin_tone()
|
||||
spawned_human.update_hair()
|
||||
spawned_human.update_body()
|
||||
|
||||
/obj/effect/mob_spawn/proc/name_mob(mob/living/spawned_mob, forced_name)
|
||||
var/chosen_name
|
||||
//passed arguments on mob spawns are number one priority
|
||||
if(forced_name)
|
||||
chosen_name = forced_name
|
||||
//then the mob name var
|
||||
else if(mob_name)
|
||||
chosen_name = mob_name
|
||||
//then if no name was chosen the one the mob has by default works great
|
||||
if(!chosen_name)
|
||||
return
|
||||
//not using an old name doesn't update records- but ghost roles don't have records so who cares
|
||||
spawned_mob.fully_replace_character_name(null, chosen_name)
|
||||
|
||||
/obj/effect/mob_spawn/proc/equip(mob/living/spawned_mob)
|
||||
if(outfit)
|
||||
var/mob/living/carbon/human/spawned_human = spawned_mob
|
||||
if(outfit_override)
|
||||
outfit = new outfit //create it now to apply vars
|
||||
for(var/outfit_var in outfit_override)
|
||||
if(!ispath(outfit_override[outfit_var]) && !isnull(outfit_override[outfit_var]))
|
||||
CRASH("outfit_override var on [mob_name] spawner has incorrect values! it must be an assoc list with outfit \"var\" = path | null")
|
||||
outfit.vars[outfit_var] = outfit_override[outfit_var]
|
||||
spawned_human.equipOutfit(outfit)
|
||||
|
||||
///these mob spawn subtypes do not trigger until attacked by a ghost.
|
||||
/obj/effect/mob_spawn/ghost_role
|
||||
///a short, lowercase name for the mob used in possession prompt that pops up on ghost attacks. must be set.
|
||||
var/prompt_name = ""
|
||||
///if false, you won't prompt for this role. best used for replacing the prompt system with something else like a radial, or something.
|
||||
var/prompt_ghost = TRUE
|
||||
///how many times this spawner can be used (it won't delete unless it's out of uses)
|
||||
var/uses = 1
|
||||
|
||||
////descriptions
|
||||
|
||||
///This should be the declaration of what the ghost role is, and maybe a short blurb after if you want. Shown in the spawner menu and after spawning first.
|
||||
var/you_are_text = ""
|
||||
///This should be the actual instructions/description/context to the ghost role. This should be the really long explainy bit, basically.
|
||||
var/flavour_text = ""
|
||||
///This is critical non-policy information about the ghost role. Shown in the spawner menu and after spawning last.
|
||||
var/important_text = ""
|
||||
|
||||
///Show these on spawn? Usually used for hardcoded special flavor
|
||||
var/show_flavor = TRUE
|
||||
|
||||
////bans and policy
|
||||
|
||||
///which role to check for a job ban (ROLE_LAVALAND is the default ghost role ban)
|
||||
var/role_ban = ROLE_LAVALAND
|
||||
/// Typepath indicating the kind of job datum this ghost role will have. PLEASE inherit this with a new job datum, it's not hard. jobs come with policy configs.
|
||||
var/spawner_job_path = /datum/job/ghost_role
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/Initialize(mapload)
|
||||
. = ..()
|
||||
SSpoints_of_interest.make_point_of_interest(src)
|
||||
LAZYADD(GLOB.mob_spawners[name], src)
|
||||
|
||||
/obj/effect/mob_spawn/Destroy()
|
||||
var/list/spawners = GLOB.mob_spawners[name]
|
||||
LAZYREMOVE(spawners, src)
|
||||
if(!LAZYLEN(spawners))
|
||||
GLOB.mob_spawners -= name
|
||||
return ..()
|
||||
|
||||
//SKYRAT EDIT ADDITION BEGIN
|
||||
/obj/effect/mob_spawn/proc/extra_prompts(mob/user)
|
||||
return TRUE
|
||||
/*
|
||||
/obj/effect/mob_spawn/proc/create_mob(mob/user, newname)
|
||||
var/mob/living/spawned_mob = new mob_type(get_turf(src)) //living mobs only
|
||||
if(!random || newname)
|
||||
if(newname)
|
||||
spawned_mob.real_name = newname
|
||||
else
|
||||
spawned_mob.real_name = mob_name ? mob_name : spawned_mob.name
|
||||
if(!mob_gender)
|
||||
mob_gender = pick(MALE, FEMALE)
|
||||
spawned_mob.gender = mob_gender
|
||||
return spawned_mob
|
||||
*/
|
||||
//SKYRAT EDIT ADDITION END
|
||||
|
||||
//ATTACK GHOST IGNORING PARENT RETURN VALUE
|
||||
/obj/effect/mob_spawn/ghost_role/attack_ghost(mob/user)
|
||||
if(!SSticker.HasRoundStarted() || !loc)
|
||||
return
|
||||
if(prompt_ghost)
|
||||
var/ghost_role = tgui_alert(usr, "Become [prompt_name]? (Warning, You can no longer be revived!)",, list("Yes", "No"))
|
||||
if(ghost_role != "Yes" || !loc || QDELETED(user))
|
||||
return
|
||||
//SKYRAT EDIT ADDITION BEGIN
|
||||
if(!extra_prompts(user))
|
||||
return
|
||||
|
||||
if(is_banned_from(user.ckey, BAN_GHOST_ROLE_SPAWNER))
|
||||
to_chat(user, span_warning("Error, you are banned from playing ghost roles!"))
|
||||
return
|
||||
//SKYRAT EDIT ADDITION END
|
||||
|
||||
if(!(GLOB.ghost_role_flags & GHOSTROLE_SPAWNER) && !(flags_1 & ADMIN_SPAWNED_1))
|
||||
to_chat(user, span_warning("An admin has temporarily disabled non-admin ghost roles!"))
|
||||
return
|
||||
if(!uses) //just in case
|
||||
to_chat(user, span_warning("This spawner is out of charges!"))
|
||||
return
|
||||
if(is_banned_from(user.key, role_ban))
|
||||
to_chat(user, span_warning("You are banned from this role!"))
|
||||
return
|
||||
if(!allow_spawn(user, silent = FALSE))
|
||||
return
|
||||
if(QDELETED(src) || QDELETED(user))
|
||||
return
|
||||
log_game("[key_name(user)] became a [prompt_name]")
|
||||
create(user)
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/special(mob/living/spawned_mob, mob/mob_possessor)
|
||||
. = ..()
|
||||
spawned_mob.ckey = mob_possessor.ckey
|
||||
if(show_flavor)
|
||||
var/output_message = "<span class='infoplain'><span class='big bold'>[you_are_text]</span></span>"
|
||||
if(flavour_text != "")
|
||||
output_message += "\n<span class='infoplain'><b>[flavour_text]</b></span>"
|
||||
if(important_text != "")
|
||||
output_message += "\n[span_userdanger("[important_text]")]"
|
||||
to_chat(spawned_mob, output_message)
|
||||
var/datum/mind/spawned_mind = spawned_mob.mind
|
||||
spawned_mob.mind.set_assigned_role(SSjob.GetJobType(spawner_job_path))
|
||||
spawned_mind.name = spawned_mob.real_name
|
||||
|
||||
//multiple use mob spawner functionality here- doesn't make sense on corpses
|
||||
///obj/effect/mob_spawn/ghost_role/create(mob/mob_possessor, newname) // ORIGINAL
|
||||
/obj/effect/mob_spawn/ghost_role/create(mob/mob_possessor, newname, ckey) // SKRAT EDIT CHANGE
|
||||
. = ..()
|
||||
if(uses > 0)
|
||||
uses--
|
||||
if(!uses)
|
||||
qdel(src)
|
||||
|
||||
///override this to add special spawn conditions to a ghost role
|
||||
/obj/effect/mob_spawn/ghost_role/proc/allow_spawn(mob/user, silent = FALSE)
|
||||
return TRUE
|
||||
|
||||
///these mob spawn subtypes trigger immediately (New or Initialize) and are not player controlled... since they're dead, you know?
|
||||
/obj/effect/mob_spawn/corpse
|
||||
///when this mob spawn should auto trigger.
|
||||
var/spawn_when = CORPSE_INSTANT
|
||||
|
||||
////damage values (very often, mappers want corpses to be mangled)
|
||||
|
||||
///brute damage this corpse will spawn with
|
||||
var/brute_damage = 0
|
||||
///oxy damage this corpse will spawn with
|
||||
var/oxy_damage = 0
|
||||
///burn damage this corpse will spawn with
|
||||
var/burn_damage = 0
|
||||
|
||||
/obj/effect/mob_spawn/corpse/Initialize(mapload)
|
||||
. = ..()
|
||||
switch(spawn_when)
|
||||
if(CORPSE_INSTANT)
|
||||
INVOKE_ASYNC(src, .proc/create)
|
||||
if(CORPSE_ROUNDSTART)
|
||||
if(mapload || (SSticker && SSticker.current_state > GAME_STATE_SETTING_UP))
|
||||
INVOKE_ASYNC(src, .proc/create)
|
||||
|
||||
/obj/effect/mob_spawn/corpse/special(mob/living/spawned_mob)
|
||||
. = ..()
|
||||
spawned_mob.death(TRUE)
|
||||
spawned_mob.adjustOxyLoss(oxy_damage)
|
||||
spawned_mob.adjustBruteLoss(brute_damage)
|
||||
spawned_mob.adjustFireLoss(burn_damage)
|
||||
|
||||
/obj/effect/mob_spawn/corpse/create(mob/mob_possessor, newname)
|
||||
. = ..()
|
||||
qdel(src)
|
||||
|
||||
//almost all mob spawns in this game, dead or living, are human. so voila
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human
|
||||
//gives it a base sprite instead of a mapping helper. makes sense, right?
|
||||
icon = 'icons/obj/machines/sleeper.dmi'
|
||||
icon_state = "sleeper"
|
||||
mob_type = /mob/living/carbon/human
|
||||
// SKYRAT EDIT START
|
||||
mob_species = /datum/species/human
|
||||
var/can_use_pref_char = TRUE
|
||||
var/can_use_alias = FALSE
|
||||
var/any_station_species = FALSE
|
||||
var/chosen_alias
|
||||
var/is_pref_char
|
||||
var/last_ckey //For validation of the user
|
||||
/// whether the spawner handles the loadout and quirks of the user by itself in one of its own procs, if set to false, the spawner will do it automatically
|
||||
var/handles_loadout_and_quirks = FALSE
|
||||
var/random = FALSE
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/extra_prompts(mob/user)
|
||||
last_ckey = user.ckey
|
||||
chosen_alias = null
|
||||
is_pref_char = null
|
||||
if(can_use_pref_char)
|
||||
var/initial_string = "Would you like to spawn as a randomly created character, or use the one currently selected in your preferences?"
|
||||
var/action = tgui_alert(user, initial_string, "", list("Use Random Character", "Use Character From Preferences"))
|
||||
if(action && action == "Use Character From Preferences")
|
||||
var/warning_string = "WARNING: This spawner will use your currently selected character in prefs ([user.client.prefs?.read_preference(/datum/preference/name/real_name)])\nMake sure that the character is not used as a station crew, or would have a good reason to be this role.(ie. intern in Space Hotel)\nUSING STATION CHARACTERS FOR SYNDICATE OR HOSTILE ROLES IS PROHIBITED WILL GET YOU BANNED!\nConsider making a character dedicated to the role.\nDo you wanna proceed?"
|
||||
var/action2 = tgui_alert(user, warning_string, "", list("Yes", "No"))
|
||||
if(action2 && action2 == "Yes")
|
||||
is_pref_char = TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
if(can_use_alias)
|
||||
var/action = tgui_alert(user, "Would you like to use an alias?\nIf you do, your name will be changed to that", "", list("Dont Use Alias", "Use Alias"))
|
||||
if(action && action == "Use Alias")
|
||||
var/msg = reject_bad_name(input(user, "Set your character's alias for this role", "Alias") as text|null)
|
||||
if(!msg)
|
||||
return FALSE
|
||||
chosen_alias = msg
|
||||
|
||||
if(is_pref_char)
|
||||
var/species_type = user.client.prefs.read_preference(/datum/preference/choiced/species)
|
||||
if(!any_station_species && species_type != mob_species)
|
||||
alert(user, "Sorry, This spawner is limited to those species: [mob_species]. Please switch your character.", "", "Ok")
|
||||
return FALSE
|
||||
|
||||
if(QDELETED(src) || QDELETED(user))
|
||||
return FALSE
|
||||
//What's happening here?
|
||||
//This function is fairly asynchronous and doesnt keep variables in context, so this check is for validation that we are using the correct user
|
||||
if(last_ckey != user.ckey)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/effect/mob_spawn/ghost_role/human/proc/create_mob(mob/user, newname)
|
||||
var/mob/living/carbon/human/H = new mob_type(get_turf(src))
|
||||
if(is_pref_char)
|
||||
user.client?.prefs?.safe_transfer_prefs_to(H)
|
||||
H.dna.update_dna_identity()
|
||||
if(chosen_alias)
|
||||
H.name = chosen_alias
|
||||
H.real_name = chosen_alias
|
||||
//Pre-job equips so Voxes dont die
|
||||
H.dna.species.pre_equip_species_outfit(null, H)
|
||||
H.regenerate_icons()
|
||||
if(!handles_loadout_and_quirks)
|
||||
SSquirks.AssignQuirks(H, user.client, TRUE, TRUE, null, FALSE, H)
|
||||
for(var/datum/loadout_item/item as anything in loadout_list_to_datums(H?.client?.prefs?.loadout_list))
|
||||
item.post_equip_item(H.client?.prefs, H)
|
||||
else
|
||||
if(!random || newname)
|
||||
if(newname)
|
||||
H.real_name = newname
|
||||
else
|
||||
H.real_name = mob_name ? mob_name : H.name
|
||||
/*
|
||||
if(!mob_gender)
|
||||
mob_gender = pick(MALE, FEMALE)
|
||||
H.gender = mob_gender
|
||||
H.body_type = mob_gender
|
||||
*/
|
||||
if(mob_species)
|
||||
H.set_species(mob_species)
|
||||
H.underwear = "Nude"
|
||||
H.undershirt = "Nude"
|
||||
H.socks = "Nude"
|
||||
if(hairstyle)
|
||||
H.hairstyle = hairstyle
|
||||
else
|
||||
H.hairstyle = random_hairstyle(H.gender)
|
||||
if(facial_hairstyle)
|
||||
H.facial_hairstyle = facial_hairstyle
|
||||
else
|
||||
H.facial_hairstyle = random_facial_hairstyle(H.gender)
|
||||
if(skin_tone)
|
||||
H.skin_tone = skin_tone
|
||||
else
|
||||
H.skin_tone = random_skin_tone()
|
||||
H.update_hair()
|
||||
H.update_body()
|
||||
return H
|
||||
//SKYRAT EDIT ADDITION END
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human
|
||||
icon_state = "corpsehuman"
|
||||
mob_type = /mob/living/carbon/human
|
||||
///disables PDA and sensors. only makes sense on corpses because ghost roles could simply turn those on again.
|
||||
var/conceal_presence = TRUE
|
||||
///husks the corpse if true.
|
||||
var/husk = FALSE
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/special(mob/living/carbon/human/spawned_human)
|
||||
. = ..()
|
||||
if(husk)
|
||||
spawned_human.Drain()
|
||||
else //Because for some reason I can't track down, things are getting turned into husks even if husk = false. It's in some damage proc somewhere.
|
||||
spawned_human.cure_husk()
|
||||
|
||||
/obj/effect/mob_spawn/corpse/human/equip(mob/living/carbon/human/spawned_human)
|
||||
. = ..()
|
||||
if(conceal_presence)
|
||||
// We don't want corpse PDAs to show up in the messenger list.
|
||||
var/obj/item/pda/messenger = locate(/obj/item/pda) in spawned_human
|
||||
if(messenger)
|
||||
messenger.toff = TRUE
|
||||
// Or on crew monitors
|
||||
var/obj/item/clothing/under/sensor_clothes = spawned_human.w_uniform
|
||||
if(istype(sensor_clothes))
|
||||
sensor_clothes.sensor_mode = NO_SENSORS
|
||||
spawned_human.update_suit_sensors()
|
||||
|
||||
//don't use this in subtypes, just add 1000 brute yourself. that being said, this is a type that has 1000 brute. it doesn't really have a home anywhere else, it just needs to exist
|
||||
/obj/effect/mob_spawn/corpse/human/damaged
|
||||
brute_damage = 1000
|
||||
Reference in New Issue
Block a user