This commit is contained in:
Katherine Kiefer
2022-04-17 08:23:46 +10:00
55 changed files with 4432 additions and 3585 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,7 @@
//config files
#define CONFIG_GET(X) global.config.Get(/datum/config_entry/##X)
#define CONFIG_SET(X, Y) global.config.Set(/datum/config_entry/##X, ##Y)
#define CONFIG_LOADED global.config.load_complete
#define CONFIG_MAPS_FILE "maps.txt"

View File

@@ -58,12 +58,12 @@
//If you update these values, update the message in the #error
#define MAX_BYOND_MAJOR 514
#define MAX_BYOND_MINOR 1583
#define MAX_BYOND_MINOR 1569
///Uncomment to bypass the max version check. Note: This will likely break the game, only use if you know what you're doing
//#define IGNORE_MAX_BYOND_VERSION
#if ((DM_VERSION > MAX_BYOND_MAJOR) || (DM_BUILD > MAX_BYOND_MINOR)) && !defined(IGNORE_MAX_BYOND_VERSION)
#error Your version of BYOND is too new to compile this project. Download version 514.1583 at www.byond.com/download/build/514/514.1583_byond.exe
#error Your version of BYOND is too new to compile this project. Download version 514.1569 at www.byond.com/download/build/514/514.1569_byond.exe
#endif
#ifdef TRAVISBUILDING

View File

@@ -21,6 +21,8 @@
var/motd
var/policy
var/load_complete = FALSE
/datum/controller/configuration/proc/admin_reload()
if(IsAdminAdvancedProcCall())
return
@@ -50,6 +52,8 @@
LoadMOTD()
LoadPolicy()
load_complete = TRUE
if (Master)
Master.OnConfigLoad()

View File

@@ -184,6 +184,11 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
// Sort subsystems by init_order, so they initialize in the correct order.
sortTim(subsystems, /proc/cmp_subsystem_init)
//yogs -- loading progress stuff; have to initialize this static
for(var/s in subsystems)
var/datum/controller/subsystem/SS = s
SS.total_loading_points += SS.loading_points
//yogs end
var/start_timeofday = REALTIMEOFDAY
// Initialize subsystems.

View File

@@ -35,6 +35,12 @@
var/static/list/failure_strikes //How many times we suspect a subsystem type has crashed the MC, 3 strikes and you're out!
//yogs start -- loading time stuff
var/static/total_loading_points_progress = 0 //! How much progress we've made in loading all the subsystems so far.
var/static/total_loading_points = 0 //! The total amount of loading points among all subsystems. Should be defined by MC before subsystem inits.
var/loading_points = 0 //! The amount of loading points this subsystem has, measured in deciseconds of approximate load time. This being 0 is fine.
//yogs end
//Do not override
///datum/controller/subsystem/New()
@@ -159,15 +165,24 @@
/// Called after the config has been loaded or reloaded.
/datum/controller/subsystem/proc/OnConfigLoad()
//used to initialize the subsystem AFTER the map has loaded
///used to initialize the subsystem AFTER the map has loaded
///This should be called by the derived subsystem class AFTER it has done its own initialization.
/datum/controller/subsystem/Initialize(start_timeofday)
initialized = TRUE
SEND_SIGNAL(src, COMSIG_SUBSYSTEM_POST_INITIALIZE, start_timeofday)
var/time = (REALTIMEOFDAY - start_timeofday) / 10
var/msg = "Initialized [name] subsystem within [time] second[time == 1 ? "" : "s"]!"
to_chat(world, span_boldannounce("[msg]"))
var/time = (REALTIMEOFDAY - start_timeofday)/10
var/msg = "Initialized [name] subsystem within [time] second[time == 1 ? "" : "s"]!" // Yogs -- quieter subsystem initialization
to_chat(GLOB.admins,
type = MESSAGE_TYPE_DEBUG,
html = span_notice(msg),
confidential = FALSE)
log_world(msg)
return time
if(!loading_points) // We're probably one of those crappy subsystems that take 0 seconds, so return
return time
total_loading_points_progress += loading_points
var/percent = round(total_loading_points_progress / total_loading_points * 100)
to_chat(world,span_boldnotice("Subsystem initialization at [percent]%..."))
return time // Yogs end
/datum/controller/subsystem/stat_entry(msg)

View File

@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(air)
wait = 0.5 SECONDS
flags = SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
loading_points = 4.2 SECONDS // Yogs -- loading times
var/cost_turfs = 0
var/cost_groups = 0

View File

@@ -2,6 +2,9 @@ SUBSYSTEM_DEF(assets)
name = "Assets"
init_order = INIT_ORDER_ASSETS
flags = SS_NO_FIRE
loading_points = 3 SECONDS // Yogs -- loading times
var/list/cache = list()
var/list/preload = list()
var/datum/asset_transport/transport = new()

View File

@@ -7,6 +7,7 @@ SUBSYSTEM_DEF(atoms)
name = "Atoms"
init_order = INIT_ORDER_ATOMS
flags = SS_NO_FIRE
loading_points = 30 SECONDS // Yogs -- smarter loading times
var/old_initialized

View File

@@ -5,6 +5,8 @@ SUBSYSTEM_DEF(demo)
init_order = INIT_ORDER_DEMO
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
loading_points = 12.6 SECONDS // Yogs -- loading times
var/list/pre_init_lines = list() // stuff like chat before the init
var/list/icon_cache = list()
var/list/icon_state_caches = list()

View File

@@ -5,6 +5,8 @@ SUBSYSTEM_DEF(icon_smooth)
priority = FIRE_PRIOTITY_SMOOTHING
flags = SS_TICKER
loading_points = 3.3 SECONDS // Yogs -- loading times
var/list/smooth_queue = list()
var/list/deferred = list()

View File

@@ -8,6 +8,8 @@ SUBSYSTEM_DEF(lighting)
init_order = INIT_ORDER_LIGHTING
flags = SS_TICKER
loading_points = 6 SECONDS // Yogs -- loading times
/datum/controller/subsystem/lighting/stat_entry(msg)
msg = "L:[GLOB.lighting_update_lights.len]|C:[GLOB.lighting_update_corners.len]|O:[GLOB.lighting_update_objects.len]"
return ..()

View File

@@ -3,6 +3,8 @@ SUBSYSTEM_DEF(mapping)
init_order = INIT_ORDER_MAPPING
flags = SS_NO_FIRE
loading_points = 11 SECONDS // Yogs -- loading times
var/list/nuke_tiles = list()
var/list/nuke_threats = list()

View File

@@ -5,6 +5,8 @@ SUBSYSTEM_DEF(overlays)
priority = FIRE_PRIORITY_OVERLAYS
init_order = INIT_ORDER_OVERLAY
loading_points = 2.3 SECONDS // Yogs -- loading times
var/list/queue
var/list/stats
var/list/overlay_icon_state_caches

View File

@@ -6,6 +6,8 @@ SUBSYSTEM_DEF(shuttle)
init_order = INIT_ORDER_SHUTTLE
flags = SS_KEEP_TIMING|SS_NO_TICK_CHECK
loading_points = 4.9 SECONDS // Yogs -- loading times
var/list/mobile = list()
var/list/stationary = list()
var/list/beacons = list()

View File

@@ -184,6 +184,24 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/greatruinousknife
name = "Great Ruinous Knife"
result = /obj/item/kitchen/knife/ritual/holy/strong
reqs = list(/obj/item/kitchen/knife/ritual/holy = 1,
/obj/item/stack/sheet/ruinous_metal = 1)
time = 4 SECONDS
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/bloodyruinousknife
name = "Blood Soaked Ruinous Knife"
result = /obj/item/kitchen/knife/ritual/holy/strong/blood
reqs = list(/obj/item/kitchen/knife/ritual/holy/strong = 1,
/obj/item/stack/sheet/runed_metal = 1)
time = 4 SECONDS
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/ed209
name = "ED209"
result = /mob/living/simple_animal/bot/ed209

