[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:
SkyratBot
2021-12-23 03:30:55 +01:00
committed by GitHub
parent 3c20fe4c12
commit b894ce42d4
121 changed files with 2529 additions and 2630 deletions
@@ -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)
+394
View File
@@ -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