diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index b6d1b771..cfb90f13 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -217,3 +217,12 @@ #define RULE_OF_THREE(a, b, x) ((a*x)/b) // ) + +#define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y)) + +#define LOGISTIC_FUNCTION(L,k,x,x_0) (L/(1+(NUM_E**(-k*(x-x_0))))) + +/// Make sure something is a boolean TRUE/FALSE 1/0 value, since things like bitfield & bitflag doesn't always give 1s and 0s. +#define FORCE_BOOLEAN(x) ((x)? TRUE : FALSE) + +#define TILES_TO_PIXELS(tiles) (tiles * PIXELS) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index c7284dc4..a0aa5e6b 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -158,6 +158,15 @@ #define NUTRITION_LEVEL_START_MIN 250 #define NUTRITION_LEVEL_START_MAX 400 +//Hyperstation Thirst +#define THIRST_LEVEL_THRESHOLD 800 //Set to 0 to stop clamping +#define THIRST_LEVEL_QUENCHED 450 +#define THIRST_LEVEL_THIRSTY 250 +#define THIRST_LEVEL_PARCHED 150 + +#define THIRST_LEVEL_START_MIN 250 +#define THIRST_LEVEL_START_MAX 400 + //Disgust levels for humans #define DISGUST_LEVEL_MAXEDOUT 150 #define DISGUST_LEVEL_DISGUSTED 75 diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index dbce0072..4cda20f1 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -306,14 +306,16 @@ add_event(null, "nutrition", /datum/mood_event/starving) /datum/component/mood/proc/HandleThirst(mob/living/L) + if(THIRST_LEVEL_THRESHOLD) + L.thirst = clamp(L.thirst, 0, THIRST_LEVEL_THRESHOLD) switch(L.thirst) - if(NUTRITION_LEVEL_WELL_FED to INFINITY) + if(THIRST_LEVEL_QUENCHED to INFINITY) add_event(null, "thirst", /datum/mood_event/quenched) - if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_WELL_FED) + if(THIRST_LEVEL_THIRSTY to THIRST_LEVEL_QUENCHED) clear_event(null, "thirst") - if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) + if(THIRST_LEVEL_PARCHED to THIRST_LEVEL_THIRSTY) add_event(null, "thirst", /datum/mood_event/thirsty) - if(0 to NUTRITION_LEVEL_STARVING) + if(0 to THIRST_LEVEL_PARCHED) add_event(null, "thirst", /datum/mood_event/dehydrated) #undef MINOR_INSANITY_PEN diff --git a/code/modules/antagonists/nightmare/nightmare.dm b/code/modules/antagonists/nightmare/nightmare.dm index 41a3f181..847ceeb6 100644 --- a/code/modules/antagonists/nightmare/nightmare.dm +++ b/code/modules/antagonists/nightmare/nightmare.dm @@ -1,4 +1,21 @@ +#define LIGHTSTOBREAK_MINIMUM 25 +#define LIGHTSTOBREAK_MAXIMUM 75 +#define LIGHTSTOBREAK_THRESHOLD 50 +#define LIGHTSTOBREAK_MAX_CHANCE 50 +#define LIGHTSTOBREAK_AREA_MIN 1 +#define LIGHTSTOBREAK_AREA_MAX 2 + /datum/antagonist/nightmare name = "Nightmare" show_in_antagpanel = FALSE - show_name_in_check_antagonists = TRUE \ No newline at end of file + show_name_in_check_antagonists = TRUE + +/datum/antagonist/nightmare/on_gain() + owner.objectives += forge_objective() + owner.objectives += new /datum/objective/survive + +/datum/antagonist/nightmare/proc/forge_objective() + var/datum/objective/break_lights/O = new + O.mode = prob(50) ? TRUE : FALSE + antag_memory = "Objectives:
1.
[O.apply_rules()]
2. Stay alive until the end." + return O diff --git a/code/modules/antagonists/nightmare/nightmare_objectives.dm b/code/modules/antagonists/nightmare/nightmare_objectives.dm new file mode 100644 index 00000000..dbcadc5e --- /dev/null +++ b/code/modules/antagonists/nightmare/nightmare_objectives.dm @@ -0,0 +1,105 @@ +/datum/objective/break_lights + var/mode = FALSE //If true, break all lights in determined area + var/list/area_targets = list() //Which areas we have to keep lights broken + target_amount = LIGHTSTOBREAK_AREA_MIN + var/lightsbroken = 0 + + var/safe_areas = list( + /area/space, + /area/maintenance/solars, + /area/maintenance/central, //HOP/Conference room APC + /area/ai_monitored, + /area/shuttle, + /area/engine/engine_smes, + /area/security/prison, //If you get unlucky, you'll have to break the lights in armory + /area/security/execution) + +/datum/objective/break_lights/proc/apply_rules() + if(mode) + var/list/valid_areas = list() + for(var/obj/machinery/power/apc/C in GLOB.apcs_list) + if(C.cell && is_station_level(C.z)) + var/is_safearea = 1 + for(var/A in safe_areas) + if(istype(C.area, A)) + is_safearea = 0 + break + if(is_safearea) + valid_areas += C.area + var/I = rand(LIGHTSTOBREAK_AREA_MIN, LIGHTSTOBREAK_AREA_MAX) + for(var/N in 1 to I) + var/area2add = pick(valid_areas) + if(!locate(area2add) in area_targets) + area_targets += area2add + else + target_amount = rand(LIGHTSTOBREAK_MINIMUM, LIGHTSTOBREAK_MAXIMUM) + if(prob(LIGHTSTOBREAK_MAX_CHANCE)) + if(target_amount > LIGHTSTOBREAK_THRESHOLD) + target_amount = LIGHTSTOBREAK_MAXIMUM + else if(target_amount > LIGHTSTOBREAK_THRESHOLD) + target_amount = LIGHTSTOBREAK_THRESHOLD + explanation_text = update_explanation_text() + return explanation_text + +/datum/objective/break_lights/update_explanation_text() + ..() + if(mode) + if(!area_targets.len) + return "Uh oh! Something broke! Report this." + . += "There must not be any light sources in the " + if(area_targets.len == 1) + var/area/A = area_targets[1] + . += "[A.name]" + else if(area_targets.len == 2) + var/area/A = area_targets[1] + var/area/B = area_targets[2] + . += "[A.name] and [B.name]" + else //Won't get here because of define values, but during development you can get here. leaving this here for future purposes + var/i = 1 + for(var/area/A in area_targets) + if(i != area_targets.len) . += "[A.name], " + else . += "and [A.name]" + + . += " before the end." + else + . += "Break at least [target_amount] lights with your light eater." + +/datum/objective/break_lights/check_completion() + if(completed) + return TRUE //An attempt to stop this from being called twice + if(!mode) + if(lightsbroken >= target_amount) + completed = TRUE + else + var/list/valid_turfs = list() + for(var/area/target in area_targets) + var/list/cached_area = get_area_turfs(target.type) + for(var/turf/A in cached_area) + if(!is_station_level(A.z)) + continue + valid_turfs += A + for(var/turf/T in valid_turfs) + for(var/atom/C in T.contents) + /*if(!C?.visibility) //Doesn't compile, add this another time + continue*/ + if(C.light_range > 0) + if(C.light_power <= SHADOW_SPECIES_LIGHT_THRESHOLD*2) //Give some leniency for not destroying that unbreakable requests console + completed = TRUE + else + completed = FALSE + break + if(!completed) + break + + return completed + +/datum/objective/break_lights/area + mode = TRUE + + +#undef LIGHTSTOBREAK_MINIMUM +#undef LIGHTSTOBREAK_MAXIMUM +#undef LIGHTSTOBREAK_THRESHOLD +#undef LIGHTSTOBREAK_MAX_CHANCE +#undef LIGHTSTOBREAK_AREA_MIN +#undef LIGHTSTOBREAK_AREA_MAX diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index 0d9b2a64..9fd0850f 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -89,6 +89,7 @@ if(!panel_open) return anchored = !anchored + move_resist = anchored? INFINITY : 100 I.play_tool_sound(src) if(generator) disconnectFromGenerator() diff --git a/code/modules/cargo/packs/engine.dm b/code/modules/cargo/packs/engine.dm index fd5c711b..44eb0ad5 100644 --- a/code/modules/cargo/packs/engine.dm +++ b/code/modules/cargo/packs/engine.dm @@ -169,12 +169,22 @@ crate_name = "tesla generator crate" /datum/supply_pack/engine/teg - name = "Thermoelectric Generator" - desc = "Contains your very own Thermoelectric Generator. Time to turn cargo into a blazing hellfire, perhaps?" - cost = 4000 - contains = list(/obj/machinery/power/generator) + name = "Thermoelectric Generator Assembly" + desc = "Contains your very own Thermoelectric Generator Assembly. Time to turn cargo into a blazing hellfire, perhaps?" + cost = 3000 + contains = list(/obj/item/paper/teg, + /obj/item/circuitboard/machine/generator, + /obj/item/circuitboard/machine/circulator, + /obj/item/circuitboard/machine/circulator, + /obj/item/stack/cable_coil, + /obj/item/stack/sheet/metal/twenty) crate_name = "thermoelectric generator crate" +/obj/item/paper/teg + info = "*The seemingly useful notes have been scribbled over with red and black crayon. Hmm.*" + name = "TEG Instructions" + color = "red" + /datum/supply_pack/engine/energy_harvester name = "Energy Harvesting Module" desc = "A Device which upon connection to a node, will harvest the energy and send it to engineerless stations in return for credits, derived from a syndicate powersink model." diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index c734538f..68b49284 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -10,16 +10,8 @@ /datum/round_event/anomaly/anomaly_bluespace/announce(fake) - if(prob(90)) - priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Unstable bluespace anomaly" - P.info = "Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + priority_announce("Unstable bluespace anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") + /datum/round_event/anomaly/anomaly_bluespace/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm index 5fab4be6..9e7df034 100644 --- a/code/modules/events/anomaly_flux.dm +++ b/code/modules/events/anomaly_flux.dm @@ -11,16 +11,7 @@ announceWhen = 3 /datum/round_event/anomaly/anomaly_flux/announce(fake) - if(prob(90)) - priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Localized hyper-energetic flux wave" - P.info = "Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + priority_announce("Localized hyper-energetic flux wave detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") /datum/round_event/anomaly/anomaly_flux/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm index 5650b423..45c94232 100644 --- a/code/modules/events/anomaly_grav.dm +++ b/code/modules/events/anomaly_grav.dm @@ -9,16 +9,7 @@ announceWhen = 20 /datum/round_event/anomaly/anomaly_grav/announce(fake) - if(prob(90)) - priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Gravitational anomaly" - P.info = "Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") /datum/round_event/anomaly/anomaly_grav/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm index 5a973db9..85da9ca6 100644 --- a/code/modules/events/anomaly_pyro.dm +++ b/code/modules/events/anomaly_pyro.dm @@ -9,16 +9,7 @@ announceWhen = 10 /datum/round_event/anomaly/anomaly_pyro/announce(fake) - if(prob(90)) - priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Pyroclastic anomaly" - P.info = "Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + priority_announce("Pyroclastic anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert") /datum/round_event/anomaly/anomaly_pyro/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm index f570dc04..b4119892 100644 --- a/code/modules/events/anomaly_vortex.dm +++ b/code/modules/events/anomaly_vortex.dm @@ -11,16 +11,7 @@ announceWhen = 3 /datum/round_event/anomaly/anomaly_vortex/announce(fake) - if(prob(90)) - priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Vortex anomaly" - P.info = "Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]." - P.update_icon() + priority_announce("Localized high-intensity vortex anomaly detected on long range scanners. Expected location: [impact_area.name]", "Anomaly Alert") /datum/round_event/anomaly/anomaly_vortex/start() var/turf/T = safepick(get_area_turfs(impact_area)) diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm index b941a978..a32532d1 100644 --- a/code/modules/events/aurora_caelus.dm +++ b/code/modules/events/aurora_caelus.dm @@ -12,10 +12,11 @@ /datum/round_event/aurora_caelus announceWhen = 1 - startWhen = 9 + startWhen = 8 //Delayed with sleep() endWhen = 50 var/list/aurora_colors = list("#ffd980", "#eaff80", "#eaff80", "#ffd980", "#eaff80", "#A2FFC7", "#9400D3", "#FFC0CB") var/aurora_progress = 0 //this cycles from 1 to 8, slowly changing colors from gentle green to gentle blue + var/list/applicable_areas = list() /datum/round_event/aurora_caelus/announce() priority_announce("[station_name()]: A harmless cloud of ions is approaching your station, and will exhaust their energy battering the hull. Kinaris Command has approved a short break for all employees to relax and observe this very rare event. During this time, starlight will be bright but gentle, shifting between quiet green and blue colors. We will also play quiet music for you to enjoy and relax. Any staff who would like to view these lights for themselves may proceed to the area nearest to them with viewing ports to open space. We hope you enjoy the lights.", @@ -25,38 +26,67 @@ var/mob/M = V if((M.client.prefs.toggles & SOUND_MIDI) && is_station_level(M.z)) M.playsound_local(M, 'sound/ambience/aurora_caelus_new.ogg', 40, FALSE, pressure_affected = FALSE) //ogg is "The Fire is Gone" by Heaven Pierce Her, used in the videogame ULTRAKILL. All respects and credits to the equivalent artists who worked on it. + start_checking() + +/datum/round_event/aurora_caelus/proc/start_checking() + var/list/turfs_to_check = list() + var/x = 1 + var/y = 1 + while(TRUE) + turfs_to_check += locate(x,y,2) //If the station z-level ever gets changed, change this too. I couldn't find if there's an easy way to get it + x++ + if(x > 255) + x = 0 + y++ + if(y > 255) + break + if(!turfs_to_check) + CRASH("Aurora Caelus called, but there's no space!") + var/tlen = turfs_to_check.len + var/i = 0 + while(i < tlen) + i++ + var/turf/T = turfs_to_check[i] + if(!istype(T, /turf/open/space)) + continue + if(i%2500 == 0) + sleep(1) //try to spread the lag around a bit + var/sure = (!istype(get_step(T, NORTH)?.loc, /area/space)||\ + !istype(get_step(T, NORTHEAST)?.loc, /area/space)||\ + !istype(get_step(T, EAST)?.loc, /area/space)||\ + !istype(get_step(T, SOUTHEAST)?.loc, /area/space)||\ + !istype(get_step(T, SOUTH)?.loc, /area/space)||\ + !istype(get_step(T, SOUTHWEST)?.loc, /area/space)||\ + !istype(get_step(T, WEST)?.loc, /area/space)||\ + !istype(get_step(T, NORTHWEST)?.loc, /area/space)) //Better than using range() + if(sure) + applicable_areas += T /datum/round_event/aurora_caelus/start() - for(var/area in GLOB.sortedAreas) - var/area/A = area - if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) - for(var/turf/open/space/S in A) - S.set_light(S.light_range * 6, S.light_power * 1) + for(var/turf/S in applicable_areas) + S.set_light(6, 0.8, l_color = aurora_colors[1]) /datum/round_event/aurora_caelus/tick() if(activeFor % 5 == 0) aurora_progress++ + if(aurora_progress > LAZYLEN(aurora_colors)) + aurora_progress = 1 var/aurora_color = aurora_colors[aurora_progress] - for(var/area in GLOB.sortedAreas) - var/area/A = area - if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) - for(var/turf/open/space/S in A) - S.set_light(l_color = aurora_color) + for(var/turf/S in applicable_areas) + S.set_light(l_color = aurora_color) /datum/round_event/aurora_caelus/end() - for(var/area in GLOB.sortedAreas) - var/area/A = area - if(initial(A.dynamic_lighting) == DYNAMIC_LIGHTING_IFSTARLIGHT) - for(var/turf/open/space/S in A) - fade_to_black(S) priority_announce("The aurora caelus event is now ending. Starlight conditions will slowly return to normal. When this has concluded, please return to your workplace and continue work as normal. Have a pleasant shift, [station_name()], and thank you for watching with us.", - sound = 'sound/misc/notice2.ogg', - sender_override = "Kinaris Meteorology Division") + sound = 'sound/misc/notice2.ogg', + sender_override = "Kinaris Meteorology Division") + for(var/S in applicable_areas) + fade_to_black(S) /datum/round_event/aurora_caelus/proc/fade_to_black(turf/open/space/S) set waitfor = FALSE - var/new_light = initial(S.light_range) - while(S.light_range > new_light) - S.set_light(S.light_range - 0.2) - sleep(30) - S.set_light(new_light, initial(S.light_power), initial(S.light_color)) + var/i = 0.8 + while(i>0) + S.set_light(l_power=i) + sleep(10) + i -= 0.05 //16 seconds + S.set_light(initial(S.light_range), initial(S.light_power), initial(S.light_color)) diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 97e52f72..3dee0f8e 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -35,16 +35,8 @@ source = initial(example.name) else if(originMachine) source = originMachine.name - if(prob(50)) - priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Machine Learning Alert") - else - priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/ai/commandreport.ogg') // CITADEL EDIT metabreak - for(var/obj/machinery/computer/communications/C in GLOB.machines) - if(!(C.stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) - var/obj/item/paper/P = new(C.loc) - P.name = "Rampant brand intelligence" - P.info = "Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source]." - P.update_icon() + priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", "Machine Learning Alert") + /datum/round_event/brand_intelligence/start() for(var/obj/machinery/vending/V in GLOB.machines) if(!is_station_level(V.z)) diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm index bd01b9b4..e1844e23 100644 --- a/code/modules/events/spider_infestation.dm +++ b/code/modules/events/spider_infestation.dm @@ -16,7 +16,7 @@ spawncount = rand(5, 8) /datum/round_event/spider_infestation/announce(fake) - priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/ai/aliens.ogg') + priority_announce("Unidentified lifesigns detected aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", 'sound/ai/aliens.ogg') /datum/round_event/spider_infestation/start() diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 473267fc..f807a491 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -885,7 +885,7 @@ id = /datum/reagent/consumable/ethanol/hotlime_miami results = list(/datum/reagent/consumable/ethanol/hotlime_miami = 2) required_reagents = list(/datum/reagent/medicine/ephedrine = 1, /datum/reagent/consumable/ethanol/pina_colada = 1) - + /datum/chemical_reaction/commander_and_chief name = "Commander and Chief" id = /datum/reagent/consumable/ethanol/commander_and_chief @@ -899,3 +899,15 @@ results = list(/datum/reagent/consumable/wockyslush = 5) required_reagents = list(/datum/reagent/toxin/fentanyl = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/lemon_lime = 1) mix_message = "That thang bleedin’ P!" + +/datum/chemical_reaction/cum_in_a_hot_tub + name = "Cum in a Hot Tub" + id = /datum/reagent/consumable/ethanol/cum_in_a_hot_tub + results = list(/datum/reagent/consumable/ethanol/cum_in_a_hot_tub = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/ethanol/white_russian = 1, /datum/reagent/consumable/ethanol/irish_cream = 0.1) + +/datum/chemical_reaction/cum_in_a_hot_tub/semen + name = "Cum in a Hot Tub" + id = /datum/reagent/consumable/ethanol/cum_in_a_hot_tub/semen + results = list(/datum/reagent/consumable/ethanol/cum_in_a_hot_tub/semen = 3) + required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/semen = 1, /datum/reagent/consumable/ethanol/irish_cream = 0.1) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 4b04639b..a5e55ea5 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -44,7 +44,7 @@ //Blood regeneration if there is some space if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio) && !HAS_TRAIT(src, TRAIT_NOHUNGER)) var/nutrition_ratio = 0 - var/thirst_ratio = 1 + //thirst_ratio = 1 //Uncomment if something fancy gets added switch(nutrition) if(0 to NUTRITION_LEVEL_STARVING) nutrition_ratio = 0.2 @@ -61,7 +61,7 @@ if(satiety > 80) nutrition_ratio *= 1.25 nutrition = max(0, nutrition - nutrition_ratio * HUNGER_FACTOR) - thirst = max(0, thirst - thirst_ratio * THIRST_FACTOR) + thirst = max(0, thirst - 0.8 * THIRST_FACTOR) blood_volume = min((BLOOD_VOLUME_NORMAL * blood_ratio), blood_volume + 0.5 * nutrition_ratio) //Effects of bloodloss diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 93d3e1db..fcf85505 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -44,4 +44,4 @@ thirst -= THIRST_FACTOR/12 if(m_intent == MOVE_INTENT_RUN) nutrition -= HUNGER_FACTOR/5 - thirst -= THIRST_FACTOR/5 //running around depleats thirst more so. \ No newline at end of file + thirst -= THIRST_FACTOR/5 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b8b62a8b..343cf07c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -82,6 +82,18 @@ if(changeling) sList2 += "Chemical Storage: " + "[changeling.chem_charges]/[changeling.chem_storage]" sList2 += "Absorbed DNA: "+ "[changeling.absorbedcount]" + var/datum/antagonist/nightmare/nightmare = mind.has_antag_datum(/datum/antagonist/nightmare) + if(nightmare) + for(var/datum/objective/O in mind.objectives) + if(istype(O, /datum/objective/break_lights)) + var/datum/objective/break_lights/BL = O + if(BL.mode) //Keeping lights out of areas + var/T = "Target Area(s): " + for(var/area/I in BL.area_targets) + T += "[initial(I.name)], " + sList2 += T + else //Break number of lights + sList2 += "Lights Broken: " + "[BL.lightsbroken]/[BL.target_amount]" if (sList2 != null) stat(null, "[sList2.Join("\n\n")]") diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 643161bd..058dfd86 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1243,7 +1243,6 @@ GLOBAL_LIST_EMPTY(roundstart_races) if (H.nutrition > 0 && H.stat != DEAD && !HAS_TRAIT(H, TRAIT_NOHUNGER)) // THEY HUNGER var/hunger_rate = HUNGER_FACTOR - var/thirst_rate = THIRST_FACTOR var/datum/component/mood/mood = H.GetComponent(/datum/component/mood) if(mood && mood.sanity > SANITY_DISTURBED) hunger_rate *= max(0.5, 1 - 0.002 * mood.sanity) //0.85 to 0.75 @@ -1262,7 +1261,6 @@ GLOBAL_LIST_EMPTY(roundstart_races) hunger_rate = 3 * HUNGER_FACTOR hunger_rate *= H.physiology.hunger_mod H.nutrition = max(0, H.nutrition - hunger_rate) - H.thirst = max(0, H.thirst - thirst_rate) if (H.nutrition > NUTRITION_LEVEL_FULL) @@ -1298,14 +1296,23 @@ GLOBAL_LIST_EMPTY(roundstart_races) if(0 to NUTRITION_LEVEL_STARVING) H.throw_alert("nutrition", /obj/screen/alert/starving) +/datum/species/proc/handle_thirst(mob/living/carbon/human/H) + if(HAS_TRAIT(src, TRAIT_NOTHIRST)) + return + + //Put more things here if you plan on adding more things. I know this proc is a bit empty at the moment + H.thirst -= THIRST_FACTOR + + switch(H.thirst) - if(NUTRITION_LEVEL_HUNGRY to INFINITY) + if(THIRST_LEVEL_THIRSTY to INFINITY) H.clear_alert("thirst") - if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) + if(THIRST_LEVEL_PARCHED to THIRST_LEVEL_THIRSTY) H.throw_alert("thirst", /obj/screen/alert/thirsty) - if(0 to NUTRITION_LEVEL_STARVING) + if(0 to THIRST_LEVEL_PARCHED) H.throw_alert("thirst", /obj/screen/alert/dehydrated) + /datum/species/proc/update_health_hud(mob/living/carbon/human/H) return 0 diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 3c716fa1..b1d2f5e1 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -183,9 +183,14 @@ . = ..() if(!proximity) return - if(isopenturf(AM)) //So you can actually melee with it + if(isopenturf(AM) && !istype(AM, /turf/open/space) && !istype(AM, /turf/open/lava)) + var/turf/T = AM + if(T.light_power || T.light_range) + to_chat(user, "[src] consumes the lights in [AM].") + T.set_light(0,0) + else if(isopenturf(AM)) return - if(isliving(AM)) + else if(isliving(AM)) var/mob/living/L = AM if(iscyborg(AM)) var/mob/living/silicon/robot/borg = AM @@ -194,20 +199,40 @@ to_chat(borg, "Your headlamp is fried! You'll need a human to help replace it.") else for(var/obj/item/O in AM) - if(O.light_range && O.light_power) - disintegrate(O) - if(L.pulling && L.pulling.light_range && isitem(L.pulling)) - disintegrate(L.pulling) + if(O.light_range && O.light_power && !check_plasmaman(O, AM)) + disintegrate(O, user) + if(L.pulling && L.pulling.light_range && isitem(L.pulling) && !check_plasmaman(L.pulling, L)) + disintegrate(L.pulling, user) else if(isitem(AM)) var/obj/item/I = AM - if(I.light_range && I.light_power) - disintegrate(I) + if(I.light_range && I.light_power && !check_plasmaman(AM)) + disintegrate(I, user) else if(istype(AM, /obj/structure/marker_beacon)) var/obj/structure/marker_beacon/I = AM - disintegrate(I) + disintegrate(I, user) //why the fuck is the marker beacon a structure? who. what. why. + else if(istype(AM, /obj/machinery/light)) + var/obj/machinery/light/L = AM + if(L.status == 2) //Assume we just broke the light + handle_objectives(user) + L.status = 1 //No tube + L.update(FALSE) -/obj/item/light_eater/proc/disintegrate(obj/item/O) +/obj/item/light_eater/proc/handle_objectives(mob/living/carbon/human/H) + if(!H.mind) + return + + if(!H.mind.objectives) + return + + for(var/O in H.mind.objectives) + if(!istype(O, /datum/objective/break_lights)) + continue + var/datum/objective/break_lights/BL = O + if(!BL.mode) + BL.lightsbroken++ + +/obj/item/light_eater/proc/disintegrate(obj/item/O, user) if(istype(O, /obj/item/pda)) var/obj/item/pda/PDA = O PDA.set_light(0) @@ -220,5 +245,21 @@ O.burn() playsound(src, 'sound/items/welder.ogg', 50, 1) + if(is_species(user, /datum/species/shadow/nightmare)) + handle_objectives(user) + +/obj/item/light_eater/proc/check_plasmaman(obj/item/O, mob/living/carbon/human/user) + if(!istype(O, /obj/item/clothing/head/helmet/space/plasmaman)) + return FALSE + var/obj/item/clothing/head/helmet/space/plasmaman/H = O + if(H.on) + H.on = FALSE + H.icon_state = "[initial(H.icon_state)][H.on ? "-light":""]" + H.item_state = H.icon_state + if(user) + user.update_inv_head() + to_chat(user, "Your [H]'s torch extinguishes!") + return TRUE + #undef HEART_SPECIAL_SHADOWIFY #undef HEART_RESPAWN_THRESHHOLD diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index af91754b..4f1afd3d 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -36,6 +36,7 @@ var/datum/atom_hud/alternate_appearance/AA = v AA.onNewMob(src) nutrition = rand(NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_START_MAX) + thirst = rand(NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_START_MAX) . = ..() update_config_movespeed() update_movespeed(TRUE) diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 14d2dbaa..c2a67735 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -89,7 +89,7 @@ var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) var/heat = energy_transfer*(1-efficiency) - lastgen += energy_transfer*efficiency + lastgen += LOGISTIC_FUNCTION(500000,0.0009,delta_temperature,10000) hot_air.temperature = hot_air.temperature - energy_transfer/hot_air_heat_capacity cold_air.temperature = cold_air.temperature + heat/cold_air_heat_capacity diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 61d32c29..89bd36a4 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -81,6 +81,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) current_cycle++ if(holder) holder.remove_reagent(type, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. + M.thirst += hydration return //called when a mob processes chems when dead. diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 32e97f0a..18f2c761 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -2422,3 +2422,19 @@ datum/reagent/consumable/ethanol/creme_de_coconut M.set_drugginess(50) M.adjustStaminaLoss(-2) return ..() + +/datum/reagent/consumable/ethanol/cum_in_a_hot_tub + name = "Cum in the Hot Tub" + boozepwr = 80 + color = "#D2D7D9" + quality = DRINK_VERYGOOD + taste_description = "smooth cream" + glass_icon_state = "cum_glass" + shot_glass_icon_state = "cum_shot" //I'm funny, I know + glass_name = "Cum in the Hot Tub" + glass_desc = "Doesn't really leave it to the imagination, eh?" + +/datum/reagent/consumable/ethanol/cum_in_a_hot_tub/semen + boozepwr = 65 + taste_description = "viscous cream" + glass_desc = "The name is probably exactly what it is." diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 853a0000..d250f025 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -3,9 +3,6 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////// DRINKS BELOW, Beer is up there though, along with cola. Cap'n Pete's Cuban Spiced Rum//////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// -/datum/reagent/water/ - hydration = 10 * REAGENTS_METABOLISM - /datum/reagent/consumable/orangejuice name = "Orange Juice" description = "Both delicious AND rich in Vitamin C, what more do you need?" diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index b5384f8a..bb200cdc 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -18,7 +18,6 @@ /datum/reagent/consumable/on_mob_life(mob/living/carbon/M) current_cycle++ M.nutrition += nutriment_factor - M.thirst += hydration holder.remove_reagent(type, metabolization_rate) /datum/reagent/consumable/reaction_mob(mob/living/M, method=TOUCH, reac_volume) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 4e8671b3..c319899e 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -258,12 +258,7 @@ glass_name = "glass of water" glass_desc = "The father of all refreshments." shot_glass_icon_state = "shotglassclear" - hydration = 5 * REAGENTS_METABOLISM - -//hydration -/datum/reagent/water/on_mob_life(mob/living/carbon/M) - M.thirst += hydration - ..() + hydration = 10 * REAGENTS_METABOLISM /* * Water reaction to turf diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index 1d1aa3d6..256b2c3c 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -23,6 +23,7 @@ var/mob/living/carbon/human/H = owner if(!(organ_flags & ORGAN_FAILING)) H.dna.species.handle_digestion(H) + H.dna.species.handle_thirst(H) handle_disgust(H) Nutri = locate(/datum/reagent/consumable/nutriment) in H.reagents.reagent_list @@ -99,4 +100,4 @@ /obj/item/organ/stomach/ipc name = "ipc stomach" - icon_state = "stomach-ipc" \ No newline at end of file + icon_state = "stomach-ipc" diff --git a/hyperstation/code/datums/traits/neutral.dm b/hyperstation/code/datums/traits/neutral.dm index ba031c25..2402a26d 100644 --- a/hyperstation/code/datums/traits/neutral.dm +++ b/hyperstation/code/datums/traits/neutral.dm @@ -34,3 +34,16 @@ mob_trait = TRAIT_HEAT gain_text = "You body burns with the desire to be bred." lose_text = "You feel more in control of your body and thoughts." + +/datum/quirk/overweight + name = "Overweight" + desc = "You're particularly fond of food, and join the round being overweight." + value = 0 + gain_text = "You feel a bit chubby!" + //no lose_text cause why would there be? + +/datum/quirk/overweight/on_spawn() + var/mob/living/M = quirk_holder + M.nutrition = rand(NUTRITION_LEVEL_FAT + NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_FAT + NUTRITION_LEVEL_START_MAX) + M.overeatduration = 100 + ADD_TRAIT(M, TRAIT_FAT, OBESITY) diff --git a/hyperstation/code/obj/plushes.dm b/hyperstation/code/obj/plushes.dm index 00950993..30a9a3c2 100644 --- a/hyperstation/code/obj/plushes.dm +++ b/hyperstation/code/obj/plushes.dm @@ -54,11 +54,21 @@ squeak_override = list('sound/voice/gorillaplush.ogg' = 1) /obj/item/toy/plush/mammal/lyricalpaws - name = "Winter Dawn Plushie" - desc = "Winter Dawn in plushie form! Very cuddly." + name = "hyena plushie" + desc = "An adorable stuffed toy of a mammal that seems to resemble a crew member! She's a little yeen in a big labcoat." + gender = FEMALE //probably a girl icon = 'hyperstation/icons/obj/plushes.dmi' icon_state = "lyricalpaws" item_state = "lyricalpaws" + attack_verb = list("hugged", "cuddled", "embraced") + squeak_override = list( + 'modular_citadel/sound/voice/bark1.ogg' = 1, + 'modular_citadel/sound/voice/bark2.ogg' = 1 + ) + +/obj/item/toy/plush/mammal/lyricalpaws/attack_self(mob/user) + to_chat(user, "You pet [src]. You swear she looks up at you.") + /obj/item/toy/plush/mammal/chemlight desc = "An adorable stuffed toy of a mammal that seems to resemble a crew member! It looks to glow and sport four arms." diff --git a/hyperstation/code/obj/rewards.dm b/hyperstation/code/obj/rewards.dm index 5dfbeb94..01f07b53 100644 --- a/hyperstation/code/obj/rewards.dm +++ b/hyperstation/code/obj/rewards.dm @@ -103,4 +103,24 @@ alternate_worn_icon = 'hyperstation/icons/mobs/rewards.dmi' icon_state = "keaton" flags_inv = HIDEFACE|HIDEFACIALHAIR - w_class = WEIGHT_CLASS_SMALL \ No newline at end of file + w_class = WEIGHT_CLASS_SMALL + +/obj/item/clothing/suit/hooded/wintercoat/chloe + name = "Fleet Commander's Overcoat" + desc = "Custom tailored to warm the cold commanding hearts of the Syndicate's feared XIV'th battle group. Its armour plating has been removed, but its beret remains inside." + icon_state = "commissar_greatcoat" + item_state = "commissar_greatcoat" + allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/screwdriver, /obj/item/crowbar, /obj/item/wrench, /obj/item/stack/cable_coil, /obj/item/weldingtool, /obj/item/multitool) + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + body_parts_covered = CHEST|GROIN|ARMS|LEGS + mutantrace_variation = MUTANTRACE_VARIATION + tauric = TRUE + hoodtype = /obj/item/clothing/head/hooded/winterhood/chloe + +/obj/item/clothing/head/hooded/winterhood/chloe + name = "Fleet Commander's Beret" + desc = "A beret bearing a worn golden symbol that stikes fear in the hearts of many. It smells faintly of plasma and gunpowder." + icon = 'hyperstation/icons/obj/clothing/rewards.dmi' + alternate_worn_icon = 'hyperstation/icons/mobs/rewards.dmi' + icon_state = "commissar_beret" + item_state = "commissar_beret" \ No newline at end of file diff --git a/hyperstation/icons/mobs/rewards.dmi b/hyperstation/icons/mobs/rewards.dmi index 435e46fc..7a92799b 100644 Binary files a/hyperstation/icons/mobs/rewards.dmi and b/hyperstation/icons/mobs/rewards.dmi differ diff --git a/hyperstation/icons/obj/clothing/rewards.dmi b/hyperstation/icons/obj/clothing/rewards.dmi index c6293a95..ac43a627 100644 Binary files a/hyperstation/icons/obj/clothing/rewards.dmi and b/hyperstation/icons/obj/clothing/rewards.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index eb8f9c9f..68b090c9 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/suit_digi.dmi b/icons/mob/suit_digi.dmi index ba14c672..efefb543 100644 Binary files a/icons/mob/suit_digi.dmi and b/icons/mob/suit_digi.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 9c23efc4..65d2d1e1 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 56e5baa5..9ea46443 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 82acf139..b5cfd1f0 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/modular_citadel/code/game/machinery/cryopod.dm b/modular_citadel/code/game/machinery/cryopod.dm index 0c82a210..f8e8665e 100644 --- a/modular_citadel/code/game/machinery/cryopod.dm +++ b/modular_citadel/code/game/machinery/cryopod.dm @@ -306,23 +306,6 @@ announcer.announce("CRYOSTORAGE", mob_occupant.real_name, announce_rank, announce_job_title, list()) visible_message("\The [src] hums and hisses as it moves [mob_occupant.real_name] into storage.") - - for(var/obj/item/W in mob_occupant.GetAllContents()) - if(W.loc.loc && (( W.loc.loc == loc ) || (W.loc.loc == control_computer))) - continue//means we already moved whatever this thing was in - //I'm a professional, okay - for(var/T in preserve_items) - if(istype(W, T)) - if(control_computer && control_computer.allow_items) - control_computer.frozen_items += W - mob_occupant.transferItemToLoc(W, control_computer, TRUE) - else - mob_occupant.transferItemToLoc(W, loc, TRUE) - - for(var/obj/item/W in mob_occupant.GetAllContents()) - qdel(W)//because we moved all items to preserve away - //and yes, this totally deletes their bodyparts one by one, I just couldn't bother - if(iscyborg(mob_occupant)) var/mob/living/silicon/robot/R = occupant if(!istype(R)) return ..() @@ -330,6 +313,24 @@ R.contents -= R.mmi qdel(R.mmi) + QDEL_NULL_LIST(R.contents) + else + for(var/obj/item/W in mob_occupant.GetAllContents()) + if(W.loc.loc && (( W.loc.loc == loc ) || (W.loc.loc == control_computer))) + continue//means we already moved whatever this thing was in + //I'm a professional, okay + for(var/T in preserve_items) + if(istype(W, T)) + if(control_computer && control_computer.allow_items) + control_computer.frozen_items += W + mob_occupant.transferItemToLoc(W, control_computer, TRUE) + else + mob_occupant.transferItemToLoc(W, loc, TRUE) + + for(var/obj/item/W in mob_occupant.GetAllContents()) + qdel(W)//because we moved all items to preserve away + //and yes, this totally deletes their bodyparts one by one, I just couldn't bother + // Ghost and delete the mob. if(!mob_occupant.get_ghost(1)) mob_occupant.ghostize(0) // Players who cryo out may not re-enter the round @@ -387,7 +388,7 @@ if(target.mind.special_role == ROLE_TRAITOR) alert("You're a Traitor![generic_plsnoleave_message]") caught = TRUE - + if(caught) target.client.cryo_warned = world.time return diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index 0f26e7dc..fa910e94 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -105,6 +105,12 @@ path = /obj/item/toy/plush/mammal/lyricalpaws ckeywhitelist = list("lyricalpaws") +/datum/gear/lyricalpawssuit + name = "Fleet Commander's Overcoat" + category = SLOT_IN_BACKPACK + path = /obj/item/clothing/suit/hooded/wintercoat/chloe + ckeywhitelist = list("lyricalpaws") + /datum/gear/cherostavikmask name = "Keaton Mask" category = SLOT_IN_BACKPACK diff --git a/modular_citadel/icons/mob/suit_digi.dmi b/modular_citadel/icons/mob/suit_digi.dmi index 23066ed4..5c4c534a 100644 Binary files a/modular_citadel/icons/mob/suit_digi.dmi and b/modular_citadel/icons/mob/suit_digi.dmi differ diff --git a/modular_citadel/icons/mob/taur_naga.dmi b/modular_citadel/icons/mob/taur_naga.dmi index 5a8e3c80..48a51d73 100644 Binary files a/modular_citadel/icons/mob/taur_naga.dmi and b/modular_citadel/icons/mob/taur_naga.dmi differ diff --git a/tgstation.dme b/tgstation.dme index fd4992bd..9562ec48 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1375,6 +1375,7 @@ #include "code\modules\antagonists\morph\morph.dm" #include "code\modules\antagonists\morph\morph_antag.dm" #include "code\modules\antagonists\nightmare\nightmare.dm" +#include "code\modules\antagonists\nightmare\nightmare_objectives.dm" #include "code\modules\antagonists\ninja\ninja.dm" #include "code\modules\antagonists\nukeop\clownop.dm" #include "code\modules\antagonists\nukeop\nukeop.dm"