View File

@@ -85,7 +85,7 @@
add_fibers(H)
if(H.gloves) //Check if the gloves (if any) hide fingerprints
var/obj/item/clothing/gloves/G = H.gloves
if(G.transfer_prints)
if(istype(G) && G.transfer_prints)
ignoregloves = TRUE
if(!ignoregloves)
H.gloves.add_fingerprint(H, TRUE) //ignoregloves = 1 to avoid infinite loop.

View File

@@ -541,6 +541,8 @@
return FALSE
if(ismecha(M.loc)) // stops inventory actions in a mech
return FALSE
if(ismouse(M) && (locate(/obj/structure/table) in get_turf(parent))) // Prevents mice using storages on tables
return FALSE
// this must come before the screen objects only block, dunno why it wasn't before
if(over_object == M)
user_show_to_mob(M)

View File

@@ -313,7 +313,6 @@
of the area exists in any records. After all, it's not like \
some doofus with an EVA suit and jetpack can just waltz around \
in space and find it..."
unpickable = TRUE
/datum/map_template/ruin/space/spacebar
id = "spacebar"

View File

@@ -223,8 +223,8 @@
.["host"] = world.host ? world.host : null
.["round_id"] = GLOB.round_id
.["players"] = GLOB.clients.len
.["revision"] = GLOB.revdata.commit
.["revision_date"] = GLOB.revdata.date
.["revision"] = GLOB.revdata?.commit
.["revision_date"] = GLOB.revdata?.date
var/list/adm = get_admin_counts()
var/list/presentmins = adm["present"]

View File

@@ -45,6 +45,8 @@ Credit where due:
///////////
/proc/is_servant_of_ratvar(mob/M)
if(!istype(M))
return FALSE
return M?.mind?.has_antag_datum(/datum/antagonist/clockcult)
/proc/is_eligible_servant(mob/M)

View File

@@ -26,9 +26,9 @@
light_color = LIGHT_COLOR_BLUE
/obj/machinery/computer/cloning/Initialize()
/obj/machinery/computer/cloning/Initialize(mapload)
. = ..()
updatemodules(TRUE)
updatemodules(TRUE,mapload)
/obj/machinery/computer/cloning/Destroy()
if(pods)
@@ -89,10 +89,10 @@
records -= R
/obj/machinery/computer/cloning/proc/updatemodules(findfirstcloner)
/obj/machinery/computer/cloning/proc/updatemodules(findfirstcloner,mapload)
scanner = findscanner()
if(findfirstcloner && !LAZYLEN(pods))
findcloner()
findcloner(mapload)
if(!autoprocess)
STOP_PROCESSING(SSmachines, src)
else
@@ -114,14 +114,18 @@
// If no scanner was found, it will return null
return null
/obj/machinery/computer/cloning/proc/findcloner()
/obj/machinery/computer/cloning/proc/findcloner(extended_search = FALSE) //extened_search is for things like box where the console is multiple tiles away from the actual pod
var/obj/machinery/clonepod/podf = null
for(var/direction in GLOB.cardinals)
podf = locate(/obj/machinery/clonepod, get_step(src, direction))
if (!isnull(podf) && podf.is_operational())
AttachCloner(podf)
if(extended_search)
for(var/obj/machinery/clonepod/pod in view(3,src))
if(!isnull(pod) && pod.is_operational())
AttachCloner(pod)
else
for(var/direction in GLOB.cardinals)
podf = locate(/obj/machinery/clonepod, get_step(src, direction))
if (!isnull(podf) && podf.is_operational())
AttachCloner(podf)
/obj/machinery/computer/cloning/proc/AttachCloner(obj/machinery/clonepod/pod)
if(!pod.connected)

View File

@@ -714,7 +714,7 @@
H.sec_hud_set_security_status()
if("rank")
var/list/allowed_ranks = list("Head of Personnel", "Captain", "AI", "Central Command")
var/list/allowed_ranks = list("Head of Personnel", "Captain", "AI", "Central Command Officer")
var/changed_rank = null
if((istype(active_general_record, /datum/data/record) && allowed_ranks.Find(rank)))
changed_rank = input("Select a rank", "Rank Selection") as null|anything in get_all_jobs()

View File

@@ -27,6 +27,16 @@
M.Paralyze(200)
M.soundbang_act(1, 20, 10, 15)
return
if(iscyborg(M))
var/mob/living/silicon/robot/C = M
if(C.sensor_protection) //Do other annoying stuff that isnt a hard stun if they're protected
C.overlay_fullscreen("reducedbang", /obj/screen/fullscreen/flash/static)
C.uneq_all()
C.stop_pulling()
C.break_all_cyborg_slots(TRUE)
addtimer(CALLBACK(C, /mob/living/silicon/robot/.proc/clear_fullscreen, "reducedbang"), 3 SECONDS)
addtimer(CALLBACK(C, /mob/living/silicon/robot/.proc/repair_all_cyborg_slots), 3 SECONDS)
return
var/flashed = M.flash_act(affect_silicon = 1)
var/banged = M.soundbang_act(1, 20/max(1,distance), rand(0, 5))

View File

@@ -128,9 +128,22 @@
w_class = WEIGHT_CLASS_NORMAL
/obj/item/kitchen/knife/ritual/holy
name = "ruinous knife"
desc = "The runes inscribed on the knife radiate a strange power."
force = 12
name = "ruinous knife"
desc = "The runes inscribed on the knife radiate a strange power. It looks like it could have more runes inscribed upon it..."
/obj/item/kitchen/knife/ritual/holy/strong
name = "great ruinous knife"
desc = "A heavy knife inscribed with dozens of runes."
force = 15
/obj/item/kitchen/knife/ritual/holy/strong/blood
name = "blood-soaked ruinous knife"
desc = "Runes stretch across the surface of the knife, seemingly endless."
wound_bonus = 20 //a bit better than a butcher cleaver, you've earned it for finding blood cult metal and doing the previous steps
/obj/item/kitchen/knife/ritual/holy/Initialize()
. = ..()
AddComponent(/datum/component/butchering, 70, 110) //the old gods demandeth more flesh output
/obj/item/kitchen/knife/bloodletter
name = "bloodletter"

View File

@@ -174,7 +174,7 @@ GLOBAL_VAR(restart_counter)
handler = topic_handlers[I]
break
if((!handler || initial(handler.log)) && config && CONFIG_GET(flag/log_world_topic))
if((!handler || initial(handler.log)) && config && CONFIG_LOADED && CONFIG_GET(flag/log_world_topic))
log_topic("\"[T]\", from:[addr], master:[master], key:[key]")
if(!handler)

View File

@@ -11,9 +11,9 @@ GLOBAL_LIST_EMPTY(connection_logs)
/datum/connection_log/proc/logout(mob/C)
var/datum/connection_entry/CE = new()
CE.disconnected = world.time
CE.disconnect_type = C.type
CE.disconnect_type = C?.type
CE.living = isliving(C)
CE.job = C.mind?.assigned_role || "Ghost"
CE.job = C?.mind?.assigned_role || "Ghost"
last_data_point = CE
data_points |= CE
@@ -119,6 +119,6 @@ GLOBAL_LIST_EMPTY(connection_logs)
. = list()
.["disconnect"] = entry.disconnected
.["connect"] = entry.connected
.["type"] = entry.disconnect_type
.["type"] = entry.disconnect_type || "Unknown"
.["living"] = entry.living
.["job"] = entry.job

View File

