diff --git a/code/__DEFINES/layers_planes.dm b/code/__DEFINES/layers_planes.dm
index 7168862899766..2a897f8b31329 100644
--- a/code/__DEFINES/layers_planes.dm
+++ b/code/__DEFINES/layers_planes.dm
@@ -215,6 +215,8 @@
/// Plane related to the menu when pressing Escape.
/// Needed so that we can apply a blur effect to EVERYTHING, and guarantee we are above all UI.
#define ESCAPE_MENU_PLANE 105
+#define ESCAPE_MENU_DIMMER_LAYER 105.1
+#define ESCAPE_MENU_DEFAULT_LAYER 105.2
#define RENDER_PLANE_MASTER 110
diff --git a/code/datums/ert.dm b/code/datums/ert.dm
index e303d08caa6b9..36631ae84012f 100644
--- a/code/datums/ert.dm
+++ b/code/datums/ert.dm
@@ -85,7 +85,7 @@
mission = "Разберитесь с проблемами на станции [station_name()], а также проведите плановую проверку всех Отделов и Командования."
/datum/ert/inquisition
- roles = list(/datum/antagonist/ert/chaplain/inquisitor, /datum/antagonist/ert/security/inquisitor, /datum/antagonist/ert/medic/inquisitor)
+ roles = list(/datum/antagonist/ert/security/inquisitor, /datum/antagonist/ert/medic/inquisitor)
leader_role = /datum/antagonist/ert/commander/inquisitor
rename_team = "Inquisition"
mission = "Уничтожьте любые следы паранормальной активности на борту Космической Станции Тринадцатого Сектора."
diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm
index c698a6843011b..ffaacb5123a0c 100644
--- a/code/game/gamemodes/clock_cult/clock_cult.dm
+++ b/code/game/gamemodes/clock_cult/clock_cult.dm
@@ -62,6 +62,8 @@ Credit where due:
return FALSE
if(M.mind.unconvertable)
return FALSE
+ if (IS_HERETIC(M))
+ return FALSE
else
return FALSE
if(iscultist(M) || isconstruct(M) || ispAI(M))
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 4c93d0891ca01..e4e4724929d90 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -27,6 +27,8 @@
return FALSE
if(M.mind.unconvertable)
return FALSE
+ if(IS_HERETIC(M))
+ return FALSE
else
return FALSE
if(HAS_TRAIT(M, TRAIT_MINDSHIELD) || issilicon(M) || isbot(M) || isdrone(M) || is_servant_of_ratvar(M) || !M.client)
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
index 984bbf10c94a4..ab038d41fc63b 100644
--- a/code/game/machinery/dance_machine.dm
+++ b/code/game/machinery/dance_machine.dm
@@ -398,6 +398,7 @@
/obj/machinery/jukebox/disco/proc/dance3(var/mob/living/M)
var/matrix/initial_matrix = matrix(M.transform)
+ var/matrix/initial_matrix_ = matrix(M.transform)
for (var/i in 1 to 75)
if (!M)
return
@@ -441,7 +442,7 @@
initial_matrix.Translate(-3,0)
animate(M, transform = initial_matrix, time = 1, loop = 0)
sleep(1)
- M.lying_fix()
+ M.lying_fix(initial_matrix_)
/obj/machinery/jukebox/disco/proc/dance4(var/mob/living/M)
@@ -459,6 +460,7 @@
time--
/obj/machinery/jukebox/disco/proc/dance5(var/mob/living/M)
+ var/matrix/initial_matrix_ = matrix(M.transform)
animate(M, transform = matrix(180, MATRIX_ROTATE), time = 1, loop = 0)
var/matrix/initial_matrix = matrix(M.transform)
for (var/i in 1 to 60)
@@ -491,10 +493,10 @@
initial_matrix.Translate(-3,0)
animate(M, transform = initial_matrix, time = 1, loop = 0)
sleep(1)
- M.lying_fix()
+ M.lying_fix(initial_matrix_)
-/mob/living/proc/lying_fix()
- animate(src, transform = null, time = 1, loop = 0)
+/mob/living/proc/lying_fix(var/matrix/initial_matrix)
+ animate(src, transform = initial_matrix, time = 1, loop = 0)
lying_prev = 0
/obj/machinery/jukebox/proc/dance_over()
diff --git a/code/game/objects/items/implants/implant_deathrattle.dm b/code/game/objects/items/implants/implant_deathrattle.dm
index ed195ab55e425..a346ee3c6d94f 100644
--- a/code/game/objects/items/implants/implant_deathrattle.dm
+++ b/code/game/objects/items/implants/implant_deathrattle.dm
@@ -67,8 +67,18 @@
if(!group)
to_chat(target, "Вы слышите странный механический голос в голове... \"Внимание: Не выявлены другие подключенные импланты.\"")
-
/obj/item/implantcase/deathrattle
name = "implant case - 'Deathrattle'"
desc = "A glass case containing a deathrattle implant."
imp_type = /obj/item/implant/deathrattle
+
+GLOBAL_DATUM_INIT(centcom_deathrattle_group, /datum/deathrattle_group, new)
+
+/obj/item/implant/deathrattle/centcom
+ name = "centcom deathrattle implant"
+ desc = "Hope no one else dies, prepare for when they do"
+
+/obj/item/implant/deathrattle/centcom/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE)
+ . = ..()
+ group = GLOB.centcom_deathrattle_group
+ group.register(src)
diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm
index 1094ff22f1b4b..4600e1299f4be 100644
--- a/code/game/objects/items/storage/firstaid.dm
+++ b/code/game/objects/items/storage/firstaid.dm
@@ -201,9 +201,9 @@
new /obj/item/healthanalyzer/advanced(src)
new /obj/item/reagent_containers/syringe/piercing(src)
new /obj/item/bonesetter(src)
+ new /obj/item/pinpointer/crew(src)
+ new /obj/item/sensor_device(src)
new /obj/item/reagent_containers/medspray/sterilizine(src)
- new /obj/item/reagent_containers/medspray/sterilizine(src)
- new /obj/item/reagent_containers/glass/bottle/morphine(src)
new /obj/item/reagent_containers/glass/bottle/morphine(src)
new /obj/item/hypospray/mkii/CMO/combat/synthflesh(src)
@@ -215,14 +215,13 @@
if(empty)
return
new /obj/item/stack/medical/gauze(src)
- new /obj/item/stack/medical/gauze(src)
- new /obj/item/reagent_containers/hypospray/medipen/oxandrolone(src)
- new /obj/item/reagent_containers/hypospray/medipen/salacid(src)
- new /obj/item/reagent_containers/hypospray/combat/omnizine(src)
+ new /obj/item/reagent_containers/medspray/sterilizine(src)
+ new /obj/item/reagent_containers/glass/bottle/morphine(src)
+ new /obj/item/reagent_containers/glass/bottle/morphine(src)
new /obj/item/reagent_containers/hypospray/combat/omnizine(src)
new /obj/item/reagent_containers/hypospray/medipen/penacid(src)
new /obj/item/reagent_containers/hypospray/medipen/penacid(src)
-
+ new /obj/item/reagent_containers/hypospray/medipen/penacid(src)
/obj/item/storage/firstaid/radbgone
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 852aaf22885e8..47b48604e074e 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -571,7 +571,7 @@
gloves = /obj/item/clothing/gloves/tackler/combat/insulated
ears = /obj/item/radio/headset/syndicate/alt
back = /obj/item/storage/backpack
- implants = list(/obj/item/implant/weapons_auth, /obj/item/implant/deathrattle, /obj/item/implant/explosive, /obj/item/implant/mindshield)
+ implants = list(/obj/item/implant/weapons_auth, /obj/item/implant/deathrattle/centcom, /obj/item/implant/explosive, /obj/item/implant/mindshield)
id = /obj/item/card/id/syndicate
give_space_cooler_if_synth = TRUE // BLUEMOON ADD
@@ -1207,7 +1207,7 @@
/obj/item/storage/firstaid/regular=1,
/obj/item/stamp/syndicate=1,
)
- implants = list(/obj/item/implant/mindshield, /obj/item/implant/deathrattle, /obj/item/implant/weapons_auth)
+ implants = list(/obj/item/implant/mindshield, /obj/item/implant/deathrattle/centcom, /obj/item/implant/weapons_auth)
cybernetic_implants = list(/obj/item/organ/cyberimp/eyes/hud/security,/obj/item/organ/cyberimp/chest/nutrimentextreme, /obj/item/organ/cyberimp/chest/chem_implant)
id = /obj/item/card/id
@@ -1260,7 +1260,7 @@
/obj/item/storage/firstaid/regular=1,
/obj/item/stamp/centcom=1,
)
- implants = list(/obj/item/implant/mindshield, /obj/item/implant/deathrattle, /obj/item/implant/weapons_auth)
+ implants = list(/obj/item/implant/mindshield, /obj/item/implant/deathrattle/centcom, /obj/item/implant/weapons_auth)
cybernetic_implants = list(/obj/item/organ/cyberimp/eyes/hud/security,/obj/item/organ/cyberimp/chest/nutrimentextreme, /obj/item/organ/cyberimp/chest/chem_implant)
id = /obj/item/card/id
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index b6d7e6dfbc6db..d0672155e54a8 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -381,7 +381,7 @@
var/datum/antagonist/ert/ert = antag
mannequin.equipOutfit(initial(ert.outfit), TRUE)
else if (ispath(antag, /datum/antagonist/official))
- mannequin.equipOutfit(/datum/outfit/centcom_official, TRUE)
+ mannequin.equipOutfit(/datum/outfit/ert/centcom_official, TRUE)
/datum/admins/proc/makeERTPreviewIcon(list/settings)
// Set up the dummy for its photoshoot
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_book.dm b/code/modules/antagonists/eldritch_cult/eldritch_book.dm
index ba7fcb0be11f7..d83bc479e017e 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_book.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_book.dm
@@ -14,11 +14,14 @@
///Where we cannot create the rune?
var/static/list/blacklisted_turfs = typecacheof(list(/turf/closed,/turf/open/space,/turf/open/lava))
+/obj/item/forbidden_book/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/anti_magic, FALSE, FALSE)
+
/obj/item/forbidden_book/Destroy()
last_user = null
. = ..()
-
/obj/item/forbidden_book/examine(mob/user)
. = ..()
if(!IS_HERETIC(user))
diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm
index 57a69bed2ff78..0ccd37d338d8c 100644
--- a/code/modules/antagonists/ert/ert.dm
+++ b/code/modules/antagonists/ert/ert.dm
@@ -131,17 +131,14 @@
/datum/antagonist/ert/medic/inquisitor
outfit = /datum/outfit/ert/medic/inquisitor
+/datum/antagonist/ert/medic/inquisitor/on_gain()
+ . = ..()
+ owner.isholy = TRUE
+
/datum/antagonist/ert/security/inquisitor
outfit = /datum/outfit/ert/security/inquisitor
-/datum/antagonist/ert/chaplain
- role = "Священник"
- outfit = /datum/outfit/ert/chaplain
-
-/datum/antagonist/ert/chaplain/inquisitor
- outfit = /datum/outfit/ert/chaplain/inquisitor
-
-/datum/antagonist/ert/chaplain/on_gain()
+/datum/antagonist/ert/security/inquisitor/on_gain()
. = ..()
owner.isholy = TRUE
diff --git a/code/modules/antagonists/official/official.dm b/code/modules/antagonists/official/official.dm
index 27dcd0e635744..47465475931a3 100644
--- a/code/modules/antagonists/official/official.dm
+++ b/code/modules/antagonists/official/official.dm
@@ -18,7 +18,7 @@
var/mob/living/carbon/human/H = owner.current
if(!istype(H))
return
- H.equipOutfit(/datum/outfit/centcom_official)
+ H.equipOutfit(/datum/outfit/ert/centcom_official)
if(CONFIG_GET(flag/enforce_human_authority))
H.set_species(/datum/species/human)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 2230b55be7ee8..31a0146a1bad0 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1106,7 +1106,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Toys and Egg Stuffing:[features["butt_stuffing"] == TRUE ? "Yes" : "No"]"
dat += "Max Size:[features["butt_max_size"] ? features["butt_max_size"] : "Disabled"]"
dat += "Min Size:[features["butt_min_size"] ? features["butt_min_size"] : "Disabled"]"
- dat += "Butthole Sprite:[features["has_anus"] == TRUE ? "Yes" : "No"]"
+ dat += "Has Anus:[features["has_anus"] == TRUE ? "Yes" : "No"]"
if(features["has_anus"])
dat += "Butthole Color:
"
if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm
index b90651eceb17d..17bf6dc9a109a 100644
--- a/code/modules/clothing/outfits/ert.dm
+++ b/code/modules/clothing/outfits/ert.dm
@@ -13,7 +13,7 @@
give_space_cooler_if_synth = TRUE // BLUEMOON ADD
- implants = list(/obj/item/implant/mindshield, /obj/item/implant/deathrattle, /obj/item/implant/weapons_auth)
+ implants = list(/obj/item/implant/mindshield, /obj/item/implant/deathrattle/centcom, /obj/item/implant/weapons_auth)
cybernetic_implants = list(/obj/item/organ/cyberimp/eyes/hud/security,/obj/item/organ/cyberimp/chest/nutrimentextreme, /obj/item/organ/cyberimp/chest/chem_implant)
@@ -503,52 +503,12 @@
W.access = list(ACCESS_MAINT_TUNNELS,ACCESS_CENT_GENERAL)
W.update_label(W.registered_name, W.assignment)
-/datum/outfit/centcom_official
- name = "CentCom Official"
-
- uniform = /obj/item/clothing/under/rank/centcom/officer
- shoes = /obj/item/clothing/shoes/laceup
- gloves = /obj/item/clothing/gloves/color/black
- ears = /obj/item/radio/headset/headset_cent/alt
- head = /obj/item/clothing/head/beret/sec/ntr_beret
- glasses = /obj/item/clothing/glasses/sunglasses
- belt = /obj/item/gun/energy/e_gun/nuclear/ert
- back = /obj/item/storage/backpack/satchel
- l_hand = /obj/item/clipboard
- id = /obj/item/card/id/ert
- backpack_contents = list(/obj/item/storage/box/survival/centcom=1,
- /obj/item/pda/heads=1,
- /obj/item/pen=1)
-
- implants = list(/obj/item/implant/mindshield, /obj/item/implant/deathrattle, /obj/item/implant/weapons_auth)
-
- cybernetic_implants = list(/obj/item/organ/cyberimp/eyes/hud/security,
- /obj/item/organ/cyberimp/chest/nutrimentextreme,
- /obj/item/organ/cyberimp/chest/chem_implant)
-
-/datum/outfit/centcom_official/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
- if(visualsOnly)
- return
-
- var/obj/item/radio/R = H.ears
- R.set_frequency(FREQ_CENTCOM)
- R.freqlock = TRUE
-
- var/obj/item/card/id/W = H.wear_id
- W.icon_state = "centcom"
- W.access = get_all_accesses()//They get full station access.
- W.access += get_centcom_access("Death Commando")//Let's add their alloted CentCom access.
- W.assignment = "CentCom Official"
- W.registered_name = H.real_name
- W.update_label(W.registered_name, W.assignment)
-
/datum/outfit/ert/commander/inquisitor
name = "Inquisition Commander"
mask = /obj/item/clothing/mask/gas/sechailer/swat
glasses = /obj/item/clothing/glasses/hud/health/night/syndicate
l_hand = /obj/item/gun/ballistic/automatic/proto/unrestricted
- r_hand = /obj/item/nullrod/scythe/talking/chainsword
suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal
belt = /obj/item/storage/belt/military/ert_max
backpack_contents = list(/obj/item/storage/box/survival/centcom=1,
@@ -575,7 +535,6 @@
glasses = /obj/item/clothing/glasses/hud/health/night/syndicate
suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
l_hand = /obj/item/gun/ballistic/automatic/proto/unrestricted
- r_hand = /obj/item/nullrod/scythe/talking/chainsword
belt = /obj/item/storage/belt/military/ert_max
backpack_contents = list(/obj/item/storage/box/survival/centcom=1,
/obj/item/storage/firstaid/regular=1,
@@ -602,7 +561,6 @@
glasses = /obj/item/clothing/glasses/hud/health/night/syndicate
suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
l_hand = /obj/item/gun/ballistic/automatic/proto/unrestricted
- r_hand = /obj/item/nullrod/scythe/talking/chainsword
belt = /obj/item/defibrillator/compact/loaded_ert
backpack_contents = list(/obj/item/storage/box/survival/centcom=1,
/obj/item/storage/box/ammo/smgap=1,\
@@ -621,40 +579,52 @@
/obj/item/organ/cyberimp/chest/thrusters,
)
-/datum/outfit/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
- ..()
+//Агенты ЦК
- if(visualsOnly)
- return
-
- var/obj/item/radio/R = H.ears
- R.keyslot = new /obj/item/encryptionkey/heads/hop
- R.recalculateChannels()
-
-/datum/outfit/ert/chaplain
- name = "ERT Chaplain"
-
- mask = /obj/item/clothing/mask/gas/sechailer/swat
- suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor // Chap role always gets this suit
- id = /obj/item/card/id/ert/chaplain
+/datum/outfit/ert/centcom_official
+ name = "CentCom Official"
+ uniform = /obj/item/clothing/under/syndicate/sniper
+ suit = /obj/item/clothing/suit/armor/vest/agent
+ shoes = /obj/item/clothing/shoes/laceup
+ head = /obj/item/clothing/head/HoS/beret/syndicate
glasses = /obj/item/clothing/glasses/hud/health/night/syndicate
- back = /obj/item/storage/backpack/cultpack
- belt = /obj/item/storage/belt/soulstone
- r_hand = /obj/item/gun/ballistic/automatic/laser
+ belt = /obj/item/storage/belt/military/ert_max
+ back = /obj/item/storage/backpack/satchel
+ mask = null
+ id = /obj/item/card/id/ert
+
backpack_contents = list(/obj/item/storage/box/survival/centcom=1,
- /obj/item/nullrod=1,
- /obj/item/storage/firstaid/regular=1,\
- /obj/item/ammo_box/magazine/recharge=4)
+ /obj/item/pda/heads=1,
+ /obj/item/stamp/centcom=1,
+ /obj/item/stamp/syndicate=1,
+ )
+ implants = list(
+ /obj/item/implant/mindshield,
+ /obj/item/implant/deathrattle/centcom,
+ /obj/item/implant/weapons_auth,
+ /obj/item/implant/krav_maga,
+ )
-/datum/outfit/ert/chaplain/inquisitor
- name = "Inquisition Chaplain"
+ cybernetic_implants = list(
+ /obj/item/organ/cyberimp/eyes/hud/security,
+ /obj/item/organ/cyberimp/chest/nutrimentextreme,
+ /obj/item/organ/cyberimp/chest/chem_implant/plus,
+ /obj/item/organ/eyes/robotic/thermals,
+ /obj/item/organ/cyberimp/mouth/breathing_tube,
+ )
- mask = /obj/item/clothing/mask/gas/sechailer/swat
- suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
- belt = /obj/item/storage/belt/soulstone/full/chappy
- backpack_contents = list(/obj/item/storage/box/survival/centcom=1,
+/datum/outfit/ert/centcom_official/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
+ if(visualsOnly)
+ return
- /obj/item/grenade/chem_grenade/holy=1,
- /obj/item/nullrod=1,
- /obj/item/storage/firstaid/regular=1,\
- /obj/item/ammo_box/magazine/recharge=4)
+ var/obj/item/radio/R = H.ears
+ R.set_frequency(FREQ_CENTCOM)
+ R.freqlock = TRUE
+
+ var/obj/item/card/id/W = H.wear_id
+ W.icon_state = "centcom"
+ W.access = get_all_accesses()//They get full station access.
+ W.access += get_centcom_access("Death Commando")//Let's add their alloted CentCom access.
+ W.assignment = "CentCom Official"
+ W.registered_name = H.real_name
+ W.update_label(W.registered_name, W.assignment)
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index 34d5dc60c3f44..6d685e560822f 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -405,7 +405,7 @@
/obj/item/pinpointer/nuke=1,\
/obj/item/grenade/plastic/x4=1)
- implants = list(/obj/item/implant/mindshield, /obj/item/implant/deathrattle, /obj/item/implant/weapons_auth)
+ implants = list(/obj/item/implant/mindshield, /obj/item/implant/deathrattle/centcom, /obj/item/implant/weapons_auth)
cybernetic_implants = list(
/obj/item/organ/cyberimp/eyes/hud/security,
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index a2b238a49a89e..df2520baa1029 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -317,8 +317,8 @@
blood_overlay_type = "armor"
armor = list(MELEE = 10, BULLET = 10, LASER = 60, ENERGY = 60, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, WOUND = 15)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- var/hit_reflect_chance = 40
- var/list/protected_zones = list(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN)
+ var/hit_reflect_chance = 60
+ var/list/protected_zones = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
/obj/item/clothing/suit/armor/laserproof/run_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return)
if(def_zone in protected_zones)
diff --git a/code/modules/escape_menu/details.dm b/code/modules/escape_menu/details.dm
index e1887773e7a00..a96219c989413 100644
--- a/code/modules/escape_menu/details.dm
+++ b/code/modules/escape_menu/details.dm
@@ -9,7 +9,7 @@ GLOBAL_DATUM(escape_menu_details, /atom/movable/screen/escape_menu/details)
return GLOB.escape_menu_details
/atom/movable/screen/escape_menu/details
- screen_loc = "EAST:-180,NORTH:-25"
+ screen_loc = "EAST:-180,NORTH:-48"
maptext_height = 100
maptext_width = 200
diff --git a/code/modules/escape_menu/dimmer.dm b/code/modules/escape_menu/dimmer.dm
index 277262d00b61e..249831d37c165 100644
--- a/code/modules/escape_menu/dimmer.dm
+++ b/code/modules/escape_menu/dimmer.dm
@@ -4,6 +4,7 @@
icon_state = "black"
alpha = 200
plane = ESCAPE_MENU_PLANE
+ layer = ESCAPE_MENU_DIMMER_LAYER
mouse_opacity = MOUSE_OPACITY_OPAQUE
clear_with_screen = FALSE
diff --git a/code/modules/escape_menu/escape_menu.dm b/code/modules/escape_menu/escape_menu.dm
index b1726b8600b55..78d4e3a03c76c 100644
--- a/code/modules/escape_menu/escape_menu.dm
+++ b/code/modules/escape_menu/escape_menu.dm
@@ -115,8 +115,12 @@ GLOBAL_LIST_EMPTY(escape_menus)
if (isnull(plane_master_controllers))
return
- plane_master_controller = list(client?.mob.hud_used.plane_masters["[GAME_PLANE]"], client?.mob.hud_used.plane_masters["[FLOOR_PLANE]"],
- client?.mob.hud_used.plane_masters["[WALL_PLANE]"], client?.mob.hud_used.plane_masters["[ABOVE_WALL_PLANE]"])
+ plane_master_controller = list(
+ client?.mob.hud_used.plane_masters["[GAME_PLANE]"],
+ client?.mob.hud_used.plane_masters["[FLOOR_PLANE]"],
+ client?.mob.hud_used.plane_masters["[WALL_PLANE]"],
+ client?.mob.hud_used.plane_masters["[ABOVE_WALL_PLANE]"],
+ )
for(var/A in plane_master_controller)
var/atom/movable/screen/plane_master/P = A
P.add_filter("escape_menu_blur", 1, list("type" = "blur", "size" = 2))
@@ -128,14 +132,20 @@ GLOBAL_LIST_EMPTY(escape_menus)
if (isnull(plane_master_controllers))
return
- plane_master_controller = list(client?.mob.hud_used.plane_masters["[GAME_PLANE]"], client?.mob.hud_used.plane_masters["[FLOOR_PLANE]"],
- client?.mob.hud_used.plane_masters["[WALL_PLANE]"], client?.mob.hud_used.plane_masters["[ABOVE_WALL_PLANE]"])
+ plane_master_controller = list(
+ client?.mob.hud_used.plane_masters["[GAME_PLANE]"],
+ client?.mob.hud_used.plane_masters["[FLOOR_PLANE]"],
+ client?.mob.hud_used.plane_masters["[WALL_PLANE]"],
+ client?.mob.hud_used.plane_masters["[ABOVE_WALL_PLANE]"],
+ )
for(var/A in plane_master_controller)
var/atom/movable/screen/plane_master/P = A
P.remove_filter("escape_menu_blur")
/atom/movable/screen/escape_menu
+ name = "Anything"
plane = ESCAPE_MENU_PLANE
+ layer = ESCAPE_MENU_DEFAULT_LAYER
clear_with_screen = FALSE
// The escape menu can be opened before SSatoms
diff --git a/code/modules/escape_menu/home_page.dm b/code/modules/escape_menu/home_page.dm
index fe82fda3912bf..a8653d23131ce 100644
--- a/code/modules/escape_menu/home_page.dm
+++ b/code/modules/escape_menu/home_page.dm
@@ -23,7 +23,7 @@
new /atom/movable/screen/escape_menu/home_button/leave_body(
null,
src,
- "Покинуть",
+ "Покинуть тело",
/* offset = */ 3,
CALLBACK(src, PROC_REF(open_leave_body)),
)
@@ -63,7 +63,7 @@
vis_contents += home_button_text
- screen_loc = "NORTH:-[100 + (32 * offset)],WEST:110"
+ screen_loc = "NORTH:-[132 + (32 * offset)],WEST:110"
transform = transform.Scale(6, 1)
/atom/movable/screen/escape_menu/home_button/Destroy()
@@ -92,6 +92,7 @@
// Needs to be separated so it doesn't scale
/atom/movable/screen/escape_menu/home_button_text
+ name = "text"
maptext_width = 200
maptext_height = 50
pixel_x = -80
@@ -117,9 +118,9 @@
/atom/movable/screen/escape_menu/home_button_text/proc/update_text()
var/atom/movable/screen/escape_menu/home_button/escape_menu_loc = loc
- maptext = MAPTEXT_VCR_OSD_MONO("[button_text]")
+ maptext = "[button_text]"
- if (hovered)
+ if (hovered && (!istype(escape_menu_loc) || escape_menu_loc.enabled()))
maptext = "[maptext]"
/atom/movable/screen/escape_menu/home_button/leave_body
diff --git a/code/modules/escape_menu/leave_body.dm b/code/modules/escape_menu/leave_body.dm
index 4563908242d5c..402aa5d49aab3 100644
--- a/code/modules/escape_menu/leave_body.dm
+++ b/code/modules/escape_menu/leave_body.dm
@@ -12,7 +12,7 @@
src,
"Драма",
"Совершить драматический уход",
- /* pixel_offset = */ -105,
+ /* pixel_offset = */ -115,
CALLBACK(src, PROC_REF(leave_suicide)),
/* button_overlay = */ dead_clown,
))
@@ -32,8 +32,8 @@
new /atom/movable/screen/escape_menu/leave_body_button(
src,
"Назад",
- /* tooltip_text = */ null,
- /* pixel_offset = */ 105,
+ "Вернуться в главное меню",
+ /* pixel_offset = */ 115,
CALLBACK(src, PROC_REF(open_home_page)),
/* button_overlay = */ "back",
)
@@ -63,6 +63,7 @@
// Not guaranteed to be living. Everything defines verb/ghost separately. Fuck you.
var/mob/living/living_user = client?.mob
living_user?.ghostize(FALSE)
+ qdel(src)
/datum/escape_menu/proc/leave_suicide()
PRIVATE_PROC(TRUE)
@@ -70,6 +71,7 @@
// Not guaranteed to be human. Everything defines verb/suicide separately. Fuck you, still.
var/mob/living/carbon/human/human_user = client?.mob
human_user?.suicide()
+ qdel(src)
/atom/movable/screen/escape_menu/leave_body_button
icon = 'icons/hud/escape_menu_leave_body.dmi'
@@ -97,8 +99,9 @@
add_overlay(button_overlay)
- maptext = MAPTEXT_VCR_OSD_MONO("[button_text]")
+ maptext = "[button_text]"
screen_loc = "CENTER:[pixel_offset],CENTER-1"
+ update_color()
/atom/movable/screen/escape_menu/leave_body_button/Destroy()
QDEL_NULL(on_click_callback)
@@ -117,6 +120,7 @@
// The UX on this is pretty shit, but it's okay enough for now.
// Regularly goes way too far from your cursor. Not designed for large icons.
openToolTip(usr, src, params, content = tooltip_text)
+ update_color()
/atom/movable/screen/escape_menu/leave_body_button/MouseExited(location, control, params)
if (!hovered)
@@ -124,3 +128,10 @@
hovered = FALSE
closeToolTip(usr)
+ update_color()
+
+/atom/movable/screen/escape_menu/leave_body_button/proc/update_color()
+ if (hovered)
+ color = "#ffffff"
+ else
+ color = "#bbbbbb"
diff --git a/code/modules/escape_menu/title.dm b/code/modules/escape_menu/title.dm
index 1125136e8a135..2b62ef0ecdf3a 100644
--- a/code/modules/escape_menu/title.dm
+++ b/code/modules/escape_menu/title.dm
@@ -28,14 +28,23 @@ GLOBAL_DATUM(escape_menu_title, /atom/movable/screen/escape_menu/title)
return ..()
/atom/movable/screen/escape_menu/title/proc/update_text()
- var/subtitle_text = MAPTEXT("Ещё одна смена на...")
+ var/subtitle_text = MAPTEXT("Ещё одна смена на станции...")
var/title_text = {"
-
- [station_name()]
+
+ [get_filtered_station_name()]
"}
- maptext = "" + subtitle_text + MAPTEXT_VCR_OSD_MONO(title_text) + ""
+ maptext = "" + subtitle_text + title_text + ""
+
+/atom/movable/screen/escape_menu/title/proc/get_filtered_station_name()
+ var/val = station_name()
+ var/index = findtext_char(val, "| ")
+
+ if (index)
+ val = copytext_char(val, index + 2)
+
+ return val
/atom/movable/screen/escape_menu/title/proc/on_station_name_changed()
SIGNAL_HANDLER
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index bbe5c4147f80b..a65eaf8f77815 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -2,7 +2,7 @@
name = "\improper Pulse Rifle"
desc = "A heavy-duty, multifaceted energy rifle with three modes. Preferred by front-line combat personnel."
icon_state = "pulse"
- item_state = null
+ item_state = "gun"
w_class = WEIGHT_CLASS_BULKY
force = 10
modifystate = TRUE
diff --git a/icons/obj/machines/washing_machine.dmi b/icons/obj/machines/washing_machine.dmi
index c01252f092b69..4a618b7747e99 100644
Binary files a/icons/obj/machines/washing_machine.dmi and b/icons/obj/machines/washing_machine.dmi differ
diff --git a/modular_bluemoon/SmiLeY/code/ert/pizza_ert.dm b/modular_bluemoon/SmiLeY/code/ert/pizza_ert.dm
index 73b049813cedb..9c534bb6eae78 100644
--- a/modular_bluemoon/SmiLeY/code/ert/pizza_ert.dm
+++ b/modular_bluemoon/SmiLeY/code/ert/pizza_ert.dm
@@ -85,7 +85,7 @@
/datum/outfit/ert/pizza_ert/post_equip()
. = ..()
-/datum/outfit/ert/pizza/pre_equip(mob/living/carbon/human/equipped_human, visualsOnly)
+/datum/outfit/ert/pizza_ert/pre_equip(mob/living/carbon/human/equipped_human, visualsOnly)
var/list/pizza_list = list(/obj/item/pizzabox/margherita, /obj/item/pizzabox/mushroom, /obj/item/pizzabox/meat, /obj/item/pizzabox/pineapple)
r_hand = pick(pizza_list)
backpack_contents += list(
@@ -94,7 +94,7 @@
pizza_list,\
)
-/datum/outfit/ert/pizza/leader/pre_equip(mob/living/carbon/human/equipped_human, visualsOnly)
+/datum/outfit/ert/pizza_ert/leader/pre_equip(mob/living/carbon/human/equipped_human, visualsOnly)
var/list/pizza_list = list(/obj/item/pizzabox/margherita, /obj/item/pizzabox/mushroom, /obj/item/pizzabox/meat, /obj/item/pizzabox/pineapple)
r_hand = pick(pizza_list)
backpack_contents += list(
diff --git a/modular_bluemoon/shower_trait/shower_trait.dm b/modular_bluemoon/shower_trait/shower_trait.dm
index 6b479f618dadb..2306f208a263e 100644
--- a/modular_bluemoon/shower_trait/shower_trait.dm
+++ b/modular_bluemoon/shower_trait/shower_trait.dm
@@ -7,7 +7,7 @@
/datum/quirk/bluemoon_shower_need
name = BLUEMOON_TRAIT_NAME_SHOWER_NEED
- desc = "Вам нужно периодически ходить в душ. Хотя бы на станции. Из-за особенностей здешних мест, делать это нужно хотя бы раз в час на пару минут. Можно мыться в душевых, сауне и бассейне. Лучше всего подходят душевые в жилых зонах, а также личных каютах."
+ desc = "Вам нужно периодически ходить в душ. Хотя бы на станции. Из-за особенностей здешних мест, делать это нужно раз в час на пару минут. Можно мыться в душевых, сауне и бассейне. Лучше всего подходят душевые в жилых зонах, а также личных каютах."
gain_text = span_warning("Чистота - залог хорошего настроения!")
lose_text = span_notice("Мне достаточно мыться раз в неделю, ведь в среднем на 10-минутный душ расходуется 60 литров воды. Использование нагревателя повышает расход в три раза, а на ванну нужно как минимум 200 литров. Получается, что семья из четырех человек, которые каждый день принимают 10-минутный душ, расходует 25 куб. м воды каждый год (традиционно в Великобритании установлены отдельные краны с холодной и горячей водой без смесителя, и для теплого душа нужен проточный нагреватель — прим. ред.). Цена электричества повышает стоимость гигиены такой семьи с 400 £ до 1200 £ в год. И это еще не все: любители душа оказываются ответственными за выброс в атмосферу 3,5 тонн углекислого газа. Чтобы остановить глобальное потепление, мы можем позволить себе только 1 тонну СО2 на человека, с учетом всей его жизнедеятельности от еды до транспорта.")
value = -2
@@ -20,6 +20,7 @@
var/hide_visual_effect = FALSE // если игрок хочет, он может отключить визуальное отображение, но при этом будет сильное падение настроения
var/cleaned_times = 0 // счётчик, сколько тиков игрок постоял под душем
var/warning_level = 0 // предупреждения для игрока в чат. Обнуляются при достижении чистоты
+ var/image/stink_overlay // оверлей вони
/datum/quirk/bluemoon_shower_need/on_spawn()
. = ..()
@@ -31,6 +32,12 @@
var/datum/action/cooldown/change_stink_overlay/C = new // выдача способности для изменения оверлея вони
C.Grant(H)
+ // создание оверлея вони
+ var/matrix/M = matrix()
+ M.Scale(0.6)
+ stink_overlay = image('modular_bluemoon/shower_trait/stink.dmi', "steam_double", pixel_y = 12, layer = -FIRE_LAYER)
+ stink_overlay.transform = M
+
/datum/quirk/bluemoon_shower_need/remove()
UnregisterSignal(quirk_holder, COMSIG_COMPONENT_CLEAN_ACT)
UnregisterSignal(quirk_holder, COMSIG_PARENT_EXAMINE)
@@ -38,6 +45,10 @@
var/mob/living/carbon/human/H = quirk_holder
var/datum/action/cooldown/change_stink_overlay/C = locate() in H.actions
C.Remove(H) // забираем способность изменения оверлея вони
+
+ // удаляем оверлей вони
+ quirk_holder.cut_overlay(stink_overlay)
+ stink_overlay = null
. = ..()
/datum/quirk/bluemoon_shower_need/process()
@@ -48,13 +59,13 @@
if(T.air)
var/datum/gas_mixture/G = T.air
if(HAS_TRAIT(quirk_holder, TRAIT_SWIMMING) || G.get_moles(GAS_H2O) > 0) // персонаж находится в бассейне или сауне, происходит мытьё
- cleaning(TRUE)
+ cleaning(10) // при вызове сигнала COMSIG_COMPONENT_CLEAN_ACT этой функции в аргументы присваивается персонаж, что делает невозможным применение TRUE
switch(cleanse_level)
if(-INFINITY to FINE_CLEAN)
- quirk_holder.remove_status_effect(/datum/status_effect/stink)
if(warning_level > 0)
to_chat(quirk_holder, span_notice("Моё тело чистое, можно выходить."))
+ quirk_holder.cut_overlay(stink_overlay)
doing_shower = FALSE
warning_level = 0
if(FIRST_WARNING to DIRTY)
@@ -72,8 +83,8 @@
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "need_shower", /datum/mood_event/need_shower/very_dirty_catastrophic)
else
SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "need_shower", /datum/mood_event/need_shower/very_dirty)
- quirk_holder.apply_status_effect(STATUS_EFFECT_STINK)
if(warning_level < 3)
+ quirk_holder.add_overlay(stink_overlay)
to_chat(quirk_holder, span_phobia("Мне ОЧЕНЬ нужно сходить в душ!"))
warning_level = 3
@@ -100,7 +111,7 @@
else
examine_list += span_warning("[quirk_holder.p_they_ru(TRUE)] плохо пахнет.")
-/datum/quirk/bluemoon_shower_need/proc/cleaning(var/hide_clothing_warning = FALSE)
+/datum/quirk/bluemoon_shower_need/proc/cleaning(var/hide_clothing_warning)
SIGNAL_HANDLER
var/cleaning_efficiency = 10 // 3.5~ минуты с 1000
@@ -109,7 +120,7 @@
cleaned_times++
if(!check_for_clothing())
- if(!(cleaned_times % 10) && !hide_clothing_warning) // каждые 10 тиков сообщение, если одежда не подходит
+ if(!(cleaned_times % 10) && (hide_clothing_warning != 10))
to_chat(quirk_holder, span_warning("Нужно снять одежду, не подходящую для душа! Бюстгалтер и трусы допустимы."))
return
@@ -207,34 +218,6 @@
description = span_phobia("МНЕ КРИТИЧЕСКИ НУЖНО СХОДИТЬ В ДУШ!\n")
mood_change = -16 // игрок скрывает визуальный негативный эффект, но от этого персонаж сильно страдает
-/*
- * ОВЕРЛЕЙ
- */
-
-/datum/status_effect/stink
- id = "stink"
- on_remove_on_mob_delete = TRUE
- status_type = STATUS_EFFECT_REFRESH // обновлять таймер
- alert_type = null
- var/image/overlay // оверлей вони
- duration = 10 SECONDS
-
-/datum/status_effect/stink/on_apply()
- . = ..()
- add_overlay()
-
-/datum/status_effect/stink/proc/add_overlay()
- var/matrix/M = matrix()
- M.Scale(0.6)
- overlay = image('modular_bluemoon/shower_trait/stink.dmi', "steam_double", pixel_y = 12, layer = -FIRE_LAYER)
- overlay.transform = M
- owner.add_overlay(overlay)
-
-/datum/status_effect/stink/on_remove()
- owner.cut_overlay(overlay)
- overlay = null
- return ..()
-
#undef STATUS_EFFECT_STINK
#undef FINE_CLEAN
diff --git a/modular_splurt/code/modules/client/preferences.dm b/modular_splurt/code/modules/client/preferences.dm
index e995364312777..02804577815ba 100644
--- a/modular_splurt/code/modules/client/preferences.dm
+++ b/modular_splurt/code/modules/client/preferences.dm
@@ -650,7 +650,7 @@
dat += "Butt Size:[features["butt_size"]]"
dat += "Butt Visibility:[features["butt_visibility"]]"
dat += "Toys and Egg Stuffing:[features["butt_stuffing"] == TRUE ? "Yes" : "No"]"
- dat += "Butthole Sprite:[features["has_anus"] == TRUE ? "Yes" : "No"]"
+ dat += "Has Anus:[features["has_anus"] == TRUE ? "Yes" : "No"]"
if(features["has_anus"])
dat += "Butthole Color:
"
if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)