diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index bed32f1954..a1ed8fd5ff 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -233,6 +233,8 @@ //Mood #define COMSIG_ADD_MOOD_EVENT "add_mood" //Called when you send a mood event from anywhere in the code. #define COMSIG_CLEAR_MOOD_EVENT "clear_mood" //Called when you clear a mood event from anywhere in the code. +#define COMSIG_INCREASE_SANITY "decrease_sanity" //Called when you want to increase sanity from anywhere in the code. +#define COMSIG_DECREASE_SANITY "increase_sanity" //Same as above but to decrease sanity instead. //NTnet #define COMSIG_COMPONENT_NTNET_RECEIVE "ntnet_receive" //called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata)) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index e6eb9f313e..ed45da9923 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -48,6 +48,7 @@ #define JOB_UNAVAILABLE_PLAYTIME 3 #define JOB_UNAVAILABLE_ACCOUNTAGE 4 #define JOB_UNAVAILABLE_SLOTFULL 5 +#define JOB_UNAVAILABLE_SPECIESLOCK 6 #define DEFAULT_RELIGION "Christianity" #define DEFAULT_DEITY "Space Jesus" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 0f1973904d..9eb03a4bfb 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -509,3 +509,6 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S #define VOMIT_TOXIC 1 #define VOMIT_PURPLE 2 + +//Misc text define. Does 4 spaces. Used as a makeshift tabulator. +#define FOURSPACES "    " diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 3394fba90c..d4086bc4d9 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -83,7 +83,9 @@ #define INIT_ORDER_SHUTTLE -21 #define INIT_ORDER_MINOR_MAPPING -40 #define INIT_ORDER_PATH -50 -#define INIT_ORDER_PERSISTENCE -100 +#define INIT_ORDER_PERSISTENCE -95 +#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init. + // Subsystem fire priority, from lowest to highest priority // If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child) @@ -114,6 +116,7 @@ #define FIRE_PRIORITY_MOBS 100 #define FIRE_PRIORITY_TGUI 110 #define FIRE_PRIORITY_TICKER 200 +#define FIRE_PRIORITY_CHAT 400 #define FIRE_PRIORITY_OVERLAYS 500 #define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost. diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index b20122e653..6fca4eed3d 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -32,6 +32,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/caps, GLOB.caps_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/insect_wings, GLOB.insect_wings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/insect_fluff, GLOB.insect_fluffs_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/deco_wings, GLOB.deco_wings_list) //CIT CHANGES START HERE, ADDS SNOWFLAKE BODYPARTS AND MORE //mammal bodyparts (fucking furries) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 8f3cd4f60d..39d58ec15a 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -70,6 +70,8 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list) if(!GLOB.wings_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list) + if(!GLOB.deco_wings_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/deco_wings, GLOB.deco_wings_list) if(!GLOB.insect_wings_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/insect_wings, GLOB.insect_wings_list) if(!GLOB.insect_fluffs_list.len) @@ -138,6 +140,7 @@ "tail_lizard" = pick(GLOB.tails_list_lizard), "tail_human" = "None", "wings" = "None", + "deco_wings" = "None", "snout" = pick(GLOB.snouts_list), "horns" = pick(GLOB.horns_list), "ears" = "None", diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 0e9413520b..8e59106d98 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -280,41 +280,41 @@ if(GLOB.round_id) var/statspage = CONFIG_GET(string/roundstatsurl) var/info = statspage ? "[GLOB.round_id]" : GLOB.round_id - parts += "[GLOB.TAB]Round ID: [info]" + parts += "[FOURSPACES]Round ID: [info]" var/list/voting_results = SSvote.stored_gamemode_votes if(length(voting_results)) - parts += "[GLOB.TAB]Voting: " + parts += "[FOURSPACES]Voting: " var/total_score = 0 for(var/choice in voting_results) var/score = voting_results[choice] total_score += score - parts += "[GLOB.TAB][GLOB.TAB][choice]: [score]" + parts += "[FOURSPACES][FOURSPACES][choice]: [score]" - parts += "[GLOB.TAB]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]" - parts += "[GLOB.TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[popcount["station_integrity"]]%"]" + parts += "[FOURSPACES]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]" + parts += "[FOURSPACES]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[popcount["station_integrity"]]%"]" var/total_players = GLOB.joined_player_list.len if(total_players) - parts+= "[GLOB.TAB]Total Population: [total_players]" + parts+= "[FOURSPACES]Total Population: [total_players]" if(station_evacuated) - parts += "
[GLOB.TAB]Evacuation Rate: [popcount[POPCOUNT_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_ESCAPEES]/total_players)]%)" - parts += "[GLOB.TAB](on emergency shuttle): [popcount[POPCOUNT_SHUTTLE_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_SHUTTLE_ESCAPEES]/total_players)]%)" - parts += "[GLOB.TAB]Survival Rate: [popcount[POPCOUNT_SURVIVORS]] ([PERCENT(popcount[POPCOUNT_SURVIVORS]/total_players)]%)" + parts += "
[FOURSPACES]Evacuation Rate: [popcount[POPCOUNT_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_ESCAPEES]/total_players)]%)" + parts += "[FOURSPACES](on emergency shuttle): [popcount[POPCOUNT_SHUTTLE_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_SHUTTLE_ESCAPEES]/total_players)]%)" + parts += "[FOURSPACES]Survival Rate: [popcount[POPCOUNT_SURVIVORS]] ([PERCENT(popcount[POPCOUNT_SURVIVORS]/total_players)]%)" if(SSblackbox.first_death) var/list/ded = SSblackbox.first_death if(ded.len) - parts += "[GLOB.TAB]First Death: [ded["name"]], [ded["role"]], at [ded["area"]]. Damage taken: [ded["damage"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]" + parts += "[FOURSPACES]First Death: [ded["name"]], [ded["role"]], at [ded["area"]]. Damage taken: [ded["damage"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]" //ignore this comment, it fixes the broken sytax parsing caused by the " above else - parts += "[GLOB.TAB]Nobody died this shift!" + parts += "[FOURSPACES]Nobody died this shift!" if(istype(SSticker.mode, /datum/game_mode/dynamic)) var/datum/game_mode/dynamic/mode = SSticker.mode - parts += "[GLOB.TAB]Threat level: [mode.threat_level]" - parts += "[GLOB.TAB]Threat left: [mode.threat]" - parts += "[GLOB.TAB]Executed rules:" + parts += "[FOURSPACES]Threat level: [mode.threat_level]" + parts += "[FOURSPACES]Threat left: [mode.threat]" + parts += "[FOURSPACES]Executed rules:" for(var/datum/dynamic_ruleset/rule in mode.executed_rules) - parts += "[GLOB.TAB][GLOB.TAB][rule.ruletype] - [rule.name]: -[rule.cost] threat" + parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - [rule.name]: -[rule.cost] threat" return parts.Join("
") /client/proc/roundend_report_file() diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index c759658bd4..a2135b93b2 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -33,6 +33,7 @@ GLOBAL_LIST_EMPTY(animated_tails_list_human) GLOBAL_LIST_EMPTY(ears_list) GLOBAL_LIST_EMPTY(wings_list) GLOBAL_LIST_EMPTY(wings_open_list) +GLOBAL_LIST_EMPTY(deco_wings_list) GLOBAL_LIST_EMPTY(r_wings_list) GLOBAL_LIST_EMPTY(insect_wings_list) GLOBAL_LIST_EMPTY(insect_fluffs_list) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index e7b2ae6cbe..037e5067d8 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -6,8 +6,6 @@ GLOBAL_VAR_INIT(timezoneOffset, 0) // The difference betwen midnight (of the hos // However it'd be ok to use for accessing attack logs and such too, which are even laggier. GLOBAL_VAR_INIT(fileaccess_timer, 0) -GLOBAL_VAR_INIT(TAB, "    ") - GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm new file mode 100644 index 0000000000..37e53e8990 --- /dev/null +++ b/code/controllers/subsystem/chat.dm @@ -0,0 +1,67 @@ +SUBSYSTEM_DEF(chat) + name = "Chat" + flags = SS_TICKER|SS_NO_INIT + wait = 1 + priority = FIRE_PRIORITY_CHAT + init_order = INIT_ORDER_CHAT + var/list/payload = list() + + +/datum/controller/subsystem/chat/fire() + for(var/i in payload) + var/client/C = i + C << output(payload[C], "browseroutput:output") + payload -= C + + if(MC_TICK_CHECK) + return + + +/datum/controller/subsystem/chat/proc/queue(target, message, handle_whitespace = TRUE) + if(!target || !message) + return + + if(!istext(message)) + stack_trace("to_chat called with invalid input type") + return + + if(target == world) + target = GLOB.clients + + //Some macros remain in the string even after parsing and fuck up the eventual output + message = replacetext(message, "\improper", "") + message = replacetext(message, "\proper", "") + if(handle_whitespace) + message = replacetext(message, "\n", "
") + message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]") + message += "
" + + + //url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript. + //Do the double-encoding here to save nanoseconds + var/twiceEncoded = url_encode(url_encode(message)) + + if(islist(target)) + for(var/I in target) + var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible + + if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file. + continue + + if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue + C.chatOutput.messageQueue += message + continue + + payload[C] += twiceEncoded + + else + var/client/C = CLIENT_FROM_VAR(target) //Grab us a client if possible + + if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file. + return + + if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue + C.chatOutput.messageQueue += message + return + + payload[C] += twiceEncoded diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 730ffa9ff0..eb381af577 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -21,6 +21,8 @@ RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, .proc/add_event) RegisterSignal(parent, COMSIG_CLEAR_MOOD_EVENT, .proc/clear_event) + RegisterSignal(parent, COMSIG_INCREASE_SANITY, .proc/IncreaseSanity) + RegisterSignal(parent, COMSIG_DECREASE_SANITY, .proc/DecreaseSanity) RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud) var/mob/living/owner = parent @@ -129,23 +131,23 @@ switch(mood_level) if(1) - DecreaseSanity(0.2) + DecreaseSanity(src, 0.2) if(2) - DecreaseSanity(0.125, SANITY_CRAZY) + DecreaseSanity(src, 0.125, SANITY_CRAZY) if(3) - DecreaseSanity(0.075, SANITY_UNSTABLE) + DecreaseSanity(src, 0.075, SANITY_UNSTABLE) if(4) - DecreaseSanity(0.025, SANITY_DISTURBED) + DecreaseSanity(src, 0.025, SANITY_DISTURBED) if(5) - IncreaseSanity(0.1) + IncreaseSanity(src, 0.1) if(6) - IncreaseSanity(0.15) + IncreaseSanity(src, 0.15) if(7) - IncreaseSanity(0.20) + IncreaseSanity(src, 0.20) if(8) - IncreaseSanity(0.25, SANITY_GREAT) + IncreaseSanity(src, 0.25, SANITY_GREAT) if(9) - IncreaseSanity(0.4, SANITY_GREAT) + IncreaseSanity(src, 0.4, SANITY_GREAT) if(insanity_effect != holdmyinsanityeffect) if(insanity_effect > holdmyinsanityeffect) @@ -218,9 +220,9 @@ master.crit_threshold = (master.crit_threshold - insanity_effect) + newval insanity_effect = newval -/datum/component/mood/proc/DecreaseSanity(amount, minimum = SANITY_INSANE) +/datum/component/mood/proc/DecreaseSanity(datum/source, amount, minimum = SANITY_INSANE) if(sanity < minimum) //This might make KevinZ stop fucking pinging me. - IncreaseSanity(0.5) + IncreaseSanity(src, 0.5) else sanity = max(minimum, sanity - amount) if(sanity < SANITY_UNSTABLE) @@ -229,13 +231,13 @@ else insanity_effect = (MINOR_INSANITY_PEN) -/datum/component/mood/proc/IncreaseSanity(amount, maximum = SANITY_NEUTRAL) +/datum/component/mood/proc/IncreaseSanity(datum/source, amount, maximum = SANITY_NEUTRAL) // Disturbed stops you from getting any more sane - I'm just gonna bung this in here var/mob/living/owner = parent if(HAS_TRAIT(owner, TRAIT_UNSTABLE)) return if(sanity > maximum) - DecreaseSanity(0.5) //Removes some sanity to go back to our current limit. + DecreaseSanity(src, 0.5) //Removes some sanity to go back to our current limit. else sanity = min(maximum, sanity + amount) if(sanity > SANITY_CRAZY) @@ -262,6 +264,8 @@ if(the_event.timeout) addtimer(CALLBACK(src, .proc/clear_event, null, category), the_event.timeout, TIMER_UNIQUE|TIMER_OVERRIDE) + return the_event + /datum/component/mood/proc/clear_event(datum/source, category) var/datum/mood_event/event = mood_events[category] if(!event) diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 69f1a66814..f747c563ad 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -169,3 +169,10 @@ /datum/mood_event/sad_empath/add_effects(mob/sadtarget) description = "[sadtarget.name] seems upset...\n" + +/datum/mood_event/revenant_blight + description = "Just give up, honk...\n" + mood_change = -5 + +/datum/mood_event/revenant_blight/add_effects() + description = "Just give up, [pick("no one will miss you", "there is nothing you can do to help", "even a clown would be more useful than you", "does it even matter in the end?")]...\n" diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index d8bfbd0353..da59c79ac5 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -358,19 +358,20 @@ else new /obj/effect/temp_visual/bleed(get_turf(owner)) -/mob/living/proc/apply_necropolis_curse(set_curse) +/mob/living/proc/apply_necropolis_curse(set_curse, duration = 10 MINUTES) var/datum/status_effect/necropolis_curse/C = has_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE) if(!set_curse) set_curse = pick(CURSE_BLINDING, CURSE_SPAWNING, CURSE_WASTING, CURSE_GRASPING) if(QDELETED(C)) - apply_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE, set_curse) + apply_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE, set_curse, duration) + else C.apply_curse(set_curse) - C.duration += 3000 //additional curses add 5 minutes + C.duration += duration * 0.5 //additional curses add half their duration /datum/status_effect/necropolis_curse id = "necrocurse" - duration = 6000 //you're cursed for 10 minutes have fun + duration = 10 MINUTES //you're cursed for 10 minutes have fun tick_interval = 50 alert_type = null var/curse_flags = NONE @@ -378,7 +379,9 @@ var/effect_cooldown = 100 var/obj/effect/temp_visual/curse/wasting_effect = new -/datum/status_effect/necropolis_curse/on_creation(mob/living/new_owner, set_curse) +/datum/status_effect/necropolis_curse/on_creation(mob/living/new_owner, set_curse, _duration) + if(_duration) + duration = _duration . = ..() if(.) apply_curse(set_curse) diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index 8a40fc8b56..798cd9c026 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -339,6 +339,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station /area/crew_quarters/heads/captain name = "Captain's Office" icon_state = "captain" + clockwork_warp_allowed = FALSE /area/crew_quarters/heads/captain/private name = "Captain's Quarters" diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index a1ed7fb848..8a33241d46 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -1,3 +1,7 @@ +GLOBAL_VAR_INIT(singularity_counter, 0) + +#define METEOR_DISASTER_MODIFIER 0.5 + //////////////////////////////////////// //Singularity beacon //////////////////////////////////////// @@ -13,39 +17,57 @@ stat = 0 verb_say = "states" var/cooldown = 0 - - var/active = 0 + var/active = FALSE + var/meteor_buff = FALSE var/icontype = "beacon" - /obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null) + if(active) + return FALSE if(surplus() < 1500) if(user) to_chat(user, "The connected wire doesn't have enough current.") - return + return FALSE + if(is_station_level(z)) + increment_meteor_waves() for(var/obj/singularity/singulo in GLOB.singularities) if(singulo.z == z) singulo.target = src icon_state = "[icontype]1" - active = 1 + active = TRUE if(user) to_chat(user, "You activate the beacon.") + return TRUE - -/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null) +/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user) + if(!active) + return FALSE for(var/obj/singularity/singulo in GLOB.singularities) if(singulo.target == src) singulo.target = null icon_state = "[icontype]0" - active = 0 + active = FALSE if(user) to_chat(user, "You deactivate the beacon.") + if(meteor_buff) + decrement_meteor_waves() + return TRUE +/obj/machinery/power/singularity_beacon/proc/increment_meteor_waves() + meteor_buff = TRUE + GLOB.singularity_counter++ + for(var/datum/round_event_control/meteor_wave/W in SSevents.control) + W.weight += round(initial(W.weight) * METEOR_DISASTER_MODIFIER) + +/obj/machinery/power/singularity_beacon/proc/decrement_meteor_waves() + meteor_buff = FALSE + GLOB.singularity_counter-- + for(var/datum/round_event_control/meteor_wave/W in SSevents.control) + W.weight -= round(initial(W.weight) * METEOR_DISASTER_MODIFIER) /obj/machinery/power/singularity_beacon/attack_ai(mob/user) return - /obj/machinery/power/singularity_beacon/attack_hand(mob/user) . = ..() if(.) @@ -86,6 +108,12 @@ if(!active) return + var/is_on_station = is_station_level(z) + if(meteor_buff && !is_on_station) + decrement_meteor_waves() + else if(!meteor_buff && is_on_station) + increment_meteor_waves() + if(surplus() >= 1500) add_load(1500) if(cooldown <= world.time) @@ -133,3 +161,5 @@ /obj/item/sbeacondrop/clownbomb desc = "A label on it reads: Warning: Activating this device will send a silly explosive to your location." droptype = /obj/machinery/syndicatebomb/badmin/clown + +#undef METEOR_DISASTER_MODIFIER diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index e4e16fbfb4..fdb016df38 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -302,7 +302,7 @@ spellname = "charge" icon_state ="bookcharge" desc = "This book is made of 100% postconsumer wizard." - remarks = list("I feel ALIVE!", "I CAN TASTE THE MANA!", "What a RUSH!", "I'm FLYING through these pages!", "THIS GENIUS IS MAKING IT!", "This book is ACTION PAcKED!", "HE'S DONE IT", "LETS GOOOOOOOOOOOO") + remarks = list("I feel ALIVE!", "I CAN TASTE THE MANA!", "What a RUSH!", "I'm FLYING through these pages!", "THIS GENIUS IS MAKING IT!", "This book is ACTION PAcKED!", "HE'S DONE IT", "LETS GOOOOOOOOOOOO", "Just wait faster is all...") /obj/item/book/granter/spell/charge/recoil(mob/user) ..() diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 8b6f471e7d..cff7faadd8 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -35,8 +35,9 @@ H.dna.features["spines"] = pick(GLOB.spines_list) H.dna.features["body_markings"] = pick(GLOB.body_markings_list) H.dna.features["insect_wings"] = pick(GLOB.insect_wings_list) + H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list) H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list) H.update_body() H.update_hair() - H.update_body_parts() \ No newline at end of file + H.update_body_parts() diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 91fdc78d20..4e58a9cba5 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -413,9 +413,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) dat += "CLOSED" else dat += "UNKNOWN" - dat += "[GLOB.TAB][TicketHref("Refresh", ref_src)][GLOB.TAB][TicketHref("Re-Title", ref_src, "retitle")]" + dat += "[FOURSPACES][TicketHref("Refresh", ref_src)][FOURSPACES][TicketHref("Re-Title", ref_src, "retitle")]" if(state != AHELP_ACTIVE) - dat += "[GLOB.TAB][TicketHref("Reopen", ref_src, "reopen")]" + dat += "[FOURSPACES][TicketHref("Reopen", ref_src, "reopen")]" dat += "

Opened at: [GAMETIMESTAMP("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)" if(closed_at) dat += "
Closed at: [GAMETIMESTAMP("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)" @@ -423,7 +423,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(initiator) dat += "Actions: [FullMonty(ref_src)]
" else - dat += "DISCONNECTED[GLOB.TAB][ClosureLinks(ref_src)]
" + dat += "DISCONNECTED[FOURSPACES][ClosureLinks(ref_src)]
" dat += "
Log:

" for(var/I in _interactions) dat += "[I]
" diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index 3f2bd003a3..dc649025d2 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -539,10 +539,10 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", var/list/parts = list() parts += "The devil's true name is: [truename]" parts += "The devil's bans were:" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][ban]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][bane]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][obligation]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][banish]]" + parts += "[FOURSPACES][GLOB.lawlorify[LORE][ban]]" + parts += "[FOURSPACES][GLOB.lawlorify[LORE][bane]]" + parts += "[FOURSPACES][GLOB.lawlorify[LORE][obligation]]" + parts += "[FOURSPACES][GLOB.lawlorify[LORE][banish]]" return parts.Join("
") /datum/antagonist/devil/roundend_report() diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm index 7037ecae86..89d8de283a 100644 --- a/code/modules/antagonists/revenant/revenant_blight.dm +++ b/code/modules/antagonists/revenant/revenant_blight.dm @@ -11,9 +11,9 @@ viable_mobtypes = list(/mob/living/carbon/human) disease_flags = CURABLE permeability_mod = 1 - severity = DISEASE_SEVERITY_HARMFUL - var/stagedamage = 0 //Highest stage reached. + severity = DISEASE_SEVERITY_DANGEROUS var/finalstage = 0 //Because we're spawning off the cure in the final stage, we need to check if we've done the final stage's effects. + var/datum/mood_event/revenant_blight/depression /datum/disease/revblight/cure() if(affected_mob) @@ -21,12 +21,13 @@ if(affected_mob.dna && affected_mob.dna.species) affected_mob.dna.species.handle_mutant_bodyparts(affected_mob) affected_mob.dna.species.handle_hair(affected_mob) - to_chat(affected_mob, "You feel better.") + SEND_SIGNAL(affected_mob, COMSIG_CLEAR_MOOD_EVENT, "rev_blight") ..() /datum/disease/revblight/stage_act() if(!finalstage) - if(affected_mob.lying && prob(stage*6)) + if(affected_mob.lying && prob(stage*4)) + to_chat(affected_mob, "You feel better.") cure() return if(prob(stage*3)) @@ -34,10 +35,6 @@ affected_mob.confused += 8 affected_mob.adjustStaminaLoss(8) new /obj/effect/temp_visual/revenant(affected_mob.loc) - if(stagedamage < stage) - stagedamage++ - affected_mob.adjustToxLoss(stage*2) //should, normally, do about 30 toxin damage. - new /obj/effect/temp_visual/revenant(affected_mob.loc) if(prob(45)) affected_mob.adjustStaminaLoss(stage) ..() //So we don't increase a stage before applying the stage damage. @@ -46,9 +43,13 @@ if(prob(5)) affected_mob.emote("pale") if(3) + if(!depression) + depression = SEND_SIGNAL(affected_mob, COMSIG_ADD_MOOD_EVENT, "rev_blight", /datum/mood_event/revenant_blight) + SEND_SIGNAL(affected_mob, COMSIG_DECREASE_SANITY, 0.12, SANITY_CRAZY) if(prob(10)) affected_mob.emote(pick("pale","shiver")) if(4) + SEND_SIGNAL(affected_mob, COMSIG_DECREASE_SANITY, 0.18, SANITY_CRAZY) if(prob(15)) affected_mob.emote(pick("pale","shiver","cries")) if(5) @@ -56,12 +57,18 @@ finalstage = TRUE to_chat(affected_mob, "You feel like [pick("nothing's worth it anymore", "nobody ever needed your help", "nothing you did mattered", "everything you tried to do was worthless")].") affected_mob.adjustStaminaLoss(45) - new /obj/effect/temp_visual/revenant(affected_mob.loc) - if(affected_mob.dna && affected_mob.dna.species) + if(affected_mob.dna?.species) affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#1d2953") affected_mob.dna.species.handle_hair(affected_mob,"#1d2953") affected_mob.visible_message("[affected_mob] looks terrifyingly gaunt...", "You suddenly feel like your skin is wrong...") affected_mob.add_atom_colour("#1d2953", TEMPORARY_COLOUR_PRIORITY) - addtimer(CALLBACK(src, .proc/cure), 100) - else - return + new /obj/effect/temp_visual/revenant(affected_mob.loc) + addtimer(CALLBACK(src, .proc/curses), 150) + +/datum/disease/revblight/proc/curses() + if(QDELETED(affected_mob)) + return + affected_mob.playsound_local(affected_mob, 'sound/effects/curse5.ogg', 40, 1, -1) + to_chat(affected_mob, "You sense the terrific curse of a vengeful ghost befall upon you...") + affected_mob.apply_necropolis_curse(null, 7 MINUTES) //Once the blight has done its course without being cured beforehand, it will cast a necrocurse to compensate how underpowered it's. + cure() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ae6de5ba05..c6166ca970 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -95,6 +95,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) "ears" = "None", "wings" = "None", "frills" = "None", + "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", @@ -583,6 +584,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(mutant_category >= MAX_MUTANT_ROWS) dat += "" mutant_category = 0 + if("deco_wings" in pref_species.default_features) + if(!mutant_category) + dat += APPEARANCE_CATEGORY_COLUMN + + dat += "