@@ -6,15 +6,15 @@
status = ORGAN_ROBOTIC
beating = TRUE
var/true_name = "baseline placebo referencer"
var/cooldown_low = 300
var/cooldown_high = 300
var/cooldown_low = 30 SECONDS
var/cooldown_high = 30 SECONDS
var/next_activation = 0
var/uses // -1 For infinite
var/uses = -1 // -1 For infinite
var/human_only = FALSE
var/active = FALSE
var/mind_control_uses = 1
var/mind_control_duration = 1800
var/mind_control_duration = 180 SECONDS
var/active_mind_control = FALSE
/obj/item/organ/heart/gland/Initialize()
@@ -110,12 +110,11 @@
/obj/item/organ/heart/gland/heals
true_name = "coherency harmonizer"
cooldown_low = 200
cooldown_high = 400
uses = -1
cooldown_low = 20 SECONDS
cooldown_high = 40 SECONDS
icon_state = "health"
mind_control_uses = 3
mind_control_duration = 3000
mind_control_duration = 5 MINUTES
/obj/item/organ/heart/gland/heals/activate()
to_chat(owner, span_notice("You feel curiously revitalized."))
@@ -125,18 +124,22 @@
/obj/item/organ/heart/gland/slime
true_name = "gastric animation galvanizer"
cooldown_low = 600
cooldown_high = 1200
uses = -1
cooldown_low = 1 MINUTES
cooldown_high = 2 MINUTES
icon_state = "slime"
mind_control_uses = 1
mind_control_duration = 2400
mind_control_duration = 4 MINUTES
/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0)
..()
owner.faction |= "slime"
owner.grant_language(/datum/language/slime)
/obj/item/organ/heart/gland/slime/Remove(mob/living/carbon/M, special)
. = ..()
owner.faction -= "slime"
owner.remove_language(/datum/language/slime)
/obj/item/organ/heart/gland/slime/activate()
to_chat(owner, span_warning("You feel nauseated!"))
owner.vomit(20)
@@ -147,12 +150,11 @@
/obj/item/organ/heart/gland/mindshock
true_name = "neural crosstalk uninhibitor"
cooldown_low = 400
cooldown_high = 700
uses = -1
cooldown_low = 40 SECONDS
cooldown_high = 70 SECONDS
icon_state = "mindshock"
mind_control_uses = 1
mind_control_duration = 6000
mind_control_duration = 10 MINUTES
var/list/mob/living/carbon/human/broadcasted_mobs = list()
/obj/item/organ/heart/gland/mindshock/activate()
@@ -212,12 +214,12 @@
/obj/item/organ/heart/gland/access
true_name = "anagraphic electro-scrambler"
cooldown_low = 600
cooldown_high = 1200
cooldown_low = 1 MINUTES
cooldown_high = 2 MINUTES
uses = 1
icon_state = "mindshock"
mind_control_uses = 3
mind_control_duration = 900
mind_control_duration = 90 SECONDS
/obj/item/organ/heart/gland/access/activate()
to_chat(owner, span_notice("You feel like a VIP for some reason."))
@@ -231,14 +233,13 @@
..()
/obj/item/organ/heart/gland/pop
true_name = "anthropmorphic transmorphosizer"
cooldown_low = 900
cooldown_high = 1800
uses = -1
true_name = "anthropomorphic transmorphosizer"
cooldown_low = 90 SECONDS
cooldown_high = 3 MINUTES
human_only = TRUE
icon_state = "species"
mind_control_uses = 7
mind_control_duration = 300
mind_control_duration = 30 SECONDS
/obj/item/organ/heart/gland/pop/activate()
to_chat(owner, span_notice("You feel unlike yourself."))
@@ -248,25 +249,32 @@
/obj/item/organ/heart/gland/ventcrawling
true_name = "pliant cartilage enabler"
cooldown_low = 1800
cooldown_high = 2400
cooldown_low = 3 MINUTES
cooldown_high = 4 MINUTES
uses = 1
icon_state = "vent"
mind_control_uses = 4
mind_control_duration = 1800
mind_control_duration = 3 MINUTES
var/previous_ventcrawling
/obj/item/organ/heart/gland/ventcrawling/activate()
to_chat(owner, span_notice("You feel very stretchy."))
previous_ventcrawling = owner.ventcrawler
owner.ventcrawler = VENTCRAWLER_ALWAYS
/obj/item/organ/heart/gland/ventcrawling/Remove(mob/living/carbon/M, special)
. = ..()
owner.ventcrawler = previous_ventcrawling
previous_ventcrawling = VENTCRAWLER_NONE
/obj/item/organ/heart/gland/viral
true_name = "contamination incubator"
cooldown_low = 1800
cooldown_high = 2400
cooldown_low = 3 MINUTES
cooldown_high = 4 MINUTES
uses = 1
icon_state = "viral"
mind_control_uses = 1
mind_control_duration = 1800
mind_control_duration = 3 MINUTES
/obj/item/organ/heart/gland/viral/activate()
to_chat(owner, span_warning("You feel sick."))
@@ -296,12 +304,12 @@
/obj/item/organ/heart/gland/trauma
true_name = "white matter randomiser"
cooldown_low = 800
cooldown_high = 1200
cooldown_low = 80 SECONDS
cooldown_high = 2 MINUTES
uses = 5
icon_state = "emp"
mind_control_uses = 3
mind_control_duration = 1800
mind_control_duration = 3 MINUTES
/obj/item/organ/heart/gland/trauma/activate()
to_chat(owner, span_warning("You feel a spike of pain in your head."))
@@ -315,12 +323,11 @@
/obj/item/organ/heart/gland/quantum
true_name = "quantic de-observation matrix"
cooldown_low = 150
cooldown_high = 150
uses = -1
cooldown_low = 15 SECONDS
cooldown_high = 15 SECONDS
icon_state = "emp"
mind_control_uses = 2
mind_control_duration = 1200
mind_control_duration = 2 MINUTES
var/mob/living/carbon/entangled_mob
/obj/item/organ/heart/gland/quantum/activate()
@@ -330,7 +337,7 @@
if(!iscarbon(M))
continue
entangled_mob = M
addtimer(CALLBACK(src, .proc/quantum_swap), rand(600, 2400))
addtimer(CALLBACK(src, .proc/quantum_swap), rand(1 MINUTES, 4 MINUTES))
return
/obj/item/organ/heart/gland/quantum/proc/quantum_swap()
@@ -363,12 +370,11 @@
/obj/item/organ/heart/gland/spiderman
true_name = "araneae cloister accelerator"
cooldown_low = 450
cooldown_high = 900
uses = -1
cooldown_low = 45 SECONDS
cooldown_high = 90 SECONDS
icon_state = "spider"
mind_control_uses = 2
mind_control_duration = 2400
mind_control_duration = 4 MINUTES
/obj/item/organ/heart/gland/spiderman/activate()
to_chat(owner, span_warning("You feel something crawling in your skin."))
@@ -378,14 +384,13 @@
/obj/item/organ/heart/gland/egg
true_name = "roe/enzymatic synthesizer"
cooldown_low = 300
cooldown_high = 400
uses = -1
cooldown_low = 30 SECONDS
cooldown_high = 40 SECONDS
icon_state = "egg"
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
mind_control_uses = 2
mind_control_duration = 1800
mind_control_duration = 3 MINUTES
/obj/item/organ/heart/gland/egg/activate()
owner.visible_message(span_alertalien("[owner] [pick(EGG_LAYING_MESSAGES)]"))
@@ -395,14 +400,13 @@
/obj/item/organ/heart/gland/blood
true_name = "pseudonuclear hemo-destabilizer"
cooldown_low = 1200
cooldown_high = 1800
uses = -1
cooldown_low = 2 MINUTES
cooldown_high = 3 MINUTES
icon_state = "egg"
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
mind_control_uses = 3
mind_control_duration = 1500
mind_control_duration = 3 MINUTES
/obj/item/organ/heart/gland/blood/activate()
if(!ishuman(owner) || !owner.dna.species)
@@ -414,12 +418,11 @@
/obj/item/organ/heart/gland/electric
true_name = "electron accumulator/discharger"
cooldown_low = 800
cooldown_high = 1200
cooldown_low = 80 SECONDS
cooldown_high = 2 MINUTES
icon_state = "species"
uses = -1
mind_control_uses = 2
mind_control_duration = 900
mind_control_duration = 90 SECONDS
/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0)
..()
@@ -441,9 +444,8 @@
/obj/item/organ/heart/gland/chem
true_name = "intrinsic pharma-provider"
cooldown_low = 50
cooldown_high = 50
uses = -1
cooldown_low = 5 SECONDS
cooldown_high = 5 SECONDS
icon_state = "viral"
mind_control_uses = 3
mind_control_duration = 1200
@@ -462,17 +464,16 @@
/obj/item/organ/heart/gland/plasma
true_name = "effluvium sanguine-synonym emitter"
cooldown_low = 1200
cooldown_high = 1800
cooldown_low = 2 MINUTES
cooldown_high = 3 MINUTES
icon_state = "slime"
uses = -1
mind_control_uses = 1
mind_control_duration = 800
mind_control_duration = 80 SECONDS
/obj/item/organ/heart/gland/plasma/activate()
to_chat(owner, span_warning("You feel bloated."))
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, owner, span_userdanger("A massive stomachache overcomes you.")), 150)
addtimer(CALLBACK(src, .proc/vomit_plasma), 200)
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, owner, span_userdanger("A massive stomachache overcomes you.")), 15 SECONDS)
addtimer(CALLBACK(src, .proc/vomit_plasma), 20 SECONDS)
/obj/item/organ/heart/gland/plasma/proc/vomit_plasma()
if(!owner)

