Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
41ee1ae
return: Goliath Mother - boom death
KOCMODECAHTHUK Dec 20, 2025
88d2a6f
Revert "fix: Отображение в лобби музыки теперь работает правильно"
KOCMODECAHTHUK Dec 21, 2025
8999a4f
Fix "firebreath fix"
KOCMODECAHTHUK Dec 22, 2025
71b83e9
fix: voucher gives Plasma-Gun
KOCMODECAHTHUK Dec 24, 2025
65fbb6e
HOT-FIX: revert SEC-HUD 516 support
KOCMODECAHTHUK Dec 24, 2025
d490599
fix: SKM INTEQ RESKIN
KOCMODECAHTHUK Dec 24, 2025
3f87f27
fix: sec hailer
KOCMODECAHTHUK Dec 24, 2025
ea438f3
fix: plasma weapons no longer a drop from legion
KOCMODECAHTHUK Dec 25, 2025
e86340b
fix: Фиксы химии
KOCMODECAHTHUK Dec 25, 2025
58d33e4
add: Borsh traditional
KOCMODECAHTHUK Jan 10, 2026
aa792db
tweak: fix simple spawn-drill
KOCMODECAHTHUK Jan 11, 2026
c07eddb
fix: Stim-packs
KOCMODECAHTHUK Jan 18, 2026
9de83d4
23
KOCMODECAHTHUK Jan 30, 2026
bc765db
fix: Ghost float fix
KOCMODECAHTHUK Feb 10, 2026
f952ae6
Fix: Volumetic Storage
KOCMODECAHTHUK Feb 10, 2026
f24d899
fix: Corrects random posters
KOCMODECAHTHUK Feb 10, 2026
d206ce9
Self-dir attack
KOCMODECAHTHUK Feb 10, 2026
6413162
civtasda
KOCMODECAHTHUK Feb 11, 2026
80fb9a6
FIX: REMOVED NULL SPACE MY GUN - CTF CM-82
KOCMODECAHTHUK Feb 15, 2026
b15f291
add: Тележка на колесиках больше не замедляют
KOCMODECAHTHUK Feb 19, 2026
9f612ca
Revert "add: Тележка на колесиках больше не замедляют"
KOCMODECAHTHUK Feb 23, 2026
d239b23
Revert "return: Goliath Mother - boom death"
KOCMODECAHTHUK Feb 23, 2026
7403cb8
Revert "fix: Ghost float fix"
KOCMODECAHTHUK Feb 23, 2026
d1fdcd0
experemental: Subsystem upgrades
KOCMODECAHTHUK Feb 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions code/__DEFINES/atom_hud.dm
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@

//data HUD (medhud, sechud) defines
//Don't forget to update human/New() if you change these!
// [CELADON-EDIT-FIX] - ФИКС СЕК-ХАДОВ ВРЕМЕННЫЙ
/*
#define DATA_HUD_SECURITY_BASIC "sec_basic"
#define DATA_HUD_SECURITY_ADVANCED "sec_adv"
#define DATA_HUD_MEDICAL_BASIC "med_basic"
Expand All @@ -78,7 +80,35 @@
#define ANTAG_HUD_FUGITIVE "fugitive"
#define ANTAG_HUD_GANGSTER "gangster"
#define ANTAG_HUD_SPACECOP "spacecop"
*/
//data HUD (medhud, sechud) defines
//Don't forget to update human/New() if you change these!
#define DATA_HUD_SECURITY_BASIC 1
#define DATA_HUD_SECURITY_ADVANCED 2
#define DATA_HUD_MEDICAL_BASIC 3
#define DATA_HUD_MEDICAL_ADVANCED 4
#define DATA_HUD_DIAGNOSTIC_BASIC 5
#define DATA_HUD_DIAGNOSTIC_ADVANCED 6
#define DATA_HUD_ABDUCTOR 7
#define DATA_HUD_SENTIENT_DISEASE 8
#define DATA_HUD_AI_DETECT 9
#define DATA_HUD_FAN 10

