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
+3 -6
View File
@@ -35,9 +35,9 @@
/obj/machinery/byteforge/examine(mob/user)
. = ..()
. += span_notice("Make sure this is 4 tiles from the quantum server")
. += span_notice("Must be within 4 tiles of the quantum server.")
. += span_notice("Its maintainance panel can be [EXAMINE_HINT("screwed")] [panel_open ? "close" : "open"].")
. += span_notice("Its maintenance panel can be [EXAMINE_HINT("screwed")] [panel_open ? "close" : "open"].")
if(panel_open)
. += span_notice("It can be [EXAMINE_HINT("pried")] apart.")
@@ -60,10 +60,7 @@
/obj/machinery/byteforge/proc/flash(atom/movable/thing)
playsound(src, 'sound/effects/magic/blink.ogg', 50, TRUE)
var/datum/effect_system/spark_spread/quantum/sparks = new()
sparks.set_up(5, 1, loc)
sparks.start()
do_sparks(5, TRUE, loc, spark_type = /datum/effect_system/basic/spark_spread/quantum)
set_light(l_on = FALSE)
/// Forge begins to process
+1 -1
View File
@@ -1,7 +1,7 @@
/obj/item/bitrunning_debug
name = "bitrunning debug item"
desc = "Adds points and reduces cooldown time for debugging"
icon = 'icons/obj/devices/circuitry_n_data.dmi'
icon = 'icons/obj/devices/floppy_disks.dmi'
base_icon_state = "datadisk"
icon_state = "datadisk0"
+26 -24
View File
@@ -4,16 +4,16 @@
* You can make the custom cheese spells you've always wanted.
* Just make it fun and engaging, it's PvE content.
*/
/obj/item/bitrunning_disk
/obj/item/disk/bitrunning
name = "generic bitrunning program"
desc = "A disk containing source code."
icon = 'icons/obj/devices/circuitry_n_data.dmi'
base_icon_state = "datadisk"
icon_state = "datadisk0"
sticker_icon_state = "o_code"
/// Name of the choice made
var/choice_made
/obj/item/bitrunning_disk/Initialize(mapload)
/obj/item/disk/bitrunning/Initialize(mapload)
. = ..()
icon_state = "[base_icon_state][rand(0, 7)]"
@@ -23,7 +23,10 @@
load_callback = CALLBACK(src, PROC_REF(load_onto_avatar)), \
)
/obj/item/bitrunning_disk/examine(mob/user)
/obj/item/disk/bitrunning/setup_reskins()
return
/obj/item/disk/bitrunning/examine(mob/user)
. = ..()
. += span_infoplain("This disk must be carried on your person into a netpod to be used.")
@@ -35,18 +38,17 @@
. += span_notice("It cannot make another selection.")
/// Handles loading our stuff onto avatars
/obj/item/bitrunning_disk/proc/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
/obj/item/disk/bitrunning/proc/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
return NONE
/obj/item/bitrunning_disk/ability
/obj/item/disk/bitrunning/ability
desc = "A disk containing source code. It can be used to preload abilities into the virtual domain. Duplicate abilities will be ignored."
/// The selected ability that this grants
var/datum/action/granted_action
/// The list of actions that this can grant
var/list/datum/action/selectable_actions = list()
/obj/item/bitrunning_disk/ability/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
/obj/item/disk/bitrunning/ability/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
if(domain_flags & DOMAIN_FORBIDS_ABILITIES)
return BITRUNNER_GEAR_LOAD_BLOCKED
@@ -60,8 +62,8 @@
our_action.Grant(avatar)
return NONE
/obj/item/bitrunning_disk/ability/attack_self(mob/user, modifiers)
. = ..()
/obj/item/disk/bitrunning/ability/attack_self(mob/user, modifiers)
// Not calling parent to not flip the protection tab
if(choice_made)
return
@@ -86,7 +88,7 @@
choice_made = choice
/// Tier 1 programs. Simple, funny, or helpful.
/obj/item/bitrunning_disk/ability/tier1
/obj/item/disk/bitrunning/ability/tier1
name = "bitrunning program: basic"
selectable_actions = list(
/datum/action/cooldown/spell/conjure/cheese,
@@ -94,7 +96,7 @@
)
/// Tier 2 programs. More complex, powerful, or useful.
/obj/item/bitrunning_disk/ability/tier2
/obj/item/disk/bitrunning/ability/tier2
name = "bitrunning program: complex"
selectable_actions = list(
/datum/action/cooldown/spell/pointed/projectile/fireball,
@@ -103,7 +105,7 @@
)
/// Tier 3 abilities. Very powerful, game breaking.
/obj/item/bitrunning_disk/ability/tier3
/obj/item/disk/bitrunning/ability/tier3
name = "bitrunning program: elite"
selectable_actions = list(
/datum/action/cooldown/spell/shapeshift/dragon,
@@ -111,14 +113,14 @@
)
/obj/item/bitrunning_disk/item
/obj/item/disk/bitrunning/item
desc = "A disk containing source code. It can be used to preload items into the virtual domain."
/// The selected item that this grants
var/obj/granted_item
/// The list of actions that this can grant
var/list/obj/selectable_items = list()
/obj/item/bitrunning_disk/item/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
/obj/item/disk/bitrunning/item/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
if(domain_flags & DOMAIN_FORBIDS_ITEMS)
return BITRUNNER_GEAR_LOAD_BLOCKED
@@ -128,7 +130,7 @@
avatar.put_in_hands(new granted_item())
return NONE
/obj/item/bitrunning_disk/item/attack_self(mob/user, modifiers)
/obj/item/disk/bitrunning/item/attack_self(mob/user, modifiers)
. = ..()
if(choice_made)
@@ -151,7 +153,7 @@
choice_made = choice
/// Tier 1 items. Simple, funny, or helpful.
/obj/item/bitrunning_disk/item/tier1
/obj/item/disk/bitrunning/item/tier1
name = "bitrunning gear: simple"
selectable_items = list(
/obj/item/pizzabox/infinite,
@@ -160,7 +162,7 @@
)
/// Tier 2 items. More complex, powerful, or useful.
/obj/item/bitrunning_disk/item/tier2
/obj/item/disk/bitrunning/item/tier2
name = "bitrunning gear: complex"
selectable_items = list(
/obj/item/reagent_containers/hypospray/medipen/survival/luxury,
@@ -169,7 +171,7 @@
)
/// Tier 3 items. Very powerful, game breaking.
/obj/item/bitrunning_disk/item/tier3
/obj/item/disk/bitrunning/item/tier3
name = "bitrunning gear: advanced"
selectable_items = list(
/obj/item/gun/energy/e_gun/nuclear,
@@ -178,7 +180,7 @@
)
///proto-kinetic accelerator mods, to be applied to pka's given inside domains
/obj/item/bitrunning_disk/item/pka_mods
/obj/item/disk/bitrunning/item/pka_mods
name = "bitrunning gear: proto-kinetic accelerator mods"
selectable_items = list(
/obj/item/borg/upgrade/modkit/range,
@@ -188,7 +190,7 @@
/obj/item/borg/upgrade/modkit/human_passthrough,
)
/obj/item/bitrunning_disk/item/pka_mods/premium
/obj/item/disk/bitrunning/item/pka_mods/premium
name = "bitrunning gear: premium proto-kinetic accelerator mods"
selectable_items = list(
/obj/item/borg/upgrade/modkit/cooldown/repeater,
@@ -199,7 +201,7 @@
)
///proto-kinetic crusher trophies, to be applied to pkc's given inside domains
/obj/item/bitrunning_disk/item/pkc_mods
/obj/item/disk/bitrunning/item/pkc_mods
name = "bitrunning gear: proto-kinetic crusher mods"
selectable_items = list(
/obj/item/crusher_trophy/watcher_wing,
@@ -208,7 +210,7 @@
/obj/item/crusher_trophy/wolf_ear,
)
/obj/item/bitrunning_disk/item/pkc_mods/premium
/obj/item/disk/bitrunning/item/pkc_mods/premium
name = "bitrunning gear: premium proto-kinetic crusher mods"
selectable_items = list(
/obj/item/crusher_trophy/watcher_wing/ice_wing,
@@ -220,7 +222,7 @@
/obj/item/crusher_trophy/ice_demon_cube,
)
/obj/item/bitrunning_disk/item/mini_uzi
/obj/item/disk/bitrunning/item/mini_uzi
name = "bitrunning gear: mini-uzi"
selectable_items = list(
/obj/item/gun/ballistic/automatic/mini_uzi,
@@ -2,23 +2,23 @@
/**
* Bitrunning tech disks which let you load full loadouts into the vdom on first avatar generation.
*/
/obj/item/bitrunning_disk/gimmick
/obj/item/disk/bitrunning/gimmick
desc = "A disk containing source code. It can be used to preload gimmick loadouts into the virtual domain."
/// The selected loadout that this grants
var/datum/bitrunning_gimmick/granted_loadout
/// The list of loadouts that this can grant
var/list/datum/bitrunning_gimmick/selectable_loadouts
/obj/item/bitrunning_disk/gimmick/Destroy()
/obj/item/disk/bitrunning/gimmick/Destroy()
QDEL_NULL(granted_loadout)
return ..()
/obj/item/bitrunning_disk/gimmick/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
/obj/item/disk/bitrunning/gimmick/load_onto_avatar(mob/living/carbon/human/neo, mob/living/carbon/human/avatar, domain_flags)
if(isnull(granted_loadout))
return BITRUNNER_GEAR_LOAD_FAILED
return granted_loadout.grant_loadout(neo, avatar, domain_flags)
/obj/item/bitrunning_disk/gimmick/attack_self(mob/user, modifiers)
/obj/item/disk/bitrunning/gimmick/attack_self(mob/user, modifiers)
. = ..()
if(granted_loadout)
@@ -3,7 +3,7 @@
* Bitrunning gimmick loadouts themed around dungeon crawling.
* Mostly for fun, have niche but not insignificant advantages.
*/
/obj/item/bitrunning_disk/gimmick/dungeon
/obj/item/disk/bitrunning/gimmick/dungeon
name = "bitrunning gimmick: dungeon crawling"
selectable_loadouts = list(
/datum/bitrunning_gimmick/alchemist,
@@ -30,8 +30,9 @@
name = "unlabeled bottle"
desc = "A small bottle. You don't remember what you put in it."
/obj/item/reagent_containers/cup/bottle/alchemist_basic/add_initial_reagents()
/// List of possible reagents we may pick from
var/static/list/possible_reagents = list(
var/list/possible_reagents = list(
/datum/reagent/aluminium, // Basic chems
/datum/reagent/bromine,
/datum/reagent/carbon,
@@ -63,7 +64,6 @@
/datum/reagent/consumable/coffee,
)
/obj/item/reagent_containers/cup/bottle/alchemist_basic/add_initial_reagents()
var/our_reagent = pick(possible_reagents)
reagents.add_reagent(our_reagent, 50)
@@ -3,7 +3,7 @@
* Bitrunning gimmick loadouts themed around sports.
* Mostly for fun, have niche or little advantages.
*/
/obj/item/bitrunning_disk/gimmick/sports
/obj/item/disk/bitrunning/gimmick/sports
name = "bitrunning gimmick: sports"
selectable_loadouts = list(
/datum/bitrunning_gimmick/boxer,
@@ -76,13 +76,13 @@
switch(action)
if("random_domain")
server.cold_boot_map(server.get_random_domain_id())
server.cold_boot_map(server.get_random_domain_id(), was_random_selection = TRUE)
return TRUE
if("refresh")
ui.send_full_update()
return TRUE
if("set_domain")
server.cold_boot_map(params["id"])
server.cold_boot_map(params["id"], was_random_selection = FALSE)
return TRUE
if("stop_domain")
server.begin_shutdown(usr)