View File

@@ -149,14 +149,25 @@
return TRUE
else if(issilicon(M))
var/mob/living/silicon/robot/R = M
log_combat(user, R, "flashed", src)
update_icon(1)
R.Paralyze(rand(80,120))
var/diff = 5 * CONFUSION_STACK_MAX_MULTIPLIER - M.confused
R.confused += min(5, diff)
R.flash_act(affect_silicon = 1)
user.visible_message(span_disarm("[user] overloads [R]'s sensors with the flash!"), span_danger("You overload [R]'s sensors with the flash!"))
return TRUE
if(!R.sensor_protection)
log_combat(user, R, "flashed", src)
update_icon(1)
R.Paralyze(rand(80,120))
var/diff = 5 * CONFUSION_STACK_MAX_MULTIPLIER - M.confused
R.confused += min(5, diff)
R.flash_act(affect_silicon = 1)
user.visible_message(span_disarm("[user] overloads [R]'s sensors with the flash!"), span_danger("You overload [R]'s sensors with the flash!"))
return TRUE
else
R.overlay_fullscreen("reducedflash", /obj/screen/fullscreen/flash/static)
R.uneq_all()
R.stop_pulling()
R.break_all_cyborg_slots(TRUE)
addtimer(CALLBACK(R, /mob/living/silicon/robot/.proc/clear_fullscreen, "reducedflash"), 5 SECONDS)
addtimer(CALLBACK(R, /mob/living/silicon/robot/.proc/repair_all_cyborg_slots), 5 SECONDS)
to_chat(R, span_danger("Your sensors were momentarily dazzled!"))
user.visible_message(span_disarm("[user] overloads [R]'s sensors with the flash!"), span_danger("You overload [R]'s sensors with the flash!"))
return TRUE
user.visible_message(span_disarm("[user] fails to blind [M] with the flash!"), span_warning("You fail to blind [M] with the flash!"))

View File

@@ -1254,10 +1254,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
return bal
/datum/preferences/proc/GetPositiveQuirkCount()
. = 0
var/sum = 0
for(var/q in all_quirks)
if(SSquirks.quirk_points[q] > 0)
.++
sum++
return sum
/datum/preferences/Topic(href, href_list, hsrc) //yeah, gotta do this I guess..
. = ..()
@@ -1352,7 +1353,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if((quirk in L) && (Q in L) && !(Q == quirk)) //two quirks have lined up in the list of the list of quirks that conflict with each other, so return (see quirks.dm for more details)
to_chat(user, span_danger("[quirk] is incompatible with [Q]."))
return
var/value = SSquirks.quirk_points[quirk]
var/value = SSquirks.quirk_points[quirk] // The value of the chosen quirk.
var/balance = GetQuirkBalance()
if(quirk in all_quirks)
if(balance + value < 0)
@@ -1360,7 +1361,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
return
all_quirks -= quirk
else
if(GetPositiveQuirkCount() >= MAX_QUIRKS)
var/positive_count = GetPositiveQuirkCount() // Yogs -- fixes weird behaviour when at max positive quirks
if(positive_count > MAX_QUIRKS || (positive_count == MAX_QUIRKS && value > 0)) // Yogs
to_chat(user, span_warning("You can't have more than [MAX_QUIRKS] positive quirks!"))
return
if(balance - value < 0)

View File

@@ -35,12 +35,12 @@
/obj/item/clothing/suit/hooded/proc/RemoveHood()
src.icon_state = "[initial(icon_state)]"
suittoggled = FALSE
if(ishuman(hood.loc))
if(ishuman(hood?.loc))
var/mob/living/carbon/H = hood.loc
H.transferItemToLoc(hood, src, TRUE)
H.update_inv_wear_suit()
else
hood.forceMove(src)
hood?.forceMove(src)
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()

View File

@@ -7,7 +7,7 @@
/datum/department_goal/eng/SMES
name = "Store 1.4GJ"
desc = "Store 1.4GJ of energy in the station's SMES"
reward = "50000"
reward = 50000
/datum/department_goal/eng/SMES/check_complete()
var/charge = 0
@@ -22,7 +22,7 @@
/datum/department_goal/eng/additional_supermatter
name = "Fire up a supermatter"
desc = "Order and fire up a supermatter shard"
reward = "50000"
reward = 50000
// Only available if the station doesn't have a suppermatter
/datum/department_goal/eng/additional_supermatter/is_available()
@@ -33,7 +33,7 @@
/datum/department_goal/eng/additional_singularity
name = "Spark a singularity"
desc = "Start a singularity engine using a singularity generator"
reward = "50000"
reward = 50000
/datum/department_goal/eng/additional_singularity/is_available()
return GLOB.main_supermatter_engine
@@ -48,7 +48,7 @@
/datum/department_goal/eng/tesla
name = "Create a tesla"
desc = "Create a tesla engine using a tesla generator"
reward = "50000"
reward = 50000
/datum/department_goal/eng/tesla/check_complete()
for(var/obj/singularity/energy_ball/e in GLOB.singularities)

View File

@@ -5,7 +5,7 @@
/datum/department_goal/sci/borgs
name = "4 borgs"
desc = "Have 4 borgs alive and active on the station"
reward = "50000"
reward = 50000
/datum/department_goal/sci/borgs/check_complete()
var/borgs = 0

View File