//antag HUD defines
#define ANTAG_HUD_REV 11
#define ANTAG_HUD_OPS 12
#define ANTAG_HUD_WIZ 13
#define ANTAG_HUD_SHADOW 14
#define ANTAG_HUD_TRAITOR 15
#define ANTAG_HUD_NINJA 16
#define ANTAG_HUD_CHANGELING 17
#define ANTAG_HUD_ABDUCTOR 18
#define ANTAG_HUD_BROTHER 19
#define ANTAG_HUD_OBSESSED 20
#define ANTAG_HUD_FUGITIVE 21
#define ANTAG_HUD_GANGSTER 22
#define ANTAG_HUD_SPACECOP 23
// [/CELADON-EDIT-FIX]

// Notification action types
#define NOTIFY_JUMP "jump"
Expand Down
2 changes: 1 addition & 1 deletion code/__DEFINES/qdel.dm
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@

// Defines for the time an item has to get its reference cleaned before it fails the queue and moves to the next.
#define GC_FILTER_QUEUE 1 SECONDS
#define GC_CHECK_QUEUE 5 MINUTES
#define GC_CHECK_QUEUE 30 SECONDS // Reduced from 5 MINUTES for long-running rounds
#define GC_DEL_QUEUE 10 SECONDS


Expand Down
2 changes: 1 addition & 1 deletion code/__DEFINES/subsystems.dm
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@
#define FIRE_PRIORITY_VIS 10
#define FIRE_PRIORITY_AMBIENCE 10
#define FIRE_PRIORITY_MISSIONS 10
#define FIRE_PRIORITY_GARBAGE 15
#define FIRE_PRIORITY_GARBAGE 10 // Increased from 15 for better performance in long rounds
#define FIRE_PRIORITY_WET_FLOORS 20
#define FIRE_PRIORITY_AIR 20
#define FIRE_PRIORITY_NPC 20
Expand Down
2 changes: 1 addition & 1 deletion code/controllers/subsystem/garbage.dm
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ By using these methods of finding references, you can make your life far, far ea
SUBSYSTEM_DEF(garbage)
name = "Garbage"
priority = FIRE_PRIORITY_GARBAGE
wait = 2 SECONDS
wait = 1 SECONDS // Increased frequency from 2 SECONDS for better throughput
flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
init_order = INIT_ORDER_GARBAGE
Expand Down
21 changes: 15 additions & 6 deletions code/controllers/subsystem/idlenpcpool.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ SUBSYSTEM_DEF(idlenpcpool)
name = "Idling NPC Pool"
flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT
priority = FIRE_PRIORITY_IDLE_NPC
wait = 60
wait = 30 // Reduced from 60 to check more frequently for player presence
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME

var/list/currentrun = list()
Expand All @@ -23,7 +23,9 @@ SUBSYSTEM_DEF(idlenpcpool)

if (!resumed)
var/list/idlelist = GLOB.simple_animals[AI_IDLE]
src.currentrun = idlelist.Copy()
var/list/zlist = GLOB.simple_animals[AI_Z_OFF]
// Process both idle and z-off mobs
src.currentrun = idlelist.Copy() + zlist.Copy()

//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
Expand All @@ -33,12 +35,19 @@ SUBSYSTEM_DEF(idlenpcpool)
--currentrun.len
if (!SA)
GLOB.simple_animals[AI_IDLE] -= SA
GLOB.simple_animals[AI_Z_OFF] -= SA
continue

if(!SA.ckey)
if(SA.stat != DEAD)
SA.handle_automated_movement()
if(SA.stat != DEAD)
SA.check_should_sleep()
// For AI_Z_OFF mobs, only check if they should wake up, don't move them
if(SA.AIStatus == AI_Z_OFF)
if(SA.stat != DEAD)
SA.check_should_sleep()
else
// For AI_IDLE mobs, do normal processing
if(SA.stat != DEAD)
SA.handle_automated_movement()
if(SA.stat != DEAD)
SA.check_should_sleep()
if (MC_TICK_CHECK)
return
34 changes: 32 additions & 2 deletions code/controllers/subsystem/machines.dm
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ SUBSYSTEM_DEF(machines)
var/list/processing = list()
var/list/currentrun = list()
var/list/powernets = list()
/// Track how many machines we skipped due to empty virtual z-levels
var/skipped_machines = 0

/datum/controller/subsystem/machines/Initialize()
makepowernets()
Expand All @@ -31,7 +33,7 @@ SUBSYSTEM_DEF(machines)
propagate_network(PC,PC.powernet)

/datum/controller/subsystem/machines/stat_entry(msg)
msg = "M:[length(processing)]|PN:[length(powernets)]"
msg = "M:[length(processing)]|PN:[length(powernets)]|S:[skipped_machines]"
return ..()