Decorative wings

" + + dat += "[features["deco_wings"]]" if("insect_wings" in pref_species.default_features) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -1722,7 +1730,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) new_insect_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.insect_wings_list if(new_insect_wings) features["insect_wings"] = new_insect_wings - + + if("deco_wings") + var/new_deco_wings + new_deco_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.deco_wings_list + if(new_deco_wings) + features["deco_wings"] = new_deco_wings + if("insect_fluffs") var/new_insect_fluff new_insect_fluff = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.insect_fluffs_list diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index ebd135916c..94c1158885 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -352,6 +352,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_human_tail"] >> features["tail_human"] S["feature_human_ears"] >> features["ears"] S["feature_insect_wings"] >> features["insect_wings"] + S["feature_deco_wings"] >> features["deco_wings"] S["feature_insect_fluff"] >> features["insect_fluff"] //Custom names @@ -484,6 +485,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list) features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list) features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list) + features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list) features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list) joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole)) @@ -553,6 +555,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"]) WRITE_FILE(S["feature_lizard_legs"] , features["legs"]) WRITE_FILE(S["feature_insect_wings"] , features["insect_wings"]) + WRITE_FILE(S["feature_deco_wings"] , features["deco_wings"]) WRITE_FILE(S["feature_insect_fluff"] , features["insect_fluff"]) WRITE_FILE(S["feature_meat"] , features["meat_type"]) diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 878030bc5d..6dd6164d79 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -355,6 +355,14 @@ above_suit = TRUE armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5, "fire" = 0, "acid" = 25) +/obj/item/clothing/accessory/skullcodpiece/fake + name = "false codpiece" + desc = "A plastic ornament, intended to protect the important things in life. It's not very good at it." + icon_state = "skull" + item_color = "skull" + above_suit = TRUE + armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + ///////////////////// //Synda Accessories// ///////////////////// diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index af22ae3b96..c575c97901 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -1,5 +1,8 @@ // Normal strength +#define SINGULO_BEACON_DISTURBANCE 0.2 //singularity beacon also improve the odds of meteor waves and speed them up a little. +#define SINGULO_BEACON_MAX_DISTURBANCE 0.6 //maximum cap due to how meteor waves can be potentially round ending. + /datum/round_event_control/meteor_wave name = "Meteor Wave: Normal" typepath = /datum/round_event/meteor_wave @@ -18,6 +21,8 @@ /datum/round_event/meteor_wave/setup() announceWhen = 1 startWhen = rand(300, 600) //Yeah for SOME REASON this is measured in seconds and not deciseconds??? + if(GLOB.singularity_counter) + startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE) endWhen = startWhen + 60 @@ -52,7 +57,7 @@ kill() /datum/round_event/meteor_wave/announce(fake) - priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.", "Meteor Alert", 'sound/ai/meteors.ogg') + priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.[GLOB.singularity_counter ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely." : ""]", "Meteor Alert", 'sound/ai/meteors.ogg') /datum/round_event/meteor_wave/tick() if(ISMULTIPLE(activeFor, 3)) @@ -79,3 +84,6 @@ /datum/round_event/meteor_wave/catastrophic wave_name = "catastrophic" + +#undef SINGULO_BEACON_DISTURBANCE +#undef SINGULO_BEACON_MAX_DISTURBANCE diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 109f6e78e6..c273690571 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -183,8 +183,8 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico log_world("\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: [(src.owner.key ? src.owner.key : src.owner)] triggered JS error: [error]") //Global chat procs -/proc/to_chat(target, message, handle_whitespace=TRUE) - if(!target) +/proc/to_chat_immediate(target, message, handle_whitespace=TRUE) + if(!target || !message) return //Ok so I did my best but I accept that some calls to this will be for shit like sound and images @@ -206,7 +206,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico message = replacetext(message, "\proper", "") if(handle_whitespace) message = replacetext(message, "\n", "
") - message = replacetext(message, "\t", "[GLOB.TAB][GLOB.TAB]") + message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]") if(islist(target)) // Do the double-encoding outside the loop to save nanoseconds @@ -248,3 +248,15 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico // url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript. C << output(url_encode(url_encode(message)), "browseroutput:output") + +/proc/to_chat(target, message, handle_whitespace = TRUE) + if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized) + to_chat_immediate(target, message, handle_whitespace) + return + SSchat.queue(target, message, handle_whitespace) + +/datum/chatOutput/proc/swaptolightmode() //Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation) + owner.force_white_theme() + +/datum/chatOutput/proc/swaptodarkmode() + owner.force_dark_theme() diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index f0b7c18b28..8cfe2c31c3 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -315,6 +315,8 @@ return "Your account is not old enough for [jobtitle]." if(JOB_UNAVAILABLE_SLOTFULL) return "[jobtitle] is already filled to capacity." + if(JOB_UNAVAILABLE_SPECIESLOCK) + return "Your species cannot play as a [jobtitle]." return "Error: Unknown job availability." /mob/dead/new_player/proc/IsJobUnavailable(rank, latejoin = FALSE) @@ -340,6 +342,8 @@ return JOB_UNAVAILABLE_PLAYTIME if(latejoin && !job.special_check_latejoin(client)) return JOB_UNAVAILABLE_GENERIC + if(!client.prefs.pref_species.qualifies_for_rank(rank, client.prefs.features)) + return JOB_UNAVAILABLE_SPECIESLOCK return JOB_AVAILABLE /mob/dead/new_player/proc/AttemptLateSpawn(rank) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm index dc0e0222bf..aaffc0389d 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/wings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/wings.dm @@ -27,6 +27,85 @@ dimension_y = 34 locked = TRUE +// Decorative wings +/datum/sprite_accessory/deco_wings + icon = 'icons/mob/wings.dmi' + +/datum/sprite_accessory/deco_wings/plain + name = "Plain" + icon_state = "plain" + +/datum/sprite_accessory/deco_wings/monarch + name = "Monarch" + icon_state = "monarch" + +/datum/sprite_accessory/deco_wings/luna + name = "Luna" + icon_state = "luna" + +/datum/sprite_accessory/deco_wings/atlas + name = "Atlas" + icon_state = "atlas" + +/datum/sprite_accessory/deco_wings/reddish + name = "Reddish" + icon_state = "redish" + +/datum/sprite_accessory/deco_wings/royal + name = "Royal" + icon_state = "royal" + +/datum/sprite_accessory/deco_wings/gothic + name = "Gothic" + icon_state = "gothic" + +/datum/sprite_accessory/deco_wings/lovers + name = "Lovers" + icon_state = "lovers" + +/datum/sprite_accessory/deco_wings/whitefly + name = "White Fly" + icon_state = "whitefly" + +/datum/sprite_accessory/deco_wings/punished + name = "Burnt Off" + icon_state = "punished" + locked = TRUE + +/datum/sprite_accessory/deco_wings/firewatch + name = "Firewatch" + icon_state = "firewatch" + +/datum/sprite_accessory/deco_wings/deathhead + name = "Deathshead" + icon_state = "deathhead" + +/datum/sprite_accessory/deco_wings/poison + name = "Poison" + icon_state = "poison" + +/datum/sprite_accessory/deco_wings/ragged + name = "Ragged" + icon_state = "ragged" + +/datum/sprite_accessory/deco_wings/moonfly + name = "Moon Fly" + icon_state = "moonfly" + +/datum/sprite_accessory/deco_wings/snow + name = "Snow" + icon_state = "snow" + + +/datum/sprite_accessory/deco_wings/angel + name = "Angel" + icon_state = "angel" + +/datum/sprite_accessory/deco_wings/none + name = "None" + icon_state = "none" + + //INSECT WINGS /datum/sprite_accessory/insect_wings diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index f60b419c2e..06f839525a 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -764,6 +764,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) S = GLOB.wings_list[H.dna.features["wings"]] if("wingsopen") S = GLOB.wings_open_list[H.dna.features["wings"]] + if("deco_wings") + S = GLOB.deco_wings_list[H.dna.features["deco_wings"]] if("legs") S = GLOB.legs_list[H.dna.features["legs"]] if("insect_wings") diff --git a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm index 64f06d240b..17911d040c 100644 --- a/code/modules/mob/living/carbon/human/species_types/furrypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/furrypeople.dm @@ -5,8 +5,8 @@ should_draw_citadel = TRUE species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR) inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID) - mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "taur", "horns", "legs") - default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", + mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "mam_snouts", "deco_wings", "taur", "horns", "legs") + default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None", "mam_body_markings" = "Husky", "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian") attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 249ed56d20..afe48ab3fb 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -404,3 +404,25 @@ /obj/item/reagent_containers/glass/bottle/bromine name = "bromine bottle" list_reagents = list("bromine" = 30) + +//Lewd Stuff + +/obj/item/reagent_containers/glass/bottle/crocin + name = "Crocin bottle" + desc = "A bottle of mild aphrodisiac. Increases libido." + list_reagents = list("aphro" = 30) + +/obj/item/reagent_containers/glass/bottle/hexacrocin + name = "Hexacrocin bottle" + desc = "A bottle of strong aphrodisiac. Increases libido." + list_reagents = list("aphro+" = 30) + +/obj/item/reagent_containers/glass/bottle/camphor + name = "Camphor bottle" + desc = "A bottle of mild anaphrodisiac. Reduces libido." + list_reagents = list("anaphro" = 30) + +/obj/item/reagent_containers/glass/bottle/hexacamphor + name = "Hexacamphor bottle" + desc = "A bottle of strong anaphrodisiac. Reduces libido." + list_reagents = list("anaphro+" = 30) \ No newline at end of file diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm index 66a5344d6c..1113f11e87 100644 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ b/code/modules/research/nanites/nanite_programs/healing.dm @@ -72,8 +72,10 @@ /datum/nanite_program/brain_heal/check_conditions() if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob - if(length(C.get_traumas())) - return ..() + for(var/X in C.get_traumas()) + var/datum/brain_trauma/BT = X + if(BT.resilience <= TRAUMA_RESILIENCE_BASIC) + return ..() if(host_mob.getOrganLoss(ORGAN_SLOT_BRAIN)) return ..() return FALSE @@ -193,8 +195,10 @@ /datum/nanite_program/brain_heal_advanced/check_conditions() if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob - if(length(C.get_traumas())) - return ..() + for(var/X in C.get_traumas()) + var/datum/brain_trauma/BT = X + if(BT.resilience <= TRAUMA_RESILIENCE_LOBOTOMY) + return ..() if(host_mob.getOrganLoss(ORGAN_SLOT_BRAIN)) return ..() return FALSE diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 23b4581600..61af0eaf78 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1490,9 +1490,10 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/device_tools/singularity_beacon name = "Power Beacon" desc = "When screwed to wiring attached to an electric grid and activated, this large device pulls any \ - active gravitational singularities or tesla balls towards it. This will not work when the engine is still \ - in containment. Because of its size, it cannot be carried. Ordering this \ - sends you a small beacon that will teleport the larger beacon to your location upon activation." + active gravitational singularities or tesla balls towards it (provided they are not safely \ + contained), as well as increasing the odds of incoming meteor waves. \ + Because of its size, it cannot be carried. Ordering this sends you a small beacon \ + that will teleport the larger beacon to your location upon activation." item = /obj/item/sbeacondrop cost = 14 diff --git a/html/changelogs/AutoChangeLog-pr-9339.yml b/html/changelogs/AutoChangeLog-pr-9339.yml new file mode 100644 index 0000000000..eeb5ae632c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9339.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - balance: "Removes revenant blight's shabby toxin damage in favor of mood maluses, and a dangerous necropolis curse if not cured in time. Remember" diff --git a/html/changelogs/AutoChangeLog-pr-9416.yml b/html/changelogs/AutoChangeLog-pr-9416.yml new file mode 100644 index 0000000000..cf36873498 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9416.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Singularity beacons now also moderately increases the odds meteor waves, while lowering their estimeed arrival countdown." diff --git a/html/changelogs/AutoChangeLog-pr-9461.yml b/html/changelogs/AutoChangeLog-pr-9461.yml new file mode 100644 index 0000000000..91288f23fe --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9461.yml @@ -0,0 +1,4 @@ +author: "r4d6" +delete-after: True +changes: + - rscadd: "Added decoratives angel wings for Mammalians only" diff --git a/html/changelogs/AutoChangeLog-pr-9463.yml b/html/changelogs/AutoChangeLog-pr-9463.yml new file mode 100644 index 0000000000..3a465c5a05 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9463.yml @@ -0,0 +1,6 @@ +author: "Owai-Seek" +delete-after: True +changes: + - rscadd: "false codpiece" + - rscadd: "crocin/camphor bottles" + - tweak: "updated kinkmate item list" diff --git a/html/changelogs/AutoChangeLog-pr-9464.yml b/html/changelogs/AutoChangeLog-pr-9464.yml new file mode 100644 index 0000000000..79a5960abd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9464.yml @@ -0,0 +1,4 @@ +author: "JTGSZ" +delete-after: True +changes: + - bugfix: "qualifies_for_rank now checks latejoin menu" diff --git a/html/changelogs/AutoChangeLog-pr-9473.yml b/html/changelogs/AutoChangeLog-pr-9473.yml new file mode 100644 index 0000000000..def08d4acd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9473.yml @@ -0,0 +1,4 @@ +author: "PersianXerxes" +delete-after: True +changes: + - code_imp: "Adds the clockwork_warp_allowed flag to the Captain's Office area, set to FALSE the same way it is for the chapel and armory." diff --git a/html/changelogs/AutoChangeLog-pr-9474.yml b/html/changelogs/AutoChangeLog-pr-9474.yml new file mode 100644 index 0000000000..1e3737f1a5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9474.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - bugfix: "neural nanites only work/drain if you have brain damage or traumas the nanites can fix" diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm index 2de98a3171..6a91810173 100755 --- a/modular_citadel/code/game/machinery/vending.dm +++ b/modular_citadel/code/game/machinery/vending.dm @@ -43,18 +43,33 @@ vend_reply = "Have fun, you shameless pervert!" products = list( /obj/item/clothing/under/maid = 5, - /obj/item/clothing/under/stripper_pink = 5, - /obj/item/clothing/under/stripper_green = 5, - /obj/item/dildo/custom = 5 - ) - contraband = list(/obj/item/restraints/handcuffs/fake/kinky = 5, /obj/item/clothing/neck/petcollar = 5, - /obj/item/clothing/under/mankini = 1, - /obj/item/dildo/flared/huge = 1 + /obj/item/clothing/neck/petcollar/choker = 5, + /obj/item/clothing/neck/petcollar/leather = 5, + /obj/item/restraints/handcuffs/fake/kinky = 5, + /obj/item/clothing/glasses/sunglasses/blindfold = 4, + /obj/item/clothing/mask/muzzle = 4, + /obj/item/clothing/under/stripper_pink = 3, + /obj/item/clothing/under/stripper_green = 3, + /obj/item/dildo/custom = 5, + /obj/item/electropack/shockcollar = 3, + /obj/item/assembly/signaler = 3 + ) + contraband = list( + /obj/item/clothing/neck/petcollar/locked = 2, + /obj/item/key/collar = 2, + /obj/item/clothing/head/kitty = 3, + /obj/item/clothing/head/rabbitears = 3, + /obj/item/clothing/under/mankini = 2, + /obj/item/clothing/under/jabroni = 2, + /obj/item/dildo/flared/huge = 3, + /obj/item/reagent_containers/glass/bottle/crocin = 5, + /obj/item/reagent_containers/glass/bottle/camphor = 5 ) premium = list( - /obj/item/electropack/shockcollar = 3, - /obj/item/clothing/neck/petcollar/locked = 1 + /obj/item/clothing/accessory/skullcodpiece/fake = 3, + /obj/item/clothing/under/gear_harness = 10, + /obj/item/reagent_containers/glass/bottle/hexacrocin = 10 ) refill_canister = /obj/item/vending_refill/kink /* diff --git a/tgstation.dme b/tgstation.dme index 967dfb9951..2037726c14 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -230,6 +230,7 @@ #include "code\controllers\subsystem\atoms.dm" #include "code\controllers\subsystem\augury.dm" #include "code\controllers\subsystem\blackbox.dm" +#include "code\controllers\subsystem\chat.dm" #include "code\controllers\subsystem\communications.dm" #include "code\controllers\subsystem\dbcore.dm" #include "code\controllers\subsystem\dcs.dm"