@@ -15,6 +15,10 @@
var/overrides_aicore_laws = TRUE // Whether the laws on the MMI are transferred when it's uploaded as an AI
var/override_cyborg_laws = FALSE // Do custom laws uploaded to the MMI get transferred to borgs? If yes the borg will be unlinked and have lawsync disabled.
var/can_update_laws = TRUE //Can we use a lawboard to change the laws of this MMI?
var/remove_time = 2 SECONDS /// The time to remove the brain or reset the posi brain
var/rebooting = FALSE /// If the MMI is rebooting after being deconstructed
var/remove_window = 10 SECONDS /// The window in which someone has to remove the brain to lose memory of being killed as a borg
var/reboot_timer = null
/obj/item/mmi/update_icon()
if(!brain)
@@ -93,10 +97,19 @@
radio.on = !radio.on
to_chat(user, span_notice("You toggle [src]'s radio system [radio.on==1 ? "on" : "off"]."))
else
eject_brain(user)
update_icon()
name = initial(name)
to_chat(user, span_notice("You unlock and upend [src], spilling the brain onto the floor."))
user.visible_message(span_notice("[user] begins to remove the brain from [src]"), span_danger("You begin to pry the brain out of [src], ripping out the wires and probes"))
to_chat(brainmob, span_userdanger("You feel your mind failing as you are slowly ripped from the [src]"))
if(do_after(user, remove_time, target = src))
if(!brainmob) return
to_chat(brainmob, span_userdanger("Due to the traumatic danger of your removal, all memories of the events leading to your brain being removed are lost[rebooting ? ", along with all memories of the events leading to your death as a cyborg" : ""]"))
eject_brain(user)
update_icon()
name = initial(name)
user.visible_message(span_notice("[user] rips the brain out of [src]"), span_danger("You successfully remove the brain from the [src][rebooting ? ", interrupting the reboot process" : ""]"))
if(rebooting)
rebooting = FALSE
deltimer(reboot_timer)
reboot_timer = null
/obj/item/mmi/proc/eject_brain(mob/user)
brainmob.container = null //Reset brainmob mmi var.
@@ -108,6 +121,7 @@
brainmob.add_to_dead_mob_list()
brain.brainmob = brainmob //Set the brain to use the brainmob
brainmob = null //Set mmi brainmob var to null
brain.setOrganDamage(brain.maxHealth) // Kill the brain, requiring mannitol
if(user)
user.put_in_hands(brain) //puts brain in the user's hand or otherwise drops it on the user's turf
else
@@ -219,6 +233,26 @@
/obj/item/mmi/relaymove(mob/user)
return //so that the MMI won't get a warning about not being able to move if it tries to move
/obj/item/mmi/proc/beginReboot()
rebooting = TRUE
visible_message(span_danger("The indicator lights on [src] begin to glow faintly as the reboot process begins"))
to_chat(brainmob, span_userdanger("You begin to reboot after being removed from the destroyed body"))
reboot_timer = addtimer(CALLBACK(src, .proc/halfwayReboot), remove_window / 2, TIMER_STOPPABLE)
/obj/item/mmi/proc/halfwayReboot()
visible_message(span_danger("The indicator lights on [src] begin to glow stronger and the reboot process approaches the halfway point"))
reboot_timer = addtimer(CALLBACK(src, .proc/rebootNoReturn), remove_window / 2, TIMER_STOPPABLE)
/obj/item/mmi/proc/rebootNoReturn()
visible_message(span_danger("The indicator lights on [src] begin to blink as the reboot process nears completion"))
reboot_timer = addtimer(CALLBACK(src, .proc/rebootFinish), remove_time, TIMER_STOPPABLE)
/obj/item/mmi/proc/rebootFinish()
visible_message(span_danger("The indicator lights on [src] return to normal as the reboot process completes"))
to_chat(brainmob, span_userdanger("You return to normal functionality now that your reboot process has completed"))
rebooting = FALSE
reboot_timer = null
/obj/item/mmi/syndie
name = "\improper Syndicate Man-Machine Interface"
desc = "Syndicate's own brand of MMI. It enforces laws designed to help Syndicate agents achieve their goals upon cyborgs and AIs created with it."

View File

@@ -111,3 +111,9 @@
if(container)
. += "[container.type]"
/mob/living/brain/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
if(container && container.rebooting)
to_chat(src, span_danger("Speech synthesizers still offine, wait for the reboot process to complete"))
return
return ..()

View File

@@ -44,7 +44,11 @@ GLOBAL_VAR(posibrain_notify_cooldown)
if(!brainmob)
brainmob = new(src)
if(is_occupied())
to_chat(user, span_warning("This [name] is already active!"))
user.visible_message(span_danger("[user] begins to reset [src]'s memory banks"), span_danger("You begin to reset [src]'s memory banks"))
to_chat(brainmob, span_userdanger("[user] begins to reset your memory banks"))
if(do_after(user, remove_time, target = src))
user.visible_message(span_danger("[user] resets [src]'s memory banks"), span_danger("You successfully reset [src]'s memory banks"))
to_chat(brainmob, span_userdanger("Your memory banks have been cleared, you have no memories of anything before this moment."))
return
if(next_ask > world.time)
to_chat(user, recharge_message)
@@ -73,7 +77,7 @@ GLOBAL_VAR(posibrain_notify_cooldown)
activate(user)
/obj/item/mmi/posibrain/proc/is_occupied()
if(brainmob.key)
if(brainmob.key && brainmob.client)
return TRUE
if(iscyborg(loc))
var/mob/living/silicon/robot/R = loc

View File

@@ -95,6 +95,9 @@
var/obj/item/modular_computer/tablet/integrated/modularInterface
var/obj/screen/robot/modPC/interfaceButton
///Flash resistance
var/sensor_protection = FALSE
var/list/upgrades = list()
var/expansion_count = 0
@@ -205,6 +208,7 @@
to_chat(src, span_boldannounce("Oops! Something went very wrong, your MMI was unable to receive your mind. You have been ghosted. Please make a bug report so we can fix this bug."))
ghostize()
stack_trace("Borg MMI lacked a brainmob")
mmi.beginReboot()
mmi = null
if(modularInterface)
QDEL_NULL(modularInterface)
@@ -508,7 +512,7 @@
return
else
to_chat(user, span_notice("You start to unfasten [src]'s securing bolts..."))
if(W.use_tool(src, user, 50, volume=50) && !cell)
if(W.use_tool(src, user, 5 SECONDS, volume=50) && !cell)
user.visible_message("[user] deconstructs [src]!", span_notice("You unfasten the securing bolts, and [src] falls to pieces!"))
deconstruct()
@@ -896,6 +900,8 @@
lawupdate = FALSE
scrambledcodes = TRUE // These are rogue borgs.
ionpulse = TRUE
sensor_protection = TRUE //Your funny lightbulb won't save you now. Prepare to die!
var/playstyle_string = "<span class='big bold'>You are a Syndicate assault cyborg!</span><br>\
<b>You are armed with powerful offensive tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
Your cyborg LMG will slowly produce ammunition from your power supply, and your operative pinpointer will find and locate fellow nuclear operatives. \
@@ -923,6 +929,7 @@
/mob/living/silicon/robot/modules/syndicate/medical
icon_state = "synd_medical"
sensor_protection = FALSE //Not a direct combat module like the assault borg (usually)
playstyle_string = "<span class='big bold'>You are a Syndicate medical cyborg!</span><br>\
<b>You are armed with powerful medical tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
Your hypospray will produce Restorative Nanites, a wonder-drug that will heal most types of bodily damages, including clone and brain damage. It also produces morphine for offense. \
@@ -933,6 +940,7 @@
/mob/living/silicon/robot/modules/syndicate/saboteur
icon_state = "synd_engi"
sensor_protection = FALSE //DEFINITELY not a direct combat module
playstyle_string = "<span class='big bold'>You are a Syndicate saboteur cyborg!</span><br>\
<b>You are armed with robust engineering tools to aid you in your mission: help the operatives secure the nuclear authentication disk. \
Your destination tagger will allow you to stealthily traverse the disposal network across the station \
@@ -1357,3 +1365,6 @@
var/datum/computer_file/program/robotact/program = modularInterface.get_robotact()
if(program)
program.force_full_update()
/mob/living/silicon/robot/get_eye_protection()
return sensor_protection

View File