Expand All @@ -40,17 +42,45 @@ SUBSYSTEM_DEF(machines)
for(var/datum/powernet/Powernet in powernets)
Powernet.reset() //reset the power state.
src.currentrun = processing.Copy()
skipped_machines = 0

//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun

while(currentrun.len)
var/obj/machinery/thing = currentrun[currentrun.len]
currentrun.len--
if(QDELETED(thing) || thing.process(wait * 0.1) == PROCESS_KILL)

if(QDELETED(thing))
processing -= thing
if (MC_TICK_CHECK)
return
continue

// Skip machines on virtual z-levels with no players present
// Exceptions:
// 1. Critical machines (SM, PA, telecomms) always process
// 2. Machines in outpost areas always process (player hubs)
// 3. Machines in ship areas always process (player-owned vessels)
if(!thing.critical_machine)
var/area/machine_area = get_area(thing)
// Check if it's an outpost or ship area - these always process
if(!istype(machine_area, /area/outpost) && !istype(machine_area, /area/ship))
var/thing_vz = thing.virtual_z()
if(thing_vz)
var/players_on_vz = LAZYACCESS(SSmobs.players_by_virtual_z, "[thing_vz]")
if(!length(players_on_vz))
skipped_machines++
if (MC_TICK_CHECK)
return
continue

// Process the machine
if(thing.process(wait * 0.1) == PROCESS_KILL)
processing -= thing
if (!QDELETED(thing))
thing.datum_flags &= ~DF_ISPROCESSING

if (MC_TICK_CHECK)
return

Expand Down
4 changes: 4 additions & 0 deletions code/controllers/subsystem/npcpool.dm
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ SUBSYSTEM_DEF(npcpool)
if(QDELETED(SA))
continue

// Skip AI_Z_OFF mobs - they're on virtual z-levels with no players
if(SA.AIStatus == AI_Z_OFF)
continue

if(!SA.ckey && !SA.notransform)
if(SA.stat != DEAD)
SA.handle_automated_movement()
Expand Down
10 changes: 3 additions & 7 deletions code/controllers/subsystem/ticker.dm
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ SUBSYSTEM_DEF(ticker)
if(L[1] == "exclude")
continue
music += S
login_music_name = S

var/old_login_music = trim(file2text("data/last_round_lobby_music.txt"))
if(music.len > 1)
Expand All @@ -110,14 +111,9 @@ SUBSYSTEM_DEF(ticker)
if(!length(music))
music = world.file2list(ROUND_START_MUSIC_LIST, "\n")
login_music = pick(music)
login_music_name = login_music // [CELADON-ADD] - MUSIC_CELADON
else
// [CELADON-EDIT] - MUSIC_CELADON
// login_music = "[global.config.directory]/title_music/sounds/[pick(music)]" // ORIGINAL
var/selected_track = pick(music)
login_music = "[global.config.directory]/title_music/sounds/[selected_track]"
login_music_name = selected_track
// [/CELADON-EDIT]
login_music = "[global.config.directory]/title_music/sounds/[pick(music)]"


if(!GLOB.syndicate_code_phrase)
GLOB.syndicate_code_phrase = generate_code_phrase(return_list=TRUE)
Expand Down
4 changes: 2 additions & 2 deletions code/datums/components/storage/ui.dm
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,8 @@
I = i
var/percent = percentage_by_item[I]
var/atom/movable/screen/storage/volumetric_box/center/B = new /atom/movable/screen/storage/volumetric_box/center(null, src, I)
// SNOWFLAKE: force it to icon until we unfuck storage/click passing
I.mouse_opacity = MOUSE_OPACITY_ICON
// Make items non-clickable so clicks pass through to the box, preventing overlapping sprites from causing misclicks // [CELADON-EDIT] - VOLAMETRIC-STORAGE
I.mouse_opacity = MOUSE_OPACITY_TRANSPARENT // [/CELADON-EDIT]
var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(using_horizontal_pixels * percent, MINIMUM_PIXELS_PER_ITEM)
var/addrow = FALSE
if(CEILING(pixels_to_use, 1) >= FLOOR(horizontal_pixels - current_pixel - VOLUMETRIC_STORAGE_EDGE_PADDING, 1))
Expand Down
2 changes: 2 additions & 0 deletions code/datums/diseases/asthma_attack.dm
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/*
/datum/disease/asthma_attack
form = "Bronchitis"
name = "Asthma attack"
Expand Down Expand Up @@ -250,3 +251,4 @@
return
to_chat(affected_mob, span_warning("You briefly choke on the mucus piling in your throat!"))
affected_mob.losebreath++
*/
4 changes: 3 additions & 1 deletion code/datums/elements/directional_attack.dm
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,14 @@
if(QDELETED(clicked_atom))
return FALSE

