diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index b2c40d5672..9ee5a65764 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -97094,8 +97094,7 @@
/turf/open/floor/plating,
/area/crew_quarters/theatre/abandoned)
"dHa" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/item/twohanded/required/kirbyplants/random,
+/obj/machinery/vending/kink,
/turf/open/floor/wood,
/area/crew_quarters/theatre/abandoned)
"dHb" = (
@@ -113139,6 +113138,14 @@
"esH" = (
/turf/closed/wall,
/area/maintenance/department/medical/morgue)
+"esI" = (
+/obj/machinery/vending/kink,
+/turf/open/floor/plating,
+/area/maintenance/port/fore)
+"esJ" = (
+/obj/machinery/vending/kink,
+/turf/open/floor/plating,
+/area/crew_quarters/abandoned_gambling_den)
(1,1,1) = {"
aaa
@@ -137474,7 +137481,7 @@ dmb
dnA
doK
dqw
-diJ
+esJ
aJm
aHW
aaf
@@ -143545,7 +143552,7 @@ aib
asx
atw
auQ
-aic
+esI
awX
aye
azn
@@ -178674,4 +178681,4 @@ aaa
aaa
aaa
aaa
-"}
\ No newline at end of file
+"}
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 5a1762e989..665b0a39ae 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -28522,7 +28522,7 @@
},
/area/security/checkpoint/engineering)
"bcO" = (
-/obj/structure/easel,
+/obj/machinery/vending/kink,
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
@@ -64306,10 +64306,10 @@
/turf/open/space,
/area/space)
"ctn" = (
-/obj/machinery/vending/cigarette,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
+/obj/machinery/vending/kink,
/turf/open/floor/plating,
/area/maintenance/port/aft)
"cto" = (
@@ -155921,4 +155921,4 @@ aaa
aaa
aaa
aaa
-"}
\ No newline at end of file
+"}
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index 2badff3bb5..bf75b2ac43 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -30349,6 +30349,7 @@
dir = 8
},
/obj/effect/turf_decal/bot,
+/obj/machinery/computer/rdconsole,
/turf/open/floor/plasteel,
/area/science/robotics/lab)
"bbP" = (
diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm
index fc93ccbf1c..5f167bf96c 100644
--- a/code/__DEFINES/clockcult.dm
+++ b/code/__DEFINES/clockcult.dm
@@ -55,8 +55,6 @@ GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not us
#define POWER_PLASTEEL (CLOCKCULT_POWER_UNIT*0.05) //how much power is in one sheet of plasteel
-#define RATVAR_POWER_CHECK "ratvar?" //when passed into can_use_power(), converts it into a check for if ratvar has woken/the fabricator is debug
-
//Ark defines
#define GATEWAY_SUMMON_RATE 1 //the time amount the Gateway to the Celestial Derelict gets each process tick; defaults to 1 per tick
diff --git a/code/citadel/custom_loadout/custom_items.dm b/code/citadel/custom_loadout/custom_items.dm
index 397f4c6576..5041532a02 100644
--- a/code/citadel/custom_loadout/custom_items.dm
+++ b/code/citadel/custom_loadout/custom_items.dm
@@ -93,6 +93,17 @@
w_class = WEIGHT_CLASS_SMALL
body_parts_covered = CHEST|GROIN|LEGS|ARMS
+/obj/item/toy/plush/tree
+ name = "christmass tree plushie"
+ desc = "A festive plush that squeeks when you squeeze it!"
+ icon = 'icons/obj/plushes.dmi'
+ icon_state = "pine_c"
+ item_state = "pine_c"
+ w_class = WEIGHT_CLASS_SMALL
+ attack_verb = list("slapped")
+ resistance_flags = FLAMMABLE
+ squeak_override = list('sound/items/bikehorn.ogg'= 1)
+
/*Zigfie*/
diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index a9807a599c..bf4f562f36 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -49,7 +49,6 @@ GLOBAL_PROTECT(config_dir)
if(initial(E.abstract_type) == I)
continue
E = new I
- _entries_by_type[I] = E
var/esname = E.name
var/datum/config_entry/test = _entries[esname]
if(test)
@@ -57,6 +56,7 @@ GLOBAL_PROTECT(config_dir)
qdel(E)
continue
_entries[esname] = E
+ _entries_by_type[I] = E
.[E.resident_file] = TRUE
/datum/controller/configuration/proc/RemoveEntry(datum/config_entry/CE)
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index 65c7dbaf4c..f2c9cd3315 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -268,3 +268,8 @@ CONFIG_DEF(flag/allow_extended_miscreants)
GLOB.MAX_EX_LIGHT_RANGE = value
GLOB.MAX_EX_FLASH_RANGE = value
GLOB.MAX_EX_FLAME_RANGE = value
+
+CONFIG_DEF(number/emergency_shuttle_autocall_threshold)
+ min_val = 0
+ max_val = 1
+ integer = FALSE
diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm
index 705f0dbd81..9973a43430 100644
--- a/code/controllers/subsystem/shuttle.dm
+++ b/code/controllers/subsystem/shuttle.dm
@@ -136,6 +136,7 @@ SUBSYSTEM_DEF(shuttle)
if(changed_transit)
color_space()
#endif
+ CheckAutoEvac()
while(transit_requesters.len)
var/requester = popleft(transit_requesters)
@@ -148,7 +149,32 @@ SUBSYSTEM_DEF(shuttle)
var/obj/docking_port/mobile/M = requester
M.transit_failure()
if(MC_TICK_CHECK)
- return
+ break
+
+/datum/controller/subsystem/shuttle/proc/CheckAutoEvac()
+ if(emergencyNoEscape || emergencyNoRecall || !emergency)
+ return
+
+ var/threshold = CONFIG_GET(number/emergency_shuttle_autocall_threshold)
+ if(!threshold)
+ return
+
+ var/alive = 0
+ for(var/I in GLOB.player_list)
+ var/mob/M = I
+ if(M.stat != DEAD)
+ ++alive
+
+ var/total = GLOB.joined_player_list.len
+
+ if(alive / total <= threshold)
+ var/msg = "Automatically dispatching shuttle due to crew death."
+ message_admins(msg)
+ log_game("[msg] Alive: [alive], Roundstart: [total], Threshold: [threshold]")
+ emergencyNoRecall = TRUE
+ priority_announce("Catastrophic casualties detected: crisis shuttle protocols activated - jamming recall signals across all frequencies.")
+ if(emergency.timeLeft(1) > emergencyCallTime * 0.4)
+ emergency.request(null, set_coefficient = 0.4)
/datum/controller/subsystem/shuttle/proc/getShuttle(id)
for(var/obj/docking_port/mobile/M in mobile)
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index 26f42fa059..1b3633207c 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -123,7 +123,7 @@
/datum/disease/advance/proc/HasSymptom(datum/symptom/S)
for(var/datum/symptom/symp in symptoms)
- if(symp.id == S.id)
+ if(symp.type == S.type)
return 1
return 0
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 5167b17e0d..869cea19da 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -131,7 +131,7 @@ Bonus
/datum/symptom/heal/brute/Heal(mob/living/carbon/M, datum/disease/advance/A)
var/heal_amt = 2 * power
- var/list/parts = M.get_damaged_bodyparts(1,1) //1,1 because it needs inputs.
+ var/list/parts = M.get_damaged_bodyparts(1,0) //brute only
if(!parts.len)
return
@@ -175,7 +175,7 @@ Bonus
/datum/symptom/heal/brute/plus/Heal(mob/living/carbon/M, datum/disease/advance/A)
var/heal_amt = 4 * power
- var/list/parts = M.get_damaged_bodyparts(1,1) //1,1 because it needs inputs.
+ var/list/parts = M.get_damaged_bodyparts(1,0) //brute only
if(M.getCloneLoss() > 0)
M.adjustCloneLoss(-1)
@@ -225,7 +225,7 @@ Bonus
/datum/symptom/heal/burn/Heal(mob/living/carbon/M, datum/disease/advance/A)
var/heal_amt = 2 * power
- var/list/parts = M.get_damaged_bodyparts(1,1) //1,1 because it needs inputs.
+ var/list/parts = M.get_damaged_bodyparts(0,1) //burn only
if(!parts.len)
return
@@ -268,7 +268,7 @@ Bonus
/datum/symptom/heal/burn/plus/Heal(mob/living/carbon/M, datum/disease/advance/A)
var/heal_amt = 4 * power
- var/list/parts = M.get_damaged_bodyparts(1,1) //1,1 because it needs inputs.
+ var/list/parts = M.get_damaged_bodyparts(0,1) //burn only
if(M.bodytemperature > 310)
M.bodytemperature = max(310, M.bodytemperature - (10 * heal_amt * TEMPERATURE_DAMAGE_COEFFICIENT))
diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm
index 119b04b48a..ea9156bfbd 100644
--- a/code/datums/diseases/advance/symptoms/itching.dm
+++ b/code/datums/diseases/advance/symptoms/itching.dm
@@ -43,8 +43,11 @@ BONUS
/datum/symptom/itching/Activate(datum/disease/advance/A)
if(!..())
return
- var/mob/living/M = A.affected_mob
- var/can_scratch = scratch && !M.incapacitated()
- to_chat(M, "Your [pick("back", "arm", "leg", "elbow", "head")] itches. [can_scratch ? " You scratch it." : ""]")
- if(can_scratch)
- M.adjustBruteLoss(0.5)
\ No newline at end of file
+ var/mob/living/carbon/M = A.affected_mob
+ var/picked_bodypart = pick("head", "chest", "r_arm", "l_arm", "r_leg", "l_leg")
+ var/obj/item/bodypart/bodypart = M.get_bodypart(picked_bodypart)
+ if(bodypart && bodypart.status == BODYPART_ORGANIC && !bodypart.is_pseudopart) //robotic limbs will mean less scratching overall
+ var/can_scratch = scratch && !M.incapacitated() && get_location_accessible(M, picked_bodypart)
+ M.visible_message("[can_scratch ? "[M] scratches [M.p_their()] [bodypart.name]." : ""]", "Your [bodypart.name] itches. [can_scratch ? " You scratch it." : ""]")
+ if(can_scratch)
+ bodypart.receive_damage(0.5)
\ No newline at end of file
diff --git a/code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm b/code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm
index ae001c03e5..44fa24c134 100644
--- a/code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm
+++ b/code/game/gamemodes/clock_cult/clock_items/replica_fabricator.dm
@@ -90,7 +90,7 @@
if(!no_table_check)
return TRUE
return FALSE
- if(get_clockwork_power(RATVAR_POWER_CHECK))
+ if(GLOB.ratvar_awakens)
fabrication_values["power_cost"] = 0
var/turf/Y = get_turf(user)
@@ -167,7 +167,7 @@
return FALSE
if(target.type != expected_type)
return FALSE
- if(get_clockwork_power(RATVAR_POWER_CHECK))
+ if(GLOB.ratvar_awakens)
fabrication_values["power_cost"] = 0
if(!get_clockwork_power(fabrication_values["power_cost"]))
if(get_clockwork_power() - fabrication_values["power_cost"] < 0)
@@ -212,7 +212,7 @@
return FALSE
repair_values["healing_for_cycle"] = min(repair_values["amount_to_heal"], FABRICATOR_REPAIR_PER_TICK) //modify the healing for this cycle
repair_values["power_required"] = round(repair_values["healing_for_cycle"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER) //and get the power cost from that
- if(!get_clockwork_power(RATVAR_POWER_CHECK) && !get_clockwork_power(repair_values["power_required"]))
+ if(!GLOB.ratvar_awakens && !get_clockwork_power(repair_values["power_required"]))
if(!silent)
to_chat(user, "You need at least [DisplayPower(repair_values["power_required"])] power to start repairin[target == user ? "g yourself" : "g [target]"], and at least \
[DisplayPower(repair_values["amount_to_heal"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)] to fully repair [target == user ? "yourself" : "[target.p_them()]"]!")
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 8140dffe53..2dcaf23bc6 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -100,9 +100,10 @@
if(cooldowntime > world.time)
to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].")
return
- var/choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Bastard Sword")
+ var/option = "Shielded Robe"
+ option = input(user, "You study the schematics etched into the forge...", "[src]", option) as null|anything in list("Shielded Robe", "Flagellant's Robe", "Bastard Sword", "Nar-Sien Hardsuit")
var/pickedtype
- switch(choice)
+ switch(option)
if("Shielded Robe")
pickedtype = /obj/item/clothing/suit/hooded/cultrobes/cult_shield
if("Flagellant's Robe")
@@ -115,6 +116,9 @@
to_chat(user, "The forge fires are not yet hot enough for this weapon, give it another [DisplayTimeText(cooldowntime)].")
cooldowntime = 0
return
+ if("Nar-Sien Hardsuit")
+ pickedtype = /obj/item/clothing/suit/space/hardsuit/cult
+
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
cooldowntime = world.time + 2400
var/obj/item/N = new pickedtype(get_turf(src))
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 9b27e1e7c6..f06d355078 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -30,6 +30,7 @@
var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South.
var/step_energy_drain = 10
var/melee_energy_drain = 15
+ var/overload_step_energy_drain_min = 100
max_integrity = 300 //max_integrity is base health
var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act.
armor = list(melee = 20, bullet = 10, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm
index 4102ba914b..96576db154 100644
--- a/code/game/mecha/mecha_actions.dm
+++ b/code/game/mecha/mecha_actions.dm
@@ -203,7 +203,7 @@
chassis.leg_overload_mode = 1
chassis.bumpsmash = 1
chassis.step_in = min(1, round(chassis.step_in/2))
- chassis.step_energy_drain = chassis.step_energy_drain*chassis.leg_overload_coeff
+ chassis.step_energy_drain = max(chassis.overload_step_energy_drain_min,chassis.step_energy_drain*chassis.leg_overload_coeff)
chassis.occupant_message("You enable leg actuators overload.")
else
chassis.leg_overload_mode = 0
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index f04f8d4441..13fe778a38 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -513,7 +513,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(!lit)
set_lit(TRUE)
if(fancy)
- user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.", "Without even breaking stride, you flip open and lights [src] in one smooth movement.")
+ user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.", "Without even breaking stride, you flip open and light [src] in one smooth movement.")
else
var/prot = FALSE
var/mob/living/carbon/human/H = user
diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm
index d0ad32113d..6093d73bc5 100644
--- a/code/game/objects/structures/ladders.dm
+++ b/code/game/objects/structures/ladders.dm
@@ -100,6 +100,10 @@
/obj/structure/ladder/attackby(obj/item/W, mob/user, params)
return attack_hand(user)
+/obj/structure/ladder/attack_robot(mob/living/silicon/robot/R)
+ if(R.Adjacent(src))
+ return attack_hand(R)
+
/obj/structure/ladder/attack_ghost(mob/dead/observer/user)
use(user,1)
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 237714eb8e..985db1947e 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -144,15 +144,15 @@
if(pockets)
var/list/how_cool_are_your_threads = list("")
if(pockets.priority)
- how_cool_are_your_threads += "Your [src]'s storage opens when clicked.\n"
+ how_cool_are_your_threads += "[src]'s storage opens when clicked.\n"
else
- how_cool_are_your_threads += "Your [src]'s storage opens when dragged to yourself.\n"
- how_cool_are_your_threads += "Your [src] can store [pockets.storage_slots] item[pockets.storage_slots > 1 ? "s" : ""].\n"
- how_cool_are_your_threads += "Your [src] can store items that are [weightclass2text(pockets.max_w_class)] or smaller.\n"
+ how_cool_are_your_threads += "[src]'s storage opens when dragged to yourself.\n"
+ how_cool_are_your_threads += "[src] can store [pockets.storage_slots] item[pockets.storage_slots > 1 ? "s" : ""].\n"
+ how_cool_are_your_threads += "[src] can store items that are [weightclass2text(pockets.max_w_class)] or smaller.\n"
if(pockets.quickdraw)
- how_cool_are_your_threads += "You can quickly remove an item from your [src] using Alt-Click.\n"
+ how_cool_are_your_threads += "You can quickly remove an item from [src] using Alt-Click.\n"
if(pockets.silent)
- how_cool_are_your_threads += "Adding or Removing items from your [src] makes no noise.\n"
+ how_cool_are_your_threads += "Adding or removing items from [src] makes no noise.\n"
how_cool_are_your_threads += ""
to_chat(user, how_cool_are_your_threads.Join())
diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm
new file mode 100644
index 0000000000..7be5db8e84
--- /dev/null
+++ b/code/modules/events/nightmare.dm
@@ -0,0 +1,43 @@
+/datum/round_event_control/nightmare
+ name = "Spawn Nightmare"
+ typepath = /datum/round_event/ghost_role/nightmare
+ max_occurrences = 1
+ min_players = 20
+
+/datum/round_event/ghost_role/nightmare
+ minimum_required = 1
+ role_name = "nightmare"
+
+/datum/round_event/ghost_role/nightmare/spawn_role()
+ var/list/candidates = get_candidates("alien", null, ROLE_ALIEN)
+ if(!candidates.len)
+ return NOT_ENOUGH_PLAYERS
+
+ var/mob/dead/selected = pick(candidates)
+
+ var/datum/mind/player_mind = new /datum/mind(selected.key)
+ player_mind.active = TRUE
+
+ var/list/spawn_locs = list()
+ for(var/obj/effect/landmark/xeno_spawn/L in GLOB.landmarks_list)
+ if(isturf(L.loc))
+ var/turf/T = L.loc
+ var/light_amount = T.get_lumcount()
+ if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
+ spawn_locs += T
+
+ if(!spawn_locs.len)
+ message_admins("No valid spawn locations found, aborting...")
+ return MAP_ERROR
+
+ var/mob/living/carbon/human/S = new ((pick(spawn_locs)))
+ player_mind.transfer_to(S)
+ player_mind.assigned_role = "Nightmare"
+ player_mind.special_role = "Nightmare"
+ SSticker.mode.traitors += player_mind
+ S.set_species(/datum/species/shadow/nightmare)
+ playsound(S, 'sound/magic/ethereal_exit.ogg', 50, 1, -1)
+ message_admins("[key_name_admin(S)] has been made into a Nightmare by an event.")
+ log_game("[key_name(S)] was spawned as a Nightmare by an event.")
+ spawned_mobs += S
+ return SUCCESSFUL_SPAWN
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 848d690853..d9bf309267 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -288,7 +288,7 @@
..()
container_type |= OPENCONTAINER_1
create_reagents(30)
- reagents.set_reacting(FALSE)
+ reagents.set_reacting(TRUE)
/obj/item/ammo_casing/shotgun/dart/attackby()
return
diff --git a/config/game_options.txt b/config/game_options.txt
index 3fc1787726..d577756061 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -496,6 +496,8 @@ ARRIVALS_SHUTTLE_DOCK_WINDOW 55
MICE_ROUNDSTART 10
+## If the percentage of players alive (doesn't count conversions) drops below this threshold the emergency shuttle will be forcefully called (provided it can be)
+#EMERGENCY_SHUTTLE_AUTOCALL_THRESHOLD 0.2
## CREW OBJECTIVES ##
## Comment to disable objectives for innocent crew members.
@@ -506,4 +508,4 @@ ALLOW_CREW_OBJECTIVES
ALLOW_MISCREANTS
## Uncomment to let miscreants spawn during Extended. I hold no responsibility for fun that may occur while this is enabled.
-#ALLOW_EXTENDED_MISCREANTS
\ No newline at end of file
+#ALLOW_EXTENDED_MISCREANTS
diff --git a/html/changelogs/AutoChangeLog-pr-3143.yml b/html/changelogs/AutoChangeLog-pr-3143.yml
new file mode 100644
index 0000000000..4e48f367b6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3143.yml
@@ -0,0 +1,7 @@
+author: "Kevak/Neri"
+delete-after: True
+changes:
+ - rscadd: "Readds Cult Hardsuits. or more specifically, makes cult forges be able to make hardsuits. They never got removed from the code."
+ - tweak: "Cultforge uses Option instead of Choice. (Aka ye get a menu instead of three buttons)"
+ - balance: "Cultforge can make hardsuits again."
+ - bugfix: "Fixed Cultforge procs, Slightly cleaner code."
diff --git a/html/changelogs/AutoChangeLog-pr-3203.yml b/html/changelogs/AutoChangeLog-pr-3203.yml
new file mode 100644
index 0000000000..e4061e3cd6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3203.yml
@@ -0,0 +1,4 @@
+author: "Kor"
+delete-after: True
+changes:
+ - rscadd: "Nightmares now have a chance to spawn via event."
diff --git a/html/changelogs/AutoChangeLog-pr-3211.yml b/html/changelogs/AutoChangeLog-pr-3211.yml
new file mode 100644
index 0000000000..491dd057e4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3211.yml
@@ -0,0 +1,4 @@
+author: "Y0SH1_M4S73R"
+delete-after: True
+changes:
+ - balance: "Gygax overdrive consumes at least 100 power per step"
diff --git a/html/changelogs/AutoChangeLog-pr-3214.yml b/html/changelogs/AutoChangeLog-pr-3214.yml
new file mode 100644
index 0000000000..3a2840f45c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3214.yml
@@ -0,0 +1,6 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - rscadd: "Added kinkmates to Delta in the gambling den (replacing the cigarette vendor), abandoned theatre (replacing a plant), and the abandoned theatre backstage in port bow maintenance."
+ - rscadd: "Added kinkmates to Meta in the abandoned bar, maintenance storage room (replacing an easel), and in maintenance right below science (also replacing an easel)."
+ - tweak: "Made the atmos pipes in maint dorms hidden."
diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi
index c8b96b8469..1c519473ae 100644
Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ
diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi
index f0eb817549..7eec51e46e 100644
Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 32de5b6c33..ab5b26b120 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1346,6 +1346,7 @@
#include "code\modules\events\meateor_wave.dm"
#include "code\modules\events\meteor_wave.dm"
#include "code\modules\events\mice_migration.dm"
+#include "code\modules\events\nightmare.dm"
#include "code\modules\events\operative.dm"
#include "code\modules\events\portal_storm.dm"
#include "code\modules\events\prison_break.dm"