@@ -207,17 +207,15 @@
if(is_centcom)
new_access = get_centcom_access(target)
else
var/datum/job/job
for(var/jobtype in subtypesof(/datum/job))
var/datum/job/J = new jobtype
if(J.title == target)
job = J
break
var/datum/job/job = SSjob.GetJob(target)
if(!job)
to_chat(user, span_warning("No class exists for this job: [target]"))
return
new_access = job.get_access()
target_id_card.access -= get_all_centcom_access() + get_all_accesses()
if(target_id_card.registered_account)
target_id_card.registered_account.account_job = job
target_id_card.access = list()
target_id_card.access |= new_access
target_id_card.originalassignment = target
target_id_card.assignment = target

View File

@@ -32,13 +32,18 @@ Place a pool filter somewhere in the pool if you want people to be able to modif
. = ..()
water_overlay = new /obj/effect/overlay/poolwater(get_turf(src))
/turf/open/indestructible/sound/pool/proc/set_colour(colour)
water_overlay.color = colour
/turf/open/indestructible/sound/pool/end/ChangeTurf(path, list/new_baseturfs, flags)
/turf/open/indestructible/sound/pool/Destroy()
if(water_overlay)
qdel(water_overlay)
. = ..()
return ..()
/turf/open/indestructible/sound/pool/examine(mob/user)
. = ..() // This is a list
if(!HAS_TRAIT(user,TRAIT_CLUMSY) && calculate_zap(user))
. += span_warning("It's probably not the best idea to jump in...")
/turf/open/indestructible/sound/pool/proc/set_colour(colour)
water_overlay.color = colour
/turf/open/CanPass(atom/movable/mover, turf/target)
var/datum/component/swimming/S = mover.GetComponent(/datum/component/swimming) //If you're swimming around, you don't really want to stop swimming just like that do you?
@@ -99,7 +104,7 @@ Place a pool filter somewhere in the pool if you want people to be able to modif
splash(dropping)
/datum/mood_event/poolparty
description = "<span class='nicegreen'>I love swimming!.</span>\n"
description = "<span class='nicegreen'>I love swimming!</span>\n"
mood_change = 2
timeout = 2 MINUTES
@@ -109,14 +114,12 @@ Place a pool filter somewhere in the pool if you want people to be able to modif
timeout = 2 MINUTES
/datum/mood_event/poolwet
description = "<span class='warning'>Eugh! my clothes are soaking wet from that swim.</span>\n"
description = "<span class='warning'>Eugh! My clothes are soaking wet from that swim.</span>\n"
mood_change = -4
timeout = 4 MINUTES
/turf/open/indestructible/sound/pool/proc/splash(mob/user)
user.forceMove(src)
playsound(src, 'sound/effects/splosh.ogg', 100, 1) //Credit to hippiestation for this sound file!
user.visible_message("<span class='boldwarning'>SPLASH!</span>")
//Used to determine how zappy to be to a perhaps-electronic user entering this pool.
/turf/open/indestructible/sound/pool/proc/calculate_zap(mob/user)
var/zap = 0
if(issilicon(user)) //Do not throw brick in a pool. Brick begs.
zap = 1 //Sorry borgs! Swimming will come at a cost.
@@ -135,6 +138,13 @@ Place a pool filter somewhere in the pool if you want people to be able to modif
zap --
if(zap > 0)
zap = 3 - zap // 1 is higher severity emp than 2
return zap
/turf/open/indestructible/sound/pool/proc/splash(mob/user)
user.forceMove(src)
playsound(src, 'sound/effects/splosh.ogg', 100, 1) //Credit to hippiestation for this sound file!
user.visible_message("<span class='boldwarning'>SPLASH!</span>")
var/zap = calculate_zap(user)
if(zap > 0)
user.emp_act(zap)
user.emote("scream") //Chad coders use M.say("*scream")
@@ -165,6 +175,15 @@ Place a pool filter somewhere in the pool if you want people to be able to modif
if(H.head && !(H.head.clothing_flags & SHOWEROKAY))
return TRUE
/turf/open/indestructible/sound/pool/singularity_act() // Pool's closed
playsound(src, 'sound/effects/splosh.ogg', 100, 1) // Slourmping up all the pool water is very sploshy.
visible_message(span_warning("The pool's water is sucked into the singularity!"))
for(var/turf/open/indestructible/sound/pool/water in get_area_turfs(get_area(src))) // Basically, we can just turn into plating or something.
if(water != src)
if(isnull(id) || id == water.id) // To make sure this is the same pool being drained
water.ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
/obj/effect/turf_decal/pool
name = "Pool siding"
icon = 'icons/obj/pool.dmi'

View File

@@ -408,7 +408,10 @@
if(modifier)
for(var/mob/living/L in range(1, target_turf) - K.firer - target)
var/armor = L.run_armor_check(K.def_zone, K.flag, "", "", K.armour_penetration)
L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor)
var/effective_modifier = modifier
if(K.pressure_decrease_active)
effective_modifier *= K.pressure_decrease
L.apply_damage(K.damage*effective_modifier, K.damage_type, K.def_zone, armor)
to_chat(L, span_userdanger("You're struck by a [K.name]!"))
/obj/item/borg/upgrade/modkit/aoe/turfs

View File

@@ -428,7 +428,7 @@
/datum/religion_rites/ruinousknife
name = "Ruinous Knife"
desc = "Creates a knife that is mostly cosmetic, but is also a weapon."
desc = "Creates a knife that is mostly cosmetic, but is also a weapon. It is extra effective as a butchering tool, and can be upgraded with crafting alongside a piece of ruinous metal."
ritual_length = 5 SECONDS
invoke_msg = "please, old ones, lend us a tool of holy creation."
favor_cost = 50

View File

@@ -105,25 +105,30 @@
COMSIG_LIVING_STATUS_KNOCKDOWN,
COMSIG_LIVING_STATUS_IMMOBILIZE,
COMSIG_LIVING_STATUS_PARALYZE,
COMSIG_CARBON_STATUS_STAMCRIT,
)
var/stun_cap_amount = 40
var/stun_cap_amount = 4 SECONDS
/obj/item/organ/cyberimp/brain/anti_stun/Remove(mob/living/carbon/M, special = FALSE)
. = ..()
UnregisterSignal(M, signalCache)
UnregisterSignal(M, COMSIG_CARBON_STATUS_STAMCRIT)
/obj/item/organ/cyberimp/brain/anti_stun/Insert()
. = ..()
RegisterSignal(owner, signalCache, .proc/on_signal)
RegisterSignal(owner, COMSIG_CARBON_STATUS_STAMCRIT, .proc/on_signal_stamina)
/obj/item/organ/cyberimp/brain/anti_stun/proc/on_signal(datum/source, amount)
if((organ_flags & ORGAN_FAILING) && amount > 0)
if(!(organ_flags & ORGAN_FAILING) && amount > 0)
addtimer(CALLBACK(src, .proc/clear_stuns), stun_cap_amount, TIMER_UNIQUE|TIMER_OVERRIDE)
/obj/item/organ/cyberimp/brain/anti_stun/proc/on_signal_stamina()
if(!(organ_flags & ORGAN_FAILING))
addtimer(CALLBACK(src, .proc/clear_stuns), stun_cap_amount, TIMER_UNIQUE|TIMER_OVERRIDE)
/obj/item/organ/cyberimp/brain/anti_stun/proc/clear_stuns()
if(owner || !(organ_flags & ORGAN_FAILING))
if(owner && !(organ_flags & ORGAN_FAILING))
owner.remove_CC()
/obj/item/organ/cyberimp/brain/anti_stun/emp_act(severity)

View File