var/turf/turf_to_check = get_step(source, angle_to_dir(Get_Angle(source, clicked_atom)))
var/turf/turf_to_check = get_step(source, angle_to_dir(Get_Angle(source,parse_caught_click_modifiers(modifiers, get_turf(source), source?.client))))
if(!turf_to_check || !source.Adjacent(turf_to_check))
return FALSE

var/mob/living/target_mob
for(target_mob in turf_to_check)
if(target_mob == source)
continue
if(!target_mob || target_mob.stat == DEAD)
continue
return target_mob
2 changes: 2 additions & 0 deletions code/datums/status_effects/debuffs/lung_inflammation.dm
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/*
/datum/status_effect/lung_inflammation
id = "lung_inflammation"
tick_interval = 2 SECONDS
Expand Down Expand Up @@ -140,3 +141,4 @@
var/obj/item/organ/lungs/holder_lungs = owner.getorganslot(ORGAN_SLOT_LUNGS)
holder_lungs?.set_received_pressure_mult(holder_lungs::received_pressure_mult)
qdel(src)
*/
2 changes: 2 additions & 0 deletions code/datums/traits/negative/asthma.dm
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/*
/datum/quirk/asthma
name = "Asthma"
desc = "You suffer from asthma, a inflammatory disorder that causes your airpipe to squeeze shut! Be careful around smoke and irritating gases!"
Expand Down Expand Up @@ -136,3 +137,4 @@
current_attack = null

COOLDOWN_START(src, next_attack_cooldown, rand(min_time_between_attacks, max_time_between_attacks))
*/
2 changes: 0 additions & 2 deletions code/game/machinery/aug_manipulator.dm
Original file line number Diff line number Diff line change
Expand Up @@ -140,10 +140,8 @@
storedpart.static_icon = style_options[augstyle]
if(augstyle == "digitigrade")
storedpart.bodytype |= BODYTYPE_DIGITIGRADE
storedpart.limb_id = "digitigrade"
else
storedpart.bodytype &= ~(BODYTYPE_DIGITIGRADE)
storedpart.limb_id = "robotic"
// [/CELADON-EDIT]
storedpart.should_draw_greyscale = FALSE //Premptive fuck you to greyscale IPCs trying to break something
storedpart.update_icon_dropped()
Expand Down
1 change: 1 addition & 0 deletions code/game/objects/effects/contraband.dm
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@

name = initial(selected.name)
desc = initial(selected.desc)
icon = initial(selected.icon)
icon_state = initial(selected.icon_state)
poster_item_name = initial(selected.poster_item_name)
poster_item_desc = initial(selected.poster_item_desc)
Expand Down
49 changes: 49 additions & 0 deletions code/game/objects/items/crayons.dm
Original file line number Diff line number Diff line change
Expand Up @@ -646,6 +646,10 @@
if(check_empty(user))
return

if(isbodypart(target))
if(color_limb(target, user))
return

if(istype(target, /obj/structure/railing/modern))
playsound(user.loc, 'sound/effects/spray.ogg', 25, TRUE, 5)
return
Expand Down Expand Up @@ -712,6 +716,51 @@
spray_overlay.color = paint_color
. += spray_overlay

/obj/item/toy/crayon/spraycan/proc/color_limb(obj/item/bodypart/limb, mob/living/user)
if(!IS_ROBOTIC_LIMB(limb))
return FALSE

var/static/list/type_whitelist = list(/obj/item/bodypart/head/robot, /obj/item/bodypart/r_arm/robot, /obj/item/bodypart/l_arm/robot, /obj/item/bodypart/chest/robot, /obj/item/bodypart/leg/right/robot, /obj/item/bodypart/leg/left/robot)
if(!(limb.type in type_whitelist)) //Kepori won't break my system damn it
to_chat(user, span_warning("The machine doesn't accept that type of prosthetic!"))
return

