diff --git a/aurorastation.dme b/aurorastation.dme index 1944d44789f..35bae70cf47 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -31,6 +31,7 @@ #include "code\__defines\extools.dm" #include "code\__defines\flags.dm" #include "code\__defines\gamemode.dm" +#include "code\__defines\ghostspawner.dm" #include "code\__defines\guns.dm" #include "code\__defines\hydroponics.dm" #include "code\__defines\items_clothing.dm" @@ -1590,17 +1591,22 @@ #include "code\modules\games\tarot.dm" #include "code\modules\genetics\side_effects.dm" #include "code\modules\ghostroles\spawner\base.dm" +#include "code\modules\ghostroles\spawner\atom\borer.dm" +#include "code\modules\ghostroles\spawner\atom\golem.dm" +#include "code\modules\ghostroles\spawner\atom\mining_drone.dm" +#include "code\modules\ghostroles\spawner\atom\posibrain.dm" +#include "code\modules\ghostroles\spawner\atom\skeleton.dm" +#include "code\modules\ghostroles\spawner\atom\syndicate_cyborg.dm" +#include "code\modules\ghostroles\spawner\atom\wizard_familiar.dm" +#include "code\modules\ghostroles\spawner\atom\wizardapprentice.dm" #include "code\modules\ghostroles\spawner\human\admin.dm" #include "code\modules\ghostroles\spawner\human\emergencypod.dm" -#include "code\modules\ghostroles\spawner\human\golem.dm" #include "code\modules\ghostroles\spawner\human\human.dm" #include "code\modules\ghostroles\spawner\human\kataphract.dm" #include "code\modules\ghostroles\spawner\human\merchant.dm" #include "code\modules\ghostroles\spawner\human\pra.dm" #include "code\modules\ghostroles\spawner\human\visitor.dm" #include "code\modules\ghostroles\spawner\human\zenghu.dm" -#include "code\modules\ghostroles\spawner\human\antagonist\skeleton.dm" -#include "code\modules\ghostroles\spawner\human\antagonist\wizard.dm" #include "code\modules\ghostroles\spawner\human\responseteams\deathsquad.dm" #include "code\modules\ghostroles\spawner\human\responseteams\iac.dm" #include "code\modules\ghostroles\spawner\human\responseteams\kataphracts.dm" @@ -1610,14 +1616,9 @@ #include "code\modules\ghostroles\spawner\human\responseteams\response_team.dm" #include "code\modules\ghostroles\spawner\human\responseteams\syndicate.dm" #include "code\modules\ghostroles\spawner\human\responseteams\tcfl.dm" -#include "code\modules\ghostroles\spawner\misc\mining_drone.dm" -#include "code\modules\ghostroles\spawner\misc\posibrain.dm" -#include "code\modules\ghostroles\spawner\misc\syndicate_cyborg.dm" -#include "code\modules\ghostroles\spawner\simplemob\borer.dm" #include "code\modules\ghostroles\spawner\simplemob\maintdrone.dm" #include "code\modules\ghostroles\spawner\simplemob\rat.dm" -#include "code\modules\ghostroles\spawner\simplemob\spider.dm" -#include "code\modules\ghostroles\spawner\simplemob\wizard_familiar.dm" +#include "code\modules\ghostroles\spawner\simplemob\spider_queen.dm" #include "code\modules\ghostroles\spawnpoint\spawnpoint.dm" #include "code\modules\ghosttrap\trap.dm" #include "code\modules\global_listener\devices.dm" diff --git a/code/__defines/ghostspawner.dm b/code/__defines/ghostspawner.dm new file mode 100644 index 00000000000..48f1b6f5398 --- /dev/null +++ b/code/__defines/ghostspawner.dm @@ -0,0 +1,2 @@ +#define GS_LOC_ATOM 0x1 //The ghost spawner assigns a atom to the user +#define GS_LOC_POS 0x2 //The ghost spawner determines the spawn location based on a fixed position diff --git a/code/controllers/subsystems/ghostroles.dm b/code/controllers/subsystems/ghostroles.dm index f8cae54d5ed..e9137cc3f1b 100644 --- a/code/controllers/subsystems/ghostroles.dm +++ b/code/controllers/subsystems/ghostroles.dm @@ -31,7 +31,7 @@ log_ss("ghostroles","Spawner [G.type] got removed from selection because of missing data") continue //Check if we have a spawnpoint on the current map - if(!G.select_spawnpoint(FALSE)) + if(!G.select_spawnlocation(FALSE) && G.loc_type == GS_LOC_POS) log_debug("ghostroles","Spawner [G.type] got removed from selection because of missing spawnpoint") continue spawners[G.short_name] = G @@ -191,16 +191,14 @@ var/datum/ghostspawner/G = spawners[ghost_role_name] if(G) G.spawn_atoms += spawn_atom - if(length(G.spawn_atoms) == 1) - G.enable() + if(G.atom_add_message) + say_dead_direct("[G.atom_add_message]
Spawn in as it by using the ghost spawner menu in the ghost tab, and try to be good!") /datum/controller/subsystem/ghostroles/proc/remove_spawn_atom(var/ghost_role_name, var/atom/spawn_atom) if(ghost_role_name && spawn_atom) var/datum/ghostspawner/G = spawners[ghost_role_name] if(G) G.spawn_atoms -= spawn_atom - if(!length(G.spawn_atoms)) - G.disable() /datum/controller/subsystem/ghostroles/proc/get_spawn_atoms(var/ghost_role_name) var/datum/ghostspawner/G = spawners[ghost_role_name] diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 64f7ac6fe7b..d42a420a990 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -509,3 +509,8 @@ /atom/movable/onDropInto(var/atom/movable/AM) return loc // If onDropInto returns something, then dropInto will attempt to drop AM there. + +// This proc is used by ghost spawners to assign a player to a specific atom +// It receives the curent mob of the player s argument and MUST return the mob the player has been assigned. +/atom/proc/assign_player(var/mob/user) + return diff --git a/code/game/gamemodes/antagspawner.dm b/code/game/gamemodes/antagspawner.dm index 391a0ed3f41..142bdead347 100644 --- a/code/game/gamemodes/antagspawner.dm +++ b/code/game/gamemodes/antagspawner.dm @@ -36,7 +36,4 @@ F.faction = user.faction F.say("Initiating boot-up sequence!") spark(F, 4, alldirs) - SSghostroles.add_spawn_atom("syndiborg", F) - var/area/A = get_area(src) - if(A) - say_dead_direct("A syndicate cyborg has started its boot process in [A.name]! Spawn in as it by using the ghost spawner menu in the ghost tab, and try to be good!") + SSghostroles.add_spawn_atom("syndiborg", F) \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/atom/borer.dm b/code/modules/ghostroles/spawner/atom/borer.dm new file mode 100644 index 00000000000..a31226367a9 --- /dev/null +++ b/code/modules/ghostroles/spawner/atom/borer.dm @@ -0,0 +1,10 @@ +/datum/ghostspawner/borer + short_name = "borer" + name = "Cortical Borer" + desc = "Infest crew, reproduce, repeat." + tags = list("Antagonist") + + loc_type = GS_LOC_ATOM + atom_add_message = "A borer has been birthed!" + + spawn_mob = /mob/living/simple_animal/borer diff --git a/code/modules/ghostroles/spawner/atom/golem.dm b/code/modules/ghostroles/spawner/atom/golem.dm new file mode 100644 index 00000000000..f3aaa899a6b --- /dev/null +++ b/code/modules/ghostroles/spawner/atom/golem.dm @@ -0,0 +1,11 @@ +/datum/ghostspawner/golem + short_name = "golem" + name = "Bluespace Golem" + desc = "Serve your Master." + tags = list("Xenobiology") + + respawn_flag = ANIMAL + loc_type = GS_LOC_ATOM + atom_add_message = "A golem rune has been created!" + + spawn_mob = /mob/living/carbon/human/golem diff --git a/code/modules/ghostroles/spawner/atom/mining_drone.dm b/code/modules/ghostroles/spawner/atom/mining_drone.dm new file mode 100644 index 00000000000..d72e9f13f87 --- /dev/null +++ b/code/modules/ghostroles/spawner/atom/mining_drone.dm @@ -0,0 +1,12 @@ +/datum/ghostspawner/mining_drone + short_name = "mining_drone" + name = "Mining Drone" + desc = "Join in as a Mining Drone, assist the miners, get lost on the asteroid and cry synthetic tears." + tags = list("Stationbound") + + respawn_flag = MINISYNTH //Flag to check for when trying to spawn someone of that type (CREW, ANIMAL, MINISYNTH) + jobban_job = "Cyborg" + loc_type = GS_LOC_ATOM + atom_add_message = "Someone is attempting to reboot a mining drone!" + + spawn_mob = /mob/living/silicon/robot/drone/mining diff --git a/code/modules/ghostroles/spawner/atom/posibrain.dm b/code/modules/ghostroles/spawner/atom/posibrain.dm new file mode 100644 index 00000000000..5dbcb58b3c0 --- /dev/null +++ b/code/modules/ghostroles/spawner/atom/posibrain.dm @@ -0,0 +1,13 @@ +/datum/ghostspawner/posibrain + short_name = "posibrain" + name = "Positronic Brain" + desc = "Enter a synthetic brain, capable of piloting a spiderbrain, operating an android, becoming an AI, or being a pocketbuddy." + show_on_job_select = FALSE + tags = list("Stationbound") + + respawn_flag = MINISYNTH //Flag to check for when trying to spawn someone of that type (CREW, ANIMAL, MINISYNTH) + jobban_job = "Cyborg" + loc_type = GS_LOC_ATOM + atom_add_message = "A posibrain has started its boot process!" + + spawn_mob = /mob/living/carbon/brain diff --git a/code/modules/ghostroles/spawner/atom/skeleton.dm b/code/modules/ghostroles/spawner/atom/skeleton.dm new file mode 100644 index 00000000000..9bea6f4caaf --- /dev/null +++ b/code/modules/ghostroles/spawner/atom/skeleton.dm @@ -0,0 +1,10 @@ +/datum/ghostspawner/skeleton + short_name = "skeleton" + name = "Risen Skeleton" + desc = "Serve your Master. Fight things." + tags = list("Antagonist") + + loc_type = GS_LOC_ATOM + atom_add_message = "A skeleton has been created!" + + spawn_mob = /mob/living/carbon/human/skeleton diff --git a/code/modules/ghostroles/spawner/atom/syndicate_cyborg.dm b/code/modules/ghostroles/spawner/atom/syndicate_cyborg.dm new file mode 100644 index 00000000000..614b960253e --- /dev/null +++ b/code/modules/ghostroles/spawner/atom/syndicate_cyborg.dm @@ -0,0 +1,12 @@ +/datum/ghostspawner/syndiborg + short_name = "syndiborg" + name = "Syndicate Cyborg" + desc = "Join in as a Syndicate Cyborg, assist your summoner in their goals, try and make the round fun for the people you're overequipped to deal with." + tags = list("Antagonist") + + respawn_flag = MINISYNTH //Flag to check for when trying to spawn someone of that type (CREW, ANIMAL, MINISYNTH) + jobban_job = "Cyborg" + loc_type = GS_LOC_ATOM + atom_add_message = "A syndicate cyborg has started its boot process!" + + spawn_mob = /mob/living/silicon/robot/syndicate diff --git a/code/modules/ghostroles/spawner/atom/wizard_familiar.dm b/code/modules/ghostroles/spawner/atom/wizard_familiar.dm new file mode 100644 index 00000000000..7f24f1617d7 --- /dev/null +++ b/code/modules/ghostroles/spawner/atom/wizard_familiar.dm @@ -0,0 +1,16 @@ +/datum/ghostspawner/wizard_familiar + short_name = "wizard_familiar" + name = "Wizard Familiar" + desc = "Be a Familiar, act cute, probably end up killing many people somehow." + tags = list("Antagonist") + + loc_type = GS_LOC_ATOM + atom_add_message = "A wizard familiar has been summoned" + + spawn_mob = /mob/living/simple_animal + +/datum/ghostspawner/wizard_familiar/post_spawn(mob/user) + var/mob/living/simple_animal/A = user + if(A.wizard_master) + A.add_spell(new /spell/contract/return_master(A.wizard_master), "const_spell_ready") + to_chat(src, "You are [src], a familiar to [A.wizard_master]. He is your master and your friend. Aid him in his wizarding duties to the best of your ability.") diff --git a/code/modules/ghostroles/spawner/atom/wizardapprentice.dm b/code/modules/ghostroles/spawner/atom/wizardapprentice.dm new file mode 100644 index 00000000000..fcbc7dd2e1b --- /dev/null +++ b/code/modules/ghostroles/spawner/atom/wizardapprentice.dm @@ -0,0 +1,10 @@ +/datum/ghostspawner/apprentice + short_name = "apprentice" + name = "Wizard Apprentice" + desc = "Serve your Master. Cast Spells." + tags = list("Antagonist") + + loc_type = GS_LOC_ATOM + atom_add_message = "A wizard apprentice pebble has been created!" + + spawn_mob = /mob/living/carbon/human diff --git a/code/modules/ghostroles/spawner/base.dm b/code/modules/ghostroles/spawner/base.dm index 69bbac41923..622a208b4dd 100644 --- a/code/modules/ghostroles/spawner/base.dm +++ b/code/modules/ghostroles/spawner/base.dm @@ -2,14 +2,19 @@ var/short_name = null var/name = null var/desc = null - var/show_on_job_select = TRUE // Determines if the ghost spawner role is considered unique or not. + var/show_on_job_select = TRUE // Determines if the ghost spawner role is considered unique or not. var/welcome_message = null var/list/tags = list() //Tags associated with that spawner //Vars regarding the spawnpoints and conditions of the spawner - var/list/spawnpoints = null //List of the applicable spawnpoints (by name) - var/list/spawn_atoms = list() // List of atoms you can spawn at - var/landmark_name = null //Alternatively you can specify a landmark name + var/list/spawn_atoms = list() // List of atoms you can spawn at - Use loc_type: GS_LOC_ATOM + var/atom_add_message = null // Message to display to the ghosts if a spawn atom has been added. The "spawn instructions" are appended automatically + + var/list/spawnpoints = null //List of the applicable spawnpoints (by name) - Use loc_type: GS_LOC_POS + var/landmark_name = null //Alternatively you can specify a landmark name - Use loc_type: GS_LOC_POS + + var/loc_type = GS_LOC_POS + var/max_count = 0 //How often can this spawner be used var/count = 0 //How ofen has this spawner been used var/req_perms = null //What permission flags are required to use this spawner @@ -46,15 +51,18 @@ else return "Missing Permissions" + if(!enabled && !can_edit(user)) //If its not enabled and the user cant edit it, dont show it + return "Currently Disabled" + + if(loc_type == GS_LOC_ATOM && !length(spawn_atoms)) + return "No spawn atoms available" + if(req_head_whitelist && !check_whitelist(user)) return "Missing Head of Staff Whitelist" if(jobban_job && jobban_isbanned(user,jobban_job)) return "Job Banned" - if(!enabled && !can_edit(user)) //If its not enabled and the user cant edit it, dont show it - return "Currently Disabled" - if(req_species_whitelist) if(!is_alien_whitelisted(user, req_species_whitelist)) return "Missing Species Whitelist" @@ -81,9 +89,13 @@ if(max_count && count > max_count) return "No more slots are available." //Check if a spawnpoint is available - var/T = select_spawnpoint(FALSE) - if(!T) - return "No spawnpoint available." + if(loc_type == GS_LOC_POS) + var/T = select_spawnlocation(FALSE) + if(!T) + return "No spawnpoint available." + else + if(!length(spawn_atoms)) + return "No mobs are available to spawn." return FALSE //Proc executed before someone is spawned in @@ -93,13 +105,11 @@ enabled = FALSE return TRUE -//This proc selects the spawnpoint to use. -/datum/ghostspawner/proc/select_spawnpoint(var/use=TRUE) - if(length(spawn_atoms)) - var/chosen_spawn_atom = pick(spawn_atoms) - var/turf/T = get_turf(chosen_spawn_atom) - if(T) - return T +//This proc selects the spawnpoint to use. - Only used when mode is GS_LOC_POS +/datum/ghostspawner/proc/select_spawnlocation(var/use=TRUE) + if(loc_type != GS_LOC_POS) + log_debug("Ghostspawner: select_spawnlocation is not valid for spawner [short_name] as it is not position based") + return null if(!isnull(spawnpoints)) for(var/spawnpoint in spawnpoints) //Loop through the applicable spawnpoints var/turf/T = SSghostroles.get_spawnpoint(spawnpoint, use) //Gets the first matching spawnpoint or null if none are available @@ -116,10 +126,33 @@ return null //If we dont have anything return null +//Selects a spawnatom from the list of available atoms and removes it if use is set to true (default) +/datum/ghostspawner/proc/select_spawnatom(var/use=TRUE) + if(loc_type != GS_LOC_ATOM) + log_debug("Ghostspawner: select_spawnatom is not valid for spawner [short_name] as it is not atom based") + return null + var/atom/A = pick(spawn_atoms) + if(use) + spawn_atoms -= A + return A + //The proc to actually spawn in the user /datum/ghostspawner/proc/spawn_mob(mob/user) //OVERWRITE THIS IN THE CHILD IMPLEMENTATIONS to return the spawned in mob !!! - return null + + //This is a basic proc for atom based spawners. + // Location based spawners usually need a bit more logic + // Atom based spanwers select a atom using the select_spawnatom() proc and then assigned a player to it + // by calling assign_player() with the current mob of the player that should be assigned as a argument. + if(loc_type != GS_LOC_ATOM) + return null + + var/atom/A = select_spawnatom() + + if(A) + return A.assign_player(user) + to_chat(user, SPAN_DANGER("There are no spawn atoms available to spawn at!")) + return FALSE //Proc executed after someone is spawned in /datum/ghostspawner/proc/post_spawn(mob/user) @@ -136,6 +169,8 @@ return FALSE /datum/ghostspawner/proc/is_enabled() + if(loc_type == GS_LOC_ATOM) + return enabled && !!length(spawn_atoms) if(max_count) return enabled && count < max_count return enabled @@ -157,21 +192,7 @@ //Proc to disable the ghostspawner /datum/ghostspawner/proc/disable() enabled = FALSE - for(var/i in SSghostroles.spawnpoints) - SSghostroles.update_spawnpoint_status_by_identifier(i) + if(loc_type == GS_LOC_POS) + for(var/i in SSghostroles.spawnpoints) + SSghostroles.update_spawnpoint_status_by_identifier(i) return TRUE - -/datum/ghostspawner/simplemob/spawn_mob(mob/user) - //Select a spawnpoint (if available) - var/turf/T = select_spawnpoint() - var/mob/living/simple_animal/S - if (T) - S = new spawn_mob(T) - else - to_chat(user, "Unable to find any spawn point. ") - - if(S) - announce_ghost_joinleave(user, 0, "They are now a [name].") - S.ckey = user.ckey - - return S diff --git a/code/modules/ghostroles/spawner/human/antagonist/skeleton.dm b/code/modules/ghostroles/spawner/human/antagonist/skeleton.dm deleted file mode 100644 index e6e8ff10d7c..00000000000 --- a/code/modules/ghostroles/spawner/human/antagonist/skeleton.dm +++ /dev/null @@ -1,24 +0,0 @@ -/datum/ghostspawner/human/skeleton - short_name = "skeleton" - name = "Risen Skeleton" - desc = "Serve your Master. Fight things." - tags = list("Antagonist") - - enabled = FALSE - - spawn_mob = /mob/living/carbon/human/skeleton - -/datum/ghostspawner/human/skeleton/select_spawnpoint(var/use) - return TRUE //We just fake it here, since the spawnpoint is selected if someone is spawned in. - -//The proc to actually spawn in the user -/datum/ghostspawner/human/skeleton/spawn_mob(mob/user) - if(!length(spawn_atoms)) - to_chat(user, SPAN_DANGER("There are no available skeletons to spawn at!")) - return FALSE - - var/mob/living/carbon/human/skeleton/skeleton = pick(spawn_atoms) - - if(user && skeleton) - return skeleton.spawn_skeleton(user) - return FALSE \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/human/antagonist/wizard.dm b/code/modules/ghostroles/spawner/human/antagonist/wizard.dm deleted file mode 100644 index 3dee27e5b0c..00000000000 --- a/code/modules/ghostroles/spawner/human/antagonist/wizard.dm +++ /dev/null @@ -1,24 +0,0 @@ -/datum/ghostspawner/human/apprentice - short_name = "apprentice" - name = "Wizard Apprentice" - desc = "Serve your Master. Cast Spells." - tags = list("Antagonist") - - enabled = FALSE - - spawn_mob = /mob/living/carbon/human - -/datum/ghostspawner/human/apprentice/select_spawnpoint(var/use) - return TRUE //We just fake it here, since the spawnpoint is selected if someone is spawned in. - -//The proc to actually spawn in the user -/datum/ghostspawner/human/apprentice/spawn_mob(mob/user) - if(!length(spawn_atoms)) - to_chat(user, SPAN_DANGER("There are no available apprentice pebbles to spawn at!")) - return FALSE - - var/obj/item/apprentice_pebble/pebble = pick(spawn_atoms) - - if(user && pebble) - return pebble.spawn_apprentice(user) - return FALSE \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/human/emergencypod.dm b/code/modules/ghostroles/spawner/human/emergencypod.dm index 4ccd1864b16..fe26605ef1a 100644 --- a/code/modules/ghostroles/spawner/human/emergencypod.dm +++ b/code/modules/ghostroles/spawner/human/emergencypod.dm @@ -52,7 +52,7 @@ outfit = /datum/outfit/admin/pod/smuggler possible_species = list(SPECIES_HUMAN,SPECIES_SKRELL,SPECIES_UNATHI) -/datum/ghostspawner/human/rescuepodsurv/select_spawnpoint(var/use=TRUE) +/datum/ghostspawner/human/rescuepodsurv/select_spawnlocation(var/use=TRUE) //Randomly select a Turf on the asteroid. var/turf/T = pick_area_turf(/area/mine/unexplored) if(!use) //If we are just checking if we can get one, return the turf we found diff --git a/code/modules/ghostroles/spawner/human/golem.dm b/code/modules/ghostroles/spawner/human/golem.dm deleted file mode 100644 index 27392681c81..00000000000 --- a/code/modules/ghostroles/spawner/human/golem.dm +++ /dev/null @@ -1,25 +0,0 @@ -/datum/ghostspawner/human/golem - short_name = "golem" - name = "Bluespace Golem" - desc = "Serve your Master." - tags = list("Xenobiology") - - respawn_flag = ANIMAL - enabled = FALSE - - spawn_mob = /mob/living/carbon/human/golem - -/datum/ghostspawner/human/golem/select_spawnpoint(var/use) - return TRUE //We just fake it here, since the spawnpoint is selected if someone is spawned in. - -//The proc to actually spawn in the user -/datum/ghostspawner/human/golem/spawn_mob(mob/user) - if(!length(spawn_atoms)) - to_chat(user, SPAN_DANGER("There are no available golem runes to spawn at!")) - return FALSE - - var/obj/effect/golemrune/rune = pick(spawn_atoms) - - if(user && rune) - return rune.spawn_golem(user) - return FALSE \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/human/human.dm b/code/modules/ghostroles/spawner/human/human.dm index baa451eeea1..570ee651d4d 100644 --- a/code/modules/ghostroles/spawner/human/human.dm +++ b/code/modules/ghostroles/spawner/human/human.dm @@ -28,7 +28,7 @@ /datum/ghostspawner/human/pre_spawn(mob/user) . = ..() -/datum/ghostspawner/human/proc/get_mob_name(mob/user, var/species) +/datum/ghostspawner/human/proc/get_mob_name(mob/user, var/species, var/gender) var/mname = mob_name if(isnull(mname)) var/pick_message = "[mob_name_pick_message] ([species])" @@ -37,9 +37,12 @@ if(mob_name_suffix) pick_message = "[pick_message] Auto Suffix: \"[mob_name_suffix]\" " mname = sanitizeSafe(input(user, pick_message, "Name for a [species] (without prefix/suffix)")) - - if(!mname) - mname = pick(last_names) + + if(!length(mname)) + if(mob_name_prefix || mob_name_suffix) + mname = capitalize(pick(last_names)) + else + mname = random_name(gender,species) if(mob_name_prefix) mname = replacetext(mname,mob_name_prefix,"") //Remove the prefix if it exists in the string @@ -52,7 +55,7 @@ //The proc to actually spawn in the user /datum/ghostspawner/human/spawn_mob(mob/user) //Select a spawnpoint (if available) - var/turf/T = select_spawnpoint() + var/turf/T = select_spawnlocation() if(!T) log_debug("GhostSpawner: Unable to select spawnpoint for [short_name]") return FALSE @@ -69,15 +72,17 @@ if(!picked_species) picked_species = possible_species[1] + var/datum/species/S = all_species[picked_species] + var/assigned_gender = pick(S.default_genders) + //Get the name / age from them first - var/mname = get_mob_name(user, picked_species) + var/mname = get_mob_name(user, picked_species, assigned_gender) var/age = input(user, "Enter your characters age:","Num") as num //Spawn in the mob var/mob/living/carbon/human/M = new spawn_mob(newplayer_start) - var/datum/species/S = all_species[picked_species] - M.change_gender(pick(S.default_genders)) + M.change_gender(assigned_gender) M.set_species(picked_species) diff --git a/code/modules/ghostroles/spawner/human/visitor.dm b/code/modules/ghostroles/spawner/human/visitor.dm index c247d996d57..03a5a3e4a55 100644 --- a/code/modules/ghostroles/spawner/human/visitor.dm +++ b/code/modules/ghostroles/spawner/human/visitor.dm @@ -22,5 +22,5 @@ enable_chance = 10 -/datum/ghostspawner/human/visitor/select_spawnpoint(var/use = TRUE) +/datum/ghostspawner/human/visitor/select_spawnlocation(var/use = TRUE) return pick(latejoin) diff --git a/code/modules/ghostroles/spawner/misc/mining_drone.dm b/code/modules/ghostroles/spawner/misc/mining_drone.dm deleted file mode 100644 index 9a3c1eecf50..00000000000 --- a/code/modules/ghostroles/spawner/misc/mining_drone.dm +++ /dev/null @@ -1,26 +0,0 @@ -/datum/ghostspawner/mining_drone - short_name = "mining_drone" - name = "Mining Drone" - desc = "Join in as a Mining Drone, assist the miners, get lost on the asteroid and cry synthetic tears." - tags = list("Stationbound") - - respawn_flag = MINISYNTH //Flag to check for when trying to spawn someone of that type (CREW, ANIMAL, MINISYNTH) - jobban_job = "Cyborg" - - enabled = FALSE - spawn_mob = /mob/living/silicon/robot/drone/mining - -/datum/ghostspawner/mining_drone/select_spawnpoint(var/use) - return TRUE //We just fake it here, since the spawnpoint is selected if someone is spawned in. - -//The proc to actually spawn in the user -/datum/ghostspawner/mining_drone/spawn_mob(mob/user) - if(!length(spawn_atoms)) - to_chat(user, SPAN_DANGER("There are no available mining drones to spawn at!")) - return FALSE - - var/mob/living/silicon/robot/drone/mining/spawn_mining_drone = pick(spawn_atoms) - - if(user && spawn_mining_drone) - return spawn_mining_drone.spawn_into_mining_drone(user) - return FALSE \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/misc/posibrain.dm b/code/modules/ghostroles/spawner/misc/posibrain.dm deleted file mode 100644 index c982e00db54..00000000000 --- a/code/modules/ghostroles/spawner/misc/posibrain.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/ghostspawner/posibrain - short_name = "posibrain" - name = "Positronic Brain" - desc = "Enter a synthetic brain, capable of piloting a spiderbrain, operating an android, becoming an AI, or being a pocketbuddy." - show_on_job_select = FALSE - tags = list("Stationbound") - - respawn_flag = MINISYNTH //Flag to check for when trying to spawn someone of that type (CREW, ANIMAL, MINISYNTH) - jobban_job = "Cyborg" - - enabled = FALSE - spawn_mob = /mob/living/carbon/brain - -/datum/ghostspawner/posibrain/select_spawnpoint(var/use) - return TRUE //We just fake it here, since the spawnpoint is selected if someone is spawned in. - -//The proc to actually spawn in the user -/datum/ghostspawner/posibrain/spawn_mob(mob/user) - if(!length(spawn_atoms)) - to_chat(user, SPAN_DANGER("There are no available posibrains to spawn at!")) - return FALSE - - var/obj/item/device/mmi/digital/posibrain/spawn_posibrain = pick(spawn_atoms) - - if(user && spawn_posibrain) - return spawn_posibrain.spawn_into_posibrain(user) - return FALSE \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/misc/syndicate_cyborg.dm b/code/modules/ghostroles/spawner/misc/syndicate_cyborg.dm deleted file mode 100644 index 5283e626fab..00000000000 --- a/code/modules/ghostroles/spawner/misc/syndicate_cyborg.dm +++ /dev/null @@ -1,26 +0,0 @@ -/datum/ghostspawner/syndiborg - short_name = "syndiborg" - name = "Syndicate Cyborg" - desc = "Join in as a Syndicate Cyborg, assist your summoner in their goals, try and make the round fun for the people you're overequipped to deal with." - tags = list("Antagonist") - - respawn_flag = MINISYNTH //Flag to check for when trying to spawn someone of that type (CREW, ANIMAL, MINISYNTH) - jobban_job = "Cyborg" - - enabled = FALSE - spawn_mob = /mob/living/silicon/robot/syndicate - -/datum/ghostspawner/syndiborg/select_spawnpoint(var/use) - return TRUE //We just fake it here, since the spawnpoint is selected if someone is spawned in. - -//The proc to actually spawn in the user -/datum/ghostspawner/syndiborg/spawn_mob(mob/user) - if(!length(spawn_atoms)) - to_chat(user, SPAN_DANGER("There are no available syndiborgs to spawn at!")) - return FALSE - - var/mob/living/silicon/robot/syndicate/spawn_syndiborg = pick(spawn_atoms) - - if(user && spawn_syndiborg) - return spawn_syndiborg.spawn_into_syndiborg(user) - return FALSE \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/simplemob/borer.dm b/code/modules/ghostroles/spawner/simplemob/borer.dm deleted file mode 100644 index 14f43abb5d1..00000000000 --- a/code/modules/ghostroles/spawner/simplemob/borer.dm +++ /dev/null @@ -1,24 +0,0 @@ -/datum/ghostspawner/simplemob/borer - short_name = "borer" - name = "Cortical Borer" - desc = "Infest crew, reproduce, repeat." - tags = list("Antagonist") - - enabled = FALSE - - spawn_mob = /mob/living/simple_animal/borer - -/datum/ghostspawner/simplemob/borer/select_spawnpoint(var/use) - return TRUE //We just fake it here, since the spawnpoint is selected if someone is spawned in. - -//The proc to actually spawn in the user -/datum/ghostspawner/simplemob/borer/spawn_mob(mob/user) - if(!length(spawn_atoms)) - to_chat(user, SPAN_DANGER("There are no available borers to spawn at!")) - return FALSE - - var/mob/living/simple_animal/borer/spawn_borer = pick(spawn_atoms) - - if(user && spawn_borer) - return spawn_borer.spawn_into_borer(user) - return FALSE \ No newline at end of file diff --git a/code/modules/ghostroles/spawner/simplemob/maintdrone.dm b/code/modules/ghostroles/spawner/simplemob/maintdrone.dm index 493654b881d..09ef680a766 100644 --- a/code/modules/ghostroles/spawner/simplemob/maintdrone.dm +++ b/code/modules/ghostroles/spawner/simplemob/maintdrone.dm @@ -7,6 +7,7 @@ respawn_flag = MINISYNTH //Flag to check for when trying to spawn someone of that type (CREW, ANIMAL, MINISYNTH) jobban_job = "Cyborg" + loc_type = GS_LOC_ATOM //Vars regarding the mob to use spawn_mob = /mob/living/simple_animal/rat //The mob that should be spawned @@ -16,9 +17,6 @@ return "Spawning as drone is disabled" return ..() -/datum/ghostspawner/simplemob/maintdrone/select_spawnpoint(var/use) - return TRUE //We just fake it here, since the spawnpoint is selected if someone is spawned in. - //The proc to actually spawn in the user /datum/ghostspawner/simplemob/maintdrone/spawn_mob(mob/user) var/obj/machinery/drone_fabricator/fabricator @@ -39,4 +37,4 @@ if(user && fabricator && !((fabricator.stat & NOPOWER) || !fabricator.produce_drones || fabricator.drone_progress < 100)) return fabricator.create_drone(user.client) - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/ghostroles/spawner/simplemob/rat.dm b/code/modules/ghostroles/spawner/simplemob/rat.dm index f381375788a..00ae630f848 100644 --- a/code/modules/ghostroles/spawner/simplemob/rat.dm +++ b/code/modules/ghostroles/spawner/simplemob/rat.dm @@ -10,10 +10,9 @@ //Vars regarding the mob to use spawn_mob = /mob/living/simple_animal/rat //The mob that should be spawned - //This proc selects the spawnpoint to use. -/datum/ghostspawner/simplemob/rat/select_spawnpoint() +/datum/ghostspawner/simplemob/rat/select_spawnlocation() //find a viable mouse candidate var/obj/machinery/atmospherics/unary/vent_pump/spawnpoint = find_mouse_spawnpoint(pick(current_map.station_levels)) return get_turf(spawnpoint) @@ -26,7 +25,7 @@ //The proc to actually spawn in the user /datum/ghostspawner/simplemob/rat/spawn_mob(mob/user) //Select a spawnpoint (if available) - var/turf/T = select_spawnpoint() + var/turf/T = select_spawnlocation() var/mob/living/simple_animal/S if (T) S = new spawn_mob(T) @@ -39,4 +38,4 @@ announce_ghost_joinleave(user, 0, "They are now a [name].") S.ckey = user.ckey - return S \ No newline at end of file + return S diff --git a/code/modules/ghostroles/spawner/simplemob/simplemob.dm b/code/modules/ghostroles/spawner/simplemob/simplemob.dm new file mode 100644 index 00000000000..5ee662bdc21 --- /dev/null +++ b/code/modules/ghostroles/spawner/simplemob/simplemob.dm @@ -0,0 +1,24 @@ +/datum/ghostspawner/simplemob/spawn_mob(mob/user) + //Select a spawnpoint (if available) + if(loc_type == GS_LOC_POS) + var/turf/T = select_spawnlocation() + var/mob/living/simple_animal/S + if (T) + S = new spawn_mob(T) + else + to_chat(user, "Unable to find any spawn point. ") + return + + if(S) + announce_ghost_joinleave(user, 0, "They are now a [name].") + S.ckey = user.ckey + + return S + else + var/mob/living/simple_animal/S = select_spawnatom() + if(!S) + to_chat(user, "Unable to find any spawn mob. ") + return + + announce_ghost_joinleave(user, 0, "They are now a [name].") + return S.assign_player(user) diff --git a/code/modules/ghostroles/spawner/simplemob/spider.dm b/code/modules/ghostroles/spawner/simplemob/spider_queen.dm similarity index 100% rename from code/modules/ghostroles/spawner/simplemob/spider.dm rename to code/modules/ghostroles/spawner/simplemob/spider_queen.dm diff --git a/code/modules/ghostroles/spawner/simplemob/wizard_familiar.dm b/code/modules/ghostroles/spawner/simplemob/wizard_familiar.dm deleted file mode 100644 index c197269ca7e..00000000000 --- a/code/modules/ghostroles/spawner/simplemob/wizard_familiar.dm +++ /dev/null @@ -1,23 +0,0 @@ -/datum/ghostspawner/simplemob/wizard_familiar - short_name = "wizard_familiar" - name = "Wizard Familiar" - desc = "Be a Familiar, act cute, probably end up killing many people somehow." - tags = list("Antagonist") - - enabled = FALSE - spawn_mob = /mob/living/simple_animal - -/datum/ghostspawner/simplemob/wizard_familiar/select_spawnpoint(var/use) - return TRUE //We just fake it here, since the spawnpoint is selected if someone is spawned in. - -//The proc to actually spawn in the user -/datum/ghostspawner/simplemob/wizard_familiar/spawn_mob(mob/user) - if(!length(spawn_atoms)) - to_chat(user, SPAN_DANGER("There are no available wizard familiars to spawn at!")) - return FALSE - - var/mob/living/simple_animal/spawn_wizard_familiar = pick(spawn_atoms) - - if(user && spawn_wizard_familiar) - return spawn_wizard_familiar.spawn_into_wizard_familiar(user) - return FALSE \ No newline at end of file diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index aaf78c9957b..375796bdf76 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -64,18 +64,17 @@ return seeking_player = TRUE SSghostroles.add_spawn_atom("mining_drone", src) - var/area/A = get_area(src) - if(A) - say_dead_direct("Someone is attempting to reboot a mining drone in [A.name]! Spawn in as it by using the ghost spawner menu in the ghost tab.") -/mob/living/silicon/robot/drone/mining/proc/spawn_into_mining_drone(var/mob/user) +/mob/living/silicon/robot/drone/mining/assign_player(var/mob/user) if(src.ckey) + SSghostroles.remove_spawn_atom("mining_drone", src) return src.ckey = user.ckey - SSghostroles.remove_spawn_atom("mining_drone", src) seeking_player = FALSE welcome_drone() + return src + /mob/living/silicon/robot/drone/mining/welcome_drone() to_chat(src, SPAN_DANGER("You are a mining drone, a tiny-brained robotic industrial machine.")) to_chat(src, SPAN_DANGER("You have little individual will, some personality, and no drives or urges other than your laws and the art of mining.")) diff --git a/code/modules/mob/abstract/new_player/new_player.dm b/code/modules/mob/abstract/new_player/new_player.dm index 93a5da830a7..687b5095d56 100644 --- a/code/modules/mob/abstract/new_player/new_player.dm +++ b/code/modules/mob/abstract/new_player/new_player.dm @@ -316,9 +316,7 @@ INITIALIZE_IMMEDIATE(/mob/abstract/new_player) var/datum/ghostspawner/G = SSghostroles.spawners[ghost_role] if(!G.show_on_job_select) continue - if(!G.enabled) - continue - if(!isnull(G.req_perms)) + if(G.cant_see(src)) continue unique_role_available = TRUE break diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index e10ad82a21e..89b7d5d8d55 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -19,37 +19,33 @@ if(brainmob.ckey) to_chat(user, SPAN_WARNING("\The [src] already has an active occupant!")) return - var/area/A = get_area(src) if(brainmob && !brainmob.key) if(!searching) to_chat(user, SPAN_NOTICE("You carefully locate the manual activation switch and start \the [src]'s boot process.")) icon_state = "posibrain-searching" searching = TRUE SSghostroles.add_spawn_atom("posibrain", src) - if(A) - say_dead_direct("A posibrain has started its boot process in [A.name]! Spawn in as it by using the ghost spawner menu in the ghost tab.") else to_chat(user, SPAN_NOTICE("You carefully locate the manual activation switch and disable \the [src]'s boot process.")) icon_state = initial(icon_state) searching = FALSE SSghostroles.remove_spawn_atom("posibrain", src) - if(A) - say_dead_direct("A posibrain is no longer booting up in [A.name]. Seems someone disabled it.") -/obj/item/device/mmi/digital/posibrain/proc/spawn_into_posibrain(var/mob/user) +/obj/item/device/mmi/digital/posibrain/assign_player(var/mob/user) if(brainmob.ckey) return brainmob.ckey = user.ckey name = "positronic brain ([brainmob.name])" icon_state = "posibrain-occupied" searching = FALSE - SSghostroles.remove_spawn_atom("posibrain", src) to_chat(brainmob, "You are a positronic brain, brought into existence on [station_name()].") to_chat(brainmob, "As a synthetic intelligence, you answer to all crewmembers, as well as the AI.") to_chat(brainmob, "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm.") visible_message(SPAN_NOTICE("\The [src] chimes quietly.")) + return src + /obj/item/device/mmi/digital/posibrain/examine(mob/user) if(!..(user)) return diff --git a/code/modules/mob/living/carbon/human/species/outsider/undead.dm b/code/modules/mob/living/carbon/human/species/outsider/undead.dm index 7a99141b38a..3e4b018fea3 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/undead.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/undead.dm @@ -4,11 +4,11 @@ /mob/living/carbon/human/skeleton var/master -/mob/living/carbon/human/skeleton/proc/spawn_skeleton(var/mob/user) +/mob/living/carbon/human/skeleton/assign_player(var/mob/user) src.ckey = user.ckey if(master) to_chat(src, "You are a skeleton minion to [master], they are your master. Obey and protect your master at all costs, you have no free will.") - SSghostroles.remove_spawn_atom("skeleton", src) + return src /datum/species/skeleton //SPOOKY name = SPECIES_SKELETON @@ -286,4 +286,4 @@ remains_type = /obj/effect/decal/remains/xeno - default_h_style = "Skrell Short Tentacles" \ No newline at end of file + default_h_style = "Skrell Short Tentacles" diff --git a/code/modules/mob/living/carbon/slime/items.dm b/code/modules/mob/living/carbon/slime/items.dm index c50abb0348c..38646ae4696 100644 --- a/code/modules/mob/living/carbon/slime/items.dm +++ b/code/modules/mob/living/carbon/slime/items.dm @@ -230,7 +230,6 @@ /obj/effect/golemrune/Initialize() . = ..() START_PROCESSING(SSprocessing, src) - announce_to_ghosts() SSghostroles.add_spawn_atom("golem", src) /obj/effect/golemrune/random_type/Initialize() @@ -255,7 +254,7 @@ else icon_state = "golem" -/obj/effect/golemrune/proc/spawn_golem(var/mob/user) +/obj/effect/golemrune/assign_player(var/mob/user) var/obj/item/stack/material/O = (locate(/obj/item/stack/material) in src.loc) if(O?.amount >= 10) if(O.material.golem) @@ -271,12 +270,10 @@ G.name = G.species.get_random_name() G.real_name = G.name to_chat(G, SPAN_NOTICE("You are a golem. Serve your master, and assist them in completing their goals at any cost.")) + qdel(src) -/obj/effect/golemrune/proc/announce_to_ghosts() - var/area/A = get_area(src) - if(A) - say_dead_direct("A golem rune has been created in [A.name]! Access using the ghost spawner menu in the ghost tab.") + return G /obj/effect/golemrune/wizard wizardy = TRUE diff --git a/code/modules/mob/living/silicon/robot/syndicate_robot.dm b/code/modules/mob/living/silicon/robot/syndicate_robot.dm index 744f7ad1d66..ef6f491cf06 100644 --- a/code/modules/mob/living/silicon/robot/syndicate_robot.dm +++ b/code/modules/mob/living/silicon/robot/syndicate_robot.dm @@ -42,17 +42,17 @@ explosion(get_turf(src), 1, 2, 3, 5) qdel(src) -/mob/living/silicon/robot/syndicate/proc/spawn_into_syndiborg(var/mob/user) +/mob/living/silicon/robot/syndicate/assign_player(var/mob/user) if(src.ckey) return src.ckey = user.ckey - SSghostroles.remove_spawn_atom("syndiborg", src) if(assigned_antagonist) assigned_antagonist.add_antagonist_mind(src.mind, TRUE) if(assigned_antagonist.get_antag_radio()) module.channels[assigned_antagonist.get_antag_radio()] = TRUE radio.recalculateChannels() say("Boot sequence complete!") + return src //syndicate borg gear @@ -125,4 +125,4 @@ if(R.cell) R.cell.use(350) return TRUE - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm index f83be7bd942..82d293b8673 100644 --- a/code/modules/mob/living/simple_animal/borer/borer.dm +++ b/code/modules/mob/living/simple_animal/borer/borer.dm @@ -55,9 +55,6 @@ truename = "[pick("Primary","Secondary","Tertiary","Quaternary")]-[rand(1000,9999)]" if(request_player && !ckey && !client) SSghostroles.add_spawn_atom("borer", src) - var/area/A = get_area(src) - if(A) - say_dead_direct("A borer has been birthed in [A.name]! Spawn in as it by using the ghost spawner menu in the ghost tab.") /mob/living/simple_animal/borer/death(gibbed, deathmessage) SSghostroles.remove_spawn_atom("borer", src) @@ -161,10 +158,9 @@ host = null return -/mob/living/simple_animal/borer/proc/spawn_into_borer(var/mob/user) +/mob/living/simple_animal/borer/assign_player(var/mob/user) ckey = user.ckey - qdel(user) - SSghostroles.remove_spawn_atom("borer", src) + return src /mob/living/simple_animal/borer/cannot_use_vents() return diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index d0b6120604b..d6d207ae13f 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -757,15 +757,6 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) B.transform = M.Scale(scale) B.update_icon() -/mob/living/simple_animal/proc/spawn_into_wizard_familiar(var/mob/user) - if(src.ckey) - return - src.ckey = user.ckey - SSghostroles.remove_spawn_atom("wizard_familiar", src) - if(wizard_master) - add_spell(new /spell/contract/return_master(wizard_master), "const_spell_ready") - to_chat(src, "You are [src], a familiar to [wizard_master]. He is your master and your friend. Aid him in his wizarding duties to the best of your ability.") - /mob/living/simple_animal/get_resist_power() return resist_mod diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index c18fa7b71d8..3e9378ddfe1 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -1181,3 +1181,7 @@ proc/is_blind(A) for(var/mob/M in contents) M.flash_eyes(intensity, override_blindness_check, affect_silicon, visual, type) M.flash_eyes(intensity, override_blindness_check, affect_silicon, visual, type) + +/mob/assign_player(var/mob/user) + ckey = user.ckey + return src \ No newline at end of file diff --git a/code/modules/spell_system/artifacts/items/apprentice_pebble.dm b/code/modules/spell_system/artifacts/items/apprentice_pebble.dm index 79a1ac2c580..04e64ac08db 100644 --- a/code/modules/spell_system/artifacts/items/apprentice_pebble.dm +++ b/code/modules/spell_system/artifacts/items/apprentice_pebble.dm @@ -11,17 +11,14 @@ . = ..() contract = new /obj/item/contract/apprentice(src) SSghostroles.add_spawn_atom("apprentice", src) - var/area/A = get_area(src) - if(A) - say_dead_direct("A wizard apprentice pebble has been created in [A.name]! Spawn at it by using the ghost spawner menu in the ghost tab.") - + /obj/item/apprentice_pebble/Destroy() if(contract) QDEL_NULL(contract) SSghostroles.remove_spawn_atom("apprentice", src) return ..() -/obj/item/apprentice_pebble/proc/spawn_apprentice(var/mob/user) +/obj/item/apprentice_pebble/assign_player(var/mob/user) var/mob/living/carbon/human/G = new /mob/living/carbon/human(get_turf(src)) G.ckey = user.ckey G.real_name = "[pick(wizard_first)] [pick(wizard_second)]" @@ -39,9 +36,11 @@ qdel(src) + return G + /obj/item/apprentice_pebble/pickup(mob/living/user) ..() if(!user.is_wizard()) to_chat(user, SPAN_WARNING("As you pick up \the [src], you feel a wave of power wash over you.")) for(var/obj/machinery/light/P in view(7, user)) - P.flicker(1) \ No newline at end of file + P.flicker(1) diff --git a/code/modules/spell_system/artifacts/items/monster_manual.dm b/code/modules/spell_system/artifacts/items/monster_manual.dm index 8074a7a79b3..6f725d16b91 100644 --- a/code/modules/spell_system/artifacts/items/monster_manual.dm +++ b/code/modules/spell_system/artifacts/items/monster_manual.dm @@ -75,9 +75,6 @@ F.faction = usr.faction temp = "You have attempted summoning \the [F]" SSghostroles.add_spawn_atom("wizard_familiar", F) - var/area/A = get_area(src) - if(A) - say_dead_direct("A wizard familiar has been summoned in [A.name]! Spawn in as it by using the ghost spawner menu in the ghost tab.") uses-- if(Adjacent(usr)) diff --git a/code/modules/spell_system/spells/spell_list/others/generic/raise_dead.dm b/code/modules/spell_system/spells/spell_list/others/generic/raise_dead.dm index c2051dffe77..862f3627ebd 100644 --- a/code/modules/spell_system/spells/spell_list/others/generic/raise_dead.dm +++ b/code/modules/spell_system/spells/spell_list/others/generic/raise_dead.dm @@ -36,9 +36,6 @@ var/mob/living/carbon/human/skeleton/F = new /mob/living/carbon/human/skeleton(get_turf(target)) SSghostroles.add_spawn_atom("skeleton", F) - var/area/A = get_area(F) - if(A) - say_dead_direct("A skeleton has been created in [A.name]! Spawn in as it by using the ghost spawner menu in the ghost tab.") target.visible_message("\The [target] explodes in a shower of gore, a skeleton emerges from the remains!") target.gib()