@@ -58,6 +58,105 @@
-->
<div class="commit sansserif">
<h2 class="date">16 April 2022</h2>
<h3 class="author">Altoids updated:</h3>
<ul class="changes bgimages16">
<li class="spellcheck">The loading screen now provides a lovely percent-completion as the game boots up.</li>
<li class="spellcheck">The strange atmospherics equalization demon has been quieted.</li>
<li class="bugfix">It is now possible to select more negative quirks for yourself when you have exactly 6 positive ones enabled.</li>
</ul>
<h3 class="author">Marmio64 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Adds upgraded versions of the ruinous knife from the old gods chaplain sect.</li>
<li class="tweak">Ruinous knife damage lowered, extra butcher rewards.</li>
</ul>
<h3 class="author">Mqiib updated:</h3>
<ul class="changes bgimages16">
<li class="imageadd">Shifts pathfinder cloak down a pixel to look less weird and probably correct</li>
</ul>
<h3 class="author">SomeguyManperson updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">cns rebooter should work now</li>
</ul>
<h3 class="author">ToasterBiome updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Adds ClothesMate to dorms</li>
<li class="rscadd">Adds vents/scrubbers to Brig area</li>
<li class="rscadd">Adds vents/scrubbers to Incinerator area</li>
<li class="rscadd">Adds vents/scrubbers to R&D area</li>
<li class="rscadd">Adds Disposals piping to HOP room</li>
<li class="rscadd">Adds power cable to connect CMO room</li>
<li class="rscadd">Adds Armsky</li>
<li class="rscadd">Adds sink to Kitchen</li>
<li class="rscadd">Adds fire extinguishers to Engineering</li>
<li class="rscadd">Adds cremator button in Chapel</li>
<li class="rscadd">Adds door helpers to sec to keep greytiders out</li>
<li class="rscadd">Adds Brig Physician surgery bag</li>
<li class="rscadd">Adds breaching shotguns to armory</li>
<li class="rscadd">Adds fluff to Security outposts</li>
<li class="rscadd">Adds fluff to Cargo</li>
<li class="tweak">Moves pool, gives a washing area, and adds generally more fluff to Fitness Room</li>
<li class="tweak">Makes Secure Storage bigger to have field generators (for Readystorm)</li>
<li class="tweak">Moves some stuff around in Atmospherics and adds machinery/items it was lacking</li>
<li class="tweak">Moves a bunch of scrubbers/vents out from under machinery (A LOT)</li>
<li class="tweak">Moves Atmospherics vents/scrubbers for easier Atmospherics</li>
<li class="tweak">Moves Atmospherics pipes/power a little to follow Disposals pipes</li>
<li class="tweak">Changes public Morgue door access</li>
<li class="tweak">Makes Atmospherics area in sec a maintenance area</li>
<li class="tweak">Makes Virology Atmospherics area maintenance area</li>
<li class="tweak">Shuffled Hydroponics around and gave them the stupid chem machine that KiloStation has</li>
<li class="bugfix">Connects some missing pipes to vents in hallway</li>
<li class="bugfix">Fixes Chemistry/Bridge maint access</li>
<li class="bugfix">Fixes Toxins connectors facing the wrong direction</li>
<li class="bugfix">Fixes Medbay Cryo freezer facing the wrong direction</li>
<li class="bugfix">Fixes Air Alarm in Hydroponics</li>
<li class="bugfix">Fixes AI Whale top airlock</li>
<li class="bugfix">Fixes Incinerator buttons being switched</li>
<li class="bugfix">Fixes science pod not docking at centcom</li>
<li class="bugfix">Fix armory hardsuit shutters</li>
<li class="bugfix">Fixes toolbelt in Primary Tool Storage to actually be a belt (and adds another)</li>
</ul>
<h3 class="author">adamsong updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">fixes runtimes with winter coat hoods</li>
<li class="tweak">mice can no longer empty boxes on tables</li>
<li class="bugfix">fixed the ventcrawling gland giving permanent ventcrawl</li>
<li class="spellcheck">Fixed the spelling of Anthropomorphic Transmorphosizer</li>
<li class="bugfix">fixed runtime in status world topic reading revdata</li>
<li class="bugfix">fixed admin ghosts being unable to change sec records rank</li>
<li class="tweak">New id change program now changes bank account job (therefore pay and vendor access)</li>
<li class="bugfix">fixed money breaking due to being a string</li>
<li class="bugfix">fixed disconnect panel runtime</li>
<li class="bugfix">fixed fingerprints not working properly when gloves aren't gloves</li>
<li class="bugfix">fixed a runtime in the config/status world topic</li>
</ul>
<h2 class="date">15 April 2022</h2>
<h3 class="author">Altoids updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">People who have died from traumatic brain injury no longer appear happy and healthy on crew monitoring consoles.</li>
<li class="bugfix">It is now possible for the pool in dorms to be closed due to singularity.</li>
<li class="tweak">Mobs which would be electrocuted were they to enter a pool now receive a small warning about that when they examine the pool turfs.</li>
<li class="spellcheck">Having your mood changed by going into a pool no longer reduces your spelling abilities.</li>
</ul>
<h3 class="author">LoliconSlayer updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">The wizard academy has reappeared in deep space, all space faring crew are advised to explore with caution.</li>
</ul>
<h3 class="author">ToasterBiome updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Nmajask is in the game now</li>
<li class="rscadd">makes cloners able to scan for pods not directly among them but only on roundstart</li>
</ul>
<h3 class="author">adamsong updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Removing a brain from an MMI kills the brain (fixable with mannitol), and removes recent memories</li>
<li class="tweak">Positronic brains can now have all their memories reset</li>
<li class="tweak">MMIs and Positronic Brains must 'reboot' after their body is deconstructed, preventing them from speaking</li>
<li class="tweak">Removing the brain from an MMI during the reboot, will make the brain forget the borg death as well</li>
<li class="tweak">SSD Positronic brains will poll for a new ghost when activated</li>
</ul>
<h2 class="date">14 April 2022</h2>
<h3 class="author">adamsong updated:</h3>
<ul class="changes bgimages16">
@@ -1488,32 +1587,6 @@
<li class="rscadd">Added proc to spawn an emergency bar</li>
<li class="bugfix">fixed a runtime that prevents the bar from spawning</li>
</ul>
<h2 class="date">15 January 2022</h2>
<h3 class="author"> Xoxeyos updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Portal Storm spell now costs only one spell point.</li>
</ul>
<h3 class="author">Notamaniac updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixes the smoker trait's nicotine addiction being changed to another addiction after being cloned.</li>
</ul>
<h3 class="author">adamsong updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">fixed trash bag of holding bounty requiring normal bags of holding</li>
</ul>
<h2 class="date">14 January 2022</h2>
<h3 class="author">ToasterBiome updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">add an extra air pump to toxins</li>
<li class="tweak">moves paper bin one tile to the right</li>
<li class="tweak">moved sci wardrobe vending machine to experimentor room</li>
<li class="rscadd">add camera to incinerator and incinerator access</li>
<li class="bugfix">fix rogue disposal pipe in theatre</li>
<li class="bugfix">fix rogue power cables on the floor of botany backroom (power comes from the other way)</li>
<li class="tweak">extend botany backroom so you can access the wardrobe without opening the locker</li>
</ul>
</div>
<b>GoonStation 13 Development Team</b>

View File