var/list/skins = list()
var/static/list/style_list_icons = list(
"standard" = 'icons/mob/augmentation/augments.dmi',
"engineer" = 'icons/mob/augmentation/augments_engineer.dmi',
"security" = 'icons/mob/augmentation/augments_security.dmi',
"mining" = 'icons/mob/augmentation/augments_mining.dmi',
"bishop" = 'mod_celadon/_storage_icons/icons/mobs/augmentation/augments_bishop.dmi',
"shellguard" = 'mod_celadon/_storage_icons/icons/mobs/augmentation/augments_shellguard.dmi',
"wardtakahashi" = 'mod_celadon/_storage_icons/icons/mobs/augmentation/augments_wardtakahashi.dmi',
"xion" = 'mod_celadon/_storage_icons/icons/mobs/augmentation/augments_xion.dmi',
"zenghu" = 'mod_celadon/_storage_icons/icons/mobs/augmentation/augments_zenghu.dmi',
)
var/static/list/digitigrade_style_list = list(
"digitigrade" = 'mod_celadon/_storage_icons/icons/mobs/augmentation/digitigrade_legs.dmi',
"lizard" = 'icons/mob/augmentation/augments_lizard.dmi',
)
var/static/list/style_options_list = style_list_icons + digitigrade_style_list


for(var/skin_option in style_options_list)
var/image/part_image = image(icon = style_options_list[skin_option], icon_state = "[limb.limb_id]_[limb.body_zone]")
if(limb.aux_zone) //Hands
part_image.overlays += image(icon = style_options_list[skin_option], icon_state = "[limb.limb_id]_[limb.aux_zone]")
skins += list("[skin_option]" = part_image)
var/choice = show_radial_menu(user, src, skins, require_near = TRUE)
if(choice && (use_charges(user, 5, requires_full = FALSE)))
playsound(user.loc, 'sound/effects/spray.ogg', 5, TRUE, 5)
limb.static_icon = style_options_list[choice]
if(choice in digitigrade_style_list)
limb.bodytype |= BODYTYPE_DIGITIGRADE
else
limb.bodytype &= ~(BODYTYPE_DIGITIGRADE)
limb.should_draw_greyscale = TRUE //Premptive fuck you to greyscale IPCs trying to break something
limb.update_icon_dropped()
return TRUE

/obj/item/toy/crayon/spraycan/borg
name = "cyborg spraycan"
desc = "A metallic container containing shiny synthesised paint."
Expand Down
15 changes: 15 additions & 0 deletions code/game/objects/items/food/soup.dm
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,21 @@
tastes = list("beet" = 1)
foodtypes = VEGETABLES

// [CELADON-ADD]
/obj/item/food/soup/traditionalredbeet
name = "tradition red beet soup"
desc = "A simplified form of borscht soup, notably lacking the meat broth."
icon = 'mod_celadon/_storage_icons/icons/items/misc/redbeetsoup.dmi'
icon_state = "redbeetsoup"
food_reagents = list(
/datum/reagent/consumable/nutriment = 18,
/datum/reagent/water = 5,
/datum/reagent/consumable/nutriment/vitamin = 6
)
tastes = list("nettles" = 1)
foodtypes = GRAIN | MEAT | VEGETABLES
// [/CELADON-ADD]

/obj/item/food/soup/onion
name = "french onion soup"
desc = "A soup consisting of fried onions that are cooked in a meat stock, then gratineed with bread and cheese at the top."
Expand Down
4 changes: 2 additions & 2 deletions code/modules/awaymissions/capture_the_flag.dm
Original file line number Diff line number Diff line change
Expand Up @@ -468,11 +468,11 @@
/obj/item/gun/ballistic/automatic/assault/cm82/ctf
desc = "CLIP's standard assault rifle, a relatively new service weapon. This rifle will disintegrate if dropped."

/obj/item/gun/ballistic/automatic/assault/cm82/dropped()
/obj/item/gun/ballistic/automatic/assault/cm82/ctf/dropped()
. = ..()
addtimer(CALLBACK(src, PROC_REF(floor_vanish)), 30)

/obj/item/gun/ballistic/automatic/assault/cm82/proc/floor_vanish()
/obj/item/gun/ballistic/automatic/assault/cm82/ctf/proc/floor_vanish()
if(isturf(loc))
qdel(src)

Expand Down
Loading