Merge remote-tracking branch 'tgstation/master' into upstream-2025-11-29

# Conflicts:
#	_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
#	_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	_maps/map_files/tramstation/tramstation.dmm
#	code/_onclick/hud/new_player.dm
#	code/datums/components/squashable.dm
#	code/datums/diseases/advance/symptoms/heal.dm
#	code/datums/diseases/chronic_illness.dm
#	code/datums/status_effects/buffs.dm
#	code/datums/status_effects/debuffs/drunk.dm
#	code/datums/status_effects/debuffs/stamcrit.dm
#	code/game/machinery/computer/crew.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/game/objects/items/wall_mounted.dm
#	code/game/turfs/closed/indestructible.dm
#	code/modules/admin/view_variables/filterrific.dm
#	code/modules/antagonists/heretic/influences.dm
#	code/modules/cargo/orderconsole.dm
#	code/modules/client/preferences.dm
#	code/modules/events/space_vines/vine_mutations.dm
#	code/modules/mob/dead/new_player/new_player.dm
#	code/modules/mob/living/carbon/human/death.dm
#	code/modules/mob/living/carbon/human/species_types/jellypeople.dm
#	code/modules/mob/living/damage_procs.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob_spawn/ghost_roles/mining_roles.dm
#	code/modules/mob_spawn/mob_spawn.dm
#	code/modules/projectiles/ammunition/energy/laser.dm
#	code/modules/projectiles/guns/ballistic/launchers.dm
#	code/modules/projectiles/guns/energy/laser.dm
#	code/modules/reagents/chemistry/machinery/chem_dispenser.dm
#	code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
#	code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
#	code/modules/reagents/chemistry/reagents/medicine_reagents.dm
#	code/modules/surgery/healing.dm
#	code/modules/unit_tests/designs.dm
#	icons/mob/inhands/items_lefthand.dmi
#	icons/mob/inhands/items_righthand.dmi
#	tgui/packages/tgui/interfaces/ChemDispenser.tsx
This commit is contained in:
nevimer
2025-11-29 22:49:21 -05:00
1185 changed files with 39068 additions and 32028 deletions
@@ -14,7 +14,7 @@
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, mob/mob_possessor)
/obj/effect/mob_spawn/ghost_role/human/skeleton/special(mob/living/new_spawn, mob/mob_possessor, apply_prefs)
. = ..()
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.")
@@ -30,7 +30,7 @@
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, mob/mob_possessor)
/obj/effect/mob_spawn/ghost_role/human/zombie/special(mob/living/new_spawn, mob/mob_possessor, apply_prefs)
. = ..()
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.")
@@ -6,8 +6,9 @@
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"
allow_custom_character = GHOSTROLE_TAKE_PREFS_APPEARANCE
/obj/effect/mob_spawn/ghost_role/human/fugitive/special(mob/living/carbon/human/spawned_human, mob/mob_possessor)
/obj/effect/mob_spawn/ghost_role/human/fugitive/special(mob/living/carbon/human/spawned_human, mob/mob_possessor, apply_prefs)
. = ..()
var/datum/antagonist/fugitive_hunter/fughunter = new
fughunter.backstory = back_story
@@ -32,14 +32,7 @@
notify_flags = NOTIFY_CATEGORY_NOFLASH,
)
/obj/effect/mob_spawn/ghost_role/human/golem/name_mob(mob/living/spawned_mob, forced_name)
if(forced_name || !iscarbon(spawned_mob))
return ..()
forced_name = generate_random_name_species_based(spawned_mob.gender, TRUE, species_type = /datum/species/golem)
return ..()
/obj/effect/mob_spawn/ghost_role/human/golem/special(mob/living/new_spawn, mob/mob_possessor)
/obj/effect/mob_spawn/ghost_role/human/golem/special(mob/living/new_spawn, mob/mob_possessor, apply_prefs)
. = ..()
if(is_path_in_list(initial_type, GLOB.golem_stack_food_directory))
var/datum/golem_food_buff/initial_buff = GLOB.golem_stack_food_directory[initial_type]
@@ -73,7 +66,7 @@
desc = "A humanoid shape, empty, lifeless, and full of potential."
prompt_name = "a free golem"
/obj/effect/mob_spawn/ghost_role/human/golem/adamantine/special(mob/living/new_spawn, mob/mob_possessor)
/obj/effect/mob_spawn/ghost_role/human/golem/adamantine/special(mob/living/new_spawn, mob/mob_possessor, apply_prefs)
. = ..()
if(!ishuman(new_spawn))
return
@@ -110,8 +103,6 @@
to_chat(new_spawn, span_userdanger("Serve [real_owner.real_name], and assist [real_owner.p_them()] in completing [real_owner.p_their()] goals at any cost."))
/obj/effect/mob_spawn/ghost_role/human/golem/servant/name_mob(mob/living/spawned_mob, forced_name)
if(forced_name || !iscarbon(spawned_mob))
return ..()
if(owner_ref?.resolve())
forced_name = "Golem ([rand(1,999)])"
return ..()
@@ -14,6 +14,7 @@
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
allow_custom_character = ALL
quirks_enabled = TRUE // SKYRAT EDIT ADDITION - ghost role loadouts
random_appearance = FALSE // SKYRAT EDIT ADDITION
@@ -81,6 +82,7 @@
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
allow_custom_character = GHOSTROLE_TAKE_PREFS_APPEARANCE
quirks_enabled = TRUE // SKYRAT EDIT ADDITION - ghost role loadouts
random_appearance = FALSE // SKYRAT EDIT ADDITION
@@ -89,8 +91,9 @@
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
allow_custom_character = NONE
/obj/effect/mob_spawn/ghost_role/human/beach/lifeguard/special(mob/living/carbon/human/lifeguard, mob/mob_possessor)
/obj/effect/mob_spawn/ghost_role/human/beach/lifeguard/special(mob/living/carbon/human/lifeguard, mob/mob_possessor, apply_prefs)
. = ..()
lifeguard.gender = FEMALE
lifeguard.update_body()
@@ -123,6 +126,7 @@
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
allow_custom_character = ALL
random_appearance = FALSE // SKYRAT EDIT ADDITION
/datum/outfit/spacebartender
@@ -242,7 +246,7 @@
to_chat(user, span_warning("You have exhausted your usefulness to the Necropolis."))
return FALSE
/obj/effect/mob_spawn/ghost_role/human/ash_walker/special(mob/living/carbon/human/spawned_human, mob/mob_possessor)
/obj/effect/mob_spawn/ghost_role/human/ash_walker/special(mob/living/carbon/human/spawned_human, mob/mob_possessor, apply_prefs)
// SKYRAT EDIT ADDITION BEGIN
spawned_human.fully_replace_character_name(null, spawned_human.generate_random_mob_name(TRUE)) // SKYRAT EDIT MOVE - Moving before parent call prevents char name randomization
quirks_enabled = TRUE // ghost role quirks
@@ -300,8 +304,9 @@
quirks_enabled = TRUE // SKYRAT EDIT ADDITION - ghost role loadouts
random_appearance = FALSE // SKYRAT EDIT ADDITION
deletes_on_zero_uses_left = FALSE
allow_custom_character = ALL
/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/special(mob/living/new_spawn, mob/mob_possessor)
/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/special(mob/living/new_spawn, mob/mob_possessor, apply_prefs)
. = ..()
new_spawn.grant_language(/datum/language/codespeak, source = LANGUAGE_SPAWNER) // SKYRAT EDIT CHANGE - ORIGINAL: new_spawn.grant_language(/datum/language/codespeak, source = LANGUAGE_MIND)
@@ -14,9 +14,12 @@
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
allow_custom_character = GHOSTROLE_TAKE_PREFS_APPEARANCE
/obj/effect/mob_spawn/ghost_role/human/oldstation/create_from_ghost(mob/dead/user)
/obj/effect/mob_spawn/ghost_role/human/oldstation/create(mob/mob_possessor, newname, apply_prefs)
. = ..()
if(!.)
return
notify_ghosts(
"Someone just woke up on Charlie Station! Why not join them and help out?",
source = ., //the spawned mob
@@ -102,6 +105,7 @@
outfit = /datum/outfit/syndicate_empty/battlecruiser
spawner_job_path = /datum/job/battlecruiser_crew
uses = 4
allow_custom_character = ALL
/// The antag team to apply the player to
var/datum/team/antag_team
@@ -191,6 +195,7 @@
important_text = "Work as a team with your fellow actors and the director to make entertainment for the masses."
outfit = /datum/outfit/actor
spawner_job_path = /datum/job/ghost_role
allow_custom_character = ALL
/datum/outfit/actor
name = "Actor"
@@ -215,6 +220,7 @@
important_text = "Work as a team with your fellow actors and the director to make entertainment for the masses."
outfit = /datum/outfit/actor/director
spawner_job_path = /datum/job/ghost_role
allow_custom_character = ALL
/datum/outfit/actor/director
name = "Director"
@@ -139,8 +139,9 @@
if(!silent)
to_chat(user, span_warning("\The [src] is not ready to hatch yet!"))
return FALSE
return TRUE
/obj/effect/mob_spawn/ghost_role/spider/special(mob/living/basic/spider/spawned_mob, mob/mob_possessor)
/obj/effect/mob_spawn/ghost_role/spider/special(mob/living/basic/spider/spawned_mob, mob/mob_possessor, apply_prefs)
. = ..()
if (isspider(spawned_mob))
spawned_mob.directive = directive
@@ -197,21 +198,12 @@
)
flash_window = TRUE
/**
* 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)
/obj/effect/mob_spawn/ghost_role/spider/pre_ghost_take(mob/dead/observer/user)
var/chosen_spider = length(potentialspawns) > 1 ? get_radial_choice(user) : potentialspawns[1]
if(QDELETED(src) || QDELETED(user) || isnull(chosen_spider))
if(isnull(chosen_spider))
return FALSE
mob_type = chosen_spider
return ..()
return TRUE
/// Pick a spider type from a radial menu
/obj/effect/mob_spawn/ghost_role/spider/proc/get_radial_choice(mob/user)
@@ -12,6 +12,7 @@
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
allow_custom_character = GHOSTROLE_TAKE_PREFS_APPEARANCE
/obj/effect/mob_spawn/ghost_role/human/prisoner_transport/Initialize(mapload)
. = ..()
@@ -24,7 +25,7 @@
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, mob/mob_possessor)
/obj/effect/mob_spawn/ghost_role/human/prisoner_transport/special(mob/living/carbon/human/spawned_human, mob/mob_possessor, apply_prefs)
. = ..()
spawned_human.fully_replace_character_name(null, "NTP #LL-0[rand(111,999)]") //Nanotrasen Prisoner #Lavaland-(numbers)
@@ -50,6 +51,7 @@
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
allow_custom_character = ALL
/datum/outfit/hotelstaff
name = "Hotel Staff"
@@ -94,6 +96,7 @@
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
allow_custom_character = ALL
/datum/outfit/syndicate_empty
name = "Syndicate Operative Empty"
@@ -119,6 +122,7 @@
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
allow_custom_character = ALL
/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"))
@@ -153,7 +157,7 @@
new/obj/structure/fluff/empty_sleeper(get_turf(src))
return ..()
/obj/effect/mob_spawn/ghost_role/human/exile/special(mob/living/new_spawn, mob/mob_possessor)
/obj/effect/mob_spawn/ghost_role/human/exile/special(mob/living/new_spawn, mob/mob_possessor, apply_prefs)
. = ..()
new_spawn.fully_replace_character_name(null,"Wish Granter's Victim ([rand(1,999)])")
var/wish = rand(1,4)
@@ -178,6 +182,7 @@
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
allow_custom_character = ALL
/obj/effect/mob_spawn/ghost_role/human/commander
name = "sleeper"
@@ -187,6 +192,7 @@
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
allow_custom_character = GHOSTROLE_TAKE_PREFS_APPEARANCE
//space doctor, a rat with cancer, and bessie from an old removed lavaland ruin.
@@ -199,6 +205,7 @@
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
allow_custom_character = ALL
/obj/effect/mob_spawn/ghost_role/human/doctor/alive/equip(mob/living/carbon/human/doctor)
. = ..()
@@ -227,7 +234,7 @@
icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
/obj/effect/mob_spawn/cow/special(mob/living/spawned_mob, mob/mob_possessor)
/obj/effect/mob_spawn/cow/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs)
. = ..()
gender = FEMALE
@@ -244,6 +251,7 @@
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."
allow_custom_character = ALL
/datum/outfit/snowsyndie
name = "Syndicate Snow Operative"
@@ -269,8 +277,9 @@
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
allow_custom_character = ALL
/obj/effect/mob_spawn/ghost_role/human/syndicatespace/special(mob/living/new_spawn, mob/mob_possessor)
/obj/effect/mob_spawn/ghost_role/human/syndicatespace/special(mob/living/new_spawn, mob/mob_possessor, apply_prefs)
. = ..()
new_spawn.grant_language(/datum/language/codespeak, source = LANGUAGE_SPAWNER) // SKYRAT EDIT CHANGE - ORIGINAL: new_spawn.grant_language(/datum/language/codespeak, source = LANGUAGE_MIND)
var/datum/job/spawn_job = SSjob.get_job_type(spawner_job_path)
@@ -286,6 +295,7 @@
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
allow_custom_character = ALL
/obj/effect/mob_spawn/ghost_role/human/syndicatespace/captain/Destroy()
new /obj/structure/fluff/empty_sleeper/syndicate/captain(get_turf(src))
@@ -31,7 +31,7 @@
if(flower_bud.trait_flags & SPACEVINE_COLD_RESISTANT)
spawned_human_trap.unsuitable_cold_damage = 0
/obj/effect/mob_spawn/ghost_role/venus_human_trap/special(mob/living/spawned_mob, mob/mob_possessor)
/obj/effect/mob_spawn/ghost_role/venus_human_trap/special(mob/living/spawned_mob, mob/mob_possessor, apply_prefs)
. = ..()
spawned_mob.mind.add_antag_datum(/datum/antagonist/venus_human_trap)
@@ -54,3 +54,4 @@
if(!silent)
to_chat(user, span_warning("\The [src] has not borne fruit yet!"))
return FALSE
return TRUE