Merge remote-tracking branch 'tgstation/master' into upstream-feb12-2026

# Conflicts:
#	.github/CODEOWNERS
#	.github/workflows/compile_changelogs.yml
#	.github/workflows/stale.yml
#	SQL/database_changelog.md
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	code/__DEFINES/atom_hud.dm
#	code/__DEFINES/inventory.dm
#	code/__DEFINES/mobs.dm
#	code/__DEFINES/species_clothing_paths.dm
#	code/__DEFINES/subsystems.dm
#	code/__DEFINES/surgery.dm
#	code/__HELPERS/global_lists.dm
#	code/_globalvars/lists/maintenance_loot.dm
#	code/_globalvars/traits/_traits.dm
#	code/controllers/subsystem/minor_mapping.dm
#	code/controllers/subsystem/processing/quirks.dm
#	code/controllers/subsystem/shuttle.dm
#	code/datums/components/palette.dm
#	code/datums/components/surgery_initiator.dm
#	code/datums/diseases/advance/advance.dm
#	code/datums/hud.dm
#	code/datums/mood.dm
#	code/datums/mutations/chameleon.dm
#	code/datums/quirks/negative_quirks/nyctophobia.dm
#	code/datums/status_effects/debuffs/debuffs.dm
#	code/datums/status_effects/debuffs/drunk.dm
#	code/datums/status_effects/debuffs/slime/slime_leech.dm
#	code/datums/weather/weather.dm
#	code/game/data_huds.dm
#	code/game/objects/items.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/game/objects/items/frog_statue.dm
#	code/game/objects/items/rcd/RLD.dm
#	code/game/objects/items/robot/items/hypo.dm
#	code/game/objects/items/stacks/medical.dm
#	code/game/objects/items/stacks/wrap.dm
#	code/game/objects/items/storage/garment.dm
#	code/game/objects/items/tools/medical/defib.dm
#	code/game/objects/items/weaponry.dm
#	code/game/objects/items/weaponry/melee/misc.dm
#	code/game/objects/structures/crates_lockers/closets/secure/security.dm
#	code/game/objects/structures/curtains.dm
#	code/game/objects/structures/dresser.dm
#	code/game/objects/structures/girders.dm
#	code/game/objects/structures/maintenance.dm
#	code/game/objects/structures/mirror.dm
#	code/modules/admin/greyscale_modify_menu.dm
#	code/modules/admin/verbs/light_debug.dm
#	code/modules/antagonists/ashwalker/ashwalker.dm
#	code/modules/antagonists/heretic/knowledge/starting_lore.dm
#	code/modules/antagonists/ninja/ninjaDrainAct.dm
#	code/modules/art/paintings.dm
#	code/modules/client/preferences.dm
#	code/modules/client/verbs/ooc.dm
#	code/modules/clothing/head/wig.dm
#	code/modules/events/disease_outbreak.dm
#	code/modules/holodeck/holo_effect.dm
#	code/modules/jobs/job_types/head_of_security.dm
#	code/modules/jobs/job_types/security_officer.dm
#	code/modules/library/skill_learning/generic_skillchips/point.dm
#	code/modules/mining/lavaland/ash_flora.dm
#	code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm
#	code/modules/mob/dead/new_player/new_player.dm
#	code/modules/mob/living/basic/guardian/guardian.dm
#	code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm
#	code/modules/mob/living/carbon/carbon.dm
#	code/modules/mob/living/carbon/human/human.dm
#	code/modules/mob/living/carbon/human/human_defines.dm
#	code/modules/mob/living/carbon/life.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob/living/living_defines.dm
#	code/modules/mob/mob.dm
#	code/modules/mob_spawn/ghost_roles/mining_roles.dm
#	code/modules/mod/mod_control.dm
#	code/modules/mod/modules/modules_general.dm
#	code/modules/modular_computers/computers/item/computer_ui.dm
#	code/modules/paperwork/paper.dm
#	code/modules/paperwork/paperbin.dm
#	code/modules/power/lighting/light.dm
#	code/modules/projectiles/guns/energy/kinetic_accelerator.dm
#	code/modules/projectiles/projectile.dm
#	code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
#	code/modules/reagents/chemistry/reagents/food_reagents.dm
#	code/modules/reagents/chemistry/reagents/other_reagents.dm
#	code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
#	code/modules/research/xenobiology/crossbreeding/_clothing.dm
#	code/modules/research/xenobiology/crossbreeding/prismatic.dm
#	code/modules/surgery/advanced/brainwashing.dm
#	code/modules/surgery/advanced/lobotomy.dm
#	code/modules/surgery/amputation.dm
#	code/modules/surgery/blood_filter.dm
#	code/modules/surgery/bodyparts/_bodyparts.dm
#	code/modules/surgery/brain_surgery.dm
#	code/modules/surgery/cavity_implant.dm
#	code/modules/surgery/coronary_bypass.dm
#	code/modules/surgery/gastrectomy.dm
#	code/modules/surgery/healing.dm
#	code/modules/surgery/limb_augmentation.dm
#	code/modules/surgery/organ_manipulation.dm
#	code/modules/surgery/revival.dm
#	code/modules/surgery/sleeper_protocol.dm
#	code/modules/surgery/surgery_helpers.dm
#	code/modules/surgery/surgery_step.dm
#	code/modules/unit_tests/_unit_tests.dm
#	code/modules/unit_tests/designs.dm
#	code/modules/unit_tests/icon_state_worn.dm
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png
#	code/modules/unit_tests/screenshots/screenshot_husk_body.png
#	code/modules/unit_tests/screenshots/screenshot_husk_body_missing_limbs.png
#	icons/map_icons/clothing/head/_head.dmi
#	icons/map_icons/clothing/shoes.dmi
#	icons/map_icons/items/_item.dmi
#	icons/mob/huds/hud.dmi
#	icons/mob/inhands/64x64_lefthand.dmi
#	icons/mob/inhands/64x64_righthand.dmi
#	icons/obj/machines/computer.dmi
#	tgui/packages/tgui/interfaces/OperatingComputer.jsx
#	tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx
#	tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
#	tgui/packages/tgui/interfaces/SurgeryInitiator.tsx
#	tools/icon_cutter/check.py
This commit is contained in:
nevimer
2026-02-12 23:50:09 -05:00
2374 changed files with 81136 additions and 52767 deletions
@@ -89,45 +89,39 @@
desc = "A bubbling pool of oil. This would probably be valuable, had bluespace technology not destroyed the need for fossil fuels 200 years ago."
icon = 'icons/obj/watercloset.dmi'
icon_state = "puddle-oil"
capacity = 20
dispensedreagent = /datum/reagent/fuel/oil
pixel_shift = 0
/obj/structure/sink/oil_well/Initialize(mapload)
.=..()
create_reagents(20)
reagents.add_reagent(dispensedreagent, 20)
. = ..()
//I'm pretty much aware that, because how oil wells and sinks work, attackby() won't work unless in combat mode.
//Thankfully, the user can cast the line from a distance.
AddComponent(/datum/component/fishing_spot, /datum/fish_source/oil_well)
/obj/structure/sink/oil_well/find_and_mount_on_atom(mark_for_late_init, late_init)
///Oil wells exist indepent of any wall structure
return FALSE
/obj/structure/sink/oil_well/attack_hand(mob/user, list/modifiers)
flick("puddle-oil-splash",src)
reagents.expose(user, TOUCH, 20) //Covers target in 20u of oil.
to_chat(user, span_notice("You touch the pool of oil, only to get oil all over yourself. It would be wise to wash this off with water."))
/obj/structure/sink/oil_well/attackby(obj/item/O, mob/living/user, list/modifiers, list/attack_modifiers)
flick("puddle-oil-splash",src)
if(O.tool_behaviour == TOOL_SHOVEL) //attempt to deconstruct the puddle with a shovel
to_chat(user, "You fill in the oil well with soil.")
O.play_tool_sound(src)
deconstruct()
return 1
if(is_reagent_container(O)) //Refilling bottles with oil
var/obj/item/reagent_containers/RG = O
if(RG.is_refillable())
if(!RG.reagents.holder_full())
RG.reagents.add_reagent(dispensedreagent, min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this))
to_chat(user, span_notice("You fill [RG] from [src]."))
return TRUE
to_chat(user, span_notice("\The [RG] is full."))
return FALSE
if(!user.combat_mode)
to_chat(user, span_notice("You won't have any luck getting \the [O] out if you drop it in the oil."))
return 1
else
return ..()
/obj/structure/sink/oil_well/wrench_act(mob/living/user, obj/item/tool)
//we deconstruct with a shovel
return NONE
/obj/structure/sink/oil_well/drop_materials()
/obj/structure/sink/oil_well/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
flick("puddle-oil-splash",src)
if(tool.tool_behaviour == TOOL_SHOVEL) //attempt to deconstruct the puddle with a shovel
to_chat(user, "You fill in the oil well with soil.")
tool.play_tool_sound(src)
deconstruct(TRUE)
return ITEM_INTERACT_SUCCESS
return ..()
/obj/structure/sink/oil_well/atom_deconstruct(dissambled = TRUE)
new /obj/effect/decal/cleanable/blood/oil(loc)
//***Grave mounds.
@@ -196,7 +196,7 @@
/obj/structure/puzzle_element
name = "mysterious pillar"
desc = "puzzling..."
desc = "Puzzling..."
icon = 'icons/obj/mining_zones/artefacts.dmi'
icon_state = "puzzle_pillar"
anchored = FALSE
@@ -315,7 +315,7 @@
return
/obj/item/prisoncube
name = "Prison Cube"
name = "prison cube"
desc = "Dusty cube with humanoid imprint on it."
icon = 'icons/obj/mining_zones/artefacts.dmi'
icon_state = "prison_cube"
@@ -165,6 +165,8 @@
/obj/effect/watcher_orbiter/Initialize(mapload)
. = ..()
if(LAZYLEN(target_faction))
target_faction = string_list(target_faction)
START_PROCESSING(SSobj, src)
// Shuttle rotation fucks with our position, we just want to stick with our guy
@@ -182,7 +184,7 @@
for (var/mob/living/potential_target in oview(5, src))
if (!ismining(potential_target) || potential_target.stat == DEAD)
continue
if (!faction_check(target_faction, potential_target.faction))
if (!potential_target.has_faction(target_faction))
continue
shoot_at(potential_target)
return
@@ -40,7 +40,7 @@
desc = "State of the art machinery for general overwatch purposes."
upperinfo = "Bravo Overwatch Console"
icon_screen = "explosive"
content = list("<B>Operator:</B> Cas Ashpole <BR> <BR> <B><center>Squad Overwatch:</B> Cas Ashpole <BR> <BR> <b>Squad Leader Deployed</b> <BR> <b>Squad Smartgunners:</b> 1 Deployed <BR> <b>Squad Corpsmen:</b> 1 Deployed <BR> <b>Squad Engineers:</b> 2 Deployed <BR> <b>Squad Marines:</b> 4 Deployed <BR> <b>Total:</b> 9 Deployed <BR> <b>Marines Alive:</b> 0 <BR> <BR> <table> <tr> <th>Name</th> <th>Role</th> <th>State</th> <th>Location</th> <th>SL Distance</th> </tr> <tr> <td>Chip Mello</td> <td>Squad Leader</td> <td>Dead</td> <td>Self-Destruct Core Room</td> <td> N/A </td> </tr> <tr> <td>Sophie Knight</td> <td>Squad Smartgunner</td> <td>Dead</td> <td>Self-Destruct Core Room</td> <td>4</td> </tr> <tr> <td>Marie Newman</td> <td>Squad Corpsman</td> <td>Dead</td> <td>Unknown</td> <td> N/A </td> </tr> <tr> <td>Angelo Patton</td> <td>Squad Engineer</td> <td>Dead</td> <td>Sulaco Maintenence</td> <td>19</td> </tr> <tr> <td>Marlon Foster</td> <td>Squad Engineer</td> <td>Dead</td> <td>Sulaco Dropship Hangar</td> <td>28</td> </tr> <tr> <td>Doug Davidson</td> <td>Squad Marine</td> <td>Dead</td> <td>Sulaco Hangar Workshop</td> <td>33</td> </tr> <tr> <td>Courtney Miller</td> <td>Squad Marine</td> <td>Dead</td> <td>Sulaco Hangar Workshop</td> <td>42</td> </tr> <tr> <td>Cesar Jefferson</td> <td>Squad Marine</td> <td>Dead</td> <td>Self-Destruct Core Room</td> <td>14</td> </tr> </table> <BR> <b>Primary Objective:</b> Defend the self-destruct core. <BR> <b>Secondary Objective:</b> Give them hell!</center>")
content = list("<B>Operator:</B> Cas Ashpole <BR> <BR> <B><center>Squad Overwatch:</B> Cas Ashpole <BR> <BR> <b>Squad Leader Deployed</b> <BR> <b>Squad Smartgunners:</b> 1 Deployed <BR> <b>Squad Corpsmen:</b> 1 Deployed <BR> <b>Squad Engineers:</b> 2 Deployed <BR> <b>Squad Marines:</b> 4 Deployed <BR> <b>Total:</b> 9 Deployed <BR> <b>Marines Alive:</b> 0 <BR> <BR> <table> <tr> <th>Name</th> <th>Role</th> <th>State</th> <th>Location</th> <th>SL Distance</th> </tr> <tr> <td>Chip Mello</td> <td>Squad Leader</td> <td>Dead</td> <td>Self-Destruct Core Room</td> <td> N/A </td> </tr> <tr> <td>Sophie Knight</td> <td>Squad Smartgunner</td> <td>Dead</td> <td>Self-Destruct Core Room</td> <td>4</td> </tr> <tr> <td>Marie Newman</td> <td>Squad Corpsman</td> <td>Dead</td> <td>Unknown</td> <td> N/A </td> </tr> <tr> <td>Angelo Patton</td> <td>Squad Engineer</td> <td>Dead</td> <td>Sulaco Maintenance</td> <td>19</td> </tr> <tr> <td>Marlon Foster</td> <td>Squad Engineer</td> <td>Dead</td> <td>Sulaco Dropship Hangar</td> <td>28</td> </tr> <tr> <td>Doug Davidson</td> <td>Squad Marine</td> <td>Dead</td> <td>Sulaco Hangar Workshop</td> <td>33</td> </tr> <tr> <td>Courtney Miller</td> <td>Squad Marine</td> <td>Dead</td> <td>Sulaco Hangar Workshop</td> <td>42</td> </tr> <tr> <td>Cesar Jefferson</td> <td>Squad Marine</td> <td>Dead</td> <td>Self-Destruct Core Room</td> <td>14</td> </tr> </table> <BR> <b>Primary Objective:</b> Defend the self-destruct core. <BR> <b>Secondary Objective:</b> Give them hell!</center>")
/obj/machinery/computer/terminal/sulaco/overwatch/main
name = "main overwatch console"
@@ -78,7 +78,12 @@ GLOBAL_VAR_INIT(fscpassword, generate_password())
/obj/item/disk/surgery/forgottenship
name = "Advanced Surgery Disk"
desc = "A disk that contains advanced surgery procedures, must be loaded into an Operating Console."
surgeries = list(/datum/surgery/advanced/lobotomy, /datum/surgery/advanced/bioware/vein_threading, /datum/surgery/advanced/bioware/nerve_splicing)
surgeries = list(
/datum/surgery_operation/organ/lobotomy,
/datum/surgery_operation/organ/lobotomy/mechanic,
/datum/surgery_operation/limb/bioware/vein_threading,
/datum/surgery_operation/limb/bioware/nerve_splicing,
)
/obj/structure/fluff/empty_sleeper/syndicate/captain
icon_state = "sleeper_s-open"
@@ -11,7 +11,7 @@
/obj/machinery/rnd/server/oldstation/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = ..()
if(held_item && istype(held_item, /obj/item/research_notes))
if(istype(held_item, /obj/item/research_notes))
context[SCREENTIP_CONTEXT_LMB] = "Generate research points"
return CONTEXTUAL_SCREENTIP_SET
@@ -23,16 +23,17 @@
. += span_notice("Insert [EXAMINE_HINT("Research Notes")] to generate points.")
/obj/machinery/rnd/server/oldstation/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/research_notes) && stored_research)
var/obj/item/research_notes/research_notes = attacking_item
/obj/machinery/rnd/server/oldstation/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(istype(tool, /obj/item/research_notes) && stored_research)
var/obj/item/research_notes/research_notes = tool
stored_research.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = research_notes.value))
playsound(src, 'sound/machines/copier.ogg', 50, TRUE)
qdel(research_notes)
return
return ITEM_INTERACT_SUCCESS
return ..()
///Ancient computer that starts with dissection to tell players they have it.
/obj/machinery/computer/operating/oldstation
name = "ancient operating computer"
advanced_surgeries = list(/datum/surgery/advanced/experimental_dissection)
advanced_surgeries = list(/datum/surgery_operation/basic/dissection)
@@ -18,7 +18,7 @@
/obj/item/paper/pamphlet/ruin/originalcontent/pennywise
name = "Painting - 'Pennywise'"
default_raw_text = "<i>This picture depicts a smiling clown. Something doesn't feel right about this..</i>"
default_raw_text = "<i>This picture depicts a smiling clown. Something doesn't feel right about this...</i>"
icon_state = "painting3"
/obj/item/paper/pamphlet/ruin/originalcontent/yelling