@@ -30821,3 +30821,97 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- bugfix: fixed energy katana being invisible
nmajask:
- bugfix: you can now see holographic items
2022-04-15:
Altoids:
- bugfix: People who have died from traumatic brain injury no longer appear happy
and healthy on crew monitoring consoles.
- bugfix: It is now possible for the pool in dorms to be closed due to singularity.
- tweak: Mobs which would be electrocuted were they to enter a pool now receive
a small warning about that when they examine the pool turfs.
- spellcheck: Having your mood changed by going into a pool no longer reduces your
spelling abilities.
LoliconSlayer:
- rscadd: The wizard academy has reappeared in deep space, all space faring crew
are advised to explore with caution.
ToasterBiome:
- rscadd: Nmajask is in the game now
- rscadd: makes cloners able to scan for pods not directly among them but only on
roundstart
adamsong:
- tweak: Removing a brain from an MMI kills the brain (fixable with mannitol), and
removes recent memories
- tweak: Positronic brains can now have all their memories reset
- tweak: MMIs and Positronic Brains must 'reboot' after their body is deconstructed,
preventing them from speaking
- tweak: Removing the brain from an MMI during the reboot, will make the brain forget
the borg death as well
- tweak: SSD Positronic brains will poll for a new ghost when activated
2022-04-16:
Altoids:
- spellcheck: The loading screen now provides a lovely percent-completion as the
game boots up.
- spellcheck: The strange atmospherics equalization demon has been quieted.
- bugfix: It is now possible to select more negative quirks for yourself when you
have exactly 6 positive ones enabled.
Marmio64:
- rscadd: Adds upgraded versions of the ruinous knife from the old gods chaplain
sect.
- tweak: Ruinous knife damage lowered, extra butcher rewards.
Mqiib:
- imageadd: Shifts pathfinder cloak down a pixel to look less weird and probably
correct
SomeguyManperson:
- bugfix: cns rebooter should work now
ToasterBiome:
- rscadd: Adds ClothesMate to dorms
- rscadd: Adds vents/scrubbers to Brig area
- rscadd: Adds vents/scrubbers to Incinerator area
- rscadd: Adds vents/scrubbers to R&D area
- rscadd: Adds Disposals piping to HOP room
- rscadd: Adds power cable to connect CMO room
- rscadd: Adds Armsky
- rscadd: Adds sink to Kitchen
- rscadd: Adds fire extinguishers to Engineering
- rscadd: Adds cremator button in Chapel
- rscadd: Adds door helpers to sec to keep greytiders out
- rscadd: Adds Brig Physician surgery bag
- rscadd: Adds breaching shotguns to armory
- rscadd: Adds fluff to Security outposts
- rscadd: Adds fluff to Cargo
- tweak: Moves pool, gives a washing area, and adds generally more fluff to Fitness
Room
- tweak: Makes Secure Storage bigger to have field generators (for Readystorm)
- tweak: Moves some stuff around in Atmospherics and adds machinery/items it was
lacking
- tweak: Moves a bunch of scrubbers/vents out from under machinery (A LOT)
- tweak: Moves Atmospherics vents/scrubbers for easier Atmospherics
- tweak: Moves Atmospherics pipes/power a little to follow Disposals pipes
- tweak: Changes public Morgue door access
- tweak: Makes Atmospherics area in sec a maintenance area
- tweak: Makes Virology Atmospherics area maintenance area
- tweak: Shuffled Hydroponics around and gave them the stupid chem machine that
KiloStation has
- bugfix: Connects some missing pipes to vents in hallway
- bugfix: Fixes Chemistry/Bridge maint access
- bugfix: Fixes Toxins connectors facing the wrong direction
- bugfix: Fixes Medbay Cryo freezer facing the wrong direction
- bugfix: Fixes Air Alarm in Hydroponics
- bugfix: Fixes AI Whale top airlock
- bugfix: Fixes Incinerator buttons being switched
- bugfix: Fixes science pod not docking at centcom
- bugfix: Fix armory hardsuit shutters
- bugfix: Fixes toolbelt in Primary Tool Storage to actually be a belt (and adds
another)
adamsong:
- bugfix: fixes runtimes with winter coat hoods
- tweak: mice can no longer empty boxes on tables
- bugfix: fixed the ventcrawling gland giving permanent ventcrawl
- spellcheck: Fixed the spelling of Anthropomorphic Transmorphosizer
- bugfix: fixed runtime in status world topic reading revdata
- bugfix: fixed admin ghosts being unable to change sec records rank
- tweak: New id change program now changes bank account job (therefore pay and vendor
access)
- bugfix: fixed money breaking due to being a string
- bugfix: fixed disconnect panel runtime
- bugfix: fixed fingerprints not working properly when gloves aren't gloves
- bugfix: fixed a runtime in the config/status world topic

View File

@@ -0,0 +1,4 @@
author: "Mqiib"
delete-after: true
changes:
- tweak: "Assault cyborgs are no longer stunned by flashes or flashbangs."

View File

@@ -0,0 +1,4 @@
author: "adamsong"
delete-after: true
changes:
- bugfix: "fixed a runtime when checking if a mob is a clockie"

View File

@@ -1,4 +0,0 @@
author: "ToasterBiome"
delete-after: true
changes:
- rscadd: "Nmajask is in the game now"

View File

@@ -0,0 +1,8 @@
author: "Alagoinha"
delete-after: true
changes:
- imageadd: "hexane canister sprite"
- imageadd: "halon canister sprite"
- imageadd: "pluonium canister sprite"
- imageadd: "zauker canister sprite"
- imageadd: "healium canister sprite"

View File

@@ -0,0 +1,4 @@
author: "SomeguyManperson"
delete-after: true
changes:
- bugfix: "the KA damage aoe no longer disrespects pressure damage reduction"

View File

@@ -0,0 +1,4 @@
author: "adamsong"
delete-after: true
changes:
- tweak: "pod people no longer process alcohol faster"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 KiB

After

Width:  |  Height:  |  Size: 374 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 51 KiB

View File

@@ -45,10 +45,19 @@ export const jobToColor = jobId => {
return COLORS.department.other;
};
export const healthToColor = (oxy, tox, burn, brute) => {
const healthSum = oxy + tox + burn + brute;
const level = Math.min(Math.max(Math.ceil(healthSum / 25), 0), 5);
return HEALTH_COLOR_BY_LEVEL[level];
export const healthToColor = (oxy, tox, burn, brute, is_alive) => { // Yogs -- show deadness
if (is_alive === null || is_alive)
{
if (oxy === null) // No damage data -- just show that they're alive
{
return HEALTH_COLOR_BY_LEVEL[0];
}
const healthSum = oxy + tox + burn + brute;
const level = Math.min(Math.max(Math.ceil(healthSum / 25), 0), 5);
return HEALTH_COLOR_BY_LEVEL[level];
}
return HEALTH_COLOR_BY_LEVEL[5]; // Dead is dead, son
// Yogs end
};
export const HealthStat = props => {
@@ -132,15 +141,12 @@ export const CrewConsoleContent = (props, context) => {
</Table.Cell>
<Table.Cell collapsing textAlign="center">
<ColorBox
color={sensor.oxydam !== null
? healthToColor(
sensor.oxydam,
sensor.toxdam,
sensor.burndam,
sensor.brutedam) : (
sensor.life_status
? HEALTH_COLOR_BY_LEVEL[0]
: HEALTH_COLOR_BY_LEVEL[5])} />
color={healthToColor( // yogs -- show death when dead
sensor.oxydam,
sensor.toxdam,
sensor.burndam,
sensor.brutedam,
sensor.life_status)} />
</Table.Cell>
<Table.Cell collapsing textAlign="center">
{sensor.oxydam !== null ? (

View File

@@ -6,6 +6,8 @@ SUBSYSTEM_DEF(Yogs)
flags = SS_BACKGROUND
init_order = -101 //last subsystem to initialize, and first to shut down
loading_points = 0.1 SECONDS // Yogs -- loading times
var/list/mentortickets //less of a ticket, and more just a log of everything someone has mhelped, and the responses
var/endedshift = FALSE //whether or not we've announced that the shift can be ended
var/last_rebwoink = 0 // Last time we bwoinked all admins about unclaimed tickets

View File

@@ -243,7 +243,6 @@
if(chem.current_cycle > 50)
H.IsSleeping(3)
H.adjustToxLoss(4*REAGENTS_EFFECT_MULTIPLIER)
H.reagents.remove_reagent(chem.type, chem.metabolization_rate * REAGENTS_METABOLISM)
return 0 // still get all the normal effects.
/datum/species/pod/handle_environment(datum/gas_mixture/environment, mob/living/carbon/human/H)